{"action":"created","comment":{"url":"https://api.github.com/repos/immuta/bopattern.js/pulls/comments/47514368","id":47514368,"diff_hunk":"@@ -0,0 +1,175 @@\n+BoPattern.extend(function(internal) {\n+    \"use strict\";\n+\n+    internal.BoTile = function(obj) {\n+        var zlayer = \"background\";\n+        if (!msngr.exist(obj) || !msngr.exists(obj.value, obj.label, obj.position)) {\n+            throw \"[BoPattern.js] Invalid parameters supplied to BoTile\";\n+        }\n+        var loaded = false;\n+        var properties = msngr.copy(obj);\n+        var transitionProperties = { };\n+        var state;\n+        var mouseOver;\n+        var cachedScreenWidth;\n+        var cachedScreenHeight;\n+\n+        var calcTileDimensions = function() {\n+            var tileWidth = (internal.boundedWidth / internal.data.maxFirstDimension);\n+            var tileHeight = (internal.boundedHeight / (internal.data.maxSecondDimension + 1));\n+            var x = internal.boundedX1 + (tileWidth * properties.position[0]);\n+            var y = internal.boundedY1 + (tileHeight * properties.position[1]);\n+\n+            return {\n+                x: x,\n+                y: y,\n+                width: tileWidth,\n+                height: tileHeight\n+            };\n+        };\n+\n+        var getProperty = function(str) {\n+            if (transitionProperties[str] !== undefined) {\n+                return transitionProperties[str];\n+            }\n+\n+            if (properties[str] !== undefined) {\n+                return properties[str];\n+            }\n+            return internal.BoTile.properties[str];\n+        };\n+\n+        var tile = {\n+            type: \"tile\",\n+            render: function(ctx) {\n+                if (loaded) {\n+                    // Set the boarders\n+                    ctx.beginPath();\n+                    ctx.strokeStyle = getProperty(\"borderColor\");\n+                    ctx.lineWidth = getProperty(\"borderThickness\");\n+                    ctx.globalAlpha = getProperty(\"borderAlpha\");\n+                    ctx.strokeRect(getProperty(\"x\"), getProperty(\"y\"), getProperty(\"width\"), getProperty(\"height\"));\n+                    ctx.closePath();\n+\n+                    // Set the fills\n+                    ctx.beginPath();\n+                    ctx.fillStyle = getProperty(\"tileColor\");\n+                    ctx.globalAlpha = getProperty(\"tileAlpha\");\n+                    ctx.fillRect(getProperty(\"x\"), getProperty(\"y\"), getProperty(\"width\"), getProperty(\"height\"));\n+                    ctx.closePath();\n+                }\n+            },\n+            update: function() {\n+                mouseOver = false;\n+                if (internal.user.mousePosition.x >= properties.x) {\n+                    if (internal.user.mousePosition.x <= (properties.x + properties.width)) {\n+                        // It's in our horizontal!\n+                        if (internal.user.mousePosition.y >= properties.y) {\n+                            if (internal.user.mousePosition.y <= (properties.y + properties.height)) {\n+                                // IT'S IN ME!\n+                                mouseOver = true;\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                if (cachedScreenWidth !== internal.screenWidth || cachedScreenHeight !== internal.screenHeight) {\n+                    // Screen size changed; on noes!\n+                    var dimensions = calcTileDimensions();\n+                    properties.x = (dimensions.x);\n+                    properties.y = (dimensions.y);\n+                    properties.width = dimensions.width;\n+                    properties.height = dimensions.height;\n+\n+                    // Are we in transition?\n+                    if (state !== undefined) {\n+                        transitionProperties.x = properties.x;\n+                        transitionProperties.y = properties.y;\n+                        transitionProperties.width = properties.width;\n+                        transitionProperties.height = properties.height;\n+                    }\n+\n+                    cachedScreenWidth = internal.screenWidth;\n+                    cachedScreenHeight = internal.screenHeight;\n+                }\n+\n+                if (state === undefined) {\n+                    // Default state\n+                    return undefined;\n+                }\n+\n+                if (state === \"loading\") {\n+                    if (transitionProperties.tileAlpha >= properties.tileAlpha) {\n+                        state = undefined;\n+                        transitionProperties = { };\n+                        return undefined;\n+                    }\n+                    transitionProperties.tileAlpha = transitionProperties.tileAlpha + internal.random(0.02, 0.04);\n+                }\n+\n+                if (state === \"unloading\") {\n+                    if (transitionProperties.tileAlpha <= 0.0) {\n+                        state = undefined;\n+                        transitionProperties = { };\n+                        internal.objects[zlayer].splice(internal.objects[zlayer].indexOf(tile), 1);\n+                        return undefined;\n+                    }\n+                    transitionProperties.tileAlpha = transitionProperties.tileAlpha - internal.random(0.08, 0.12);\n+                }\n+            },\n+            load: function() {\n+                state = \"loading\";\n+\n+                cachedScreenWidth = internal.screenWidth;\n+                cachedScreenHeight = internal.screenHeight;\n+\n+                // Set tile properties\n+                var dimensions = calcTileDimensions();\n+                properties.x = (dimensions.x);\n+                properties.y = (dimensions.y);\n+                properties.width = (dimensions.width);\n+                properties.height = (dimensions.height);\n+                if (internal.data.maxValue === 0) {\n+                    properties.tileAlpha = 0.0;\n+                } else {\n+                    properties.tileAlpha = (properties.value / internal.data.maxValue);\n+                }\n+\n+                transitionProperties = msngr.copy(properties);\n+                transitionProperties.tileAlpha = 0.0;\n+\n+                loaded = true;\n+            },\n+            unload: function() {\n+                state = \"unloading\";\n+\n+                transitionProperties = msngr.copy(properties);\n+            }\n+        };\n+\n+        Object.defineProperty(tile, \"z\", {\n+            get: function() {\n+                return zlayer;\n+            }\n+        });\n+\n+        Object.defineProperty(tile, \"properties\", {\n+            get: function() {\n+                return properties;\n+            }\n+        });\n+\n+        return tile;\n+    };\n+\n+    internal.BoTile.properties = {","path":"src/sprites/botile.js","position":165,"original_position":165,"commit_id":"ecf1f28e618470d9b827bf12c564cb32e36184e9","original_commit_id":"ecf1f28e618470d9b827bf12c564cb32e36184e9","user":{"login":"KrisSiegel","id":1885826,"avatar_url":"https://avatars.githubusercontent.com/u/1885826?v=3","gravatar_id":"","url":"https://api.github.com/users/KrisSiegel","html_url":"https://github.com/KrisSiegel","followers_url":"https://api.github.com/users/KrisSiegel/followers","following_url":"https://api.github.com/users/KrisSiegel/following{/other_user}","gists_url":"https://api.github.com/users/KrisSiegel/gists{/gist_id}","starred_url":"https://api.github.com/users/KrisSiegel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrisSiegel/subscriptions","organizations_url":"https://api.github.com/users/KrisSiegel/orgs","repos_url":"https://api.github.com/users/KrisSiegel/repos","events_url":"https://api.github.com/users/KrisSiegel/events{/privacy}","received_events_url":"https://api.github.com/users/KrisSiegel/received_events","type":"User","site_admin":false},"body":"Good point I should document these. Also I think there may be a couple of places where I don't have a default like this setup so I'll double check I have these everywhere (should put fonts here for the other sprites).","created_at":"2015-12-14T15:55:21Z","updated_at":"2015-12-14T15:55:21Z","html_url":"https://github.com/immuta/bopattern.js/pull/1#discussion_r47514368","pull_request_url":"https://api.github.com/repos/immuta/bopattern.js/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/comments/47514368"},"html":{"href":"https://github.com/immuta/bopattern.js/pull/1#discussion_r47514368"},"pull_request":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/immuta/bopattern.js/pulls/1","id":53370839,"html_url":"https://github.com/immuta/bopattern.js/pull/1","diff_url":"https://github.com/immuta/bopattern.js/pull/1.diff","patch_url":"https://github.com/immuta/bopattern.js/pull/1.patch","issue_url":"https://api.github.com/repos/immuta/bopattern.js/issues/1","number":1,"state":"open","locked":false,"title":"Initial PR for Pattern of Life web control","user":{"login":"KrisSiegel","id":1885826,"avatar_url":"https://avatars.githubusercontent.com/u/1885826?v=3","gravatar_id":"","url":"https://api.github.com/users/KrisSiegel","html_url":"https://github.com/KrisSiegel","followers_url":"https://api.github.com/users/KrisSiegel/followers","following_url":"https://api.github.com/users/KrisSiegel/following{/other_user}","gists_url":"https://api.github.com/users/KrisSiegel/gists{/gist_id}","starred_url":"https://api.github.com/users/KrisSiegel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrisSiegel/subscriptions","organizations_url":"https://api.github.com/users/KrisSiegel/orgs","repos_url":"https://api.github.com/users/KrisSiegel/repos","events_url":"https://api.github.com/users/KrisSiegel/events{/privacy}","received_events_url":"https://api.github.com/users/KrisSiegel/received_events","type":"User","site_admin":false},"body":"This PR gets the initial version of the Pattern of Life control out there. What this includes:\r\n- The main chart for displaying a pattern of life within a canvas including a top label and tiles indicating shades for the scale all of which are responsive and work at almost any resolution and pixel density (that was annoying to figure out)\r\n- Documentation on how to use\r\n- Bower registration\r\n- Travis build / test integration (right now there are multiple unit tests but I'm not sure how to test many of the pieces)\r\n\r\nI wanted to get this out there so I could being integrating it into BoData properly (well I already started but this makes it a little easier). There are things remaining in here that I want to do after I get it in BoData just to ensure it will work properly there:\r\n- Add labels on hover (Mike would like these to be in HTML and I think I figured out a good way to do this it just not done)\r\n- Make the tiles uniform squares. I had to remove this code while I debugged a lot of different things and need to get it back in there with proper spacing which it previously lacked\r\n- ~~Transitions were removed due to Firefox not playing nice. I figured out a way around it but I want to get this PR in before I add them back (Firefox executing setInterval was unfortunately too slow and caused massively dropped frames from the main rendering).~~\r\n- Unit tests; while a pain to do on the canvas there are a lot of tests I can get in there I only did a few for now.\r\n\r\n**Items of note**\r\n- Currently depends on msngr; I'd like to remove that dependency but it was just easier to do this for now with a few things I was testing out and doing. Shouldn't be hard though.\r\n- Since this is a bower component bower grabs from GitHub meaning built assets must be checked in. These assets are in ```dist/*.js```. They consist of a file with all sources combined and another file where all sources are combined *and* minified. I would ignore these when reviewing to avoid redundancy.\r\n\r\n@immuta/developers ","created_at":"2015-12-11T09:35:24Z","updated_at":"2015-12-14T15:55:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dec724880f680596e30ca04bd5f0aee541d2b9f6","assignee":{"login":"KrisSiegel","id":1885826,"avatar_url":"https://avatars.githubusercontent.com/u/1885826?v=3","gravatar_id":"","url":"https://api.github.com/users/KrisSiegel","html_url":"https://github.com/KrisSiegel","followers_url":"https://api.github.com/users/KrisSiegel/followers","following_url":"https://api.github.com/users/KrisSiegel/following{/other_user}","gists_url":"https://api.github.com/users/KrisSiegel/gists{/gist_id}","starred_url":"https://api.github.com/users/KrisSiegel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrisSiegel/subscriptions","organizations_url":"https://api.github.com/users/KrisSiegel/orgs","repos_url":"https://api.github.com/users/KrisSiegel/repos","events_url":"https://api.github.com/users/KrisSiegel/events{/privacy}","received_events_url":"https://api.github.com/users/KrisSiegel/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/immuta/bopattern.js/pulls/1/commits","review_comments_url":"https://api.github.com/repos/immuta/bopattern.js/pulls/1/comments","review_comment_url":"https://api.github.com/repos/immuta/bopattern.js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/immuta/bopattern.js/issues/1/comments","statuses_url":"https://api.github.com/repos/immuta/bopattern.js/statuses/ecf1f28e618470d9b827bf12c564cb32e36184e9","head":{"label":"immuta:first-version","ref":"first-version","sha":"ecf1f28e618470d9b827bf12c564cb32e36184e9","user":{"login":"immuta","id":7513613,"avatar_url":"https://avatars.githubusercontent.com/u/7513613?v=3","gravatar_id":"","url":"https://api.github.com/users/immuta","html_url":"https://github.com/immuta","followers_url":"https://api.github.com/users/immuta/followers","following_url":"https://api.github.com/users/immuta/following{/other_user}","gists_url":"https://api.github.com/users/immuta/gists{/gist_id}","starred_url":"https://api.github.com/users/immuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immuta/subscriptions","organizations_url":"https://api.github.com/users/immuta/orgs","repos_url":"https://api.github.com/users/immuta/repos","events_url":"https://api.github.com/users/immuta/events{/privacy}","received_events_url":"https://api.github.com/users/immuta/received_events","type":"Organization","site_admin":false},"repo":{"id":47419603,"name":"bopattern.js","full_name":"immuta/bopattern.js","owner":{"login":"immuta","id":7513613,"avatar_url":"https://avatars.githubusercontent.com/u/7513613?v=3","gravatar_id":"","url":"https://api.github.com/users/immuta","html_url":"https://github.com/immuta","followers_url":"https://api.github.com/users/immuta/followers","following_url":"https://api.github.com/users/immuta/following{/other_user}","gists_url":"https://api.github.com/users/immuta/gists{/gist_id}","starred_url":"https://api.github.com/users/immuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immuta/subscriptions","organizations_url":"https://api.github.com/users/immuta/orgs","repos_url":"https://api.github.com/users/immuta/repos","events_url":"https://api.github.com/users/immuta/events{/privacy}","received_events_url":"https://api.github.com/users/immuta/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/immuta/bopattern.js","description":"A pattern of life control, used in BoData and available for anyone to use","fork":false,"url":"https://api.github.com/repos/immuta/bopattern.js","forks_url":"https://api.github.com/repos/immuta/bopattern.js/forks","keys_url":"https://api.github.com/repos/immuta/bopattern.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/immuta/bopattern.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/immuta/bopattern.js/teams","hooks_url":"https://api.github.com/repos/immuta/bopattern.js/hooks","issue_events_url":"https://api.github.com/repos/immuta/bopattern.js/issues/events{/number}","events_url":"https://api.github.com/repos/immuta/bopattern.js/events","assignees_url":"https://api.github.com/repos/immuta/bopattern.js/assignees{/user}","branches_url":"https://api.github.com/repos/immuta/bopattern.js/branches{/branch}","tags_url":"https://api.github.com/repos/immuta/bopattern.js/tags","blobs_url":"https://api.github.com/repos/immuta/bopattern.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/immuta/bopattern.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/immuta/bopattern.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/immuta/bopattern.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/immuta/bopattern.js/statuses/{sha}","languages_url":"https://api.github.com/repos/immuta/bopattern.js/languages","stargazers_url":"https://api.github.com/repos/immuta/bopattern.js/stargazers","contributors_url":"https://api.github.com/repos/immuta/bopattern.js/contributors","subscribers_url":"https://api.github.com/repos/immuta/bopattern.js/subscribers","subscription_url":"https://api.github.com/repos/immuta/bopattern.js/subscription","commits_url":"https://api.github.com/repos/immuta/bopattern.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/immuta/bopattern.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/immuta/bopattern.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/immuta/bopattern.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/immuta/bopattern.js/contents/{+path}","compare_url":"https://api.github.com/repos/immuta/bopattern.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/immuta/bopattern.js/merges","archive_url":"https://api.github.com/repos/immuta/bopattern.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/immuta/bopattern.js/downloads","issues_url":"https://api.github.com/repos/immuta/bopattern.js/issues{/number}","pulls_url":"https://api.github.com/repos/immuta/bopattern.js/pulls{/number}","milestones_url":"https://api.github.com/repos/immuta/bopattern.js/milestones{/number}","notifications_url":"https://api.github.com/repos/immuta/bopattern.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/immuta/bopattern.js/labels{/name}","releases_url":"https://api.github.com/repos/immuta/bopattern.js/releases{/id}","created_at":"2015-12-04T17:39:19Z","updated_at":"2015-12-04T17:39:19Z","pushed_at":"2015-12-14T15:42:13Z","git_url":"git://github.com/immuta/bopattern.js.git","ssh_url":"git@github.com:immuta/bopattern.js.git","clone_url":"https://github.com/immuta/bopattern.js.git","svn_url":"https://github.com/immuta/bopattern.js","homepage":null,"size":29961,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"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":"immuta:master","ref":"master","sha":"d97fb659196155e8bcf074aa2ec5a6a8ab84d6d8","user":{"login":"immuta","id":7513613,"avatar_url":"https://avatars.githubusercontent.com/u/7513613?v=3","gravatar_id":"","url":"https://api.github.com/users/immuta","html_url":"https://github.com/immuta","followers_url":"https://api.github.com/users/immuta/followers","following_url":"https://api.github.com/users/immuta/following{/other_user}","gists_url":"https://api.github.com/users/immuta/gists{/gist_id}","starred_url":"https://api.github.com/users/immuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immuta/subscriptions","organizations_url":"https://api.github.com/users/immuta/orgs","repos_url":"https://api.github.com/users/immuta/repos","events_url":"https://api.github.com/users/immuta/events{/privacy}","received_events_url":"https://api.github.com/users/immuta/received_events","type":"Organization","site_admin":false},"repo":{"id":47419603,"name":"bopattern.js","full_name":"immuta/bopattern.js","owner":{"login":"immuta","id":7513613,"avatar_url":"https://avatars.githubusercontent.com/u/7513613?v=3","gravatar_id":"","url":"https://api.github.com/users/immuta","html_url":"https://github.com/immuta","followers_url":"https://api.github.com/users/immuta/followers","following_url":"https://api.github.com/users/immuta/following{/other_user}","gists_url":"https://api.github.com/users/immuta/gists{/gist_id}","starred_url":"https://api.github.com/users/immuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immuta/subscriptions","organizations_url":"https://api.github.com/users/immuta/orgs","repos_url":"https://api.github.com/users/immuta/repos","events_url":"https://api.github.com/users/immuta/events{/privacy}","received_events_url":"https://api.github.com/users/immuta/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/immuta/bopattern.js","description":"A pattern of life control, used in BoData and available for anyone to use","fork":false,"url":"https://api.github.com/repos/immuta/bopattern.js","forks_url":"https://api.github.com/repos/immuta/bopattern.js/forks","keys_url":"https://api.github.com/repos/immuta/bopattern.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/immuta/bopattern.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/immuta/bopattern.js/teams","hooks_url":"https://api.github.com/repos/immuta/bopattern.js/hooks","issue_events_url":"https://api.github.com/repos/immuta/bopattern.js/issues/events{/number}","events_url":"https://api.github.com/repos/immuta/bopattern.js/events","assignees_url":"https://api.github.com/repos/immuta/bopattern.js/assignees{/user}","branches_url":"https://api.github.com/repos/immuta/bopattern.js/branches{/branch}","tags_url":"https://api.github.com/repos/immuta/bopattern.js/tags","blobs_url":"https://api.github.com/repos/immuta/bopattern.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/immuta/bopattern.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/immuta/bopattern.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/immuta/bopattern.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/immuta/bopattern.js/statuses/{sha}","languages_url":"https://api.github.com/repos/immuta/bopattern.js/languages","stargazers_url":"https://api.github.com/repos/immuta/bopattern.js/stargazers","contributors_url":"https://api.github.com/repos/immuta/bopattern.js/contributors","subscribers_url":"https://api.github.com/repos/immuta/bopattern.js/subscribers","subscription_url":"https://api.github.com/repos/immuta/bopattern.js/subscription","commits_url":"https://api.github.com/repos/immuta/bopattern.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/immuta/bopattern.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/immuta/bopattern.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/immuta/bopattern.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/immuta/bopattern.js/contents/{+path}","compare_url":"https://api.github.com/repos/immuta/bopattern.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/immuta/bopattern.js/merges","archive_url":"https://api.github.com/repos/immuta/bopattern.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/immuta/bopattern.js/downloads","issues_url":"https://api.github.com/repos/immuta/bopattern.js/issues{/number}","pulls_url":"https://api.github.com/repos/immuta/bopattern.js/pulls{/number}","milestones_url":"https://api.github.com/repos/immuta/bopattern.js/milestones{/number}","notifications_url":"https://api.github.com/repos/immuta/bopattern.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/immuta/bopattern.js/labels{/name}","releases_url":"https://api.github.com/repos/immuta/bopattern.js/releases{/id}","created_at":"2015-12-04T17:39:19Z","updated_at":"2015-12-04T17:39:19Z","pushed_at":"2015-12-14T15:42:13Z","git_url":"git://github.com/immuta/bopattern.js.git","ssh_url":"git@github.com:immuta/bopattern.js.git","clone_url":"https://github.com/immuta/bopattern.js.git","svn_url":"https://github.com/immuta/bopattern.js","homepage":null,"size":29961,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/1"},"html":{"href":"https://github.com/immuta/bopattern.js/pull/1"},"issue":{"href":"https://api.github.com/repos/immuta/bopattern.js/issues/1"},"comments":{"href":"https://api.github.com/repos/immuta/bopattern.js/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/immuta/bopattern.js/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/immuta/bopattern.js/statuses/ecf1f28e618470d9b827bf12c564cb32e36184e9"}}}}