{"action":"created","comment":{"url":"https://api.github.com/repos/square/okio/pulls/comments/183892121","pull_request_review_id":114979639,"id":183892121,"diff_hunk":"@@ -0,0 +1,521 @@\n+/*\n+ * Copyright 2014 Square Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package okio\n+\n+import okio.Util.arrayRangeEquals\n+import okio.Util.checkOffsetAndCount\n+import java.io.EOFException\n+import java.io.IOException\n+import java.io.InputStream\n+import java.io.ObjectInputStream\n+import java.io.ObjectOutputStream\n+import java.io.OutputStream\n+import java.io.Serializable\n+import java.nio.ByteBuffer\n+import java.nio.charset.Charset\n+import java.security.InvalidKeyException\n+import java.security.MessageDigest\n+import java.security.NoSuchAlgorithmException\n+import java.util.Arrays\n+import javax.crypto.Mac\n+import javax.crypto.spec.SecretKeySpec\n+\n+/**\n+ * An immutable sequence of bytes.\n+ *\n+ * Byte strings compare lexicographically as a sequence of **unsigned** bytes. That is, the byte\n+ * string `ff` sorts after `00`. This is counter to the sort order of the corresponding bytes,\n+ * where `-1` sorts before `0`.\n+ *\n+ * **Full disclosure:** this class provides untrusted input and output streams with raw access to\n+ * the underlying byte array. A hostile stream implementation could keep a reference to the mutable\n+ * byte string, violating the immutable guarantee of this class. For this reason a byte string's\n+ * immutability guarantee cannot be relied upon for security in applets and other environments that\n+ * run both trusted and untrusted code in the same process.\n+ */\n+open class ByteString\n+// Trusted internal constructor doesn't clone data.\n+internal constructor(\n+  internal val data: ByteArray\n+) : Serializable, Comparable<ByteString> {\n+  @Transient internal var hashCode: Int = 0 // Lazily computed; 0 if unknown.\n+  @Transient internal var utf8: String? = null // Lazily computed.\n+\n+  /** Constructs a new `String` by decoding the bytes as `UTF-8`.  */\n+  open fun utf8(): String {\n+    var result = utf8\n+    if (result == null) {\n+      // We don't care if we double-allocate in racy code.\n+      result = String(data, Charsets.UTF_8)\n+      utf8 = result\n+    }\n+    return result\n+  }\n+\n+  /** Constructs a new `String` by decoding the bytes using `charset`.  */\n+  open fun string(charset: Charset) = String(data, charset)\n+\n+  /**\n+   * Returns this byte string encoded as [Base64](http://www.ietf.org/rfc/rfc2045.txt). In violation\n+   * of the RFC, the returned string does not wrap lines at 76 columns.\n+   */\n+  open fun base64() = Base64.encode(data)\n+\n+  /** Returns the 128-bit MD5 hash of this byte string.  */\n+  open fun md5() = digest(\"MD5\")\n+\n+  /** Returns the 160-bit SHA-1 hash of this byte string.  */\n+  open fun sha1() = digest(\"SHA-1\")\n+\n+  /** Returns the 256-bit SHA-256 hash of this byte string.  */\n+  open fun sha256() = digest(\"SHA-256\")\n+\n+  /** Returns the 512-bit SHA-512 hash of this byte string.  */\n+  open fun sha512() = digest(\"SHA-512\")\n+\n+  private fun digest(algorithm: String): ByteString {\n+    try {\n+      return ByteString.of(*MessageDigest.getInstance(algorithm).digest(data))\n+    } catch (e: NoSuchAlgorithmException) {\n+      throw AssertionError(e)\n+    }\n+  }\n+\n+  /** Returns the 160-bit SHA-1 HMAC of this byte string.  */\n+  open fun hmacSha1(key: ByteString) = hmac(\"HmacSHA1\", key)\n+\n+  /** Returns the 256-bit SHA-256 HMAC of this byte string.  */\n+  open fun hmacSha256(key: ByteString) = hmac(\"HmacSHA256\", key)\n+\n+  /** Returns the 512-bit SHA-512 HMAC of this byte string.  */\n+  open fun hmacSha512(key: ByteString) = hmac(\"HmacSHA512\", key)\n+\n+  private fun hmac(algorithm: String, key: ByteString): ByteString {\n+    try {\n+      val mac = Mac.getInstance(algorithm)\n+      mac.init(SecretKeySpec(key.toByteArray(), algorithm))\n+      return ByteString.of(*mac.doFinal(data))\n+    } catch (e: NoSuchAlgorithmException) {\n+      throw AssertionError(e)\n+    } catch (e: InvalidKeyException) {\n+      throw IllegalArgumentException(e)\n+    }\n+  }\n+\n+  /** Returns this byte string encoded as [URL-safe Base64](http://www.ietf.org/rfc/rfc4648.txt). */\n+  open fun base64Url() = Base64.encodeUrl(data)\n+\n+  /** Returns this byte string encoded in hexadecimal.  */\n+  open fun hex(): String {\n+    val result = CharArray(data.size * 2)\n+    var c = 0\n+    for (b in data) {\n+      result[c++] = HEX_DIGITS[b.toInt() shr 4 and 0xf]\n+      result[c++] = HEX_DIGITS[b.toInt() and 0xf]\n+    }\n+    return String(result)\n+  }\n+\n+  /**\n+   * Returns a byte string equal to this byte string, but with the bytes 'A' through 'Z' replaced\n+   * with the corresponding byte in 'a' through 'z'. Returns this byte string if it contains no\n+   * bytes in 'A' through 'Z'.\n+   */\n+  open fun toAsciiLowercase(): ByteString {\n+    // Search for an uppercase character. If we don't find one, return this.\n+    var i = 0\n+    while (i < data.size) {\n+      var c = data[i]\n+      if (c < 'A'.toByte() || c > 'Z'.toByte()) {\n+        i++\n+        continue\n+      }\n+\n+      // If we reach this point, this string is not not lowercase. Create and\n+      // return a new byte string.\n+      val lowercase = data.clone()\n+      lowercase[i++] = (c - ('A' - 'a')).toByte()\n+      while (i < lowercase.size) {\n+        c = lowercase[i]\n+        if (c < 'A'.toByte() || c > 'Z'.toByte()) {\n+          i++\n+          continue\n+        }\n+        lowercase[i] = (c - ('A' - 'a')).toByte()\n+        i++\n+      }\n+      return ByteString(lowercase)\n+    }\n+    return this\n+  }\n+\n+  /**\n+   * Returns a byte string equal to this byte string, but with the bytes 'a' through 'z' replaced\n+   * with the corresponding byte in 'A' through 'Z'. Returns this byte string if it contains no\n+   * bytes in 'a' through 'z'.\n+   */\n+  open fun toAsciiUppercase(): ByteString {\n+    // Search for an lowercase character. If we don't find one, return this.\n+    var i = 0\n+    while (i < data.size) {\n+      var c = data[i]\n+      if (c < 'a'.toByte() || c > 'z'.toByte()) {\n+        i++\n+        continue\n+      }\n+\n+      // If we reach this point, this string is not not uppercase. Create and\n+      // return a new byte string.\n+      val lowercase = data.clone()\n+      lowercase[i++] = (c - ('a' - 'A')).toByte()\n+      while (i < lowercase.size) {\n+        c = lowercase[i]\n+        if (c < 'a'.toByte() || c > 'z'.toByte()) {\n+          i++\n+          continue\n+        }\n+        lowercase[i] = (c - ('a' - 'A')).toByte()\n+        i++\n+      }\n+      return ByteString(lowercase)\n+    }\n+    return this\n+  }\n+\n+  /**\n+   * Returns a byte string that is a substring of this byte string, beginning at the specified\n+   * index until the end of this string. Returns this byte string if `beginIndex` is 0.\n+   */\n+  open fun substring(beginIndex: Int): ByteString = substring(beginIndex, data.size)\n+\n+  /**\n+   * Returns a byte string that is a substring of this byte string, beginning at the specified\n+   * `beginIndex` and ends at the specified `endIndex`. Returns this byte string if\n+   * `beginIndex` is 0 and `endIndex` is the length of this byte string.\n+   */\n+  open fun substring(beginIndex: Int, endIndex: Int): ByteString {\n+    if (beginIndex < 0) throw IllegalArgumentException(\"beginIndex < 0\")\n+    if (endIndex > data.size) {\n+      throw IllegalArgumentException(\"endIndex > length(\" + data.size + \")\")\n+    }\n+\n+    val subLen = endIndex - beginIndex\n+    if (subLen < 0) throw IllegalArgumentException(\"endIndex < beginIndex\")\n+\n+    if (beginIndex == 0 && endIndex == data.size) {\n+      return this\n+    }\n+\n+    val copy = ByteArray(subLen)\n+    System.arraycopy(data, beginIndex, copy, 0, subLen)\n+    return ByteString(copy)\n+  }\n+\n+  /** Returns the byte at `pos`.  */\n+  open fun getByte(pos: Int) = data[pos]\n+\n+  /** Returns the number of bytes in this ByteString. */\n+  open fun size() = data.size\n+\n+  /** Returns a byte array containing a copy of the bytes in this `ByteString`. */\n+  open fun toByteArray() = data.clone()\n+\n+  /** Returns the bytes of this string without a defensive copy. Do not mutate!  */\n+  internal open fun internalArray() = data\n+\n+  /** Returns a `ByteBuffer` view of the bytes in this `ByteString`. */\n+  open fun asByteBuffer(): ByteBuffer = ByteBuffer.wrap(data).asReadOnlyBuffer()\n+\n+  /** Writes the contents of this byte string to `out`.  */\n+  @Throws(IOException::class)\n+  open fun write(out: OutputStream) {\n+    out.write(data)\n+  }\n+\n+  /** Writes the contents of this byte string to `buffer`.  */\n+  internal open fun write(buffer: Buffer) {\n+    buffer.write(data, 0, data.size)\n+  }\n+\n+  /**\n+   * Returns true if the bytes of this in `[offset..offset+byteCount)` equal the bytes of `other` in\n+   * `[otherOffset..otherOffset+byteCount)`. Returns false if either range is out of bounds.\n+   */\n+  open fun rangeEquals(\n+    offset: Int,\n+    other: ByteString,\n+    otherOffset: Int,\n+    byteCount: Int\n+  ): Boolean = other.rangeEquals(otherOffset, this.data, offset, byteCount)\n+\n+  /**\n+   * Returns true if the bytes of this in `[offset..offset+byteCount)` equal the bytes of `other` in\n+   * `[otherOffset..otherOffset+byteCount)`. Returns false if either range is out of bounds.\n+   */\n+  open fun rangeEquals(offset: Int, other: ByteArray, otherOffset: Int, byteCount: Int): Boolean {\n+    return (offset >= 0 && offset <= data.size - byteCount\n+        && otherOffset >= 0 && otherOffset <= other.size - byteCount\n+        && arrayRangeEquals(data, offset, other, otherOffset, byteCount))\n+  }\n+\n+  fun startsWith(prefix: ByteString) = rangeEquals(0, prefix, 0, prefix.size())\n+\n+  fun startsWith(prefix: ByteArray) = rangeEquals(0, prefix, 0, prefix.size)\n+\n+  fun endsWith(suffix: ByteString) = rangeEquals(size() - suffix.size(), suffix, 0,\n+      suffix.size())\n+\n+  fun endsWith(suffix: ByteArray) = rangeEquals(size() - suffix.size, suffix, 0,\n+      suffix.size)\n+\n+  fun indexOf(other: ByteString) = indexOf(other.internalArray(), 0)\n+\n+  fun indexOf(other: ByteString, fromIndex: Int) = indexOf(other.internalArray(), fromIndex)\n+\n+  fun indexOf(other: ByteArray) = indexOf(other, 0)\n+\n+  open fun indexOf(other: ByteArray, fromIndex: Int): Int {","path":"okio/src/main/java/okio/ByteString.kt","position":null,"original_position":290,"commit_id":"fe4dfc8678dc706fa43739b4b43fe5cbfc1200cc","original_commit_id":"00a240da29bc0cda0c778412673a27be9c69677d","user":{"login":"swankjesse","id":133019,"avatar_url":"https://avatars3.githubusercontent.com/u/133019?v=4","gravatar_id":"","url":"https://api.github.com/users/swankjesse","html_url":"https://github.com/swankjesse","followers_url":"https://api.github.com/users/swankjesse/followers","following_url":"https://api.github.com/users/swankjesse/following{/other_user}","gists_url":"https://api.github.com/users/swankjesse/gists{/gist_id}","starred_url":"https://api.github.com/users/swankjesse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swankjesse/subscriptions","organizations_url":"https://api.github.com/users/swankjesse/orgs","repos_url":"https://api.github.com/users/swankjesse/repos","events_url":"https://api.github.com/users/swankjesse/events{/privacy}","received_events_url":"https://api.github.com/users/swankjesse/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2018-04-24T21:54:14Z","updated_at":"2018-04-24T22:00:49Z","html_url":"https://github.com/square/okio/pull/396#discussion_r183892121","pull_request_url":"https://api.github.com/repos/square/okio/pulls/396","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/square/okio/pulls/comments/183892121"},"html":{"href":"https://github.com/square/okio/pull/396#discussion_r183892121"},"pull_request":{"href":"https://api.github.com/repos/square/okio/pulls/396"}},"in_reply_to_id":183882400},"pull_request":{"url":"https://api.github.com/repos/square/okio/pulls/396","id":183865406,"html_url":"https://github.com/square/okio/pull/396","diff_url":"https://github.com/square/okio/pull/396.diff","patch_url":"https://github.com/square/okio/pull/396.patch","issue_url":"https://api.github.com/repos/square/okio/issues/396","number":396,"state":"open","locked":false,"title":"Migrate ByteString to Kotlin","user":{"login":"swankjesse","id":133019,"avatar_url":"https://avatars3.githubusercontent.com/u/133019?v=4","gravatar_id":"","url":"https://api.github.com/users/swankjesse","html_url":"https://github.com/swankjesse","followers_url":"https://api.github.com/users/swankjesse/followers","following_url":"https://api.github.com/users/swankjesse/following{/other_user}","gists_url":"https://api.github.com/users/swankjesse/gists{/gist_id}","starred_url":"https://api.github.com/users/swankjesse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swankjesse/subscriptions","organizations_url":"https://api.github.com/users/swankjesse/orgs","repos_url":"https://api.github.com/users/swankjesse/repos","events_url":"https://api.github.com/users/swankjesse/events{/privacy}","received_events_url":"https://api.github.com/users/swankjesse/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-24T21:10:49Z","updated_at":"2018-04-24T22:00:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"da642b4dd7e65c1c8b925a481232e0be6f216809","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/square/okio/pulls/396/commits","review_comments_url":"https://api.github.com/repos/square/okio/pulls/396/comments","review_comment_url":"https://api.github.com/repos/square/okio/pulls/comments{/number}","comments_url":"https://api.github.com/repos/square/okio/issues/396/comments","statuses_url":"https://api.github.com/repos/square/okio/statuses/fe4dfc8678dc706fa43739b4b43fe5cbfc1200cc","head":{"label":"square:jwilson.0424.bytestring_k","ref":"jwilson.0424.bytestring_k","sha":"fe4dfc8678dc706fa43739b4b43fe5cbfc1200cc","user":{"login":"square","id":82592,"avatar_url":"https://avatars0.githubusercontent.com/u/82592?v=4","gravatar_id":"","url":"https://api.github.com/users/square","html_url":"https://github.com/square","followers_url":"https://api.github.com/users/square/followers","following_url":"https://api.github.com/users/square/following{/other_user}","gists_url":"https://api.github.com/users/square/gists{/gist_id}","starred_url":"https://api.github.com/users/square/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/square/subscriptions","organizations_url":"https://api.github.com/users/square/orgs","repos_url":"https://api.github.com/users/square/repos","events_url":"https://api.github.com/users/square/events{/privacy}","received_events_url":"https://api.github.com/users/square/received_events","type":"Organization","site_admin":false},"repo":{"id":17812502,"name":"okio","full_name":"square/okio","owner":{"login":"square","id":82592,"avatar_url":"https://avatars0.githubusercontent.com/u/82592?v=4","gravatar_id":"","url":"https://api.github.com/users/square","html_url":"https://github.com/square","followers_url":"https://api.github.com/users/square/followers","following_url":"https://api.github.com/users/square/following{/other_user}","gists_url":"https://api.github.com/users/square/gists{/gist_id}","starred_url":"https://api.github.com/users/square/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/square/subscriptions","organizations_url":"https://api.github.com/users/square/orgs","repos_url":"https://api.github.com/users/square/repos","events_url":"https://api.github.com/users/square/events{/privacy}","received_events_url":"https://api.github.com/users/square/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/square/okio","description":"A modern I/O API for Java","fork":false,"url":"https://api.github.com/repos/square/okio","forks_url":"https://api.github.com/repos/square/okio/forks","keys_url":"https://api.github.com/repos/square/okio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/square/okio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/square/okio/teams","hooks_url":"https://api.github.com/repos/square/okio/hooks","issue_events_url":"https://api.github.com/repos/square/okio/issues/events{/number}","events_url":"https://api.github.com/repos/square/okio/events","assignees_url":"https://api.github.com/repos/square/okio/assignees{/user}","branches_url":"https://api.github.com/repos/square/okio/branches{/branch}","tags_url":"https://api.github.com/repos/square/okio/tags","blobs_url":"https://api.github.com/repos/square/okio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/square/okio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/square/okio/git/refs{/sha}","trees_url":"https://api.github.com/repos/square/okio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/square/okio/statuses/{sha}","languages_url":"https://api.github.com/repos/square/okio/languages","stargazers_url":"https://api.github.com/repos/square/okio/stargazers","contributors_url":"https://api.github.com/repos/square/okio/contributors","subscribers_url":"https://api.github.com/repos/square/okio/subscribers","subscription_url":"https://api.github.com/repos/square/okio/subscription","commits_url":"https://api.github.com/repos/square/okio/commits{/sha}","git_commits_url":"https://api.github.com/repos/square/okio/git/commits{/sha}","comments_url":"https://api.github.com/repos/square/okio/comments{/number}","issue_comment_url":"https://api.github.com/repos/square/okio/issues/comments{/number}","contents_url":"https://api.github.com/repos/square/okio/contents/{+path}","compare_url":"https://api.github.com/repos/square/okio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/square/okio/merges","archive_url":"https://api.github.com/repos/square/okio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/square/okio/downloads","issues_url":"https://api.github.com/repos/square/okio/issues{/number}","pulls_url":"https://api.github.com/repos/square/okio/pulls{/number}","milestones_url":"https://api.github.com/repos/square/okio/milestones{/number}","notifications_url":"https://api.github.com/repos/square/okio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/square/okio/labels{/name}","releases_url":"https://api.github.com/repos/square/okio/releases{/id}","deployments_url":"https://api.github.com/repos/square/okio/deployments","created_at":"2014-03-17T00:02:59Z","updated_at":"2018-04-24T19:22:10Z","pushed_at":"2018-04-24T21:59:51Z","git_url":"git://github.com/square/okio.git","ssh_url":"git@github.com:square/okio.git","clone_url":"https://github.com/square/okio.git","svn_url":"https://github.com/square/okio","homepage":"http://square.github.io/okio/1.x/okio","size":2051,"stargazers_count":4913,"watchers_count":4913,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":788,"mirror_url":null,"archived":false,"open_issues_count":30,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":788,"open_issues":30,"watchers":4913,"default_branch":"master"}},"base":{"label":"square:master","ref":"master","sha":"2a5e5dd7b4d488962c80647a618458a18b00e373","user":{"login":"square","id":82592,"avatar_url":"https://avatars0.githubusercontent.com/u/82592?v=4","gravatar_id":"","url":"https://api.github.com/users/square","html_url":"https://github.com/square","followers_url":"https://api.github.com/users/square/followers","following_url":"https://api.github.com/users/square/following{/other_user}","gists_url":"https://api.github.com/users/square/gists{/gist_id}","starred_url":"https://api.github.com/users/square/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/square/subscriptions","organizations_url":"https://api.github.com/users/square/orgs","repos_url":"https://api.github.com/users/square/repos","events_url":"https://api.github.com/users/square/events{/privacy}","received_events_url":"https://api.github.com/users/square/received_events","type":"Organization","site_admin":false},"repo":{"id":17812502,"name":"okio","full_name":"square/okio","owner":{"login":"square","id":82592,"avatar_url":"https://avatars0.githubusercontent.com/u/82592?v=4","gravatar_id":"","url":"https://api.github.com/users/square","html_url":"https://github.com/square","followers_url":"https://api.github.com/users/square/followers","following_url":"https://api.github.com/users/square/following{/other_user}","gists_url":"https://api.github.com/users/square/gists{/gist_id}","starred_url":"https://api.github.com/users/square/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/square/subscriptions","organizations_url":"https://api.github.com/users/square/orgs","repos_url":"https://api.github.com/users/square/repos","events_url":"https://api.github.com/users/square/events{/privacy}","received_events_url":"https://api.github.com/users/square/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/square/okio","description":"A modern I/O API for Java","fork":false,"url":"https://api.github.com/repos/square/okio","forks_url":"https://api.github.com/repos/square/okio/forks","keys_url":"https://api.github.com/repos/square/okio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/square/okio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/square/okio/teams","hooks_url":"https://api.github.com/repos/square/okio/hooks","issue_events_url":"https://api.github.com/repos/square/okio/issues/events{/number}","events_url":"https://api.github.com/repos/square/okio/events","assignees_url":"https://api.github.com/repos/square/okio/assignees{/user}","branches_url":"https://api.github.com/repos/square/okio/branches{/branch}","tags_url":"https://api.github.com/repos/square/okio/tags","blobs_url":"https://api.github.com/repos/square/okio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/square/okio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/square/okio/git/refs{/sha}","trees_url":"https://api.github.com/repos/square/okio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/square/okio/statuses/{sha}","languages_url":"https://api.github.com/repos/square/okio/languages","stargazers_url":"https://api.github.com/repos/square/okio/stargazers","contributors_url":"https://api.github.com/repos/square/okio/contributors","subscribers_url":"https://api.github.com/repos/square/okio/subscribers","subscription_url":"https://api.github.com/repos/square/okio/subscription","commits_url":"https://api.github.com/repos/square/okio/commits{/sha}","git_commits_url":"https://api.github.com/repos/square/okio/git/commits{/sha}","comments_url":"https://api.github.com/repos/square/okio/comments{/number}","issue_comment_url":"https://api.github.com/repos/square/okio/issues/comments{/number}","contents_url":"https://api.github.com/repos/square/okio/contents/{+path}","compare_url":"https://api.github.com/repos/square/okio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/square/okio/merges","archive_url":"https://api.github.com/repos/square/okio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/square/okio/downloads","issues_url":"https://api.github.com/repos/square/okio/issues{/number}","pulls_url":"https://api.github.com/repos/square/okio/pulls{/number}","milestones_url":"https://api.github.com/repos/square/okio/milestones{/number}","notifications_url":"https://api.github.com/repos/square/okio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/square/okio/labels{/name}","releases_url":"https://api.github.com/repos/square/okio/releases{/id}","deployments_url":"https://api.github.com/repos/square/okio/deployments","created_at":"2014-03-17T00:02:59Z","updated_at":"2018-04-24T19:22:10Z","pushed_at":"2018-04-24T21:59:51Z","git_url":"git://github.com/square/okio.git","ssh_url":"git@github.com:square/okio.git","clone_url":"https://github.com/square/okio.git","svn_url":"https://github.com/square/okio","homepage":"http://square.github.io/okio/1.x/okio","size":2051,"stargazers_count":4913,"watchers_count":4913,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":788,"mirror_url":null,"archived":false,"open_issues_count":30,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":788,"open_issues":30,"watchers":4913,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/square/okio/pulls/396"},"html":{"href":"https://github.com/square/okio/pull/396"},"issue":{"href":"https://api.github.com/repos/square/okio/issues/396"},"comments":{"href":"https://api.github.com/repos/square/okio/issues/396/comments"},"review_comments":{"href":"https://api.github.com/repos/square/okio/pulls/396/comments"},"review_comment":{"href":"https://api.github.com/repos/square/okio/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/square/okio/pulls/396/commits"},"statuses":{"href":"https://api.github.com/repos/square/okio/statuses/fe4dfc8678dc706fa43739b4b43fe5cbfc1200cc"}},"author_association":"OWNER"}}
{"actor":{"display_login":"swankjesse"}}