{"action":"created","comment":{"url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/comments/86880930","pull_request_review_id":7515642,"id":86880930,"diff_hunk":"@@ -278,3 +290,488 @@ def discoverBySource(self, item):\n             result.append(source)\n \n         return result\n+\n+    # =================\n+    # Optimaze Methods\n+    # =================\n+    def optimizeOperatorInput(self, cnsConnections=None):\n+        \"\"\"Optimize self.items on operator inputs.\n+\n+            Shortcut redudant constraint that can be passed through.\n+\n+        Args:\n+            cnsConnections (ConnectionContainer): constraint connections.\n+\n+        Returns:\n+            ConnectionContainer: result constraint connections.\n+\n+        \"\"\"\n+\n+        constraints = self.getItemsOfType('Constraint')\n+        operators = self.getItemsOfType('KLOperator')\n+        operators.extend(self.getItemsOfType('CanvasOperator'))\n+\n+        if cnsConnections is None:\n+            cnsConnections = self._gatherConstraintConnections(constraints)\n+        opeOutputIndice = self._gatherOperatorConnections(operators)\n+\n+        dstIndice = cnsConnections.indexedByDst()\n+\n+        def getNewSrc(ope, portItem):\n+\n+            if not self.isItemComponentIO(portItem):\n+                return portItem\n+\n+            if portItem in dstIndice:\n+                anscestor = self._searchConstraintConnectionAscendant(\n+                    [dstIndice[portItem]], dstIndice, includeOffset=False)\n+                markConstraintAsNeverRemove(anscestor[0]['src'])\n+                return anscestor[0]['src']\n+            elif portItem in opeOutputIndice:\n+                # This should be process when post build\n+                markConstraintAsNeverRemove(portItem)\n+                return portItem\n+            else:\n+                markConstraintAsNeverRemove(portItem)\n+                return portItem\n+\n+        cacheMarkConstraintAsNeverRemove = []\n+\n+        def markConstraintAsNeverRemove(src):\n+            if src in cacheMarkConstraintAsNeverRemove:\n+                return\n+\n+            if src not in dstIndice:\n+                return\n+\n+            start = dstIndice[src]\n+            needed = self._searchConstraintConnectionAscendant(\n+                [start], dstIndice, includeOffset=True)\n+\n+            for c in needed:\n+                c.incrementRefCount()\n+\n+            cacheMarkConstraintAsNeverRemove.append(src)\n+\n+        for ope in operators:\n+            for portName, portItem in ope.inputs.iteritems():\n+                if type(portItem) == list:  # array port\n+                    news = [getNewSrc(ope, ele) for ele in portItem]\n+                else:\n+                    news = getNewSrc(ope, portItem)\n+\n+                ope.inputs[portName] = news\n+\n+        return cnsConnections\n+\n+    def getOperatorsCanBeDirectConnect(self):\n+        \"\"\"Retruns operator inforamions that can be direct connect with another operator.\n+\n+            This method must be called by builder post build process.\n+\n+        Returns:\n+            list[dict]: operator inforamtion that input can be direct connect with its src operator.\n+                    information contain as dict.\n+\n+        \"\"\"\n+\n+        operators = self.getItemsOfType('KLOperator')\n+        operators.extend(self.getItemsOfType('CanvasOperator'))\n+        operatorConnections = self._gatherOperatorConnections(operators)\n+        opeOutputIndice = operatorConnections.indexedBySrc()\n+        result = []\n+\n+        def _append(ope, portItem, portName, index):\n+            if not self.isItemComponentIO(portItem):\n+                return\n+\n+            if portItem in opeOutputIndice:\n+                conn = opeOutputIndice[portItem]\n+                result.append(\n+                    {\n+                        'srcOperator': conn['src'],\n+                        'dstOperator': ope,\n+                        'srcPortName': conn['srcPortName'],\n+                        'dstPortName': portName,\n+                        'srcIndex': conn['index'],\n+                        'dstIndex': index\n+                    }\n+                )\n+\n+        for ope in operators:\n+            for portName, portItem in ope.inputs.iteritems():\n+                if type(portItem) == list:  # array port\n+                    for i, ele in enumerate(portItem):\n+                        _append(ope, ele, portName, i)\n+                else:\n+                    _append(ope, portItem, portName, -1)\n+\n+        return result\n+\n+    def optimizeConstraints(self, connections=None):\n+        \"\"\"Optimize self.items on Constraints.\n+\n+            Remove redudant constraint that can be passed through with another item.\n+\n+        \"\"\"\n+\n+        if connections is None:\n+            constraints = self.getItemsOfType('Constraint')\n+            connections = self._gatherConstraintConnections(constraints)\n+\n+        for conn in connections:\n+\n+            new = self._searchConstraintConnectionAscendant([conn], connections.indexedByDst())\n+            new = self._searchConstraintConnectionDescendant(new, connections.indexedBySrc())\n+\n+            # connection does not terminal\n+            if new[-1] != conn:\n+                continue\n+\n+            # not changed\n+            if len(new) == 1:\n+                continue\n+            elif len(new) < 1:\n+                # print \"something wrong\"\n+                continue\n+\n+            newSrcConn = new[0]\n+            newDstConn = conn\n+\n+            if newSrcConn[\"src\"] not in newDstConn[\"cns\"].getConstrainers():\n+                newDstConn[\"cns\"].setConstrainer(newSrcConn[\"src\"])\n+                canPassed = self._getMaintainOffsetInConnections(new)\n+                newDstConn[\"cns\"].setMaintainOffset(canPassed)\n+                newDstConn.incrementRefCount()\n+            # else:\n+            #     print \"already in constrainers\"\n+\n+        return connections\n+\n+    def _gatherOperatorConnections(self, operators):\n+        \"\"\"Gather connection informations of given operators.\n+\n+        Args:\n+            operators (SceneItem[]): The SceneItems that searched in for connection.\n+\n+        Returns:\n+            ConnectionContainer: operator connection informations indexed by src(=operator) item.\n+\n+        \"\"\"\n+\n+        connections = ConnectionContainer()\n+\n+        def _append(ope, name, item, index):\n+            conn = OperatorConnection(ope, name, item, index)\n+            connections.append(conn)\n+\n+        for ope in operators:\n+\n+            for outputName in ope.getOutputNames():\n+                operatorOutputs = ope.getOutput(outputName)\n+\n+                if not isinstance(operatorOutputs, list):\n+                    if isinstance(operatorOutputs, SceneItem):\n+                        _append(ope, outputName, operatorOutputs, -1)\n+\n+                else:\n+                    for i, operatorOutput in enumerate(operatorOutputs):\n+                        if not isinstance(operatorOutput, SceneItem):\n+                            continue\n+\n+                        _append(ope, outputName, operatorOutput, i)\n+\n+        return connections\n+\n+    def _gatherConstraintConnections(self, constraints):\n+        \"\"\"Gather connection inforamiotns of given constraints.\n+\n+        Args:\n+            constraints (SceneItem[]): The SceneItems that searched in for connection.\n+\n+        Returns:\n+            ConnectionContainer: connection informations\n+\n+        \"\"\"\n+\n+        connections = ConnectionContainer()\n+\n+        for cns in constraints:\n+\n+            if not self.isConstrainPartOfComponentIO(cns):\n+                continue\n+\n+            dst = cns.getConstrainee()\n+            for src in cns.getConstrainers():\n+\n+                conn = ConstraintConnection(src, dst, cns)\n+                connections.append(conn)\n+\n+        return connections\n+\n+    def _searchConstraintConnectionAscendant(self, connections, dstIndice, includeOffset=True):\n+        \"\"\"Search and return constraint connections for ascendant while constarint can be passed through.\n+\n+        Args:\n+            connections (dict[]): connection information obtained by _gatherConstraintConnections\n+            dstIndice (dict): connection information indexed by src item obtained by _gatherConstraintConnections\n+\n+        Returns:\n+            dict[]: connections stack as list. parent constraint as top, kid constarint as bottom.\n+\n+        \"\"\"\n+\n+        conn = connections[0]\n+        src = conn[\"src\"]\n+\n+        if src in dstIndice:\n+            grandConn = dstIndice[src]\n+\n+            if self.isConnectionCanPassedThrough(grandConn, includeOffset):\n+                conn.decrementRefCount()\n+                connections.insert(0, grandConn)\n+                return self._searchConstraintConnectionAscendant(connections, dstIndice, includeOffset)\n+\n+            else:\n+                return connections\n+\n+        else:\n+            return connections\n+\n+    def _searchConstraintConnectionDescendant(self, connections, srcIndice, includeOffset=True):\n+        \"\"\"Search and return constraint connections for descendant while constarint can be passed through.\n+\n+        Args:\n+            connections (dict[]): connection information obtained by _gatherConstraintConnections\n+            srcIndice (dict): connection information indexed by src item obtained by _gatherConstraintConnections\n+\n+        Returns:\n+            dict[]: connections stack as list. parent constraint as top, kid constarint as bottom.\n+\n+        \"\"\"\n+\n+        if type(connections) != list:\n+            connections = [connections]\n+\n+        conn = connections[-1]\n+        dst = conn[\"dst\"]\n+\n+        if dst in srcIndice:\n+            grandConn = srcIndice[dst]\n+\n+            if self.isConnectionCanPassedThrough(grandConn, includeOffset):\n+                conn.decrementRefCount()\n+                connections.append(grandConn)\n+                return self._searchConstraintConnectionDescendant(connections, srcIndice)\n+\n+            else:\n+                return connections\n+\n+        else:\n+            return connections\n+\n+    def _getMaintainOffsetInConnections(self, connections):\n+        \"\"\"Doc String.\n+\n+        Args:\n+            item (Type): information.\n+\n+        Returns:\n+            Type: information.\n+\n+        \"\"\"\n+\n+        for conn in connections:\n+            if not self.isConstraintCanPassedThrough(conn[\"cns\"]):\n+                return True\n+        else:\n+            return False\n+\n+    @staticmethod\n+    def isItemComponentIO(kSceneItem):\n+        \"\"\"Doc String.\n+\n+        Args:\n+            item (Type): information.\n+\n+        Returns:\n+            Type: information.\n+\n+        \"\"\"\n+\n+        return (\n+            (kSceneItem.getTypeName() == 'ComponentInput')\n+            or\n+            (kSceneItem.getTypeName() == 'ComponentOutput')\n+        )\n+\n+    @staticmethod\n+    def isConstrainBetweenComponentIO(kConstraint):\n+        \"\"\"Doc String.\n+\n+        Args:\n+            item (Type): information.\n+\n+        Returns:\n+            Type: information.\n+\n+        \"\"\"\n+\n+        constrainee = kConstraint.getConstrainee()\n+        constrainer = kConstraint.getConstrainers()[0]\n+\n+        return (\n+            (Traverser.isItemComponentIO(constrainee) and Traverser.isItemComponentIO(constrainer))\n+        )\n+\n+    @staticmethod\n+    def isConstrainPartOfComponentIO(kConstraint):\n+        \"\"\"Doc String.\n+\n+        Args:\n+            item (Type): information.\n+\n+        Returns:\n+            Type: information.\n+\n+        \"\"\"\n+\n+        constrainee = kConstraint.getConstrainee()\n+        constrainers = kConstraint.getConstrainers()\n+\n+        for c in constrainers:","path":"Python/kraken/core/traverser.py","position":401,"original_position":401,"commit_id":"b7dcaefc9e7ebe4d6e023037aa847f91ae7f5d74","original_commit_id":"b7dcaefc9e7ebe4d6e023037aa847f91ae7f5d74","user":{"login":"EricTRocks","id":505908,"avatar_url":"https://avatars.githubusercontent.com/u/505908?v=3","gravatar_id":"","url":"https://api.github.com/users/EricTRocks","html_url":"https://github.com/EricTRocks","followers_url":"https://api.github.com/users/EricTRocks/followers","following_url":"https://api.github.com/users/EricTRocks/following{/other_user}","gists_url":"https://api.github.com/users/EricTRocks/gists{/gist_id}","starred_url":"https://api.github.com/users/EricTRocks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EricTRocks/subscriptions","organizations_url":"https://api.github.com/users/EricTRocks/orgs","repos_url":"https://api.github.com/users/EricTRocks/repos","events_url":"https://api.github.com/users/EricTRocks/events{/privacy}","received_events_url":"https://api.github.com/users/EricTRocks/received_events","type":"User","site_admin":false},"body":"Don't use `c` as item name","created_at":"2016-11-07T22:08:51Z","updated_at":"2016-11-07T22:13:59Z","html_url":"https://github.com/fabric-engine/Kraken/pull/465#discussion_r86880930","pull_request_url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465","_links":{"self":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/comments/86880930"},"html":{"href":"https://github.com/fabric-engine/Kraken/pull/465#discussion_r86880930"},"pull_request":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465"}}},"pull_request":{"url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465","id":91346511,"html_url":"https://github.com/fabric-engine/Kraken/pull/465","diff_url":"https://github.com/fabric-engine/Kraken/pull/465.diff","patch_url":"https://github.com/fabric-engine/Kraken/pull/465.patch","issue_url":"https://api.github.com/repos/fabric-engine/Kraken/issues/465","number":465,"state":"open","locked":false,"title":"Feature/optimize component io","user":{"login":"yamahigashi","id":523673,"avatar_url":"https://avatars.githubusercontent.com/u/523673?v=3","gravatar_id":"","url":"https://api.github.com/users/yamahigashi","html_url":"https://github.com/yamahigashi","followers_url":"https://api.github.com/users/yamahigashi/followers","following_url":"https://api.github.com/users/yamahigashi/following{/other_user}","gists_url":"https://api.github.com/users/yamahigashi/gists{/gist_id}","starred_url":"https://api.github.com/users/yamahigashi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yamahigashi/subscriptions","organizations_url":"https://api.github.com/users/yamahigashi/orgs","repos_url":"https://api.github.com/users/yamahigashi/repos","events_url":"https://api.github.com/users/yamahigashi/events{/privacy}","received_events_url":"https://api.github.com/users/yamahigashi/received_events","type":"User","site_admin":false},"body":"This PR is my experimental implementation for #460, #264 and #265.\n- add optimization pass for Traverser.traverse()\n- add optimization pass for builder._postBuild()\n---\n#### Traverser\n\nAdded keyword argument `toOptimize` for Traverser.tarvers, analyze constraint and operator connections, then shortcut intermediate connections if available.\n#### post build\n\nIf operator input can bypass component io, then connect directly its source.  Remove Component IO that is not connected as any source. \n---\n\nFYR, this improves performance by 10-15% faster. (bob.krg in maya2016.5 +parallel eval)\nI hope this helps.\n","created_at":"2016-10-28T09:08:44Z","updated_at":"2016-11-07T22:13:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"45a3a95b36a7b92893e35c931a04c832533f1cdf","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465/commits","review_comments_url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465/comments","review_comment_url":"https://api.github.com/repos/fabric-engine/Kraken/pulls/comments{/number}","comments_url":"https://api.github.com/repos/fabric-engine/Kraken/issues/465/comments","statuses_url":"https://api.github.com/repos/fabric-engine/Kraken/statuses/b7dcaefc9e7ebe4d6e023037aa847f91ae7f5d74","head":{"label":"goshow-jp:feature/OptimizeComponentIO","ref":"feature/OptimizeComponentIO","sha":"b7dcaefc9e7ebe4d6e023037aa847f91ae7f5d74","user":{"login":"goshow-jp","id":20433296,"avatar_url":"https://avatars.githubusercontent.com/u/20433296?v=3","gravatar_id":"","url":"https://api.github.com/users/goshow-jp","html_url":"https://github.com/goshow-jp","followers_url":"https://api.github.com/users/goshow-jp/followers","following_url":"https://api.github.com/users/goshow-jp/following{/other_user}","gists_url":"https://api.github.com/users/goshow-jp/gists{/gist_id}","starred_url":"https://api.github.com/users/goshow-jp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goshow-jp/subscriptions","organizations_url":"https://api.github.com/users/goshow-jp/orgs","repos_url":"https://api.github.com/users/goshow-jp/repos","events_url":"https://api.github.com/users/goshow-jp/events{/privacy}","received_events_url":"https://api.github.com/users/goshow-jp/received_events","type":"Organization","site_admin":false},"repo":{"id":53017351,"name":"Kraken","full_name":"goshow-jp/Kraken","owner":{"login":"goshow-jp","id":20433296,"avatar_url":"https://avatars.githubusercontent.com/u/20433296?v=3","gravatar_id":"","url":"https://api.github.com/users/goshow-jp","html_url":"https://github.com/goshow-jp","followers_url":"https://api.github.com/users/goshow-jp/followers","following_url":"https://api.github.com/users/goshow-jp/following{/other_user}","gists_url":"https://api.github.com/users/goshow-jp/gists{/gist_id}","starred_url":"https://api.github.com/users/goshow-jp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goshow-jp/subscriptions","organizations_url":"https://api.github.com/users/goshow-jp/orgs","repos_url":"https://api.github.com/users/goshow-jp/repos","events_url":"https://api.github.com/users/goshow-jp/events{/privacy}","received_events_url":"https://api.github.com/users/goshow-jp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/goshow-jp/Kraken","description":"Modular character rigging framework built on top of Fabric Engine.","fork":true,"url":"https://api.github.com/repos/goshow-jp/Kraken","forks_url":"https://api.github.com/repos/goshow-jp/Kraken/forks","keys_url":"https://api.github.com/repos/goshow-jp/Kraken/keys{/key_id}","collaborators_url":"https://api.github.com/repos/goshow-jp/Kraken/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/goshow-jp/Kraken/teams","hooks_url":"https://api.github.com/repos/goshow-jp/Kraken/hooks","issue_events_url":"https://api.github.com/repos/goshow-jp/Kraken/issues/events{/number}","events_url":"https://api.github.com/repos/goshow-jp/Kraken/events","assignees_url":"https://api.github.com/repos/goshow-jp/Kraken/assignees{/user}","branches_url":"https://api.github.com/repos/goshow-jp/Kraken/branches{/branch}","tags_url":"https://api.github.com/repos/goshow-jp/Kraken/tags","blobs_url":"https://api.github.com/repos/goshow-jp/Kraken/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/goshow-jp/Kraken/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/goshow-jp/Kraken/git/refs{/sha}","trees_url":"https://api.github.com/repos/goshow-jp/Kraken/git/trees{/sha}","statuses_url":"https://api.github.com/repos/goshow-jp/Kraken/statuses/{sha}","languages_url":"https://api.github.com/repos/goshow-jp/Kraken/languages","stargazers_url":"https://api.github.com/repos/goshow-jp/Kraken/stargazers","contributors_url":"https://api.github.com/repos/goshow-jp/Kraken/contributors","subscribers_url":"https://api.github.com/repos/goshow-jp/Kraken/subscribers","subscription_url":"https://api.github.com/repos/goshow-jp/Kraken/subscription","commits_url":"https://api.github.com/repos/goshow-jp/Kraken/commits{/sha}","git_commits_url":"https://api.github.com/repos/goshow-jp/Kraken/git/commits{/sha}","comments_url":"https://api.github.com/repos/goshow-jp/Kraken/comments{/number}","issue_comment_url":"https://api.github.com/repos/goshow-jp/Kraken/issues/comments{/number}","contents_url":"https://api.github.com/repos/goshow-jp/Kraken/contents/{+path}","compare_url":"https://api.github.com/repos/goshow-jp/Kraken/compare/{base}...{head}","merges_url":"https://api.github.com/repos/goshow-jp/Kraken/merges","archive_url":"https://api.github.com/repos/goshow-jp/Kraken/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/goshow-jp/Kraken/downloads","issues_url":"https://api.github.com/repos/goshow-jp/Kraken/issues{/number}","pulls_url":"https://api.github.com/repos/goshow-jp/Kraken/pulls{/number}","milestones_url":"https://api.github.com/repos/goshow-jp/Kraken/milestones{/number}","notifications_url":"https://api.github.com/repos/goshow-jp/Kraken/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/goshow-jp/Kraken/labels{/name}","releases_url":"https://api.github.com/repos/goshow-jp/Kraken/releases{/id}","deployments_url":"https://api.github.com/repos/goshow-jp/Kraken/deployments","created_at":"2016-03-03T03:26:11Z","updated_at":"2016-07-21T10:33:15Z","pushed_at":"2016-11-07T11:08:21Z","git_url":"git://github.com/goshow-jp/Kraken.git","ssh_url":"git@github.com:goshow-jp/Kraken.git","clone_url":"https://github.com/goshow-jp/Kraken.git","svn_url":"https://github.com/goshow-jp/Kraken","homepage":"http://fabric-engine.github.io/Kraken/","size":25134,"stargazers_count":0,"watchers_count":0,"language":"Mathematica","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"feature/monolithicCanvas"}},"base":{"label":"fabric-engine:develop","ref":"develop","sha":"c6f609445252d9771ca827236ca5b6cdb2c25ac2","user":{"login":"fabric-engine","id":724960,"avatar_url":"https://avatars.githubusercontent.com/u/724960?v=3","gravatar_id":"","url":"https://api.github.com/users/fabric-engine","html_url":"https://github.com/fabric-engine","followers_url":"https://api.github.com/users/fabric-engine/followers","following_url":"https://api.github.com/users/fabric-engine/following{/other_user}","gists_url":"https://api.github.com/users/fabric-engine/gists{/gist_id}","starred_url":"https://api.github.com/users/fabric-engine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabric-engine/subscriptions","organizations_url":"https://api.github.com/users/fabric-engine/orgs","repos_url":"https://api.github.com/users/fabric-engine/repos","events_url":"https://api.github.com/users/fabric-engine/events{/privacy}","received_events_url":"https://api.github.com/users/fabric-engine/received_events","type":"Organization","site_admin":false},"repo":{"id":17757910,"name":"Kraken","full_name":"fabric-engine/Kraken","owner":{"login":"fabric-engine","id":724960,"avatar_url":"https://avatars.githubusercontent.com/u/724960?v=3","gravatar_id":"","url":"https://api.github.com/users/fabric-engine","html_url":"https://github.com/fabric-engine","followers_url":"https://api.github.com/users/fabric-engine/followers","following_url":"https://api.github.com/users/fabric-engine/following{/other_user}","gists_url":"https://api.github.com/users/fabric-engine/gists{/gist_id}","starred_url":"https://api.github.com/users/fabric-engine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabric-engine/subscriptions","organizations_url":"https://api.github.com/users/fabric-engine/orgs","repos_url":"https://api.github.com/users/fabric-engine/repos","events_url":"https://api.github.com/users/fabric-engine/events{/privacy}","received_events_url":"https://api.github.com/users/fabric-engine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/fabric-engine/Kraken","description":"Modular character rigging framework built on top of Fabric Engine.","fork":false,"url":"https://api.github.com/repos/fabric-engine/Kraken","forks_url":"https://api.github.com/repos/fabric-engine/Kraken/forks","keys_url":"https://api.github.com/repos/fabric-engine/Kraken/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fabric-engine/Kraken/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fabric-engine/Kraken/teams","hooks_url":"https://api.github.com/repos/fabric-engine/Kraken/hooks","issue_events_url":"https://api.github.com/repos/fabric-engine/Kraken/issues/events{/number}","events_url":"https://api.github.com/repos/fabric-engine/Kraken/events","assignees_url":"https://api.github.com/repos/fabric-engine/Kraken/assignees{/user}","branches_url":"https://api.github.com/repos/fabric-engine/Kraken/branches{/branch}","tags_url":"https://api.github.com/repos/fabric-engine/Kraken/tags","blobs_url":"https://api.github.com/repos/fabric-engine/Kraken/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fabric-engine/Kraken/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fabric-engine/Kraken/git/refs{/sha}","trees_url":"https://api.github.com/repos/fabric-engine/Kraken/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fabric-engine/Kraken/statuses/{sha}","languages_url":"https://api.github.com/repos/fabric-engine/Kraken/languages","stargazers_url":"https://api.github.com/repos/fabric-engine/Kraken/stargazers","contributors_url":"https://api.github.com/repos/fabric-engine/Kraken/contributors","subscribers_url":"https://api.github.com/repos/fabric-engine/Kraken/subscribers","subscription_url":"https://api.github.com/repos/fabric-engine/Kraken/subscription","commits_url":"https://api.github.com/repos/fabric-engine/Kraken/commits{/sha}","git_commits_url":"https://api.github.com/repos/fabric-engine/Kraken/git/commits{/sha}","comments_url":"https://api.github.com/repos/fabric-engine/Kraken/comments{/number}","issue_comment_url":"https://api.github.com/repos/fabric-engine/Kraken/issues/comments{/number}","contents_url":"https://api.github.com/repos/fabric-engine/Kraken/contents/{+path}","compare_url":"https://api.github.com/repos/fabric-engine/Kraken/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fabric-engine/Kraken/merges","archive_url":"https://api.github.com/repos/fabric-engine/Kraken/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fabric-engine/Kraken/downloads","issues_url":"https://api.github.com/repos/fabric-engine/Kraken/issues{/number}","pulls_url":"https://api.github.com/repos/fabric-engine/Kraken/pulls{/number}","milestones_url":"https://api.github.com/repos/fabric-engine/Kraken/milestones{/number}","notifications_url":"https://api.github.com/repos/fabric-engine/Kraken/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fabric-engine/Kraken/labels{/name}","releases_url":"https://api.github.com/repos/fabric-engine/Kraken/releases{/id}","deployments_url":"https://api.github.com/repos/fabric-engine/Kraken/deployments","created_at":"2014-03-14T19:39:29Z","updated_at":"2016-11-03T12:57:20Z","pushed_at":"2016-11-07T21:23:52Z","git_url":"git://github.com/fabric-engine/Kraken.git","ssh_url":"git@github.com:fabric-engine/Kraken.git","clone_url":"https://github.com/fabric-engine/Kraken.git","svn_url":"https://github.com/fabric-engine/Kraken","homepage":"http://fabric-engine.github.io/Kraken/","size":24200,"stargazers_count":59,"watchers_count":59,"language":"Mathematica","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":26,"mirror_url":null,"open_issues_count":47,"forks":26,"open_issues":47,"watchers":59,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465"},"html":{"href":"https://github.com/fabric-engine/Kraken/pull/465"},"issue":{"href":"https://api.github.com/repos/fabric-engine/Kraken/issues/465"},"comments":{"href":"https://api.github.com/repos/fabric-engine/Kraken/issues/465/comments"},"review_comments":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465/comments"},"review_comment":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/fabric-engine/Kraken/pulls/465/commits"},"statuses":{"href":"https://api.github.com/repos/fabric-engine/Kraken/statuses/b7dcaefc9e7ebe4d6e023037aa847f91ae7f5d74"}}}}
{"actor":{"display_login":"EricTRocks"}}