{"action":"created","comment":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/49135279","id":49135279,"diff_hunk":"@@ -0,0 +1,227 @@\n+//\n+//  Task.h\n+//  render/src/render\n+//\n+//  Created by Zach Pomerantz on 1/6/2015.\n+//  Copyright 2015 High Fidelity, Inc.\n+//\n+//  Distributed under the Apache License, Version 2.0.\n+//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html\n+//\n+\n+#ifndef hifi_render_Task_h\n+#define hifi_render_Task_h\n+\n+#include \"Context.h\"\n+\n+#include \"gpu/Batch.h\"\n+#include <PerfStat.h>\n+\n+namespace render {\n+\n+// A varying piece of data, to be used as Job/Task I/O\n+// TODO: Task IO\n+class Varying {\n+public:\n+    Varying() {}\n+    Varying(const Varying& var) : _concept(var._concept) {}\n+    template <class T> Varying(const T& data) : _concept(std::make_shared<Model<T>>(data)) {}\n+\n+    template <class T> T& edit() { return std::static_pointer_cast<Model<T>>(_concept)->_data; }\n+    template <class T> const T& get() { return std::static_pointer_cast<const Model<T>>(_concept)->_data; }\n+\n+protected:\n+    class Concept {\n+    public:\n+        virtual ~Concept() = default;\n+    };\n+    template <class T> class Model : public Concept {\n+    public:\n+        using Data = T;\n+\n+        Model(const Data& data) : _data(data) {}\n+        virtual ~Model() = default;\n+\n+        Data _data;\n+    };\n+\n+    std::shared_ptr<Concept> _concept;\n+};\n+\n+// FIXME: In c++17, use default classes of nullptr_t to combine these\n+template <class T> void jobRun(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+    jobModel.run(sceneContext, renderContext);\n+}\n+template <class T, class I> void jobRunI(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) {\n+    jobModel.run(sceneContext, renderContext, input);\n+}\n+template <class T, class O> void jobRunO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) {\n+    jobModel.run(sceneContext, renderContext, output);\n+}\n+template <class T, class I, class O> void jobRunIO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) {\n+    jobModel.run(sceneContext, renderContext, input, output);\n+}\n+\n+// The base class for a task that runs on the SceneContext\n+class Task {\n+public:\n+    // The guts of a task; tasks are composed of multiple Jobs that execute serially\n+    class Job {\n+    public:\n+        friend class Task;\n+\n+        // The guts of a job; jobs are composed of a concept\n+        class Concept {\n+        public:\n+            Concept() = default;\n+            virtual ~Concept() = default;\n+\n+            bool isEnabled() const { return _isEnabled; }\n+            void setEnabled(bool isEnabled) { _isEnabled = isEnabled; }\n+\n+            virtual const Varying getInput() const { return Varying(); }\n+            virtual const Varying getOutput() const { return Varying(); }\n+            virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0;\n+\n+        protected:\n+\n+            bool _isEnabled = true;\n+        };\n+        using ConceptPointer = std::shared_ptr<Concept>;\n+\n+\n+        template <class T> class Model : public Concept {\n+        public:\n+            typedef T Data;\n+\n+            Data _data;\n+\n+            Model() {}\n+            Model(Data data): _data(data) {}\n+\n+            void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+                if (isEnabled()) {\n+                    jobRun(_data, sceneContext, renderContext);\n+                }\n+            }\n+        };\n+\n+        template <class T, class I> class ModelI : public Concept {\n+        public:\n+            typedef T Data;\n+            typedef I Input;\n+\n+            Data _data;\n+            Varying _input;\n+\n+            const Varying getInput() const { return _input; }\n+\n+            ModelI(const Varying& input, Data data = Data()) : _data(data), _input(input) {}\n+            ModelI(Data data) : _data(data) {}\n+\n+            void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+                if (isEnabled()) {\n+                    jobRunI(_data, sceneContext, renderContext, _input.get<I>());\n+                }\n+            }\n+        };\n+\n+        template <class T, class O> class ModelO : public Concept {\n+        public:\n+            typedef T Data;\n+            typedef O Output;\n+\n+            Data _data;\n+            Varying _output;\n+\n+            const Varying getOutput() const { return _output; }\n+\n+            ModelO(Data data) : _data(data), _output(Output()) {}\n+            ModelO() : _output(Output()) {}\n+\n+            void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+                if (isEnabled()) {\n+                    jobRunO(_data, sceneContext, renderContext, _output.edit<O>());\n+                }\n+            }\n+        };\n+\n+        template <class T, class I, class O> class ModelIO : public Concept {\n+        public:\n+            typedef T Data;\n+            typedef I Input;\n+            typedef O Output;\n+\n+            Data _data;\n+            Varying _input;\n+            Varying _output;\n+\n+            const Varying getInput() const { return _input; }\n+            const Varying getOutput() const { return _output; }\n+\n+            ModelIO(const Varying& input, Data data = Data()) : _data(data), _input(input), _output(Output()) {}\n+            ModelIO(Data data) : _data(data), _output(Output()) {}\n+\n+            void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+                if (isEnabled()) {\n+                    jobRunIO(_data, sceneContext, renderContext, _input.get<I>(), _output.edit<O>());\n+                }\n+            }\n+        };\n+\n+        Job(ConceptPointer concept) : _concept(concept) {}\n+        Job(std::string name, ConceptPointer concept) : _concept(concept), _name(name) {}\n+\n+        bool isEnabled() const { return _concept->isEnabled(); }\n+        void setEnabled(bool isEnabled) { _concept->setEnabled(isEnabled); }\n+\n+        const Varying getInput() const { return _concept->getInput(); }\n+        const Varying getOutput() const { return _concept->getOutput(); }\n+\n+        template <class T> T& edit() {\n+            auto concept = std::static_pointer_cast<typename T::JobModel>(_concept);\n+            assert(concept);\n+            return concept->_data;\n+        }\n+        template <class T> const T& get() const {\n+            auto concept = std::static_pointer_cast<typename T::JobModel>(_concept);\n+            assert(concept);\n+            return concept->_data;\n+        }\n+\n+        void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {\n+            PerformanceTimer perfTimer(_name.c_str());\n+            PROFILE_RANGE(_name.c_str());\n+\n+            _concept->run(sceneContext, renderContext);\n+        }\n+    protected:\n+        ConceptPointer _concept;\n+        std::string _name = \"\";\n+\n+    };\n+    using Jobs = std::vector<Job>;\n+\n+public:\n+    Task() = default;\n+    virtual ~Task() = default;\n+\n+    // Queue a new job to the task; returns the job's index\n+    template <class T, class... A> size_t addJob(std::string name, A&&... args) {","path":"libraries/render/src/render/Task.h","position":210,"original_position":210,"commit_id":"c19b4574016fec9139cf7ef257a136e78f565e02","original_commit_id":"e83060f109c877f3486100ca52881bf18eece987","user":{"login":"zzmp","id":5403956,"avatar_url":"https://avatars.githubusercontent.com/u/5403956?v=3","gravatar_id":"","url":"https://api.github.com/users/zzmp","html_url":"https://github.com/zzmp","followers_url":"https://api.github.com/users/zzmp/followers","following_url":"https://api.github.com/users/zzmp/following{/other_user}","gists_url":"https://api.github.com/users/zzmp/gists{/gist_id}","starred_url":"https://api.github.com/users/zzmp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zzmp/subscriptions","organizations_url":"https://api.github.com/users/zzmp/orgs","repos_url":"https://api.github.com/users/zzmp/repos","events_url":"https://api.github.com/users/zzmp/events{/privacy}","received_events_url":"https://api.github.com/users/zzmp/received_events","type":"User","site_admin":false},"body":"I needed a `typename` to specify a dependent name with a templated namespace, see http://en.cppreference.com/w/cpp/language/dependent_name#The_typename_disambiguator_for_dependent_names","created_at":"2016-01-07T22:25:56Z","updated_at":"2016-01-07T22:25:56Z","html_url":"https://github.com/highfidelity/hifi/pull/6788#discussion_r49135279","pull_request_url":"https://api.github.com/repos/highfidelity/hifi/pulls/6788","_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/49135279"},"html":{"href":"https://github.com/highfidelity/hifi/pull/6788#discussion_r49135279"},"pull_request":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/6788"}}},"pull_request":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/6788","id":55294510,"html_url":"https://github.com/highfidelity/hifi/pull/6788","diff_url":"https://github.com/highfidelity/hifi/pull/6788.diff","patch_url":"https://github.com/highfidelity/hifi/pull/6788.patch","issue_url":"https://api.github.com/repos/highfidelity/hifi/issues/6788","number":6788,"state":"open","locked":false,"title":"Promote render::Job to render::Task, render::Job::Varying to render::Varying","user":{"login":"zzmp","id":5403956,"avatar_url":"https://avatars.githubusercontent.com/u/5403956?v=3","gravatar_id":"","url":"https://api.github.com/users/zzmp","html_url":"https://github.com/zzmp","followers_url":"https://api.github.com/users/zzmp/followers","following_url":"https://api.github.com/users/zzmp/following{/other_user}","gists_url":"https://api.github.com/users/zzmp/gists{/gist_id}","starred_url":"https://api.github.com/users/zzmp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zzmp/subscriptions","organizations_url":"https://api.github.com/users/zzmp/orgs","repos_url":"https://api.github.com/users/zzmp/repos","events_url":"https://api.github.com/users/zzmp/events{/privacy}","received_events_url":"https://api.github.com/users/zzmp/received_events","type":"User","site_admin":false},"body":"Breaks rendering `Context.h`, `Task.h` into separate files.\r\nRemoves some dead code.\r\n\r\nReplaced all of the `new`s in RenderDeferredTask with `std::make_shared`.","created_at":"2016-01-07T02:58:42Z","updated_at":"2016-01-07T22:25:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bec026c3de428ebcaf4aac41e77a98c040572de1","assignee":{"login":"Atlante45","id":4036492,"avatar_url":"https://avatars.githubusercontent.com/u/4036492?v=3","gravatar_id":"","url":"https://api.github.com/users/Atlante45","html_url":"https://github.com/Atlante45","followers_url":"https://api.github.com/users/Atlante45/followers","following_url":"https://api.github.com/users/Atlante45/following{/other_user}","gists_url":"https://api.github.com/users/Atlante45/gists{/gist_id}","starred_url":"https://api.github.com/users/Atlante45/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Atlante45/subscriptions","organizations_url":"https://api.github.com/users/Atlante45/orgs","repos_url":"https://api.github.com/users/Atlante45/repos","events_url":"https://api.github.com/users/Atlante45/events{/privacy}","received_events_url":"https://api.github.com/users/Atlante45/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/highfidelity/hifi/pulls/6788/commits","review_comments_url":"https://api.github.com/repos/highfidelity/hifi/pulls/6788/comments","review_comment_url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/highfidelity/hifi/issues/6788/comments","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/c19b4574016fec9139cf7ef257a136e78f565e02","head":{"label":"zzmp:refactor/render-job-task2","ref":"refactor/render-job-task2","sha":"c19b4574016fec9139cf7ef257a136e78f565e02","user":{"login":"zzmp","id":5403956,"avatar_url":"https://avatars.githubusercontent.com/u/5403956?v=3","gravatar_id":"","url":"https://api.github.com/users/zzmp","html_url":"https://github.com/zzmp","followers_url":"https://api.github.com/users/zzmp/followers","following_url":"https://api.github.com/users/zzmp/following{/other_user}","gists_url":"https://api.github.com/users/zzmp/gists{/gist_id}","starred_url":"https://api.github.com/users/zzmp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zzmp/subscriptions","organizations_url":"https://api.github.com/users/zzmp/orgs","repos_url":"https://api.github.com/users/zzmp/repos","events_url":"https://api.github.com/users/zzmp/events{/privacy}","received_events_url":"https://api.github.com/users/zzmp/received_events","type":"User","site_admin":false},"repo":{"id":45364529,"name":"hifi","full_name":"zzmp/hifi","owner":{"login":"zzmp","id":5403956,"avatar_url":"https://avatars.githubusercontent.com/u/5403956?v=3","gravatar_id":"","url":"https://api.github.com/users/zzmp","html_url":"https://github.com/zzmp","followers_url":"https://api.github.com/users/zzmp/followers","following_url":"https://api.github.com/users/zzmp/following{/other_user}","gists_url":"https://api.github.com/users/zzmp/gists{/gist_id}","starred_url":"https://api.github.com/users/zzmp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zzmp/subscriptions","organizations_url":"https://api.github.com/users/zzmp/orgs","repos_url":"https://api.github.com/users/zzmp/repos","events_url":"https://api.github.com/users/zzmp/events{/privacy}","received_events_url":"https://api.github.com/users/zzmp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/zzmp/hifi","description":"Open source software for shared virtual worlds using HMDs and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.com/jobs  Documentation at http://docs.highfidelity.com  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":true,"url":"https://api.github.com/repos/zzmp/hifi","forks_url":"https://api.github.com/repos/zzmp/hifi/forks","keys_url":"https://api.github.com/repos/zzmp/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zzmp/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zzmp/hifi/teams","hooks_url":"https://api.github.com/repos/zzmp/hifi/hooks","issue_events_url":"https://api.github.com/repos/zzmp/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/zzmp/hifi/events","assignees_url":"https://api.github.com/repos/zzmp/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/zzmp/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/zzmp/hifi/tags","blobs_url":"https://api.github.com/repos/zzmp/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zzmp/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zzmp/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/zzmp/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zzmp/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/zzmp/hifi/languages","stargazers_url":"https://api.github.com/repos/zzmp/hifi/stargazers","contributors_url":"https://api.github.com/repos/zzmp/hifi/contributors","subscribers_url":"https://api.github.com/repos/zzmp/hifi/subscribers","subscription_url":"https://api.github.com/repos/zzmp/hifi/subscription","commits_url":"https://api.github.com/repos/zzmp/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/zzmp/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/zzmp/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/zzmp/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/zzmp/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/zzmp/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zzmp/hifi/merges","archive_url":"https://api.github.com/repos/zzmp/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zzmp/hifi/downloads","issues_url":"https://api.github.com/repos/zzmp/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/zzmp/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/zzmp/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/zzmp/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zzmp/hifi/labels{/name}","releases_url":"https://api.github.com/repos/zzmp/hifi/releases{/id}","created_at":"2015-11-02T01:02:18Z","updated_at":"2015-11-25T03:30:59Z","pushed_at":"2016-01-07T22:15:42Z","git_url":"git://github.com/zzmp/hifi.git","ssh_url":"git@github.com:zzmp/hifi.git","clone_url":"https://github.com/zzmp/hifi.git","svn_url":"https://github.com/zzmp/hifi","homepage":"","size":178659,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"highfidelity:master","ref":"master","sha":"c5ab29071e189ccc5a90246cd08dd220010c0ecb","user":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"repo":{"id":5372872,"name":"hifi","full_name":"highfidelity/hifi","owner":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/highfidelity/hifi","description":"Open source software for shared virtual worlds using HMDs and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.com/jobs  Documentation at http://docs.highfidelity.com  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":false,"url":"https://api.github.com/repos/highfidelity/hifi","forks_url":"https://api.github.com/repos/highfidelity/hifi/forks","keys_url":"https://api.github.com/repos/highfidelity/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/highfidelity/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/highfidelity/hifi/teams","hooks_url":"https://api.github.com/repos/highfidelity/hifi/hooks","issue_events_url":"https://api.github.com/repos/highfidelity/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/highfidelity/hifi/events","assignees_url":"https://api.github.com/repos/highfidelity/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/highfidelity/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/highfidelity/hifi/tags","blobs_url":"https://api.github.com/repos/highfidelity/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/highfidelity/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/highfidelity/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/highfidelity/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/highfidelity/hifi/languages","stargazers_url":"https://api.github.com/repos/highfidelity/hifi/stargazers","contributors_url":"https://api.github.com/repos/highfidelity/hifi/contributors","subscribers_url":"https://api.github.com/repos/highfidelity/hifi/subscribers","subscription_url":"https://api.github.com/repos/highfidelity/hifi/subscription","commits_url":"https://api.github.com/repos/highfidelity/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/highfidelity/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/highfidelity/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/highfidelity/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/highfidelity/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/highfidelity/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/highfidelity/hifi/merges","archive_url":"https://api.github.com/repos/highfidelity/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/highfidelity/hifi/downloads","issues_url":"https://api.github.com/repos/highfidelity/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/highfidelity/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/highfidelity/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/highfidelity/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/highfidelity/hifi/labels{/name}","releases_url":"https://api.github.com/repos/highfidelity/hifi/releases{/id}","created_at":"2012-08-10T18:26:22Z","updated_at":"2016-01-04T23:06:39Z","pushed_at":"2016-01-07T22:21:35Z","git_url":"git://github.com/highfidelity/hifi.git","ssh_url":"git@github.com:highfidelity/hifi.git","clone_url":"https://github.com/highfidelity/hifi.git","svn_url":"https://github.com/highfidelity/hifi","homepage":"","size":221562,"stargazers_count":340,"watchers_count":340,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":201,"mirror_url":null,"open_issues_count":55,"forks":201,"open_issues":55,"watchers":340,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/6788"},"html":{"href":"https://github.com/highfidelity/hifi/pull/6788"},"issue":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/6788"},"comments":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/6788/comments"},"review_comments":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/6788/comments"},"review_comment":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/6788/commits"},"statuses":{"href":"https://api.github.com/repos/highfidelity/hifi/statuses/c19b4574016fec9139cf7ef257a136e78f565e02"}}}}