{"action":"created","comment":{"url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/comments/37151903","id":37151903,"diff_hunk":"@@ -0,0 +1,197 @@\n+package edu.berkeley.ce.rockslicing\n+\n+import breeze.linalg\n+import breeze.linalg.{DenseVector, DenseMatrix}\n+\n+object BlockVTK {\n+\n+  private val EPSILON = 1.0e-6\n+\n+  /**\n+   * Calculates the rotation matrix to rotate the input plane (specified by its normal)\n+   * to the desired orientation (specified by the desired normal)\n+   * @param n_current: Current normal of plane\n+   * @param n_desired: Desired new normal\n+   * @return 3*3 rotation matrix\n+   */\n+  private def rotationMatrix(n_current: (Double, Double, Double), n_desired: (Double, Double, Double)):\n+  DenseMatrix[Double] = {\n+    val n_c = DenseVector[Double](n_current._1, n_current._2, n_current._3)\n+    val n_d = DenseVector[Double](n_desired._1, n_desired._2, n_desired._3)\n+    if (math.abs(linalg.norm(linalg.cross(n_c,n_d))) > BlockVTK.EPSILON) {\n+      val (u, v, w) = n_current\n+\n+      // Rotation matrix to rotate into x-z plane\n+      val Txz = DenseMatrix.zeros[Double](3, 3)\n+      Txz(0,0) = u / math.sqrt(u*u + v*v)\n+      Txz(1,0) = -v /math.sqrt(u*u + v*v)\n+      Txz(0,1) = v / math.sqrt(u*u + v*v)\n+      Txz(1,1) = u / math.sqrt(u*u + v*v)\n+      Txz(2,2) = 1.0\n+\n+      // Rotation matrix to rotate from x-z plane on z-axis\n+      val Tz = DenseMatrix.zeros[Double](3, 3)\n+      Tz(0,0) = w / math.sqrt(u*u + v*v + w*w)\n+      Tz(2,0) = math.sqrt(u*u + v*v) / math.sqrt(u*u + v*v + w*w)\n+      Tz(0,2) = -math.sqrt(u*u + v*v)/math.sqrt(u*u + v*v + w*w)\n+      Tz(2,2) = w / math.sqrt(u*u + v*v + w*w)\n+      Tz(1,1) = 1.0\n+      Tz * Txz\n+    } else {\n+      DenseMatrix.eye[Double](3)\n+    }\n+  }\n+\n+    /**\n+   * Finds the center of a list of vertices - defined as the average coordinate of all the vertices in the list\n+   * @param vertices List of vertices\n+   * @return Coordinate of center of vertices\n+   */\n+  private def findCenter(vertices: Seq[(Double, Double, Double)]): (Double, Double, Double) = {\n+    (vertices.map(_._1).sum / vertices.length.toDouble,\n+      vertices.map(_._2).sum / vertices.length.toDouble,\n+      vertices.map(_._3).sum / vertices.length.toDouble)\n+  }\n+\n+  /**\n+   * Compares pointA to pointB. If pointA is first relative to pointB rotating counter-clockwise about center,\n+   * the method returns true. Input vectors should have same z-coordinate - comparison is based in 2-D\n+   * @param pointA Point of interest\n+   * @param pointB Point of comparison\n+   * @param center Reference point for comparison\n+   * @return Returns TRUE if pointA is first relative to pointB, FALSE otherwise\n+   */\n+  private def ccwCompare(pointA: (Double, Double, Double), pointB: (Double, Double, Double),\n+                           center: (Double, Double, Double)): Boolean = {\n+    assert(math.abs(pointA._3 - pointB._3) < BlockVTK.EPSILON)\n+    if ((pointA._1 - center._1 < -BlockVTK.EPSILON) && (pointB._1 - center._1 >= BlockVTK.EPSILON)) {\n+      return true\n+    }\n+    if ((pointA._1 - center._1 >= BlockVTK.EPSILON) && (pointB._1 - center._1 < -BlockVTK.EPSILON)) {\n+      return false\n+    }\n+    if ((math.abs(pointA._1 - center._1) < BlockVTK.EPSILON) &&\n+        (math.abs(pointB._1 - center._1) < BlockVTK.EPSILON)) {\n+      if ((pointA._2 - center._2 >= BlockVTK.EPSILON) || (pointB._2 - center._2 >= BlockVTK.EPSILON)) {\n+        return pointA._2 > pointB._2\n+      }\n+      return pointB._2 > pointA._2\n+    }\n+    // the cross product of vectors (pointA - center) and (pointB - center)\n+    val det = (pointA._1 - center._1) * (pointB._2 - center._2) -\n+      (pointB._1 - center._1) * (pointA._2 - center._2)\n+    if (det > BlockVTK.EPSILON) {\n+      return true\n+    }\n+    if (det < -BlockVTK.EPSILON) {\n+      return false\n+    }\n+    // pointA and pointB are on the same line from the center, so check which one is closer to the center\n+    val d1 = (pointA._1 - center._1) * (pointA._1 - center._1) + (pointA._2 - center._2) * (pointA._2 - center._2)\n+    val d2 = (pointB._1 - center._1) * (pointB._1 - center._1) + (pointB._2 - center._2) * (pointB._2 - center._2)\n+    return d1 > d2\n+  }\n+\n+  /**\n+   * Arranges the vertices of each of the faces of the input block such that they are in a counter-\n+   * clockwise orientation relative their face's unit normal\n+   * @param block A rock block\n+   * @return A mapping from each face of the block to a Seq of vertices for that face arranged in counter-\n+   *         clockwise order relative to its unit normal\n+   */\n+  private def orientVertices(block: Block): Map[Face, Seq[(Double, Double, Double)]] = {\n+    val faces = block.findVertices\n+    faces.keys.zip(\n+      faces.map { kv =>\n+        // Rotate vertices to all be in x-y plane\n+        val R = BlockVTK.rotationMatrix(kv._1.normalVec, (0.0, 0.0, 1.0))\n+        val rotatedVerts = kv._2 map { vertex =>\n+          val rotatedVertex = R * DenseVector[Double](vertex._1, vertex._2, vertex._3)\n+          (rotatedVertex(0), rotatedVertex(1), rotatedVertex(2))\n+        }\n+        // Order vertices in counter-clockwise orientation\n+        val center = BlockVTK.findCenter(rotatedVerts)\n+        val orderedVerts = {\n+          if (kv._1.normalVec._3 < -BlockVTK.EPSILON) {\n+            rotatedVerts.sortWith(BlockVTK.ccwCompare(_, _, center)).reverse\n+          }\n+          else {\n+            rotatedVerts.sortWith(BlockVTK.ccwCompare(_, _, center))\n+          }\n+        }\n+        // Rotate vertices back to original orientation\n+        val invR = R.t // Inverse of rotation matrix is equal to its transpose\n+        orderedVerts map { vertex =>\n+          val orderedVertex = invR * DenseVector[Double](vertex._1, vertex._2, vertex._3)\n+          (orderedVertex(0), orderedVertex(1), orderedVertex(2))\n+        }\n+      }\n+    ).toMap\n+  }\n+\n+  /**\n+   * Finds the indices of the face vertices in the global list of vertices\n+   * @param faceOrientedVerts Mapping from each face to a Seq of vertices for that face\n+   * @param vertices Seq of distinct vertices for the rock block\n+   * @return A mapping from each face of the block to a Seq of integers that represent\n+   *         the indices of the vertices in the global vertex list\n+   */\n+  private def connectivity(faceOrientedVerts: Map[Face, Seq[(Double, Double, Double)]],\n+                           vertices: Seq[(Double, Double, Double)]): Map[Face, Seq[Int]] = {\n+    faceOrientedVerts.keys.zip(\n+      faceOrientedVerts map { kv =>","path":"src/main/scala/edu/berkeley/ce/rockslicing/BlockVTK.scala","position":142,"original_position":142,"commit_id":"737b365cc67ef60e56b8135fd2cbdfe3dd616578","original_commit_id":"737b365cc67ef60e56b8135fd2cbdfe3dd616578","user":{"login":"jKolb1","id":9288575,"avatar_url":"https://avatars.githubusercontent.com/u/9288575?v=3","gravatar_id":"","url":"https://api.github.com/users/jKolb1","html_url":"https://github.com/jKolb1","followers_url":"https://api.github.com/users/jKolb1/followers","following_url":"https://api.github.com/users/jKolb1/following{/other_user}","gists_url":"https://api.github.com/users/jKolb1/gists{/gist_id}","starred_url":"https://api.github.com/users/jKolb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jKolb1/subscriptions","organizations_url":"https://api.github.com/users/jKolb1/orgs","repos_url":"https://api.github.com/users/jKolb1/repos","events_url":"https://api.github.com/users/jKolb1/events{/privacy}","received_events_url":"https://api.github.com/users/jKolb1/received_events","type":"User","site_admin":false},"body":"Here, you can do something like\r\n```scala\r\nfaceOrientedVerts map { case (_, vertices) =>\r\n    vertices map { case vertex =>\r\n```","created_at":"2015-08-16T23:06:27Z","updated_at":"2015-08-16T23:06:27Z","html_url":"https://github.com/jKolb1/sparkRocks/pull/16#discussion_r37151903","pull_request_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16","_links":{"self":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/comments/37151903"},"html":{"href":"https://github.com/jKolb1/sparkRocks/pull/16#discussion_r37151903"},"pull_request":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16"}}},"pull_request":{"url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16","id":42507719,"html_url":"https://github.com/jKolb1/sparkRocks/pull/16","diff_url":"https://github.com/jKolb1/sparkRocks/pull/16.diff","patch_url":"https://github.com/jKolb1/sparkRocks/pull/16.patch","issue_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/16","number":16,"state":"open","locked":false,"title":"Output","user":{"login":"shellshocked2003","id":10856474,"avatar_url":"https://avatars.githubusercontent.com/u/10856474?v=3","gravatar_id":"","url":"https://api.github.com/users/shellshocked2003","html_url":"https://github.com/shellshocked2003","followers_url":"https://api.github.com/users/shellshocked2003/followers","following_url":"https://api.github.com/users/shellshocked2003/following{/other_user}","gists_url":"https://api.github.com/users/shellshocked2003/gists{/gist_id}","starred_url":"https://api.github.com/users/shellshocked2003/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shellshocked2003/subscriptions","organizations_url":"https://api.github.com/users/shellshocked2003/orgs","repos_url":"https://api.github.com/users/shellshocked2003/repos","events_url":"https://api.github.com/users/shellshocked2003/events{/privacy}","received_events_url":"https://api.github.com/users/shellshocked2003/received_events","type":"User","site_admin":false},"body":"This allows the user to specify output that is easily converted to vtk. The rockProcessor sub-module takes this output and converts it to polygon vtk format (vtp) that can be read by ParaView. \r\nPresently, it only allows for the original JSON output and \"vtk JSON\" output, but can be easily expanded to produce other output formats.\r\nAlso, there is no setup.py to install EVTK. Perhaps this should be included in the README portion of rockProcessor since EVTK already has it's own setup.py that's easy to run. Not sure what the best way is to deal with this. What do you think?","created_at":"2015-08-14T23:39:01Z","updated_at":"2015-08-16T23:06:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f53363651c6e2a9e6493b544b236eeb5345ce405","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16/commits","review_comments_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16/comments","review_comment_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/16/comments","statuses_url":"https://api.github.com/repos/jKolb1/sparkRocks/statuses/737b365cc67ef60e56b8135fd2cbdfe3dd616578","head":{"label":"jKolb1:output","ref":"output","sha":"737b365cc67ef60e56b8135fd2cbdfe3dd616578","user":{"login":"jKolb1","id":9288575,"avatar_url":"https://avatars.githubusercontent.com/u/9288575?v=3","gravatar_id":"","url":"https://api.github.com/users/jKolb1","html_url":"https://github.com/jKolb1","followers_url":"https://api.github.com/users/jKolb1/followers","following_url":"https://api.github.com/users/jKolb1/following{/other_user}","gists_url":"https://api.github.com/users/jKolb1/gists{/gist_id}","starred_url":"https://api.github.com/users/jKolb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jKolb1/subscriptions","organizations_url":"https://api.github.com/users/jKolb1/orgs","repos_url":"https://api.github.com/users/jKolb1/repos","events_url":"https://api.github.com/users/jKolb1/events{/privacy}","received_events_url":"https://api.github.com/users/jKolb1/received_events","type":"User","site_admin":false},"repo":{"id":36398369,"name":"sparkRocks","full_name":"jKolb1/sparkRocks","owner":{"login":"jKolb1","id":9288575,"avatar_url":"https://avatars.githubusercontent.com/u/9288575?v=3","gravatar_id":"","url":"https://api.github.com/users/jKolb1","html_url":"https://github.com/jKolb1","followers_url":"https://api.github.com/users/jKolb1/followers","following_url":"https://api.github.com/users/jKolb1/following{/other_user}","gists_url":"https://api.github.com/users/jKolb1/gists{/gist_id}","starred_url":"https://api.github.com/users/jKolb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jKolb1/subscriptions","organizations_url":"https://api.github.com/users/jKolb1/orgs","repos_url":"https://api.github.com/users/jKolb1/repos","events_url":"https://api.github.com/users/jKolb1/events{/privacy}","received_events_url":"https://api.github.com/users/jKolb1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jKolb1/sparkRocks","description":"","fork":true,"url":"https://api.github.com/repos/jKolb1/sparkRocks","forks_url":"https://api.github.com/repos/jKolb1/sparkRocks/forks","keys_url":"https://api.github.com/repos/jKolb1/sparkRocks/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jKolb1/sparkRocks/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jKolb1/sparkRocks/teams","hooks_url":"https://api.github.com/repos/jKolb1/sparkRocks/hooks","issue_events_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/events{/number}","events_url":"https://api.github.com/repos/jKolb1/sparkRocks/events","assignees_url":"https://api.github.com/repos/jKolb1/sparkRocks/assignees{/user}","branches_url":"https://api.github.com/repos/jKolb1/sparkRocks/branches{/branch}","tags_url":"https://api.github.com/repos/jKolb1/sparkRocks/tags","blobs_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/refs{/sha}","trees_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jKolb1/sparkRocks/statuses/{sha}","languages_url":"https://api.github.com/repos/jKolb1/sparkRocks/languages","stargazers_url":"https://api.github.com/repos/jKolb1/sparkRocks/stargazers","contributors_url":"https://api.github.com/repos/jKolb1/sparkRocks/contributors","subscribers_url":"https://api.github.com/repos/jKolb1/sparkRocks/subscribers","subscription_url":"https://api.github.com/repos/jKolb1/sparkRocks/subscription","commits_url":"https://api.github.com/repos/jKolb1/sparkRocks/commits{/sha}","git_commits_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/commits{/sha}","comments_url":"https://api.github.com/repos/jKolb1/sparkRocks/comments{/number}","issue_comment_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/comments{/number}","contents_url":"https://api.github.com/repos/jKolb1/sparkRocks/contents/{+path}","compare_url":"https://api.github.com/repos/jKolb1/sparkRocks/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jKolb1/sparkRocks/merges","archive_url":"https://api.github.com/repos/jKolb1/sparkRocks/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jKolb1/sparkRocks/downloads","issues_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues{/number}","pulls_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls{/number}","milestones_url":"https://api.github.com/repos/jKolb1/sparkRocks/milestones{/number}","notifications_url":"https://api.github.com/repos/jKolb1/sparkRocks/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jKolb1/sparkRocks/labels{/name}","releases_url":"https://api.github.com/repos/jKolb1/sparkRocks/releases{/id}","created_at":"2015-05-27T21:58:52Z","updated_at":"2015-05-27T22:12:59Z","pushed_at":"2015-08-15T04:18:56Z","git_url":"git://github.com/jKolb1/sparkRocks.git","ssh_url":"git@github.com:jKolb1/sparkRocks.git","clone_url":"https://github.com/jKolb1/sparkRocks.git","svn_url":"https://github.com/jKolb1/sparkRocks","homepage":null,"size":476,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":6,"forks":0,"open_issues":6,"watchers":0,"default_branch":"master"}},"base":{"label":"jKolb1:master","ref":"master","sha":"4ba71abeed8d4139615876ac1850c96cff4d7104","user":{"login":"jKolb1","id":9288575,"avatar_url":"https://avatars.githubusercontent.com/u/9288575?v=3","gravatar_id":"","url":"https://api.github.com/users/jKolb1","html_url":"https://github.com/jKolb1","followers_url":"https://api.github.com/users/jKolb1/followers","following_url":"https://api.github.com/users/jKolb1/following{/other_user}","gists_url":"https://api.github.com/users/jKolb1/gists{/gist_id}","starred_url":"https://api.github.com/users/jKolb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jKolb1/subscriptions","organizations_url":"https://api.github.com/users/jKolb1/orgs","repos_url":"https://api.github.com/users/jKolb1/repos","events_url":"https://api.github.com/users/jKolb1/events{/privacy}","received_events_url":"https://api.github.com/users/jKolb1/received_events","type":"User","site_admin":false},"repo":{"id":36398369,"name":"sparkRocks","full_name":"jKolb1/sparkRocks","owner":{"login":"jKolb1","id":9288575,"avatar_url":"https://avatars.githubusercontent.com/u/9288575?v=3","gravatar_id":"","url":"https://api.github.com/users/jKolb1","html_url":"https://github.com/jKolb1","followers_url":"https://api.github.com/users/jKolb1/followers","following_url":"https://api.github.com/users/jKolb1/following{/other_user}","gists_url":"https://api.github.com/users/jKolb1/gists{/gist_id}","starred_url":"https://api.github.com/users/jKolb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jKolb1/subscriptions","organizations_url":"https://api.github.com/users/jKolb1/orgs","repos_url":"https://api.github.com/users/jKolb1/repos","events_url":"https://api.github.com/users/jKolb1/events{/privacy}","received_events_url":"https://api.github.com/users/jKolb1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jKolb1/sparkRocks","description":"","fork":true,"url":"https://api.github.com/repos/jKolb1/sparkRocks","forks_url":"https://api.github.com/repos/jKolb1/sparkRocks/forks","keys_url":"https://api.github.com/repos/jKolb1/sparkRocks/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jKolb1/sparkRocks/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jKolb1/sparkRocks/teams","hooks_url":"https://api.github.com/repos/jKolb1/sparkRocks/hooks","issue_events_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/events{/number}","events_url":"https://api.github.com/repos/jKolb1/sparkRocks/events","assignees_url":"https://api.github.com/repos/jKolb1/sparkRocks/assignees{/user}","branches_url":"https://api.github.com/repos/jKolb1/sparkRocks/branches{/branch}","tags_url":"https://api.github.com/repos/jKolb1/sparkRocks/tags","blobs_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/refs{/sha}","trees_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jKolb1/sparkRocks/statuses/{sha}","languages_url":"https://api.github.com/repos/jKolb1/sparkRocks/languages","stargazers_url":"https://api.github.com/repos/jKolb1/sparkRocks/stargazers","contributors_url":"https://api.github.com/repos/jKolb1/sparkRocks/contributors","subscribers_url":"https://api.github.com/repos/jKolb1/sparkRocks/subscribers","subscription_url":"https://api.github.com/repos/jKolb1/sparkRocks/subscription","commits_url":"https://api.github.com/repos/jKolb1/sparkRocks/commits{/sha}","git_commits_url":"https://api.github.com/repos/jKolb1/sparkRocks/git/commits{/sha}","comments_url":"https://api.github.com/repos/jKolb1/sparkRocks/comments{/number}","issue_comment_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues/comments{/number}","contents_url":"https://api.github.com/repos/jKolb1/sparkRocks/contents/{+path}","compare_url":"https://api.github.com/repos/jKolb1/sparkRocks/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jKolb1/sparkRocks/merges","archive_url":"https://api.github.com/repos/jKolb1/sparkRocks/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jKolb1/sparkRocks/downloads","issues_url":"https://api.github.com/repos/jKolb1/sparkRocks/issues{/number}","pulls_url":"https://api.github.com/repos/jKolb1/sparkRocks/pulls{/number}","milestones_url":"https://api.github.com/repos/jKolb1/sparkRocks/milestones{/number}","notifications_url":"https://api.github.com/repos/jKolb1/sparkRocks/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jKolb1/sparkRocks/labels{/name}","releases_url":"https://api.github.com/repos/jKolb1/sparkRocks/releases{/id}","created_at":"2015-05-27T21:58:52Z","updated_at":"2015-05-27T22:12:59Z","pushed_at":"2015-08-15T04:18:56Z","git_url":"git://github.com/jKolb1/sparkRocks.git","ssh_url":"git@github.com:jKolb1/sparkRocks.git","clone_url":"https://github.com/jKolb1/sparkRocks.git","svn_url":"https://github.com/jKolb1/sparkRocks","homepage":null,"size":476,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":6,"forks":0,"open_issues":6,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16"},"html":{"href":"https://github.com/jKolb1/sparkRocks/pull/16"},"issue":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/issues/16"},"comments":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/issues/16/comments"},"review_comments":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16/comments"},"review_comment":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/pulls/16/commits"},"statuses":{"href":"https://api.github.com/repos/jKolb1/sparkRocks/statuses/737b365cc67ef60e56b8135fd2cbdfe3dd616578"}}}}