{"action":"created","comment":{"url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/comments/90131216","pull_request_review_id":10655589,"id":90131216,"diff_hunk":"@@ -25,33 +28,10 @@ private[netty4] trait Netty4H2Writer extends H2Transport.Writer {\n     write(frame)\n   }\n \n-  override def writeAll(id: Int, msg: Message): Future[Future[Unit]] =\n-    msg.data match {\n-      case Stream.Nil =>\n-        write(id, msg.headers, true).map(_ => Future.Unit)\n-      case data: Stream.Reader =>\n-        write(id, msg.headers, false).map(_ => streamFrom(id, data))\n-    }\n-\n-  private[this] def streamFrom(id: Int, data: Stream.Reader): Future[Unit] =\n-    if (data.isEmpty) Future.Unit\n-    else {\n-      val writeData: Frame => Future[Boolean] = {\n-        case f: Frame.Data => write(id, f).before(f.release()).map(_ => f.isEnd)\n-        case f: Frame.Trailers => write(id, f).before(Future.True)\n-      }\n-      lazy val loop: Boolean => Future[Unit] = {\n-        case true => Future.Unit\n-        case false => data.read().flatMap(writeData).flatMap(loop)\n-      }\n-      data.read().flatMap(writeData).flatMap(loop)\n-    }\n-\n-  override def write(id: Int, data: Frame.Data): Future[Unit] =\n-    write(id, data.buf, data.isEnd)\n-\n-  override def write(id: Int, tlrs: Frame.Trailers): Future[Unit] =\n-    write(id, tlrs, true /*eos*/ )\n+  override def write(id: Int, f: Frame): Future[Unit] = f match {\n+    case data: Frame.Data => write(id, data.buf, data.isEnd)\n+    case tlrs: Frame.Trailers => write(id, tlrs, true /*eos*/ )","path":"router/h2/src/main/scala/com/twitter/finagle/buoyant/h2/netty4/Netty4H2Writer.scala","position":56,"original_position":56,"commit_id":"7c6b9a2ae281e18d1f63d7352cc5bdc9f865a856","original_commit_id":"7c6b9a2ae281e18d1f63d7352cc5bdc9f865a856","user":{"login":"olix0r","id":240738,"avatar_url":"https://avatars.githubusercontent.com/u/240738?v=3","gravatar_id":"","url":"https://api.github.com/users/olix0r","html_url":"https://github.com/olix0r","followers_url":"https://api.github.com/users/olix0r/followers","following_url":"https://api.github.com/users/olix0r/following{/other_user}","gists_url":"https://api.github.com/users/olix0r/gists{/gist_id}","starred_url":"https://api.github.com/users/olix0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olix0r/subscriptions","organizations_url":"https://api.github.com/users/olix0r/orgs","repos_url":"https://api.github.com/users/olix0r/repos","events_url":"https://api.github.com/users/olix0r/events{/privacy}","received_events_url":"https://api.github.com/users/olix0r/received_events","type":"User","site_admin":false},"body":"thanks. most of my scala knowledge comes from things i tried once in 2011 ;p","created_at":"2016-11-29T22:37:29Z","updated_at":"2016-11-29T22:37:29Z","html_url":"https://github.com/BuoyantIO/linkerd/pull/826#discussion_r90131216","pull_request_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826","_links":{"self":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/comments/90131216"},"html":{"href":"https://github.com/BuoyantIO/linkerd/pull/826#discussion_r90131216"},"pull_request":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826"}}},"pull_request":{"url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826","id":95419849,"html_url":"https://github.com/BuoyantIO/linkerd/pull/826","diff_url":"https://github.com/BuoyantIO/linkerd/pull/826.diff","patch_url":"https://github.com/BuoyantIO/linkerd/pull/826.patch","issue_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/826","number":826,"state":"open","locked":false,"title":"[h2] Support stream cancelation","user":{"login":"olix0r","id":240738,"avatar_url":"https://avatars.githubusercontent.com/u/240738?v=3","gravatar_id":"","url":"https://api.github.com/users/olix0r","html_url":"https://github.com/olix0r","followers_url":"https://api.github.com/users/olix0r/followers","following_url":"https://api.github.com/users/olix0r/following{/other_user}","gists_url":"https://api.github.com/users/olix0r/gists{/gist_id}","starred_url":"https://api.github.com/users/olix0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olix0r/subscriptions","organizations_url":"https://api.github.com/users/olix0r/orgs","repos_url":"https://api.github.com/users/olix0r/repos","events_url":"https://api.github.com/users/olix0r/events{/privacy}","received_events_url":"https://api.github.com/users/olix0r/received_events","type":"User","site_admin":false},"body":"### Background\r\n\r\nThe HTTP2 protocol defines RST_STREAM frames to support request-level cancelation and GO_AWAY frames to signal connection-level interruption. This distinction is especially germane to proxies like linkerd since we want to allow long-lived multiplexed connections between endpoints while also allowing request-level cancelation (to support timeouts/deadlines, etc).\r\n\r\n### Problem\r\n\r\nlinkerd's HTTP2 support isn't at all well-conditioned to request cancelation or connection loss (#728). For instance, if a linkerd instance loses its connection to a remote server, the client-side of an active stream may close, but the upstream-server-side of a stream will be left open indefinitely. Similar behavior is exhibited when a remote explicitly issues a RST_STREAM frame.\r\n\r\nFurthermore, clients that disconnect are not properly evicted from load balancers because the ClientDispatcher Service does not alter its `status` after connection loss. (#785)\r\n\r\n### Solution\r\n\r\nBecause resets may occur at any stage of a Stream's lifecycle, several changes are required. As much as possible, we try to rely on finagle primitives like Future-cancelation to achieve the desired behavior.\r\n\r\nThe `h2.Stream` API has been altered substantially: the `Stream.Reader` and `Stream.Nil` types have been unified as a `Stream`. Stream consumers that care about resets & closures must call `Stream.read()` until a failure is encountered. Stream producers (i.e. `Netty4StreamTransport`) must close or reset the stream appropriately.\r\n\r\n`Netty4StreamTransport` has been substantially refactored to more explicitly model the HTTP2 state machine.  It ensures that canceled and failed writes are propagated as resets, and that resets cancel writes and prevent receipt of remote frames.\r\n\r\n`Netty4ClientDispatcher` and `Netty4ServerDispatcher` have been substantially simplified, moving a good portion of common stream-multiplexing logic to `Netty4DispatcherBase`. Dispatchers now ensure that a GO_AWAY frame or connection loss actively triggers stream cancelation.\r\n\r\nVarious dedicated `Reset`, `GoAway`, and `StreamError` types have been introduced to model failures appropriately.\r\n\r\nFixes #728 #785","created_at":"2016-11-27T22:39:41Z","updated_at":"2016-11-29T22:37:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"704e17b52ddcf74927bd0f1bd6dffd8fb9a3a47d","assignee":{"login":"olix0r","id":240738,"avatar_url":"https://avatars.githubusercontent.com/u/240738?v=3","gravatar_id":"","url":"https://api.github.com/users/olix0r","html_url":"https://github.com/olix0r","followers_url":"https://api.github.com/users/olix0r/followers","following_url":"https://api.github.com/users/olix0r/following{/other_user}","gists_url":"https://api.github.com/users/olix0r/gists{/gist_id}","starred_url":"https://api.github.com/users/olix0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olix0r/subscriptions","organizations_url":"https://api.github.com/users/olix0r/orgs","repos_url":"https://api.github.com/users/olix0r/repos","events_url":"https://api.github.com/users/olix0r/events{/privacy}","received_events_url":"https://api.github.com/users/olix0r/received_events","type":"User","site_admin":false},"assignees":[{"login":"olix0r","id":240738,"avatar_url":"https://avatars.githubusercontent.com/u/240738?v=3","gravatar_id":"","url":"https://api.github.com/users/olix0r","html_url":"https://github.com/olix0r","followers_url":"https://api.github.com/users/olix0r/followers","following_url":"https://api.github.com/users/olix0r/following{/other_user}","gists_url":"https://api.github.com/users/olix0r/gists{/gist_id}","starred_url":"https://api.github.com/users/olix0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olix0r/subscriptions","organizations_url":"https://api.github.com/users/olix0r/orgs","repos_url":"https://api.github.com/users/olix0r/repos","events_url":"https://api.github.com/users/olix0r/events{/privacy}","received_events_url":"https://api.github.com/users/olix0r/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/BuoyantIO/linkerd/milestones/17","html_url":"https://github.com/BuoyantIO/linkerd/milestones/0.8.4","labels_url":"https://api.github.com/repos/BuoyantIO/linkerd/milestones/17/labels","id":2162385,"number":17,"title":"0.8.4","description":"","creator":{"login":"olix0r","id":240738,"avatar_url":"https://avatars.githubusercontent.com/u/240738?v=3","gravatar_id":"","url":"https://api.github.com/users/olix0r","html_url":"https://github.com/olix0r","followers_url":"https://api.github.com/users/olix0r/followers","following_url":"https://api.github.com/users/olix0r/following{/other_user}","gists_url":"https://api.github.com/users/olix0r/gists{/gist_id}","starred_url":"https://api.github.com/users/olix0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olix0r/subscriptions","organizations_url":"https://api.github.com/users/olix0r/orgs","repos_url":"https://api.github.com/users/olix0r/repos","events_url":"https://api.github.com/users/olix0r/events{/privacy}","received_events_url":"https://api.github.com/users/olix0r/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":4,"state":"open","created_at":"2016-11-28T22:54:38Z","updated_at":"2016-11-29T20:56:28Z","due_on":"2016-12-02T00:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826/commits","review_comments_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826/comments","review_comment_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/comments{/number}","comments_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/826/comments","statuses_url":"https://api.github.com/repos/BuoyantIO/linkerd/statuses/7c6b9a2ae281e18d1f63d7352cc5bdc9f865a856","head":{"label":"BuoyantIO:ver/h2-lifecycle","ref":"ver/h2-lifecycle","sha":"7c6b9a2ae281e18d1f63d7352cc5bdc9f865a856","user":{"login":"BuoyantIO","id":10824329,"avatar_url":"https://avatars.githubusercontent.com/u/10824329?v=3","gravatar_id":"","url":"https://api.github.com/users/BuoyantIO","html_url":"https://github.com/BuoyantIO","followers_url":"https://api.github.com/users/BuoyantIO/followers","following_url":"https://api.github.com/users/BuoyantIO/following{/other_user}","gists_url":"https://api.github.com/users/BuoyantIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BuoyantIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BuoyantIO/subscriptions","organizations_url":"https://api.github.com/users/BuoyantIO/orgs","repos_url":"https://api.github.com/users/BuoyantIO/repos","events_url":"https://api.github.com/users/BuoyantIO/events{/privacy}","received_events_url":"https://api.github.com/users/BuoyantIO/received_events","type":"Organization","site_admin":false},"repo":{"id":49605596,"name":"linkerd","full_name":"BuoyantIO/linkerd","owner":{"login":"BuoyantIO","id":10824329,"avatar_url":"https://avatars.githubusercontent.com/u/10824329?v=3","gravatar_id":"","url":"https://api.github.com/users/BuoyantIO","html_url":"https://github.com/BuoyantIO","followers_url":"https://api.github.com/users/BuoyantIO/followers","following_url":"https://api.github.com/users/BuoyantIO/following{/other_user}","gists_url":"https://api.github.com/users/BuoyantIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BuoyantIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BuoyantIO/subscriptions","organizations_url":"https://api.github.com/users/BuoyantIO/orgs","repos_url":"https://api.github.com/users/BuoyantIO/repos","events_url":"https://api.github.com/users/BuoyantIO/events{/privacy}","received_events_url":"https://api.github.com/users/BuoyantIO/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/BuoyantIO/linkerd","description":"Resilient service mesh for cloud native apps","fork":false,"url":"https://api.github.com/repos/BuoyantIO/linkerd","forks_url":"https://api.github.com/repos/BuoyantIO/linkerd/forks","keys_url":"https://api.github.com/repos/BuoyantIO/linkerd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BuoyantIO/linkerd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BuoyantIO/linkerd/teams","hooks_url":"https://api.github.com/repos/BuoyantIO/linkerd/hooks","issue_events_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/events{/number}","events_url":"https://api.github.com/repos/BuoyantIO/linkerd/events","assignees_url":"https://api.github.com/repos/BuoyantIO/linkerd/assignees{/user}","branches_url":"https://api.github.com/repos/BuoyantIO/linkerd/branches{/branch}","tags_url":"https://api.github.com/repos/BuoyantIO/linkerd/tags","blobs_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/refs{/sha}","trees_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BuoyantIO/linkerd/statuses/{sha}","languages_url":"https://api.github.com/repos/BuoyantIO/linkerd/languages","stargazers_url":"https://api.github.com/repos/BuoyantIO/linkerd/stargazers","contributors_url":"https://api.github.com/repos/BuoyantIO/linkerd/contributors","subscribers_url":"https://api.github.com/repos/BuoyantIO/linkerd/subscribers","subscription_url":"https://api.github.com/repos/BuoyantIO/linkerd/subscription","commits_url":"https://api.github.com/repos/BuoyantIO/linkerd/commits{/sha}","git_commits_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/commits{/sha}","comments_url":"https://api.github.com/repos/BuoyantIO/linkerd/comments{/number}","issue_comment_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/comments{/number}","contents_url":"https://api.github.com/repos/BuoyantIO/linkerd/contents/{+path}","compare_url":"https://api.github.com/repos/BuoyantIO/linkerd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BuoyantIO/linkerd/merges","archive_url":"https://api.github.com/repos/BuoyantIO/linkerd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BuoyantIO/linkerd/downloads","issues_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues{/number}","pulls_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls{/number}","milestones_url":"https://api.github.com/repos/BuoyantIO/linkerd/milestones{/number}","notifications_url":"https://api.github.com/repos/BuoyantIO/linkerd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BuoyantIO/linkerd/labels{/name}","releases_url":"https://api.github.com/repos/BuoyantIO/linkerd/releases{/id}","deployments_url":"https://api.github.com/repos/BuoyantIO/linkerd/deployments","created_at":"2016-01-13T22:14:52Z","updated_at":"2016-11-29T19:22:46Z","pushed_at":"2016-11-29T20:56:32Z","git_url":"git://github.com/BuoyantIO/linkerd.git","ssh_url":"git@github.com:BuoyantIO/linkerd.git","clone_url":"https://github.com/BuoyantIO/linkerd.git","svn_url":"https://github.com/BuoyantIO/linkerd","homepage":"https://linkerd.io","size":3855,"stargazers_count":1275,"watchers_count":1275,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":98,"mirror_url":null,"open_issues_count":99,"forks":98,"open_issues":99,"watchers":1275,"default_branch":"master"}},"base":{"label":"BuoyantIO:master","ref":"master","sha":"17d592d81c13d4127c92a0c077a5775579dd9ea7","user":{"login":"BuoyantIO","id":10824329,"avatar_url":"https://avatars.githubusercontent.com/u/10824329?v=3","gravatar_id":"","url":"https://api.github.com/users/BuoyantIO","html_url":"https://github.com/BuoyantIO","followers_url":"https://api.github.com/users/BuoyantIO/followers","following_url":"https://api.github.com/users/BuoyantIO/following{/other_user}","gists_url":"https://api.github.com/users/BuoyantIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BuoyantIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BuoyantIO/subscriptions","organizations_url":"https://api.github.com/users/BuoyantIO/orgs","repos_url":"https://api.github.com/users/BuoyantIO/repos","events_url":"https://api.github.com/users/BuoyantIO/events{/privacy}","received_events_url":"https://api.github.com/users/BuoyantIO/received_events","type":"Organization","site_admin":false},"repo":{"id":49605596,"name":"linkerd","full_name":"BuoyantIO/linkerd","owner":{"login":"BuoyantIO","id":10824329,"avatar_url":"https://avatars.githubusercontent.com/u/10824329?v=3","gravatar_id":"","url":"https://api.github.com/users/BuoyantIO","html_url":"https://github.com/BuoyantIO","followers_url":"https://api.github.com/users/BuoyantIO/followers","following_url":"https://api.github.com/users/BuoyantIO/following{/other_user}","gists_url":"https://api.github.com/users/BuoyantIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BuoyantIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BuoyantIO/subscriptions","organizations_url":"https://api.github.com/users/BuoyantIO/orgs","repos_url":"https://api.github.com/users/BuoyantIO/repos","events_url":"https://api.github.com/users/BuoyantIO/events{/privacy}","received_events_url":"https://api.github.com/users/BuoyantIO/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/BuoyantIO/linkerd","description":"Resilient service mesh for cloud native apps","fork":false,"url":"https://api.github.com/repos/BuoyantIO/linkerd","forks_url":"https://api.github.com/repos/BuoyantIO/linkerd/forks","keys_url":"https://api.github.com/repos/BuoyantIO/linkerd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BuoyantIO/linkerd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BuoyantIO/linkerd/teams","hooks_url":"https://api.github.com/repos/BuoyantIO/linkerd/hooks","issue_events_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/events{/number}","events_url":"https://api.github.com/repos/BuoyantIO/linkerd/events","assignees_url":"https://api.github.com/repos/BuoyantIO/linkerd/assignees{/user}","branches_url":"https://api.github.com/repos/BuoyantIO/linkerd/branches{/branch}","tags_url":"https://api.github.com/repos/BuoyantIO/linkerd/tags","blobs_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/refs{/sha}","trees_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BuoyantIO/linkerd/statuses/{sha}","languages_url":"https://api.github.com/repos/BuoyantIO/linkerd/languages","stargazers_url":"https://api.github.com/repos/BuoyantIO/linkerd/stargazers","contributors_url":"https://api.github.com/repos/BuoyantIO/linkerd/contributors","subscribers_url":"https://api.github.com/repos/BuoyantIO/linkerd/subscribers","subscription_url":"https://api.github.com/repos/BuoyantIO/linkerd/subscription","commits_url":"https://api.github.com/repos/BuoyantIO/linkerd/commits{/sha}","git_commits_url":"https://api.github.com/repos/BuoyantIO/linkerd/git/commits{/sha}","comments_url":"https://api.github.com/repos/BuoyantIO/linkerd/comments{/number}","issue_comment_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues/comments{/number}","contents_url":"https://api.github.com/repos/BuoyantIO/linkerd/contents/{+path}","compare_url":"https://api.github.com/repos/BuoyantIO/linkerd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BuoyantIO/linkerd/merges","archive_url":"https://api.github.com/repos/BuoyantIO/linkerd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BuoyantIO/linkerd/downloads","issues_url":"https://api.github.com/repos/BuoyantIO/linkerd/issues{/number}","pulls_url":"https://api.github.com/repos/BuoyantIO/linkerd/pulls{/number}","milestones_url":"https://api.github.com/repos/BuoyantIO/linkerd/milestones{/number}","notifications_url":"https://api.github.com/repos/BuoyantIO/linkerd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BuoyantIO/linkerd/labels{/name}","releases_url":"https://api.github.com/repos/BuoyantIO/linkerd/releases{/id}","deployments_url":"https://api.github.com/repos/BuoyantIO/linkerd/deployments","created_at":"2016-01-13T22:14:52Z","updated_at":"2016-11-29T19:22:46Z","pushed_at":"2016-11-29T20:56:32Z","git_url":"git://github.com/BuoyantIO/linkerd.git","ssh_url":"git@github.com:BuoyantIO/linkerd.git","clone_url":"https://github.com/BuoyantIO/linkerd.git","svn_url":"https://github.com/BuoyantIO/linkerd","homepage":"https://linkerd.io","size":3855,"stargazers_count":1275,"watchers_count":1275,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":98,"mirror_url":null,"open_issues_count":99,"forks":98,"open_issues":99,"watchers":1275,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826"},"html":{"href":"https://github.com/BuoyantIO/linkerd/pull/826"},"issue":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/issues/826"},"comments":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/issues/826/comments"},"review_comments":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826/comments"},"review_comment":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/pulls/826/commits"},"statuses":{"href":"https://api.github.com/repos/BuoyantIO/linkerd/statuses/7c6b9a2ae281e18d1f63d7352cc5bdc9f865a856"}}}}
{"actor":{"display_login":"olix0r"}}