PerformSetup(Dictionary <string, object> deserializedJsonData)
        {
            var graphDescription = GraphDescriptionBuilder.BuildGraphDescriptionFromJson(deserializedJsonData);

            var terminalNodeIds = graphDescription.terminalNodeIds;
            var allNodes        = graphDescription.allNodes;
            var allConnections  = graphDescription.allConnections;

            /*
             *      Validation: node names should not overlapping.
             */
            {
                var nodeNames    = allNodes.Select(node => node.nodeName).ToList();
                var overlappings = nodeNames.GroupBy(x => x)
                                   .Where(group => 1 < group.Count())
                                   .Select(group => group.Key)
                                   .ToList();

                if (overlappings.Any())
                {
                    throw new AssetBundleGraphException("Duplicate node name found:" + overlappings[0] + " please rename and avoid same name.");
                }
            }

            var resultDict = new Dictionary <string, Dictionary <string, List <Asset> > >();
            var cacheDict  = new Dictionary <string, List <string> >();

            foreach (var terminalNodeId in terminalNodeIds)
            {
                PerformSetupForNode(terminalNodeId, allNodes, allConnections, resultDict, cacheDict);
            }

            return(CollectResult(resultDict));
        }
        PerformRun(
            Dictionary <string, object> deserializedJsonData,
            Action <string, float> updateHandler = null
            )
        {
            IntegratedGUIBundleBuilder.RemoveAllAssetBundleSettings();

            var graphDescription = GraphDescriptionBuilder.BuildGraphDescriptionFromJson(deserializedJsonData);

            var terminalNodeIds = graphDescription.terminalNodeIds;
            var allNodes        = graphDescription.allNodes;
            var allConnections  = graphDescription.allConnections;

            var resultDict = new Dictionary <string, Dictionary <string, List <Asset> > >();
            var cacheDict  = new Dictionary <string, List <string> >();

            foreach (var terminalNodeId in terminalNodeIds)
            {
                PerformRunForNode(terminalNodeId, allNodes, allConnections, resultDict, cacheDict, updateHandler);
            }

            return(CollectResult(resultDict));
        }