void FScriptExecutionTunnelInstance::RefreshStats(const FTracePath& TracePath)
{
	// Process stat update
	TArray<TSharedPtr<FScriptPerfData>> BlueprintPooledStats;
	// Find all the entry site stats
	for (auto EntrySite : EntrySites)
	{
		EntrySite.Value->GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats);
	}
	// Update the owning blueprint stats
	if (BlueprintPooledStats.Num() > 0)
	{
		TSharedPtr<FScriptPerfData> BlueprintData = GetBlueprintPerfDataByTracePath(TracePath);
		BlueprintData->AccumulateDataSet(BlueprintPooledStats);
	}
	// Update the node stats
	UpdatePerfDataForNode();
}
void FScriptExecutionNode::RefreshStats(const FTracePath& TracePath)
{
	// Process stat update
	bool bRefreshChildStats = false;
	bool bRefreshLinkStats = true;
	TArray<TSharedPtr<FScriptPerfData>> BlueprintPooledStats;
	// Update stats based on type
	switch(GetStatisticContainerType())
	{
		case EScriptStatContainerType::Standard:
		case EScriptStatContainerType::Container:
		{
			GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats);
			bRefreshChildStats = true;
			break;
		}
		case EScriptStatContainerType::PureNode:
		{
			GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats);
			bRefreshChildStats = false;
			bRefreshLinkStats = false;
			break;
		}
		case EScriptStatContainerType::SequentialBranch:
		{
			GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats);
			break;
		}
		case EScriptStatContainerType::NewExecutionPath:
		{
			// Refresh child stats and copy as branch stats - this is a dummy entry
			TSet<FName> AllInstances;
			TArray<FLinearExecPath> ChildExecPaths;
			for (auto ChildIter : ChildNodes)
			{
				ChildIter->GetValidInstanceNames(AllInstances);
				ChildIter->RefreshStats(TracePath);
				ChildIter->GetLinearExecutionPath(ChildExecPaths, TracePath, false);
			}
			for (auto InstanceIter : AllInstances)
			{
				if (InstanceIter != NAME_None)
				{
					TSharedPtr<FScriptPerfData> InstancePerfData = GetPerfDataByInstanceAndTracePath(InstanceIter, TracePath);
					InstancePerfData->Reset();
					BlueprintPooledStats.Add(InstancePerfData);
					TArray<TSharedPtr<FScriptPerfData>> ChildDataSet;

					for (auto ChildIter : ChildExecPaths)
					{
						TSharedPtr<FScriptPerfData> ChildPerfData = ChildIter.LinkedNode->GetPerfDataByInstanceAndTracePath(InstanceIter, ChildIter.TracePath);
						if (ChildPerfData.IsValid())
						{
							ChildDataSet.Add(ChildPerfData);
						}
					}
					InstancePerfData->AccumulateDataSet(ChildDataSet, true);
				}
			}
			// Update Blueprint stats as branches
			TSharedPtr<FScriptPerfData> BlueprintData = GetOrAddBlueprintPerfDataByTracePath(TracePath);
			BlueprintData->CreateBlueprintStats(BlueprintPooledStats);
			BlueprintPooledStats.Reset(0);
			bRefreshLinkStats = false;
			break;
		}
	}
	// Refresh Child Links
	if (bRefreshChildStats)
	{
		for (auto ChildIter : ChildNodes)
		{
			ChildIter->RefreshStats(TracePath);
		}
	}
	// Refresh All links
	if (bRefreshLinkStats)
	{
		for (auto LinkIter : LinkedNodes)
		{
			FTracePath LinkTracePath(TracePath);
			if (LinkIter.Value->HasFlags(EScriptExecutionNodeFlags::EventPin))
			{
				LinkTracePath.ResetPath();
			}
			if (!LinkIter.Value->HasFlags(EScriptExecutionNodeFlags::InvalidTrace))
			{
				LinkTracePath.AddExitPin(LinkIter.Key);
			}
			LinkIter.Value->RefreshStats(LinkTracePath);
		}
	}
	// Update the owning blueprint stats
	if (BlueprintPooledStats.Num() > 0)
	{
		TSharedPtr<FScriptPerfData> BlueprintData = GetOrAddBlueprintPerfDataByTracePath(TracePath);
		BlueprintData->CreateBlueprintStats(BlueprintPooledStats);
	}
	// Update the node stats
	UpdatePerfDataForNode();
}