﻿{"id":110,"date":"2026-10-06T04:15:33","date_gmt":"2026-10-06T04:15:33","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=110"},"modified":"2026-10-06T04:31:02","modified_gmt":"2026-10-06T04:31:02","slug":"napoleon-wars-battle-for-the-bed","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=110","title":{"rendered":"Napoleon Wars: Battle for the Bed"},"content":{"rendered":"\n<style>\n#app, #app * { box-sizing: border-box; }\n#app {\n  width: 100%;\n  max-width: 100%;\n  margin: 0 auto;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background: #2a1a12;\n  color: #fff6e8;\n  font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  position: relative;\n}\n#stage {\n  position: relative;\n  width: 100%;\n  max-width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  line-height: 0;\n}\n#app canvas {\n  display: block;\n  background: #3d2a1c;\n  touch-action: none;\n  width: min(100%, calc((100vh - 40px) * 16 \/ 9));\n  max-width: 100%;\n  height: auto;\n  aspect-ratio: 16 \/ 9;\n  max-height: calc(100vh - 40px);\n  margin: 0 auto;\n}\n#overlay {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: rgba(30, 16, 10, 0.62);\n  padding: 12px;\n  overflow: auto;\n}\n#overlay[hidden] { display: none !important; }\n.card {\n  width: min(520px, 100%);\n  max-height: 100%;\n  overflow: auto;\n  background: #4a3020;\n  border: 1px solid #d4a24a;\n  border-radius: 18px;\n  padding: 10px 14px 14px;\n  box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);\n  text-align: center;\n  color: #fff6e8;\n}\n.card[hidden] { display: none !important; }\n.card h1 {\n  font-family: Georgia, \"Palatino Linotype\", serif;\n  font-size: 22px;\n  line-height: 1.15;\n  margin: 0 0 8px;\n  color: #ffc070;\n}\n.howto, .controls {\n  margin: 0 0 6px;\n  line-height: 1.35;\n  font-size: 13px;\n  color: #f0d8c0;\n}\n.controls { color: #d8b898; font-size: 12px; text-align: left; }\nbutton.go {\n  margin-top: 4px;\n  background: #e07a32;\n  color: #fffaf4;\n  border: 0;\n  border-radius: 999px;\n  padding: 12px 28px;\n  font: 700 17px\/1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  cursor: pointer;\n}\nbutton.go:hover { background: #c45e18; }\nbutton.go:focus-visible { outline: 3px solid #ffcc88; outline-offset: 2px; }\n.hero-cover {\n  width: min(200px, 48%);\n  height: auto;\n  border-radius: 12px;\n  margin: 0 auto 6px;\n  display: block;\n  box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n}\n#pads {\n  display: none;\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 5;\n  justify-content: center;\n  align-items: flex-end;\n  gap: 8px;\n  padding: 8px 10px calc(10px + env(safe-area-inset-bottom));\n  pointer-events: none;\n  background: transparent;\n  flex-wrap: wrap;\n}\n#pads[hidden] { display: none !important; }\n#pads.touch-on:not([hidden]) { display: flex; }\n.pad-cluster {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  pointer-events: auto;\n  justify-content: center;\n}\n#pads.toys-only .pad-aim { display: none !important; }\n#pads button {\n  height: 52px;\n  min-height: 52px;\n  width: auto;\n  min-width: 72px;\n  max-width: 120px;\n  flex: 0 0 auto;\n  border: 0;\n  border-radius: 14px;\n  background: rgba(60, 32, 18, 0.92);\n  color: #fff6e8;\n  font: 700 12px\/1.1 \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  padding: 0 10px;\n  touch-action: none;\n  white-space: nowrap;\n}\n#pads button:active { background: #e07a32; }\n#pad-pause {\n  position: absolute;\n  right: 10px;\n  bottom: calc(10px + env(safe-area-inset-bottom));\n  min-width: 64px;\n}\n#exit-fs {\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  z-index: 8;\n  width: 40px;\n  height: 40px;\n  border: 0;\n  border-radius: 999px;\n  background: rgba(20, 10, 5, 0.75);\n  color: #fff6e8;\n  font: 700 18px\/1 \"Trebuchet MS\", sans-serif;\n  cursor: pointer;\n}\n#exit-fs[hidden] { display: none !important; }\n#rotate-hint {\n  position: absolute;\n  inset: 0;\n  z-index: 9;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: rgba(20, 10, 5, 0.88);\n  color: #fff6e8;\n  text-align: center;\n  padding: 24px;\n}\n#rotate-hint[hidden] { display: none !important; }\n#rotate-hint .rot-icon {\n  font-size: 48px;\n  margin-bottom: 12px;\n}\n#load-err { color: #ff8899; min-height: 1.2em; }\n#app.fs-fallback {\n  position: fixed;\n  inset: 0;\n  width: 100dvw;\n  height: 100dvh;\n  max-width: none;\n  z-index: 9999;\n  margin: 0;\n  background: #120a06;\n  justify-content: center;\n}\n#app.fs-fallback #stage {\n  width: 100%;\n  height: 100%;\n  max-width: none;\n}\n#app.fs-fallback canvas {\n  width: auto;\n  max-width: 100%;\n  max-height: 100%;\n  height: auto;\n}\nhtml.nap-noscroll, body.nap-noscroll {\n  overflow: hidden !important;\n  overscroll-behavior: none;\n  touch-action: none;\n  height: 100%;\n}\n<\/style>\n<div id=\"app\">\n<button type=\"button\" id=\"exit-fs\" hidden aria-label=\"Exit fullscreen\">X<\/button>\n<div id=\"rotate-hint\" hidden>\n<div>\n<div class=\"rot-icon\" aria-hidden=\"true\">\u21bb<\/div>\n<div style=\"font:700 20px\/1.3 Trebuchet MS,sans-serif;margin-bottom:8px\">Turn your phone sideways<\/div>\n<div style=\"font:14px\/1.4 Trebuchet MS,sans-serif;color:#d8b898\">Napoleon Wars plays best in landscape.<\/div>\n<\/div>\n<\/div>\n<div id=\"stage\">\n<canvas id=\"game\" width=\"1280\" height=\"720\"><\/canvas>\n<div id=\"overlay\">\n<div class=\"card\" id=\"title-card\">\n<img decoding=\"async\" class=\"hero-cover\" id=\"cover-img\" alt=\"Napoleon Wars cover art with two cat generals\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/cover-2.jpg\">\n<h1>Napoleon Wars: Battle for the Bed<\/h1>\n<p class=\"howto\">Hot-seat artillery duel. Lure the Bed-Hog, claim bed zones, and knock your rival off the mattress. First to 1500 points or zero HP wins.<\/p>\n<p class=\"controls\">Desktop: 1 to 4 pick a toy. Arrows aim. Hold Space to charge, release to throw. Or drag back like a slingshot. Phone: tap a toy, drag back, release. Esc pauses.<\/p>\n<p id=\"load-err\"><\/p>\n<button type=\"button\" class=\"go\" id=\"start-btn\">Play<\/button>\n<\/div>\n<div class=\"card\" id=\"end-card\" hidden>\n<h1 id=\"end-title\">Victory<\/h1>\n<p class=\"howto\" id=\"end-msg\"><\/p>\n<button type=\"button\" class=\"go\" id=\"again-btn\">Play again<\/button>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"pads\" hidden>\n<div class=\"pad-cluster\">\n<button type=\"button\" id=\"pad-w1\" tabindex=\"-1\" aria-label=\"Feather Wand\">Wand<\/button>\n<button type=\"button\" id=\"pad-w2\" tabindex=\"-1\" aria-label=\"Laser Pen\">Laser<\/button>\n<button type=\"button\" id=\"pad-w3\" tabindex=\"-1\" aria-label=\"Squeaky Mouse\">Mouse<\/button>\n<button type=\"button\" id=\"pad-w4\" tabindex=\"-1\" aria-label=\"Toy Bird\">Bird<\/button>\n<\/div>\n<button type=\"button\" id=\"pad-pause\" tabindex=\"-1\" aria-label=\"Pause\">Pause<\/button>\n<\/div>\n<\/div>\n<script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"d2luZG93Lk5BUE9MRU9OX0FTU0VUUyA9IHsiY292ZXIiOiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY292ZXItMi5qcGciLCAiYXRsYXMiOiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvbmFwb2xlb25fYXRsYXMtMS5wbmciLCAiZnJhbWVzIjogeyJtZW93X3BvcnRyYWl0IjogeyJ4IjogNCwgInkiOiA0LCAidyI6IDEyNSwgImgiOiAxMzB9LCAibWVvd19pZGxlIjogeyJ4IjogMTMzLCAieSI6IDQsICJ3IjogMTAzLCAiaCI6IDEzMn0sICJtZW93X2FpbSI6IHsieCI6IDI0MCwgInkiOiA0LCAidyI6IDEzOSwgImgiOiAxMDl9LCAibWVvd190aHJvdyI6IHsieCI6IDM4MywgInkiOiA0LCAidyI6IDExNCwgImgiOiAxMTN9LCAic2lyX3BvcnRyYWl0IjogeyJ4IjogNTAxLCAieSI6IDQsICJ3IjogMTI4LCAiaCI6IDE0N30sICJzaXJfaWRsZSI6IHsieCI6IDYzMywgInkiOiA0LCAidyI6IDExNCwgImgiOiAxNDZ9LCAic2lyX2FpbSI6IHsieCI6IDc1MSwgInkiOiA0LCAidyI6IDEyNSwgImgiOiAxNDV9LCAic2lyX3Rocm93IjogeyJ4IjogODgwLCAieSI6IDQsICJ3IjogMTQ4LCAiaCI6IDE0OX0sICJiZWRob2dfc2xlZXAiOiB7IngiOiAxMDMyLCAieSI6IDQsICJ3IjogMTMzLCAiaCI6IDk2fSwgImJlZGhvZ193YWtlIjogeyJ4IjogMTE2OSwgInkiOiA0LCAidyI6IDEyMywgImgiOiAxMzl9LCAiYmVkaG9nX3BvdW5jZV91bmlmb3JtIjogeyJ4IjogMTI5NiwgInkiOiA0LCAidyI6IDE0MSwgImgiOiAxNDN9LCAiYmVkaG9nX3N0YWxrIjogeyJ4IjogNCwgInkiOiAxNTcsICJ3IjogMTg0LCAiaCI6IDc5fSwgImJlZGhvZ19sdW5nZSI6IHsieCI6IDE5MiwgInkiOiAxNTcsICJ3IjogMTg0LCAiaCI6IDkxfSwgImJlZGhvZ19jaGFyZ2UiOiB7IngiOiAzODAsICJ5IjogMTU3LCAidyI6IDE4NCwgImgiOiA4NH0sICJiZWRob2dfcG91bmNlIjogeyJ4IjogNTY4LCAieSI6IDE1NywgInciOiAxODYsICJoIjogMTAxfSwgImZlYXRoZXJfd2FuZCI6IHsieCI6IDc1OCwgInkiOiAxNTcsICJ3IjogMTE4LCAiaCI6IDEwOH0sICJsYXNlcl9wZW4iOiB7IngiOiA4ODAsICJ5IjogMTU3LCAidyI6IDEzMCwgImgiOiA5NX0sICJzcXVlYWt5X21vdXNlIjogeyJ4IjogMTAxNCwgInkiOiAxNTcsICJ3IjogMTEyLCAiaCI6IDYwfSwgInRveV9iaXJkIjogeyJ4IjogMTEzMCwgInkiOiAxNTcsICJ3IjogODIsICJoIjogMTA4fSwgImNhdG5pcF9ib21iIjogeyJ4IjogMTIxNiwgInkiOiAxNTcsICJ3IjogMTA0LCAiaCI6IDEwNH0sICJoZWFkYm9hcmQiOiB7IngiOiAxMzI0LCAieSI6IDE1NywgInciOiAyMDcsICJoIjogMTM4fSwgInBpbGxvd191cCI6IHsieCI6IDQsICJ5IjogMjk5LCAidyI6IDEyMSwgImgiOiA3Nn0sICJwaWxsb3dfZmxhdCI6IHsieCI6IDEyOSwgInkiOiAyOTksICJ3IjogMTIzLCAiaCI6IDQwfSwgInNoZWxmIjogeyJ4IjogMjU2LCAieSI6IDI5OSwgInciOiAzMTgsICJoIjogNzF9LCAiYWltX2h1ZCI6IHsieCI6IDU3OCwgInkiOiAyOTksICJ3IjogMTQ3LCAiaCI6IDgxfSwgImR1dmV0IjogeyJ4IjogNzI5LCAieSI6IDI5OSwgInciOiAyMjcsICJoIjogMTA0fSwgImN1c2hpb24iOiB7IngiOiA5NjAsICJ5IjogMjk5LCAidyI6IDE1MywgImgiOiA3NX0sICJzY29yZV9iYW5uZXIiOiB7IngiOiAxMTE3LCAieSI6IDI5OSwgInciOiAyNTAsICJoIjogOTZ9LCAiY2F0bmlwX2RhemUiOiB7IngiOiAxMzcxLCAieSI6IDI5OSwgInciOiAxMzMsICJoIjogMTE5fX19OwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFcgPSAxMjgwOwogIHZhciBIID0gNzIwOwogIHZhciBHUkFWSVRZID0gOTgwOwogIHZhciBXSU5fU0NPUkUgPSAxNTAwOwogIHZhciBNQVhfSFAgPSAxMDA7CgogIHZhciBBU1NFVFMgPSB3aW5kb3cuTkFQT0xFT05fQVNTRVRTIHx8IHt9OwogIHZhciBhdGxhc0ZyYW1lcyA9IEFTU0VUUy5mcmFtZXMgfHwge307CiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7CiAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcmxheSIpOwogIHZhciB0aXRsZUNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGl0bGUtY2FyZCIpOwogIHZhciBlbmRDYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVuZC1jYXJkIik7CiAgdmFyIGVuZFRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVuZC10aXRsZSIpOwogIHZhciBlbmRNc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW5kLW1zZyIpOwogIHZhciBzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1idG4iKTsKICB2YXIgYWdhaW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWdhaW4tYnRuIik7CiAgdmFyIGxvYWRFcnIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZC1lcnIiKTsKICB2YXIgcGFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwYWRzIik7CgogIGlmICghY2FudmFzKSByZXR1cm47CiAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogIGNhbnZhcy53aWR0aCA9IFc7CiAgY2FudmFzLmhlaWdodCA9IEg7CgogIHZhciBpbWFnZXMgPSB7fTsKICB2YXIgcmVhZHkgPSBmYWxzZTsKICB2YXIgc3RhdGUgPSAidGl0bGUiOwogIHZhciBrZXlzID0ge307CiAgdmFyIHBhZHNIZWxkID0ge307CiAgdmFyIGxhc3RUcyA9IDA7CiAgdmFyIHNjYWxlID0gMTsKICB2YXIgdG91Y2hNb2RlID0gZmFsc2U7CiAgdmFyIGF1ZGlvQ3R4ID0gbnVsbDsKCiAgdmFyIFdFQVBPTlMgPSBbCiAgICB7IGlkOiAid2FuZCIsIG5hbWU6ICJGZWF0aGVyIFdhbmQiLCBrZXk6ICIxIiwgbWFzczogMC40NSwgZHJhZzogMC43LCBib3VuY2U6IDAuMDYsIHNwZWVkOiA1MjAsIGNvbG9yOiAiIzg4ZmZhYSIgfSwKICAgIHsgaWQ6ICJsYXNlciIsIG5hbWU6ICJMYXNlciBQZW4iLCBrZXk6ICIyIiwgbWFzczogMC4zNSwgZHJhZzogMC4zNSwgYm91bmNlOiAwLjEsIHNwZWVkOiA2ODAsIGNvbG9yOiAiI2ZmNDQ2NiIgfSwKICAgIHsgaWQ6ICJtb3VzZSIsIG5hbWU6ICJTcXVlYWt5IE1vdXNlIiwga2V5OiAiMyIsIG1hc3M6IDAuOSwgZHJhZzogMC40NSwgYm91bmNlOiAwLjA4LCBzcGVlZDogNTYwLCBjb2xvcjogIiNjMGMwZDAiIH0sCiAgICB7IGlkOiAiYmlyZCIsIG5hbWU6ICJUb3kgQmlyZCIsIGtleTogIjQiLCBtYXNzOiAwLjcsIGRyYWc6IDAuNSwgYm91bmNlOiAwLjA4LCBzcGVlZDogNTgwLCBjb2xvcjogIiNjYzY2ZmYiIH0KICBdOwoKICB2YXIgWk9ORV9QT0lOVFMgPSBbCiAgICBbMzAwLCAzMDAsIDMwMF0sCiAgICBbMjAwLCAyMDAsIDIwMF0sCiAgICBbMTAwLCAxMDAsIDEwMF0KICBdOwoKICB2YXIgcGxheWVycyA9IFtdOwogIHZhciBiZWRIb2cgPSBudWxsOwogIHZhciBwcm9qZWN0aWxlID0gbnVsbDsKICB2YXIgcGFydGljbGVzID0gW107CiAgdmFyIGZsb2F0ZXJzID0gW107CiAgdmFyIHRlcnJhaW4gPSBbXTsKICB2YXIgem9uZXMgPSBbXTsKICB2YXIgem9uZU93bmVyID0gW1stMSwgLTEsIC0xXSwgWy0xLCAtMSwgLTFdLCBbLTEsIC0xLCAtMV1dOwogIHZhciBjdXJyZW50ID0gMDsKICB2YXIgd2VhcG9uSWR4ID0gMDsKICB2YXIgYW5nbGUgPSA0NTsKICB2YXIgcG93ZXIgPSAwLjQ1OwogIHZhciBjaGFyZ2luZyA9IGZhbHNlOwogIHZhciBjaGFyZ2VUID0gMDsKICB2YXIgd2luZCA9IDA7CiAgdmFyIHR1cm5Nc2cgPSAiIjsKICB2YXIgdHVybk1zZ1QgPSAwOwogIHZhciBhaW1Pc2MgPSBmYWxzZTsKICB2YXIgYWltRGlyID0gMTsKICB2YXIgcmVhY3Rpb25UID0gMDsKICB2YXIgcmVhY3Rpb25UZXh0ID0gIiI7CiAgdmFyIHBhdXNlZCA9IGZhbHNlOwogIHZhciBzY29yZXMgPSBbMCwgMF07CiAgdmFyIHJvdW5kTnVtID0gMTsKICB2YXIgc3BhY2VXYXNEb3duID0gZmFsc2U7CiAgdmFyIGZpcmVMYXRjaCA9IGZhbHNlOwogIHZhciBkcmFnQWltID0gZmFsc2U7CiAgdmFyIGRyYWdQb2ludGVySWQgPSBudWxsOwogIHZhciBkcmFnT3JpZ2luWCA9IDA7CiAgdmFyIGRyYWdPcmlnaW5ZID0gMDsKICB2YXIgZHJhZ0N1clggPSAwOwogIHZhciBkcmFnQ3VyWSA9IDA7CiAgdmFyIGZzQWN0aXZlID0gZmFsc2U7CiAgdmFyIGZzRmFsbGJhY2sgPSBmYWxzZTsKICB2YXIgcm90YXRlSGludEVsID0gbnVsbDsKICB2YXIgZXhpdEZzQnRuID0gbnVsbDsKICB2YXIgTUFYX0RSQUcgPSAxODA7CiAgdmFyIEdST1VORF9GUklDVElPTiA9IDE0OwogIHZhciBTRVRUTEVfU1BFRUQgPSA1NTsKCiAgZnVuY3Rpb24gbG9hZEltYWdlKHVybCkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpOwogICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAiYW5vbnltb3VzIjsKICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShpbWcpOyB9OwogICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmVqZWN0KG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgIiArIHVybCkpOyB9OwogICAgICBpbWcuc3JjID0gdXJsOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBsb2FkQWxsKCkgewogICAgdmFyIHVybCA9IEFTU0VUUy5hdGxhczsKICAgIGlmICghdXJsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJNaXNzaW5nIGF0bGFzIikpOwogICAgcmV0dXJuIGxvYWRJbWFnZSh1cmwpLnRoZW4oZnVuY3Rpb24gKGltZykgewogICAgICBpbWFnZXMuYXRsYXMgPSBpbWc7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZUF1ZGlvKCkgewogICAgaWYgKGF1ZGlvQ3R4KSByZXR1cm47CiAgICB2YXIgQUMgPSB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQ7CiAgICBpZiAoIUFDKSByZXR1cm47CiAgICBhdWRpb0N0eCA9IG5ldyBBQygpOwogIH0KCiAgZnVuY3Rpb24gYmVlcChmcmVxLCBkdXIsIHR5cGUsIGdhaW4pIHsKICAgIGlmICghYXVkaW9DdHgpIHJldHVybjsKICAgIHZhciB0MCA9IGF1ZGlvQ3R4LmN1cnJlbnRUaW1lOwogICAgdmFyIG8gPSBhdWRpb0N0eC5jcmVhdGVPc2NpbGxhdG9yKCk7CiAgICB2YXIgZyA9IGF1ZGlvQ3R4LmNyZWF0ZUdhaW4oKTsKICAgIG8udHlwZSA9IHR5cGUgfHwgInNpbmUiOwogICAgby5mcmVxdWVuY3kudmFsdWUgPSBmcmVxOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKGdhaW4gfHwgMC4xLCB0MCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMSwgdDAgKyBkdXIpOwogICAgby5jb25uZWN0KGcpOwogICAgZy5jb25uZWN0KGF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTsKICAgIG8uc3RhcnQodDApOwogICAgby5zdG9wKHQwICsgZHVyICsgMC4wMik7CiAgfQoKICBmdW5jdGlvbiBzZnhUaHJvdygpIHsgYmVlcCgyMjAsIDAuMDgsICJzcXVhcmUiLCAwLjA4KTsgYmVlcCg0NDAsIDAuMTIsICJ0cmlhbmdsZSIsIDAuMSk7IH0KICBmdW5jdGlvbiBzZnhIaXQoKSB7IGJlZXAoOTAsIDAuMTgsICJzYXd0b290aCIsIDAuMTQpOyB9CiAgZnVuY3Rpb24gc2Z4U2NvcmUoKSB7IGJlZXAoNjYwLCAwLjA4LCAidHJpYW5nbGUiLCAwLjEpOyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgYmVlcCg4ODAsIDAuMSwgInRyaWFuZ2xlIiwgMC4wOCk7IH0sIDYwKTsgfQogIGZ1bmN0aW9uIHNmeFdpbigpIHsgYmVlcCg1MjMsIDAuMTIsICJ0cmlhbmdsZSIsIDAuMTIpOyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgYmVlcCg2NTksIDAuMTIsICJ0cmlhbmdsZSIsIDAuMTIpOyB9LCAxMDApOyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgYmVlcCg3ODQsIDAuMiwgInRyaWFuZ2xlIiwgMC4xNCk7IH0sIDIwMCk7IH0KCiAgZnVuY3Rpb24gZGVnMnJhZChkKSB7IHJldHVybiBkICogTWF0aC5QSSAvIDE4MDsgfQoKICBmdW5jdGlvbiBtYWtlVGVycmFpbigpIHsKICAgIHRlcnJhaW4gPSBbCiAgICAgIHsgdHlwZTogInJlY3QiLCB4OiAwLCB5OiA2NDAsIHc6IFcsIGg6IDkwLCBlOiAwLjA2LCBuYW1lOiAiZmxvb3IiLCBncm91bmQ6IHRydWUgfSwKICAgICAgeyB0eXBlOiAicmVjdCIsIHg6IDE4MCwgeTogNDcwLCB3OiA5MjAsIGg6IDI4LCBlOiAwLjA4LCBuYW1lOiAibWF0dHJlc3MiLCBncm91bmQ6IHRydWUgfSwKICAgICAgeyB0eXBlOiAicmVjdCIsIHg6IDIwMCwgeTogMzYwLCB3OiA4ODAsIGg6IDI0LCBlOiAwLjEsIG5hbWU6ICJoZWFkYm9hcmRCYXIiIH0sCiAgICAgIHsgdHlwZTogImNpcmMiLCB4OiAyODAsIHk6IDQ1NSwgcjogNDgsIGU6IDAuMDUsIG5hbWU6ICJwaWxsb3dMIiwgZ3JvdW5kOiB0cnVlIH0sCiAgICAgIHsgdHlwZTogImNpcmMiLCB4OiA0MjAsIHk6IDQ0OCwgcjogNDIsIGU6IDAuMDUsIG5hbWU6ICJwaWxsb3dMMiIsIGdyb3VuZDogdHJ1ZSB9LAogICAgICB7IHR5cGU6ICJjaXJjIiwgeDogODYwLCB5OiA0NDgsIHI6IDQyLCBlOiAwLjA1LCBuYW1lOiAicGlsbG93UjIiLCBncm91bmQ6IHRydWUgfSwKICAgICAgeyB0eXBlOiAiY2lyYyIsIHg6IDEwMDAsIHk6IDQ1NSwgcjogNDgsIGU6IDAuMDUsIG5hbWU6ICJwaWxsb3dSIiwgZ3JvdW5kOiB0cnVlIH0sCiAgICAgIHsgdHlwZTogInJlY3QiLCB4OiA0MCwgeTogMjUwLCB3OiAxNjAsIGg6IDE4LCBlOiAwLjA4LCBuYW1lOiAic2hlbGZMIiB9LAogICAgICB7IHR5cGU6ICJyZWN0IiwgeDogMTA4MCwgeTogMjUwLCB3OiAxNjAsIGg6IDE4LCBlOiAwLjA4LCBuYW1lOiAic2hlbGZSIiB9LAogICAgICB7IHR5cGU6ICJyZWN0IiwgeDogMCwgeTogMCwgdzogMTgsIGg6IEgsIGU6IDAuMTIsIG5hbWU6ICJ3YWxsTCIgfSwKICAgICAgeyB0eXBlOiAicmVjdCIsIHg6IFcgLSAxOCwgeTogMCwgdzogMTgsIGg6IEgsIGU6IDAuMTIsIG5hbWU6ICJ3YWxsUiIgfSwKICAgICAgeyB0eXBlOiAicmVjdCIsIHg6IDAsIHk6IDAsIHc6IFcsIGg6IDE2LCBlOiAwLjEsIG5hbWU6ICJjZWlsaW5nIiB9CiAgICBdOwogICAgem9uZXMgPSBbXTsKICAgIHZhciBieCA9IDI2MCwgYnkgPSA0OTgsIGJ3ID0gNzYwLCBiaCA9IDE0MjsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IDM7IHJvdysrKSB7CiAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7CiAgICAgICAgem9uZXMucHVzaCh7CiAgICAgICAgICByb3c6IHJvdywgY29sOiBjb2wsCiAgICAgICAgICB4OiBieCArIGNvbCAqIChidyAvIDMpLAogICAgICAgICAgeTogYnkgKyByb3cgKiAoYmggLyAzKSwKICAgICAgICAgIHc6IGJ3IC8gMywKICAgICAgICAgIGg6IGJoIC8gMywKICAgICAgICAgIHB0czogWk9ORV9QT0lOVFNbcm93XVtjb2xdCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIFBsYXllcihpZCwgbmFtZSwgc2lkZSwgeCwgeSkgewogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuc2lkZSA9IHNpZGU7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICAgIHRoaXMudyA9IDkwOwogICAgdGhpcy5oID0gMTEwOwogICAgdGhpcy5ocCA9IE1BWF9IUDsKICAgIHRoaXMucG9zZSA9ICJpZGxlIjsKICAgIHRoaXMuZmFjaW5nID0gc2lkZSA9PT0gImxlZnQiID8gMSA6IC0xOwogICAgdGhpcy5mbGFzaCA9IDA7CiAgfQoKICBmdW5jdGlvbiBCZWRIb2coKSB7CiAgICB0aGlzLnggPSBXIC8gMjsKICAgIHRoaXMueSA9IDUyMDsKICAgIHRoaXMudyA9IDExMDsKICAgIHRoaXMuaCA9IDgwOwogICAgdGhpcy5wb3NlID0gInNsZWVwIjsKICAgIHRoaXMudGFyZ2V0WCA9IHRoaXMueDsKICAgIHRoaXMuYW5pbVQgPSAwOwogICAgdGhpcy5sYW5lID0gMTsKICAgIHRoaXMucm93ID0gMTsKICAgIHRoaXMuY2xhaW1lZEJ5ID0gLTE7CiAgfQoKICBmdW5jdGlvbiBQcm9qZWN0aWxlKHdlYXBvbiwgeCwgeSwgdngsIHZ5LCBvd25lcikgewogICAgdGhpcy53ZWFwb24gPSB3ZWFwb247CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICAgIHRoaXMudnggPSB2eDsKICAgIHRoaXMudnkgPSB2eTsKICAgIHRoaXMuciA9IHdlYXBvbi5pZCA9PT0gIm1vdXNlIiA\/IDE2IDogKHdlYXBvbi5pZCA9PT0gImJpcmQiID8gMTggOiAxNCk7CiAgICB0aGlzLm93bmVyID0gb3duZXI7CiAgICB0aGlzLmFsaXZlID0gdHJ1ZTsKICAgIHRoaXMuYm91bmNlcyA9IDA7CiAgICB0aGlzLmFnZSA9IDA7CiAgICB0aGlzLnNwaW4gPSAwOwogICAgdGhpcy5oaXRSaXZhbCA9IGZhbHNlOwogICAgdGhpcy5oaXRIb2cgPSBmYWxzZTsKICAgIHRoaXMubGFuZFggPSB4OwogICAgdGhpcy5sYW5kWSA9IHk7CiAgfQoKICBmdW5jdGlvbiByZXNldE1hdGNoKCkgewogICAgbWFrZVRlcnJhaW4oKTsKICAgIHBsYXllcnMgPSBbCiAgICAgIG5ldyBQbGF5ZXIoMCwgIk1lb3ctcG9sZW9uIiwgImxlZnQiLCAxMjAsIDI0OCksCiAgICAgIG5ldyBQbGF5ZXIoMSwgIlNpciBQdXJyLWNldmFsIiwgInJpZ2h0IiwgMTE2MCwgMjQ4KQogICAgXTsKICAgIGJlZEhvZyA9IG5ldyBCZWRIb2coKTsKICAgIHByb2plY3RpbGUgPSBudWxsOwogICAgcGFydGljbGVzID0gW107CiAgICBmbG9hdGVycyA9IFtdOwogICAgem9uZU93bmVyID0gW1stMSwgLTEsIC0xXSwgWy0xLCAtMSwgLTFdLCBbLTEsIC0xLCAtMV1dOwogICAgY3VycmVudCA9IDA7CiAgICB3ZWFwb25JZHggPSAwOwogICAgc2NvcmVzID0gWzAsIDBdOwogICAgcm91bmROdW0gPSAxOwogICAgd2luZCA9IChNYXRoLnJhbmRvbSgpICogMiAtIDEpICogNTU7CiAgICBzZXRBbmdsZUZvckN1cnJlbnQoKTsKICAgIHBvd2VyID0gMC40NTsKICAgIGNoYXJnaW5nID0gZmFsc2U7CiAgICBjaGFyZ2VUID0gMDsKICAgIGFpbU9zYyA9IGZhbHNlOwogICAgc3RhdGUgPSAic2VsZWN0IjsKICAgIHR1cm5Nc2cgPSBwbGF5ZXJzWzBdLm5hbWUgKyAiIHNlbGVjdHMgYSB0b3kiOwogICAgdHVybk1zZ1QgPSAyLjI7CiAgICBwYXVzZWQgPSBmYWxzZTsKICAgIG92ZXJsYXkuaGlkZGVuID0gdHJ1ZTsKICAgIGVuZENhcmQuaGlkZGVuID0gdHJ1ZTsKICAgIHRpdGxlQ2FyZC5oaWRkZW4gPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gc2V0QW5nbGVGb3JDdXJyZW50KCkgewogICAgYW5nbGUgPSBjdXJyZW50ID09PSAwID8gNDggOiAxMzI7CiAgICBhaW1EaXIgPSBjdXJyZW50ID09PSAwID8gMSA6IC0xOwogIH0KCiAgZnVuY3Rpb24gY3VycmVudFdlYXBvbigpIHsgcmV0dXJuIFdFQVBPTlNbd2VhcG9uSWR4XTsgfQoKICBmdW5jdGlvbiBzcGF3bkZsb2F0ZXIoeCwgeSwgdGV4dCwgY29sb3IpIHsKICAgIGZsb2F0ZXJzLnB1c2goeyB4OiB4LCB5OiB5LCB0ZXh0OiB0ZXh0LCBjb2xvcjogY29sb3IgfHwgIiNmZmYiLCB0OiAwLCBsaWZlOiAxLjIgfSk7CiAgfQoKICBmdW5jdGlvbiBidXJzdCh4LCB5LCBjb2xvciwgbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIGEgPSBNYXRoLnJhbmRvbSgpICogTWF0aC5QSSAqIDI7CiAgICAgIHZhciBzcCA9IDYwICsgTWF0aC5yYW5kb20oKSAqIDE4MDsKICAgICAgcGFydGljbGVzLnB1c2goewogICAgICAgIHg6IHgsIHk6IHksCiAgICAgICAgdng6IE1hdGguY29zKGEpICogc3AsCiAgICAgICAgdnk6IE1hdGguc2luKGEpICogc3AgLSA0MCwKICAgICAgICBsaWZlOiAwLjM1ICsgTWF0aC5yYW5kb20oKSAqIDAuNCwKICAgICAgICB0OiAwLAogICAgICAgIGNvbG9yOiBjb2xvciwKICAgICAgICByOiAyICsgTWF0aC5yYW5kb20oKSAqIDQKICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB6b25lQXQoeCwgeSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgeiA9IHpvbmVzW2ldOwogICAgICBpZiAoeCA+PSB6LnggJiYgeCA8PSB6LnggKyB6LncgJiYgeSA+PSB6LnkgJiYgeSA8PSB6LnkgKyB6LmgpIHJldHVybiB6OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBob2dab25lKCkgewogICAgcmV0dXJuIHpvbmVBdChiZWRIb2cueCwgYmVkSG9nLnkgKyAxMCk7CiAgfQoKICBmdW5jdGlvbiBjaXJjbGVSZWN0SGl0KGN4LCBjeSwgY3IsIHJ4LCByeSwgcncsIHJoKSB7CiAgICB2YXIgbnggPSBNYXRoLm1heChyeCwgTWF0aC5taW4oY3gsIHJ4ICsgcncpKTsKICAgIHZhciBueSA9IE1hdGgubWF4KHJ5LCBNYXRoLm1pbihjeSwgcnkgKyByaCkpOwogICAgdmFyIGR4ID0gY3ggLSBueDsKICAgIHZhciBkeSA9IGN5IC0gbnk7CiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPD0gY3IgKiBjcjsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVUZXJyYWluKHApIHsKICAgIHZhciBoaXQgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXJyYWluLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0ID0gdGVycmFpbltpXTsKICAgICAgaWYgKHQudHlwZSA9PT0gInJlY3QiKSB7CiAgICAgICAgaWYgKGNpcmNsZVJlY3RIaXQocC54LCBwLnksIHAuciwgdC54LCB0LnksIHQudywgdC5oKSkgewogICAgICAgICAgdmFyIG5lYXJlc3RYID0gTWF0aC5tYXgodC54LCBNYXRoLm1pbihwLngsIHQueCArIHQudykpOwogICAgICAgICAgdmFyIG5lYXJlc3RZID0gTWF0aC5tYXgodC55LCBNYXRoLm1pbihwLnksIHQueSArIHQuaCkpOwogICAgICAgICAgdmFyIGR4ID0gcC54IC0gbmVhcmVzdFg7CiAgICAgICAgICB2YXIgZHkgPSBwLnkgLSBuZWFyZXN0WTsKICAgICAgICAgIHZhciBkaXN0ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSB8fCAwLjAwMTsKICAgICAgICAgIHZhciBueCA9IGR4IC8gZGlzdDsKICAgICAgICAgIHZhciBueSA9IGR5IC8gZGlzdDsKICAgICAgICAgIHZhciBvdmVybGFwID0gcC5yIC0gZGlzdDsKICAgICAgICAgIGlmIChvdmVybGFwID4gMCkgewogICAgICAgICAgICBwLnggKz0gbnggKiBvdmVybGFwOwogICAgICAgICAgICBwLnkgKz0gbnkgKiBvdmVybGFwOwogICAgICAgICAgICB2YXIgdm4gPSBwLnZ4ICogbnggKyBwLnZ5ICogbnk7CiAgICAgICAgICAgIGlmICh2biA8IDApIHsKICAgICAgICAgICAgICB2YXIgZSA9IE1hdGgubWluKHQuZSwgcC53ZWFwb24uYm91bmNlKTsKICAgICAgICAgICAgICBpZiAocC5ib3VuY2VzID49IDEpIGUgPSAwOwogICAgICAgICAgICAgIHAudnggLT0gKDEgKyBlKSAqIHZuICogbng7CiAgICAgICAgICAgICAgcC52eSAtPSAoMSArIGUpICogdm4gKiBueTsKICAgICAgICAgICAgICAvLyB0YW5nZW50aWFsIGZyaWN0aW9uIChraWxsIHJvbGxpbmcgLyBwaW5nLXBvbmcpCiAgICAgICAgICAgICAgdmFyIHR4ID0gLW55OwogICAgICAgICAgICAgIHZhciB0eSA9IG54OwogICAgICAgICAgICAgIHZhciB2dCA9IHAudnggKiB0eCArIHAudnkgKiB0eTsKICAgICAgICAgICAgICB2dCAqPSB0Lmdyb3VuZCA\/IDAuMjUgOiAwLjQ1OwogICAgICAgICAgICAgIHZhciB2bjIgPSBwLnZ4ICogbnggKyBwLnZ5ICogbnk7CiAgICAgICAgICAgICAgcC52eCA9IG54ICogdm4yICsgdHggKiB2dDsKICAgICAgICAgICAgICBwLnZ5ID0gbnkgKiB2bjIgKyB0eSAqIHZ0OwogICAgICAgICAgICAgIGlmICh0Lmdyb3VuZCkgewogICAgICAgICAgICAgICAgcC52eCAqPSAwLjM1OwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHAudnkpIDwgODApIHAudnkgPSAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwLmJvdW5jZXMgKz0gMTsKICAgICAgICAgICAgICBoaXQgPSB0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHQudHlwZSA9PT0gImNpcmMiKSB7CiAgICAgICAgdmFyIGR4MiA9IHAueCAtIHQueDsKICAgICAgICB2YXIgZHkyID0gcC55IC0gdC55OwogICAgICAgIHZhciBkMiA9IE1hdGguc3FydChkeDIgKiBkeDIgKyBkeTIgKiBkeTIpIHx8IDAuMDAxOwogICAgICAgIHZhciBtaW5EID0gcC5yICsgdC5yOwogICAgICAgIGlmIChkMiA8IG1pbkQpIHsKICAgICAgICAgIHZhciBueDIgPSBkeDIgLyBkMjsKICAgICAgICAgIHZhciBueTIgPSBkeTIgLyBkMjsKICAgICAgICAgIHZhciBvdiA9IG1pbkQgLSBkMjsKICAgICAgICAgIHAueCArPSBueDIgKiBvdjsKICAgICAgICAgIHAueSArPSBueTIgKiBvdjsKICAgICAgICAgIHZhciB2bkEgPSBwLnZ4ICogbngyICsgcC52eSAqIG55MjsKICAgICAgICAgIGlmICh2bkEgPCAwKSB7CiAgICAgICAgICAgIHZhciBlMiA9IE1hdGgubWluKHQuZSwgcC53ZWFwb24uYm91bmNlKTsKICAgICAgICAgICAgaWYgKHAuYm91bmNlcyA+PSAxKSBlMiA9IDA7CiAgICAgICAgICAgIHAudnggLT0gKDEgKyBlMikgKiB2bkEgKiBueDI7CiAgICAgICAgICAgIHAudnkgLT0gKDEgKyBlMikgKiB2bkEgKiBueTI7CiAgICAgICAgICAgIHAudnggKj0gMC40OwogICAgICAgICAgICBwLnZ5ICo9IDAuMzU7CiAgICAgICAgICAgIHAuYm91bmNlcyArPSAxOwogICAgICAgICAgICBoaXQgPSB0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGhpdDsKICB9CgogIGZ1bmN0aW9uIHBsYXllckJveChwbCkgewogICAgcmV0dXJuIHsgeDogcGwueCAtIHBsLncgKiAwLjM1LCB5OiBwbC55IC0gcGwuaCwgdzogcGwudyAqIDAuNywgaDogcGwuaCB9OwogIH0KCiAgZnVuY3Rpb24gc3RhcnRBaW0oKSB7CiAgICBpZiAoc3RhdGUgIT09ICJzZWxlY3QiICYmIHN0YXRlICE9PSAiYWltIikgcmV0dXJuOwogICAgc3RhdGUgPSAiYWltIjsKICAgIGFpbU9zYyA9IGZhbHNlOwogICAgcGxheWVyc1tjdXJyZW50XS5wb3NlID0gImFpbSI7CiAgICB0dXJuTXNnID0gIkFpbTogYXJyb3dzIG9yIGRyYWcgYmFjay4gSG9sZCBTcGFjZSAob3IgcmVsZWFzZSBkcmFnKSB0byB0aHJvdy4iOwogICAgdHVybk1zZ1QgPSAyOwogIH0KCiAgZnVuY3Rpb24gYmVnaW5DaGFyZ2UoKSB7CiAgICBpZiAoc3RhdGUgIT09ICJhaW0iICYmIHN0YXRlICE9PSAic2VsZWN0IikgcmV0dXJuOwogICAgaWYgKHN0YXRlID09PSAic2VsZWN0Iikgc3RhcnRBaW0oKTsKICAgIHN0YXRlID0gImNoYXJnZSI7CiAgICBjaGFyZ2luZyA9IHRydWU7CiAgICBjaGFyZ2VUID0gMDsKICAgIHBvd2VyID0gMC4xNTsKICAgIGFpbU9zYyA9IGZhbHNlOwogICAgcGxheWVyc1tjdXJyZW50XS5wb3NlID0gImFpbSI7CiAgfQoKICBmdW5jdGlvbiBmaXJlTm93KCkgewogICAgaWYgKHN0YXRlICE9PSAiY2hhcmdlIiAmJiBzdGF0ZSAhPT0gImFpbSIpIHJldHVybjsKICAgIGNoYXJnaW5nID0gZmFsc2U7CiAgICB2YXIgcGwgPSBwbGF5ZXJzW2N1cnJlbnRdOwogICAgcGwucG9zZSA9ICJ0aHJvdyI7CiAgICB2YXIgd3BuID0gY3VycmVudFdlYXBvbigpOwogICAgdmFyIHJhZCA9IGRlZzJyYWQoYW5nbGUpOwogICAgdmFyIHNwZCA9IHdwbi5zcGVlZCAqICgwLjM1ICsgcG93ZXIgKiAwLjkpOwogICAgdmFyIGRpciA9IDE7CiAgICB2YXIgdnggPSBNYXRoLmNvcyhyYWQpICogc3BkICogZGlyOwogICAgdmFyIHZ5ID0gLU1hdGguc2luKHJhZCkgKiBzcGQ7CiAgICB2YXIgb3ggPSBwbC54ICsgcGwuZmFjaW5nICogNDA7CiAgICB2YXIgb3kgPSBwbC55IC0gcGwuaCAqIDAuNTU7CiAgICBwcm9qZWN0aWxlID0gbmV3IFByb2plY3RpbGUod3BuLCBveCwgb3ksIHZ4LCB2eSwgY3VycmVudCk7CiAgICBzdGF0ZSA9ICJmbGlnaHQiOwogICAgc2Z4VGhyb3coKTsKICAgIHR1cm5Nc2cgPSB3cG4ubmFtZSArICIgYXdheSEiOwogICAgdHVybk1zZ1QgPSAxLjI7CiAgfQoKICBmdW5jdGlvbiBhcHBseVdlYXBvbkVmZmVjdChwKSB7CiAgICB2YXIgeiA9IHpvbmVBdChwLmxhbmRYLCBwLmxhbmRZKTsKICAgIHZhciB3cG4gPSBwLndlYXBvbjsKICAgIHJlYWN0aW9uVGV4dCA9ICIiOwogICAgYmVkSG9nLmFuaW1UID0gMDsKCiAgICBpZiAod3BuLmlkID09PSAid2FuZCIpIHsKICAgICAgYmVkSG9nLnBvc2UgPSAic3RhbGsiOwogICAgICBpZiAoeikgewogICAgICAgIGJlZEhvZy50YXJnZXRYID0gei54ICsgei53IC8gMjsKICAgICAgICBiZWRIb2cubGFuZSA9IHouY29sOwogICAgICAgIGJlZEhvZy5yb3cgPSB6LnJvdzsKICAgICAgICByZWFjdGlvblRleHQgPSAiQmVkLUhvZyB0cm90cyB0byB0aGUgd2FuZCEiOwogICAgICB9IGVsc2UgewogICAgICAgIGJlZEhvZy50YXJnZXRYID0gTWF0aC5tYXgoMjgwLCBNYXRoLm1pbigxMDAwLCBwLmxhbmRYKSk7CiAgICAgICAgcmVhY3Rpb25UZXh0ID0gIkJlZC1Ib2cgZm9sbG93cyB0aGUgZmVhdGhlciEiOwogICAgICB9CiAgICAgIGJlZEhvZy5jbGFpbWVkQnkgPSAtMTsKICAgIH0gZWxzZSBpZiAod3BuLmlkID09PSAibGFzZXIiKSB7CiAgICAgIGJlZEhvZy5wb3NlID0gImNoYXJnZSI7CiAgICAgIHJlYWN0aW9uVGV4dCA9ICJSZWQtZG90IHN0YW1wZWRlISI7CiAgICAgIHZhciByaXZhbCA9IHBsYXllcnNbMSAtIHAub3duZXJdOwogICAgICByaXZhbC54ICs9IChwLm93bmVyID09PSAwID8gMSA6IC0xKSAqIDU1OwogICAgICByaXZhbC54ID0gTWF0aC5tYXgoNjAsIE1hdGgubWluKFcgLSA2MCwgcml2YWwueCkpOwogICAgICByaXZhbC5mbGFzaCA9IDAuNTsKICAgICAgcml2YWwuaHAgPSBNYXRoLm1heCgwLCByaXZhbC5ocCAtIDgpOwogICAgICBzcGF3bkZsb2F0ZXIocml2YWwueCwgcml2YWwueSAtIHJpdmFsLmggLSAxMCwgIi04IEhQIiwgIiNmZjY2ODgiKTsKICAgICAgYnVyc3Qocml2YWwueCwgcml2YWwueSAtIHJpdmFsLmggLyAyLCAiI2ZmNDQ2NiIsIDEyKTsKICAgIH0gZWxzZSBpZiAod3BuLmlkID09PSAibW91c2UiKSB7CiAgICAgIGJlZEhvZy5wb3NlID0gInBvdW5jZSI7CiAgICAgIGlmICh6KSB7CiAgICAgICAgYmVkSG9nLnRhcmdldFggPSB6LnggKyB6LncgLyAyOwogICAgICAgIGJlZEhvZy5sYW5lID0gei5jb2w7CiAgICAgICAgYmVkSG9nLnJvdyA9IHoucm93OwogICAgICAgIHpvbmVPd25lclt6LnJvd11bei5jb2xdID0gcC5vd25lcjsKICAgICAgICByZWFjdGlvblRleHQgPSAiQmVkLUhvZyBjbGFpbXMgYSB6b25lIGZvciAiICsgcGxheWVyc1twLm93bmVyXS5uYW1lICsgIiEiOwogICAgICAgIHNwYXduRmxvYXRlcih6LnggKyB6LncgLyAyLCB6LnksICIrIiArIHoucHRzICsgIiBjbGFpbSIsICIjZmZlMDhhIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmVkSG9nLnRhcmdldFggPSBNYXRoLm1heCgyODAsIE1hdGgubWluKDEwMDAsIHAubGFuZFgpKTsKICAgICAgICByZWFjdGlvblRleHQgPSAiQmVkLUhvZyBwb3VuY2VzIG9uIHRoZSBtb3VzZSEiOwogICAgICB9CiAgICAgIGJlZEhvZy5jbGFpbWVkQnkgPSBwLm93bmVyOwogICAgfSBlbHNlIGlmICh3cG4uaWQgPT09ICJiaXJkIikgewogICAgICBiZWRIb2cucG9zZSA9ICJsdW5nZSI7CiAgICAgIHJlYWN0aW9uVGV4dCA9ICJBaXItc3dhdCBzaGFrZXMgdGhlIGJlZCEiOwogICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCAzOyByb3crKykgewogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7CiAgICAgICAgICBpZiAoem9uZU93bmVyW3Jvd11bY29sXSA9PT0gKDEgLSBwLm93bmVyKSkgewogICAgICAgICAgICB6b25lT3duZXJbcm93XVtjb2xdID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByaXZhbDIgPSBwbGF5ZXJzWzEgLSBwLm93bmVyXTsKICAgICAgcml2YWwyLnggKz0gKHAub3duZXIgPT09IDAgPyAxIDogLTEpICogMzA7CiAgICAgIGJ1cnN0KFcgLyAyLCA1MDAsICIjY2M4OGZmIiwgMTYpOwogICAgfQoKICAgIGlmIChwLmhpdFJpdmFsKSB7CiAgICAgIHJlYWN0aW9uVGV4dCA9IChyZWFjdGlvblRleHQgPyByZWFjdGlvblRleHQgKyAiICIgOiAiIikgKyAiRGlyZWN0IGhpdCEiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZXZhbHVhdGVSb3VuZCgpIHsKICAgIHZhciBnYWluZWQgPSBbMCwgMF07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCAzOyByb3crKykgewogICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewogICAgICAgIHZhciBvd25lciA9IHpvbmVPd25lcltyb3ddW2NvbF07CiAgICAgICAgaWYgKG93bmVyID49IDApIHsKICAgICAgICAgIHZhciBwdHMgPSBaT05FX1BPSU5UU1tyb3ddW2NvbF07CiAgICAgICAgICBzY29yZXNbb3duZXJdICs9IHB0czsKICAgICAgICAgIGdhaW5lZFtvd25lcl0gKz0gcHRzOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIGh6ID0gaG9nWm9uZSgpOwogICAgaWYgKGh6ICYmIGJlZEhvZy5jbGFpbWVkQnkgPj0gMCkgewogICAgICAvLyBhbHJlYWR5IGNvdW50ZWQgdmlhIHpvbmVPd25lciBmb3IgbW91c2U7IG90aGVyd2lzZSBzb2Z0IGJvbnVzCiAgICB9IGVsc2UgaWYgKGh6ICYmIGJlZEhvZy5jbGFpbWVkQnkgPCAwKSB7CiAgICAgIC8vIHByZXNlbmNlIGFsb25lIGRvZXMgbm90IGF3YXJkIHVubGVzcyBjbGFpbWVkCiAgICB9CiAgICBpZiAoZ2FpbmVkWzBdIHx8IGdhaW5lZFsxXSkgc2Z4U2NvcmUoKTsKICAgIHR1cm5Nc2cgPSAiUm91bmQgIiArIHJvdW5kTnVtICsgIiBzY29yaW5nOiBQMSArIiArIGdhaW5lZFswXSArICIgIFAyICsiICsgZ2FpbmVkWzFdOwogICAgdHVybk1zZ1QgPSAyLjQ7CiAgICBzcGF3bkZsb2F0ZXIoVyAvIDIsIDEyMCwgIlNjb3JlIGNoZWNrIiwgIiNmZmUwOGEiKTsKCiAgICBpZiAoc2NvcmVzWzBdID49IFdJTl9TQ09SRSB8fCBzY29yZXNbMV0gPj0gV0lOX1NDT1JFIHx8IHBsYXllcnNbMF0uaHAgPD0gMCB8fCBwbGF5ZXJzWzFdLmhwIDw9IDApIHsKICAgICAgZmluaXNoTWF0Y2goKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhdGUgPSAidHVybl9zd2FwIjsKICAgIHJlYWN0aW9uVCA9IDEuNDsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaE1hdGNoKCkgewogICAgc3RhdGUgPSAid2luIjsKICAgIHZhciB3aW5uZXI7CiAgICBpZiAocGxheWVyc1swXS5ocCA8PSAwICYmIHBsYXllcnNbMV0uaHAgPD0gMCkgd2lubmVyID0gLTE7CiAgICBlbHNlIGlmIChwbGF5ZXJzWzBdLmhwIDw9IDApIHdpbm5lciA9IDE7CiAgICBlbHNlIGlmIChwbGF5ZXJzWzFdLmhwIDw9IDApIHdpbm5lciA9IDA7CiAgICBlbHNlIGlmIChzY29yZXNbMF0gPT09IHNjb3Jlc1sxXSkgd2lubmVyID0gLTE7CiAgICBlbHNlIHdpbm5lciA9IHNjb3Jlc1swXSA+IHNjb3Jlc1sxXSA\/IDAgOiAxOwogICAgc2Z4V2luKCk7CiAgICBlbmRDYXJkLmhpZGRlbiA9IGZhbHNlOwogICAgdGl0bGVDYXJkLmhpZGRlbiA9IHRydWU7CiAgICBvdmVybGF5LmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKHdpbm5lciA8IDApIHsKICAgICAgZW5kVGl0bGUudGV4dENvbnRlbnQgPSAiRHJhdyEiOwogICAgICBlbmRNc2cudGV4dENvbnRlbnQgPSAiTWVvdy1wb2xlb24gIiArIHNjb3Jlc1swXSArICIgLSAiICsgc2NvcmVzWzFdICsgIiBTaXIgUHVyci1jZXZhbC4gUmVtYXRjaCBmb3IgdGhlIGJlZCEiOwogICAgfSBlbHNlIHsKICAgICAgZW5kVGl0bGUudGV4dENvbnRlbnQgPSBwbGF5ZXJzW3dpbm5lcl0ubmFtZSArICIgd2lucyB0aGUgYmVkISI7CiAgICAgIGVuZE1zZy50ZXh0Q29udGVudCA9ICJGaW5hbCAiICsgc2NvcmVzWzBdICsgIiB0byAiICsgc2NvcmVzWzFdICsgIi4gSFAgbGVmdDogIiArIHBsYXllcnNbd2lubmVyXS5ocCArICIuIFBhc3MgdGhlIGtleWJvYXJkIGZvciBhIHJlbWF0Y2guIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHN3YXBUdXJuKCkgewogICAgY3VycmVudCA9IDEgLSBjdXJyZW50OwogICAgcm91bmROdW0gKz0gMTsKICAgIHdlYXBvbklkeCA9IDA7CiAgICBzZXRBbmdsZUZvckN1cnJlbnQoKTsKICAgIHBvd2VyID0gMC40NTsKICAgIHdpbmQgPSAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSAqIDYwOwogICAgcGxheWVyc1swXS5wb3NlID0gImlkbGUiOwogICAgcGxheWVyc1sxXS5wb3NlID0gImlkbGUiOwogICAgYmVkSG9nLnBvc2UgPSBiZWRIb2cucG9zZSA9PT0gInNsZWVwIiA\/ICJzbGVlcCIgOiAid2FrZSI7CiAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuMzUpIGJlZEhvZy5wb3NlID0gInNsZWVwIjsKICAgIHN0YXRlID0gInNlbGVjdCI7CiAgICB0dXJuTXNnID0gcGxheWVyc1tjdXJyZW50XS5uYW1lICsgIiAtIHBpY2sgYSB0b3kgKDEtNCksIHRoZW4gYWltIjsKICAgIHR1cm5Nc2dUID0gMi41OwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRmxpZ2h0KGR0KSB7CiAgICB2YXIgcCA9IHByb2plY3RpbGU7CiAgICBpZiAoIXAgfHwgIXAuYWxpdmUpIHJldHVybjsKICAgIHAuYWdlICs9IGR0OwogICAgcC5zcGluICs9IGR0ICogODsKICAgIHZhciBkcmFnID0gcC53ZWFwb24uZHJhZzsKICAgIHAudnggKz0gd2luZCAqIGR0OwogICAgcC52eCAqPSBNYXRoLm1heCgwLCAxIC0gZHJhZyAqIGR0KTsKICAgIHAudnkgKj0gTWF0aC5tYXgoMCwgMSAtIGRyYWcgKiAwLjM1ICogZHQpOwogICAgcC52eSArPSBHUkFWSVRZICogcC53ZWFwb24ubWFzcyAqIGR0OwogICAgcC54ICs9IHAudnggKiBkdDsKICAgIHAueSArPSBwLnZ5ICogZHQ7CiAgICBwLmxhbmRYID0gcC54OwogICAgcC5sYW5kWSA9IHAueTsKCiAgICB2YXIgdGggPSByZXNvbHZlVGVycmFpbihwKTsKICAgIC8vIHN0cm9uZyBjb250aW51b3VzIGdyb3VuZCBmcmljdGlvbiB3aGlsZSBzbG93IG5lYXIgYmVkL2Zsb29yCiAgICBpZiAodGggJiYgdGguZ3JvdW5kKSB7CiAgICAgIHAudnggKj0gTWF0aC5tYXgoMCwgMSAtIEdST1VORF9GUklDVElPTiAqIGR0KTsKICAgICAgaWYgKHAudnkgPiAwKSBwLnZ5ICo9IDAuMjsKICAgIH0KICAgIHZhciBzcGROb3cgPSBNYXRoLmh5cG90KHAudngsIHAudnkpOwogICAgaWYgKHRoICYmIChzcGROb3cgPCBTRVRUTEVfU1BFRUQgfHwgcC5ib3VuY2VzID49IDIpKSB7CiAgICAgIHAuYWxpdmUgPSBmYWxzZTsKICAgIH0KICAgIGlmIChwLmJvdW5jZXMgPj0gMSAmJiBzcGROb3cgPCAxMjAgJiYgcC55ID4gNDMwKSB7CiAgICAgIHAudnggKj0gMC41OwogICAgICBwLnZ5ID0gTWF0aC5taW4ocC52eSwgMCk7CiAgICAgIGlmIChzcGROb3cgPCA5MCkgcC5hbGl2ZSA9IGZhbHNlOwogICAgfQoKICAgIC8vIHJpdmFsIGhpdAogICAgdmFyIHJpdmFsID0gcGxheWVyc1sxIC0gcC5vd25lcl07CiAgICB2YXIgcmIgPSBwbGF5ZXJCb3gocml2YWwpOwogICAgaWYgKCFwLmhpdFJpdmFsICYmIGNpcmNsZVJlY3RIaXQocC54LCBwLnksIHAuciwgcmIueCwgcmIueSwgcmIudywgcmIuaCkpIHsKICAgICAgcC5oaXRSaXZhbCA9IHRydWU7CiAgICAgIHZhciBkbWcgPSBwLndlYXBvbi5pZCA9PT0gIm1vdXNlIiA\/IDIyIDogKHAud2VhcG9uLmlkID09PSAiYmlyZCIgPyAxOCA6IDE0KTsKICAgICAgcml2YWwuaHAgPSBNYXRoLm1heCgwLCByaXZhbC5ocCAtIGRtZyk7CiAgICAgIHJpdmFsLmZsYXNoID0gMC42OwogICAgICByaXZhbC54ICs9IChwLnZ4ID4gMCA\/IDEgOiAtMSkgKiA0MDsKICAgICAgcml2YWwueCA9IE1hdGgubWF4KDYwLCBNYXRoLm1pbihXIC0gNjAsIHJpdmFsLngpKTsKICAgICAgcC52eCAqPSAtMC4xNTsKICAgICAgcC52eSA9IC1NYXRoLmFicyhwLnZ5KSAqIDAuMTUgLSAyMDsKICAgICAgcC5ib3VuY2VzICs9IDE7CiAgICAgIHNwYXduRmxvYXRlcihyaXZhbC54LCByaXZhbC55IC0gcml2YWwuaCAtIDgsICItIiArIGRtZyArICIgSFAiLCAiI2ZmNjY4OCIpOwogICAgICBidXJzdChwLngsIHAueSwgIiNmZjg4NjYiLCAxNCk7CiAgICAgIHNmeEhpdCgpOwogICAgfQoKICAgIC8vIGJlZGhvZyBzb2Z0IGNvbGxpZGUKICAgIHZhciBoeCA9IGJlZEhvZy54IC0gYmVkSG9nLncgKiAwLjQ7CiAgICB2YXIgaHkgPSBiZWRIb2cueSAtIGJlZEhvZy5oOwogICAgaWYgKCFwLmhpdEhvZyAmJiBjaXJjbGVSZWN0SGl0KHAueCwgcC55LCBwLnIsIGh4LCBoeSwgYmVkSG9nLncgKiAwLjgsIGJlZEhvZy5oKSkgewogICAgICBwLmhpdEhvZyA9IHRydWU7CiAgICAgIGJlZEhvZy5wb3NlID0gIndha2UiOwogICAgICBwLnZ4ICo9IDAuMjU7CiAgICAgIHAudnkgPSAtTWF0aC5hYnMocC52eSkgKiAwLjEyIC0gMTA7CiAgICAgIHAuYm91bmNlcyArPSAxOwogICAgICBidXJzdChwLngsIHAueSwgIiNkZGQiLCA4KTsKICAgIH0KCiAgICBpZiAocC55ID4gSCArIDQwIHx8IHAueCA8IC00MCB8fCBwLnggPiBXICsgNDAgfHwgcC5hZ2UgPiA1IHx8IHAuYm91bmNlcyA+IDIpIHsKICAgICAgcC5hbGl2ZSA9IGZhbHNlOwogICAgfQoKICAgIGlmICghcC5hbGl2ZSkgewogICAgICBhcHBseVdlYXBvbkVmZmVjdChwKTsKICAgICAgc3RhdGUgPSAicmVhY3Rpb24iOwogICAgICByZWFjdGlvblQgPSAxLjY7CiAgICAgIHByb2plY3RpbGUgPSBwOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUmVhY3Rpb24oZHQpIHsKICAgIHJlYWN0aW9uVCAtPSBkdDsKICAgIC8vIG1vdmUgaG9nIHRvd2FyZCB0YXJnZXQKICAgIHZhciBkeCA9IGJlZEhvZy50YXJnZXRYIC0gYmVkSG9nLng7CiAgICBpZiAoTWF0aC5hYnMoZHgpID4gNCkgewogICAgICBiZWRIb2cueCArPSBNYXRoLnNpZ24oZHgpICogTWF0aC5taW4oTWF0aC5hYnMoZHgpLCAyMjAgKiBkdCk7CiAgICB9CiAgICBiZWRIb2cuYW5pbVQgKz0gZHQ7CiAgICBpZiAocmVhY3Rpb25UIDw9IDApIHsKICAgICAgcHJvamVjdGlsZSA9IG51bGw7CiAgICAgIGV2YWx1YXRlUm91bmQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdEFpbShkdCkgewogICAgdmFyIGxlZnQgPSBrZXlzLkFycm93TGVmdCB8fCBrZXlzLmEgfHwga2V5cy5BIHx8IHBhZHNIZWxkLmxlZnQ7CiAgICB2YXIgcmlnaHQgPSBrZXlzLkFycm93UmlnaHQgfHwga2V5cy5kIHx8IGtleXMuRCB8fCBwYWRzSGVsZC5yaWdodDsKICAgIGlmIChzdGF0ZSA9PT0gImFpbSIgfHwgc3RhdGUgPT09ICJzZWxlY3QiKSB7CiAgICAgIGlmIChsZWZ0KSBhbmdsZSArPSA3MCAqIGR0OwogICAgICBpZiAocmlnaHQpIGFuZ2xlIC09IDcwICogZHQ7CiAgICAgIGlmIChhaW1Pc2MgJiYgc3RhdGUgPT09ICJhaW0iICYmICFsZWZ0ICYmICFyaWdodCkgewogICAgICAgIGFuZ2xlICs9IGFpbURpciAqIDEyMCAqIGR0OwogICAgICAgIGlmIChhbmdsZSA+IDE3MCkgeyBhbmdsZSA9IDE3MDsgYWltRGlyID0gLTE7IH0KICAgICAgICBpZiAoYW5nbGUgPCAxMCkgeyBhbmdsZSA9IDEwOyBhaW1EaXIgPSAxOyB9CiAgICAgIH0KICAgICAgYW5nbGUgPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTcwLCBhbmdsZSkpOwogICAgfQogICAgaWYgKHN0YXRlID09PSAiY2hhcmdlIiAmJiAhZHJhZ0FpbSkgewogICAgICBjaGFyZ2VUICs9IGR0OwogICAgICBwb3dlciA9IE1hdGgubWluKDEsIDAuMTIgKyBjaGFyZ2VUICogMC44KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGhhbmRsZVNwYWNlKGRvd24pIHsKICAgIGlmIChwYXVzZWQgfHwgc3RhdGUgPT09ICJ0aXRsZSIgfHwgc3RhdGUgPT09ICJ3aW4iIHx8IHN0YXRlID09PSAiZmxpZ2h0IiB8fCBzdGF0ZSA9PT0gInJlYWN0aW9uIiB8fCBzdGF0ZSA9PT0gInR1cm5fc3dhcCIpIHsKICAgICAgc3BhY2VXYXNEb3duID0gZG93bjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRvd24gJiYgIXNwYWNlV2FzRG93bikgewogICAgICBpZiAoc3RhdGUgPT09ICJzZWxlY3QiKSB7CiAgICAgICAgc3RhcnRBaW0oKTsKICAgICAgICBiZWdpbkNoYXJnZSgpOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAiYWltIikgewogICAgICAgIGJlZ2luQ2hhcmdlKCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghZG93biAmJiBzcGFjZVdhc0Rvd24pIHsKICAgICAgaWYgKHN0YXRlID09PSAiY2hhcmdlIikgZmlyZU5vdygpOwogICAgfQogICAgc3BhY2VXYXNEb3duID0gZG93bjsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZShkdCkgewogICAgaWYgKHN0YXRlID09PSAidGl0bGUiIHx8IHN0YXRlID09PSAid2luIikgcmV0dXJuOwogICAgaWYgKHBhdXNlZCkgcmV0dXJuOwoKICAgIGlmICh0dXJuTXNnVCA+IDApIHR1cm5Nc2dUIC09IGR0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGF5ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChwbGF5ZXJzW2ldLmZsYXNoID4gMCkgcGxheWVyc1tpXS5mbGFzaCAtPSBkdDsKICAgIH0KCiAgICAvLyBjb250aW51b3VzIHNwYWNlIGNoYXJnZSAoZGVza3RvcCk7IHNraXAgd2hpbGUgZHJhZy1haW1pbmcKICAgIGlmICghZHJhZ0FpbSkgewogICAgICB2YXIgc3BhY2VEb3duID0gISEoa2V5c1siICJdIHx8IGtleXMuU3BhY2UpOwogICAgICBoYW5kbGVTcGFjZShzcGFjZURvd24pOwogICAgfQoKICAgIGlmIChzdGF0ZSA9PT0gInNlbGVjdCIgfHwgc3RhdGUgPT09ICJhaW0iIHx8IHN0YXRlID09PSAiY2hhcmdlIikgdXBkYXRlU2VsZWN0QWltKGR0KTsKICAgIGlmIChzdGF0ZSA9PT0gImZsaWdodCIpIHVwZGF0ZUZsaWdodChkdCk7CiAgICBpZiAoc3RhdGUgPT09ICJyZWFjdGlvbiIpIHVwZGF0ZVJlYWN0aW9uKGR0KTsKICAgIGlmIChzdGF0ZSA9PT0gInR1cm5fc3dhcCIpIHsKICAgICAgcmVhY3Rpb25UIC09IGR0OwogICAgICBpZiAocmVhY3Rpb25UIDw9IDApIHN3YXBUdXJuKCk7CiAgICB9CgogICAgLy8gaG9nIGlkbGUgZHJpZnQKICAgIGlmIChzdGF0ZSA9PT0gInNlbGVjdCIgfHwgc3RhdGUgPT09ICJhaW0iIHx8IHN0YXRlID09PSAiY2hhcmdlIikgewogICAgICBiZWRIb2cuYW5pbVQgKz0gZHQ7CiAgICAgIGlmIChiZWRIb2cucG9zZSA9PT0gInNsZWVwIikgewogICAgICAgIGJlZEhvZy55ID0gNTIwICsgTWF0aC5zaW4oYmVkSG9nLmFuaW1UICogMikgKiAyOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgcCA9IHBhcnRpY2xlcy5sZW5ndGggLSAxOyBwID49IDA7IHAtLSkgewogICAgICB2YXIgcHQgPSBwYXJ0aWNsZXNbcF07CiAgICAgIHB0LnQgKz0gZHQ7CiAgICAgIHB0LnggKz0gcHQudnggKiBkdDsKICAgICAgcHQueSArPSBwdC52eSAqIGR0OwogICAgICBwdC52eSArPSAzMDAgKiBkdDsKICAgICAgaWYgKHB0LnQgPj0gcHQubGlmZSkgcGFydGljbGVzLnNwbGljZShwLCAxKTsKICAgIH0KICAgIGZvciAodmFyIGYgPSBmbG9hdGVycy5sZW5ndGggLSAxOyBmID49IDA7IGYtLSkgewogICAgICBmbG9hdGVyc1tmXS50ICs9IGR0OwogICAgICBpZiAoZmxvYXRlcnNbZl0udCA+PSBmbG9hdGVyc1tmXS5saWZlKSBmbG9hdGVycy5zcGxpY2UoZiwgMSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3SW1nKG5hbWUsIHgsIHksIHcsIGgsIGZsaXApIHsKICAgIHZhciBmciA9IGF0bGFzRnJhbWVzW25hbWVdOwogICAgdmFyIGltZyA9IGltYWdlcy5hdGxhczsKICAgIGlmICghaW1nIHx8ICFmcikgcmV0dXJuIGZhbHNlOwogICAgY3R4LnNhdmUoKTsKICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7CiAgICBpZiAoZmxpcCkgY3R4LnNjYWxlKC0xLCAxKTsKICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBmci54LCBmci55LCBmci53LCBmci5oLCAtdyAvIDIsIC1oLCB3LCBoKTsKICAgIGN0eC5yZXN0b3JlKCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKCkgewogICAgdmFyIGcgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgSCk7CiAgICBnLmFkZENvbG9yU3RvcCgwLCAiIzFhMTAyMCIpOwogICAgZy5hZGRDb2xvclN0b3AoMC40NSwgIiMzYTI0MTgiKTsKICAgIGcuYWRkQ29sb3JTdG9wKDEsICIjNWEzYTI4Iik7CiAgICBjdHguZmlsbFN0eWxlID0gZzsKICAgIGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsKCiAgICAvLyB3YWxscGFwZXIgc3RyaXBlcwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDgwLDUwLDMwLDAuMjUpIjsKICAgIGZvciAodmFyIHggPSAwOyB4IDwgVzsgeCArPSA0OCkgY3R4LmZpbGxSZWN0KHgsIDAsIDE4LCAzNjApOwoKICAgIC8vIHdpbmRvdwogICAgY3R4LmZpbGxTdHlsZSA9ICIjMjAzMDUwIjsKICAgIGN0eC5maWxsUmVjdCg1MjAsIDYwLCAyNDAsIDE2MCk7CiAgICBjdHguc3Ryb2tlU3R5bGUgPSAiIzhhNmE0MCI7CiAgICBjdHgubGluZVdpZHRoID0gODsKICAgIGN0eC5zdHJva2VSZWN0KDUyMCwgNjAsIDI0MCwgMTYwKTsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIGN0eC5tb3ZlVG8oNjQwLCA2MCk7IGN0eC5saW5lVG8oNjQwLCAyMjApOwogICAgY3R4Lm1vdmVUbyg1MjAsIDE0MCk7IGN0eC5saW5lVG8oNzYwLCAxNDApOwogICAgY3R4LnN0cm9rZSgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyMjAsMTQwLDAuMTUpIjsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIGN0eC5hcmMoNjQwLCAxMjAsIDI4LCAwLCBNYXRoLlBJICogMik7CiAgICBjdHguZmlsbCgpOwoKICAgIC8vIGhlYWRib2FyZCBhcnQKICAgIGlmICghZHJhd0ltZygiaGVhZGJvYXJkIiwgVyAvIDIsIDQwMCwgNDIwLCAyMDAsIGZhbHNlKSkgewogICAgICBjdHguZmlsbFN0eWxlID0gIiMzYTI4MTgiOwogICAgICBjdHguZmlsbFJlY3QoMjIwLCAzMDAsIDg0MCwgNzApOwogICAgfQoKICAgIC8vIHNoZWx2ZXMKICAgIGRyYXdJbWcoInNoZWxmIiwgMTIwLCAyNjgsIDIwMCwgNDAsIGZhbHNlKTsKICAgIGRyYXdJbWcoInNoZWxmIiwgMTE2MCwgMjY4LCAyMDAsIDQwLCBmYWxzZSk7CiAgICBjdHguZmlsbFN0eWxlID0gIiM1YTNhMjIiOwogICAgY3R4LmZpbGxSZWN0KDQwLCAyNTAsIDE2MCwgMTgpOwogICAgY3R4LmZpbGxSZWN0KDEwODAsIDI1MCwgMTYwLCAxOCk7CgogICAgLy8gbWF0dHJlc3MgLyBkdXZldAogICAgY3R4LmZpbGxTdHlsZSA9ICIjNmE0YTM4IjsKICAgIGN0eC5maWxsUmVjdCgxODAsIDQ3MCwgOTIwLCAxNzApOwogICAgaWYgKCFkcmF3SW1nKCJkdXZldCIsIFcgLyAyLCA1NjAsIDcwMCwgMTYwLCBmYWxzZSkpIHsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZDhjNGEwIjsKICAgICAgY3R4LmZpbGxSZWN0KDIyMCwgNDkwLCA4NDAsIDEyMCk7CiAgICB9CiAgICBkcmF3SW1nKCJwaWxsb3dfdXAiLCAzMDAsIDQ3MCwgMTEwLCA4MCwgZmFsc2UpOwogICAgZHJhd0ltZygicGlsbG93X2ZsYXQiLCA0MjAsIDQ3NSwgMTIwLCA1NSwgZmFsc2UpOwogICAgZHJhd0ltZygicGlsbG93X2ZsYXQiLCA4NjAsIDQ3NSwgMTIwLCA1NSwgdHJ1ZSk7CiAgICBkcmF3SW1nKCJwaWxsb3dfdXAiLCA5ODAsIDQ3MCwgMTEwLCA4MCwgdHJ1ZSk7CiAgICBkcmF3SW1nKCJjdXNoaW9uIiwgVyAvIDIsIDYyMCwgMTYwLCA3MCwgZmFsc2UpOwoKICAgIC8vIGZsb29yIHJ1ZyBoaW50CiAgICBjdHguZmlsbFN0eWxlID0gIiM0YTMwMjAiOwogICAgY3R4LmZpbGxSZWN0KDAsIDY0MCwgVywgODApOwogIH0KCiAgZnVuY3Rpb24gZHJhd1pvbmVzKCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgeiA9IHpvbmVzW2ldOwogICAgICB2YXIgb3duZXIgPSB6b25lT3duZXJbei5yb3ddW3ouY29sXTsKICAgICAgaWYgKG93bmVyID09PSAwKSBjdHguZmlsbFN0eWxlID0gInJnYmEoODAsMTQwLDI1NSwwLjIyKSI7CiAgICAgIGVsc2UgaWYgKG93bmVyID09PSAxKSBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDE0MCw2MCwwLjIyKSI7CiAgICAgIGVsc2UgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LDAuMDUpIjsKICAgICAgY3R4LmZpbGxSZWN0KHoueCwgei55LCB6LncsIHouaCk7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDI1NSwyMzAsMTgwLDAuMjUpIjsKICAgICAgY3R4LnN0cm9rZVJlY3Qoei54ICsgMSwgei55ICsgMSwgei53IC0gMiwgei5oIC0gMik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjQwLDIwMCwwLjU1KSI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgMTJweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoU3RyaW5nKHoucHRzKSwgei54ICsgOCwgei55ICsgMTYpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcG9zZU5hbWUocGwpIHsKICAgIHZhciBwcmVmaXggPSBwbC5pZCA9PT0gMCA\/ICJtZW93XyIgOiAic2lyXyI7CiAgICBpZiAocGwucG9zZSA9PT0gImFpbSIpIHJldHVybiBwcmVmaXggKyAiYWltIjsKICAgIGlmIChwbC5wb3NlID09PSAidGhyb3ciKSByZXR1cm4gcHJlZml4ICsgInRocm93IjsKICAgIHJldHVybiBwcmVmaXggKyAiaWRsZSI7CiAgfQoKICBmdW5jdGlvbiBkcmF3UGxheWVycygpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGxheWVycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGwgPSBwbGF5ZXJzW2ldOwogICAgICBpZiAocGwuZmxhc2ggPiAwKSBjdHguZ2xvYmFsQWxwaGEgPSAwLjUgKyAwLjUgKiBNYXRoLmFicyhNYXRoLnNpbihwbC5mbGFzaCAqIDMwKSk7CiAgICAgIHZhciBmbGlwID0gcGwuZmFjaW5nIDwgMDsKICAgICAgaWYgKCFkcmF3SW1nKHBvc2VOYW1lKHBsKSwgcGwueCwgcGwueSwgcGwudywgcGwuaCwgZmxpcCkpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gcGwuaWQgPT09IDAgPyAiIzIyMiIgOiAiI2QwODA0MCI7CiAgICAgICAgY3R4LmZpbGxSZWN0KHBsLnggLSAzMCwgcGwueSAtIDgwLCA2MCwgODApOwogICAgICB9CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBob2dTcHJpdGUoKSB7CiAgICB2YXIgcCA9IGJlZEhvZy5wb3NlOwogICAgaWYgKHAgPT09ICJ3YWtlIikgcmV0dXJuICJiZWRob2dfd2FrZSI7CiAgICBpZiAocCA9PT0gInN0YWxrIikgcmV0dXJuICJiZWRob2dfc3RhbGsiOwogICAgaWYgKHAgPT09ICJsdW5nZSIpIHJldHVybiAiYmVkaG9nX2x1bmdlIjsKICAgIGlmIChwID09PSAiY2hhcmdlIikgcmV0dXJuICJiZWRob2dfY2hhcmdlIjsKICAgIGlmIChwID09PSAicG91bmNlIikgcmV0dXJuICJiZWRob2dfcG91bmNlIjsKICAgIHJldHVybiAiYmVkaG9nX3NsZWVwIjsKICB9CgogIGZ1bmN0aW9uIGRyYXdIb2coKSB7CiAgICB2YXIgbmFtZSA9IGhvZ1Nwcml0ZSgpOwogICAgdmFyIGZsaXAgPSBiZWRIb2cudGFyZ2V0WCA8IGJlZEhvZy54OwogICAgaWYgKCFkcmF3SW1nKG5hbWUsIGJlZEhvZy54LCBiZWRIb2cueSwgYmVkSG9nLncsIGJlZEhvZy5oLCBmbGlwKSkgewogICAgICBjdHguZmlsbFN0eWxlID0gIiM4ODgiOwogICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgIGN0eC5lbGxpcHNlKGJlZEhvZy54LCBiZWRIb2cueSAtIDMwLCA1MCwgMzAsIDAsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgY3R4LmZpbGwoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRyYXdQcm9qZWN0aWxlKCkgewogICAgaWYgKCFwcm9qZWN0aWxlIHx8ICghcHJvamVjdGlsZS5hbGl2ZSAmJiBzdGF0ZSAhPT0gInJlYWN0aW9uIikpIHsKICAgICAgaWYgKCEocHJvamVjdGlsZSAmJiBzdGF0ZSA9PT0gInJlYWN0aW9uIikpIHJldHVybjsKICAgIH0KICAgIHZhciBwID0gcHJvamVjdGlsZTsKICAgIHZhciBtYXAgPSB7IHdhbmQ6ICJmZWF0aGVyX3dhbmQiLCBsYXNlcjogImxhc2VyX3BlbiIsIG1vdXNlOiAic3F1ZWFreV9tb3VzZSIsIGJpcmQ6ICJ0b3lfYmlyZCIgfTsKICAgIHZhciBzcHIgPSBtYXBbcC53ZWFwb24uaWRdOwogICAgY3R4LnNhdmUoKTsKICAgIGN0eC50cmFuc2xhdGUocC54LCBwLnkpOwogICAgY3R4LnJvdGF0ZShwLnNwaW4pOwogICAgaWYgKCFkcmF3SW1nKHNwciwgMCwgMjAsIDQ4LCA0OCwgZmFsc2UpKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBwLndlYXBvbi5jb2xvcjsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHguYXJjKDAsIDAsIHAuciwgMCwgTWF0aC5QSSAqIDIpOwogICAgICBjdHguZmlsbCgpOwogICAgfQogICAgY3R4LnJlc3RvcmUoKTsKICAgIGlmIChwLndlYXBvbi5pZCA9PT0gImxhc2VyIikgewogICAgICBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsNDAsNjAsMC43KSI7CiAgICAgIGN0eC5saW5lV2lkdGggPSAyOwogICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgIGN0eC5tb3ZlVG8ocC54IC0gcC52eCAqIDAuMDUsIHAueSAtIHAudnkgKiAwLjA1KTsKICAgICAgY3R4LmxpbmVUbyhwLngsIHAueSk7CiAgICAgIGN0eC5zdHJva2UoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBvd2VyQ29sb3IocCkgewogICAgdmFyIHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwKSk7CiAgICBpZiAodCA8IDAuNSkgewogICAgICB2YXIgdSA9IHQgLyAwLjU7CiAgICAgIHJldHVybiAicmdiKCIgKyBNYXRoLnJvdW5kKDgwICsgdSAqIDE3NSkgKyAiLCIgKyBNYXRoLnJvdW5kKDIwMCAtIHUgKiA0MCkgKyAiLDYwKSI7CiAgICB9CiAgICB2YXIgdiA9ICh0IC0gMC41KSAvIDAuNTsKICAgIHJldHVybiAicmdiKDI1NSwiICsgTWF0aC5yb3VuZCgxNjAgLSB2ICogMTIwKSArICIsNTApIjsKICB9CgogIGZ1bmN0aW9uIGRyYXdQb3dlck1ldGVyKG94LCBveSkgewogICAgdmFyIGJhclcgPSAxNjA7CiAgICB2YXIgYmFySCA9IDE4OwogICAgdmFyIGJ4ID0gb3ggLSBiYXJXIC8gMjsKICAgIHZhciBieSA9IG95IC0gMTAwOwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDIwLDEwLDUsMC43NSkiOwogICAgY3R4LmZpbGxSZWN0KGJ4IC0gNiwgYnkgLSAyMiwgYmFyVyArIDEyLCBiYXJIICsgMzQpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZlOGMwIjsKICAgIGN0eC5mb250ID0gImJvbGQgMTNweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgY3R4LmZpbGxUZXh0KCJQT1dFUiAiICsgTWF0aC5yb3VuZChwb3dlciAqIDEwMCkgKyAiJSIsIG94LCBieSAtIDYpOwogICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgIGN0eC5maWxsU3R5bGUgPSAiIzJhMTgxMCI7CiAgICBjdHguZmlsbFJlY3QoYngsIGJ5LCBiYXJXLCBiYXJIKTsKICAgIHZhciBmaWxsID0gTWF0aC5tYXgoMC4wMiwgcG93ZXIpICogYmFyVzsKICAgIHZhciBncmFkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KGJ4LCBieSwgYnggKyBiYXJXLCBieSk7CiAgICBncmFkLmFkZENvbG9yU3RvcCgwLCAiIzY2Y2M0NCIpOwogICAgZ3JhZC5hZGRDb2xvclN0b3AoMC40NSwgIiNmZmNjNDQiKTsKICAgIGdyYWQuYWRkQ29sb3JTdG9wKDAuNzUsICIjZmY4ODIyIik7CiAgICBncmFkLmFkZENvbG9yU3RvcCgxLCAiI2ZmMzM0NCIpOwogICAgY3R4LmZpbGxTdHlsZSA9IGdyYWQ7CiAgICBjdHguZmlsbFJlY3QoYngsIGJ5LCBmaWxsLCBiYXJIKTsKICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjZTBiMDcwIjsKICAgIGN0eC5saW5lV2lkdGggPSAyOwogICAgY3R4LnN0cm9rZVJlY3QoYngsIGJ5LCBiYXJXLCBiYXJIKTsKICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LDAuMzUpIjsKICAgIGZvciAodmFyIHQgPSAwLjI1OyB0IDwgMTsgdCArPSAwLjI1KSB7CiAgICAgIHZhciB0eCA9IGJ4ICsgYmFyVyAqIHQ7CiAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgY3R4Lm1vdmVUbyh0eCwgYnkpOwogICAgICBjdHgubGluZVRvKHR4LCBieSArIGJhckgpOwogICAgICBjdHguc3Ryb2tlKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3QWltKCkgewogICAgaWYgKHN0YXRlICE9PSAiYWltIiAmJiBzdGF0ZSAhPT0gImNoYXJnZSIgJiYgc3RhdGUgIT09ICJzZWxlY3QiKSByZXR1cm47CiAgICBpZiAoIXBsYXllcnNbY3VycmVudF0pIHJldHVybjsKICAgIHZhciBwbCA9IHBsYXllcnNbY3VycmVudF07CiAgICB2YXIgcmFkID0gZGVnMnJhZChhbmdsZSk7CiAgICB2YXIgb3ggPSBwbC54ICsgcGwuZmFjaW5nICogMzY7CiAgICB2YXIgb3kgPSBwbC55IC0gcGwuaCAqIDAuNTU7CgogICAgaWYgKHN0YXRlID09PSAiYWltIiB8fCBzdGF0ZSA9PT0gImNoYXJnZSIgfHwgZHJhZ0FpbSkgewogICAgICBkcmF3UG93ZXJNZXRlcihveCwgb3kpOwogICAgfQoKICAgIGlmIChkcmFnQWltKSB7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDI1NSwxODAsMTAwLDAuNykiOwogICAgICBjdHgubGluZVdpZHRoID0gMjsKICAgICAgY3R4LnNldExpbmVEYXNoKFs1LCA1XSk7CiAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgY3R4Lm1vdmVUbyhveCwgb3kpOwogICAgICBjdHgubGluZVRvKGRyYWdDdXJYLCBkcmFnQ3VyWSk7CiAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgY3R4LnNldExpbmVEYXNoKFtdKTsKICAgIH0KCiAgICB2YXIgbGVuID0gNzAgKyBwb3dlciAqIDkwOwogICAgdmFyIGV4ID0gb3ggKyBNYXRoLmNvcyhyYWQpICogbGVuOwogICAgdmFyIGV5ID0gb3kgLSBNYXRoLnNpbihyYWQpICogbGVuOwogICAgY3R4LnN0cm9rZVN0eWxlID0gcG93ZXJDb2xvcihwb3dlcik7CiAgICBjdHgubGluZVdpZHRoID0gNDsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIGN0eC5tb3ZlVG8ob3gsIG95KTsKICAgIGN0eC5saW5lVG8oZXgsIGV5KTsKICAgIGN0eC5zdHJva2UoKTsKICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjBjMCI7CiAgICBjdHguYmVnaW5QYXRoKCk7CiAgICBjdHguYXJjKGV4LCBleSwgNSwgMCwgTWF0aC5QSSAqIDIpOwogICAgY3R4LmZpbGwoKTsKCiAgICB2YXIgd3BuID0gY3VycmVudFdlYXBvbigpOwogICAgdmFyIHNwZCA9IHdwbi5zcGVlZCAqICgwLjM1ICsgcG93ZXIgKiAwLjkpOwogICAgdmFyIHZ4ID0gTWF0aC5jb3MocmFkKSAqIHNwZDsKICAgIHZhciB2eSA9IC1NYXRoLnNpbihyYWQpICogc3BkOwogICAgdmFyIHggPSBveCwgeSA9IG95OwogICAgY3R4LnN0cm9rZVN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsMC40NSkiOwogICAgY3R4LmxpbmVXaWR0aCA9IDI7CiAgICBjdHguc2V0TGluZURhc2goWzMsIDddKTsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIGN0eC5tb3ZlVG8oeCwgeSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICB2eCArPSB3aW5kICogMC4wMTI7CiAgICAgIHZ4ICo9IDEgLSB3cG4uZHJhZyAqIDAuMDEyOwogICAgICB2eSAqPSAxIC0gd3BuLmRyYWcgKiAwLjAwNTsKICAgICAgdnkgKz0gR1JBVklUWSAqIHdwbi5tYXNzICogMC4wMTI7CiAgICAgIHggKz0gdnggKiAwLjAxMjsKICAgICAgeSArPSB2eSAqIDAuMDEyOwogICAgICBjdHgubGluZVRvKHgsIHkpOwogICAgfQogICAgY3R4LnN0cm9rZSgpOwogICAgY3R4LnNldExpbmVEYXNoKFtdKTsKCiAgICBjdHguZmlsbFN0eWxlID0gIiNmZmU4YzAiOwogICAgY3R4LmZvbnQgPSAiYm9sZCAxMnB4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICBjdHguZmlsbFRleHQoTWF0aC5yb3VuZChhbmdsZSkgKyAiIGRlZyIsIG94ICsgMTAsIG95IC0gMTIpOwogIH0KCiAgZnVuY3Rpb24gZHJhd0hVRCgpIHsKICAgIC8vIHNjb3JlIGJhbm5lciBhcmVhCiAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjAsMTIsOCwwLjcyKSI7CiAgICBjdHguZmlsbFJlY3QoMjAsIDEyLCA0MjAsIDc4KTsKICAgIGN0eC5maWxsUmVjdChXIC0gNDQwLCAxMiwgNDIwLCA3OCk7CiAgICBjdHguZmlsbFJlY3QoVyAvIDIgLSAxNTAsIDEyLCAzMDAsIDU0KTsKCiAgICBkcmF3SW1nKCJtZW93X3BvcnRyYWl0IiwgNTUsIDcyLCA1NCwgNTQsIGZhbHNlKTsKICAgIGRyYXdJbWcoInNpcl9wb3J0cmFpdCIsIFcgLSA1NSwgNzIsIDU0LCA1NCwgZmFsc2UpOwoKICAgIGN0eC5maWxsU3R5bGUgPSAiIzllYzhmZiI7CiAgICBjdHguZm9udCA9ICJib2xkIDE2cHggVHJlYnVjaGV0IE1TLCBzYW5zLXNlcmlmIjsKICAgIGN0eC5maWxsVGV4dCgiTWVvdy1wb2xlb24iLCA5MiwgMzYpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZiMDcwIjsKICAgIGN0eC5maWxsVGV4dCgiU2lyIFB1cnItY2V2YWwiLCBXIC0gMzAwLCAzNik7CgogICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmNmU4IjsKICAgIGN0eC5mb250ID0gImJvbGQgMjJweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgY3R4LmZpbGxUZXh0KFN0cmluZyhzY29yZXNbMF0pLCA5MiwgNjQpOwogICAgY3R4LmZpbGxUZXh0KFN0cmluZyhzY29yZXNbMV0pLCBXIC0gMzAwLCA2NCk7CgogICAgLy8gSFAgYmFycwogICAgZnVuY3Rpb24gaHBCYXIoeCwgeSwgaHAsIGNvbCkgewogICAgICBjdHguZmlsbFN0eWxlID0gIiMyYTE4MTAiOwogICAgICBjdHguZmlsbFJlY3QoeCwgeSwgMTYwLCAxMik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2w7CiAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCAxNjAgKiAoaHAgLyBNQVhfSFApLCAxMik7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjYzhhMDcwIjsKICAgICAgY3R4LnN0cm9rZVJlY3QoeCwgeSwgMTYwLCAxMik7CiAgICB9CiAgICBocEJhcig5MiwgNzIsIHBsYXllcnNbMF0gPyBwbGF5ZXJzWzBdLmhwIDogTUFYX0hQLCAiIzY2YWFmZiIpOwogICAgaHBCYXIoVyAtIDMwMCwgNzIsIHBsYXllcnNbMV0gPyBwbGF5ZXJzWzFdLmhwIDogTUFYX0hQLCAiI2ZmOTk2NiIpOwoKICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZTA4YSI7CiAgICBjdHguZm9udCA9ICJib2xkIDE1cHggVHJlYnVjaGV0IE1TLCBzYW5zLXNlcmlmIjsKICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgIGN0eC5maWxsVGV4dCgiRmlyc3QgdG8gIiArIFdJTl9TQ09SRSwgVyAvIDIsIDM0KTsKICAgIGN0eC5maWxsU3R5bGUgPSAiI2RkZCI7CiAgICBjdHguZm9udCA9ICIxM3B4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICB2YXIgd2xhYmVsID0gd2luZCA+PSAwID8gKCJXaW5kICIgKyBNYXRoLnJvdW5kKE1hdGguYWJzKHdpbmQpKSArICIgPiIpIDogKCI8IFdpbmQgIiArIE1hdGgucm91bmQoTWF0aC5hYnMod2luZCkpKTsKICAgIGN0eC5maWxsVGV4dCh3bGFiZWwsIFcgLyAyLCA1NCk7CiAgICBjdHgudGV4dEFsaWduID0gImxlZnQiOwoKICAgIC8vIHR1cm4gKyB3ZWFwb24KICAgIGlmIChzdGF0ZSAhPT0gInRpdGxlIikgewogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjAsMTIsOCwwLjcpIjsKICAgICAgY3R4LmZpbGxSZWN0KDIwLCBIIC0gNzAsIFcgLSA0MCwgNTQpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmQwODAiOwogICAgICBjdHguZm9udCA9ICJib2xkIDE2cHggVHJlYnVjaGV0IE1TLCBzYW5zLXNlcmlmIjsKICAgICAgdmFyIHdobyA9IHBsYXllcnNbY3VycmVudF0gPyBwbGF5ZXJzW2N1cnJlbnRdLm5hbWUgOiAiIjsKICAgICAgY3R4LmZpbGxUZXh0KCJUdXJuOiAiICsgd2hvICsgIiAgIFRveTogIiArIGN1cnJlbnRXZWFwb24oKS5uYW1lICsgIiAgIFJvdW5kICIgKyByb3VuZE51bSwgMzYsIEggLSA0Mik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2M4YjA5MCI7CiAgICAgIGN0eC5mb250ID0gIjEycHggVHJlYnVjaGV0IE1TLCBzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KHRvdWNoTW9kZSA\/ICJUYXAgYSB0b3ksIHRoZW4gZHJhZyBiYWNrIGZyb20geW91ciBjYXQgYW5kIHJlbGVhc2UgdG8gdGhyb3ciIDogIktleXMgMS00IHRveXMgfCBBcnJvd3MgYWltIHwgSG9sZCBTcGFjZSBjaGFyZ2UgfCBPciBkcmFnIGJhY2sgdG8gYWltIGFuZCByZWxlYXNlIiwgMzYsIEggLSAyMik7CiAgICAgIGlmICh0dXJuTXNnVCA+IDApIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmYwYzAiOwogICAgICAgIGN0eC5mb250ID0gImJvbGQgMThweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgICBjdHguZmlsbFRleHQodHVybk1zZywgVyAvIDIsIDExMCk7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgfQogICAgICBpZiAoc3RhdGUgPT09ICJyZWFjdGlvbiIgJiYgcmVhY3Rpb25UZXh0KSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZThmZmM4IjsKICAgICAgICBjdHguZm9udCA9ICJib2xkIDIwcHggVHJlYnVjaGV0IE1TLCBzYW5zLXNlcmlmIjsKICAgICAgICBjdHgudGV4dEFsaWduID0gImNlbnRlciI7CiAgICAgICAgY3R4LmZpbGxUZXh0KHJlYWN0aW9uVGV4dCwgVyAvIDIsIDE1MCk7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgfQogICAgfQoKICAgIC8vIHdlYXBvbiBzZWxlY3QgaGlnaGxpZ2h0CiAgICBpZiAoc3RhdGUgPT09ICJzZWxlY3QiIHx8IHN0YXRlID09PSAiYWltIiB8fCBzdGF0ZSA9PT0gImNoYXJnZSIpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBXRUFQT05TLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHd4ID0gMzYwICsgaSAqIDE0MDsKICAgICAgICB2YXIgd3kgPSBIIC0gMTIwOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBpID09PSB3ZWFwb25JZHggPyAicmdiYSgyMjQsMTIyLDUwLDAuODUpIiA6ICJyZ2JhKDQwLDI0LDE2LDAuNzUpIjsKICAgICAgICBjdHguZmlsbFJlY3Qod3gsIHd5LCAxMjgsIDM2KTsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAiI2UwYjA3MCI7CiAgICAgICAgY3R4LnN0cm9rZVJlY3Qod3gsIHd5LCAxMjgsIDM2KTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY2ZTgiOwogICAgICAgIGN0eC5mb250ID0gImJvbGQgMTJweCBUcmVidWNoZXQgTVMsIHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC5maWxsVGV4dCgoaSArIDEpICsgIiAiICsgV0VBUE9OU1tpXS5uYW1lLnJlcGxhY2UoIkZlYXRoZXIgIiwgIiIpLnJlcGxhY2UoIlNxdWVha3kgIiwgIiIpLnJlcGxhY2UoIlRveSAiLCAiIiksIHd4ICsgOCwgd3kgKyAyMik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRyYXdQYXJ0aWNsZXMoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRpY2xlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcHQgPSBwYXJ0aWNsZXNbaV07CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIDEgLSBwdC50IC8gcHQubGlmZSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBwdC5jb2xvcjsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHguYXJjKHB0LngsIHB0LnksIHB0LnIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgY3R4LmZpbGwoKTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgIH0KICAgIGZvciAodmFyIGYgPSAwOyBmIDwgZmxvYXRlcnMubGVuZ3RoOyBmKyspIHsKICAgICAgdmFyIGZsID0gZmxvYXRlcnNbZl07CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIDEgLSBmbC50IC8gZmwubGlmZSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBmbC5jb2xvcjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAyMnB4IFRyZWJ1Y2hldCBNUywgc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dChmbC50ZXh0LCBmbC54IC0gMjAsIGZsLnkgLSBmbC50ICogNDApOwogICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZHJhdygpIHsKICAgIGRyYXdCYWNrZ3JvdW5kKCk7CiAgICBkcmF3Wm9uZXMoKTsKICAgIGRyYXdIb2coKTsKICAgIGRyYXdQbGF5ZXJzKCk7CiAgICBkcmF3QWltKCk7CiAgICBkcmF3UHJvamVjdGlsZSgpOwogICAgZHJhd1BhcnRpY2xlcygpOwogICAgZHJhd0hVRCgpOwogICAgaWYgKHBhdXNlZCkgewogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwwLDAsMC40KSI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmIjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCA0MnB4IEdlb3JnaWEsIHNlcmlmIjsKICAgICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICBjdHguZmlsbFRleHQoIlBhdXNlZCIsIFcgLyAyLCBIIC8gMik7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb29wKHRzKSB7CiAgICBpZiAoIWxhc3RUcykgbGFzdFRzID0gdHM7CiAgICB2YXIgZHQgPSBNYXRoLm1pbigwLjAzMywgKHRzIC0gbGFzdFRzKSAvIDEwMDApOwogICAgbGFzdFRzID0gdHM7CiAgICB1cGRhdGUoZHQpOwogICAgZHJhdygpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogIH0KCiAgZnVuY3Rpb24gZml0KCkgewogICAgY2FudmFzLnN0eWxlLndpZHRoID0gIiI7CiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICB2YXIgYXBwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFwcCIpOwogICAgdmFyIHN0YWdlID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7CiAgICBpZiAoZnNGYWxsYmFjayAmJiBhcHApIHsKICAgICAgdmFyIGF3ID0gd2luZG93LmlubmVyV2lkdGggfHwgVzsKICAgICAgdmFyIGFoID0gd2luZG93LmlubmVySGVpZ2h0IHx8IEg7CiAgICAgIHZhciBzID0gTWF0aC5taW4oYXcgLyBXLCBhaCAvIEgpOwogICAgICB2YXIgY3cgPSBNYXRoLmZsb29yKFcgKiBzKTsKICAgICAgdmFyIGNoID0gTWF0aC5mbG9vcihIICogcyk7CiAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGN3ICsgInB4IjsKICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGNoICsgInB4IjsKICAgICAgaWYgKHN0YWdlKSB7CiAgICAgICAgc3RhZ2Uuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgc3RhZ2Uuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CiAgICAgIHNjYWxlID0gczsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHIgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBpZiAoci53aWR0aCA+IDApIHNjYWxlID0gci53aWR0aCAvIFc7CiAgICBlbHNlIHNjYWxlID0gMTsKICAgIGlmIChzdGFnZSkgc3RhZ2Uuc3R5bGUuaGVpZ2h0ID0gTWF0aC5jZWlsKHIuaGVpZ2h0IHx8IChXICogc2NhbGUgKiA5IC8gMTYpKSArICJweCI7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGxHYW1lSW50b1ZpZXcoKSB7CiAgICB2YXIgYXBwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFwcCIpOwogICAgaWYgKGFwcCAmJiBhcHAuc2Nyb2xsSW50b1ZpZXcpIHsKICAgICAgYXBwLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICJjZW50ZXIiLCBpbmxpbmU6ICJuZWFyZXN0IiwgYmVoYXZpb3I6ICJzbW9vdGgiIH0pOwogICAgfQogICAgZml0KCk7CiAgfQoKICBmdW5jdGlvbiBvbktleShlLCBkb3duKSB7CiAgICBrZXlzW2Uua2V5XSA9IGRvd247CiAgICBpZiAoZG93biAmJiAoZS5rZXkgPT09ICIxIiB8fCBlLmtleSA9PT0gIjIiIHx8IGUua2V5ID09PSAiMyIgfHwgZS5rZXkgPT09ICI0IikpIHsKICAgICAgaWYgKHN0YXRlID09PSAic2VsZWN0IiB8fCBzdGF0ZSA9PT0gImFpbSIpIHsKICAgICAgICB3ZWFwb25JZHggPSBwYXJzZUludChlLmtleSwgMTApIC0gMTsKICAgICAgICBiZWVwKDQwMCArIHdlYXBvbklkeCAqIDgwLCAwLjA1LCAic3F1YXJlIiwgMC4wNik7CiAgICAgIH0KICAgIH0KICAgIGlmIChkb3duICYmIGUua2V5ID09PSAiRXNjYXBlIikgewogICAgICBpZiAoc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gInNlbGVjdCIgfHwgc3RhdGUgPT09ICJhaW0iIHx8IHN0YXRlID09PSAiY2hhcmdlIiB8fCBzdGF0ZSA9PT0gImZsaWdodCIgfHwgc3RhdGUgPT09ICJyZWFjdGlvbiIgfHwgc3RhdGUgPT09ICJ0dXJuX3N3YXAiIHx8IHN0YXRlID09PSAicGF1c2UiKSB7CiAgICAgICAgdG9nZ2xlUGF1c2UoKTsKICAgICAgfQogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgICBpZiAoZG93biAmJiAoZS5rZXkgPT09ICIgIiB8fCBlLmtleSA9PT0gIkFycm93TGVmdCIgfHwgZS5rZXkgPT09ICJBcnJvd1JpZ2h0IiB8fCBlLmtleSA9PT0gIkFycm93VXAiIHx8IGUua2V5ID09PSAiQXJyb3dEb3duIikpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlUGF1c2UoKSB7CiAgICBpZiAoc3RhdGUgPT09ICJ0aXRsZSIgfHwgc3RhdGUgPT09ICJ3aW4iKSByZXR1cm47CiAgICBwYXVzZWQgPSAhcGF1c2VkOwogICAgaWYgKHBhdXNlZCkgewogICAgICBlbmRUaXRsZS50ZXh0Q29udGVudCA9ICJQYXVzZWQiOwogICAgICBlbmRNc2cudGV4dENvbnRlbnQgPSAiUHJlc3MgRXNjIG9yIHRhcCBQbGF5IGFnYWluIHRvIGNvbnRpbnVlLiI7CiAgICAgIGVuZENhcmQuaGlkZGVuID0gZmFsc2U7CiAgICAgIHRpdGxlQ2FyZC5oaWRkZW4gPSB0cnVlOwogICAgICBvdmVybGF5LmhpZGRlbiA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgb3ZlcmxheS5oaWRkZW4gPSB0cnVlOwogICAgICBlbmRDYXJkLmhpZGRlbiA9IHRydWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBiaW5kUGFkKGlkLCBuYW1lLCBvbkRvd24sIG9uVXApIHsKICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIGlmICghZWwpIHJldHVybjsKICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uIChldikgewogICAgICB0b3VjaE1vZGUgPSB0cnVlOwogICAgICBzaG93UGFkcygpOwogICAgICBwYWRzSGVsZFtuYW1lXSA9IHRydWU7CiAgICAgIGlmIChvbkRvd24pIG9uRG93bigpOwogICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgfTsKICAgIHZhciBlbmQgPSBmdW5jdGlvbiAoZXYpIHsKICAgICAgcGFkc0hlbGRbbmFtZV0gPSBmYWxzZTsKICAgICAgaWYgKG9uVXApIG9uVXAoKTsKICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgIH07CiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIHN0YXJ0KTsKICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIGVuZCk7CiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLCBlbmQpOwogICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIGVuZCk7CiAgfQoKICBmdW5jdGlvbiBzaG93UGFkcygpIHsKICAgIGlmICghcGFkcykgcmV0dXJuOwogICAgcGFkcy5oaWRkZW4gPSBmYWxzZTsKICAgIHBhZHMuY2xhc3NMaXN0LmFkZCgidG91Y2gtb24iKTsKICAgIHBhZHMuY2xhc3NMaXN0LmFkZCgidG95cy1vbmx5Iik7CiAgfQoKICBmdW5jdGlvbiBtYXliZVRvdWNoKCkgewogICAgaWYgKGlzQ29hcnNlKCkpIHsKICAgICAgdG91Y2hNb2RlID0gdHJ1ZTsKICAgICAgc2hvd1BhZHMoKTsKICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZnVuY3Rpb24gKCkgewogICAgICB0b3VjaE1vZGUgPSB0cnVlOwogICAgICBzaG93UGFkcygpOwogICAgfSwgeyBvbmNlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRGcm9tVGl0bGUoKSB7CiAgICBlbnN1cmVBdWRpbygpOwogICAgaWYgKGF1ZGlvQ3R4ICYmIGF1ZGlvQ3R4LnN0YXRlID09PSAic3VzcGVuZGVkIikgYXVkaW9DdHgucmVzdW1lKCk7CiAgICByZXNldE1hdGNoKCk7CiAgICBzY3JvbGxHYW1lSW50b1ZpZXcoKTsKICAgIGlmICh0b3VjaE1vZGUgfHwgaXNDb2Fyc2UoKSkgewogICAgICBlbnRlck1vYmlsZVBsYXlDaHJvbWUoKTsKICAgIH0KICB9CgogIHN0YXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKCFyZWFkeSkgcmV0dXJuOwogICAgc3RhcnRGcm9tVGl0bGUoKTsKICB9KTsKICBhZ2FpbkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdG9nZ2xlUGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhcnRGcm9tVGl0bGUoKTsKICB9KTsKCiAgYmluZFBhZCgicGFkLXcxIiwgIncxIiwgZnVuY3Rpb24gKCkgeyBpZiAoc3RhdGUgPT09ICJzZWxlY3QiIHx8IHN0YXRlID09PSAiYWltIiB8fCBzdGF0ZSA9PT0gImNoYXJnZSIpIHdlYXBvbklkeCA9IDA7IH0pOwogIGJpbmRQYWQoInBhZC13MiIsICJ3MiIsIGZ1bmN0aW9uICgpIHsgaWYgKHN0YXRlID09PSAic2VsZWN0IiB8fCBzdGF0ZSA9PT0gImFpbSIgfHwgc3RhdGUgPT09ICJjaGFyZ2UiKSB3ZWFwb25JZHggPSAxOyB9KTsKICBiaW5kUGFkKCJwYWQtdzMiLCAidzMiLCBmdW5jdGlvbiAoKSB7IGlmIChzdGF0ZSA9PT0gInNlbGVjdCIgfHwgc3RhdGUgPT09ICJhaW0iIHx8IHN0YXRlID09PSAiY2hhcmdlIikgd2VhcG9uSWR4ID0gMjsgfSk7CiAgYmluZFBhZCgicGFkLXc0IiwgInc0IiwgZnVuY3Rpb24gKCkgeyBpZiAoc3RhdGUgPT09ICJzZWxlY3QiIHx8IHN0YXRlID09PSAiYWltIiB8fCBzdGF0ZSA9PT0gImNoYXJnZSIpIHdlYXBvbklkeCA9IDM7IH0pOwogIGJpbmRQYWQoInBhZC1wYXVzZSIsICJwYXVzZSIsIGZ1bmN0aW9uICgpIHsgdG9nZ2xlUGF1c2UoKTsgfSk7CgogIHJvdGF0ZUhpbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyb3RhdGUtaGludCIpOwogIGV4aXRGc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJleGl0LWZzIik7CiAgaWYgKGV4aXRGc0J0bikgewogICAgZXhpdEZzQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGV2KSB7CiAgICAgIGV4aXRNb2JpbGVQbGF5Q2hyb21lKCk7CiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICB9KTsKICB9CgogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9uUG9pbnRlckRvd24sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25Qb2ludGVyTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25Qb2ludGVyVXAsIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLCBvblBvaW50ZXJVcCwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgZnVuY3Rpb24gKGUpIHsgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOyB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoKGZzRmFsbGJhY2sgfHwgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQpICYmIGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CgogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsgb25LZXkoZSwgdHJ1ZSk7IH0pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7IG9uS2V5KGUsIGZhbHNlKTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZ1bmN0aW9uICgpIHsgZml0KCk7IHVwZGF0ZVJvdGF0ZUhpbnQoKTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwgZnVuY3Rpb24gKCkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZml0KCk7IHVwZGF0ZVJvdGF0ZUhpbnQoKTsgfSwgMjAwKTsgfSk7CiAgbWF5YmVUb3VjaCgpOwoKICBmdW5jdGlvbiBjYW52YXNQb3MoZSkgewogICAgdmFyIHIgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgY3ggPSBlLmNsaWVudFg7CiAgICB2YXIgY3kgPSBlLmNsaWVudFk7CiAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSB7CiAgICAgIGN4ID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgICBjeSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTsKICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgewogICAgICBjeCA9IGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBjeSA9IGUudG91Y2hlc1swXS5jbGllbnRZOwogICAgfQogICAgdmFyIHJ3ID0gci53aWR0aCB8fCAxOwogICAgdmFyIHJoID0gci5oZWlnaHQgfHwgMTsKICAgIHJldHVybiB7IHg6IChjeCAtIHIubGVmdCkgLyBydyAqIFcsIHk6IChjeSAtIHIudG9wKSAvIHJoICogSCB9OwogIH0KCiAgZnVuY3Rpb24gY2FuQWltTm93KCkgewogICAgcmV0dXJuICFwYXVzZWQgJiYgKHN0YXRlID09PSAic2VsZWN0IiB8fCBzdGF0ZSA9PT0gImFpbSIgfHwgc3RhdGUgPT09ICJjaGFyZ2UiKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5RHJhZ0FpbShteCwgbXkpIHsKICAgIGlmICghcGxheWVyc1tjdXJyZW50XSkgcmV0dXJuOwogICAgdmFyIHBsID0gcGxheWVyc1tjdXJyZW50XTsKICAgIHZhciBveCA9IHBsLnggKyBwbC5mYWNpbmcgKiAzNjsKICAgIHZhciBveSA9IHBsLnkgLSBwbC5oICogMC41NTsKICAgIGRyYWdDdXJYID0gbXg7CiAgICBkcmFnQ3VyWSA9IG15OwogICAgdmFyIGR4ID0gb3ggLSBteDsKICAgIHZhciBkeSA9IG95IC0gbXk7CiAgICB2YXIgZGlzdCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CiAgICBwb3dlciA9IE1hdGgubWF4KDAuMDgsIE1hdGgubWluKDEsIGRpc3QgLyBNQVhfRFJBRykpOwogICAgdmFyIGFuZyA9IE1hdGguYXRhbjIoLWR5LCBkeCkgKiAxODAgLyBNYXRoLlBJOwogICAgaWYgKGFuZyA8IDApIGFuZyArPSAzNjA7CiAgICBpZiAoYW5nID4gMTgwKSBhbmcgPSAxODAgLSAoYW5nIC0gMTgwKTsKICAgIGFuZ2xlID0gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE3MCwgYW5nKSk7CiAgICBwbGF5ZXJzW2N1cnJlbnRdLnBvc2UgPSAiYWltIjsKICB9CgogIGZ1bmN0aW9uIG9uUG9pbnRlckRvd24oZSkgewogICAgaWYgKCFjYW5BaW1Ob3coKSkgcmV0dXJuOwogICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgJiYgZS50YXJnZXQuY2xvc2VzdCgiI3BhZHMsICNvdmVybGF5LCAjZXhpdC1mcywgI3JvdGF0ZS1oaW50IikpIHJldHVybjsKICAgIHZhciBwb3MgPSBjYW52YXNQb3MoZSk7CiAgICBkcmFnQWltID0gdHJ1ZTsKICAgIGRyYWdQb2ludGVySWQgPSBlLnBvaW50ZXJJZCAhPSBudWxsID8gZS5wb2ludGVySWQgOiAxOwogICAgZHJhZ09yaWdpblggPSBwb3MueDsKICAgIGRyYWdPcmlnaW5ZID0gcG9zLnk7CiAgICBpZiAoc3RhdGUgPT09ICJzZWxlY3QiKSBzdGFydEFpbSgpOwogICAgc3RhdGUgPSAiY2hhcmdlIjsKICAgIGNoYXJnaW5nID0gdHJ1ZTsKICAgIGNoYXJnZVQgPSAwOwogICAgYXBwbHlEcmFnQWltKHBvcy54LCBwb3MueSk7CiAgICB0cnkgeyBjYW52YXMuc2V0UG9pbnRlckNhcHR1cmUoZHJhZ1BvaW50ZXJJZCk7IH0gY2F0Y2ggKGVycikge30KICAgIGlmIChlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTsKICB9CgogIGZ1bmN0aW9uIG9uUG9pbnRlck1vdmUoZSkgewogICAgaWYgKCFkcmFnQWltKSByZXR1cm47CiAgICBpZiAoZHJhZ1BvaW50ZXJJZCAhPSBudWxsICYmIGUucG9pbnRlcklkICE9IG51bGwgJiYgZS5wb2ludGVySWQgIT09IGRyYWdQb2ludGVySWQpIHJldHVybjsKICAgIHZhciBwb3MgPSBjYW52YXNQb3MoZSk7CiAgICBhcHBseURyYWdBaW0ocG9zLngsIHBvcy55KTsKICAgIGlmIChlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTsKICB9CgogIGZ1bmN0aW9uIG9uUG9pbnRlclVwKGUpIHsKICAgIGlmICghZHJhZ0FpbSkgcmV0dXJuOwogICAgaWYgKGRyYWdQb2ludGVySWQgIT0gbnVsbCAmJiBlLnBvaW50ZXJJZCAhPSBudWxsICYmIGUucG9pbnRlcklkICE9PSBkcmFnUG9pbnRlcklkKSByZXR1cm47CiAgICB2YXIgcG9zID0gY2FudmFzUG9zKGUpOwogICAgYXBwbHlEcmFnQWltKHBvcy54LCBwb3MueSk7CiAgICBkcmFnQWltID0gZmFsc2U7CiAgICBkcmFnUG9pbnRlcklkID0gbnVsbDsKICAgIGNoYXJnaW5nID0gZmFsc2U7CiAgICBpZiAocG93ZXIgPj0gMC4xICYmIChzdGF0ZSA9PT0gImNoYXJnZSIgfHwgc3RhdGUgPT09ICJhaW0iKSkgewogICAgICBmaXJlTm93KCk7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZSA9ICJhaW0iOwogICAgfQogICAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogIH0KCiAgZnVuY3Rpb24gaXNDb2Fyc2UoKSB7CiAgICB0cnkgeyByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwb2ludGVyOiBjb2Fyc2UpIikubWF0Y2hlcyk7IH0KICAgIGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIH0KCiAgZnVuY3Rpb24gaXNQb3J0cmFpdCgpIHsgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoOyB9CgogIGZ1bmN0aW9uIHVwZGF0ZVJvdGF0ZUhpbnQoKSB7CiAgICBpZiAoIXJvdGF0ZUhpbnRFbCkgcmV0dXJuOwogICAgdmFyIHNob3cgPSB0b3VjaE1vZGUgJiYgZnNGYWxsYmFjayAmJiBpc1BvcnRyYWl0KCkgJiYgc3RhdGUgIT09ICJ0aXRsZSI7CiAgICByb3RhdGVIaW50RWwuaGlkZGVuID0gIXNob3c7CiAgfQoKICBmdW5jdGlvbiBlbnRlck1vYmlsZVBsYXlDaHJvbWUoKSB7CiAgICB2YXIgYXBwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFwcCIpOwogICAgaWYgKCFhcHApIHJldHVybjsKICAgIHRvdWNoTW9kZSA9IHRydWU7CiAgICBzaG93UGFkcygpOwogICAgdHJ5IHsKICAgICAgdmFyIHJlcSA9IGFwcC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBhcHAud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4gfHwgYXBwLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuOwogICAgICBpZiAocmVxKSB7IHZhciBwID0gcmVxLmNhbGwoYXBwKTsgaWYgKHAgJiYgcC50aGVuKSBwLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7CiAgICAgIGlmIChzY3JlZW4ub3JpZW50YXRpb24gJiYgc2NyZWVuLm9yaWVudGF0aW9uLmxvY2spIHsKICAgICAgICBzY3JlZW4ub3JpZW50YXRpb24ubG9jaygibGFuZHNjYXBlIikuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9IGNhdGNoIChlMikge30KICAgIGZzRmFsbGJhY2sgPSB0cnVlOwogICAgYXBwLmNsYXNzTGlzdC5hZGQoImZzLWZhbGxiYWNrIik7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibmFwLW5vc2Nyb2xsIik7CiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5hcC1ub3Njcm9sbCIpOwogICAgaWYgKGV4aXRGc0J0bikgZXhpdEZzQnRuLmhpZGRlbiA9IGZhbHNlOwogICAgdXBkYXRlUm90YXRlSGludCgpOwogICAgZml0KCk7CiAgICBzZXRUaW1lb3V0KGZpdCwgMjAwKTsKICAgIHNldFRpbWVvdXQodXBkYXRlUm90YXRlSGludCwgMzAwKTsKICB9CgogIGZ1bmN0aW9uIGV4aXRNb2JpbGVQbGF5Q2hyb21lKCkgewogICAgdmFyIGFwcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcHAiKTsKICAgIHRyeSB7CiAgICAgIGlmIChkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgewogICAgICAgIHZhciBleCA9IGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuOwogICAgICAgIGlmIChleCkgZXguY2FsbChkb2N1bWVudCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHt9CiAgICBmc0ZhbGxiYWNrID0gZmFsc2U7CiAgICBpZiAoYXBwKSBhcHAuY2xhc3NMaXN0LnJlbW92ZSgiZnMtZmFsbGJhY2siKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJuYXAtbm9zY3JvbGwiKTsKICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgibmFwLW5vc2Nyb2xsIik7CiAgICBpZiAoZXhpdEZzQnRuKSBleGl0RnNCdG4uaGlkZGVuID0gdHJ1ZTsKICAgIGlmIChyb3RhdGVIaW50RWwpIHJvdGF0ZUhpbnRFbC5oaWRkZW4gPSB0cnVlOwogICAgZml0KCk7CiAgfQoKCiAgd2luZG93Ll9fTkFQID0gewogICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhdGU6IHN0YXRlLAogICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsCiAgICAgICAgc2NvcmVzOiBzY29yZXMuc2xpY2UoKSwKICAgICAgICBocDogcGxheWVycy5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAuaHA7IH0pLAogICAgICAgIHdlYXBvbjogd2VhcG9uSWR4LAogICAgICAgIGFuZ2xlOiBhbmdsZSwKICAgICAgICBwb3dlcjogcG93ZXIsCiAgICAgICAgZHJhZ0FpbTogZHJhZ0FpbSwKICAgICAgICBoYXNQcm9qZWN0aWxlOiAhIShwcm9qZWN0aWxlICYmIHByb2plY3RpbGUuYWxpdmUpLAogICAgICAgIHByb2plY3RpbGU6IHByb2plY3RpbGUgPyB7IHg6IHByb2plY3RpbGUueCwgeTogcHJvamVjdGlsZS55LCBhbGl2ZTogcHJvamVjdGlsZS5hbGl2ZSwgaGl0Uml2YWw6IHByb2plY3RpbGUuaGl0Uml2YWwsIGJvdW5jZXM6IHByb2plY3RpbGUuYm91bmNlcywgdng6IHByb2plY3RpbGUudngsIHZ5OiBwcm9qZWN0aWxlLnZ5IH0gOiBudWxsLAogICAgICAgIHdpbmQ6IHdpbmQsCiAgICAgICAgcm91bmROdW06IHJvdW5kTnVtLAogICAgICAgIHRvdWNoTW9kZTogdG91Y2hNb2RlLAogICAgICAgIGZzRmFsbGJhY2s6IGZzRmFsbGJhY2sKICAgICAgfTsKICAgIH0KICB9OwoKICBsb2FkQWxsKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICByZWFkeSA9IHRydWU7CiAgICBpZiAobG9hZEVycikgbG9hZEVyci50ZXh0Q29udGVudCA9ICIiOwogICAgbWFrZVRlcnJhaW4oKTsKICAgIC8vIGRyYXcgYSBxdWlldCB0aXRsZSBiYWNrZHJvcCBvbmNlCiAgICBwbGF5ZXJzID0gWwogICAgICBuZXcgUGxheWVyKDAsICJNZW93LXBvbGVvbiIsICJsZWZ0IiwgMTIwLCAyNDgpLAogICAgICBuZXcgUGxheWVyKDEsICJTaXIgUHVyci1jZXZhbCIsICJyaWdodCIsIDExNjAsIDI0OCkKICAgIF07CiAgICBiZWRIb2cgPSBuZXcgQmVkSG9nKCk7CiAgICBmaXQoKTsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAodHMpIHsKICAgICAgZml0KCk7CiAgICAgIGxvb3AodHMpOwogICAgfSk7CiAgICBzZXRUaW1lb3V0KGZpdCwgMTAwKTsKICAgIHNldFRpbWVvdXQoZml0LCA0MDApOwogIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgIGlmIChsb2FkRXJyKSBsb2FkRXJyLnRleHRDb250ZW50ID0gIkNvdWxkIG5vdCBsb2FkIGdhbWUgYXJ0LiBSZWZyZXNoIGFuZCB0cnkgYWdhaW4uIjsKICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICB9KTsKfSkoKTsK\");\n  document.body.appendChild(el);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>X \u21bb Turn your phone sideways Napoleon Wars plays best in landscape. Napoleon Wars: Battle for the Bed Hot-seat artillery duel. Lure the Bed-Hog, claim bed zones, and knock your rival off the mattress. First to 1500 points or zero HP wins. Desktop: 1 to 4 pick a toy. Arrows aim. Hold Space to charge, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-110","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=110"}],"version-history":[{"count":3,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/110\/revisions"}],"predecessor-version":[{"id":119,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/110\/revisions\/119"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}