﻿{"id":337,"date":"2026-10-07T05:13:47","date_gmt":"2026-10-07T05:13:47","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=337"},"modified":"2026-10-07T06:47:19","modified_gmt":"2026-10-07T06:47:19","slug":"cat-match-version-9","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=337","title":{"rendered":"Cat Match Version 9.5"},"content":{"rendered":"\n<style>\nhtml.cm-boot, body.cm-boot {\n  overflow: hidden !important;\n  overscroll-behavior: none;\n  touch-action: none;\n  height: 100% !important;\n  margin: 0 !important;\n}\nbody.cm-boot .wp-block-post-title,\nbody.cm-boot .wp-site-blocks > header,\nbody.cm-boot .wp-site-blocks > footer,\nbody.cm-boot header.wp-block-template-part,\nbody.cm-boot footer.wp-block-template-part,\nbody.cm-boot nav.wp-block-navigation,\nbody.cm-boot .wp-block-navigation,\nbody.cm-boot .wp-block-template-part {\n  display: none !important;\n}\nbody.cm-boot .wp-site-blocks > main,\nbody.cm-boot main,\nbody.cm-boot .entry-content,\nbody.cm-boot .entry-content > .wp-block-group,\nbody.cm-boot main > .wp-block-group {\n  padding: 0 !important;\n  margin: 0 !important;\n  max-width: none !important;\n}\n#cm-app, #cm-app * { box-sizing: border-box; }\n#cm-app {\n  position: fixed;\n  left: 0; top: 0; right: 0; bottom: 0;\n  width: 100vw; height: 100vh;\n  width: 100dvw; height: 100dvh;\n  max-width: none;\n  margin: 0;\n  background: #1a1210;\n  color: #fff4e0;\n  font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  touch-action: none;\n  user-select: none;\n  -webkit-user-select: none;\n  -webkit-touch-callout: none;\n  -webkit-tap-highlight-color: transparent;\n  border-radius: 0;\n  z-index: 2147482000;\n}\n#cm-stage {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  flex: 1 1 auto;\n  max-width: none;\n  max-height: none;\n  line-height: 0;\n  touch-action: none;\n  margin: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n#cm-game {\n  display: block;\n  width: 100%;\n  height: 100%;\n  max-width: none;\n  max-height: none;\n  margin: 0;\n  background: #2a1c14;\n  touch-action: none;\n  aspect-ratio: auto;\n}\n#cm-app:fullscreen, #cm-app:-webkit-full-screen {\n  width: 100vw; height: 100vh; width: 100dvw; height: 100dvh;\n  max-width: none; border-radius: 0; background: #1a1210;\n}\n#cm-app.cm-fallback {\n  position: fixed; left: 0; top: 0;\n  width: 100vw; height: 100vh; width: 100dvw; height: 100dvh;\n  max-width: none; margin: 0; z-index: 2147483000; border-radius: 0; background: #1a1210;\n}\n#cm-app.cm-playing #cm-stage, #cm-app.cm-mobile #cm-stage, #cm-app.cm-fallback #cm-stage,\n#cm-app:fullscreen #cm-stage, #cm-app:-webkit-full-screen #cm-stage {\n  flex: 1 1 auto; width: 100%; height: 100%; max-width: none; max-height: none;\n}\n#cm-app.cm-playing #cm-game, #cm-app.cm-mobile #cm-game, #cm-app.cm-fallback #cm-game,\n#cm-app:fullscreen #cm-game, #cm-app:-webkit-full-screen #cm-game {\n  width: 100% !important; height: 100% !important;\n  max-width: none !important; max-height: none !important;\n  aspect-ratio: auto; margin: 0;\n}\nhtml.cm-noscroll, body.cm-noscroll { overflow: hidden !important; overscroll-behavior: none; touch-action: none; }\n#cm-overlay {\n  position: absolute; left: 0; top: 0; right: 0; bottom: 0;\n  display: flex; align-items: center; justify-content: center;\n  background: rgba(8, 5, 12, 0.82); padding: 10px; line-height: 1.3; z-index: 20; overflow: auto;\n  touch-action: manipulation;\n}\n#cm-overlay.cm-tapplay { cursor: pointer; }\n#cm-overlay.cm-tapplay .cm-card { pointer-events: none; }\n#cm-overlay.cm-tapplay .cm-card .cm-go { pointer-events: auto; }\n#cm-overlay[hidden] { display: none !important; }\n.cm-card {\n  width: min(560px, 100%); max-height: 100%; overflow: auto;\n  background: rgba(42, 28, 22, 0.97); border: 2px solid #e07a32; border-radius: 16px;\n  padding: 10px 14px 12px; text-align: center; box-shadow: 0 18px 50px rgba(0,0,0,0.5);\n}\n.cm-card[hidden] { display: none !important; }\n.cm-card h2 {\n  font-family: Impact, \"Arial Black\", sans-serif; letter-spacing: 1px; font-size: 26px;\n  line-height: 1.1; margin: 2px 0 6px; color: #ffb35c; text-transform: uppercase;\n}\n.cm-cover {\n  display: block; width: min(220px, 55%); height: auto; margin: 0 auto 6px;\n  border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,0.45);\n}\n.cm-txt { font-size: 14px; margin: 0 0 6px; color: #f3dcc4; }\n.cm-keys { font-size: 12px; margin: 0 0 6px; color: #d8bfa8; text-align: left; }\n.cm-keys b { color: #ffd9a0; }\n.cm-ver { font-size: 11px; color: #9a8070; margin: 8px 0 0; }\n.cm-go {\n  display: inline-block; background: #e0622a; color: #fff; border: 0; border-radius: 999px;\n  padding: 12px 40px; font: 800 20px \"Arial Black\", Impact, sans-serif; letter-spacing: 1px;\n  cursor: pointer; margin: 8px 4px 2px;\n}\n.cm-go:hover { background: #f07a3a; }\n.cm-go:disabled { opacity: 0.6; cursor: wait; }\n.cm-small {\n  display: inline-block; background: transparent; color: #f3dcc4;\n  border: 1px solid rgba(255,220,180,0.5); border-radius: 999px; padding: 6px 14px;\n  font: 700 13px \"Trebuchet MS\", sans-serif; cursor: pointer; margin: 4px 4px 0;\n}\n.cm-stars { font-size: 36px; color: #ffd070; margin: 4px 0; letter-spacing: 4px; }\n#cm-exit, #cm-pausebtn, #cm-hintbtn, #cm-artbtn, #cm-animbtn {\n  position: fixed; z-index: 2147483100; border-radius: 50%;\n  border: 2px solid rgba(255,240,220,0.65); background: rgba(30, 18, 14, 0.88); color: #fff4e0;\n  font: 800 12px \"Arial Black\", sans-serif; line-height: 1; padding: 0; cursor: pointer; touch-action: manipulation;\n}\n#cm-exit, #cm-pausebtn { width: 44px; height: 44px; font-size: 16px; }\n#cm-hintbtn {\n  width: auto; min-width: 64px; min-height: 48px; height: 52px; border-radius: 16px; padding: 0 16px;\n  font-size: 15px; letter-spacing: 0.4px; white-space: nowrap;\n  box-shadow: 0 4px 14px rgba(0,0,0,0.45);\n}\n#cm-hintbtn.cm-hint-on { background: rgba(224, 122, 50, 0.98); border-color: #ffd080; color: #fff; }\n#cm-exit { top: 8px; right: 8px; }\n#cm-pausebtn { top: 8px; right: 58px; }\n#cm-hintbtn { bottom: 8px; right: 8px; top: auto; }\n#cm-exit[hidden], #cm-pausebtn[hidden], #cm-hintbtn[hidden], #cm-artbtn[hidden], #cm-animbtn[hidden] { display: none !important; }\n\n#cm-artbtn {\n  width: 56px; height: 56px; padding: 4px; border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  box-shadow: 0 4px 14px rgba(0,0,0,0.45);\n  opacity: 0.42;\n  filter: grayscale(0.35) brightness(0.75);\n  transition: opacity 0.15s ease, filter 0.15s ease, background 0.15s ease, border-color 0.15s ease;\n}\n#cm-artbtn svg { width: 86%; height: 86%; display: block; pointer-events: none; }\n#cm-artbtn.cm-art-on {\n  opacity: 1;\n  filter: none;\n  background: rgba(224, 122, 50, 0.98);\n  border-color: #ffd080;\n  box-shadow: 0 0 0 2px rgba(255,200,100,0.55), 0 4px 16px rgba(224,100,40,0.55);\n}\n#cm-artbtn.cm-art-on .cm-art-fill { fill: #ffe0b0; }\n#cm-artbtn.cm-art-on .cm-art-stroke { stroke: #fff8e8; }\n\n#cm-animbtn {\n  width: auto; min-width: 52px; min-height: 36px; height: 40px; border-radius: 14px; padding: 0 10px;\n  font-size: 11px; letter-spacing: 0.3px; white-space: nowrap; text-transform: lowercase;\n  box-shadow: 0 4px 14px rgba(0,0,0,0.45);\n  opacity: 0.55;\n}\n#cm-animbtn.cm-anim-on {\n  opacity: 1;\n  background: rgba(224, 122, 50, 0.98);\n  border-color: #ffd080;\n  color: #fff;\n  box-shadow: 0 0 0 2px rgba(255,200,100,0.45), 0 4px 14px rgba(224,100,40,0.45);\n}\n\n#cm-rotate {\n  position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 2147483200;\n  background: rgba(8, 6, 10, 0.94); display: flex; align-items: center; justify-content: center;\n  text-align: center; padding: 24px; line-height: 1.4;\n}\n#cm-rotate[hidden] { display: none !important; }\n#cm-rotate .cm-rot-icon { font: 800 46px \"Arial Black\", sans-serif; margin-bottom: 10px; color: #ffb35c; }\n@media (max-height: 480px) {\n  .cm-card { padding: 6px 10px 8px; border-radius: 12px; width: min(640px, 100%); }\n  .cm-card h2 { font-size: 18px; margin: 0 0 2px; }\n  .cm-cover { width: min(140px, 28%); margin: 0 auto 2px; }\n  .cm-txt { font-size: 11px; margin: 0 0 2px; }\n  .cm-keys { font-size: 10px; margin: 0 0 2px; }\n  .cm-go { padding: 8px 28px; font-size: 16px; margin: 4px 4px 0; }\n  .cm-ver { font-size: 10px; margin: 4px 0 0; }\n}\n<\/style>\n<div id=\"cm-app\">\n<button type=\"button\" id=\"cm-exit\" hidden aria-label=\"Exit\">X<\/button>\n<button type=\"button\" id=\"cm-pausebtn\" hidden aria-label=\"Pause\">II<\/button>\n<button type=\"button\" id=\"cm-hintbtn\" hidden aria-label=\"Toggle hints\" aria-pressed=\"false\">Hint<\/button>\n<button type=\"button\" id=\"cm-artbtn\" hidden aria-label=\"Simple cat art off\" aria-pressed=\"false\" title=\"Simple cats: OFF\">\n<svg viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n<path class=\"cm-art-stroke\" d=\"M12 28 L8 8 L24 20 L32 16 L40 20 L56 8 L52 28 C58 36 58 50 32 56 C6 50 6 36 12 28 Z\" fill=\"none\" stroke=\"#fff4e0\" stroke-width=\"3.2\" stroke-linejoin=\"round\"\/>\n<path class=\"cm-art-fill\" d=\"M22 34 C22 34 28 30 32 30 C36 30 42 34 42 34\" fill=\"none\" stroke=\"#fff4e0\" stroke-width=\"2.2\" stroke-linecap=\"round\"\/>\n<circle class=\"cm-art-fill\" cx=\"24\" cy=\"36\" r=\"2.4\" fill=\"#fff4e0\"\/>\n<circle class=\"cm-art-fill\" cx=\"40\" cy=\"36\" r=\"2.4\" fill=\"#fff4e0\"\/>\n<path class=\"cm-art-fill\" d=\"M32 40 L29 44 L35 44 Z\" fill=\"#fff4e0\"\/>\n<\/svg>\n<\/button>\n<button type=\"button\" id=\"cm-animbtn\" hidden aria-label=\"Face animations on\" aria-pressed=\"true\" title=\"Animate: ON\">animate<\/button>\n<div id=\"cm-rotate\" hidden><div><div class=\"cm-rot-icon\">&#8635;<\/div><div style=\"font:800 22px Arial Black,sans-serif;margin-bottom:6px\">Turn your phone sideways<\/div><div style=\"font:14px Trebuchet MS,sans-serif;color:#d8bfa8\">Landscape fits more board. Portrait works too.<\/div><\/div><\/div>\n<div id=\"cm-stage\">\n<canvas id=\"cm-game\" width=\"960\" height=\"540\" tabindex=\"0\" aria-label=\"Cat Match game\"><\/canvas>\n<div id=\"cm-overlay\">\n<div class=\"cm-card\" id=\"cm-title\">\n<img loading=\"lazy\" decoding=\"async\" class=\"cm-cover\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/cm_cover_new.jpg\" alt=\"Cat Match: cartoon cat faces on a colorful match-3 board\" width=\"960\" height=\"540\">\n<h2>Cat Match <span style=\"font-size:0.7em;opacity:0.85\">Version 9.5<\/span><\/h2>\n<div class=\"cm-txt\"><b style=\"color:#ffd9a0\">What:<\/b> A cozy match-3. Swap cute cats, make combos, clear boxes, and free kittens.<\/div>\n<div class=\"cm-txt\"><b style=\"color:#ffd9a0\">Goal:<\/b> Beat each level&#8217;s objective before you run out of moves. Match 4 for stripes, 5 for rainbow, T\/L for bombs.<\/div>\n<div class=\"cm-keys\"><b>Desktop:<\/b> Click two adjacent cats, or drag to swap. Tap Hint to highlight a move.<\/div>\n<div class=\"cm-keys\"><b>Phone:<\/b> Drag a cat toward its neighbor. Turn sideways. Use Hint when you need help.<\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-start\" disabled>Loading<\/button>\n<div class=\"cm-ver\">v2026-10-06v9g<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-level\" hidden>\n<h2 id=\"cm-level-title\">Level 1<\/h2>\n<div class=\"cm-txt\" id=\"cm-level-goal\"><\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-play-level\">Go<\/button>\n<div class=\"cm-ver\">v2026-10-06v9g<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-win\" hidden>\n<h2>Pawsome!<\/h2>\n<div class=\"cm-stars\" id=\"cm-win-stars\">***<\/div>\n<div class=\"cm-txt\" id=\"cm-win-msg\"><\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-next\">Next level<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-retry\">Replay<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-menu\">Menu<\/button>\n<div class=\"cm-ver\">v2026-10-06v9g<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-lose\" hidden>\n<h2>Out of moves<\/h2>\n<div class=\"cm-txt\">The cats still need your help. Try again!<\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-retry-lose\">Try again<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-menu-lose\">Menu<\/button>\n<div class=\"cm-ver\">v2026-10-06v9g<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-pause\" hidden>\n<h2>Paused<\/h2>\n<button type=\"button\" class=\"cm-go\" id=\"cm-resume\">Resume<\/button>\n<button type=\"button\" class=\"cm-go\" id=\"cm-restart\">Restart<\/button>\n<div class=\"cm-ver\">v2026-10-06v9g<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<script>\n(function () {\n  try {\n    document.documentElement.classList.add(\"cm-boot\");\n    if (document.body) document.body.classList.add(\"cm-boot\");\n    else document.addEventListener(\"DOMContentLoaded\", function () {\n      document.body.classList.add(\"cm-boot\");\n    });\n  } catch (e) {}\n  try { window.scrollTo(0, 0); } catch (e2) {}\n})();\n<\/script>\n<script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIFZFUlNJT04gPSAidjIwMjYtMTAtMDZ2OWciOwogIHZhciBXID0gOTYwLCBIID0gNTQwOwogIHZhciBHUklEID0gODsKICB2YXIgVFlQRVMgPSA2OwogIHZhciBDQVRfTkFNRVMgPSBbIk9yYW5nZSIsICJCbGFjayIsICJXaGl0ZSIsICJHcmF5IiwgIkNhbGljbyIsICJUdXhlZG8iXTsKICB2YXIgU0NPUkVfQkFTRSA9IHszOiAxMDAsIDQ6IDI1MCwgNTogNTAwfTsKICB2YXIgQ09NQk9fTVNHID0gWyIiLCAiUFVSUkZFQ1QhIiwgIlBBV1NPTUUhIiwgIkNBVC1UQVNUSUMhIiwgIk1FT1daQSEiLCAiTEVHRU5EQVJZISJdOwoKICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNtLWdhbWUiKTsKICBpZiAoIWNhbnZhcykgcmV0dXJuOwogIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICB2YXIgYXBwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY20tYXBwIik7CgogIChmdW5jdGlvbiBjbGVhbk1hcmt1cCgpIHsKICAgIGlmICghYXBwRWwpIHJldHVybjsKICAgIHZhciBicnMgPSBhcHBFbC5xdWVyeVNlbGVjdG9yQWxsKCJiciIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBicnMubGVuZ3RoOyBpKyspIGJyc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJyc1tpXSk7CiAgICB2YXIgcHMgPSBhcHBFbC5xdWVyeVNlbGVjdG9yQWxsKCJwIik7CiAgICBmb3IgKHZhciBqID0gcHMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgdmFyIHAgPSBwc1tqXTsKICAgICAgd2hpbGUgKHAuZmlyc3RDaGlsZCkgcC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwLmZpcnN0Q2hpbGQsIHApOwogICAgICBwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCk7CiAgICB9CiAgfSkoKTsKCiAgZnVuY3Rpb24gJChpZCkgeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9CiAgdmFyIG92ZXJsYXlFbCA9ICQoImNtLW92ZXJsYXkiKTsKICB2YXIgdGl0bGVDYXJkID0gJCgiY20tdGl0bGUiKTsKICB2YXIgbGV2ZWxDYXJkID0gJCgiY20tbGV2ZWwiKTsKICB2YXIgd2luQ2FyZCA9ICQoImNtLXdpbiIpOwogIHZhciBsb3NlQ2FyZCA9ICQoImNtLWxvc2UiKTsKICB2YXIgcGF1c2VDYXJkID0gJCgiY20tcGF1c2UiKTsKICB2YXIgc3RhcnRCdG4gPSAkKCJjbS1zdGFydCIpOwogIHZhciBuZXh0QnRuID0gJCgiY20tbmV4dCIpOwogIHZhciByZXRyeUJ0biA9ICQoImNtLXJldHJ5Iik7CiAgdmFyIHJldHJ5TG9zZUJ0biA9ICQoImNtLXJldHJ5LWxvc2UiKTsKICB2YXIgbWVudUJ0biA9ICQoImNtLW1lbnUiKTsKICB2YXIgcmVzdW1lQnRuID0gJCgiY20tcmVzdW1lIik7CiAgdmFyIHJlc3RhcnRCdG4gPSAkKCJjbS1yZXN0YXJ0Iik7CiAgdmFyIGV4aXRCdG4gPSAkKCJjbS1leGl0Iik7CiAgdmFyIHBhdXNlQnRuID0gJCgiY20tcGF1c2VidG4iKTsKICB2YXIgcm90YXRlRWwgPSAkKCJjbS1yb3RhdGUiKTsKICB2YXIgbGV2ZWxUaXRsZSA9ICQoImNtLWxldmVsLXRpdGxlIik7CiAgdmFyIGxldmVsR29hbCA9ICQoImNtLWxldmVsLWdvYWwiKTsKICB2YXIgd2luU3RhcnMgPSAkKCJjbS13aW4tc3RhcnMiKTsKICB2YXIgd2luTXNnID0gJCgiY20td2luLW1zZyIpOwogIHZhciB2ZXJFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY20tdmVyIik7CiAgZm9yICh2YXIgdmkgPSAwOyB2aSA8IHZlckVscy5sZW5ndGg7IHZpKyspIHZlckVsc1t2aV0udGV4dENvbnRlbnQgPSBWRVJTSU9OOwoKICB2YXIgYm9hcmRYID0gMjAwLCBib2FyZFkgPSA0OCwgY2VsbCA9IDU0LCBjZWxsVyA9IDU0LCBjZWxsSCA9IDU0LCBib2FyZFBhZCA9IDg7CiAgdmFyIGJvYXJkVyA9IDQzMiwgYm9hcmRIID0gNDMyOwogIHZhciBhY3RpdmVUeXBlcyA9IFswLCAxLCAyLCAzLCA0LCA1XTsKICB2YXIgaHVkTW9kZSA9ICJzaWRlIjsKICB2YXIgaGludEFuY2hvciA9IHt4OiAwLCB5OiAwLCB3OiA2NCwgaDogNTJ9OwogIHZhciBzcHJpdGVzID0gW107CiAgdmFyIHNwZWNpYWxTcHJpdGVzID0ge307CiAgdmFyIG9ic3RhY2xlU3ByaXRlcyA9IHt9OwogIHZhciBiZ0NhbnZhcyA9IG51bGw7CiAgdmFyIGJvYXJkR3JpZEltZyA9IG51bGw7CiAgdmFyIGJvYXJkR3JpZFJlYWR5ID0gZmFsc2U7CiAgdmFyIGxhc3RMYXlvdXRLZXkgPSAiIjsKCiAgdmFyIHN0YXRlID0gInRpdGxlIjsKICB2YXIgZ3JpZCA9IFtdOwogIHZhciBsZXZlbEluZGV4ID0gMDsKICB2YXIgbW92ZXNMZWZ0ID0gMDsKICB2YXIgc2NvcmUgPSAwOwogIHZhciBjb21ibyA9IDA7CiAgdmFyIGdvYWxzID0gW107CiAgdmFyIHN0YXJzRWFybmVkID0gMDsKICB2YXIgYnVzeSA9IGZhbHNlOwogIHZhciBzZWxlY3RlZCA9IG51bGw7CiAgdmFyIGhpbnRDZWxscyA9IG51bGw7CiAgdmFyIGhpbnRzT24gPSBmYWxzZTsKICB2YXIgaGludEJ0biA9ICQoImNtLWhpbnRidG4iKTsKICB2YXIgZmxhc2hNc2cgPSAiIjsKICB2YXIgZmxhc2hUaW1lciA9IDA7CiAgdmFyIGZsYXNoQ29tYm9OID0gMDsKICB2YXIgcGFydGljbGVzID0gW107CiAgdmFyIGFuaW1UaWxlcyA9IFtdOwogIHZhciBkcmFnU3RhcnQgPSBudWxsOwogIHZhciBwb2ludGVySWQgPSBudWxsOwogIHZhciBiZXN0U3RhcnMgPSB7fTsKICB0cnkgewogICAgYmVzdFN0YXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY2F0TWF0Y2hTdGFycyIpIHx8ICJ7fSIpIHx8IHt9OwogIH0gY2F0Y2ggKGUpIHsgYmVzdFN0YXJzID0ge307IH0KCiAgLyogPT09PT0gTEVWRUxTID09PT09ICovCiAgdmFyIExFVkVMUyA9IFsKICAgIHtuYW1lOiAiT3JhbmdlIFRhYmJ5IEh1bnQiLCBtb3ZlczogMjAsIHN0YXJzOiBbODAwLCAxNjAwLCAyODAwXSwgZ29hbHM6IFt7a2luZDogImNvbGxlY3QiLCB0eXBlOiAwLCBuZWVkOiAxMn1dLCB0aXA6ICJTd2FwIGFkamFjZW50IGNhdHMgdG8gbWF0Y2ggMysgb3JhbmdlIHRhYmJpZXMuIiwgYmc6IFsiIzZhOWZjOCIsICIjYjhkOGVjIiwgIiNjNGEwNmEiLCAiIzhhNjg0MCJdLCBib2FyZDogIndhcm0ifSwKICAgIHtuYW1lOiAiTWlkbmlnaHQgQ29sbGVjdCIsIG1vdmVzOiAyMiwgc3RhcnM6IFsxMDAwLCAyMDAwLCAzNTAwXSwgZ29hbHM6IFt7a2luZDogImNvbGxlY3QiLCB0eXBlOiAxLCBuZWVkOiAxNH1dLCB0aXA6ICJDb2xsZWN0IGJsYWNrIGNhdHMuIENhc2NhZGVzIGdpdmUgYm9udXMgcG9pbnRzISIsIGJnOiBbIiM1YThhYjgiLCAiI2E4Y2NlMCIsICIjYjg5NDYwIiwgIiM3YTVjMzgiXSwgYm9hcmQ6ICJ3YXJtIn0sCiAgICB7bmFtZTogIlNub3diYWxsIE1hdGNoIiwgbW92ZXM6IDIyLCBzdGFyczogWzEyMDAsIDI0MDAsIDQwMDBdLCBnb2FsczogW3traW5kOiAiY29sbGVjdCIsIHR5cGU6IDIsIG5lZWQ6IDE1fV0sIHRpcDogIkxvbmdlciBtYXRjaGVzIHNjb3JlIG1vcmUuIENhc2NhZGVzIGtlZXAgY2xlYXJpbmchIiwgYmc6IFsiIzZhYThjMCIsICIjYzBkY2U4IiwgIiNjOGE4NzgiLCAiIzhhNjg0OCJdLCBib2FyZDogIndhcm0ifSwKICAgIHtuYW1lOiAiR3JheSBQYXJhZGUiLCBtb3ZlczogMjQsIHN0YXJzOiBbMTQwMCwgMjgwMCwgNDUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMywgbmVlZDogMTZ9XSwgdGlwOiAiS2VlcCBtYXRjaGluZyEgQWltIGZvciBiaWdnZXIgZ3JvdXBzIHdoZW4geW91IGNhbi4iLCBiZzogWyIjNzA5OGI4IiwgIiNiMGQwZTAiLCAiI2MwYTA3MCIsICIjODA2MDQwIl0sIGJvYXJkOiAid2FybSJ9LAogICAge25hbWU6ICJDYWxpY28gJiBUdXhlZG8iLCBtb3ZlczogMjQsIHN0YXJzOiBbMTYwMCwgMzIwMCwgNTAwMF0sIGdvYWxzOiBbe2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogNCwgbmVlZDogMTJ9LCB7a2luZDogImNvbGxlY3QiLCB0eXBlOiA1LCBuZWVkOiAxMn1dLCB0aXA6ICJDb2xsZWN0IGNhbGljbyBBTkQgdHV4ZWRvIGNhdHMuIiwgYmc6IFsiIzc4YTg5OCIsICIjYzBlMGQwIiwgIiNiMDkwNjAiLCAiIzcwNjA0MCJdLCBib2FyZDogIm1pbnQifSwKICAgIHtuYW1lOiAiQ2FyZGJvYXJkIENyYXNoIiwgbW92ZXM6IDI2LCBzdGFyczogWzE1MDAsIDMwMDAsIDUwMDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiA4fV0sIGJveGVzOiA4LCB0aXA6ICJNYXRjaCBuZXh0IHRvIGNhcmRib2FyZCBib3hlcyB0byBjbGVhciB0aGVtLiIsIGxheW91dDogImJveGVzMSIsIGJnOiBbIiM2OGIwOTAiLCAiI2I4ZThkMCIsICIjYTg4ODU4IiwgIiM2ODU4MzgiXSwgYm9hcmQ6ICJtaW50In0sCiAgICB7bmFtZTogIkRvdWJsZSBCb3hlcyIsIG1vdmVzOiAyNiwgc3RhcnM6IFsxODAwLCAzNjAwLCA1NTAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogMTJ9XSwgYm94ZXM6IDEyLCB0aXA6ICJEb3VibGUgYm94ZXMgbmVlZCB0d28gaGl0cyEiLCBsYXlvdXQ6ICJib3hlczIiLCBiZzogWyIjNThhODg4IiwgIiNhOGRjYzQiLCAiI2EwODA1MCIsICIjNjA1MDMwIl0sIGJvYXJkOiAibWludCJ9LAogICAge25hbWU6ICJCb3hlcyAmIE9yYW5nZXMiLCBtb3ZlczogMjgsIHN0YXJzOiBbMjAwMCwgNDAwMCwgNjUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJib3hlcyIsIG5lZWQ6IDEwfSwge2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMCwgbmVlZDogMTB9XSwgYm94ZXM6IDEwLCB0aXA6ICJDbGVhciBib3hlcyBhbmQgY29sbGVjdCBvcmFuZ2UgY2F0cy4iLCBsYXlvdXQ6ICJib3hlczMiLCBiZzogWyIjNjBiMGEwIiwgIiNiMGU4ZGMiLCAiI2IwOTA1OCIsICIjNjg1ODM4Il0sIGJvYXJkOiAibWludCJ9LAogICAge25hbWU6ICJQYXcgQ2xhcCBCb3hlcyIsIG1vdmVzOiAyOCwgc3RhcnM6IFsyMjAwLCA0NDAwLCA3MDAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogMTR9XSwgYm94ZXM6IDE0LCB0aXA6ICJPbmUgc3dhcCwgdHdvIG1hdGNoZXM6IFBhdyBDbGFwIGRvdWJsZXMgdGhhdCBjbGVhciEiLCBsYXlvdXQ6ICJib3hlczQiLCBiZzogWyIjNzA4OGMwIiwgIiNjMGM4ZTgiLCAiI2E4ODg2OCIsICIjNjg1MDQ4Il0sIGJvYXJkOiAiZHVzayIsIGZlYXR1cmU6ICJwYXdjbGFwIn0sCiAgICB7bmFtZTogIkJveCBCb25hbnphIiwgbW92ZXM6IDMwLCBzdGFyczogWzI1MDAsIDUwMDAsIDgwMDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiAxNn1dLCBib3hlczogMTYsIHRpcDogIk1hdGNoIDQgZm9yIGEgU3RyaXBlZCBDYXQgdGhhdCBjbGVhcnMgYSB3aG9sZSBsaW5lISIsIGxheW91dDogImJveGVzNSIsIGJnOiBbIiM2ODc4YjgiLCAiI2I4YjhlMCIsICIjOTg4MDYwIiwgIiM1ODQ4MzgiXSwgYm9hcmQ6ICJkdXNrIn0sCiAgICB7bmFtZTogIktpdHRlbiBDYXJyaWVycyIsIG1vdmVzOiAyOCwgc3RhcnM6IFsyMDAwLCA0MDAwLCA2NTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiAzfV0sIGNhcnJpZXJzOiAzLCB0aXA6ICJNYXRjaCBuZXh0IHRvIGNhdCBjYXJyaWVycyB0byBmcmVlIHRoZSBraXR0ZW5zISIsIGxheW91dDogImtpdHMxIiwgYmc6IFsiIzc4NjhiMCIsICIjYzhiOGU4IiwgIiNhMDgwNzAiLCAiIzYwNTA0OCJdLCBib2FyZDogImR1c2sifSwKICAgIHtuYW1lOiAiU3VwZXIgQ2F0IFJlc2N1ZSIsIG1vdmVzOiAzMCwgc3RhcnM6IFsyNDAwLCA0ODAwLCA3NTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiA0fSwge2tpbmQ6ICJib3hlcyIsIG5lZWQ6IDZ9XSwgY2FycmllcnM6IDQsIGJveGVzOiA2LCB0aXA6ICJUcnVlICsgY3Jvc3MgbWF0Y2ggbWFrZXMgYSBTdXBlciBDYXQgKHJvdyArIGNvbHVtbikhIiwgbGF5b3V0OiAia2l0czIiLCBiZzogWyIjODg2MGEwIiwgIiNkMGIwZDgiLCAiI2IwODA3MCIsICIjNjg0ODM4Il0sIGJvYXJkOiAicm9zZSIsIGZlYXR1cmU6ICJzdXBlcmNhdCJ9LAogICAge25hbWU6ICJZYXJuIFRhbmdsZSIsIG1vdmVzOiAzMCwgc3RhcnM6IFsyNjAwLCA1MjAwLCA4MDAwXSwgZ29hbHM6IFt7a2luZDogInlhcm4iLCBuZWVkOiA4fV0sIHlhcm46IDgsIHRpcDogIlQvTCBzaGFwZXMgbWFrZSBFeHBsb2RpbmcgQ2F0cyAocmVkICEpIGZvciBhIDN4MyBibGFzdCEgWWFybiBjbGVhcnMgb24gdG91Y2guIiwgbGF5b3V0OiAieWFybjEiLCBiZzogWyIjYTA2MDc4IiwgIiNlOGMwY2MiLCAiI2I4ODg2OCIsICIjNjg0MDM4Il0sIGJvYXJkOiAicm9zZSJ9LAogICAge25hbWU6ICJZYXJuICYgV2hpdGVzIiwgbW92ZXM6IDMyLCBzdGFyczogWzI4MDAsIDU2MDAsIDkwMDBdLCBnb2FsczogW3traW5kOiAieWFybiIsIG5lZWQ6IDEwfSwge2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMiwgbmVlZDogMTB9XSwgeWFybjogMTAsIHRpcDogIkNsZWFyIHlhcm4gYW5kIGNvbGxlY3Qgd2hpdGUgY2F0cy4iLCBsYXlvdXQ6ICJ5YXJuMiIsIGJnOiBbIiM5ODU4NjgiLCAiI2UwYjBiYyIsICIjYjA4MDYwIiwgIiM2ODM4MjgiXSwgYm9hcmQ6ICJyb3NlIn0sCiAgICB7bmFtZTogIkNhcnJpZXJzICYgWWFybiIsIG1vdmVzOiAzMiwgc3RhcnM6IFszMDAwLCA2MDAwLCA5NTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiAzfSwge2tpbmQ6ICJ5YXJuIiwgbmVlZDogNn1dLCBjYXJyaWVyczogMywgeWFybjogNiwgdGlwOiAiTWl4IG9mIGNhcnJpZXJzIGFuZCB5YXJuLiIsIGxheW91dDogIm1peDEiLCBiZzogWyIjNDg3OGIwIiwgIiNhOGM4ZTgiLCAiIzg4Nzg1OCIsICIjNTA0MDMwIl0sIGJvYXJkOiAib2NlYW4ifSwKICAgIHtuYW1lOiAiQm9zcyBNaXgiLCBtb3ZlczogMzQsIHN0YXJzOiBbMzIwMCwgNjQwMCwgMTAwMDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiAxMH0sIHtraW5kOiAia2l0dGVucyIsIG5lZWQ6IDN9XSwgYm94ZXM6IDEwLCBjYXJyaWVyczogMywgdGlwOiAiQm9zcy1pc2ggbWl4LiBXYXRjaCBmb3IgcmFyZSBjYXRuaXAgYm9tYnMhIiwgbGF5b3V0OiAibWl4MiIsIGJnOiBbIiM0MDcwYTgiLCAiIzk4YzBlMCIsICIjODA2ODQ4IiwgIiM0ODM4MjgiXSwgYm9hcmQ6ICJvY2VhbiJ9LAogICAge25hbWU6ICJDYXQgRGFzaCBDb2FzdCIsIG1vdmVzOiAzNCwgc3RhcnM6IFszNDAwLCA2ODAwLCAxMDUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMCwgbmVlZDogMjB9LCB7a2luZDogImJveGVzIiwgbmVlZDogOH1dLCBib3hlczogOCwgdGlwOiAiQ2xlYXIgb3Bwb3NpdGUgZWRnZXMgaW4gb25lIGJ1cnN0IHRvIHRyaWdnZXIgQ2F0IERhc2ghIiwgbGF5b3V0OiAibWl4MyIsIGJnOiBbIiMzODY4OTgiLCAiIzg4YjhkOCIsICIjNzg1ODM4IiwgIiM0MDMwMjAiXSwgYm9hcmQ6ICJvY2VhbiIsIGZlYXR1cmU6ICJjYXRkYXNoIn0sCiAgICB7bmFtZTogIlN1bnNldCBZYXJuIiwgbW92ZXM6IDM2LCBzdGFyczogWzM2MDAsIDcyMDAsIDExMDAwXSwgZ29hbHM6IFt7a2luZDogInlhcm4iLCBuZWVkOiAxMn1dLCB5YXJuOiAxMiwgdGlwOiAiWWFybiBnYXVudGxldCB1bmRlciBzdW5zZXQgc2tpZXMuIiwgbGF5b3V0OiAieWFybjMiLCBiZzogWyIjYzg3ODQwIiwgIiNmMGQwYTAiLCAiI2E4NjgzOCIsICIjNjg0MDI4Il0sIGJvYXJkOiAic3Vuc2V0In0sCiAgICB7bmFtZTogIkdvbGRlbiBSZXNjdWUiLCBtb3ZlczogMzYsIHN0YXJzOiBbMzgwMCwgNzYwMCwgMTE1MDBdLCBnb2FsczogW3traW5kOiAia2l0dGVucyIsIG5lZWQ6IDV9XSwgY2FycmllcnM6IDUsIHRpcDogIktpdHRlbiByZXNjdWUgYXQgZ29sZGVuIGhvdXIuIiwgbGF5b3V0OiAia2l0czMiLCBiZzogWyIjZDA4MDM4IiwgIiNmMGM4ODgiLCAiI2IwNzAzMCIsICIjNjg0MDIwIl0sIGJvYXJkOiAic3Vuc2V0In0sCiAgICB7bmFtZTogIkV2ZXJ5dGhpbmchIiwgbW92ZXM6IDQwLCBzdGFyczogWzQwMDAsIDgwMDAsIDEyMDAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogMTJ9LCB7a2luZDogInlhcm4iLCBuZWVkOiA4fSwge2tpbmQ6ICJraXR0ZW5zIiwgbmVlZDogM31dLCBib3hlczogMTIsIHlhcm46IDgsIGNhcnJpZXJzOiAzLCB0aXA6ICJFdmVyeXRoaW5nIGF0IG9uY2UgdW5kZXIgYSBmaWVyeSBza3khIiwgbGF5b3V0OiAibWl4NCIsIGJnOiBbIiNjMDYwMzAiLCAiI2U4YjA3MCIsICIjYTA1ODI4IiwgIiM1ODI4MTgiXSwgYm9hcmQ6ICJzdW5zZXQifQogIF07CgogIC8qID09PT09IFNQUklURSBEUkFXSU5HID09PT09ICovCiAgZnVuY3Rpb24gcm91bmRSZWN0KGMsIHgsIHksIHcsIGgsIHIpIHsKICAgIGMuYmVnaW5QYXRoKCk7CiAgICBjLm1vdmVUbyh4ICsgciwgeSk7CiAgICBjLmFyY1RvKHggKyB3LCB5LCB4ICsgdywgeSArIGgsIHIpOwogICAgYy5hcmNUbyh4ICsgdywgeSArIGgsIHgsIHkgKyBoLCByKTsKICAgIGMuYXJjVG8oeCwgeSArIGgsIHgsIHksIHIpOwogICAgYy5hcmNUbyh4LCB5LCB4ICsgdywgeSwgcik7CiAgICBjLmNsb3NlUGF0aCgpOwogIH0KCiAgdmFyIEFUTEFTX1VSTCA9ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9jbV9hdGxhcy0xLnBuZyI7CiAgdmFyIEFUTEFTX1JPV1MgPSA5OwogIHZhciBBVExBU19UVyA9IDk2LCBBVExBU19USCA9IDk2OwogIHZhciBFWFBSID0ge2hhcHB5OiAwLCB3aW5rOiAxLCBqb3lmdWw6IDIsIHN1cnByaXNlOiAzLCBhbmdyeTogNCwgcmVzdDogNSwgbGljazogNiwgbm9zZTogNywgbm9zZTI6IDh9OwogIHZhciBCT0FSRF9HUklEUyA9IHsid2FybSI6Imh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NtX2JvYXJkX2dyaWRfd2FybS5wbmciLCJtaW50IjoiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY21fYm9hcmRfZ3JpZF9taW50LnBuZyIsImR1c2siOiJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9jbV9ib2FyZF9ncmlkX2R1c2sucG5nIiwicm9zZSI6Imh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NtX2JvYXJkX2dyaWRfcm9zZS5wbmciLCJvY2VhbiI6Imh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NtX2JvYXJkX2dyaWRfb2NlYW4ucG5nIiwic3Vuc2V0IjoiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY21fYm9hcmRfZ3JpZF9zdW5zZXQucG5nIn07CiAgdmFyIGJvYXJkR3JpZEltZ3MgPSB7fTsKICB2YXIgYm9hcmRHcmlkS2V5ID0gIndhcm0iOwogIHZhciBDQVROSVBfQ0hBTkNFID0gMC4wMjg7CiAgLy8gQ2F0bmlwIGJvbWJzIG9ubHkgZnJvbSBsYXRlciBzdGFnZXMgKEJvc3MgTWl4ID0gaW5kZXggMTUpOyBuZXZlciBlYXJseSB0dXRvcmlhbAogIHZhciBDQVROSVBfTUlOX0xFVkVMID0gMTU7CiAgdmFyIGF0bGFzSW1nID0gbnVsbDsKICB2YXIgYXRsYXNSZWFkeSA9IGZhbHNlOwogIHZhciBzcHJpdGVzUmVhZHkgPSBmYWxzZTsKICB2YXIgYXRsYXNTcHJpdGVzID0gbnVsbDsKICB2YXIgc2ltcGxlU3ByaXRlcyA9IG51bGw7CiAgdmFyIHNpbXBsZU1vZGUgPSBmYWxzZTsKICB0cnkgewogICAgc2ltcGxlTW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjYXRNYXRjaFNpbXBsZUFydCIpID09PSAiMSI7CiAgfSBjYXRjaCAoZVNpbXBsZSkgeyBzaW1wbGVNb2RlID0gZmFsc2U7IH0KICB2YXIgYXJ0QnRuID0gJCgiY20tYXJ0YnRuIik7CiAgdmFyIGFuaW1CdG4gPSAkKCJjbS1hbmltYnRuIik7CiAgdmFyIGFuaW1PbiA9IHRydWU7CiAgdHJ5IHsKICAgIHZhciBzYXZlZEFuaW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY2F0TWF0Y2hBbmltIik7CiAgICBpZiAoc2F2ZWRBbmltID09PSAiMCIpIGFuaW1PbiA9IGZhbHNlOwogICAgZWxzZSBpZiAoc2F2ZWRBbmltID09PSAiMSIpIGFuaW1PbiA9IHRydWU7CiAgfSBjYXRjaCAoZUFuaW0pIHsgYW5pbU9uID0gdHJ1ZTsgfQogIHZhciBsZXZlbEJhbm5lciA9IG51bGw7CiAgdmFyIHNwbGFzaENhbnZhcyA9IG51bGw7CiAgdmFyIGZ4QW5pbXMgPSBbXTsKICB2YXIgcGF3TXVsdEFjdGl2ZSA9IDE7CgoKICAvKiA9PT09PSBFVkVOVCBESVJFQ1RPUiAodjlmKSA9PT09PQogICAgIFF1aWV0bHkgYmlhc2VzIGZlYXR1cmVkLWxldmVsIHNwYXducyBzbyBTdXBlciBDYXQgLyBQYXcgQ2xhcCAvIENhdCBEYXNoCiAgICAgb3Bwb3J0dW5pdGllcyBhcHBlYXIgd2l0aGluIHRoZSBleHBlY3RlZCBtb3ZlIHdpbmRvdy4gUGxheWVyIHN0aWxsIG1ha2VzCiAgICAgdGhlIG1hdGNoLiBHdWFyYW50ZWUgPSBvcHBvcnR1bml0eSBzZWVkLCBuZXZlciBhdXRvLXRyaWdnZXIgZmluaXNoZWQgZmVhdHVyZS4KICAqLwogIHZhciBGRUFUVVJFX0RFRlMgPSB7CiAgICBzdXBlcmNhdDogewogICAgICBpZDogInN1cGVyY2F0IiwKICAgICAgbGFiZWw6ICJTdXBlciBDYXQiLAogICAgICBlYXJsaWVzdEZyYWM6IDAuMTIsCiAgICAgIGlkZWFsRnJhYzogMC4zOCwKICAgICAgZ3VhcmFudGVlRnJhYzogMC42OCwKICAgICAgem9uZTogbnVsbAogICAgfSwKICAgIHBhd2NsYXA6IHsKICAgICAgaWQ6ICJwYXdjbGFwIiwKICAgICAgbGFiZWw6ICJQYXcgQ2xhcCIsCiAgICAgIGVhcmxpZXN0RnJhYzogMC4xMCwKICAgICAgaWRlYWxGcmFjOiAwLjMyLAogICAgICBndWFyYW50ZWVGcmFjOiAwLjYyLAogICAgICB6b25lOiBudWxsCiAgICB9LAogICAgY2F0ZGFzaDogewogICAgICBpZDogImNhdGRhc2giLAogICAgICBsYWJlbDogIkNhdCBEYXNoIiwKICAgICAgZWFybGllc3RGcmFjOiAwLjE0LAogICAgICBpZGVhbEZyYWM6IDAuNDAsCiAgICAgIGd1YXJhbnRlZUZyYWM6IDAuNzAsCiAgICAgIHpvbmU6ICJlZGdlcyIKICAgIH0KICB9OwoKICB2YXIgZXZlbnRCdXMgPSB7CiAgICBfaDoge30sCiAgICBvbjogZnVuY3Rpb24gKGV2LCBmbikgewogICAgICBpZiAoIXRoaXMuX2hbZXZdKSB0aGlzLl9oW2V2XSA9IFtdOwogICAgICB0aGlzLl9oW2V2XS5wdXNoKGZuKTsKICAgIH0sCiAgICBlbWl0OiBmdW5jdGlvbiAoZXYsIGRhdGEpIHsKICAgICAgdmFyIGxpc3QgPSB0aGlzLl9oW2V2XTsKICAgICAgaWYgKCFsaXN0KSByZXR1cm47CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIHRyeSB7IGxpc3RbaV0oZGF0YSk7IH0gY2F0Y2ggKGVCdXMpIHt9CiAgICAgIH0KICAgIH0KICB9OwoKICB2YXIgZXZlbnREaXJlY3RvciA9IG51bGw7CgogIGZ1bmN0aW9uIG1ha2VFdmVudERpcmVjdG9yKGZlYXR1cmVJZCwgdG90YWxNb3ZlcykgewogICAgdmFyIGRlZiA9IEZFQVRVUkVfREVGU1tmZWF0dXJlSWRdIHx8IG51bGw7CiAgICBpZiAoIWRlZiB8fCAhdG90YWxNb3ZlcykgcmV0dXJuIG51bGw7CiAgICB2YXIgZWFybGllc3QgPSBNYXRoLm1heCgyLCBNYXRoLmZsb29yKHRvdGFsTW92ZXMgKiBkZWYuZWFybGllc3RGcmFjKSk7CiAgICB2YXIgaWRlYWwgPSBNYXRoLm1heChlYXJsaWVzdCArIDIsIE1hdGguZmxvb3IodG90YWxNb3ZlcyAqIGRlZi5pZGVhbEZyYWMpKTsKICAgIHZhciBndWFyYW50ZWVCeSA9IE1hdGgubWF4KGlkZWFsICsgMiwgTWF0aC5mbG9vcih0b3RhbE1vdmVzICogZGVmLmd1YXJhbnRlZUZyYWMpKTsKICAgIHJldHVybiB7CiAgICAgIGZlYXR1cmVJZDogZmVhdHVyZUlkLAogICAgICBkZWY6IGRlZiwKICAgICAgdG90YWxNb3ZlczogdG90YWxNb3ZlcywKICAgICAgY3VycmVudE1vdmU6IDAsCiAgICAgIG1vdmVzUmVtYWluaW5nOiB0b3RhbE1vdmVzLAogICAgICBldmVudHNUcmlnZ2VyZWQ6IDAsCiAgICAgIGZhaWxlZE9wcG9ydHVuaXRpZXM6IDAsCiAgICAgIHJlYWRpbmVzczogMCwKICAgICAgZmVhdHVyZVByZXNzdXJlOiAwLAogICAgICBhc3Npc3RhbmNlOiAwLAogICAgICBlYXJsaWVzdDogZWFybGllc3QsCiAgICAgIGlkZWFsOiBpZGVhbCwKICAgICAgZ3VhcmFudGVlQnk6IGd1YXJhbnRlZUJ5LAogICAgICBvcHBvcnR1bml0eUtpbmQ6ICJub25lIiwKICAgICAgbGFzdFNjYW46IG51bGwsCiAgICAgIGJpYXNUeXBlOiAtMSwKICAgICAgYmlhc1pvbmU6IG51bGwsCiAgICAgIHNvZnRQcm90ZWN0VW50aWw6IDAsCiAgICAgIHNlZWRlZENlbGxzOiBbXSwKICAgICAgcGVuZGluZ0Fzc2lzdDogZmFsc2UKICAgIH07CiAgfQoKICBmdW5jdGlvbiBlZEFjdGl2ZSgpIHsKICAgIHJldHVybiAhIShldmVudERpcmVjdG9yICYmIGV2ZW50RGlyZWN0b3IuZmVhdHVyZUlkICYmIHN0YXRlID09PSAicGxheSIpOwogIH0KCiAgZnVuY3Rpb24gZWRFbWl0KGtpbmQsIGV4dHJhKSB7CiAgICBpZiAoIWV2ZW50RGlyZWN0b3IpIHJldHVybjsKICAgIHZhciBwYXlsb2FkID0gZXh0cmEgfHwge307CiAgICBwYXlsb2FkLmtpbmQgPSBraW5kOwogICAgcGF5bG9hZC5mZWF0dXJlSWQgPSBldmVudERpcmVjdG9yLmZlYXR1cmVJZDsKICAgIHBheWxvYWQubW92ZSA9IGV2ZW50RGlyZWN0b3IuY3VycmVudE1vdmU7CiAgICBwYXlsb2FkLmFzc2lzdGFuY2UgPSBldmVudERpcmVjdG9yLmFzc2lzdGFuY2U7CiAgICBwYXlsb2FkLnByZXNzdXJlID0gZXZlbnREaXJlY3Rvci5mZWF0dXJlUHJlc3N1cmU7CiAgICBwYXlsb2FkLnJlYWRpbmVzcyA9IGV2ZW50RGlyZWN0b3IucmVhZGluZXNzOwogICAgZXZlbnRCdXMuZW1pdCgiZ2FtZUV2ZW50IiwgcGF5bG9hZCk7CiAgICBldmVudEJ1cy5lbWl0KGtpbmQsIHBheWxvYWQpOwogIH0KCiAgZnVuY3Rpb24gZWRNYXJrU29mdFByb3RlY3QoY2VsbHMsIHNlY29uZHMpIHsKICAgIGlmICghZXZlbnREaXJlY3RvcikgcmV0dXJuOwogICAgdmFyIHVudGlsID0gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwICsgKHNlY29uZHMgfHwgMi41KTsKICAgIGV2ZW50RGlyZWN0b3Iuc29mdFByb3RlY3RVbnRpbCA9IHVudGlsOwogICAgZXZlbnREaXJlY3Rvci5zZWVkZWRDZWxscyA9IGNlbGxzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudERpcmVjdG9yLnNlZWRlZENlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByYyA9IGV2ZW50RGlyZWN0b3Iuc2VlZGVkQ2VsbHNbaV07CiAgICAgIGlmIChpbkJvdW5kcyhyY1swXSwgcmNbMV0pICYmIGdyaWRbcmNbMF1dICYmIGdyaWRbcmNbMF1dW3JjWzFdXSkgewogICAgICAgIGdyaWRbcmNbMF1dW3JjWzFdXS5zb2Z0UHJvdGVjdFVudGlsID0gdW50aWw7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVkQ2xlYXJTb2Z0UHJvdGVjdCgpIHsKICAgIGlmICghZ3JpZCB8fCAhZ3JpZC5sZW5ndGgpIHJldHVybjsKICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZS5ub3coKSAvIDEwMDA7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBpZiAoIWdyaWRbcl0pIGNvbnRpbnVlOwogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgICAgICBpZiAodCAmJiB0LnNvZnRQcm90ZWN0VW50aWwgJiYgdC5zb2Z0UHJvdGVjdFVudGlsIDwgbm93KSB0LnNvZnRQcm90ZWN0VW50aWwgPSAwOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlZFRpbGVGcmVlKHIsIGMpIHsKICAgIGlmICghaW5Cb3VuZHMociwgYykpIHJldHVybiBmYWxzZTsKICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgIHJldHVybiB0ICYmICF0Lm9ic3RhY2xlICYmIHQudHlwZSA+PSAwICYmICF0LnNwZWNpYWw7CiAgfQoKICBmdW5jdGlvbiBlZFNldFR5cGUociwgYywgdHlwKSB7CiAgICBpZiAoIWVkVGlsZUZyZWUociwgYykgJiYgIShpbkJvdW5kcyhyLCBjKSAmJiBncmlkW3JdW2NdICYmICFncmlkW3JdW2NdLm9ic3RhY2xlKSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIHQgPSBncmlkW3JdW2NdOwogICAgaWYgKCF0IHx8IHQub2JzdGFjbGUpIHJldHVybiBmYWxzZTsKICAgIHQudHlwZSA9IHR5cDsKICAgIHQuc3BlY2lhbCA9IG51bGw7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGVkQXZvaWRJbW1lZGlhdGVNYXRjaGVzKCkgewogICAgdmFyIGd1YXJkID0gMDsKICAgIHdoaWxlIChndWFyZCsrIDwgMTYpIHsKICAgICAgdmFyIG0gPSBmaW5kTWF0Y2hlcyhncmlkKTsKICAgICAgaWYgKCFtLmdyb3Vwcy5sZW5ndGgpIHJldHVybjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtLmdyb3Vwcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjZWxsMCA9IG0uZ3JvdXBzW2ldLmNlbGxzWzBdOwogICAgICAgIHZhciB0ID0gZ3JpZFtjZWxsMFswXV1bY2VsbDBbMV1dOwogICAgICAgIGlmICh0ICYmICF0Lm9ic3RhY2xlKSB7CiAgICAgICAgICB2YXIgYWx0ID0gcmFuZFR5cGUoKTsKICAgICAgICAgIHZhciBzcGlucyA9IDA7CiAgICAgICAgICB3aGlsZSAoYWx0ID09PSB0LnR5cGUgJiYgc3BpbnMrKyA8IDgpIGFsdCA9IHJhbmRUeXBlKCk7CiAgICAgICAgICB0LnR5cGUgPSBhbHQ7CiAgICAgICAgICB0LnNwZWNpYWwgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZWRTY2FuU3VwZXJPcHAoKSB7CiAgICAvLyBEZXZlbG9waW5nID0gY3Jvc3Mgb3V0bGluZSAoNCBhcm1zLCB3cm9uZyBjZW50ZXIpLiBJbXBvc3NpYmxlIGlmIG5vIHJvb20uCiAgICB2YXIgYmVzdCA9IHtraW5kOiAiaW1wb3NzaWJsZSIsIHNjb3JlOiAwLCBoaW50OiBudWxsfTsKICAgIGZvciAodmFyIHIgPSAxOyByIDwgR1JJRCAtIDE7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMTsgYyA8IEdSSUQgLSAxOyBjKyspIHsKICAgICAgICBpZiAoIWVkVGlsZUZyZWUociwgYykpIGNvbnRpbnVlOwogICAgICAgIHZhciBhcm1zID0gW1tyIC0gMSwgY10sIFtyICsgMSwgY10sIFtyLCBjIC0gMV0sIFtyLCBjICsgMV1dOwogICAgICAgIHZhciBvayA9IHRydWU7CiAgICAgICAgdmFyIHR5cCA9IC0xOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKCFlZFRpbGVGcmVlKGFybXNbaV1bMF0sIGFybXNbaV1bMV0pKSB7IG9rID0gZmFsc2U7IGJyZWFrOyB9CiAgICAgICAgICB2YXIgYXQgPSBncmlkW2FybXNbaV1bMF1dW2FybXNbaV1bMV1dLnR5cGU7CiAgICAgICAgICBpZiAodHlwIDwgMCkgdHlwID0gYXQ7CiAgICAgICAgICBlbHNlIGlmIChhdCAhPT0gdHlwKSB7IG9rID0gZmFsc2U7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIGlmICghb2sgfHwgdHlwIDwgMCkgY29udGludWU7CiAgICAgICAgdmFyIGNlbnRlciA9IGdyaWRbcl1bY10udHlwZTsKICAgICAgICBpZiAoY2VudGVyID09PSB0eXApIHsKICAgICAgICAgIC8vIGZpbmlzaGVkIGNyb3NzIHdvdWxkIGFscmVhZHkgYmUgbWF0Y2hpbmc7IHRyZWF0IGFzIHNwZWN0YWNsZS1yZWFkeQogICAgICAgICAgYmVzdCA9IHtraW5kOiAiMS1tb3ZlIiwgc2NvcmU6IDEwMCwgaGludDogbnVsbCwgYXQ6IFtyLCBjXSwgdHlwZTogdHlwfTsKICAgICAgICAgIHJldHVybiBiZXN0OwogICAgICAgIH0KICAgICAgICAvLyBuZWFyLWNvbXBsZXRlIG91dGxpbmU6IHBsYXllciBuZWVkcyBjYXNjYWRlL0EgaW50byBjZW50ZXIKICAgICAgICBpZiAoYmVzdC5zY29yZSA8IDcwKSB7CiAgICAgICAgICBiZXN0ID0ge2tpbmQ6ICJkZXZlbG9waW5nIiwgc2NvcmU6IDcwLCBoaW50OiBudWxsLCBhdDogW3IsIGNdLCB0eXBlOiB0eXB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gQnJ1dGU6IGFueSBzd2FwIHdob3NlIGltbWVkaWF0ZSBtYXRjaCBncm91cHMgaW5jbHVkZSBhIHRydWUgKyAocmFyZSAvIGNhc2NhZGUtZmVkKQogICAgZm9yICh2YXIgcjEgPSAwOyByMSA8IEdSSUQ7IHIxKyspIHsKICAgICAgZm9yICh2YXIgYzEgPSAwOyBjMSA8IEdSSUQ7IGMxKyspIHsKICAgICAgICBpZiAoIWVkVGlsZUZyZWUocjEsIGMxKSkgY29udGludWU7CiAgICAgICAgdmFyIGRpcnMgPSBbWzAsIDFdLCBbMSwgMF1dOwogICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgMjsgZCsrKSB7CiAgICAgICAgICB2YXIgcjIgPSByMSArIGRpcnNbZF1bMF0sIGMyID0gYzEgKyBkaXJzW2RdWzFdOwogICAgICAgICAgaWYgKCFlZFRpbGVGcmVlKHIyLCBjMikpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIGcyID0gY2xvbmVHcmlkKGdyaWQpOwogICAgICAgICAgdmFyIHRtcCA9IGcyW3IxXVtjMV07IGcyW3IxXVtjMV0gPSBnMltyMl1bYzJdOyBnMltyMl1bYzJdID0gdG1wOwogICAgICAgICAgdmFyIHJlcyA9IGZpbmRNYXRjaGVzKGcyKTsKICAgICAgICAgIGlmICghcmVzLmdyb3Vwcy5sZW5ndGgpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIGNlbGxHcm91cHMgPSB7fTsKICAgICAgICAgIGZvciAodmFyIGdpID0gMDsgZ2kgPCByZXMuZ3JvdXBzLmxlbmd0aDsgZ2krKykgewogICAgICAgICAgICB2YXIgZ3JwID0gcmVzLmdyb3Vwc1tnaV07CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JwLmNlbGxzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgdmFyIGtrID0gZ3JwLmNlbGxzW2pdWzBdICsgIiwiICsgZ3JwLmNlbGxzW2pdWzFdOwogICAgICAgICAgICAgIGlmICghY2VsbEdyb3Vwc1tra10pIGNlbGxHcm91cHNba2tdID0gW107CiAgICAgICAgICAgICAgY2VsbEdyb3Vwc1tra10ucHVzaChncnApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY2VsbEdyb3VwcykgewogICAgICAgICAgICBpZiAoY2VsbEdyb3Vwc1trZXldLmxlbmd0aCA8IDIpIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoIiwiKTsKICAgICAgICAgICAgdmFyIHJyID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKSwgY2MgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICBpZiAoaXNUcnVlUGx1c0Nyb3NzKHJyLCBjYywgY2VsbEdyb3Vwc1trZXldKSkgewogICAgICAgICAgICAgIHJldHVybiB7a2luZDogIjEtbW92ZSIsIHNjb3JlOiAxMDAsIGhpbnQ6IFtbcjEsIGMxXSwgW3IyLCBjMl1dLCBhdDogW3JyLCBjY119OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvLyAyLW1vdmUtaXNoOiBzd2FwIGNyZWF0ZXMgYSBUL0wgYm9tYiBqdW5jdGlvbiAoZGV2ZWxvcGluZyB0b3dhcmQgY3Jvc3MpCiAgICAgICAgICBmb3IgKHZhciBrZXkyIGluIGNlbGxHcm91cHMpIHsKICAgICAgICAgICAgaWYgKGNlbGxHcm91cHNba2V5Ml0ubGVuZ3RoID49IDIgJiYgYmVzdC5zY29yZSA8IDU1KSB7CiAgICAgICAgICAgICAgYmVzdCA9IHtraW5kOiAiMi1tb3ZlIiwgc2NvcmU6IDU1LCBoaW50OiBbW3IxLCBjMV0sIFtyMiwgYzJdXX07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChiZXN0LnNjb3JlID09PSAwKSBiZXN0LmtpbmQgPSAiaW1wb3NzaWJsZSI7CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIGVkU2NhblBhd09wcCgpIHsKICAgIHZhciBiZXN0ID0ge2tpbmQ6ICJpbXBvc3NpYmxlIiwgc2NvcmU6IDAsIGhpbnQ6IG51bGx9OwogICAgZm9yICh2YXIgcjEgPSAwOyByMSA8IEdSSUQ7IHIxKyspIHsKICAgICAgZm9yICh2YXIgYzEgPSAwOyBjMSA8IEdSSUQ7IGMxKyspIHsKICAgICAgICBpZiAoIWVkVGlsZUZyZWUocjEsIGMxKSkgY29udGludWU7CiAgICAgICAgdmFyIGRpcnMgPSBbWzAsIDFdLCBbMSwgMF1dOwogICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgMjsgZCsrKSB7CiAgICAgICAgICB2YXIgcjIgPSByMSArIGRpcnNbZF1bMF0sIGMyID0gYzEgKyBkaXJzW2RdWzFdOwogICAgICAgICAgaWYgKCFlZFRpbGVGcmVlKHIyLCBjMikpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIGcyID0gY2xvbmVHcmlkKGdyaWQpOwogICAgICAgICAgdmFyIHRtcCA9IGcyW3IxXVtjMV07IGcyW3IxXVtjMV0gPSBnMltyMl1bYzJdOyBnMltyMl1bYzJdID0gdG1wOwogICAgICAgICAgdmFyIHJlcyA9IGZpbmRNYXRjaGVzKGcyKTsKICAgICAgICAgIGlmIChyZXMuZ3JvdXBzLmxlbmd0aCA8IDIpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIGNsdXN0ZXJzID0gY291bnREaXNqb2ludE1hdGNoQ2x1c3RlcnMocmVzLmdyb3Vwcyk7CiAgICAgICAgICBpZiAoY2x1c3RlcnMgPj0gMikgewogICAgICAgICAgICByZXR1cm4ge2tpbmQ6ICIxLW1vdmUiLCBzY29yZTogMTAwLCBoaW50OiBbW3IxLCBjMV0sIFtyMiwgYzJdXX07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzLmdyb3Vwcy5sZW5ndGggPj0gMiAmJiBiZXN0LnNjb3JlIDwgNTApIHsKICAgICAgICAgICAgYmVzdCA9IHtraW5kOiAiMi1tb3ZlIiwgc2NvcmU6IDUwLCBoaW50OiBbW3IxLCBjMV0sIFtyMiwgYzJdXX07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBkZXZlbG9waW5nOiB0d28gc2VwYXJhdGUgQUEgbmVhci1tYXRjaGVzIG9uIGJvYXJkCiAgICB2YXIgbmVhciA9IDA7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQgLSAyOyBjKyspIHsKICAgICAgICBpZiAoIWVkVGlsZUZyZWUociwgYykgfHwgIWVkVGlsZUZyZWUociwgYyArIDEpIHx8ICFlZFRpbGVGcmVlKHIsIGMgKyAyKSkgY29udGludWU7CiAgICAgICAgdmFyIGEgPSBncmlkW3JdW2NdLnR5cGUsIGIgPSBncmlkW3JdW2MgKyAxXS50eXBlLCBrID0gZ3JpZFtyXVtjICsgMl0udHlwZTsKICAgICAgICBpZiAoYSA9PT0gYiAmJiBhICE9PSBrKSBuZWFyKys7CiAgICAgICAgaWYgKGIgPT09IGsgJiYgYSAhPT0gYikgbmVhcisrOwogICAgICB9CiAgICB9CiAgICBpZiAobmVhciA+PSAyICYmIGJlc3Quc2NvcmUgPCA0MCkgYmVzdCA9IHtraW5kOiAiZGV2ZWxvcGluZyIsIHNjb3JlOiA0MCwgaGludDogbnVsbH07CiAgICBpZiAoYmVzdC5zY29yZSA9PT0gMCkgYmVzdC5raW5kID0gImltcG9zc2libGUiOwogICAgcmV0dXJuIGJlc3Q7CiAgfQoKICBmdW5jdGlvbiBlZFNjYW5EYXNoT3BwKCkgewogICAgdmFyIGJlc3QgPSB7a2luZDogImltcG9zc2libGUiLCBzY29yZTogMCwgaGludDogbnVsbCwgYXhpczogbnVsbH07CiAgICBmb3IgKHZhciByMSA9IDA7IHIxIDwgR1JJRDsgcjErKykgewogICAgICBmb3IgKHZhciBjMSA9IDA7IGMxIDwgR1JJRDsgYzErKykgewogICAgICAgIGlmICghZWRUaWxlRnJlZShyMSwgYzEpKSBjb250aW51ZTsKICAgICAgICB2YXIgZGlycyA9IFtbMCwgMV0sIFsxLCAwXV07CiAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCAyOyBkKyspIHsKICAgICAgICAgIHZhciByMiA9IHIxICsgZGlyc1tkXVswXSwgYzIgPSBjMSArIGRpcnNbZF1bMV07CiAgICAgICAgICBpZiAoIWVkVGlsZUZyZWUocjIsIGMyKSkgY29udGludWU7CiAgICAgICAgICB2YXIgZzIgPSBjbG9uZUdyaWQoZ3JpZCk7CiAgICAgICAgICB2YXIgdG1wID0gZzJbcjFdW2MxXTsgZzJbcjFdW2MxXSA9IGcyW3IyXVtjMl07IGcyW3IyXVtjMl0gPSB0bXA7CiAgICAgICAgICB2YXIgcmVzID0gZmluZE1hdGNoZXMoZzIpOwogICAgICAgICAgaWYgKCFyZXMuZ3JvdXBzLmxlbmd0aCkgY29udGludWU7CiAgICAgICAgICB2YXIgbGVmdCA9IGZhbHNlLCByaWdodCA9IGZhbHNlLCB0b3AgPSBmYWxzZSwgYm90dG9tID0gZmFsc2U7CiAgICAgICAgICBmb3IgKHZhciBnaSA9IDA7IGdpIDwgcmVzLmdyb3Vwcy5sZW5ndGg7IGdpKyspIHsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXMuZ3JvdXBzW2dpXS5jZWxscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIHZhciByciA9IHJlcy5ncm91cHNbZ2ldLmNlbGxzW2pdWzBdLCBjYyA9IHJlcy5ncm91cHNbZ2ldLmNlbGxzW2pdWzFdOwogICAgICAgICAgICAgIGlmIChjYyA9PT0gMCkgbGVmdCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKGNjID09PSBHUklEIC0gMSkgcmlnaHQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChyciA9PT0gMCkgdG9wID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAocnIgPT09IEdSSUQgLSAxKSBib3R0b20gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobGVmdCAmJiByaWdodCkgewogICAgICAgICAgICByZXR1cm4ge2tpbmQ6ICIxLW1vdmUiLCBzY29yZTogMTAwLCBoaW50OiBbW3IxLCBjMV0sIFtyMiwgYzJdXSwgYXhpczogImgifTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b3AgJiYgYm90dG9tKSB7CiAgICAgICAgICAgIHJldHVybiB7a2luZDogIjEtbW92ZSIsIHNjb3JlOiAxMDAsIGhpbnQ6IFtbcjEsIGMxXSwgW3IyLCBjMl1dLCBheGlzOiAidiJ9OwogICAgICAgICAgfQogICAgICAgICAgaWYgKChsZWZ0IHx8IHJpZ2h0IHx8IHRvcCB8fCBib3R0b20pICYmIGJlc3Quc2NvcmUgPCA0NSkgewogICAgICAgICAgICBiZXN0ID0ge2tpbmQ6ICJkZXZlbG9waW5nIiwgc2NvcmU6IDQ1LCBoaW50OiBbW3IxLCBjMV0sIFtyMiwgYzJdXSwKICAgICAgICAgICAgICBheGlzOiAobGVmdCB8fCByaWdodCkgPyAiaCIgOiAidiJ9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGJlc3Quc2NvcmUgPT09IDApIGJlc3Qua2luZCA9ICJpbXBvc3NpYmxlIjsKICAgIHJldHVybiBiZXN0OwogIH0KCiAgZnVuY3Rpb24gZWRTY2FuT3Bwb3J0dW5pdHkoKSB7CiAgICBpZiAoIWVkQWN0aXZlKCkpIHJldHVybiBudWxsOwogICAgZWRDbGVhclNvZnRQcm90ZWN0KCk7CiAgICB2YXIgc2NhbjsKICAgIGlmIChldmVudERpcmVjdG9yLmZlYXR1cmVJZCA9PT0gInN1cGVyY2F0Iikgc2NhbiA9IGVkU2NhblN1cGVyT3BwKCk7CiAgICBlbHNlIGlmIChldmVudERpcmVjdG9yLmZlYXR1cmVJZCA9PT0gInBhd2NsYXAiKSBzY2FuID0gZWRTY2FuUGF3T3BwKCk7CiAgICBlbHNlIGlmIChldmVudERpcmVjdG9yLmZlYXR1cmVJZCA9PT0gImNhdGRhc2giKSBzY2FuID0gZWRTY2FuRGFzaE9wcCgpOwogICAgZWxzZSBzY2FuID0ge2tpbmQ6ICJub25lIiwgc2NvcmU6IDB9OwogICAgZXZlbnREaXJlY3Rvci5sYXN0U2NhbiA9IHNjYW47CiAgICBldmVudERpcmVjdG9yLm9wcG9ydHVuaXR5S2luZCA9IHNjYW4ua2luZDsKICAgIGlmIChzY2FuLmtpbmQgPT09ICIxLW1vdmUiKSB7CiAgICAgIGV2ZW50RGlyZWN0b3IucmVhZGluZXNzID0gTWF0aC5taW4oMTAwLCBldmVudERpcmVjdG9yLnJlYWRpbmVzcyArIDE4KTsKICAgIH0gZWxzZSBpZiAoc2Nhbi5raW5kID09PSAiMi1tb3ZlIiB8fCBzY2FuLmtpbmQgPT09ICJkZXZlbG9waW5nIikgewogICAgICBldmVudERpcmVjdG9yLnJlYWRpbmVzcyA9IE1hdGgubWluKDEwMCwgZXZlbnREaXJlY3Rvci5yZWFkaW5lc3MgKyA4KTsKICAgIH0KICAgIHJldHVybiBzY2FuOwogIH0KCiAgZnVuY3Rpb24gZWRVcGRhdGVBc3Npc3RhbmNlKCkgewogICAgaWYgKCFlZEFjdGl2ZSgpKSByZXR1cm47CiAgICB2YXIgZWQgPSBldmVudERpcmVjdG9yOwogICAgaWYgKGVkLmV2ZW50c1RyaWdnZXJlZCA+IDAgfHwgZWQucmVhZGluZXNzID49IDg1KSB7CiAgICAgIGVkLmFzc2lzdGFuY2UgPSAwOwogICAgICBlZC5mZWF0dXJlUHJlc3N1cmUgPSBNYXRoLm1heCgwLCBlZC5mZWF0dXJlUHJlc3N1cmUgLSAxNSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBtdiA9IGVkLmN1cnJlbnRNb3ZlOwogICAgLy8gUmFtcCBwcmVzc3VyZSBhZnRlciBlYXJsaWVzdCB3aW5kb3cgaWYgbm8gdHJpZ2dlcgogICAgaWYgKG12ID49IGVkLmVhcmxpZXN0ICYmIGVkLmV2ZW50c1RyaWdnZXJlZCA9PT0gMCkgewogICAgICB2YXIgc3BhbiA9IE1hdGgubWF4KDEsIGVkLmd1YXJhbnRlZUJ5IC0gZWQuZWFybGllc3QpOwogICAgICB2YXIgdCA9IChtdiAtIGVkLmVhcmxpZXN0KSAvIHNwYW47CiAgICAgIGVkLmZlYXR1cmVQcmVzc3VyZSA9IE1hdGgubWluKDEwMCwgTWF0aC5mbG9vcih0ICogMTAwKSArIGVkLmZhaWxlZE9wcG9ydHVuaXRpZXMgKiA4KTsKICAgIH0KICAgIGlmIChtdiA8IGVkLmVhcmxpZXN0KSB7CiAgICAgIGVkLmFzc2lzdGFuY2UgPSAwOwogICAgfSBlbHNlIGlmIChtdiA+PSBlZC5ndWFyYW50ZWVCeSB8fCBlZC5mZWF0dXJlUHJlc3N1cmUgPj0gOTApIHsKICAgICAgZWQuYXNzaXN0YW5jZSA9IDM7CiAgICB9IGVsc2UgaWYgKG12ID49IGVkLmlkZWFsIHx8IGVkLmZlYXR1cmVQcmVzc3VyZSA+PSA1NSkgewogICAgICBlZC5hc3Npc3RhbmNlID0gMjsKICAgIH0gZWxzZSBpZiAoZWQuZmVhdHVyZVByZXNzdXJlID49IDI1KSB7CiAgICAgIGVkLmFzc2lzdGFuY2UgPSAxOwogICAgfSBlbHNlIHsKICAgICAgZWQuYXNzaXN0YW5jZSA9IDA7CiAgICB9CiAgICAvLyBTdG9wIGhlbHBpbmcgd2hlbiByZWFkaW5lc3MgYWxyZWFkeSBoaWdoIChuYXR1cmFsIG9wcG9ydHVuaXR5IHByZXNlbnQpCiAgICBpZiAoZWQucmVhZGluZXNzID49IDc1ICYmIGVkLm9wcG9ydHVuaXR5S2luZCA9PT0gIjEtbW92ZSIpIHsKICAgICAgZWQuYXNzaXN0YW5jZSA9IDA7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlZFBpY2tCaWFzVHlwZSgpIHsKICAgIGlmICghZWRBY3RpdmUoKSB8fCBldmVudERpcmVjdG9yLmFzc2lzdGFuY2UgPCAxKSByZXR1cm4gLTE7CiAgICBpZiAoZXZlbnREaXJlY3Rvci5iaWFzVHlwZSA+PSAwICYmIGFjdGl2ZVR5cGVzLmluZGV4T2YoZXZlbnREaXJlY3Rvci5iaWFzVHlwZSkgPj0gMCkgewogICAgICByZXR1cm4gZXZlbnREaXJlY3Rvci5iaWFzVHlwZTsKICAgIH0KICAgIC8vIFByZWZlciBhIGNvbW1vbiBib2FyZCBjb2xvcgogICAgdmFyIGNvdW50cyA9IHt9OwogICAgdmFyIGksIHIsIGM7CiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlVHlwZXMubGVuZ3RoOyBpKyspIGNvdW50c1thY3RpdmVUeXBlc1tpXV0gPSAwOwogICAgZm9yIChyID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKGMgPSAwOyBjIDwgR1JJRDsgYysrKSB7CiAgICAgICAgdmFyIHQgPSBncmlkW3JdICYmIGdyaWRbcl1bY107CiAgICAgICAgaWYgKHQgJiYgdC50eXBlID49IDAgJiYgY291bnRzW3QudHlwZV0gIT09IHVuZGVmaW5lZCkgY291bnRzW3QudHlwZV0rKzsKICAgICAgfQogICAgfQogICAgdmFyIGJlc3QgPSBhY3RpdmVUeXBlc1swXSwgYmVzdE4gPSAtMTsKICAgIGZvciAoaSA9IDA7IGkgPCBhY3RpdmVUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdHlwID0gYWN0aXZlVHlwZXNbaV07CiAgICAgIGlmIChjb3VudHNbdHlwXSA+IGJlc3ROKSB7IGJlc3ROID0gY291bnRzW3R5cF07IGJlc3QgPSB0eXA7IH0KICAgIH0KICAgIGV2ZW50RGlyZWN0b3IuYmlhc1R5cGUgPSBiZXN0OwogICAgcmV0dXJuIGJlc3Q7CiAgfQoKICBmdW5jdGlvbiBlZFdlaWdodGVkVHlwZShhdm9pZDEsIGF2b2lkMikgewogICAgLy8gQmlhcyBmYWxsaW5nIGNvbG9ycyB0b3dhcmQgc2V0dXBzIHdoZW4gYXNzaXN0aW5nOyBlbHNlIG5vcm1hbCByYW5kVHlwZQogICAgaWYgKCFlZEFjdGl2ZSgpIHx8IGV2ZW50RGlyZWN0b3IuYXNzaXN0YW5jZSA8IDEpIHJldHVybiByYW5kVHlwZSgpOwogICAgaWYgKGV2ZW50RGlyZWN0b3Iub3Bwb3J0dW5pdHlLaW5kID09PSAiMS1tb3ZlIiAmJiBldmVudERpcmVjdG9yLnJlYWRpbmVzcyA+PSA2MCkgewogICAgICByZXR1cm4gcmFuZFR5cGUoKTsgLy8gc3RvcCBoZWxwaW5nIHdoZW4gb3Bwb3J0dW5pdHkgZXhpc3RzCiAgICB9CiAgICB2YXIgYmlhcyA9IGVkUGlja0JpYXNUeXBlKCk7CiAgICB2YXIgcm9sbCA9IE1hdGgucmFuZG9tKCk7CiAgICB2YXIgd2VpZ2h0ID0gMC4yMiArIGV2ZW50RGlyZWN0b3IuYXNzaXN0YW5jZSAqIDAuMTIgKyBldmVudERpcmVjdG9yLmZlYXR1cmVQcmVzc3VyZSAqIDAuMDAyOwogICAgaWYgKHdlaWdodCA+IDAuNjIpIHdlaWdodCA9IDAuNjI7CiAgICB2YXIgdCwgZ3VhcmQgPSAwOwogICAgaWYgKGJpYXMgPj0gMCAmJiByb2xsIDwgd2VpZ2h0KSB0ID0gYmlhczsKICAgIGVsc2UgdCA9IHJhbmRUeXBlKCk7CiAgICB3aGlsZSAoZ3VhcmQrKyA8IDIwICYmICgoYXZvaWQxICE9PSB1bmRlZmluZWQgJiYgdCA9PT0gYXZvaWQxKSB8fCAoYXZvaWQyICE9PSB1bmRlZmluZWQgJiYgdCA9PT0gYXZvaWQyKSkpIHsKICAgICAgdCA9IHJhbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gdDsKICB9CgogIGZ1bmN0aW9uIGVkWm9uZUZhdm9yKGNvbCwgcm93KSB7CiAgICAvLyBDYXQgRGFzaDogcHJvZ3Jlc3NpdmUgZmF2b3IgZm9yIGxlZnQvcmlnaHQgT1IgdG9wL2JvdHRvbSwgbm90IGJvdGgKICAgIGlmICghZWRBY3RpdmUoKSB8fCBldmVudERpcmVjdG9yLmZlYXR1cmVJZCAhPT0gImNhdGRhc2giKSByZXR1cm4gMTsKICAgIGlmIChldmVudERpcmVjdG9yLmFzc2lzdGFuY2UgPCAxKSByZXR1cm4gMTsKICAgIGlmICghZXZlbnREaXJlY3Rvci5iaWFzWm9uZSkgewogICAgICBldmVudERpcmVjdG9yLmJpYXNab25lID0gTWF0aC5yYW5kb20oKSA8IDAuNSA\/ICJoIiA6ICJ2IjsKICAgIH0KICAgIHZhciBwID0gMSArIGV2ZW50RGlyZWN0b3IuYXNzaXN0YW5jZSAqIDAuMTU7CiAgICBpZiAoZXZlbnREaXJlY3Rvci5iaWFzWm9uZSA9PT0gImgiKSB7CiAgICAgIGlmIChjb2wgPT09IDAgfHwgY29sID09PSBHUklEIC0gMSkgcmV0dXJuIHA7CiAgICB9IGVsc2UgewogICAgICBpZiAocm93ID09PSAwIHx8IHJvdyA9PT0gR1JJRCAtIDEpIHJldHVybiBwOwogICAgfQogICAgcmV0dXJuIDE7CiAgfQoKICBmdW5jdGlvbiBlZFNlZWRTdXBlck91dGxpbmUoKSB7CiAgICB2YXIgdHJpZXMgPSAwOwogICAgd2hpbGUgKHRyaWVzKysgPCAyNCkgewogICAgICB2YXIgciA9IDIgKyAoKE1hdGgucmFuZG9tKCkgKiAoR1JJRCAtIDQpKSB8IDApOwogICAgICB2YXIgYyA9IDIgKyAoKE1hdGgucmFuZG9tKCkgKiAoR1JJRCAtIDQpKSB8IDApOwogICAgICB2YXIgYXJtcyA9IFtbciAtIDEsIGNdLCBbciArIDEsIGNdLCBbciwgYyAtIDFdLCBbciwgYyArIDFdXTsKICAgICAgdmFyIGZyZWUgPSBlZFRpbGVGcmVlKHIsIGMpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFybXMubGVuZ3RoOyBpKyspIGlmICghZWRUaWxlRnJlZShhcm1zW2ldWzBdLCBhcm1zW2ldWzFdKSkgZnJlZSA9IGZhbHNlOwogICAgICBpZiAoIWZyZWUpIGNvbnRpbnVlOwogICAgICB2YXIgYSA9IGVkUGlja0JpYXNUeXBlKCk7CiAgICAgIGlmIChhIDwgMCkgYSA9IGFjdGl2ZVR5cGVzWzBdOwogICAgICB2YXIgYiA9IGFjdGl2ZVR5cGVzLmxlbmd0aCA+IDEgPyBhY3RpdmVUeXBlc1soYWN0aXZlVHlwZXNbMF0gPT09IGEpID8gMSA6IDBdIDogKGEgKyAxKSAlIFRZUEVTOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFybXMubGVuZ3RoOyBqKyspIGVkU2V0VHlwZShhcm1zW2pdWzBdLCBhcm1zW2pdWzFdLCBhKTsKICAgICAgZWRTZXRUeXBlKHIsIGMsIGIpOwogICAgICAvLyBFeHRyYSBBIGFib3ZlIHNvIGEgbGF0ZXIgZmFsbCBjYW4gY29tcGxldGUgKGNhc2NhZGUgcGF0aCkgd2l0aG91dCBmaW5pc2hpbmcgbm93CiAgICAgIGlmIChyIC0gMiA+PSAwICYmIGVkVGlsZUZyZWUociAtIDIsIGMpICYmIGdyaWRbciAtIDJdW2NdLnR5cGUgIT09IGEpIHsKICAgICAgICAvLyBsZWF2ZSBhcy1pcyBvciBzb2Z0IGJpYXMKICAgICAgfQogICAgICAvLyBCcmVhayBhY2NpZGVudGFsIGxpbmVzIG9mIDMgb3V0c2lkZQogICAgICBlZEF2b2lkSW1tZWRpYXRlTWF0Y2hlcygpOwogICAgICAvLyBSZS1hcHBseSBvdXRsaW5lIGlmIG51ZGdpbmcgYnJva2UgaXQKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhcm1zLmxlbmd0aDsgaysrKSB7CiAgICAgICAgaWYgKGVkVGlsZUZyZWUoYXJtc1trXVswXSwgYXJtc1trXVsxXSkpIGVkU2V0VHlwZShhcm1zW2tdWzBdLCBhcm1zW2tdWzFdLCBhKTsKICAgICAgfQogICAgICBpZiAoZWRUaWxlRnJlZShyLCBjKSkgZWRTZXRUeXBlKHIsIGMsIGIpOwogICAgICBpZiAoZmluZE1hdGNoZXMoZ3JpZCkuZ3JvdXBzLmxlbmd0aCkgewogICAgICAgIGVkQXZvaWRJbW1lZGlhdGVNYXRjaGVzKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFyIGNlbGxzID0gYXJtcy5jb25jYXQoW1tyLCBjXV0pOwogICAgICBlZE1hcmtTb2Z0UHJvdGVjdChjZWxscywgMy4wKTsKICAgICAgZXZlbnREaXJlY3Rvci5iaWFzVHlwZSA9IGE7CiAgICAgIGVkRW1pdCgiZGlyZWN0b3I6c2VlZCIsIHtwYXR0ZXJuOiAic3VwZXItb3V0bGluZSIsIGF0OiBbciwgY119KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlZFNlZWRQYXdEdWFsKCkgewogICAgLy8gR2VuZXJhdGUtYW5kLXZlcmlmeTogdHdlYWsgYSBsb2NhbCB3aW5kb3cgdW50aWwgYSAxLW1vdmUgcGF3LWNsYXAgc3dhcCBleGlzdHMuCiAgICB2YXIgdHJpZXMgPSAwOwogICAgdmFyIEEgPSBlZFBpY2tCaWFzVHlwZSgpOwogICAgaWYgKEEgPCAwKSBBID0gYWN0aXZlVHlwZXNbMF07CiAgICB2YXIgcGFsZXR0ZSA9IGFjdGl2ZVR5cGVzLnNsaWNlKCk7CiAgICB3aGlsZSAodHJpZXMrKyA8IDQwKSB7CiAgICAgIHZhciByID0gMSArICgoTWF0aC5yYW5kb20oKSAqIChHUklEIC0gMykpIHwgMCk7CiAgICAgIHZhciBjID0gMSArICgoTWF0aC5yYW5kb20oKSAqIChHUklEIC0gNSkpIHwgMCk7CiAgICAgIHZhciB0b3VjaGVkID0gW107CiAgICAgIHZhciByciwgY2MsIG9rID0gdHJ1ZTsKICAgICAgZm9yIChyciA9IHI7IHJyIDw9IHIgKyAxOyBycisrKSB7CiAgICAgICAgZm9yIChjYyA9IGM7IGNjIDw9IGMgKyA0OyBjYysrKSB7CiAgICAgICAgICBpZiAoIWluQm91bmRzKHJyLCBjYykgfHwgIWdyaWRbcnJdW2NjXSB8fCBncmlkW3JyXVtjY10ub2JzdGFjbGUpIHsgb2sgPSBmYWxzZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKCFvaykgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFvaykgY29udGludWU7CiAgICAgIGZvciAocnIgPSByOyByciA8PSByICsgMTsgcnIrKykgewogICAgICAgIGZvciAoY2MgPSBjOyBjYyA8PSBjICsgNDsgY2MrKykgewogICAgICAgICAgdmFyIHR5cCA9IHBhbGV0dGVbKE1hdGgucmFuZG9tKCkgKiBwYWxldHRlLmxlbmd0aCkgfCAwXTsKICAgICAgICAgIC8vIEJpYXMgdG93YXJkIEEgZm9yIGR1YWwgbmVhci1tYXRjaGVzCiAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuNDUpIHR5cCA9IEE7CiAgICAgICAgICBlZFNldFR5cGUocnIsIGNjLCB0eXApOwogICAgICAgICAgdG91Y2hlZC5wdXNoKFtyciwgY2NdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWRBdm9pZEltbWVkaWF0ZU1hdGNoZXMoKTsKICAgICAgaWYgKGZpbmRNYXRjaGVzKGdyaWQpLmdyb3Vwcy5sZW5ndGgpIGNvbnRpbnVlOwogICAgICB2YXIgc2NhbiA9IGVkU2NhblBhd09wcCgpOwogICAgICBpZiAoc2Nhbi5raW5kID09PSAiMS1tb3ZlIikgewogICAgICAgIGVkTWFya1NvZnRQcm90ZWN0KHRvdWNoZWQsIDMuMCk7CiAgICAgICAgZXZlbnREaXJlY3Rvci5iaWFzVHlwZSA9IEE7CiAgICAgICAgZWRFbWl0KCJkaXJlY3RvcjpzZWVkIiwge3BhdHRlcm46ICJwYXctMW1vdmUiLCBoaW50OiBzY2FuLmhpbnR9KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgLy8gU29mdCBmYWxsYmFjazogdHdvIHNlcGFyYXRlIEFBXyBuZWFyIG1hdGNoZXMKICAgIHRyaWVzID0gMDsKICAgIHdoaWxlICh0cmllcysrIDwgMjApIHsKICAgICAgdmFyIHIyID0gMSArICgoTWF0aC5yYW5kb20oKSAqIChHUklEIC0gMikpIHwgMCk7CiAgICAgIHZhciBjMiA9IDEgKyAoKE1hdGgucmFuZG9tKCkgKiAoR1JJRCAtIDQpKSB8IDApOwogICAgICB2YXIgQiA9IEE7CiAgICAgIGZvciAodmFyIGJpID0gMDsgYmkgPCBhY3RpdmVUeXBlcy5sZW5ndGg7IGJpKyspIHsKICAgICAgICBpZiAoYWN0aXZlVHlwZXNbYmldICE9PSBBKSB7IEIgPSBhY3RpdmVUeXBlc1tiaV07IGJyZWFrOyB9CiAgICAgIH0KICAgICAgdmFyIFggPSBCOwogICAgICBmb3IgKHZhciB4aSA9IDA7IHhpIDwgYWN0aXZlVHlwZXMubGVuZ3RoOyB4aSsrKSB7CiAgICAgICAgaWYgKGFjdGl2ZVR5cGVzW3hpXSAhPT0gQSAmJiBhY3RpdmVUeXBlc1t4aV0gIT09IEIpIHsgWCA9IGFjdGl2ZVR5cGVzW3hpXTsgYnJlYWs7IH0KICAgICAgfQogICAgICBpZiAoIWVkVGlsZUZyZWUocjIsIGMyKSB8fCAhZWRUaWxlRnJlZShyMiwgYzIgKyAxKSB8fCAhZWRUaWxlRnJlZShyMiwgYzIgKyAyKSkgY29udGludWU7CiAgICAgIGlmICghZWRUaWxlRnJlZShyMiArIDEsIGMyICsgMikpIGNvbnRpbnVlOwogICAgICBlZFNldFR5cGUocjIsIGMyLCBBKTsgZWRTZXRUeXBlKHIyLCBjMiArIDEsIEEpOyBlZFNldFR5cGUocjIsIGMyICsgMiwgWCk7CiAgICAgIGVkU2V0VHlwZShyMiArIDEsIGMyICsgMiwgQSk7CiAgICAgIGlmIChjMiArIDUgPCBHUklEICYmIGVkVGlsZUZyZWUocjIsIGMyICsgMykgJiYgZWRUaWxlRnJlZShyMiwgYzIgKyA0KSAmJiBlZFRpbGVGcmVlKHIyLCBjMiArIDUpICYmIGVkVGlsZUZyZWUocjIgKyAxLCBjMiArIDUpKSB7CiAgICAgICAgZWRTZXRUeXBlKHIyLCBjMiArIDMsIFgpOyBlZFNldFR5cGUocjIsIGMyICsgNCwgQik7IGVkU2V0VHlwZShyMiwgYzIgKyA1LCBCKTsKICAgICAgICBlZFNldFR5cGUocjIgKyAxLCBjMiArIDUsIEIpOwogICAgICB9CiAgICAgIGVkQXZvaWRJbW1lZGlhdGVNYXRjaGVzKCk7CiAgICAgIGlmIChmaW5kTWF0Y2hlcyhncmlkKS5ncm91cHMubGVuZ3RoKSBjb250aW51ZTsKICAgICAgZWRNYXJrU29mdFByb3RlY3QoW1tyMiwgYzJdLCBbcjIsIGMyICsgMV0sIFtyMiwgYzIgKyAyXSwgW3IyICsgMSwgYzIgKyAyXV0sIDIuNSk7CiAgICAgIGVkRW1pdCgiZGlyZWN0b3I6c2VlZCIsIHtwYXR0ZXJuOiAicGF3LW5lYXIifSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZWRTZWVkRGFzaEVkZ2VzKCkgewogICAgLy8gUHJlZmVyIG9uZSBheGlzOyBwbGFudCBlZGdlIG5lYXItbWF0Y2hlcyArIHpvbmUgYmlhcyAodHJ1ZSBvcHBvc2l0ZS1lZGdlIG9uZS1zd2FwIGlzIHJhcmUgb24gOHg4KS4KICAgIGlmICghZXZlbnREaXJlY3Rvci5iaWFzWm9uZSkgZXZlbnREaXJlY3Rvci5iaWFzWm9uZSA9IE1hdGgucmFuZG9tKCkgPCAwLjUgPyAiaCIgOiAidiI7CiAgICB2YXIgaG9yaXogPSBldmVudERpcmVjdG9yLmJpYXNab25lID09PSAiaCI7CiAgICB2YXIgQSA9IGVkUGlja0JpYXNUeXBlKCk7CiAgICBpZiAoQSA8IDApIEEgPSBhY3RpdmVUeXBlc1swXTsKICAgIHZhciBYID0gQTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aXZlVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGFjdGl2ZVR5cGVzW2ldICE9PSBBKSB7IFggPSBhY3RpdmVUeXBlc1tpXTsgYnJlYWs7IH0KICAgIH0KICAgIHZhciBjZWxscyA9IFtdOwogICAgdmFyIHBsYW50ZWQgPSAwOwogICAgaWYgKGhvcml6KSB7CiAgICAgIHZhciByID0gMSArICgoTWF0aC5yYW5kb20oKSAqIChHUklEIC0gMikpIHwgMCk7CiAgICAgIC8vIExlZnQgZWRnZSBuZWFyOiBBQV8gd2l0aCBBIGJlbG93IGhvbGUKICAgICAgaWYgKGVkVGlsZUZyZWUociwgMCkgJiYgZWRUaWxlRnJlZShyLCAxKSAmJiBlZFRpbGVGcmVlKHIsIDIpICYmIGVkVGlsZUZyZWUociArIDEsIDIpKSB7CiAgICAgICAgZWRTZXRUeXBlKHIsIDAsIEEpOyBlZFNldFR5cGUociwgMSwgQSk7IGVkU2V0VHlwZShyLCAyLCBYKTsgZWRTZXRUeXBlKHIgKyAxLCAyLCBBKTsKICAgICAgICBjZWxscy5wdXNoKFtyLCAwXSwgW3IsIDFdLCBbciwgMl0sIFtyICsgMSwgMl0pOwogICAgICAgIHBsYW50ZWQrKzsKICAgICAgfQogICAgICAvLyBSaWdodCBlZGdlIG5lYXIKICAgICAgaWYgKGVkVGlsZUZyZWUociwgR1JJRCAtIDEpICYmIGVkVGlsZUZyZWUociwgR1JJRCAtIDIpICYmIGVkVGlsZUZyZWUociwgR1JJRCAtIDMpICYmIGVkVGlsZUZyZWUociArIDEsIEdSSUQgLSAzKSkgewogICAgICAgIGVkU2V0VHlwZShyLCBHUklEIC0gMSwgQSk7IGVkU2V0VHlwZShyLCBHUklEIC0gMiwgQSk7IGVkU2V0VHlwZShyLCBHUklEIC0gMywgWCk7IGVkU2V0VHlwZShyICsgMSwgR1JJRCAtIDMsIEEpOwogICAgICAgIGNlbGxzLnB1c2goW3IsIEdSSUQgLSAxXSwgW3IsIEdSSUQgLSAyXSwgW3IsIEdSSUQgLSAzXSwgW3IgKyAxLCBHUklEIC0gM10pOwogICAgICAgIHBsYW50ZWQrKzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGMgPSAxICsgKChNYXRoLnJhbmRvbSgpICogKEdSSUQgLSAyKSkgfCAwKTsKICAgICAgaWYgKGVkVGlsZUZyZWUoMCwgYykgJiYgZWRUaWxlRnJlZSgxLCBjKSAmJiBlZFRpbGVGcmVlKDIsIGMpICYmIGVkVGlsZUZyZWUoMiwgYyArIDEgPCBHUklEID8gYyArIDEgOiBjIC0gMSkpIHsKICAgICAgICB2YXIgc2lkZSA9IGMgKyAxIDwgR1JJRCA\/IGMgKyAxIDogYyAtIDE7CiAgICAgICAgZWRTZXRUeXBlKDAsIGMsIEEpOyBlZFNldFR5cGUoMSwgYywgQSk7IGVkU2V0VHlwZSgyLCBjLCBYKTsgZWRTZXRUeXBlKDIsIHNpZGUsIEEpOwogICAgICAgIGNlbGxzLnB1c2goWzAsIGNdLCBbMSwgY10sIFsyLCBjXSwgWzIsIHNpZGVdKTsKICAgICAgICBwbGFudGVkKys7CiAgICAgIH0KICAgICAgaWYgKGVkVGlsZUZyZWUoR1JJRCAtIDEsIGMpICYmIGVkVGlsZUZyZWUoR1JJRCAtIDIsIGMpICYmIGVkVGlsZUZyZWUoR1JJRCAtIDMsIGMpKSB7CiAgICAgICAgdmFyIHNpZGUyID0gYyArIDEgPCBHUklEID8gYyArIDEgOiBjIC0gMTsKICAgICAgICBpZiAoZWRUaWxlRnJlZShHUklEIC0gMywgc2lkZTIpKSB7CiAgICAgICAgICBlZFNldFR5cGUoR1JJRCAtIDEsIGMsIEEpOyBlZFNldFR5cGUoR1JJRCAtIDIsIGMsIEEpOyBlZFNldFR5cGUoR1JJRCAtIDMsIGMsIFgpOyBlZFNldFR5cGUoR1JJRCAtIDMsIHNpZGUyLCBBKTsKICAgICAgICAgIGNlbGxzLnB1c2goW0dSSUQgLSAxLCBjXSwgW0dSSUQgLSAyLCBjXSwgW0dSSUQgLSAzLCBjXSwgW0dSSUQgLSAzLCBzaWRlMl0pOwogICAgICAgICAgcGxhbnRlZCsrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWRBdm9pZEltbWVkaWF0ZU1hdGNoZXMoKTsKICAgIGlmIChjZWxscy5sZW5ndGgpIGVkTWFya1NvZnRQcm90ZWN0KGNlbGxzLCAzLjApOwogICAgZXZlbnREaXJlY3Rvci5iaWFzVHlwZSA9IEE7CiAgICAvLyBHZW5lcmF0ZS1hbmQtdmVyaWZ5IHBhc3MgZm9yIGEgdHJ1ZSAxLW1vdmUgZGFzaCBpZiBsdWNreQogICAgdmFyIGd0cmllcyA9IDA7CiAgICB3aGlsZSAoZ3RyaWVzKysgPCAyNSkgewogICAgICB2YXIgc2NhbiA9IGVkU2NhbkRhc2hPcHAoKTsKICAgICAgaWYgKHNjYW4ua2luZCA9PT0gIjEtbW92ZSIpIHsKICAgICAgICBlZEVtaXQoImRpcmVjdG9yOnNlZWQiLCB7cGF0dGVybjogImRhc2gtMW1vdmUiLCBoaW50OiBzY2FuLmhpbnQsIGF4aXM6IHNjYW4uYXhpc30pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIG51ZGdlIGVkZ2UgY29sdW1ucyB0b3dhcmQgYmlhcyBjb2xvcgogICAgICB2YXIgY29sID0gKGd0cmllcyAlIDIgPT09IDApID8gMCA6IEdSSUQgLSAxOwogICAgICB2YXIgcm93ID0gKE1hdGgucmFuZG9tKCkgKiBHUklEKSB8IDA7CiAgICAgIGlmIChlZFRpbGVGcmVlKHJvdywgY29sKSAmJiBNYXRoLnJhbmRvbSgpIDwgMC41KSBlZFNldFR5cGUocm93LCBjb2wsIEEpOwogICAgICBlZEF2b2lkSW1tZWRpYXRlTWF0Y2hlcygpOwogICAgfQogICAgZWRFbWl0KCJkaXJlY3RvcjpzZWVkIiwge3BhdHRlcm46IHBsYW50ZWQgPj0gMiA\/ICJkYXNoLWR1YWwtbmVhciIgOiAiZGFzaC16b25lIiwgYXhpczogZXZlbnREaXJlY3Rvci5iaWFzWm9uZX0pOwogICAgcmV0dXJuIHBsYW50ZWQgPiAwOwogIH0KCiAgZnVuY3Rpb24gZWRUcnlTZWVkKCkgewogICAgaWYgKCFlZEFjdGl2ZSgpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgZWQgPSBldmVudERpcmVjdG9yOwogICAgaWYgKGVkLmV2ZW50c1RyaWdnZXJlZCA+IDApIHJldHVybiBmYWxzZTsKICAgIGlmIChlZC5hc3Npc3RhbmNlIDwgMikgcmV0dXJuIGZhbHNlOwogICAgdmFyIHNjYW4gPSBlZFNjYW5PcHBvcnR1bml0eSgpOwogICAgaWYgKHNjYW4gJiYgc2Nhbi5raW5kID09PSAiMS1tb3ZlIikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGVkLmZlYXR1cmVJZCA9PT0gInN1cGVyY2F0IikgcmV0dXJuIGVkU2VlZFN1cGVyT3V0bGluZSgpOwogICAgaWYgKGVkLmZlYXR1cmVJZCA9PT0gInBhd2NsYXAiKSByZXR1cm4gZWRTZWVkUGF3RHVhbCgpOwogICAgaWYgKGVkLmZlYXR1cmVJZCA9PT0gImNhdGRhc2giKSByZXR1cm4gZWRTZWVkRGFzaEVkZ2VzKCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlZE9uTW92ZVJlc29sdmVkKGZlYXR1cmVKdXN0VHJpZ2dlcmVkKSB7CiAgICBpZiAoIWV2ZW50RGlyZWN0b3IpIHJldHVybjsKICAgIHZhciBlZCA9IGV2ZW50RGlyZWN0b3I7CiAgICBlZC5jdXJyZW50TW92ZSArPSAxOwogICAgZWQubW92ZXNSZW1haW5pbmcgPSBtb3Zlc0xlZnQ7CiAgICBpZiAoZmVhdHVyZUp1c3RUcmlnZ2VyZWQpIHsKICAgICAgZWQuZXZlbnRzVHJpZ2dlcmVkICs9IDE7CiAgICAgIGVkLnJlYWRpbmVzcyA9IE1hdGgubWluKDEwMCwgZWQucmVhZGluZXNzICsgNDApOwogICAgICBlZC5mZWF0dXJlUHJlc3N1cmUgPSBNYXRoLm1heCgwLCBlZC5mZWF0dXJlUHJlc3N1cmUgLSA0MCk7CiAgICAgIGVkRW1pdCgiZmVhdHVyZTp0cmlnZ2VyZWQiLCB7Y291bnQ6IGVkLmV2ZW50c1RyaWdnZXJlZH0pOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHByZXYgPSBlZC5vcHBvcnR1bml0eUtpbmQ7CiAgICAgIHZhciBzY2FuID0gZWRTY2FuT3Bwb3J0dW5pdHkoKTsKICAgICAgaWYgKHByZXYgPT09ICIxLW1vdmUiICYmIHNjYW4gJiYgc2Nhbi5raW5kICE9PSAiMS1tb3ZlIikgewogICAgICAgIGVkLmZhaWxlZE9wcG9ydHVuaXRpZXMgKz0gMTsKICAgICAgICBlZC5mZWF0dXJlUHJlc3N1cmUgPSBNYXRoLm1pbigxMDAsIGVkLmZlYXR1cmVQcmVzc3VyZSArIDEyKTsKICAgICAgICBlZEVtaXQoImZlYXR1cmU6ZmFpbGVkIiwge2ZhaWxlZDogZWQuZmFpbGVkT3Bwb3J0dW5pdGllc30pOwogICAgICB9CiAgICB9CiAgICBlZFVwZGF0ZUFzc2lzdGFuY2UoKTsKICAgIGlmIChlZC5hc3Npc3RhbmNlID49IDEpIHsKICAgICAgZWRQaWNrQmlhc1R5cGUoKTsKICAgIH0KICAgIGlmIChlZC5hc3Npc3RhbmNlID49IDIpIHsKICAgICAgZWRUcnlTZWVkKCk7CiAgICB9CiAgICAvLyBSZS1zY2FuIGFmdGVyIHBvc3NpYmxlIHNlZWQKICAgIGVkU2Nhbk9wcG9ydHVuaXR5KCk7CiAgICBlZEVtaXQoImRpcmVjdG9yOnRpY2siLCB7CiAgICAgIG9wcG9ydHVuaXR5OiBlZC5vcHBvcnR1bml0eUtpbmQsCiAgICAgIGFzc2lzdGFuY2U6IGVkLmFzc2lzdGFuY2UKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZWROb3RlRmVhdHVyZVRyaWdnZXIoZmlkKSB7CiAgICBpZiAoIWV2ZW50RGlyZWN0b3IgfHwgZXZlbnREaXJlY3Rvci5mZWF0dXJlSWQgIT09IGZpZCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKCgogIGZ1bmN0aW9uIHNsaWNlQXRsYXNUaWxlKHR5cGUsIGV4cHJOYW1lKSB7CiAgICB2YXIgcm93ID0gRVhQUltleHByTmFtZV07CiAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHJvdyA9IDA7CiAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGN2LndpZHRoID0gQVRMQVNfVFc7IGN2LmhlaWdodCA9IEFUTEFTX1RIOwogICAgdmFyIGMgPSBjdi5nZXRDb250ZXh0KCIyZCIpOwogICAgaWYgKGF0bGFzSW1nKSB7CiAgICAgIGMuZHJhd0ltYWdlKGF0bGFzSW1nLCB0eXBlICogQVRMQVNfVFcsIHJvdyAqIEFUTEFTX1RILCBBVExBU19UVywgQVRMQVNfVEgsIDAsIDAsIEFUTEFTX1RXLCBBVExBU19USCk7CiAgICB9CiAgICByZXR1cm4gY3Y7CiAgfQoKICBmdW5jdGlvbiBtYWtlU3BlY2lhbE92ZXJsYXkoa2luZCkgewogICAgdmFyIHMgPSA5NjsKICAgIHZhciBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgY3Yud2lkdGggPSBzOyBjdi5oZWlnaHQgPSBzOwogICAgdmFyIGMgPSBjdi5nZXRDb250ZXh0KCIyZCIpOwogICAgaWYgKGtpbmQgPT09ICJzdHJpcGVkX2giKSB7CiAgICAgIGMuc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjg1KSI7CiAgICAgIGMubGluZVdpZHRoID0gNjsKICAgICAgZm9yICh2YXIgeSA9IDE4OyB5IDwgODA7IHkgKz0gMTQpIHsKICAgICAgICBjLmJlZ2luUGF0aCgpOyBjLm1vdmVUbygxMiwgeSk7IGMubGluZVRvKDg0LCB5KTsgYy5zdHJva2UoKTsKICAgICAgfQogICAgICBjLnN0cm9rZVN0eWxlID0gInJnYmEoODAsMTgwLDI1NSwwLjkpIjsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICBjLnN0cm9rZVJlY3QoOCwgOCwgODAsIDgwKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInN0cmlwZWRfdiIpIHsKICAgICAgYy5zdHJva2VTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LDAuODUpIjsKICAgICAgYy5saW5lV2lkdGggPSA2OwogICAgICBmb3IgKHZhciB4ID0gMTg7IHggPCA4MDsgeCArPSAxNCkgewogICAgICAgIGMuYmVnaW5QYXRoKCk7IGMubW92ZVRvKHgsIDEyKTsgYy5saW5lVG8oeCwgODQpOyBjLnN0cm9rZSgpOwogICAgICB9CiAgICAgIGMuc3Ryb2tlU3R5bGUgPSAicmdiYSg4MCwxODAsMjU1LDAuOSkiOwogICAgICBjLmxpbmVXaWR0aCA9IDM7CiAgICAgIGMuc3Ryb2tlUmVjdCg4LCA4LCA4MCwgODApOwogICAgfSBlbHNlIGlmIChraW5kID09PSAiYm9tYiIpIHsKICAgICAgYy5maWxsU3R5bGUgPSAicmdiYSgyNTUsODAsNDAsMC4zNSkiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0OCwgNDgsIDQwLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiNmZjYwMzAiOwogICAgICBjLmxpbmVXaWR0aCA9IDQ7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuYXJjKDQ4LCA0OCwgMzgsIDAsIE1hdGguUEkgKiAyKTsgYy5zdHJva2UoKTsKICAgICAgYy5maWxsU3R5bGUgPSAiI2ZmNDAyMCI7CiAgICAgIGMuZm9udCA9ICJib2xkIDI4cHggSW1wYWN0LHNhbnMtc2VyaWYiOwogICAgICBjLnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICBjLmZpbGxUZXh0KCIhIiwgNDgsIDU4KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInJhaW5ib3ciKSB7CiAgICAgIHZhciBnID0gYy5jcmVhdGVMaW5lYXJHcmFkaWVudCgxMCwgMTAsIDg2LCA4Nik7CiAgICAgIGcuYWRkQ29sb3JTdG9wKDAsICIjZmY2MDYwIik7IGcuYWRkQ29sb3JTdG9wKDAuMiwgIiNmZmMwNDAiKTsKICAgICAgZy5hZGRDb2xvclN0b3AoMC40LCAiIzgwZmY2MCIpOyBnLmFkZENvbG9yU3RvcCgwLjYsICIjNjBjMGZmIik7CiAgICAgIGcuYWRkQ29sb3JTdG9wKDAuOCwgIiNjMDYwZmYiKTsgZy5hZGRDb2xvclN0b3AoMSwgIiNmZjYwYzAiKTsKICAgICAgYy5zdHJva2VTdHlsZSA9IGc7CiAgICAgIGMubGluZVdpZHRoID0gODsKICAgICAgcm91bmRSZWN0KGMsIDEwLCAxMCwgNzYsIDc2LCAxNik7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsMC41KSI7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuYXJjKDQ4LCA0OCwgMTIsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJjYXRuaXAiKSB7CiAgICAgIGMuZmlsbFN0eWxlID0gInJnYmEoNDAsMTYwLDcwLDAuMjgpIjsKICAgICAgcm91bmRSZWN0KGMsIDgsIDgsIDgwLCA4MCwgMTYpOwogICAgICBjLmZpbGwoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjMmVjYzcxIjsKICAgICAgYy5saW5lV2lkdGggPSA0OwogICAgICByb3VuZFJlY3QoYywgMTAsIDEwLCA3NiwgNzYsIDE0KTsKICAgICAgYy5zdHJva2UoKTsKICAgICAgLy8gbGVhZnkgYnVyc3QKICAgICAgYy5maWxsU3R5bGUgPSAiIzI3YWU2MCI7CiAgICAgIGZvciAodmFyIGxpID0gMDsgbGkgPCA1OyBsaSsrKSB7CiAgICAgICAgdmFyIGFuZyA9IChsaSAvIDUpICogTWF0aC5QSSAqIDIgLSBNYXRoLlBJIC8gMjsKICAgICAgICB2YXIgbHggPSA0OCArIE1hdGguY29zKGFuZykgKiAyMjsKICAgICAgICB2YXIgbHkgPSA0OCArIE1hdGguc2luKGFuZykgKiAyMjsKICAgICAgICBjLmJlZ2luUGF0aCgpOwogICAgICAgIGMuZWxsaXBzZShseCwgbHksIDEwLCA1LCBhbmcsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICBjLmZpbGwoKTsKICAgICAgfQogICAgICBjLmZpbGxTdHlsZSA9ICIjZjFjNDBmIjsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5hcmMoNDgsIDQ4LCA4LCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLmZpbGxTdHlsZSA9ICIjMTQ1YTMyIjsKICAgICAgYy5mb250ID0gImJvbGQgMTZweCBJbXBhY3Qsc2Fucy1zZXJpZiI7CiAgICAgIGMudGV4dEFsaWduID0gImNlbnRlciI7CiAgICAgIGMuZmlsbFRleHQoIkNOIiwgNDgsIDU0KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInN1cGVyY2F0IikgewogICAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyMTUsNjAsMC4yOCkiOwogICAgICByb3VuZFJlY3QoYywgNiwgNiwgODQsIDg0LCAxNik7CiAgICAgIGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiNmZmQwNDAiOwogICAgICBjLmxpbmVXaWR0aCA9IDU7CiAgICAgIC8vICsgY3Jvc3MgYmVhbXMKICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgYy5tb3ZlVG8oNDgsIDEyKTsgYy5saW5lVG8oNDgsIDg0KTsKICAgICAgYy5tb3ZlVG8oMTIsIDQ4KTsgYy5saW5lVG8oODQsIDQ4KTsKICAgICAgYy5zdHJva2UoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjZmZmOGQwIjsKICAgICAgYy5saW5lV2lkdGggPSAyOwogICAgICBjLnN0cm9rZVJlY3QoMTAsIDEwLCA3NiwgNzYpOwogICAgICBjLmZpbGxTdHlsZSA9ICIjZmY5MDIwIjsKICAgICAgYy5mb250ID0gImJvbGQgMThweCBJbXBhY3Qsc2Fucy1zZXJpZiI7CiAgICAgIGMudGV4dEFsaWduID0gImNlbnRlciI7CiAgICAgIGMuZmlsbFRleHQoIlNDIiwgNDgsIDU0KTsKICAgIH0KICAgIHJldHVybiBjdjsKICB9CgogIGZ1bmN0aW9uIG1ha2VPYnN0YWNsZVNwcml0ZShraW5kKSB7CiAgICB2YXIgcyA9IDk2OwogICAgdmFyIGN2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBjdi53aWR0aCA9IHM7IGN2LmhlaWdodCA9IHM7CiAgICB2YXIgYyA9IGN2LmdldENvbnRleHQoIjJkIik7CiAgICBpZiAoa2luZCA9PT0gImJveCIgfHwga2luZCA9PT0gImJveDIiKSB7CiAgICAgIGMuZmlsbFN0eWxlID0ga2luZCA9PT0gImJveDIiID8gIiNjODkwNTAiIDogIiNlMGE4NjgiOwogICAgICByb3VuZFJlY3QoYywgMTAsIDE0LCA3NiwgNjgsIDYpOwogICAgICBjLmZpbGwoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjNmE0MDIwIjsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICByb3VuZFJlY3QoYywgMTAsIDE0LCA3NiwgNjgsIDYpOwogICAgICBjLnN0cm9rZSgpOwogICAgICBjLmJlZ2luUGF0aCgpOwogICAgICBjLm1vdmVUbygxMCwgNDApOyBjLmxpbmVUbyg4NiwgNDApOwogICAgICBjLm1vdmVUbyg0OCwgMTQpOyBjLmxpbmVUbyg0OCwgODIpOwogICAgICBjLnN0cm9rZSgpOwogICAgICBpZiAoa2luZCA9PT0gImJveDIiKSB7CiAgICAgICAgYy5maWxsU3R5bGUgPSAiIzhhNTAyMCI7CiAgICAgICAgYy5mb250ID0gImJvbGQgMjJweCBzYW5zLXNlcmlmIjsKICAgICAgICBjLnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICAgIGMuZmlsbFRleHQoIjIiLCA0OCwgNTgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJ5YXJuIikgewogICAgICBjLmZpbGxTdHlsZSA9ICIjZTA2MDkwIjsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5hcmMoNDgsIDUwLCAzMCwgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjYTAzMDYwIjsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICBjLnN0cm9rZSgpOwogICAgICBjLmJlZ2luUGF0aCgpOwogICAgICBmb3IgKHZhciBhID0gMDsgYSA8IDY7IGErKykgewogICAgICAgIGMubW92ZVRvKDQ4LCA1MCk7CiAgICAgICAgYy5hcmMoNDgsIDUwLCAyOCwgYSAqIDEuMSwgYSAqIDEuMSArIDAuOCk7CiAgICAgIH0KICAgICAgYy5zdHJva2UoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjZTA2MDkwIjsKICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgYy5tb3ZlVG8oNzAsIDMwKTsgYy5xdWFkcmF0aWNDdXJ2ZVRvKDg1LCAxMCwgNzgsIDUpOwogICAgICBjLnN0cm9rZSgpOwogICAgfSBlbHNlIGlmIChraW5kID09PSAiY2FycmllciIpIHsKICAgICAgYy5maWxsU3R5bGUgPSAiIzcwYjBkMCI7CiAgICAgIHJvdW5kUmVjdChjLCAxMiwgMjAsIDcyLCA1NiwgMTApOwogICAgICBjLmZpbGwoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjMzA2MDgwIjsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICByb3VuZFJlY3QoYywgMTIsIDIwLCA3MiwgNTYsIDEwKTsKICAgICAgYy5zdHJva2UoKTsKICAgICAgYy5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjUpIjsKICAgICAgcm91bmRSZWN0KGMsIDIyLCAzMCwgNTIsIDMwLCA2KTsKICAgICAgYy5maWxsKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gIiNlODg4M2EiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0OCwgNDYsIDEyLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLmZpbGxTdHlsZSA9ICIjMmExYTEwIjsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5hcmMoNDMsIDQ0LCAyLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg1MywgNDQsIDIsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gIiMzMDYwODAiOwogICAgICBjLmZpbGxSZWN0KDQwLCAxMiwgMTYsIDEyKTsKICAgICAgcm91bmRSZWN0KGMsIDM2LCA4LCAyNCwgOCwgMyk7IGMuZmlsbCgpOwogICAgfQogICAgcmV0dXJuIGN2OwogIH0KCiAgZnVuY3Rpb24gbGV2ZWxCZ0NvbG9ycygpIHsKICAgIHZhciBsdiA9IExFVkVMU1tsZXZlbEluZGV4XSB8fCBMRVZFTFNbMF07CiAgICBpZiAobHYgJiYgbHYuYmcgJiYgbHYuYmcubGVuZ3RoID49IDQpIHJldHVybiBsdi5iZzsKICAgIHJldHVybiBbIiM2YTlmYzgiLCAiI2I4ZDhlYyIsICIjYzRhMDZhIiwgIiM4YTY4NDAiXTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQmcoKSB7CiAgICBpZiAoIVcgfHwgIUgpIHJldHVybjsKICAgIGJnQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBiZ0NhbnZhcy53aWR0aCA9IFc7IGJnQ2FudmFzLmhlaWdodCA9IEg7CiAgICB2YXIgYiA9IGJnQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICB2YXIgY29scyA9IGxldmVsQmdDb2xvcnMoKTsKICAgIHZhciBncmFkID0gYi5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAwLCBIKTsKICAgIGdyYWQuYWRkQ29sb3JTdG9wKDAsIGNvbHNbMF0pOwogICAgZ3JhZC5hZGRDb2xvclN0b3AoMC40MiwgY29sc1sxXSk7CiAgICBncmFkLmFkZENvbG9yU3RvcCgwLjQyLCBjb2xzWzJdKTsKICAgIGdyYWQuYWRkQ29sb3JTdG9wKDEsIGNvbHNbM10pOwogICAgYi5maWxsU3R5bGUgPSBncmFkOwogICAgYi5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgIHZhciB2ZyA9IGIuY3JlYXRlUmFkaWFsR3JhZGllbnQoVyAqIDAuNSwgSCAqIDAuNDgsIE1hdGgubWluKFcsIEgpICogMC4xNSwgVyAqIDAuNSwgSCAqIDAuNSwgTWF0aC5tYXgoVywgSCkgKiAwLjcyKTsKICAgIHZnLmFkZENvbG9yU3RvcCgwLCAicmdiYSgyNTUsMjQwLDIxMCwwLjA4KSIpOwogICAgdmcuYWRkQ29sb3JTdG9wKDAuNTUsICJyZ2JhKDQwLDI1LDE1LDAuMDUpIik7CiAgICB2Zy5hZGRDb2xvclN0b3AoMSwgInJnYmEoMjAsMTIsOCwwLjM1KSIpOwogICAgYi5maWxsU3R5bGUgPSB2ZzsKICAgIGIuZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgICBiLmdsb2JhbEFscGhhID0gMC4zNTsKICAgIGIuZmlsbFN0eWxlID0gIiM1YTkwNDgiOwogICAgYi5iZWdpblBhdGgoKTsgYi5lbGxpcHNlKE1hdGgubWF4KDI0LCBXICogMC4wNSksIEggKiAwLjc4LCAxOCwgMzIsIDAsIDAsIE1hdGguUEkgKiAyKTsgYi5maWxsKCk7CiAgICBiLmZpbGxTdHlsZSA9ICIjYzg2ODU4IjsKICAgIHJvdW5kUmVjdChiLCBXIC0gTWF0aC5tYXgoOTAsIFcgKiAwLjE0KSwgSCAqIDAuNjIsIE1hdGgubWF4KDcwLCBXICogMC4xMSksIE1hdGgubWF4KDM2LCBIICogMC4xMiksIDEyKTsKICAgIGIuZmlsbCgpOwogICAgYi5nbG9iYWxBbHBoYSA9IDE7CiAgfQoKICBmdW5jdGlvbiByZXNvbHZlQm9hcmRHcmlkVXJsKGtleSkgewogICAgdmFyIG1hcCA9IEJPQVJEX0dSSURTOwogICAgaWYgKCFtYXAgfHwgdHlwZW9mIG1hcCAhPT0gIm9iamVjdCIpIG1hcCA9IHt9OwogICAgaWYgKGtleSAmJiBtYXBba2V5XSkgcmV0dXJuIG1hcFtrZXldOwogICAgaWYgKG1hcC53YXJtKSByZXR1cm4gbWFwLndhcm07CiAgICB2YXIgZmFsbGJhY2sgPSAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvY21fYm9hcmRfZ3JpZF93YXJtLnBuZyI7CiAgICBpZiAoZmFsbGJhY2suaW5kZXhPZigiUExBQ0VIT0xERVIiKSA+PSAwIHx8ICFmYWxsYmFjaykgZmFsbGJhY2sgPSAiYXNzZXRzL2NtX2JvYXJkX2dyaWQucG5nIjsKICAgIHJldHVybiBmYWxsYmFjazsKICB9CgogIGZ1bmN0aW9uIGxvYWRCb2FyZEdyaWQoKSB7CiAgICB2YXIga2V5cyA9IFsid2FybSIsICJtaW50IiwgImR1c2siLCAicm9zZSIsICJvY2VhbiIsICJzdW5zZXQiXTsKICAgIGJvYXJkR3JpZEltZ3MgPSB7fTsKICAgIGJvYXJkR3JpZFJlYWR5ID0gZmFsc2U7CiAgICB2YXIgcGVuZGluZyA9IDA7CiAgICBmdW5jdGlvbiBkb25lT25lKCkgewogICAgICBwZW5kaW5nLS07CiAgICAgIGlmIChwZW5kaW5nIDw9IDApIHsKICAgICAgICBib2FyZEdyaWRJbWcgPSBib2FyZEdyaWRJbWdzW2JvYXJkR3JpZEtleV0gfHwgYm9hcmRHcmlkSW1ncy53YXJtIHx8IG51bGw7CiAgICAgICAgYm9hcmRHcmlkUmVhZHkgPSAhIShib2FyZEdyaWRJbWcgJiYgYm9hcmRHcmlkSW1nLmNvbXBsZXRlKTsKICAgICAgfQogICAgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB1cmwgPSByZXNvbHZlQm9hcmRHcmlkVXJsKGspOwogICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgICBwZW5kaW5nKys7CiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgYm9hcmRHcmlkSW1nc1trXSA9IGltZzsgZG9uZU9uZSgpOyB9OwogICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyBkb25lT25lKCk7IH07CiAgICAgICAgaW1nLnNyYyA9IHVybDsKICAgICAgfSkoa2V5c1tpXSk7CiAgICB9CiAgICBpZiAocGVuZGluZyA9PT0gMCkgZG9uZU9uZSgpOwogIH0KCiAgZnVuY3Rpb24gc2V0Qm9hcmRUaGVtZUZvckxldmVsKCkgewogICAgdmFyIGx2ID0gTEVWRUxTW2xldmVsSW5kZXhdIHx8IExFVkVMU1swXTsKICAgIGJvYXJkR3JpZEtleSA9IChsdiAmJiBsdi5ib2FyZCkgPyBsdi5ib2FyZCA6ICJ3YXJtIjsKICAgIGJvYXJkR3JpZEltZyA9IGJvYXJkR3JpZEltZ3NbYm9hcmRHcmlkS2V5XSB8fCBib2FyZEdyaWRJbWdzLndhcm0gfHwgYm9hcmRHcmlkSW1nOwogICAgYm9hcmRHcmlkUmVhZHkgPSAhIShib2FyZEdyaWRJbWcgJiYgYm9hcmRHcmlkSW1nLmNvbXBsZXRlKTsKICAgIGJ1aWxkQmcoKTsKICB9CgogIGZ1bmN0aW9uIGRyYXdCb2FyZEdyaWRCZygpIHsKICAgIHZhciBidyA9IGJvYXJkVyArIGJvYXJkUGFkICogMjsKICAgIHZhciBiaCA9IGJvYXJkSCArIGJvYXJkUGFkICogMjsKICAgIHZhciBieCA9IGJvYXJkWCAtIGJvYXJkUGFkOwogICAgdmFyIGJ5ID0gYm9hcmRZIC0gYm9hcmRQYWQ7CiAgICB2YXIgY3MgPSBNYXRoLm1pbihjZWxsVywgY2VsbEgpOwogICAgaWYgKGJvYXJkR3JpZFJlYWR5ICYmIGJvYXJkR3JpZEltZykgewogICAgICAvLyBQTkc6IDIwcHggZnJhbWUgYXJvdW5kIDc2OHB4ICg4Kjk2KSBzbG90IGZpZWxkCiAgICAgIHZhciBzcmMgPSBib2FyZEdyaWRJbWcubmF0dXJhbFdpZHRoIHx8IDgwODsKICAgICAgdmFyIGZyID0gTWF0aC5yb3VuZChzcmMgKiAoMjAgLyA4MDgpKTsKICAgICAgdmFyIGlubmVyID0gc3JjIC0gZnIgKiAyOwogICAgICBjdHguZHJhd0ltYWdlKGJvYXJkR3JpZEltZywgMCwgMCwgc3JjLCBzcmMsIGJ4LCBieSwgYncsIGJoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gcHJvY2VkdXJhbCBmYWxsYmFjayBzbG90cwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDYwLDQwLDI1LDAuOTIpIjsKICAgIHJvdW5kUmVjdChjdHgsIGJ4LCBieSwgYncsIGJoLCBNYXRoLm1heCgxMCwgY3MgKiAwLjI4KSk7CiAgICBjdHguZmlsbCgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjZjNlMmMwIjsKICAgIHJvdW5kUmVjdChjdHgsIGJvYXJkWCAtIDIsIGJvYXJkWSAtIDIsIGJvYXJkVyArIDQsIGJvYXJkSCArIDQsIE1hdGgubWF4KDgsIGNzICogMC4yKSk7CiAgICBjdHguZmlsbCgpOwogICAgdmFyIGluc2V0ID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihjcyAqIDAuMDgpKTsKICAgIHZhciByciA9IE1hdGgubWF4KDYsIE1hdGguZmxvb3IoY3MgKiAwLjIyKSk7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgIHZhciB4ID0gYm9hcmRYICsgYyAqIGNlbGxXOwogICAgICAgIHZhciB5ID0gYm9hcmRZICsgciAqIGNlbGxIOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAoKHIgKyBjKSAlIDIgPT09IDApID8gIiNlZmUwYzAiIDogIiNlMGQwYTgiOwogICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCBjZWxsVywgY2VsbEgpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAoKHIgKyBjKSAlIDIgPT09IDApID8gIiNlMmQwYTAiIDogIiNkNGMwOTAiOwogICAgICAgIHJvdW5kUmVjdChjdHgsIHggKyBpbnNldCwgeSArIGluc2V0LCBjZWxsVyAtIGluc2V0ICogMiwgY2VsbEggLSBpbnNldCAqIDIsIHJyKTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDEyMCw4MCw0MCwwLjQ1KSI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIGNzICogMC4wNCk7CiAgICAgICAgcm91bmRSZWN0KGN0eCwgeCArIGluc2V0LCB5ICsgaW5zZXQsIGNlbGxXIC0gaW5zZXQgKiAyLCBjZWxsSCAtIGluc2V0ICogMiwgcnIpOwogICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gbGF5b3V0UGxheWZpZWxkKCkgewogICAgdmFyIG1hcmdpbiA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IoTWF0aC5taW4oVywgSCkgKiAwLjAxKSk7CiAgICB2YXIgdGlwID0gTWF0aC5tYXgoNTYsIE1hdGgubWluKDg4LCBNYXRoLmZsb29yKE1hdGgubWluKFcsIEgpICogMC4xMSkpKTsKICAgIHZhciBsYW5kc2NhcGUgPSBXID49IEg7CiAgICBpZiAobGFuZHNjYXBlKSB7CiAgICAgIGh1ZE1vZGUgPSAic2lkZSI7CiAgICAgIC8vIEJvdHRvbSBzdHJpcCBmb3IgSGludCArIEFuaW1hdGUgKyBjYXQtaGVhZCBjbHVzdGVyIChvZmYgdGhlIGdyaWQpCiAgICAgIHZhciBjbHVzdGVySCA9IHRpcCArIDEwOwogICAgICB2YXIgYXZhaWxIID0gSCAtIE1hdGgubWF4KDgsIG1hcmdpbiAqIDIpIC0gY2x1c3Rlckg7CiAgICAgIHZhciBoaW50VyA9IE1hdGgubWF4KDY0LCBNYXRoLm1pbig4OCwgdGlwICsgOCkpOwogICAgICB2YXIgZ2FwID0gNjsKICAgICAgdmFyIG1pbkh1ZCA9IE1hdGgubWF4KDk2LCBNYXRoLmZsb29yKFcgKiAwLjE0KSk7CiAgICAgIHZhciBtYXhIdWQgPSBNYXRoLm1heChtaW5IdWQsIE1hdGguZmxvb3IoVyAqIDAuMjApKTsKICAgICAgY2VsbEggPSBNYXRoLm1heCgyNCwgTWF0aC5mbG9vcihhdmFpbEggLyBHUklEKSk7CiAgICAgIGJvYXJkSCA9IEdSSUQgKiBjZWxsSDsKICAgICAgdmFyIGxlZnRSZXNlcnZlID0gbWFyZ2luICsgbWluSHVkICsgZ2FwOwogICAgICB2YXIgYXZhaWxCb2FyZFcgPSBXIC0gbGVmdFJlc2VydmUgLSBtYXJnaW47CiAgICAgIGNlbGxXID0gTWF0aC5tYXgoY2VsbEgsIE1hdGguZmxvb3IoYXZhaWxCb2FyZFcgLyBHUklEKSk7CiAgICAgIHZhciBtYXhBc3BlY3QgPSAxLjY1OwogICAgICBpZiAoY2VsbFcgPiBNYXRoLmZsb29yKGNlbGxIICogbWF4QXNwZWN0KSkgY2VsbFcgPSBNYXRoLmZsb29yKGNlbGxIICogbWF4QXNwZWN0KTsKICAgICAgaWYgKGNlbGxXICogR1JJRCA+IGF2YWlsQm9hcmRXKSBjZWxsVyA9IE1hdGgubWF4KDI0LCBNYXRoLmZsb29yKGF2YWlsQm9hcmRXIC8gR1JJRCkpOwogICAgICBib2FyZFcgPSBHUklEICogY2VsbFc7CiAgICAgIGNlbGwgPSBNYXRoLm1pbihjZWxsVywgY2VsbEgpOwogICAgICBib2FyZFBhZCA9IE1hdGgubWF4KDYsIE1hdGgucm91bmQoY2VsbCAqIDIwIC8gOTYpKTsKICAgICAgdmFyIGxlZnRvdmVyID0gVyAtIG1hcmdpbiAtIGJvYXJkVyAtIG1hcmdpbjsKICAgICAgdmFyIGh1ZFcgPSBNYXRoLm1heChtaW5IdWQsIE1hdGgubWluKG1heEh1ZCwgbGVmdG92ZXIgLSBnYXApKTsKICAgICAgYm9hcmRYID0gbWFyZ2luICsgaHVkVyArIGdhcDsKICAgICAgdmFyIHNsYWNrID0gVyAtIChib2FyZFggKyBib2FyZFcgKyBtYXJnaW4pOwogICAgICBpZiAoc2xhY2sgPiBHUklEKSB7CiAgICAgICAgdmFyIGdyb3cgPSBNYXRoLmZsb29yKHNsYWNrIC8gR1JJRCk7CiAgICAgICAgdmFyIG1heEdyb3cgPSBNYXRoLmZsb29yKGNlbGxIICogbWF4QXNwZWN0KSAtIGNlbGxXOwogICAgICAgIGlmIChtYXhHcm93ID4gMCkgewogICAgICAgICAgZ3JvdyA9IE1hdGgubWluKGdyb3csIG1heEdyb3cpOwogICAgICAgICAgY2VsbFcgKz0gZ3JvdzsKICAgICAgICAgIGJvYXJkVyA9IEdSSUQgKiBjZWxsVzsKICAgICAgICAgIGNlbGwgPSBNYXRoLm1pbihjZWxsVywgY2VsbEgpOwogICAgICAgICAgYm9hcmRQYWQgPSBNYXRoLm1heCg2LCBNYXRoLnJvdW5kKGNlbGwgKiAyMCAvIDk2KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJvYXJkWSA9IG1hcmdpbiArIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKEggLSBtYXJnaW4gLSBjbHVzdGVySCAtIGJvYXJkSCkgLyAyKSk7CiAgICAgIGlmIChib2FyZFkgPCBtYXJnaW4pIGJvYXJkWSA9IG1hcmdpbjsKICAgICAgLy8gQ2x1c3RlciBzaXRzIHVuZGVyIHRoZSBib2FyZCwgcmlnaHQtYWxpZ25lZCAoSGludCBhbmNob3IgPSByaWdodG1vc3QpCiAgICAgIHZhciBjbHVzdGVyVyA9IGhpbnRXICsgOCArIDY0ICsgOCArIDcyOwogICAgICBoaW50QW5jaG9yID0gewogICAgICAgIHg6IE1hdGgubWluKGJvYXJkWCArIGJvYXJkVyAtIGhpbnRXLCBXIC0gbWFyZ2luIC0gaGludFcpLAogICAgICAgIHk6IGJvYXJkWSArIGJvYXJkSCArIDYsCiAgICAgICAgdzogaGludFcsCiAgICAgICAgaDogdGlwCiAgICAgIH07CiAgICAgIGlmIChoaW50QW5jaG9yLnggPCBib2FyZFgpIGhpbnRBbmNob3IueCA9IGJvYXJkWDsKICAgICAgaWYgKGhpbnRBbmNob3IueSArIGhpbnRBbmNob3IuaCA+IEggLSA0KSB7CiAgICAgICAgaGludEFuY2hvci55ID0gTWF0aC5tYXgoYm9hcmRZICsgYm9hcmRIICsgMiwgSCAtIHRpcCAtIDQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBodWRNb2RlID0gInRvcCI7CiAgICAgIHZhciB0b3BCYXIgPSBNYXRoLm1heCg1MCwgTWF0aC5taW4oNzIsIE1hdGguZmxvb3IoSCAqIDAuMDc1KSkpOwogICAgICB2YXIgaGludFJvdyA9IHRpcCArIDg7CiAgICAgIHZhciBtaW5Cb3R0b20gPSBNYXRoLm1heCg3MiwgTWF0aC5mbG9vcihIICogMC4xMikpOwogICAgICB2YXIgYXZhaWxXID0gVyAtIG1hcmdpbiAqIDI7CiAgICAgIGNlbGwgPSBNYXRoLm1heCgyNiwgTWF0aC5mbG9vcihhdmFpbFcgLyBHUklEKSk7CiAgICAgIGJvYXJkVyA9IEdSSUQgKiBjZWxsOwogICAgICBib2FyZEggPSBHUklEICogY2VsbDsKICAgICAgd2hpbGUgKHRvcEJhciArIGJvYXJkSCArIGhpbnRSb3cgKyBtaW5Cb3R0b20gKyBtYXJnaW4gPiBIICYmIGNlbGwgPiAyNikgewogICAgICAgIGNlbGwgLT0gMTsKICAgICAgICBib2FyZFcgPSBHUklEICogY2VsbDsKICAgICAgICBib2FyZEggPSBHUklEICogY2VsbDsKICAgICAgfQogICAgICBjZWxsVyA9IGNlbGw7CiAgICAgIGNlbGxIID0gY2VsbDsKICAgICAgYm9hcmRQYWQgPSBNYXRoLm1heCg2LCBNYXRoLnJvdW5kKGNlbGwgKiAyMCAvIDk2KSk7CiAgICAgIGJvYXJkWCA9IE1hdGguZmxvb3IoKFcgLSBib2FyZFcpIC8gMik7CiAgICAgIGJvYXJkWSA9IHRvcEJhciArIDQ7CiAgICAgIGhpbnRBbmNob3IgPSB7CiAgICAgICAgeDogYm9hcmRYICsgYm9hcmRXIC0gTWF0aC5tYXgoNzYsIHRpcCksCiAgICAgICAgeTogYm9hcmRZICsgYm9hcmRIICsgNiwKICAgICAgICB3OiBNYXRoLm1heCg3NiwgdGlwKSwKICAgICAgICBoOiB0aXAKICAgICAgfTsKICAgICAgaWYgKGhpbnRBbmNob3IueCA8IGJvYXJkWCkgaGludEFuY2hvci54ID0gYm9hcmRYOwogICAgICBpZiAoaGludEFuY2hvci54ICsgaGludEFuY2hvci53ID4gVyAtIDQpIGhpbnRBbmNob3IueCA9IFcgLSA0IC0gaGludEFuY2hvci53OwogICAgICBpZiAoaGludEFuY2hvci55ICsgaGludEFuY2hvci5oID4gSCAtIG1pbkJvdHRvbSkgewogICAgICAgIGhpbnRBbmNob3IueSA9IE1hdGgubWF4KGJvYXJkWSArIGJvYXJkSCAtIHRpcCwgSCAtIG1pbkJvdHRvbSAtIHRpcCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBrZXkgPSBXICsgIngiICsgSCArICI6IiArIGNlbGxXICsgIngiICsgY2VsbEggKyAiOiIgKyBib2FyZFggKyAiLCIgKyBib2FyZFk7CiAgICBpZiAoa2V5ICE9PSBsYXN0TGF5b3V0S2V5KSB7CiAgICAgIGxhc3RMYXlvdXRLZXkgPSBrZXk7CiAgICAgIGJ1aWxkQmcoKTsKICAgIH0KICB9CgoKICB2YXIgU0lNUExFX1BBTCA9IFsKICAgIHtmdXI6ICIjZjBhMDUwIiwgZGVlcDogIiNjODc4MzAiLCBsaWdodDogIiNmZmM4NzgiLCBlYXI6ICIjZjA5MDgwIiwgZXllOiAiIzNhNmEyOCIsIG5vc2U6ICIjZTA3MDcwIiwgb3V0bGluZTogIiM1YTMwMTAiLCBhY2NlbnQ6ICIjYzg2ODIwIiwgYmVsbHk6ICIjZmZlMGIwIn0sCiAgICB7ZnVyOiAiIzNhM2E0OCIsIGRlZXA6ICIjMWExYTI0IiwgbGlnaHQ6ICIjNWE1YTZhIiwgZWFyOiAiIzhhNDA1MCIsIGV5ZTogIiNmMGM4NDAiLCBub3NlOiAiI2M4Nzg4OCIsIG91dGxpbmU6ICIjMGEwYTEwIiwgYWNjZW50OiAiIzJhMmEzOCIsIGJlbGx5OiAiIzZhNmE3OCJ9LAogICAge2Z1cjogIiNmOGY0ZjAiLCBkZWVwOiAiI2Q4ZDBjOCIsIGxpZ2h0OiAiI2ZmZmZmZiIsIGVhcjogIiNmMGIwYjgiLCBleWU6ICIjNTBhMGQwIiwgbm9zZTogIiNlMDkwYTAiLCBvdXRsaW5lOiAiIzZhNTg1MCIsIGFjY2VudDogIiNlOGUwZDgiLCBiZWxseTogIiNmZmZmZmYifSwKICAgIHtmdXI6ICIjYjhiOGM0IiwgZGVlcDogIiM4ODg4OTgiLCBsaWdodDogIiNkOGQ4ZTAiLCBlYXI6ICIjZDBhMGE4IiwgZXllOiAiIzU4YjBlMCIsIG5vc2U6ICIjZDA5MGEwIiwgb3V0bGluZTogIiM0YTQwNDAiLCBhY2NlbnQ6ICIjOTg5OGE4IiwgYmVsbHk6ICIjZThlOGYwIn0sCiAgICB7ZnVyOiAiI2YwZDA5MCIsIGRlZXA6ICIjYzg5MDUwIiwgbGlnaHQ6ICIjZmZlOGI4IiwgZWFyOiAiI2YwYTA5MCIsIGV5ZTogIiMzYThhMzgiLCBub3NlOiAiI2UwNzg3OCIsIG91dGxpbmU6ICIjNWEzODE4IiwgYWNjZW50OiAiI2QwNjA0MCIsIGJlbGx5OiAiI2ZmZjBkMCJ9LAogICAge2Z1cjogIiMyZTJlMzgiLCBkZWVwOiAiIzE0MTQxYyIsIGxpZ2h0OiAiIzRhNGE1OCIsIGVhcjogIiNmMGIwYjgiLCBleWU6ICIjZjBjODQwIiwgbm9zZTogIiNlMDkwYTAiLCBvdXRsaW5lOiAiIzA4MDgwYyIsIGFjY2VudDogIiNmMGYwZjQiLCBiZWxseTogIiNmNGY0ZjgifQogIF07CgogIGZ1bmN0aW9uIG1ha2VTaW1wbGVDYXRGYWNlKHR5cGUsIGV4cHIpIHsKICAgIHZhciBzID0gOTY7CiAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGN2LndpZHRoID0gczsgY3YuaGVpZ2h0ID0gczsKICAgIHZhciBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIHZhciBwYWwgPSBTSU1QTEVfUEFMW3R5cGVdIHx8IFNJTVBMRV9QQUxbMF07CiAgICBjLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTsKICAgIC8vIHNvZnQgdGlsZSBwbGF0ZQogICAgYy5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7CiAgICByb3VuZFJlY3QoYywgMiwgMiwgOTIsIDkyLCAxOCk7CiAgICBjLmZpbGwoKTsKICAgIC8vIGVhcnMKICAgIGZ1bmN0aW9uIGVhcihleCwgZXksIGZsaXApIHsKICAgICAgYy5zYXZlKCk7CiAgICAgIGMudHJhbnNsYXRlKGV4LCBleSk7CiAgICAgIGlmIChmbGlwKSBjLnNjYWxlKC0xLCAxKTsKICAgICAgYy5maWxsU3R5bGUgPSBwYWwuZnVyOwogICAgICBjLmJlZ2luUGF0aCgpOwogICAgICBjLm1vdmVUbygwLCAyMik7CiAgICAgIGMubGluZVRvKC04LCAtMTgpOwogICAgICBjLmxpbmVUbygyMCwgOCk7CiAgICAgIGMuY2xvc2VQYXRoKCk7CiAgICAgIGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gcGFsLm91dGxpbmU7CiAgICAgIGMubGluZVdpZHRoID0gMi41OwogICAgICBjLnN0cm9rZSgpOwogICAgICBjLmZpbGxTdHlsZSA9IHBhbC5lYXI7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMubW92ZVRvKDIsIDE0KTsKICAgICAgYy5saW5lVG8oLTIsIC02KTsKICAgICAgYy5saW5lVG8oMTIsIDYpOwogICAgICBjLmNsb3NlUGF0aCgpOwogICAgICBjLmZpbGwoKTsKICAgICAgYy5yZXN0b3JlKCk7CiAgICB9CiAgICBlYXIoMjgsIDI4LCBmYWxzZSk7CiAgICBlYXIoNjgsIDI4LCB0cnVlKTsKICAgIC8vIGhlYWQKICAgIHZhciBoZyA9IGMuY3JlYXRlUmFkaWFsR3JhZGllbnQoNDAsIDQyLCA4LCA0OCwgNTIsIDQwKTsKICAgIGhnLmFkZENvbG9yU3RvcCgwLCBwYWwubGlnaHQpOwogICAgaGcuYWRkQ29sb3JTdG9wKDAuNjUsIHBhbC5mdXIpOwogICAgaGcuYWRkQ29sb3JTdG9wKDEsIHBhbC5kZWVwKTsKICAgIGMuZmlsbFN0eWxlID0gaGc7CiAgICBjLmJlZ2luUGF0aCgpOwogICAgYy5lbGxpcHNlKDQ4LCA1NCwgMzQsIDMwLCAwLCAwLCBNYXRoLlBJICogMik7CiAgICBjLmZpbGwoKTsKICAgIGMuc3Ryb2tlU3R5bGUgPSBwYWwub3V0bGluZTsKICAgIGMubGluZVdpZHRoID0gMi44OwogICAgYy5zdHJva2UoKTsKICAgIC8vIG1hcmtpbmdzCiAgICBpZiAodHlwZSA9PT0gMCkgewogICAgICBjLnN0cm9rZVN0eWxlID0gcGFsLmFjY2VudDsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICBjLmdsb2JhbEFscGhhID0gMC41NTsKICAgICAgZm9yICh2YXIgc2kgPSAwOyBzaSA8IDM7IHNpKyspIHsKICAgICAgICBjLmJlZ2luUGF0aCgpOwogICAgICAgIGMuYXJjKDMwICsgc2kgKiAxMiwgNDAsIDEwLCAwLjIsIDEuMik7CiAgICAgICAgYy5zdHJva2UoKTsKICAgICAgfQogICAgICBjLmdsb2JhbEFscGhhID0gMTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gNCkgewogICAgICBjLmZpbGxTdHlsZSA9IHBhbC5hY2NlbnQ7CiAgICAgIGMuZ2xvYmFsQWxwaGEgPSAwLjU1OwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmVsbGlwc2UoMzQsIDQ2LCAxMCwgOCwgLTAuMywgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5lbGxpcHNlKDYyLCA1OCwgOSwgNywgMC4yLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLmdsb2JhbEFscGhhID0gMTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gNSkgewogICAgICBjLmZpbGxTdHlsZSA9IHBhbC5hY2NlbnQ7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuZWxsaXBzZSg0OCwgNjIsIDE2LCAxMiwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5maWxsU3R5bGUgPSBwYWwuZnVyOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmVsbGlwc2UoNDgsIDQ4LCAyOCwgMTgsIDAsIE1hdGguUEksIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICB9CiAgICAvLyBtdXp6bGUKICAgIGMuZmlsbFN0eWxlID0gcGFsLmJlbGx5OwogICAgYy5nbG9iYWxBbHBoYSA9IDAuODU7CiAgICBjLmJlZ2luUGF0aCgpOyBjLmVsbGlwc2UoNDgsIDY0LCAxNCwgMTAsIDAsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICBjLmdsb2JhbEFscGhhID0gMTsKICAgIC8vIGV5ZXMKICAgIHZhciBibGluayA9IChleHByID09PSAid2luayIgfHwgZXhwciA9PT0gInJlc3QiKTsKICAgIHZhciBqb3lmdWwgPSAoZXhwciA9PT0gImpveWZ1bCIpOwogICAgdmFyIHN1cnByaXNlID0gKGV4cHIgPT09ICJzdXJwcmlzZSIpOwogICAgdmFyIGFuZ3J5ID0gKGV4cHIgPT09ICJhbmdyeSIpOwogICAgdmFyIGxpY2sgPSAoZXhwciA9PT0gImxpY2siKTsKICAgIHZhciBub3NlVyA9IChleHByID09PSAibm9zZSIgfHwgZXhwciA9PT0gIm5vc2UyIik7CiAgICBmdW5jdGlvbiBleWUoZXgsIGV5LCBjbG9zZWQpIHsKICAgICAgaWYgKGNsb3NlZCB8fCBibGluayAmJiBleCA8IDQ4KSB7CiAgICAgICAgYy5zdHJva2VTdHlsZSA9IHBhbC5vdXRsaW5lOwogICAgICAgIGMubGluZVdpZHRoID0gMi41OwogICAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgICAgYy5tb3ZlVG8oZXggLSA3LCBleSk7CiAgICAgICAgYy5xdWFkcmF0aWNDdXJ2ZVRvKGV4LCBleSArIChhbmdyeSA\/IC0yIDogMyksIGV4ICsgNywgZXkpOwogICAgICAgIGMuc3Ryb2tlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChqb3lmdWwpIHsKICAgICAgICBjLnN0cm9rZVN0eWxlID0gcGFsLm91dGxpbmU7CiAgICAgICAgYy5saW5lV2lkdGggPSAyLjg7CiAgICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgICBjLmFyYyhleCwgZXkgKyAyLCA3LCBNYXRoLlBJICogMS4xLCBNYXRoLlBJICogMS45KTsKICAgICAgICBjLnN0cm9rZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgZXJ4ID0gc3VycHJpc2UgPyA4IDogNzsKICAgICAgdmFyIGVyeSA9IHN1cnByaXNlID8gMTAgOiA4OwogICAgICBjLmZpbGxTdHlsZSA9ICIjZmZmZWY4IjsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5lbGxpcHNlKGV4LCBleSwgZXJ4LCBlcnksIDAsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gcGFsLmV5ZTsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5lbGxpcHNlKGV4LCBleSArIDEsIGVyeCAqIDAuNTUsIGVyeSAqIDAuNywgMCwgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5maWxsU3R5bGUgPSAiIzFhMTIxMCI7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuZWxsaXBzZShleCwgZXkgKyAxLCAyLjIsIGVyeSAqIDAuNDUsIDAsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gIiNmZmYiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyhleCAtIDIsIGV5IC0gMiwgMS44LCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBpZiAoYW5ncnkpIHsKICAgICAgICBjLnN0cm9rZVN0eWxlID0gcGFsLm91dGxpbmU7CiAgICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgICAgYy5tb3ZlVG8oZXggLSA4LCBleSAtIDEwKTsKICAgICAgICBjLmxpbmVUbyhleCArIDYsIGV5IC0gNik7CiAgICAgICAgYy5zdHJva2UoKTsKICAgICAgfQogICAgfQogICAgZXllKDM0LCA1MCwgZmFsc2UpOwogICAgZXllKDYyLCA1MCwgYmxpbmspOwogICAgLy8gbm9zZQogICAgdmFyIG54ID0gbm9zZVcgPyAoZXhwciA9PT0gIm5vc2UyIiA\/IDUwIDogNDYpIDogNDg7CiAgICBjLmZpbGxTdHlsZSA9IHBhbC5ub3NlOwogICAgYy5iZWdpblBhdGgoKTsKICAgIGMubW92ZVRvKG54LCA2MCk7CiAgICBjLmxpbmVUbyhueCAtIDUsIDY2KTsKICAgIGMubGluZVRvKG54ICsgNSwgNjYpOwogICAgYy5jbG9zZVBhdGgoKTsKICAgIGMuZmlsbCgpOwogICAgLy8gbW91dGggLyBsaWNrCiAgICBjLnN0cm9rZVN0eWxlID0gcGFsLm91dGxpbmU7CiAgICBjLmxpbmVXaWR0aCA9IDI7CiAgICBpZiAobGljaykgewogICAgICBjLmZpbGxTdHlsZSA9ICIjZjA4MDkwIjsKICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgYy5lbGxpcHNlKDQ4LCA3NCwgNSwgNywgMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICBjLmZpbGwoKTsKICAgIH0gZWxzZSBpZiAoam95ZnVsIHx8IHN1cnByaXNlKSB7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMuYXJjKDQ4LCA2OCwgam95ZnVsID8gOCA6IDYsIDAuMTUsIE1hdGguUEkgLSAwLjE1KTsKICAgICAgYy5zdHJva2UoKTsKICAgIH0gZWxzZSBpZiAoYW5ncnkpIHsKICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgYy5tb3ZlVG8oNDAsIDc0KTsKICAgICAgYy5xdWFkcmF0aWNDdXJ2ZVRvKDQ4LCA3MCwgNTYsIDc0KTsKICAgICAgYy5zdHJva2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMubW92ZVRvKDQ4LCA2Nik7CiAgICAgIGMubGluZVRvKDQ4LCA3Mik7CiAgICAgIGMubW92ZVRvKDQ4LCA3Mik7CiAgICAgIGMucXVhZHJhdGljQ3VydmVUbyg0MiwgNzYsIDM4LCA3Mik7CiAgICAgIGMubW92ZVRvKDQ4LCA3Mik7CiAgICAgIGMucXVhZHJhdGljQ3VydmVUbyg1NCwgNzYsIDU4LCA3Mik7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICB9CiAgICAvLyB3aGlza2VycwogICAgYy5zdHJva2VTdHlsZSA9ICJyZ2JhKDQwLDI1LDE1LDAuNDUpIjsKICAgIGMubGluZVdpZHRoID0gMS40OwogICAgW1syOCw2NCwxMiw2Ml0sWzI4LDY4LDEyLDcwXSxbNjgsNjQsODQsNjJdLFs2OCw2OCw4NCw3MF1dLmZvckVhY2goZnVuY3Rpb24gKHcpIHsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5tb3ZlVG8od1swXSwgd1sxXSk7IGMubGluZVRvKHdbMl0sIHdbM10pOyBjLnN0cm9rZSgpOwogICAgfSk7CiAgICByZXR1cm4gY3Y7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNpbXBsZVNwcml0ZXMoKSB7CiAgICBzaW1wbGVTcHJpdGVzID0gW107CiAgICB2YXIgZXhwcnMgPSBbImhhcHB5IiwgIndpbmsiLCAiam95ZnVsIiwgInN1cnByaXNlIiwgImFuZ3J5IiwgInJlc3QiLCAibGljayIsICJub3NlIiwgIm5vc2UyIl07CiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IFRZUEVTOyB0KyspIHsKICAgICAgdmFyIHBhY2sgPSB7fTsKICAgICAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGV4cHJzLmxlbmd0aDsgZWkrKykgewogICAgICAgIHBhY2tbZXhwcnNbZWldXSA9IG1ha2VTaW1wbGVDYXRGYWNlKHQsIGV4cHJzW2VpXSk7CiAgICAgIH0KICAgICAgcGFjay5ub3JtYWwgPSBwYWNrLmhhcHB5OwogICAgICBzaW1wbGVTcHJpdGVzLnB1c2gocGFjayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhcHBseVNwcml0ZU1vZGUoKSB7CiAgICBpZiAoc2ltcGxlTW9kZSAmJiBzaW1wbGVTcHJpdGVzICYmIHNpbXBsZVNwcml0ZXMubGVuZ3RoKSB7CiAgICAgIHNwcml0ZXMgPSBzaW1wbGVTcHJpdGVzOwogICAgfSBlbHNlIGlmIChhdGxhc1Nwcml0ZXMgJiYgYXRsYXNTcHJpdGVzLmxlbmd0aCkgewogICAgICBzcHJpdGVzID0gYXRsYXNTcHJpdGVzOwogICAgfQogICAgdXBkYXRlQXJ0QnRuKCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVBcnRCdG4oKSB7CiAgICBpZiAoIWFydEJ0bikgcmV0dXJuOwogICAgYXJ0QnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgc2ltcGxlTW9kZSA\/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgYXJ0QnRuLnRpdGxlID0gc2ltcGxlTW9kZSA\/ICJTaW1wbGUgY2F0czogT04iIDogIlNpbXBsZSBjYXRzOiBPRkYiOwogICAgYXJ0QnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIHNpbXBsZU1vZGUgPyAiU2ltcGxlIGNhdCBhcnQgb24iIDogIlNpbXBsZSBjYXQgYXJ0IG9mZiIpOwogICAgaWYgKHNpbXBsZU1vZGUpIGFydEJ0bi5jbGFzc0xpc3QuYWRkKCJjbS1hcnQtb24iKTsKICAgIGVsc2UgYXJ0QnRuLmNsYXNzTGlzdC5yZW1vdmUoImNtLWFydC1vbiIpOwogIH0KCiAgZnVuY3Rpb24gc2V0U2ltcGxlTW9kZShvbikgewogICAgc2ltcGxlTW9kZSA9ICEhb247CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY2F0TWF0Y2hTaW1wbGVBcnQiLCBzaW1wbGVNb2RlID8gIjEiIDogIjAiKTsgfSBjYXRjaCAoZVNldCkge30KICAgIGFwcGx5U3ByaXRlTW9kZSgpOwogIH0KCgogIGZ1bmN0aW9uIGJ1aWxkU3ByaXRlc0Zyb21BdGxhcygpIHsKICAgIHNwcml0ZXMgPSBbXTsKICAgIGZvciAodmFyIHQgPSAwOyB0IDwgVFlQRVM7IHQrKykgewogICAgICBzcHJpdGVzLnB1c2goewogICAgICAgIGhhcHB5OiBzbGljZUF0bGFzVGlsZSh0LCAiaGFwcHkiKSwKICAgICAgICB3aW5rOiBzbGljZUF0bGFzVGlsZSh0LCAid2luayIpLAogICAgICAgIGpveWZ1bDogc2xpY2VBdGxhc1RpbGUodCwgImpveWZ1bCIpLAogICAgICAgIHN1cnByaXNlOiBzbGljZUF0bGFzVGlsZSh0LCAic3VycHJpc2UiKSwKICAgICAgICBhbmdyeTogc2xpY2VBdGxhc1RpbGUodCwgImFuZ3J5IiksCiAgICAgICAgcmVzdDogc2xpY2VBdGxhc1RpbGUodCwgInJlc3QiKSwKICAgICAgICBsaWNrOiBzbGljZUF0bGFzVGlsZSh0LCAibGljayIpLAogICAgICAgIG5vc2U6IHNsaWNlQXRsYXNUaWxlKHQsICJub3NlIiksCiAgICAgICAgbm9zZTI6IHNsaWNlQXRsYXNUaWxlKHQsICJub3NlMiIpLAogICAgICAgIG5vcm1hbDogbnVsbAogICAgICB9KTsKICAgICAgc3ByaXRlc1t0XS5ub3JtYWwgPSBzcHJpdGVzW3RdLmhhcHB5OwogICAgfQogICAgc3BlY2lhbFNwcml0ZXMuc3RyaXBlZF9oID0gbWFrZVNwZWNpYWxPdmVybGF5KCJzdHJpcGVkX2giKTsKICAgIHNwZWNpYWxTcHJpdGVzLnN0cmlwZWRfdiA9IG1ha2VTcGVjaWFsT3ZlcmxheSgic3RyaXBlZF92Iik7CiAgICBzcGVjaWFsU3ByaXRlcy5ib21iID0gbWFrZVNwZWNpYWxPdmVybGF5KCJib21iIik7CiAgICBzcGVjaWFsU3ByaXRlcy5yYWluYm93ID0gbWFrZVNwZWNpYWxPdmVybGF5KCJyYWluYm93Iik7CiAgICBzcGVjaWFsU3ByaXRlcy5jYXRuaXAgPSBtYWtlU3BlY2lhbE92ZXJsYXkoImNhdG5pcCIpOwogICAgc3BlY2lhbFNwcml0ZXMuc3VwZXJjYXQgPSBtYWtlU3BlY2lhbE92ZXJsYXkoInN1cGVyY2F0Iik7CiAgICBvYnN0YWNsZVNwcml0ZXMuYm94ID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3giKTsKICAgIG9ic3RhY2xlU3ByaXRlcy5ib3gyID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3gyIik7CiAgICBvYnN0YWNsZVNwcml0ZXMueWFybiA9IG1ha2VPYnN0YWNsZVNwcml0ZSgieWFybiIpOwogICAgb2JzdGFjbGVTcHJpdGVzLmNhcnJpZXIgPSBtYWtlT2JzdGFjbGVTcHJpdGUoImNhcnJpZXIiKTsKICAgIGF0bGFzU3ByaXRlcyA9IHNwcml0ZXM7CiAgICBidWlsZFNpbXBsZVNwcml0ZXMoKTsKICAgIGFwcGx5U3ByaXRlTW9kZSgpOwogICAgYnVpbGRCZygpOwogICAgbG9hZEJvYXJkR3JpZCgpOwogICAgc3ByaXRlc1JlYWR5ID0gdHJ1ZTsKICAgIGlmIChzdGFydEJ0bikgewogICAgICBzdGFydEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICBzdGFydEJ0bi50ZXh0Q29udGVudCA9ICJQbGF5IjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGxvYWRBdGxhcygpIHsKICAgIGF0bGFzSW1nID0gbmV3IEltYWdlKCk7CiAgICBhdGxhc0ltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIEFUTEFTX1RXID0gTWF0aC5mbG9vcihhdGxhc0ltZy5uYXR1cmFsV2lkdGggLyA2KSB8fCA5NjsKICAgICAgQVRMQVNfVEggPSBNYXRoLmZsb29yKGF0bGFzSW1nLm5hdHVyYWxIZWlnaHQgLyBBVExBU19ST1dTKSB8fCA5NjsKICAgICAgYXRsYXNSZWFkeSA9IHRydWU7CiAgICAgIGJ1aWxkU3ByaXRlc0Zyb21BdGxhcygpOwogICAgfTsKICAgIGF0bGFzSW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGF0bGFzUmVhZHkgPSBmYWxzZTsKICAgICAgc3ByaXRlcyA9IFtdOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IFRZUEVTOyB0KyspIHsKICAgICAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgICBjdi53aWR0aCA9IDk2OyBjdi5oZWlnaHQgPSA5NjsKICAgICAgICB2YXIgYyA9IGN2LmdldENvbnRleHQoIjJkIik7CiAgICAgICAgdmFyIGNvbHMgPSBbIiNmZmMwNzgiLCAiIzVhNWE2OCIsICIjZmZmOGYwIiwgIiNjOGM4ZDQiLCAiI2ZmZThiOCIsICIjNGE0YTU4Il07CiAgICAgICAgYy5maWxsU3R5bGUgPSBjb2xzW3RdOwogICAgICAgIHJvdW5kUmVjdChjLCA0LCA0LCA4OCwgODgsIDE4KTsgYy5maWxsKCk7CiAgICAgICAgc3ByaXRlcy5wdXNoKHtoYXBweTogY3YsIHdpbms6IGN2LCBqb3lmdWw6IGN2LCBzdXJwcmlzZTogY3YsIGFuZ3J5OiBjdiwgcmVzdDogY3YsIGxpY2s6IGN2LCBub3NlOiBjdiwgbm9zZTI6IGN2LCBub3JtYWw6IGN2fSk7CiAgICAgIH0KICAgICAgc3BlY2lhbFNwcml0ZXMuc3RyaXBlZF9oID0gbWFrZVNwZWNpYWxPdmVybGF5KCJzdHJpcGVkX2giKTsKICAgICAgc3BlY2lhbFNwcml0ZXMuc3RyaXBlZF92ID0gbWFrZVNwZWNpYWxPdmVybGF5KCJzdHJpcGVkX3YiKTsKICAgICAgc3BlY2lhbFNwcml0ZXMuYm9tYiA9IG1ha2VTcGVjaWFsT3ZlcmxheSgiYm9tYiIpOwogICAgICBzcGVjaWFsU3ByaXRlcy5yYWluYm93ID0gbWFrZVNwZWNpYWxPdmVybGF5KCJyYWluYm93Iik7CiAgICAgIHNwZWNpYWxTcHJpdGVzLmNhdG5pcCA9IG1ha2VTcGVjaWFsT3ZlcmxheSgiY2F0bmlwIik7CiAgICAgIHNwZWNpYWxTcHJpdGVzLnN1cGVyY2F0ID0gbWFrZVNwZWNpYWxPdmVybGF5KCJzdXBlcmNhdCIpOwogICAgICBvYnN0YWNsZVNwcml0ZXMuYm94ID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3giKTsKICAgICAgb2JzdGFjbGVTcHJpdGVzLmJveDIgPSBtYWtlT2JzdGFjbGVTcHJpdGUoImJveDIiKTsKICAgICAgb2JzdGFjbGVTcHJpdGVzLnlhcm4gPSBtYWtlT2JzdGFjbGVTcHJpdGUoInlhcm4iKTsKICAgICAgb2JzdGFjbGVTcHJpdGVzLmNhcnJpZXIgPSBtYWtlT2JzdGFjbGVTcHJpdGUoImNhcnJpZXIiKTsKICAgICAgYXRsYXNTcHJpdGVzID0gc3ByaXRlczsKICAgICAgYnVpbGRTaW1wbGVTcHJpdGVzKCk7CiAgICAgIGFwcGx5U3ByaXRlTW9kZSgpOwogICAgICBidWlsZEJnKCk7CiAgICAgIGxvYWRCb2FyZEdyaWQoKTsKICAgICAgc3ByaXRlc1JlYWR5ID0gdHJ1ZTsKICAgICAgaWYgKHN0YXJ0QnRuKSB7IHN0YXJ0QnRuLmRpc2FibGVkID0gZmFsc2U7IHN0YXJ0QnRuLnRleHRDb250ZW50ID0gIlBsYXkiOyB9CiAgICB9OwogICAgYXRsYXNJbWcuc3JjID0gQVRMQVNfVVJMOwogIH0KCiAgLyogPT09PT0gQk9BUkQgSEVMUEVSUyA9PT09PSAqLwogIGZ1bmN0aW9uIGVtcHR5VGlsZSgpIHsKICAgIHJldHVybiB7dHlwZTogLTEsIHNwZWNpYWw6IG51bGwsIG9ic3RhY2xlOiBudWxsLCBocDogMCwgZmFsbDogMCwgc2NhbGU6IDEsIHNoYWtlOiAwLCBwb3A6IDAsIGdsb3c6IDAsCiAgICAgIHdpbmtVbnRpbDogMCwgbmV4dFdpbms6IDAsIGZhY2U6IG51bGwsIGZhY2VVbnRpbDogMCwgbmV4dEZhY2U6IDAsIHNsaWRlWDogMCwgc2xpZGVZOiAwLAogICAgICBzb2Z0UHJvdGVjdFVudGlsOiAwfTsKICB9CgogIGZ1bmN0aW9uIGNvbGxlY3RHb2FsVHlwZXMoKSB7CiAgICB2YXIgb3V0ID0gW107CiAgICB2YXIgbHYgPSBMRVZFTFNbbGV2ZWxJbmRleF07CiAgICBpZiAoIWx2IHx8ICFsdi5nb2FscykgcmV0dXJuIG91dDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbHYuZ29hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGcgPSBsdi5nb2Fsc1tpXTsKICAgICAgaWYgKGcgJiYgZy5raW5kID09PSAiY29sbGVjdCIgJiYgZy50eXBlICE9PSB1bmRlZmluZWQgJiYgZy50eXBlICE9PSBudWxsKSB7CiAgICAgICAgdmFyIHQgPSBOdW1iZXIoZy50eXBlKTsKICAgICAgICBpZiAodCA+PSAwICYmIG91dC5pbmRleE9mKHQpIDwgMCkgb3V0LnB1c2godCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBlbnN1cmVHb2FsVHlwZXNJblBvb2woKSB7CiAgICAvLyBDb2xsZWN0IGdvYWxzIG11c3QgYXBwZWFyIG9uIHRoZSBib2FyZCAodjlmIGNvdWxkIHNodWZmbGUgb3JhbmdlIG9mZiBsZXZlbCAxKS4KICAgIHZhciBuZWVkID0gY29sbGVjdEdvYWxUeXBlcygpOwogICAgaWYgKCFuZWVkLmxlbmd0aCkgcmV0dXJuOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWVkLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0ID0gbmVlZFtpXTsKICAgICAgaWYgKGFjdGl2ZVR5cGVzLmluZGV4T2YodCkgPj0gMCkgY29udGludWU7CiAgICAgIC8vIFByZWZlciByZXBsYWNpbmcgYSBub24tZ29hbCBjb2xvcjsgZWxzZSBhcHBlbmQuCiAgICAgIHZhciByZXBsYWNlZCA9IGZhbHNlOwogICAgICBmb3IgKHZhciBqID0gYWN0aXZlVHlwZXMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICBpZiAobmVlZC5pbmRleE9mKGFjdGl2ZVR5cGVzW2pdKSA8IDApIHsKICAgICAgICAgIGFjdGl2ZVR5cGVzW2pdID0gdDsKICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXJlcGxhY2VkKSBhY3RpdmVUeXBlcy5wdXNoKHQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGlja0NvbG9yUG9vbCgpIHsKICAgIC8vIExpbWl0ZWQgcGFyYW1ldGVyIHNldDogNC02IGNhdCB0eXBlcyBzbyBib2FyZHMgc3RheSByZWFkYWJsZSBidXQgdmFyeS4KICAgIC8vIEVhcmx5IHR1dG9yaWFsOiBzbGlnaHRseSBtb3JlIGNvbG9ycyA9IGZld2VyIGFjY2lkZW50YWwgbWVnYS1jYXNjYWRlcy4KICAgIHZhciB0YWJsZTsKICAgIGlmIChsZXZlbEluZGV4IDw9IDApIHRhYmxlID0gWzUsIDUsIDUsIDZdOwogICAgZWxzZSBpZiAobGV2ZWxJbmRleCA8PSAxKSB0YWJsZSA9IFs0LCA1LCA1LCA1XTsKICAgIGVsc2UgaWYgKGxldmVsSW5kZXggPD0gNSkgdGFibGUgPSBbNCwgNCwgNSwgNSwgNSwgNl07CiAgICBlbHNlIGlmIChsZXZlbEluZGV4IDw9IDExKSB0YWJsZSA9IFs0LCA1LCA1LCA1LCA2LCA2XTsKICAgIGVsc2UgdGFibGUgPSBbNSwgNSwgNSwgNiwgNiwgNl07CiAgICB2YXIgc2l6ZSA9IHRhYmxlWyhNYXRoLnJhbmRvbSgpICogdGFibGUubGVuZ3RoKSB8IDBdOwogICAgdmFyIGFsbCA9IFswLCAxLCAyLCAzLCA0LCA1XTsKICAgIHNodWZmbGUoYWxsKTsKICAgIGFjdGl2ZVR5cGVzID0gYWxsLnNsaWNlKDAsIHNpemUpOwogICAgZW5zdXJlR29hbFR5cGVzSW5Qb29sKCk7CiAgfQoKICBmdW5jdGlvbiByYW5kVHlwZSgpIHsKICAgIGlmICghYWN0aXZlVHlwZXMgfHwgIWFjdGl2ZVR5cGVzLmxlbmd0aCkgYWN0aXZlVHlwZXMgPSBbMCwgMSwgMiwgMywgNCwgNV07CiAgICByZXR1cm4gYWN0aXZlVHlwZXNbKE1hdGgucmFuZG9tKCkgKiBhY3RpdmVUeXBlcy5sZW5ndGgpIHwgMF07CiAgfQoKICBmdW5jdGlvbiBjYXRuaXBBbGxvd2VkKCkgewogICAgcmV0dXJuIGxldmVsSW5kZXggPj0gQ0FUTklQX01JTl9MRVZFTDsKICB9CgogIGZ1bmN0aW9uIGNvdW50Q2F0bmlwT25Cb2FyZCgpIHsKICAgIHZhciBuID0gMDsKICAgIGlmICghZ3JpZCB8fCAhZ3JpZC5sZW5ndGgpIHJldHVybiAwOwogICAgZm9yICh2YXIgciA9IDA7IHIgPCBHUklEOyByKyspIHsKICAgICAgaWYgKCFncmlkW3JdKSBjb250aW51ZTsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdCA9IGdyaWRbcl1bY107CiAgICAgICAgaWYgKHQgJiYgdC5zcGVjaWFsID09PSAiY2F0bmlwIikgbisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjsKICB9CgogIGZ1bmN0aW9uIGVhcmx5TGV2ZWxTaW1wbGUoKSB7CiAgICAvLyBMZXZlbHMgMS0yIChpbmRleCAwLTEpOiBiYXNpYyBtYXRjaC0zLCBubyBzcGVjaWFscyAvIHBhdyBzcGVjdGFjbGUuCiAgICByZXR1cm4gbGV2ZWxJbmRleCA8PSAxOwogIH0KCiAgZnVuY3Rpb24gc3BlY2lhbHNVbmxvY2tlZCgpIHsKICAgIC8vIFN0cmlwZWQgSC9WIG92ZXJsYXlzOiBMZXZlbCAxMCsgKGlkeCA5KS4gRWFybGllciA9IHBsYWluIG1hdGNoLTMgb25seS4KICAgIHJldHVybiBsZXZlbEluZGV4ID49IDk7CiAgfQoKICBmdW5jdGlvbiBib21ic1VubG9ja2VkKCkgewogICAgLy8gRXhwbG9kaW5nIENhdCAocmVkICEgY2lyY2xlKTogTGV2ZWwgMTMrIChpZHggMTIpLCBhZnRlciBTdXBlciBDYXQgdHV0b3JpYWwgKEwxMikuCiAgICByZXR1cm4gbGV2ZWxJbmRleCA+PSAxMjsKICB9CgogIGZ1bmN0aW9uIHJhaW5ib3dVbmxvY2tlZCgpIHsKICAgIHJldHVybiBsZXZlbEluZGV4ID49IDE0OwogIH0KCiAgZnVuY3Rpb24gc3VwZXJjYXRVbmxvY2tlZCgpIHsKICAgIC8vIFN1cGVyIENhdCBTQy8rIG92ZXJsYXk6IGZlYXR1cmVkIFN1cGVyIENhdCBSZXNjdWUgKEwxMiwgaWR4IDExKSBhbmQgbGF0ZXIuCiAgICB2YXIgbHYgPSBMRVZFTFNbbGV2ZWxJbmRleF07CiAgICByZXR1cm4gbGV2ZWxJbmRleCA+PSAxMSB8fCAhIShsdiAmJiBsdi5mZWF0dXJlID09PSAic3VwZXJjYXQiKTsKICB9CgogIGZ1bmN0aW9uIGJpYXNDb2xsZWN0VHlwZSgpIHsKICAgIHZhciBuZWVkID0gY29sbGVjdEdvYWxUeXBlcygpOwogICAgaWYgKCFuZWVkLmxlbmd0aCkgcmV0dXJuIC0xOwogICAgaWYgKG5lZWQubGVuZ3RoID09PSAxKSByZXR1cm4gbmVlZFswXTsKICAgIHJldHVybiBuZWVkWyhNYXRoLnJhbmRvbSgpICogbmVlZC5sZW5ndGgpIHwgMF07CiAgfQoKICBmdW5jdGlvbiBuZXdDYXQoYXZvaWQxLCBhdm9pZDIsIHByZWZlckNvbCwgcHJlZmVyUm93KSB7CiAgICB2YXIgdCwgZ3VhcmQgPSAwOwogICAgZG8gewogICAgICBpZiAoZWRBY3RpdmUoKSAmJiBldmVudERpcmVjdG9yLmFzc2lzdGFuY2UgPj0gMSkgdCA9IGVkV2VpZ2h0ZWRUeXBlKGF2b2lkMSwgYXZvaWQyKTsKICAgICAgZWxzZSB7CiAgICAgICAgdCA9IHJhbmRUeXBlKCk7CiAgICAgICAgLy8gTWlsZCBiaWFzIHNvIGNvbGxlY3QgZ29hbHMgKGUuZy4gb3JhbmdlIG9uIEwxKSBhY3R1YWxseSBwcm9ncmVzcy4KICAgICAgICB2YXIgYnQgPSBiaWFzQ29sbGVjdFR5cGUoKTsKICAgICAgICBpZiAoYnQgPj0gMCAmJiBhY3RpdmVUeXBlcy5pbmRleE9mKGJ0KSA+PSAwICYmIE1hdGgucmFuZG9tKCkgPCAoZWFybHlMZXZlbFNpbXBsZSgpID8gMC4yMiA6IDAuMTApKSB7CiAgICAgICAgICB0ID0gYnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIE1pbGQgem9uZSByZS1yb2xsIGZvciBDYXQgRGFzaCBlZGdlcwogICAgICBpZiAoZWRBY3RpdmUoKSAmJiBldmVudERpcmVjdG9yLmZlYXR1cmVJZCA9PT0gImNhdGRhc2giICYmIHByZWZlckNvbCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFyIGZhdm9yID0gZWRab25lRmF2b3IocHJlZmVyQ29sLCBwcmVmZXJSb3cgfHwgMCk7CiAgICAgICAgaWYgKGZhdm9yID4gMSAmJiBNYXRoLnJhbmRvbSgpIDwgKGZhdm9yIC0gMSkgKiAwLjUpIHsKICAgICAgICAgIHZhciBidCA9IGVkUGlja0JpYXNUeXBlKCk7CiAgICAgICAgICBpZiAoYnQgPj0gMCkgdCA9IGJ0OwogICAgICAgIH0KICAgICAgfQogICAgICBndWFyZCsrOwogICAgfSB3aGlsZSAoZ3VhcmQgPCAyNCAmJiAoKGF2b2lkMSAhPT0gdW5kZWZpbmVkICYmIHQgPT09IGF2b2lkMSkgfHwgKGF2b2lkMiAhPT0gdW5kZWZpbmVkICYmIHQgPT09IGF2b2lkMikpKTsKICAgIHZhciB0aWxlID0gZW1wdHlUaWxlKCk7CiAgICB0aWxlLnR5cGUgPSB0OwogICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMDsKICAgIC8vIEZpcnN0IGlkbGUgZmFjZSBzb29uIGFmdGVyIHNwYXduIChub3QgbXVsdGktbWludXRlIGlkbGVHYXBEZWxheSkuCiAgICB0aWxlLm5leHRXaW5rID0gbm93ICsgMS4yICsgTWF0aC5yYW5kb20oKSAqIDQuNTsKICAgIHRpbGUubmV4dEZhY2UgPSBub3cgKyAyLjUgKyBNYXRoLnJhbmRvbSgpICogNzsKICAgIC8vIFJhcmUgY2F0bmlwOiBsYXRlciBzdGFnZXMgb25seSwgYXQgbW9zdCBvbmUgb24gc2NyZWVuCiAgICBpZiAoY2F0bmlwQWxsb3dlZCgpICYmIGNvdW50Q2F0bmlwT25Cb2FyZCgpID09PSAwICYmIE1hdGgucmFuZG9tKCkgPCBDQVROSVBfQ0hBTkNFKSB7CiAgICAgIHRpbGUuc3BlY2lhbCA9ICJjYXRuaXAiOwogICAgfQogICAgcmV0dXJuIHRpbGU7CiAgfQoKICBmdW5jdGlvbiBpbkJvdW5kcyhyLCBjKSB7CiAgICByZXR1cm4gciA+PSAwICYmIHIgPCBHUklEICYmIGMgPj0gMCAmJiBjIDwgR1JJRDsKICB9CgogIGZ1bmN0aW9uIGNsb25lR3JpZChnKSB7CiAgICB2YXIgb3V0ID0gW107CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBvdXRbcl0gPSBbXTsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdCA9IGdbcl1bY107CiAgICAgICAgb3V0W3JdW2NdID0gewogICAgICAgICAgdHlwZTogdC50eXBlLCBzcGVjaWFsOiB0LnNwZWNpYWwsIG9ic3RhY2xlOiB0Lm9ic3RhY2xlLCBocDogdC5ocCwKICAgICAgICAgIGZhbGw6IDAsIHNjYWxlOiAxLCBzaGFrZTogMCwgcG9wOiAwLCBnbG93OiB0Lmdsb3cgfHwgMCwKICAgICAgICAgIHdpbmtVbnRpbDogdC53aW5rVW50aWwgfHwgMCwgbmV4dFdpbms6IHQubmV4dFdpbmsgfHwgMCwKICAgICAgICAgIGZhY2U6IHQuZmFjZSB8fCBudWxsLCBmYWNlVW50aWw6IHQuZmFjZVVudGlsIHx8IDAsIG5leHRGYWNlOiB0Lm5leHRGYWNlIHx8IDAsCiAgICAgICAgICBzbGlkZVg6IDAsIHNsaWRlWTogMCwgc29mdFByb3RlY3RVbnRpbDogdC5zb2Z0UHJvdGVjdFVudGlsIHx8IDAKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gYXBwbHlMYXlvdXQobGF5b3V0KSB7CiAgICB2YXIgcG9zaXRpb25zID0gW107CiAgICBmdW5jdGlvbiBhZGRSaW5nKGtpbmQsIGhwLCBjb3VudCkgewogICAgICB2YXIgc3BvdHMgPSBbXTsKICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBHUklEOyByKyspCiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspCiAgICAgICAgICBpZiAoKHIgKyBjKSAlIDIgPT09IDApIHNwb3RzLnB1c2goW3IsIGNdKTsKICAgICAgc2h1ZmZsZShzcG90cyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgJiYgaSA8IHNwb3RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJyID0gc3BvdHNbaV1bMF0sIGNjID0gc3BvdHNbaV1bMV07CiAgICAgICAgZ3JpZFtycl1bY2NdLm9ic3RhY2xlID0ga2luZDsKICAgICAgICBncmlkW3JyXVtjY10uaHAgPSBocDsKICAgICAgICBncmlkW3JyXVtjY10udHlwZSA9IC0xOwogICAgICAgIGdyaWRbcnJdW2NjXS5zcGVjaWFsID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKGxheW91dCA9PT0gImJveGVzMSIpIGFkZFJpbmcoImJveCIsIDEsIDgpOwogICAgZWxzZSBpZiAobGF5b3V0ID09PSAiYm94ZXMyIikgewogICAgICBhZGRSaW5nKCJib3gyIiwgMiwgNik7IGFkZFJpbmcoImJveCIsIDEsIDYpOwogICAgfSBlbHNlIGlmIChsYXlvdXQgPT09ICJib3hlczMiKSBhZGRSaW5nKCJib3giLCAxLCAxMCk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJib3hlczQiKSB7CiAgICAgIGFkZFJpbmcoImJveDIiLCAyLCA4KTsgYWRkUmluZygiYm94IiwgMSwgNik7CiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gImJveGVzNSIpIHsKICAgICAgYWRkUmluZygiYm94MiIsIDIsIDEwKTsgYWRkUmluZygiYm94IiwgMSwgNik7CiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gImtpdHMxIikgYWRkUmluZygiY2FycmllciIsIDEsIDMpOwogICAgZWxzZSBpZiAobGF5b3V0ID09PSAia2l0czIiKSB7CiAgICAgIGFkZFJpbmcoImNhcnJpZXIiLCAxLCA0KTsgYWRkUmluZygiYm94IiwgMSwgNik7CiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gImtpdHMzIikgYWRkUmluZygiY2FycmllciIsIDEsIDUpOwogICAgZWxzZSBpZiAobGF5b3V0ID09PSAieWFybjEiKSBhZGRSaW5nKCJ5YXJuIiwgMSwgOCk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJ5YXJuMiIpIGFkZFJpbmcoInlhcm4iLCAxLCAxMCk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJ5YXJuMyIpIGFkZFJpbmcoInlhcm4iLCAxLCAxMik7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJtaXgxIikgewogICAgICBhZGRSaW5nKCJjYXJyaWVyIiwgMSwgMyk7IGFkZFJpbmcoInlhcm4iLCAxLCA2KTsKICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAibWl4MiIpIHsKICAgICAgYWRkUmluZygiY2FycmllciIsIDEsIDMpOyBhZGRSaW5nKCJib3giLCAxLCAxMCk7CiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gIm1peDMiKSBhZGRSaW5nKCJib3giLCAxLCA4KTsKICAgIGVsc2UgaWYgKGxheW91dCA9PT0gIm1peDQiKSB7CiAgICAgIGFkZFJpbmcoImNhcnJpZXIiLCAxLCAzKTsgYWRkUmluZygieWFybiIsIDEsIDgpOyBhZGRSaW5nKCJib3giLCAxLCAxMik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaHVmZmxlKGEpIHsKICAgIGZvciAodmFyIGkgPSBhLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgdmFyIGogPSAoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpIHwgMDsKICAgICAgdmFyIHRtcCA9IGFbaV07IGFbaV0gPSBhW2pdOyBhW2pdID0gdG1wOwogICAgfQogICAgcmV0dXJuIGE7CiAgfQoKICBmdW5jdGlvbiBmaWxsQm9hcmROb01hdGNoZXMoKSB7CiAgICBncmlkID0gW107CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBncmlkW3JdID0gW107CiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgR1JJRDsgYysrKSB7CiAgICAgICAgdmFyIGxlZnQgPSBjID49IDIgJiYgZ3JpZFtyXVtjIC0gMV0udHlwZSA9PT0gZ3JpZFtyXVtjIC0gMl0udHlwZSA\/IGdyaWRbcl1bYyAtIDFdLnR5cGUgOiB1bmRlZmluZWQ7CiAgICAgICAgdmFyIHVwID0gciA+PSAyICYmIGdyaWRbciAtIDFdW2NdLnR5cGUgPT09IGdyaWRbciAtIDJdW2NdLnR5cGUgPyBncmlkW3IgLSAxXVtjXS50eXBlIDogdW5kZWZpbmVkOwogICAgICAgIGdyaWRbcl1bY10gPSBuZXdDYXQobGVmdCwgdXApOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwbGFudEd1YXJhbnRlZWRTd2FwKCkgewogICAgLy8gQ2xhc3NpYyBob3Jpem9udGFsOiBBIEIgQSAgd2l0aCBCIHN3YXAtZnJvbS1iZWxvdyBjcmVhdGluZyBBQUEgbWlkCiAgICAvLyBMYXlvdXQgcm93IHI6IEEgWCBBIDsgYmVsb3cgbWlkOiBBICAtPiBzd2FwIFggd2l0aCBiZWxvdyBBCiAgICB2YXIgciA9IDIgKyAoKE1hdGgucmFuZG9tKCkgKiAoR1JJRCAtIDQpKSB8IDApOwogICAgdmFyIGMgPSAxICsgKChNYXRoLnJhbmRvbSgpICogKEdSSUQgLSAzKSkgfCAwKTsKICAgIHZhciBhID0gYWN0aXZlVHlwZXNbMF07CiAgICB2YXIgYiA9IGFjdGl2ZVR5cGVzLmxlbmd0aCA+IDEgPyBhY3RpdmVUeXBlc1sxXSA6IChhICsgMSkgJSBUWVBFUzsKICAgIGlmIChncmlkW3JdW2MgLSAxXS5vYnN0YWNsZSB8fCBncmlkW3JdW2NdLm9ic3RhY2xlIHx8IGdyaWRbcl1bYyArIDFdLm9ic3RhY2xlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZ3JpZFtyICsgMV1bY10ub2JzdGFjbGUpIHJldHVybiBmYWxzZTsKICAgIGdyaWRbcl1bYyAtIDFdLnR5cGUgPSBhOyBncmlkW3JdW2MgLSAxXS5zcGVjaWFsID0gbnVsbDsKICAgIGdyaWRbcl1bY10udHlwZSA9IGI7IGdyaWRbcl1bY10uc3BlY2lhbCA9IG51bGw7CiAgICBncmlkW3JdW2MgKyAxXS50eXBlID0gYTsgZ3JpZFtyXVtjICsgMV0uc3BlY2lhbCA9IG51bGw7CiAgICBncmlkW3IgKyAxXVtjXS50eXBlID0gYTsgZ3JpZFtyICsgMV1bY10uc3BlY2lhbCA9IG51bGw7CiAgICAvLyBCcmVhayBhY2NpZGVudGFsIHRyaXBsZXMgYXJvdW5kIHRoZSBwbGFudAogICAgaWYgKGMgLSAyID49IDAgJiYgIWdyaWRbcl1bYyAtIDJdLm9ic3RhY2xlICYmIGdyaWRbcl1bYyAtIDJdLnR5cGUgPT09IGEpIGdyaWRbcl1bYyAtIDJdLnR5cGUgPSBiOwogICAgaWYgKGMgKyAyIDwgR1JJRCAmJiAhZ3JpZFtyXVtjICsgMl0ub2JzdGFjbGUgJiYgZ3JpZFtyXVtjICsgMl0udHlwZSA9PT0gYSkgZ3JpZFtyXVtjICsgMl0udHlwZSA9IGI7CiAgICBpZiAociAtIDEgPj0gMCAmJiAhZ3JpZFtyIC0gMV1bY10ub2JzdGFjbGUgJiYgZ3JpZFtyIC0gMV1bY10udHlwZSA9PT0gYikgZ3JpZFtyIC0gMV1bY10udHlwZSA9IGE7CiAgICByZXR1cm4gd291bGRNYXRjaChncmlkLCByLCBjLCByICsgMSwgYyk7CiAgfQoKICBmdW5jdGlvbiBmaWxsQm9hcmRGcmVzaCgpIHsKICAgIHBpY2tDb2xvclBvb2woKTsKICAgIHZhciB0cmllcyA9IDA7CiAgICB3aGlsZSAodHJpZXMrKyA8IDQ4KSB7CiAgICAgIGZpbGxCb2FyZE5vTWF0Y2hlcygpOwogICAgICBpZiAoZmluZE1hdGNoZXMoZ3JpZCkuZ3JvdXBzLmxlbmd0aCkgY29udGludWU7CiAgICAgIGlmIChmaW5kSGludCgpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZpbGxCb2FyZE5vTWF0Y2hlcygpOwogICAgcGxhbnRHdWFyYW50ZWVkU3dhcCgpOwogICAgdmFyIGd1YXJkID0gMDsKICAgIHdoaWxlIChmaW5kTWF0Y2hlcyhncmlkKS5ncm91cHMubGVuZ3RoICYmIGd1YXJkKysgPCAxMikgewogICAgICAvLyBudWRnZSBjb25mbGljdGluZyBjZWxscwogICAgICB2YXIgbSA9IGZpbmRNYXRjaGVzKGdyaWQpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG0uZ3JvdXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNlbGwwID0gbS5ncm91cHNbaV0uY2VsbHNbMF07CiAgICAgICAgdmFyIHQgPSBncmlkW2NlbGwwWzBdXVtjZWxsMFsxXV07CiAgICAgICAgaWYgKCF0Lm9ic3RhY2xlKSB0LnR5cGUgPSByYW5kVHlwZSgpOwogICAgICB9CiAgICB9CiAgICBpZiAoIWZpbmRIaW50KCkpIHBsYW50R3VhcmFudGVlZFN3YXAoKTsKICAgIHJldHVybiAhIWZpbmRIaW50KCk7CiAgfQoKICBmdW5jdGlvbiBibG93VXBSYW5kb21DbHVzdGVyKCkgewogICAgLy8gQ2xlYXIgYSByYW5kb20gY2x1c3RlciAvIHNldCBvZiB0aWxlcywgdGhlbiBjYWxsZXIgcmVmaWxscy4KICAgIHZhciBjZW50ZXJzID0gW107CiAgICBmb3IgKHZhciByID0gMTsgciA8IEdSSUQgLSAxOyByKyspCiAgICAgIGZvciAodmFyIGMgPSAxOyBjIDwgR1JJRCAtIDE7IGMrKykKICAgICAgICBpZiAoIWdyaWRbcl1bY10ub2JzdGFjbGUgJiYgZ3JpZFtyXVtjXS50eXBlID49IDApIGNlbnRlcnMucHVzaChbciwgY10pOwogICAgaWYgKCFjZW50ZXJzLmxlbmd0aCkgewogICAgICBmb3IgKHZhciByMiA9IDA7IHIyIDwgR1JJRDsgcjIrKykKICAgICAgICBmb3IgKHZhciBjMiA9IDA7IGMyIDwgR1JJRDsgYzIrKykKICAgICAgICAgIGlmICghZ3JpZFtyMl1bYzJdLm9ic3RhY2xlICYmIGdyaWRbcjJdW2MyXS50eXBlID49IDApIGNlbnRlcnMucHVzaChbcjIsIGMyXSk7CiAgICB9CiAgICBpZiAoIWNlbnRlcnMubGVuZ3RoKSByZXR1cm4gMDsKICAgIHNodWZmbGUoY2VudGVycyk7CiAgICB2YXIgbW9kZSA9IChNYXRoLnJhbmRvbSgpICogMykgfCAwOwogICAgdmFyIGNsZWFyZWQgPSAwOwogICAgZnVuY3Rpb24gY2xlYXJPbmUocnIsIGNjKSB7CiAgICAgIGlmICghaW5Cb3VuZHMocnIsIGNjKSkgcmV0dXJuOwogICAgICB2YXIgdCA9IGdyaWRbcnJdW2NjXTsKICAgICAgaWYgKHQub2JzdGFjbGUgfHwgdC50eXBlIDwgMCkgcmV0dXJuOwogICAgICBzcGF3blBvb2YoYm9hcmRYICsgY2MgKiBjZWxsVyArIGNlbGxXIC8gMiwgYm9hcmRZICsgcnIgKiBjZWxsSCArIGNlbGxIIC8gMiwgdC50eXBlKTsKICAgICAgdC50eXBlID0gLTE7CiAgICAgIHQuc3BlY2lhbCA9IG51bGw7CiAgICAgIHQucG9wID0gMTsKICAgICAgY2xlYXJlZCsrOwogICAgfQogICAgaWYgKG1vZGUgPT09IDApIHsKICAgICAgLy8gM3gzIGJsYXN0CiAgICAgIHZhciByYyA9IGNlbnRlcnNbMF07CiAgICAgIGZvciAodmFyIGRyID0gLTE7IGRyIDw9IDE7IGRyKyspCiAgICAgICAgZm9yICh2YXIgZGMgPSAtMTsgZGMgPD0gMTsgZGMrKykgY2xlYXJPbmUocmNbMF0gKyBkciwgcmNbMV0gKyBkYyk7CiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IDEpIHsKICAgICAgLy8gcmFuZG9tIDgtMTIgdGlsZXMKICAgICAgdmFyIG4gPSA4ICsgKChNYXRoLnJhbmRvbSgpICogNSkgfCAwKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICYmIGkgPCBjZW50ZXJzLmxlbmd0aDsgaSsrKSBjbGVhck9uZShjZW50ZXJzW2ldWzBdLCBjZW50ZXJzW2ldWzFdKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIHBsdXMgc2hhcGUKICAgICAgdmFyIHAgPSBjZW50ZXJzWzBdOwogICAgICBjbGVhck9uZShwWzBdLCBwWzFdKTsKICAgICAgY2xlYXJPbmUocFswXSAtIDEsIHBbMV0pOwogICAgICBjbGVhck9uZShwWzBdICsgMSwgcFsxXSk7CiAgICAgIGNsZWFyT25lKHBbMF0sIHBbMV0gLSAxKTsKICAgICAgY2xlYXJPbmUocFswXSwgcFsxXSArIDEpOwogICAgICBjbGVhck9uZShwWzBdIC0gMiwgcFsxXSk7CiAgICAgIGNsZWFyT25lKHBbMF0gKyAyLCBwWzFdKTsKICAgICAgY2xlYXJPbmUocFswXSwgcFsxXSAtIDIpOwogICAgICBjbGVhck9uZShwWzBdLCBwWzFdICsgMik7CiAgICB9CiAgICByZXR1cm4gY2xlYXJlZDsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVZhbGlkTW92ZSgpIHsKICAgIGlmIChmaW5kSGludCgpKSByZXR1cm47CiAgICAvLyBUdXRvcmlhbCBsZXZlbHM6IHF1aWV0IHNodWZmbGUgb25seSAobm8gTWVvdy1ib29tIGNhc2NhZGUgY2hhaW5zKS4KICAgIGlmIChlYXJseUxldmVsU2ltcGxlKCkpIHsKICAgICAgYXdhaXQgc2h1ZmZsZUJvYXJkVW50aWxNb3ZlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciB0cmllcyA9IDA7CiAgICB3aGlsZSAoIWZpbmRIaW50KCkgJiYgdHJpZXMrKyA8IDEwKSB7CiAgICAgIHNldEZsYXNoKHRyaWVzID09PSAxID8gIlNoYWtlIGl0IHVwISIgOiAiTWVvdy1ib29tISIpOwogICAgICBibG93VXBSYW5kb21DbHVzdGVyKCk7CiAgICAgIGF3YWl0IHNsZWVwKDE4MCk7CiAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIC8vIFJlc29sdmUgYW55IGFjY2lkZW50YWwgbWF0Y2hlcyBmcm9tIHJlZmlsbCwgdGhlbiByZWNoZWNrCiAgICAgIHZhciBzYWZldHkgPSAwOwogICAgICB3aGlsZSAoZmluZE1hdGNoZXMoZ3JpZCkuZ3JvdXBzLmxlbmd0aCAmJiBzYWZldHkrKyA8IDIwKSB7CiAgICAgICAgYXdhaXQgcmVzb2x2ZU1hdGNoZXMoZmFsc2UpOwogICAgICB9CiAgICAgIGlmIChmaW5kSGludCgpKSByZXR1cm47CiAgICB9CiAgICBpZiAoIWZpbmRIaW50KCkpIHsKICAgICAgYXdhaXQgc2h1ZmZsZUJvYXJkVW50aWxNb3ZlKCk7CiAgICB9CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzaHVmZmxlQm9hcmRVbnRpbE1vdmUoKSB7CiAgICBzZXRGbGFzaCgiU2h1ZmZsaW5nLi4uIik7CiAgICB2YXIgZ3VhcmQgPSAwOwogICAgd2hpbGUgKCFmaW5kSGludCgpICYmIGd1YXJkKysgPCAzMCkgewogICAgICB2YXIgY2F0cyA9IFtdOwogICAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykKICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykKICAgICAgICAgIGlmIChncmlkW3JdW2NdLnR5cGUgPj0gMCAmJiAhZ3JpZFtyXVtjXS5vYnN0YWNsZSkKICAgICAgICAgICAgY2F0cy5wdXNoKHt0eXBlOiBncmlkW3JdW2NdLnR5cGUsIHNwZWNpYWw6IGdyaWRbcl1bY10uc3BlY2lhbH0pOwogICAgICBzaHVmZmxlKGNhdHMpOwogICAgICB2YXIgaSA9IDA7CiAgICAgIGZvciAodmFyIHIyID0gMDsgcjIgPCBHUklEOyByMisrKQogICAgICAgIGZvciAodmFyIGMyID0gMDsgYzIgPCBHUklEOyBjMisrKQogICAgICAgICAgaWYgKCFncmlkW3IyXVtjMl0ub2JzdGFjbGUgJiYgZ3JpZFtyMl1bYzJdLnR5cGUgPj0gMCkgewogICAgICAgICAgICBncmlkW3IyXVtjMl0udHlwZSA9IGNhdHNbaV0udHlwZTsKICAgICAgICAgICAgZ3JpZFtyMl1bYzJdLnNwZWNpYWwgPSBjYXRzW2ldLnNwZWNpYWw7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgaWYgKGZpbmRNYXRjaGVzKGdyaWQpLmdyb3Vwcy5sZW5ndGgpIGNvbnRpbnVlOwogICAgICBpZiAoZmluZEhpbnQoKSkgYnJlYWs7CiAgICB9CiAgICBpZiAoIWZpbmRIaW50KCkpIHsKICAgICAgcGxhbnRHdWFyYW50ZWVkU3dhcCgpOwogICAgfQogICAgYXdhaXQgc2xlZXAoMjgwKTsKICB9CgogIC8qID09PT09IE1BVENIIEZJTkRJTkcgPT09PT0gKi8KICBmdW5jdGlvbiBmaW5kTWF0Y2hlcyhnKSB7CiAgICB2YXIgbWFya2VkID0ge307CiAgICB2YXIgZ3JvdXBzID0gW107CiAgICBmdW5jdGlvbiBrZXkociwgYykgeyByZXR1cm4gciArICIsIiArIGM7IH0KCiAgICAvLyBob3Jpem9udGFsCiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICB2YXIgYyA9IDA7CiAgICAgIHdoaWxlIChjIDwgR1JJRCkgewogICAgICAgIHZhciB0ID0gZ1tyXVtjXTsKICAgICAgICBpZiAodC50eXBlIDwgMCB8fCB0Lm9ic3RhY2xlKSB7IGMrKzsgY29udGludWU7IH0KICAgICAgICB2YXIgcnVuID0gMTsKICAgICAgICB3aGlsZSAoYyArIHJ1biA8IEdSSUQgJiYgZ1tyXVtjICsgcnVuXS50eXBlID09PSB0LnR5cGUgJiYgIWdbcl1bYyArIHJ1bl0ub2JzdGFjbGUpIHJ1bisrOwogICAgICAgIGlmIChydW4gPj0gMykgewogICAgICAgICAgdmFyIGNlbGxzID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bjsgaSsrKSB7CiAgICAgICAgICAgIGNlbGxzLnB1c2goW3IsIGMgKyBpXSk7CiAgICAgICAgICAgIG1hcmtlZFtrZXkociwgYyArIGkpXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBncm91cHMucHVzaCh7Y2VsbHM6IGNlbGxzLCB0eXBlOiB0LnR5cGUsIG9yaWVudDogImgiLCBsZW46IHJ1bn0pOwogICAgICAgIH0KICAgICAgICBjICs9IHJ1bjsKICAgICAgfQogICAgfQogICAgLy8gdmVydGljYWwKICAgIGZvciAodmFyIGMyID0gMDsgYzIgPCBHUklEOyBjMisrKSB7CiAgICAgIHZhciByMiA9IDA7CiAgICAgIHdoaWxlIChyMiA8IEdSSUQpIHsKICAgICAgICB2YXIgdDIgPSBnW3IyXVtjMl07CiAgICAgICAgaWYgKHQyLnR5cGUgPCAwIHx8IHQyLm9ic3RhY2xlKSB7IHIyKys7IGNvbnRpbnVlOyB9CiAgICAgICAgdmFyIHJ1bjIgPSAxOwogICAgICAgIHdoaWxlIChyMiArIHJ1bjIgPCBHUklEICYmIGdbcjIgKyBydW4yXVtjMl0udHlwZSA9PT0gdDIudHlwZSAmJiAhZ1tyMiArIHJ1bjJdW2MyXS5vYnN0YWNsZSkgcnVuMisrOwogICAgICAgIGlmIChydW4yID49IDMpIHsKICAgICAgICAgIHZhciBjZWxsczIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBydW4yOyBpMisrKSB7CiAgICAgICAgICAgIGNlbGxzMi5wdXNoKFtyMiArIGkyLCBjMl0pOwogICAgICAgICAgICBtYXJrZWRba2V5KHIyICsgaTIsIGMyKV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgZ3JvdXBzLnB1c2goe2NlbGxzOiBjZWxsczIsIHR5cGU6IHQyLnR5cGUsIG9yaWVudDogInYiLCBsZW46IHJ1bjJ9KTsKICAgICAgICB9CiAgICAgICAgcjIgKz0gcnVuMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHtncm91cHM6IGdyb3VwcywgbWFya2VkOiBtYXJrZWR9OwogIH0KCiAgZnVuY3Rpb24gd291bGRNYXRjaChnLCByMSwgYzEsIHIyLCBjMikgewogICAgdmFyIGEgPSBnW3IxXVtjMV0sIGIgPSBnW3IyXVtjMl07CiAgICBpZiAoYS50eXBlIDwgMCB8fCBiLnR5cGUgPCAwKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYS5vYnN0YWNsZSB8fCBiLm9ic3RhY2xlKSByZXR1cm4gZmFsc2U7CiAgICAvLyByYWluYm93IGFsd2F5cyAibWF0Y2hlcyIgd2hlbiBzd2FwcGVkIHdpdGggYSBjYXQKICAgIGlmIChhLnNwZWNpYWwgPT09ICJyYWluYm93IiB8fCBiLnNwZWNpYWwgPT09ICJyYWluYm93IikgcmV0dXJuIHRydWU7CiAgICAvLyB0d28gc3BlY2lhbHMKICAgIGlmIChhLnNwZWNpYWwgJiYgYi5zcGVjaWFsKSByZXR1cm4gdHJ1ZTsKICAgIGdbcjFdW2MxXSA9IGI7IGdbcjJdW2MyXSA9IGE7CiAgICB2YXIgbSA9IGZpbmRNYXRjaGVzKGcpOwogICAgZ1tyMV1bYzFdID0gYTsgZ1tyMl1bYzJdID0gYjsKICAgIHJldHVybiBtLmdyb3Vwcy5sZW5ndGggPiAwOwogIH0KCiAgZnVuY3Rpb24gZmluZEhpbnQoKSB7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgIGlmIChjICsgMSA8IEdSSUQgJiYgd291bGRNYXRjaChncmlkLCByLCBjLCByLCBjICsgMSkpIHJldHVybiBbW3IsIGNdLCBbciwgYyArIDFdXTsKICAgICAgICBpZiAociArIDEgPCBHUklEICYmIHdvdWxkTWF0Y2goZ3JpZCwgciwgYywgciArIDEsIGMpKSByZXR1cm4gW1tyLCBjXSwgW3IgKyAxLCBjXV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLyogPT09PT0gR09BTFMgLyBEQU1BR0UgPT09PT0gKi8KICBmdW5jdGlvbiBoaXRPYnN0YWNsZShyLCBjKSB7CiAgICB2YXIgdCA9IGdyaWRbcl1bY107CiAgICBpZiAoIXQub2JzdGFjbGUpIHJldHVybjsKICAgIHZhciBraW5kID0gdC5vYnN0YWNsZTsKICAgIHQuaHAtLTsKICAgIHQuc2hha2UgPSA4OwogICAgaWYgKHQuaHAgPD0gMCkgewogICAgICB0Lm9ic3RhY2xlID0gbnVsbDsKICAgICAgaWYgKGtpbmQgPT09ICJib3giIHx8IGtpbmQgPT09ICJib3gyIikgcHJvZ3Jlc3NHb2FsKCJib3hlcyIsIDEpOwogICAgICBlbHNlIGlmIChraW5kID09PSAieWFybiIpIHByb2dyZXNzR29hbCgieWFybiIsIDEpOwogICAgICBlbHNlIGlmIChraW5kID09PSAiY2FycmllciIpIHsKICAgICAgICBwcm9ncmVzc0dvYWwoImtpdHRlbnMiLCAxKTsKICAgICAgICB0LnR5cGUgPSByYW5kVHlwZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJib3gyIiAmJiB0LmhwID09PSAxKSB7CiAgICAgIHQub2JzdGFjbGUgPSAiYm94IjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHByb2dyZXNzR29hbChraW5kLCBuLCB0eXBlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdvYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBnID0gZ29hbHNbaV07CiAgICAgIGlmIChnLmtpbmQgPT09IGtpbmQpIHsKICAgICAgICBpZiAoa2luZCA9PT0gImNvbGxlY3QiICYmIE51bWJlcihnLnR5cGUpICE9PSBOdW1iZXIodHlwZSkpIGNvbnRpbnVlOwogICAgICAgIGcuaGF2ZSA9IE1hdGgubWluKGcubmVlZCwgKGcuaGF2ZSB8fCAwKSArIG4pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnb2Fsc0RvbmUoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdvYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICgoZ29hbHNbaV0uaGF2ZSB8fCAwKSA8IGdvYWxzW2ldLm5lZWQpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZGFtYWdlQWRqYWNlbnQoY2VsbHMpIHsKICAgIHZhciBzZWVuID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByID0gY2VsbHNbaV1bMF0sIGMgPSBjZWxsc1tpXVsxXTsKICAgICAgdmFyIGRpcnMgPSBbWzAsIDFdLCBbMCwgLTFdLCBbMSwgMF0sIFstMSwgMF1dOwogICAgICBmb3IgKHZhciBkID0gMDsgZCA8IDQ7IGQrKykgewogICAgICAgIHZhciBuciA9IHIgKyBkaXJzW2RdWzBdLCBuYyA9IGMgKyBkaXJzW2RdWzFdOwogICAgICAgIHZhciBrID0gbnIgKyAiLCIgKyBuYzsKICAgICAgICBpZiAoaW5Cb3VuZHMobnIsIG5jKSAmJiAhc2VlbltrXSAmJiBncmlkW25yXVtuY10ub2JzdGFjbGUpIHsKICAgICAgICAgIHNlZW5ba10gPSB0cnVlOwogICAgICAgICAgaGl0T2JzdGFjbGUobnIsIG5jKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8qID09PT09IENMRUFSIC8gU1BFQ0lBTFMgPT09PT0gKi8KICBmdW5jdGlvbiBhZGRTY29yZShsZW4sIG11bHQpIHsKICAgIHZhciBiYXNlID0gU0NPUkVfQkFTRVtNYXRoLm1pbig1LCBNYXRoLm1heCgzLCBsZW4pKV0gfHwgMTAwOwogICAgaWYgKGxlbiA+IDUpIGJhc2UgPSA1MDAgKyAobGVuIC0gNSkgKiAxMDA7CiAgICBzY29yZSArPSBiYXNlICogbXVsdDsKICB9CgogIGZ1bmN0aW9uIHNldEZsYXNoKG1zZywgY29tYm9OKSB7CiAgICBmbGFzaE1zZyA9IG1zZzsKICAgIGZsYXNoVGltZXIgPSAxLjU1OwogICAgZmxhc2hDb21ib04gPSBjb21ib04gfHwgMDsKICB9CgogIGZ1bmN0aW9uIGNvbGxlY3RDbGVhcmVkKHIsIGMpIHsKICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgIGlmICh0LnR5cGUgPj0gMCkgcHJvZ3Jlc3NHb2FsKCJjb2xsZWN0IiwgMSwgdC50eXBlKTsKICAgIHNwYXduUG9vZihib2FyZFggKyBjICogY2VsbFcgKyBjZWxsVyAvIDIsIGJvYXJkWSArIHIgKiBjZWxsSCArIGNlbGxIIC8gMiwgdC50eXBlKTsKICB9CgogIGZ1bmN0aW9uIHNwYXduUG9vZih4LCB5LCB0eXBlKSB7CiAgICB2YXIgY29scyA9IFsiI2U4ODgzYSIsICIjMmEyYTMwIiwgIiNmNWYyZWEiLCAiIzlhOWFhOCIsICIjZjBkOGE4IiwgIiM0YTRhNTgiXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgIHBhcnRpY2xlcy5wdXNoKHsKICAgICAgICB4OiB4LCB5OiB5LAogICAgICAgIHZ4OiAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAxODAsCiAgICAgICAgdnk6IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDE4MCAtIDQwLAogICAgICAgIGxpZmU6IDAuNCArIE1hdGgucmFuZG9tKCkgKiAwLjMsCiAgICAgICAgY29sOiBjb2xzW3R5cGVdIHx8ICIjZmZmIiwKICAgICAgICBzaXplOiA0ICsgTWF0aC5yYW5kb20oKSAqIDYKICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGVhckNlbGwociwgYywgc2tpcFNwZWNpYWwpIHsKICAgIGlmICghaW5Cb3VuZHMociwgYykpIHJldHVybjsKICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgIGlmICh0LnR5cGUgPCAwICYmICF0Lm9ic3RhY2xlKSByZXR1cm47CiAgICBpZiAodC5vYnN0YWNsZSA9PT0gImNhcnJpZXIiKSB7CiAgICAgIGhpdE9ic3RhY2xlKHIsIGMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodC5vYnN0YWNsZSkgewogICAgICBoaXRPYnN0YWNsZShyLCBjKTsKICAgIH0KICAgIGlmICh0LnR5cGUgPj0gMCkgewogICAgICB2YXIgc3AgPSB0LnNwZWNpYWw7CiAgICAgIGNvbGxlY3RDbGVhcmVkKHIsIGMpOwogICAgICB0LnR5cGUgPSAtMTsKICAgICAgdC5zcGVjaWFsID0gbnVsbDsKICAgICAgdC5wb3AgPSAwOwogICAgICBpZiAoIXNraXBTcGVjaWFsICYmIHNwKSB0cmlnZ2VyU3BlY2lhbChyLCBjLCBzcCwgdCk7CiAgICB9CiAgfQoKICB2YXIgc3BlY2lhbFF1ZXVlID0gW107CgogIGZ1bmN0aW9uIHRyaWdnZXJTcGVjaWFsKHIsIGMsIHNwLCBvbGRUaWxlKSB7CiAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogciwgYzogYywgc3A6IHNwLCB0eXBlOiBvbGRUaWxlID8gb2xkVGlsZS5fY2xlYXJUeXBlIDogMH0pOwogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc1NwZWNpYWxRdWV1ZShtdWx0KSB7CiAgICB3aGlsZSAoc3BlY2lhbFF1ZXVlLmxlbmd0aCkgewogICAgICB2YXIgcyA9IHNwZWNpYWxRdWV1ZS5zaGlmdCgpOwogICAgICB2YXIgc3AgPSBzLnNwOwogICAgICBpZiAoc3AgPT09ICJzdHJpcGVkX2giKSB7CiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIGNsZWFyQ2VsbChzLnIsIGMsIGZhbHNlKTsKICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfSBlbHNlIGlmIChzcCA9PT0gInN0cmlwZWRfdiIpIHsKICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgY2xlYXJDZWxsKHIsIHMuYywgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAiYm9tYiIgfHwgc3AgPT09ICJjYXRuaXAiKSB7CiAgICAgICAgLy8gQWx3YXlzIGNsZWFyIHRoZSAzeDMsIGluY2x1ZGluZyBjZW50ZXIgKG1heSBhbHJlYWR5IGJlIGVtcHR5IGZyb20gdGhlIG1hdGNoKS4KICAgICAgICBmb3IgKHZhciBkciA9IC0xOyBkciA8PSAxOyBkcisrKSB7CiAgICAgICAgICBmb3IgKHZhciBkYyA9IC0xOyBkYyA8PSAxOyBkYysrKSB7CiAgICAgICAgICAgIHZhciBiciA9IHMuciArIGRyLCBiYyA9IHMuYyArIGRjOwogICAgICAgICAgICBpZiAoIWluQm91bmRzKGJyLCBiYykpIGNvbnRpbnVlOwogICAgICAgICAgICBjbGVhckNlbGwoYnIsIGJjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzcCA9PT0gImNhdG5pcCIpIHsKICAgICAgICAgIHNldEZsYXNoKCJDQVROSVAgQk9PTSEiKTsKICAgICAgICAgIGFkZFNjb3JlKDgsIG11bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXRGbGFzaCgiQk9PTSEiKTsKICAgICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzcCA9PT0gInN1cGVyY2F0IikgewogICAgICAgIHNldEZsYXNoKCJTVVBFUiBDQVQhIik7CiAgICAgICAgc3Bhd25TdXBlckJlYW0ocy5yLCBzLmMpOwogICAgICAgIGZvciAodmFyIHJyUyA9IDA7IHJyUyA8IEdSSUQ7IHJyUysrKSBjbGVhckNlbGwocnJTLCBzLmMsIGZhbHNlKTsKICAgICAgICBmb3IgKHZhciBjY1MgPSAwOyBjY1MgPCBHUklEOyBjY1MrKykgY2xlYXJDZWxsKHMuciwgY2NTLCBmYWxzZSk7CiAgICAgICAgYWRkU2NvcmUoOCwgbXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoc3AgPT09ICJyYWluYm93IikgewogICAgICAgIHZhciB0YXJnZXQgPSBzLnRhcmdldFR5cGU7CiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA8IDApIHRhcmdldCA9IHJhbmRUeXBlKCk7CiAgICAgICAgZm9yICh2YXIgcjIgPSAwOyByMiA8IEdSSUQ7IHIyKyspCiAgICAgICAgICBmb3IgKHZhciBjMiA9IDA7IGMyIDwgR1JJRDsgYzIrKykKICAgICAgICAgICAgaWYgKGdyaWRbcjJdW2MyXS50eXBlID09PSB0YXJnZXQpIGNsZWFyQ2VsbChyMiwgYzIsIGZhbHNlKTsKICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfSBlbHNlIGlmIChzcCA9PT0gImJpZ2Nyb3NzIikgewogICAgICAgIGZvciAodmFyIHJyID0gMDsgcnIgPCBHUklEOyBycisrKSBjbGVhckNlbGwocnIsIHMuYywgZmFsc2UpOwogICAgICAgIGZvciAodmFyIGNjID0gMDsgY2MgPCBHUklEOyBjYysrKSBjbGVhckNlbGwocy5yLCBjYywgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAibWVnYWJvbWIiKSB7CiAgICAgICAgZm9yICh2YXIgZHIyID0gLTI7IGRyMiA8PSAyOyBkcjIrKykKICAgICAgICAgIGZvciAodmFyIGRjMiA9IC0yOyBkYzIgPD0gMjsgZGMyKyspCiAgICAgICAgICAgIGNsZWFyQ2VsbChzLnIgKyBkcjIsIHMuYyArIGRjMiwgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAicm93MyIpIHsKICAgICAgICBmb3IgKHZhciBkcjMgPSAtMTsgZHIzIDw9IDE7IGRyMysrKQogICAgICAgICAgZm9yICh2YXIgY2MzID0gMDsgY2MzIDwgR1JJRDsgY2MzKyspCiAgICAgICAgICAgIGNsZWFyQ2VsbChzLnIgKyBkcjMsIGNjMywgZmFsc2UpOwogICAgICAgIGZvciAodmFyIGRjMyA9IC0xOyBkYzMgPD0gMTsgZGMzKyspCiAgICAgICAgICBmb3IgKHZhciBycjMgPSAwOyBycjMgPCBHUklEOyBycjMrKykKICAgICAgICAgICAgY2xlYXJDZWxsKHJyMywgcy5jICsgZGMzLCBmYWxzZSk7CiAgICAgICAgYWRkU2NvcmUoNSwgbXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoc3AgPT09ICJjbGVhcmFsbCIpIHsKICAgICAgICBmb3IgKHZhciByYSA9IDA7IHJhIDwgR1JJRDsgcmErKykKICAgICAgICAgIGZvciAodmFyIGNhID0gMDsgY2EgPCBHUklEOyBjYSsrKQogICAgICAgICAgICBpZiAoZ3JpZFtyYV1bY2FdLnR5cGUgPj0gMCkgY2xlYXJDZWxsKHJhLCBjYSwgdHJ1ZSk7CiAgICAgICAgYWRkU2NvcmUoNSwgbXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoc3AgPT09ICJwYWludF9zdHJpcGUiIHx8IHNwID09PSAicGFpbnRfYm9tYiIpIHsKICAgICAgICB2YXIgcHQgPSBzLnRhcmdldFR5cGU7CiAgICAgICAgaWYgKHB0ID09PSB1bmRlZmluZWQgfHwgcHQgPCAwKSBwdCA9IHJhbmRUeXBlKCk7CiAgICAgICAgdmFyIG1ha2UgPSBzcCA9PT0gInBhaW50X3N0cmlwZSIgPyAic3RyaXBlZF9oIiA6ICJib21iIjsKICAgICAgICB2YXIgcGFpbnRlZCA9IFtdOwogICAgICAgIGZvciAodmFyIHJwID0gMDsgcnAgPCBHUklEOyBycCsrKQogICAgICAgICAgZm9yICh2YXIgY3AgPSAwOyBjcCA8IEdSSUQ7IGNwKyspCiAgICAgICAgICAgIGlmIChncmlkW3JwXVtjcF0udHlwZSA9PT0gcHQpIHsKICAgICAgICAgICAgICBncmlkW3JwXVtjcF0uc3BlY2lhbCA9IG1ha2U7CiAgICAgICAgICAgICAgaWYgKG1ha2UgPT09ICJzdHJpcGVkX2giICYmIE1hdGgucmFuZG9tKCkgPCAwLjUpIGdyaWRbcnBdW2NwXS5zcGVjaWFsID0gInN0cmlwZWRfdiI7CiAgICAgICAgICAgICAgcGFpbnRlZC5wdXNoKFtycCwgY3BdKTsKICAgICAgICAgICAgfQogICAgICAgIGZvciAodmFyIHBpID0gMDsgcGkgPCBwYWludGVkLmxlbmd0aDsgcGkrKykgewogICAgICAgICAgdmFyIHByID0gcGFpbnRlZFtwaV1bMF0sIHBjID0gcGFpbnRlZFtwaV1bMV07CiAgICAgICAgICB2YXIgcHNwID0gZ3JpZFtwcl1bcGNdLnNwZWNpYWw7CiAgICAgICAgICBjbGVhckNlbGwocHIsIHBjLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNvbHZlU3BlY2lhbENvbWJvKHIxLCBjMSwgcjIsIGMyKSB7CiAgICB2YXIgYSA9IGdyaWRbcjFdW2MxXSwgYiA9IGdyaWRbcjJdW2MyXTsKICAgIHZhciBzYSA9IGEuc3BlY2lhbCwgc2IgPSBiLnNwZWNpYWw7CiAgICAvLyBjbGVhciBib3RoIGNlbGxzIGZpcnN0IHZpc3VhbGx5CiAgICB2YXIgdHlwZUIgPSBiLnR5cGUsIHR5cGVBID0gYS50eXBlOwoKICAgIGZ1bmN0aW9uIHdpcGUociwgYykgewogICAgICBjb2xsZWN0Q2xlYXJlZChyLCBjKTsKICAgICAgZ3JpZFtyXVtjXS50eXBlID0gLTE7CiAgICAgIGdyaWRbcl1bY10uc3BlY2lhbCA9IG51bGw7CiAgICB9CgogICAgaWYgKHNhID09PSAicmFpbmJvdyIgJiYgc2IgPT09ICJyYWluYm93IikgewogICAgICB3aXBlKHIxLCBjMSk7IHdpcGUocjIsIGMyKTsKICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goe3I6IHIxLCBjOiBjMSwgc3A6ICJjbGVhcmFsbCJ9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc2EgPT09ICJyYWluYm93IiB8fCBzYiA9PT0gInJhaW5ib3ciKSB7CiAgICAgIHZhciBvdGhlciA9IHNhID09PSAicmFpbmJvdyIgPyBiIDogYTsKICAgICAgdmFyIHJyID0gc2EgPT09ICJyYWluYm93IiA\/IHIxIDogcjI7CiAgICAgIHZhciBjYyA9IHNhID09PSAicmFpbmJvdyIgPyBjMSA6IGMyOwogICAgICB2YXIgb3JfID0gc2EgPT09ICJyYWluYm93IiA\/IHIyIDogcjE7CiAgICAgIHZhciBvYyA9IHNhID09PSAicmFpbmJvdyIgPyBjMiA6IGMxOwogICAgICB3aXBlKHJyLCBjYyk7IHdpcGUob3JfLCBvYyk7CiAgICAgIGlmIChvdGhlci5zcGVjaWFsID09PSAic3RyaXBlZF9oIiB8fCBvdGhlci5zcGVjaWFsID09PSAic3RyaXBlZF92IikgewogICAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiBvcl8sIGM6IG9jLCBzcDogInBhaW50X3N0cmlwZSIsIHRhcmdldFR5cGU6IG90aGVyLnR5cGUgPj0gMCA\/IG90aGVyLnR5cGUgOiByYW5kVHlwZSgpfSk7CiAgICAgIH0gZWxzZSBpZiAob3RoZXIuc3BlY2lhbCA9PT0gImJvbWIiKSB7CiAgICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goe3I6IG9yXywgYzogb2MsIHNwOiAicGFpbnRfYm9tYiIsIHRhcmdldFR5cGU6IG90aGVyLnR5cGUgPj0gMCA\/IG90aGVyLnR5cGUgOiByYW5kVHlwZSgpfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goe3I6IG9yXywgYzogb2MsIHNwOiAicmFpbmJvdyIsIHRhcmdldFR5cGU6IG90aGVyLnR5cGV9KTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBzdHJpcGVBID0gc2EgPT09ICJzdHJpcGVkX2giIHx8IHNhID09PSAic3RyaXBlZF92IjsKICAgIHZhciBzdHJpcGVCID0gc2IgPT09ICJzdHJpcGVkX2giIHx8IHNiID09PSAic3RyaXBlZF92IjsKICAgIGlmIChzdHJpcGVBICYmIHN0cmlwZUIpIHsKICAgICAgd2lwZShyMSwgYzEpOyB3aXBlKHIyLCBjMik7CiAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiByMSwgYzogYzEsIHNwOiAiYmlnY3Jvc3MifSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKChzdHJpcGVBICYmIHNiID09PSAiYm9tYiIpIHx8IChzdHJpcGVCICYmIHNhID09PSAiYm9tYiIpKSB7CiAgICAgIHdpcGUocjEsIGMxKTsgd2lwZShyMiwgYzIpOwogICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogcjEsIGM6IGMxLCBzcDogInJvdzMifSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHNhID09PSAiYm9tYiIgJiYgc2IgPT09ICJib21iIikgewogICAgICB3aXBlKHIxLCBjMSk7IHdpcGUocjIsIGMyKTsKICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goe3I6IHIxLCBjOiBjMSwgc3A6ICJtZWdhYm9tYiJ9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBjZWxsSW5kZXhJbkdyb3VwKGcsIHIsIGMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZy5jZWxscy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZy5jZWxsc1tpXVswXSA9PT0gciAmJiBnLmNlbGxzW2ldWzFdID09PSBjKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGZ1bmN0aW9uIGlzVHJ1ZVBsdXNDcm9zcyhyLCBjLCBncm91cHNBdCkgewogICAgLy8gVHJ1ZSArIDogc2FtZSBjYXQgaXMgaW50ZXJpb3IgKG5vdCBlbmRwb2ludCkgb2YgQk9USCBhbiBIIGFuZCBhIFYgbWF0Y2guCiAgICAvLyBUL0wgc2hhcGVzIGtlZXAgRXhwbG9kaW5nIENhdDsgb25seSBmdWxsIGNyb3NzZXMgbWFrZSBTdXBlciBDYXQuCiAgICB2YXIgaEcgPSBudWxsLCB2RyA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwc0F0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChncm91cHNBdFtpXS5vcmllbnQgPT09ICJoIikgaEcgPSBncm91cHNBdFtpXTsKICAgICAgaWYgKGdyb3Vwc0F0W2ldLm9yaWVudCA9PT0gInYiKSB2RyA9IGdyb3Vwc0F0W2ldOwogICAgfQogICAgaWYgKCFoRyB8fCAhdkcpIHJldHVybiBmYWxzZTsKICAgIHZhciBoaSA9IGNlbGxJbmRleEluR3JvdXAoaEcsIHIsIGMpOwogICAgdmFyIHZpID0gY2VsbEluZGV4SW5Hcm91cCh2RywgciwgYyk7CiAgICBpZiAoaGkgPCAwIHx8IHZpIDwgMCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGhNaWQgPSBoaSA+IDAgJiYgaGkgPCBoRy5jZWxscy5sZW5ndGggLSAxOwogICAgdmFyIHZNaWQgPSB2aSA+IDAgJiYgdmkgPCB2Ry5jZWxscy5sZW5ndGggLSAxOwogICAgcmV0dXJuIGhNaWQgJiYgdk1pZDsKICB9CgogIGZ1bmN0aW9uIGNvdW50RGlzam9pbnRNYXRjaENsdXN0ZXJzKGdyb3VwcykgewogICAgdmFyIG4gPSBncm91cHMubGVuZ3RoOwogICAgaWYgKG4gPT09IDApIHJldHVybiAwOwogICAgdmFyIHBhcmVudCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHBhcmVudFtpXSA9IGk7CiAgICBmdW5jdGlvbiBmaW5kKGEpIHsgcmV0dXJuIHBhcmVudFthXSA9PT0gYSA\/IGEgOiAocGFyZW50W2FdID0gZmluZChwYXJlbnRbYV0pKTsgfQogICAgZnVuY3Rpb24gdW5pKGEsIGIpIHsgYSA9IGZpbmQoYSk7IGIgPSBmaW5kKGIpOyBpZiAoYSAhPT0gYikgcGFyZW50W2JdID0gYTsgfQogICAgdmFyIGNlbGxPd25lciA9IHt9OwogICAgZm9yICh2YXIgZ2kgPSAwOyBnaSA8IG47IGdpKyspIHsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cHNbZ2ldLmNlbGxzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIGNrID0gZ3JvdXBzW2dpXS5jZWxsc1tqXVswXSArICIsIiArIGdyb3Vwc1tnaV0uY2VsbHNbal1bMV07CiAgICAgICAgaWYgKGNlbGxPd25lcltja10gIT09IHVuZGVmaW5lZCkgdW5pKGdpLCBjZWxsT3duZXJbY2tdKTsKICAgICAgICBlbHNlIGNlbGxPd25lcltja10gPSBnaTsKICAgICAgfQogICAgfQogICAgdmFyIHJvb3RzID0ge307CiAgICBmb3IgKHZhciBrID0gMDsgayA8IG47IGsrKykgcm9vdHNbZmluZChrKV0gPSB0cnVlOwogICAgdmFyIGNvdW50ID0gMDsKICAgIGZvciAodmFyIHJrIGluIHJvb3RzKSBjb3VudCsrOwogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgZnVuY3Rpb24gZGV0ZXJtaW5lU3BlY2lhbChncm91cHMsIG1hcmtlZCkgewogICAgLy8gRWFybHkgbGV2ZWxzOiBiYXNpYyBtYXRjaC0zIG9ubHkgKG5vIHNwZWNpYWxzKSBzbyBjYXNjYWRlcyBzdGF5IHNob3J0LgogICAgaWYgKCFzcGVjaWFsc1VubG9ja2VkKCkpIHJldHVybiB7YXQ6IG51bGwsIGtpbmQ6IG51bGwsIHR5cGU6IDB9OwogICAgLy8gU3VwZXIgQ2F0IG9uIHRydWUgKywgZWxzZSBUL0wgYm9tYjsgbG9uZyBydW5zIGZvciBzdHJpcGUvcmFpbmJvdwogICAgdmFyIGNlbGxHcm91cHMgPSB7fTsKICAgIGZ1bmN0aW9uIGsociwgYykgeyByZXR1cm4gciArICIsIiArIGM7IH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBnID0gZ3JvdXBzW2ldOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGcuY2VsbHMubGVuZ3RoOyBqKyspIHsKICAgICAgICB2YXIgY2VsbCA9IGcuY2VsbHNbal07CiAgICAgICAgdmFyIGtrID0gayhjZWxsWzBdLCBjZWxsWzFdKTsKICAgICAgICBpZiAoIWNlbGxHcm91cHNba2tdKSBjZWxsR3JvdXBzW2trXSA9IFtdOwogICAgICAgIGNlbGxHcm91cHNba2tdLnB1c2goZyk7CiAgICAgIH0KICAgIH0KICAgIHZhciBzcGF3bkF0ID0gbnVsbDsKICAgIHZhciBzcGF3bktpbmQgPSBudWxsOwogICAgdmFyIGJvbWJGYWxsYmFjayA9IG51bGw7CiAgICBmb3IgKHZhciBrZXkgaW4gY2VsbEdyb3VwcykgewogICAgICBpZiAoY2VsbEdyb3Vwc1trZXldLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIsIik7CiAgICAgICAgdmFyIHJyID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKSwgY2MgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgIGlmIChzdXBlcmNhdFVubG9ja2VkKCkgJiYgaXNUcnVlUGx1c0Nyb3NzKHJyLCBjYywgY2VsbEdyb3Vwc1trZXldKSkgewogICAgICAgICAgc3Bhd25BdCA9IFtyciwgY2NdOwogICAgICAgICAgc3Bhd25LaW5kID0gInN1cGVyY2F0IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYm9tYnNVbmxvY2tlZCgpICYmICFib21iRmFsbGJhY2spIGJvbWJGYWxsYmFjayA9IFtyciwgY2NdOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNwYXduS2luZCAmJiBib21iRmFsbGJhY2spIHsKICAgICAgc3Bhd25BdCA9IGJvbWJGYWxsYmFjazsKICAgICAgc3Bhd25LaW5kID0gImJvbWIiOwogICAgfQogICAgaWYgKCFzcGF3bktpbmQgJiYgcmFpbmJvd1VubG9ja2VkKCkpIHsKICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGdyb3Vwcy5sZW5ndGg7IGkyKyspIHsKICAgICAgICB2YXIgZzIgPSBncm91cHNbaTJdOwogICAgICAgIGlmIChnMi5sZW4gPj0gNSkgewogICAgICAgICAgc3Bhd25BdCA9IGcyLmNlbGxzWyhnMi5sZW4gLyAyKSB8IDBdOwogICAgICAgICAgc3Bhd25LaW5kID0gInJhaW5ib3ciOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXNwYXduS2luZCkgewogICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgZ3JvdXBzLmxlbmd0aDsgaTMrKykgewogICAgICAgIHZhciBnMyA9IGdyb3Vwc1tpM107CiAgICAgICAgaWYgKGczLmxlbiA+PSA0KSB7CiAgICAgICAgICBzcGF3bkF0ID0gZzMuY2VsbHNbMV07CiAgICAgICAgICBzcGF3bktpbmQgPSBnMy5vcmllbnQgPT09ICJoIiA\/ICJzdHJpcGVkX3YiIDogInN0cmlwZWRfaCI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7YXQ6IHNwYXduQXQsIGtpbmQ6IHNwYXduS2luZCwgdHlwZTogc3Bhd25BdCA\/IGdyaWRbc3Bhd25BdFswXV1bc3Bhd25BdFsxXV0udHlwZSA6IDB9OwogIH0KCiAgZnVuY3Rpb24gc2xlZXAobXMpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeyBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBhbmltYXRlU3VycHJpc2UoY2VsbHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHIgPSBjZWxsc1tpXVswXSwgYyA9IGNlbGxzW2ldWzFdOwogICAgICBpZiAoZ3JpZFtyXVtjXS50eXBlID49IDApIGdyaWRbcl1bY10ucG9wID0gMTsKICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGNvbGxhcHNlQW5kUmVmaWxsKCkgewogICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgR1JJRDsgY29sKyspIHsKICAgICAgdmFyIHBpZWNlcyA9IFtdOwogICAgICB2YXIgYmxvY2tlcnMgPSB7fTsKICAgICAgZm9yICh2YXIgcm93ID0gR1JJRCAtIDE7IHJvdyA+PSAwOyByb3ctLSkgewogICAgICAgIHZhciB0dCA9IGdyaWRbcm93XVtjb2xdOwogICAgICAgIGlmICh0dC5vYnN0YWNsZSkgewogICAgICAgICAgYmxvY2tlcnNbcm93XSA9IHtvYnN0YWNsZTogdHQub2JzdGFjbGUsIGhwOiB0dC5ocCwgdHlwZTogdHQudHlwZX07CiAgICAgICAgfSBlbHNlIGlmICh0dC50eXBlID49IDApIHsKICAgICAgICAgIHBpZWNlcy5wdXNoKHt0eXBlOiB0dC50eXBlLCBzcGVjaWFsOiB0dC5zcGVjaWFsLCBmcm9tOiByb3d9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh2YXIgcm93MiA9IDA7IHJvdzIgPCBHUklEOyByb3cyKyspIGdyaWRbcm93Ml1bY29sXSA9IGVtcHR5VGlsZSgpOwogICAgICBmb3IgKHZhciBiayBpbiBibG9ja2VycykgewogICAgICAgIHZhciBiaSA9IHBhcnNlSW50KGJrLCAxMCk7CiAgICAgICAgZ3JpZFtiaV1bY29sXS5vYnN0YWNsZSA9IGJsb2NrZXJzW2JrXS5vYnN0YWNsZTsKICAgICAgICBncmlkW2JpXVtjb2xdLmhwID0gYmxvY2tlcnNbYmtdLmhwOwogICAgICAgIGdyaWRbYmldW2NvbF0udHlwZSA9IGJsb2NrZXJzW2JrXS50eXBlOwogICAgICB9CiAgICAgIHZhciBkZXN0ID0gR1JJRCAtIDE7CiAgICAgIHZhciBwaSA9IDA7CiAgICAgIHdoaWxlIChkZXN0ID49IDAgJiYgcGkgPCBwaWVjZXMubGVuZ3RoKSB7CiAgICAgICAgaWYgKGdyaWRbZGVzdF1bY29sXS5vYnN0YWNsZSkgeyBkZXN0LS07IGNvbnRpbnVlOyB9CiAgICAgICAgdmFyIHBpZWNlID0gcGllY2VzW3BpKytdOwogICAgICAgIHZhciBmYWxsRGlzdCA9IE1hdGgubWF4KDAsIGRlc3QgLSAoR1JJRCAtIHBpZWNlcy5sZW5ndGgpKTsKICAgICAgICBncmlkW2Rlc3RdW2NvbF0udHlwZSA9IHBpZWNlLnR5cGU7CiAgICAgICAgZ3JpZFtkZXN0XVtjb2xdLnNwZWNpYWwgPSBwaWVjZS5zcGVjaWFsOwogICAgICAgIGdyaWRbZGVzdF1bY29sXS5mYWxsID0gTWF0aC5tYXgoMC41LCBwaWVjZS5mcm9tID49IDAgPyAoZGVzdCA8IHBpZWNlLmZyb20gPyBwaWVjZS5mcm9tIC0gZGVzdCA6IDAuOCkgOiAyKTsKICAgICAgICBkZXN0LS07CiAgICAgIH0KICAgICAgd2hpbGUgKGRlc3QgPj0gMCkgewogICAgICAgIGlmIChncmlkW2Rlc3RdW2NvbF0ub2JzdGFjbGUpIHsgZGVzdC0tOyBjb250aW51ZTsgfQogICAgICAgIHZhciBudCA9IG5ld0NhdCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29sLCBkZXN0KTsKICAgICAgICBudC5mYWxsID0gMiArIChHUklEIC0gZGVzdCkgKiAwLjM7CiAgICAgICAgZ3JpZFtkZXN0XVtjb2xdID0gbnQ7CiAgICAgICAgZGVzdC0tOwogICAgICB9CiAgICB9CiAgICB2YXIgbWF4RmFsbCA9IDA7CiAgICBmb3IgKHZhciByMyA9IDA7IHIzIDwgR1JJRDsgcjMrKykKICAgICAgZm9yICh2YXIgYzMgPSAwOyBjMyA8IEdSSUQ7IGMzKyspCiAgICAgICAgaWYgKGdyaWRbcjNdW2MzXS5mYWxsID4gbWF4RmFsbCkgbWF4RmFsbCA9IGdyaWRbcjNdW2MzXS5mYWxsOwogICAgaWYgKG1heEZhbGwgPiAwKSB7CiAgICAgIHZhciB0MCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB2YXIgZHVyID0gTWF0aC5taW4oNTIwLCAxNDAgKyBtYXhGYWxsICogNTUpOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgIGZ1bmN0aW9uIHN0ZXAobm93KSB7CiAgICAgICAgICB2YXIgcCA9IE1hdGgubWluKDEsIChub3cgLSB0MCkgLyBkdXIpOwogICAgICAgICAgLy8gc21vb3RoIGN1YmljIGVhc2Utb3V0IHdpdGggc29mdCBzZXR0bGUKICAgICAgICAgIHZhciBlYXNlID0gMSAtIE1hdGgucG93KDEgLSBwLCAzKTsKICAgICAgICAgIGlmIChwID4gMC44NSkgewogICAgICAgICAgICB2YXIgcSA9IChwIC0gMC44NSkgLyAwLjE1OwogICAgICAgICAgICBlYXNlID0gZWFzZSArICgxIC0gZWFzZSkgKiAoMSAtIE1hdGgucG93KDEgLSBxLCAyKSkgKiAwLjE1OwogICAgICAgICAgICBlYXNlID0gTWF0aC5taW4oMSwgZWFzZSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykKICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICAgICAgICB2YXIgdCA9IGdyaWRbcl1bY107CiAgICAgICAgICAgICAgaWYgKHQuX2ZhbGxGcm9tID09PSB1bmRlZmluZWQgJiYgdC5mYWxsKSB0Ll9mYWxsRnJvbSA9IHQuZmFsbDsKICAgICAgICAgICAgICBpZiAodC5fZmFsbEZyb20pIHsKICAgICAgICAgICAgICAgIHQuZmFsbCA9IHQuX2ZhbGxGcm9tICogKDEgLSBlYXNlKTsKICAgICAgICAgICAgICAgIC8vIHNsaWdodCBzcXVhc2ggb24gbGFuZAogICAgICAgICAgICAgICAgaWYgKHAgPiAwLjgyKSB7CiAgICAgICAgICAgICAgICAgIHZhciBsYW5kID0gKHAgLSAwLjgyKSAvIDAuMTg7CiAgICAgICAgICAgICAgICAgIHQuc2NhbGUgPSAxIC0gTWF0aC5zaW4obGFuZCAqIE1hdGguUEkpICogMC4wODsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHQuc2NhbGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgaWYgKHAgPCAxKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgcjQgPSAwOyByNCA8IEdSSUQ7IHI0KyspCiAgICAgICAgICAgICAgZm9yICh2YXIgYzQgPSAwOyBjNCA8IEdSSUQ7IGM0KyspIHsKICAgICAgICAgICAgICAgIGdyaWRbcjRdW2M0XS5mYWxsID0gMDsKICAgICAgICAgICAgICAgIGdyaWRbcjRdW2M0XS5fZmFsbEZyb20gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBncmlkW3I0XVtjNF0uc2NhbGUgPSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICAgIH0pOwogICAgfQogIH0KCgogIGZ1bmN0aW9uIHNwYXduU3VwZXJCZWFtKHIsIGMpIHsKICAgIGZ4QW5pbXMucHVzaCh7a2luZDogInN1cGVyYmVhbSIsIHI6IHIsIGM6IGMsIHQ6IDAsIGR1cjogMC44NX0pOwogIH0KCiAgZnVuY3Rpb24gc3Bhd25QYXdDbGFwKCkgewogICAgZnhBbmltcy5wdXNoKHtraW5kOiAicGF3Y2xhcCIsIHQ6IDAsIGR1cjogMC45NX0pOwogIH0KCiAgZnVuY3Rpb24gc3Bhd25DYXREYXNoKGF4aXMsIGxhbmUsIGtub2NrUiwga25vY2tDLCBjYXRUeXBlKSB7CiAgICBmeEFuaW1zLnB1c2goewogICAgICBraW5kOiAiY2F0ZGFzaCIsIGF4aXM6IGF4aXMsIGxhbmU6IGxhbmUsCiAgICAgIGtub2NrUjoga25vY2tSLCBrbm9ja0M6IGtub2NrQywgdHlwZTogY2F0VHlwZSwKICAgICAgdDogMCwgZHVyOiAwLjgsIGtub2NrZWQ6IGZhbHNlCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRyeVRyaWdnZXJDYXREYXNoKGNsZWFyZWRDZWxscykgewogICAgaWYgKCFjbGVhcmVkQ2VsbHMgfHwgIWNsZWFyZWRDZWxscy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBsZWZ0ID0gZmFsc2UsIHJpZ2h0ID0gZmFsc2UsIHRvcCA9IGZhbHNlLCBib3R0b20gPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xlYXJlZENlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByciA9IGNsZWFyZWRDZWxsc1tpXVswXSwgY2MgPSBjbGVhcmVkQ2VsbHNbaV1bMV07CiAgICAgIGlmIChjYyA9PT0gMCkgbGVmdCA9IHRydWU7CiAgICAgIGlmIChjYyA9PT0gR1JJRCAtIDEpIHJpZ2h0ID0gdHJ1ZTsKICAgICAgaWYgKHJyID09PSAwKSB0b3AgPSB0cnVlOwogICAgICBpZiAocnIgPT09IEdSSUQgLSAxKSBib3R0b20gPSB0cnVlOwogICAgfQogICAgdmFyIGF4aXMgPSBudWxsLCBsYW5lID0gMDsKICAgIGlmIChsZWZ0ICYmIHJpZ2h0KSB7CiAgICAgIGF4aXMgPSAiaCI7CiAgICAgIGxhbmUgPSBjbGVhcmVkQ2VsbHNbKGNsZWFyZWRDZWxscy5sZW5ndGggLyAyKSB8IDBdWzBdOwogICAgfSBlbHNlIGlmICh0b3AgJiYgYm90dG9tKSB7CiAgICAgIGF4aXMgPSAidiI7CiAgICAgIGxhbmUgPSBjbGVhcmVkQ2VsbHNbKGNsZWFyZWRDZWxscy5sZW5ndGggLyAyKSB8IDBdWzFdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUGljayBhIGtub2NrIHRhcmdldCBhbG9uZyB0aGUgZGFzaCBwYXRoIHRoYXQgc3RpbGwgaGFzIGEgY2F0CiAgICB2YXIgY2FuZGlkYXRlcyA9IFtdOwogICAgaWYgKGF4aXMgPT09ICJoIikgewogICAgICBmb3IgKHZhciBjID0gMTsgYyA8IEdSSUQgLSAxOyBjKyspIHsKICAgICAgICBpZiAoZ3JpZFtsYW5lXVtjXSAmJiBncmlkW2xhbmVdW2NdLnR5cGUgPj0gMCAmJiAhZ3JpZFtsYW5lXVtjXS5vYnN0YWNsZSkKICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChbbGFuZSwgY10pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciByID0gMTsgciA8IEdSSUQgLSAxOyByKyspIHsKICAgICAgICBpZiAoZ3JpZFtyXVtsYW5lXSAmJiBncmlkW3JdW2xhbmVdLnR5cGUgPj0gMCAmJiAhZ3JpZFtyXVtsYW5lXS5vYnN0YWNsZSkKICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChbciwgbGFuZV0pOwogICAgICB9CiAgICB9CiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgcGljayA9IGNhbmRpZGF0ZXNbKE1hdGgucmFuZG9tKCkgKiBjYW5kaWRhdGVzLmxlbmd0aCkgfCAwXTsKICAgIHZhciBjYXRUeXBlID0gZ3JpZFtwaWNrWzBdXVtwaWNrWzFdXS50eXBlOwogICAgc2V0Rmxhc2goIkNBVCBEQVNIISIpOwogICAgaWYgKGVkTm90ZUZlYXR1cmVUcmlnZ2VyKCJjYXRkYXNoIikpIGV2ZW50RGlyZWN0b3IuX3RyaWdnZXJlZFRoaXNSZXNvbHZlID0gdHJ1ZTsKICAgIHNwYXduQ2F0RGFzaChheGlzLCBsYW5lLCBwaWNrWzBdLCBwaWNrWzFdLCBjYXRUeXBlID49IDAgPyBjYXRUeXBlIDogcmFuZFR5cGUoKSk7CiAgICAvLyBLbm9jayBoYXBwZW5zIG1pZC1hbmltIHZpYSBkcmF3Rng7IGFsc28gY2xlYXIgaW1tZWRpYXRlbHkgZm9yIGdhbWVwbGF5IHN5bmMKICAgIGNsZWFyQ2VsbChwaWNrWzBdLCBwaWNrWzFdLCBmYWxzZSk7CiAgICBhZGRTY29yZSg0LCBNYXRoLm1heCgxLCBjb21ibyB8fCAxKSk7CiAgfQoKICBmdW5jdGlvbiBkcmF3RngoZHQpIHsKICAgIGlmICghZnhBbmltcy5sZW5ndGgpIHJldHVybjsKICAgIGZvciAodmFyIGkgPSBmeEFuaW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBmeCA9IGZ4QW5pbXNbaV07CiAgICAgIGZ4LnQgKz0gZHQ7CiAgICAgIHZhciBwID0gTWF0aC5taW4oMSwgZngudCAvIGZ4LmR1cik7CiAgICAgIGN0eC5zYXZlKCk7CiAgICAgIGlmIChmeC5raW5kID09PSAicGF3Y2xhcCIpIHsKICAgICAgICB2YXIgY3ggPSBib2FyZFggKyBib2FyZFcgLyAyOwogICAgICAgIHZhciBjeSA9IGJvYXJkWSArIGJvYXJkSCAqIDAuNDU7CiAgICAgICAgdmFyIHJlYWNoID0gKGJvYXJkVyAqIDAuNDIpICogKDEgLSBwKTsKICAgICAgICB2YXIgYWxwaGEgPSBwIDwgMC4xNSA\/IHAgLyAwLjE1IDogKHAgPiAwLjc1ID8gKDEgLSBwKSAvIDAuMjUgOiAxKTsKICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBNYXRoLm1heCgwLCBhbHBoYSk7CiAgICAgICAgZnVuY3Rpb24gZHJhd1Bhdyh4LCB5LCBmbGlwKSB7CiAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTsKICAgICAgICAgIGlmIChmbGlwKSBjdHguc2NhbGUoLTEsIDEpOwogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZjVkMGIwIjsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgIGN0eC5lbGxpcHNlKDAsIDAsIDI4LCAzNCwgMCwgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2U4YTg4OCI7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5lbGxpcHNlKDAsIDgsIDE0LCAxNiwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICAgICAgdmFyIHBhZHMgPSBbWy0xNiwgLTE4XSwgWzE2LCAtMThdLCBbLTgsIC0yOF0sIFs4LCAtMjhdXTsKICAgICAgICAgIGZvciAodmFyIHBpID0gMDsgcGkgPCBwYWRzLmxlbmd0aDsgcGkrKykgewogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGN0eC5lbGxpcHNlKHBhZHNbcGldWzBdLCBwYWRzW3BpXVsxXSwgOCwgMTAsIDAsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgIH0KICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgfQogICAgICAgIGRyYXdQYXcoY3ggLSByZWFjaCAtIDIwLCBjeSwgZmFsc2UpOwogICAgICAgIGRyYXdQYXcoY3ggKyByZWFjaCArIDIwLCBjeSwgdHJ1ZSk7CiAgICAgICAgaWYgKHAgPiAwLjQ1ICYmIHAgPCAwLjcpIHsKICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9ICgwLjcgLSBNYXRoLmFicyhwIC0gMC41NSkgKiA0KSAqIDAuODU7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmUwODAiOwogICAgICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgTWF0aC5tYXgoMjgsIE1hdGguZmxvb3IoYm9hcmRIICogMC4wOCkpICsgInB4IEltcGFjdCxzYW5zLXNlcmlmIjsKICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgICAgIGN0eC5maWxsVGV4dCgiUEFXIENMQVAhIiwgY3gsIGN5IC0gNTApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmeC5raW5kID09PSAiY2F0ZGFzaCIpIHsKICAgICAgICB2YXIgYWxwaGEyID0gcCA8IDAuMSA\/IHAgLyAwLjEgOiAocCA+IDAuODUgPyAoMSAtIHApIC8gMC4xNSA6IDEpOwogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIGFscGhhMik7CiAgICAgICAgdmFyIGNhdFgsIGNhdFk7CiAgICAgICAgaWYgKGZ4LmF4aXMgPT09ICJoIikgewogICAgICAgICAgY2F0WCA9IGJvYXJkWCArIHAgKiBib2FyZFc7CiAgICAgICAgICBjYXRZID0gYm9hcmRZICsgZngubGFuZSAqIGNlbGxIICsgY2VsbEggLyAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYXRYID0gYm9hcmRYICsgZngubGFuZSAqIGNlbGxXICsgY2VsbFcgLyAyOwogICAgICAgICAgY2F0WSA9IGJvYXJkWSArIHAgKiBib2FyZEg7CiAgICAgICAgfQogICAgICAgIC8vIG1vdGlvbiBzdHJlYWsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsMjAwLDgwLDAuNTUpIjsKICAgICAgICBjdHgubGluZVdpZHRoID0gNjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgaWYgKGZ4LmF4aXMgPT09ICJoIikgewogICAgICAgICAgY3R4Lm1vdmVUbyhjYXRYIC0gNDAsIGNhdFkpOyBjdHgubGluZVRvKGNhdFggKyAxMCwgY2F0WSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN0eC5tb3ZlVG8oY2F0WCwgY2F0WSAtIDQwKTsgY3R4LmxpbmVUbyhjYXRYLCBjYXRZICsgMTApOwogICAgICAgIH0KICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgdmFyIHNwciA9IHNwcml0ZXNbZngudHlwZV0gJiYgKHNwcml0ZXNbZngudHlwZV0uam95ZnVsIHx8IHNwcml0ZXNbZngudHlwZV0uaGFwcHkpOwogICAgICAgIHZhciBzeiA9IE1hdGgubWluKGNlbGxXLCBjZWxsSCkgKiAwLjk1OwogICAgICAgIGlmIChzcHIpIGN0eC5kcmF3SW1hZ2Uoc3ByLCBjYXRYIC0gc3ogLyAyLCBjYXRZIC0gc3ogLyAyLCBzeiwgc3opOwogICAgICAgIGVsc2UgewogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZiMDYwIjsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyhjYXRYLCBjYXRZLCBzeiAvIDIsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZngua2luZCA9PT0gInN1cGVyYmVhbSIpIHsKICAgICAgICB2YXIgYWxwaGEzID0gcCA8IDAuMTIgPyBwIC8gMC4xMiA6IChwID4gMC43ID8gKDEgLSBwKSAvIDAuMyA6IDEpOwogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWF4KDAsIGFscGhhMykgKiAwLjc1OwogICAgICAgIHZhciBieCA9IGJvYXJkWCArIGZ4LmMgKiBjZWxsVyArIGNlbGxXIC8gMjsKICAgICAgICB2YXIgYnkgPSBib2FyZFkgKyBmeC5yICogY2VsbEggKyBjZWxsSCAvIDI7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyMjAsNjAsMC41NSkiOwogICAgICAgIGN0eC5maWxsUmVjdChib2FyZFgsIGJ5IC0gY2VsbEggKiAwLjI4LCBib2FyZFcsIGNlbGxIICogMC41Nik7CiAgICAgICAgY3R4LmZpbGxSZWN0KGJ4IC0gY2VsbFcgKiAwLjI4LCBib2FyZFksIGNlbGxXICogMC41NiwgYm9hcmRIKTsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAiI2ZmZjhjMCI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDM7CiAgICAgICAgY3R4LnN0cm9rZVJlY3QoYm9hcmRYICsgMiwgYnkgLSBjZWxsSCAqIDAuMjgsIGJvYXJkVyAtIDQsIGNlbGxIICogMC41Nik7CiAgICAgICAgY3R4LnN0cm9rZVJlY3QoYnggLSBjZWxsVyAqIDAuMjgsIGJvYXJkWSArIDIsIGNlbGxXICogMC41NiwgYm9hcmRIIC0gNCk7CiAgICAgIH0KICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgaWYgKGZ4LnQgPj0gZnguZHVyKSBmeEFuaW1zLnNwbGljZShpLCAxKTsKICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNYXRjaGVzKGZyb21Td2FwKSB7CiAgICBjb21ibyA9IDA7CiAgICBwYXdNdWx0QWN0aXZlID0gMTsKICAgIHZhciBzYWZldHkgPSAwOwogICAgLy8gQ2FwIGNhc2NhZGUgZGVwdGggb24gZWFybHkgbGV2ZWxzIHNvIEwxIGNhbm5vdCBjaGFpbiA4IGZsYXNoIGNvbWJvcy4KICAgIHZhciBtYXhTdGVwcyA9IGVhcmx5TGV2ZWxTaW1wbGUoKSA\/IDMgOiAzMDsKICAgIHdoaWxlIChzYWZldHkrKyA8IG1heFN0ZXBzKSB7CiAgICAgIHZhciByZXN1bHQgPSBmaW5kTWF0Y2hlcyhncmlkKTsKICAgICAgaWYgKHJlc3VsdC5ncm91cHMubGVuZ3RoID09PSAwICYmIHNwZWNpYWxRdWV1ZS5sZW5ndGggPT09IDApIGJyZWFrOwogICAgICBjb21ibysrOwogICAgICB2YXIgbXVsdCA9IE1hdGgubWluKDUsIE1hdGgubWF4KDEsIGNvbWJvKSk7CiAgICAgIC8vIFBhdyBDbGFwOiBvbmUgc3dhcCBjcmVhdGVzIHR3byBzZXBhcmF0ZSAoZGlzam9pbnQpIG1hdGNoZXMKICAgICAgLy8gU2tpcCBzcGVjdGFjbGUgb24gZWFybHkgdHV0b3JpYWwgbGV2ZWxzIChrZWVwIGJhc2ljIG1hdGNoLTMpLgogICAgICBpZiAoZnJvbVN3YXAgJiYgY29tYm8gPT09IDEgJiYgcmVzdWx0Lmdyb3Vwcy5sZW5ndGggPj0gMiAmJiAhZWFybHlMZXZlbFNpbXBsZSgpKSB7CiAgICAgICAgdmFyIGNsdXN0ZXJzID0gY291bnREaXNqb2ludE1hdGNoQ2x1c3RlcnMocmVzdWx0Lmdyb3Vwcyk7CiAgICAgICAgaWYgKGNsdXN0ZXJzID49IDIpIHsKICAgICAgICAgIHBhd011bHRBY3RpdmUgPSAyOwogICAgICAgICAgc3Bhd25QYXdDbGFwKCk7CiAgICAgICAgICBzZXRGbGFzaCgiUEFXIENMQVAhIHgyIiwgMik7CiAgICAgICAgICBpZiAoZWROb3RlRmVhdHVyZVRyaWdnZXIoInBhd2NsYXAiKSkgZXZlbnREaXJlY3Rvci5fdHJpZ2dlcmVkVGhpc1Jlc29sdmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBtdWx0ID0gTWF0aC5taW4oNSwgbXVsdCAqIHBhd011bHRBY3RpdmUpOwogICAgICBpZiAoY29tYm8gPj0gMiAmJiBwYXdNdWx0QWN0aXZlIDwgMikgewogICAgICAgIHZhciBtc2dJZHggPSBNYXRoLm1pbihDT01CT19NU0cubGVuZ3RoIC0gMSwgY29tYm8gLSAxKTsKICAgICAgICBzZXRGbGFzaChDT01CT19NU0dbbXNnSWR4XSwgY29tYm8pOwogICAgICB9CgogICAgICAvLyBkZXRlcm1pbmUgc3BlY2lhbHMgdG8gc3Bhd24gYmVmb3JlIGNsZWFyaW5nCiAgICAgIHZhciBzcGF3biA9IGRldGVybWluZVNwZWNpYWwocmVzdWx0Lmdyb3VwcywgcmVzdWx0Lm1hcmtlZCk7CiAgICAgIHZhciBhbGxDZWxscyA9IFtdOwogICAgICB2YXIgc2VlbiA9IHt9OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5ncm91cHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgZyA9IHJlc3VsdC5ncm91cHNbaV07CiAgICAgICAgYWRkU2NvcmUoZy5sZW4sIG11bHQpOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZy5jZWxscy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIGNrID0gZy5jZWxsc1tqXVswXSArICIsIiArIGcuY2VsbHNbal1bMV07CiAgICAgICAgICBpZiAoIXNlZW5bY2tdKSB7CiAgICAgICAgICAgIHNlZW5bY2tdID0gdHJ1ZTsKICAgICAgICAgICAgYWxsQ2VsbHMucHVzaChnLmNlbGxzW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFuaW1hdGVTdXJwcmlzZShhbGxDZWxscyk7CiAgICAgIGF3YWl0IHNsZWVwKDE4MCk7CgogICAgICAvLyBjbGVhciBtYXRjaGVkLCBrZWVwIHNwYXduIGNlbGwKICAgICAgdmFyIHNwYXduS2V5ID0gc3Bhd24uYXQgPyBzcGF3bi5hdFswXSArICIsIiArIHNwYXduLmF0WzFdIDogIiI7CiAgICAgIHZhciBjbGVhcmVkU3BlY2lhbHMgPSBbXTsKICAgICAgZm9yICh2YXIgY2kgPSAwOyBjaSA8IGFsbENlbGxzLmxlbmd0aDsgY2krKykgewogICAgICAgIHZhciByciA9IGFsbENlbGxzW2NpXVswXSwgY2MgPSBhbGxDZWxsc1tjaV1bMV07CiAgICAgICAgdmFyIHRpbGUgPSBncmlkW3JyXVtjY107CiAgICAgICAgaWYgKCF0aWxlLnNwZWNpYWwpIGNvbnRpbnVlOwogICAgICAgIHZhciBpc1NwYXduID0gKHJyICsgIiwiICsgY2MpID09PSBzcGF3bktleTsKICAgICAgICAvLyBBbHdheXMgZGV0b25hdGUgYm9tYnMvY2F0bmlwL3N0cmlwZXMvc3VwZXJjYXQgaW4gdGhlIG1hdGNoLgogICAgICAgIC8vIElmIHRoaXMgY2VsbCBpcyBhbHNvIHRoZSBuZXctc3BlY2lhbCBzcGF3biwgc3RpbGwgZmlyZSB0aGUgT0xEIHNwZWNpYWwgZmlyc3QKICAgICAgICAvLyAodGhlbiB0aGUgbmV3IG92ZXJsYXkgaXMgcGxhY2VkIGFmdGVyKS4KICAgICAgICBpZiAoIWlzU3Bhd24gfHwgdGlsZS5zcGVjaWFsID09PSAiYm9tYiIgfHwgdGlsZS5zcGVjaWFsID09PSAiY2F0bmlwIiB8fAogICAgICAgICAgICB0aWxlLnNwZWNpYWwgPT09ICJzdHJpcGVkX2giIHx8IHRpbGUuc3BlY2lhbCA9PT0gInN0cmlwZWRfdiIgfHwKICAgICAgICAgICAgdGlsZS5zcGVjaWFsID09PSAic3VwZXJjYXQiIHx8IHRpbGUuc3BlY2lhbCA9PT0gInJhaW5ib3ciKSB7CiAgICAgICAgICBpZiAoaXNTcGF3biAmJiBzcGF3bi5raW5kKSB7CiAgICAgICAgICAgIC8vIE9sZCBzcGVjaWFsIGF0IHNwYXduIGNlbGw6IHF1ZXVlIGl0LCB0aGVuIG5ldyBzcGF3biByZXBsYWNlcyBvdmVybGF5LgogICAgICAgICAgICBjbGVhcmVkU3BlY2lhbHMucHVzaCh7cjogcnIsIGM6IGNjLCBzcDogdGlsZS5zcGVjaWFsLCB0eXBlOiB0aWxlLnR5cGV9KTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWlzU3Bhd24pIHsKICAgICAgICAgICAgY2xlYXJlZFNwZWNpYWxzLnB1c2goe3I6IHJyLCBjOiBjYywgc3A6IHRpbGUuc3BlY2lhbCwgdHlwZTogdGlsZS50eXBlfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBkYW1hZ2VBZGphY2VudChhbGxDZWxscyk7CgogICAgICBmb3IgKHZhciBjaTIgPSAwOyBjaTIgPCBhbGxDZWxscy5sZW5ndGg7IGNpMisrKSB7CiAgICAgICAgdmFyIHI1ID0gYWxsQ2VsbHNbY2kyXVswXSwgYzUgPSBhbGxDZWxsc1tjaTJdWzFdOwogICAgICAgIGlmICgocjUgKyAiLCIgKyBjNSkgPT09IHNwYXduS2V5KSBjb250aW51ZTsKICAgICAgICBjb2xsZWN0Q2xlYXJlZChyNSwgYzUpOwogICAgICAgIHZhciBzcEtlZXAgPSBncmlkW3I1XVtjNV0uc3BlY2lhbDsKICAgICAgICBncmlkW3I1XVtjNV0udHlwZSA9IC0xOwogICAgICAgIGdyaWRbcjVdW2M1XS5zcGVjaWFsID0gbnVsbDsKICAgICAgICBncmlkW3I1XVtjNV0ucG9wID0gMDsKICAgICAgfQoKICAgICAgLy8gdHJpZ2dlciBzcGVjaWFscyB0aGF0IHdlcmUgaW4gdGhlIG1hdGNoCiAgICAgIGZvciAodmFyIHNpID0gMDsgc2kgPCBjbGVhcmVkU3BlY2lhbHMubGVuZ3RoOyBzaSsrKSB7CiAgICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goY2xlYXJlZFNwZWNpYWxzW3NpXSk7CiAgICAgIH0KCiAgICAgIGlmIChzcGF3bi5raW5kICYmIHNwYXduLmF0KSB7CiAgICAgICAgdmFyIHNyID0gc3Bhd24uYXRbMF0sIHNjID0gc3Bhd24uYXRbMV07CiAgICAgICAgZ3JpZFtzcl1bc2NdLnR5cGUgPSBzcGF3bi50eXBlOwogICAgICAgIGdyaWRbc3JdW3NjXS5zcGVjaWFsID0gc3Bhd24ua2luZDsKICAgICAgICBncmlkW3NyXVtzY10uZ2xvdyA9IDE7CiAgICAgICAgZ3JpZFtzcl1bc2NdLnBvcCA9IDA7CiAgICAgICAgZ3JpZFtzcl1bc2NdLnNjYWxlID0gMS4zOwogICAgICAgIGlmIChzcGF3bi5raW5kID09PSAic3VwZXJjYXQiKSB7CiAgICAgICAgICBzZXRGbGFzaCgiU1VQRVIgQ0FUISIpOwogICAgICAgICAgc3Bhd25TdXBlckJlYW0oc3IsIHNjKTsKICAgICAgICAgIGlmIChlZE5vdGVGZWF0dXJlVHJpZ2dlcigic3VwZXJjYXQiKSkgZXZlbnREaXJlY3Rvci5fdHJpZ2dlcmVkVGhpc1Jlc29sdmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcHJvY2Vzc1NwZWNpYWxRdWV1ZShtdWx0KTsKICAgICAgLy8gRWRnZS10by1lZGdlIGNsZWFyIGluIHRoaXMgc3RlcCAtPiBDYXQgRGFzaAogICAgICB0cnlUcmlnZ2VyQ2F0RGFzaChhbGxDZWxscyk7CiAgICAgIGF3YWl0IHNsZWVwKDEyMCk7CiAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIGF3YWl0IHNsZWVwKDYwKTsKICAgIH0KICAgIC8vIElmIGVhcmx5IGNhcCBzdG9wcGVkIG1pZC1jYXNjYWRlLCBxdWlldGx5IGNsZWFyIHJlbWFpbmluZyBtYXRjaGVzIChubyBzcGVjaWFscy9mbGFzaCkuCiAgICBpZiAoZWFybHlMZXZlbFNpbXBsZSgpKSB7CiAgICAgIHZhciBxdWlldCA9IDA7CiAgICAgIHdoaWxlIChxdWlldCsrIDwgMTIpIHsKICAgICAgICB2YXIgbGVmdCA9IGZpbmRNYXRjaGVzKGdyaWQpOwogICAgICAgIGlmICghbGVmdC5ncm91cHMubGVuZ3RoICYmICFzcGVjaWFsUXVldWUubGVuZ3RoKSBicmVhazsKICAgICAgICB2YXIgY2VsbHNRID0gW107CiAgICAgICAgdmFyIHNlZW5RID0ge307CiAgICAgICAgZm9yICh2YXIgcWkgPSAwOyBxaSA8IGxlZnQuZ3JvdXBzLmxlbmd0aDsgcWkrKykgewogICAgICAgICAgZm9yICh2YXIgcWogPSAwOyBxaiA8IGxlZnQuZ3JvdXBzW3FpXS5jZWxscy5sZW5ndGg7IHFqKyspIHsKICAgICAgICAgICAgdmFyIHFjID0gbGVmdC5ncm91cHNbcWldLmNlbGxzW3FqXTsKICAgICAgICAgICAgdmFyIHFrID0gcWNbMF0gKyAiLCIgKyBxY1sxXTsKICAgICAgICAgICAgaWYgKCFzZWVuUVtxa10pIHsgc2VlblFbcWtdID0gdHJ1ZTsgY2VsbHNRLnB1c2gocWMpOyB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhbWFnZUFkamFjZW50KGNlbGxzUSk7CiAgICAgICAgZm9yICh2YXIgcWsyID0gMDsgcWsyIDwgY2VsbHNRLmxlbmd0aDsgcWsyKyspIHsKICAgICAgICAgIGNvbGxlY3RDbGVhcmVkKGNlbGxzUVtxazJdWzBdLCBjZWxsc1FbcWsyXVsxXSk7CiAgICAgICAgICBncmlkW2NlbGxzUVtxazJdWzBdXVtjZWxsc1FbcWsyXVsxXV0udHlwZSA9IC0xOwogICAgICAgICAgZ3JpZFtjZWxsc1FbcWsyXVswXV1bY2VsbHNRW3FrMl1bMV1dLnNwZWNpYWwgPSBudWxsOwogICAgICAgIH0KICAgICAgICBzcGVjaWFsUXVldWUgPSBbXTsKICAgICAgICBhd2FpdCBjb2xsYXBzZUFuZFJlZmlsbCgpOwogICAgICB9CiAgICB9CiAgICBjb21ibyA9IDA7CiAgICBwYXdNdWx0QWN0aXZlID0gMTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGRvU3dhcChyMSwgYzEsIHIyLCBjMikgewogICAgaWYgKGJ1c3kpIHJldHVybjsKICAgIGlmICghaW5Cb3VuZHMocjEsIGMxKSB8fCAhaW5Cb3VuZHMocjIsIGMyKSkgcmV0dXJuOwogICAgaWYgKE1hdGguYWJzKHIxIC0gcjIpICsgTWF0aC5hYnMoYzEgLSBjMikgIT09IDEpIHJldHVybjsKICAgIHZhciBhID0gZ3JpZFtyMV1bYzFdLCBiID0gZ3JpZFtyMl1bYzJdOwogICAgaWYgKGEub2JzdGFjbGUgfHwgYi5vYnN0YWNsZSkgcmV0dXJuOwogICAgaWYgKGEudHlwZSA8IDAgfHwgYi50eXBlIDwgMCkgcmV0dXJuOwoKICAgIGJ1c3kgPSB0cnVlOwogICAgc2VsZWN0ZWQgPSBudWxsOwogICAgaGludENlbGxzID0gbnVsbDsKCiAgICBhc3luYyBmdW5jdGlvbiBhbmltYXRlU2xpZGVTd2FwKHJyMSwgY2MxLCBycjIsIGNjMiwgcmV2ZXJzZSkgewogICAgICB2YXIgZHggPSAoY2MyIC0gY2MxKSAqIGNlbGxXOwogICAgICB2YXIgZHkgPSAocnIyIC0gcnIxKSAqIGNlbGxIOwogICAgICB2YXIgQSA9IGdyaWRbcnIxXVtjYzFdLCBCID0gZ3JpZFtycjJdW2NjMl07CiAgICAgIC8vIEFmdGVyIGxvZ2ljYWwgc3dhcCwgdGlsZXMgc2l0IGF0IGRlc3RpbmF0aW9uOyBhbmltYXRlIGZyb20gb3JpZ2luIG9mZnNldC4KICAgICAgaWYgKCFyZXZlcnNlKSB7CiAgICAgICAgQS5zbGlkZVggPSAtZHg7IEEuc2xpZGVZID0gLWR5OwogICAgICAgIEIuc2xpZGVYID0gZHg7IEIuc2xpZGVZID0gZHk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQS5zbGlkZVggPSAtZHg7IEEuc2xpZGVZID0gLWR5OwogICAgICAgIEIuc2xpZGVYID0gZHg7IEIuc2xpZGVZID0gZHk7CiAgICAgIH0KICAgICAgdmFyIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIHZhciBkdXIgPSByZXZlcnNlID8gMTgwIDogMjIwOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgIGZ1bmN0aW9uIHN0ZXAobm93KSB7CiAgICAgICAgICB2YXIgcCA9IE1hdGgubWluKDEsIChub3cgLSB0MCkgLyBkdXIpOwogICAgICAgICAgdmFyIGVhc2UgPSByZXZlcnNlCiAgICAgICAgICAgID8gKDEgLSBNYXRoLnBvdygxIC0gcCwgMikpCiAgICAgICAgICAgIDogKHAgPCAwLjUgPyA0ICogcCAqIHAgKiBwIDogMSAtIE1hdGgucG93KC0yICogcCArIDIsIDMpIC8gMik7CiAgICAgICAgICB2YXIgdSA9IDEgLSBlYXNlOwogICAgICAgICAgQS5zbGlkZVggPSAtZHggKiB1OyBBLnNsaWRlWSA9IC1keSAqIHU7CiAgICAgICAgICBCLnNsaWRlWCA9IGR4ICogdTsgQi5zbGlkZVkgPSBkeSAqIHU7CiAgICAgICAgICBpZiAocCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBBLnNsaWRlWCA9IEEuc2xpZGVZID0gMDsKICAgICAgICAgICAgQi5zbGlkZVggPSBCLnNsaWRlWSA9IDA7CiAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBsb2dpY2FsIHN3YXAgdGhlbiBzbGlkZSBpbnRvIHBsYWNlCiAgICB2YXIgdG1wID0gZ3JpZFtyMV1bYzFdOwogICAgZ3JpZFtyMV1bYzFdID0gZ3JpZFtyMl1bYzJdOwogICAgZ3JpZFtyMl1bYzJdID0gdG1wOwoKICAgIHZhciB2YWxpZCA9IGZhbHNlOwogICAgdmFyIGEyID0gZ3JpZFtyMV1bYzFdLCBiMiA9IGdyaWRbcjJdW2MyXTsKICAgIGlmICgoYTIuc3BlY2lhbCAmJiBiMi5zcGVjaWFsKSB8fCBhMi5zcGVjaWFsID09PSAicmFpbmJvdyIgfHwgYjIuc3BlY2lhbCA9PT0gInJhaW5ib3ciIHx8CiAgICAgICAgYTIuc3BlY2lhbCA9PT0gImNhdG5pcCIgfHwgYjIuc3BlY2lhbCA9PT0gImNhdG5pcCIgfHwKICAgICAgICBhMi5zcGVjaWFsID09PSAiYm9tYiIgfHwgYjIuc3BlY2lhbCA9PT0gImJvbWIiKSB7CiAgICAgIC8vIGNhdG5pcCAvIEV4cGxvZGluZyBDYXQgYWN0aXZhdGUgd2hlbiBzd2FwcGVkIHdpdGggYW55IG5laWdoYm9yCiAgICAgIHZhbGlkID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBtID0gZmluZE1hdGNoZXMoZ3JpZCk7CiAgICAgIHZhbGlkID0gbS5ncm91cHMubGVuZ3RoID4gMDsKICAgIH0KCiAgICBhd2FpdCBhbmltYXRlU2xpZGVTd2FwKHIxLCBjMSwgcjIsIGMyLCBmYWxzZSk7CgogICAgaWYgKCF2YWxpZCkgewogICAgICAvLyBzbGlkZSBiYWNrCiAgICAgIHZhciB0bXAyID0gZ3JpZFtyMV1bYzFdOwogICAgICBncmlkW3IxXVtjMV0gPSBncmlkW3IyXVtjMl07CiAgICAgIGdyaWRbcjJdW2MyXSA9IHRtcDI7CiAgICAgIGF3YWl0IGFuaW1hdGVTbGlkZVN3YXAocjEsIGMxLCByMiwgYzIsIHRydWUpOwogICAgICBidXN5ID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBtb3Zlc0xlZnQtLTsKICAgIHZhciBoYW5kbGVkU3BlY2lhbCA9IGZhbHNlOwogICAgLy8gQWN0aXZhdGUgY2F0bmlwIC8gRXhwbG9kaW5nIENhdCBvbiBzd2FwIChyZWxpYWJsZSAzeDMgYmxhc3QpCiAgICBpZiAoYTIuc3BlY2lhbCA9PT0gImNhdG5pcCIgfHwgYjIuc3BlY2lhbCA9PT0gImNhdG5pcCIgfHwKICAgICAgICBhMi5zcGVjaWFsID09PSAiYm9tYiIgfHwgYjIuc3BlY2lhbCA9PT0gImJvbWIiKSB7CiAgICAgIGlmIChhMi5zcGVjaWFsID09PSAiY2F0bmlwIiB8fCBhMi5zcGVjaWFsID09PSAiYm9tYiIpIHsKICAgICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogcjEsIGM6IGMxLCBzcDogYTIuc3BlY2lhbH0pOwogICAgICAgIGNvbGxlY3RDbGVhcmVkKHIxLCBjMSk7CiAgICAgICAgZ3JpZFtyMV1bYzFdLnR5cGUgPSAtMTsgZ3JpZFtyMV1bYzFdLnNwZWNpYWwgPSBudWxsOwogICAgICB9CiAgICAgIGlmIChiMi5zcGVjaWFsID09PSAiY2F0bmlwIiB8fCBiMi5zcGVjaWFsID09PSAiYm9tYiIpIHsKICAgICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogcjIsIGM6IGMyLCBzcDogYjIuc3BlY2lhbH0pOwogICAgICAgIGNvbGxlY3RDbGVhcmVkKHIyLCBjMik7CiAgICAgICAgZ3JpZFtyMl1bYzJdLnR5cGUgPSAtMTsgZ3JpZFtyMl1bYzJdLnNwZWNpYWwgPSBudWxsOwogICAgICB9CiAgICAgIHByb2Nlc3NTcGVjaWFsUXVldWUoMSk7CiAgICAgIGF3YWl0IHNsZWVwKDEwMCk7CiAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIGhhbmRsZWRTcGVjaWFsID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoKGEyLnNwZWNpYWwgJiYgYjIuc3BlY2lhbCkgfHwgYTIuc3BlY2lhbCA9PT0gInJhaW5ib3ciIHx8IGIyLnNwZWNpYWwgPT09ICJyYWluYm93IikgewogICAgICBpZiAoYTIuc3BlY2lhbCAmJiBiMi5zcGVjaWFsKSB7CiAgICAgICAgcmVzb2x2ZVNwZWNpYWxDb21ibyhyMSwgYzEsIHIyLCBjMik7CiAgICAgICAgcHJvY2Vzc1NwZWNpYWxRdWV1ZSgxKTsKICAgICAgICBhd2FpdCBzbGVlcCgxMDApOwogICAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIH0gZWxzZSBpZiAoYTIuc3BlY2lhbCA9PT0gInJhaW5ib3ciIHx8IGIyLnNwZWNpYWwgPT09ICJyYWluYm93IikgewogICAgICAgIHZhciByciA9IGEyLnNwZWNpYWwgPT09ICJyYWluYm93IiA\/IHIxIDogcjI7CiAgICAgICAgdmFyIGNjID0gYTIuc3BlY2lhbCA9PT0gInJhaW5ib3ciID8gYzEgOiBjMjsKICAgICAgICB2YXIgb3RoZXIgPSBhMi5zcGVjaWFsID09PSAicmFpbmJvdyIgPyBiMiA6IGEyOwogICAgICAgIHZhciB0YXJnZXRUeXBlID0gb3RoZXIudHlwZTsKICAgICAgICBjb2xsZWN0Q2xlYXJlZChyciwgY2MpOwogICAgICAgIGdyaWRbcnJdW2NjXS50eXBlID0gLTE7CiAgICAgICAgZ3JpZFtycl1bY2NdLnNwZWNpYWwgPSBudWxsOwogICAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiByciwgYzogY2MsIHNwOiAicmFpbmJvdyIsIHRhcmdldFR5cGU6IHRhcmdldFR5cGV9KTsKICAgICAgICBwcm9jZXNzU3BlY2lhbFF1ZXVlKDEpOwogICAgICAgIGF3YWl0IHNsZWVwKDEwMCk7CiAgICAgICAgYXdhaXQgY29sbGFwc2VBbmRSZWZpbGwoKTsKICAgICAgfQogICAgICBoYW5kbGVkU3BlY2lhbCA9IHRydWU7CiAgICB9CgogICAgaWYgKGV2ZW50RGlyZWN0b3IpIGV2ZW50RGlyZWN0b3IuX3RyaWdnZXJlZFRoaXNSZXNvbHZlID0gZmFsc2U7CiAgICBhd2FpdCByZXNvbHZlTWF0Y2hlcyh0cnVlKTsKICAgIHZhciBmZWF0SGl0ID0gISEoZXZlbnREaXJlY3RvciAmJiBldmVudERpcmVjdG9yLl90cmlnZ2VyZWRUaGlzUmVzb2x2ZSk7CiAgICBpZiAoZWRBY3RpdmUoKSkgZWRPbk1vdmVSZXNvbHZlZChmZWF0SGl0KTsKCiAgICBpZiAoZ29hbHNEb25lKCkpIHsKICAgICAgZmluaXNoTGV2ZWwodHJ1ZSk7CiAgICB9IGVsc2UgaWYgKG1vdmVzTGVmdCA8PSAwKSB7CiAgICAgIGZpbmlzaExldmVsKGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEJsb3cgdXAgLyByZXNodWZmbGUgaWYgbm8gbW92ZXMgYWZ0ZXIgc2V0dGxlCiAgICAgIGlmICghZmluZEhpbnQoKSkgewogICAgICAgIGF3YWl0IGVuc3VyZVZhbGlkTW92ZSgpOwogICAgICB9CiAgICB9CiAgICBidXN5ID0gZmFsc2U7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzaHVmZmxlQm9hcmQoKSB7CiAgICBhd2FpdCBzaHVmZmxlQm9hcmRVbnRpbE1vdmUoKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJDb3VudChzYywgdGhyZXNob2xkcykgewogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMl0pIHJldHVybiAzOwogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMV0pIHJldHVybiAyOwogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMF0pIHJldHVybiAxOwogICAgcmV0dXJuIDA7CiAgfQoKICBmdW5jdGlvbiBmaW5pc2hMZXZlbCh3b24pIHsKICAgIGJ1c3kgPSB0cnVlOwogICAgc3RhdGUgPSB3b24gPyAid2luIiA6ICJsb3NlIjsKICAgIGlmICh3b24pIHsKICAgICAgdmFyIGx2ID0gTEVWRUxTW2xldmVsSW5kZXhdOwogICAgICBzdGFyc0Vhcm5lZCA9IE1hdGgubWF4KDEsIHN0YXJDb3VudChzY29yZSwgbHYuc3RhcnMpKTsKICAgICAgdmFyIHByZXYgPSBiZXN0U3RhcnNbbGV2ZWxJbmRleF0gfHwgMDsKICAgICAgaWYgKHN0YXJzRWFybmVkID4gcHJldikgewogICAgICAgIGJlc3RTdGFyc1tsZXZlbEluZGV4XSA9IHN0YXJzRWFybmVkOwogICAgICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjYXRNYXRjaFN0YXJzIiwgSlNPTi5zdHJpbmdpZnkoYmVzdFN0YXJzKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgaWYgKHdpblN0YXJzKSB3aW5TdGFycy50ZXh0Q29udGVudCA9IFsiIiwgIioiLCAiKioiLCAiKioqIl1bc3RhcnNFYXJuZWRdOwogICAgICBpZiAod2luTXNnKSB3aW5Nc2cudGV4dENvbnRlbnQgPSAiU2NvcmUgIiArIHNjb3JlICsgIiB8ICIgKyBzdGFyc0Vhcm5lZCArICIgc3RhciIgKyAoc3RhcnNFYXJuZWQgPiAxID8gInMiIDogIiIpOwogICAgICBzaG93Q2FyZCh3aW5DYXJkKTsKICAgIH0gZWxzZSB7CiAgICAgIHNob3dDYXJkKGxvc2VDYXJkKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dDYXJkKGNhcmQpIHsKICAgIGlmIChvdmVybGF5RWwpIG92ZXJsYXlFbC5oaWRkZW4gPSBmYWxzZTsKICAgIHZhciBjYXJkcyA9IFt0aXRsZUNhcmQsIGxldmVsQ2FyZCwgd2luQ2FyZCwgbG9zZUNhcmQsIHBhdXNlQ2FyZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhcmRzLmxlbmd0aDsgaSsrKSBpZiAoY2FyZHNbaV0pIGNhcmRzW2ldLmhpZGRlbiA9IHRydWU7CiAgICBpZiAoY2FyZCkgY2FyZC5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChvdmVybGF5RWwpIHsKICAgICAgdmFyIHRhcCA9IChjYXJkID09PSB0aXRsZUNhcmQgfHwgY2FyZCA9PT0gbGV2ZWxDYXJkKTsKICAgICAgaWYgKHRhcCkgb3ZlcmxheUVsLmNsYXNzTGlzdC5hZGQoImNtLXRhcHBsYXkiKTsKICAgICAgZWxzZSBvdmVybGF5RWwuY2xhc3NMaXN0LnJlbW92ZSgiY20tdGFwcGxheSIpOwogICAgICBvdmVybGF5RWwuc3R5bGUuY3Vyc29yID0gdGFwID8gInBvaW50ZXIiIDogIiI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoaWRlT3ZlcmxheSgpIHsKICAgIGlmIChvdmVybGF5RWwpIG92ZXJsYXlFbC5oaWRkZW4gPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZ29hbFRleHQobHYpIHsKICAgIHZhciBwYXJ0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdi5nb2Fscy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZyA9IGx2LmdvYWxzW2ldOwogICAgICBpZiAoZy5raW5kID09PSAiY29sbGVjdCIpIHBhcnRzLnB1c2goIkNvbGxlY3QgIiArIGcubmVlZCArICIgIiArIENBVF9OQU1FU1tnLnR5cGVdKTsKICAgICAgZWxzZSBpZiAoZy5raW5kID09PSAiYm94ZXMiKSBwYXJ0cy5wdXNoKCJDbGVhciAiICsgZy5uZWVkICsgIiBib3hlcyIpOwogICAgICBlbHNlIGlmIChnLmtpbmQgPT09ICJraXR0ZW5zIikgcGFydHMucHVzaCgiRnJlZSAiICsgZy5uZWVkICsgIiBraXR0ZW5zIik7CiAgICAgIGVsc2UgaWYgKGcua2luZCA9PT0gInlhcm4iKSBwYXJ0cy5wdXNoKCJDbGVhciAiICsgZy5uZWVkICsgIiB5YXJuIGJhbGxzIik7CiAgICB9CiAgICByZXR1cm4gcGFydHMuam9pbigiIHwgIikgKyAiIHwgIiArIGx2Lm1vdmVzICsgIiBtb3ZlcyI7CiAgfQoKICBmdW5jdGlvbiBzdGFydExldmVsKGlkeCkgewogICAgbGV2ZWxJbmRleCA9IGlkeDsKICAgIHZhciBsdiA9IExFVkVMU1tpZHhdOwogICAgbW92ZXNMZWZ0ID0gbHYubW92ZXM7CiAgICBzY29yZSA9IDA7CiAgICBjb21ibyA9IDA7CiAgICBnb2FscyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdi5nb2Fscy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGcgPSBsdi5nb2Fsc1tpXTsKICAgICAgZ29hbHMucHVzaCh7CiAgICAgICAga2luZDogbGcua2luZCwKICAgICAgICB0eXBlOiAobGcudHlwZSAhPT0gdW5kZWZpbmVkICYmIGxnLnR5cGUgIT09IG51bGwpID8gTnVtYmVyKGxnLnR5cGUpIDogbGcudHlwZSwKICAgICAgICBuZWVkOiBsZy5uZWVkLAogICAgICAgIGhhdmU6IDAKICAgICAgfSk7CiAgICB9CiAgICBzZXRCb2FyZFRoZW1lRm9yTGV2ZWwoKTsKICAgIGZpbGxCb2FyZEZyZXNoKCk7CiAgICBpZiAobHYubGF5b3V0KSBhcHBseUxheW91dChsdi5sYXlvdXQpOwogICAgLy8gZW5zdXJlIG5vIGltbWVkaWF0ZSBtYXRjaGVzIGFmdGVyIGxheW91dCwgYW5kIGF0IGxlYXN0IG9uZSB2YWxpZCBzd2FwCiAgICB2YXIgZ3VhcmQgPSAwOwogICAgd2hpbGUgKChmaW5kTWF0Y2hlcyhncmlkKS5ncm91cHMubGVuZ3RoID4gMCB8fCAhZmluZEhpbnQoKSkgJiYgZ3VhcmQrKyA8IDE2KSB7CiAgICAgIGZpbGxCb2FyZEZyZXNoKCk7CiAgICAgIGlmIChsdi5sYXlvdXQpIGFwcGx5TGF5b3V0KGx2LmxheW91dCk7CiAgICB9CiAgICBpZiAoIWZpbmRIaW50KCkpIHBsYW50R3VhcmFudGVlZFN3YXAoKTsKICAgIHNlbGVjdGVkID0gbnVsbDsKICAgIGhpbnRDZWxscyA9IG51bGw7CiAgICBidXN5ID0gZmFsc2U7CiAgICBzdGF0ZSA9ICJwbGF5IjsKICAgIGhpZGVPdmVybGF5KCk7CiAgICBpZiAocGF1c2VCdG4pIHBhdXNlQnRuLmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoaGludEJ0bikgaGludEJ0bi5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChhcnRCdG4pIGFydEJ0bi5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChhbmltQnRuKSBhbmltQnRuLmhpZGRlbiA9IGZhbHNlOwogICAgdXBkYXRlSGludEJ0bigpOwogICAgdXBkYXRlQXJ0QnRuKCk7CiAgICB1cGRhdGVBbmltQnRuKCk7CiAgICB2YXIgbG5hbWUgPSAobHYgJiYgbHYubmFtZSkgPyBsdi5uYW1lIDogKCJMZXZlbCAiICsgKGlkeCArIDEpKTsKICAgIGZ4QW5pbXMgPSBbXTsKICAgIHBhd011bHRBY3RpdmUgPSAxOwogICAgZXZlbnREaXJlY3RvciA9IG51bGw7CiAgICAvLyBOZXZlciBydW4gRXZlbnQgRGlyZWN0b3Igb24gZWFybHkgdHV0b3JpYWwgKEwxLUwyKTsgYmFzaWMgbWF0Y2gtMyBvbmx5LgogICAgaWYgKGx2ICYmIGx2LmZlYXR1cmUgJiYgRkVBVFVSRV9ERUZTW2x2LmZlYXR1cmVdICYmICFlYXJseUxldmVsU2ltcGxlKCkpIHsKICAgICAgZXZlbnREaXJlY3RvciA9IG1ha2VFdmVudERpcmVjdG9yKGx2LmZlYXR1cmUsIGx2Lm1vdmVzKTsKICAgICAgZWRTY2FuT3Bwb3J0dW5pdHkoKTsKICAgICAgZWRVcGRhdGVBc3Npc3RhbmNlKCk7CiAgICAgIC8vIExpZ2h0IGVhcmx5IHNlZWQgb24gZmVhdHVyZWQgc3RhZ2VzIHNvIHRoZSBtZWNoYW5pYyBpcyB0ZWFjaGFibGUKICAgICAgaWYgKGV2ZW50RGlyZWN0b3IuYXNzaXN0YW5jZSA8IDIpIHsKICAgICAgICBldmVudERpcmVjdG9yLmFzc2lzdGFuY2UgPSAxOwogICAgICAgIGVkUGlja0JpYXNUeXBlKCk7CiAgICAgIH0KICAgICAgZWRFbWl0KCJkaXJlY3RvcjpzdGFydCIsIHtsZXZlbDogaWR4LCBmZWF0dXJlOiBsdi5mZWF0dXJlfSk7CiAgICB9CiAgICBpZiAobHYgJiYgbHYuZmVhdHVyZSA9PT0gInN1cGVyY2F0IikgewogICAgICBsZXZlbEJhbm5lciA9IHsKICAgICAgICB0aXRsZTogIlN1cGVyIENhdCIsCiAgICAgICAgbmFtZTogIlRydWUgKyBjcm9zcyBjbGVhcnMgdGhlIGZ1bGwgcm93IEFORCBjb2x1bW4hIiwKICAgICAgICBsaWZlOiAzLjksIG1heDogMy45LCBmZWF0dXJlOiAic3VwZXJjYXQiCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGx2ICYmIGx2LmZlYXR1cmUgPT09ICJwYXdjbGFwIikgewogICAgICBsZXZlbEJhbm5lciA9IHsKICAgICAgICB0aXRsZTogIlBhdyBDbGFwIiwKICAgICAgICBuYW1lOiAiT25lIHN3YXAsIHR3byBtYXRjaGVzOiBjbGFwIGJvbnVzIHgyISIsCiAgICAgICAgbGlmZTogMy45LCBtYXg6IDMuOSwgZmVhdHVyZTogInBhd2NsYXAiCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGx2ICYmIGx2LmZlYXR1cmUgPT09ICJjYXRkYXNoIikgewogICAgICBsZXZlbEJhbm5lciA9IHsKICAgICAgICB0aXRsZTogIkNhdCBEYXNoIiwKICAgICAgICBuYW1lOiAiQ2xlYXIgb3Bwb3NpdGUgZWRnZXM6IGEgY2F0IHJhY2VzIGFuZCBrbm9ja3Mgb25lISIsCiAgICAgICAgbGlmZTogMy45LCBtYXg6IDMuOSwgZmVhdHVyZTogImNhdGRhc2giCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGlkeCA9PT0gOSkgewogICAgICBsZXZlbEJhbm5lciA9IHsKICAgICAgICB0aXRsZTogIlN0cmlwZWQgQ2F0cyIsCiAgICAgICAgbmFtZTogIk1hdGNoIDQgZm9yIGEgc3RyaXBlIHRoYXQgY2xlYXJzIGEgd2hvbGUgbGluZSEiLAogICAgICAgIGxpZmU6IDMuNiwgbWF4OiAzLjYsIGZlYXR1cmU6ICJzdHJpcGUiCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGlkeCA9PT0gMTIpIHsKICAgICAgbGV2ZWxCYW5uZXIgPSB7CiAgICAgICAgdGl0bGU6ICJFeHBsb2RpbmcgQ2F0cyIsCiAgICAgICAgbmFtZTogIlQvTCBzaGFwZXMgb3Igc3dhcCB0aGUgcmVkICEgZm9yIGEgM3gzIGJsYXN0ISIsCiAgICAgICAgbGlmZTogMy42LCBtYXg6IDMuNiwgZmVhdHVyZTogImJvbWIiCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGlkeCA9PT0gQ0FUTklQX01JTl9MRVZFTCkgewogICAgICBsZXZlbEJhbm5lciA9IHsKICAgICAgICB0aXRsZTogIkNhdG5pcCBCb21icyIsCiAgICAgICAgbmFtZTogIlN3YXAgb25lIHRvIGJsYXN0IG5laWdoYm9ycyEiLAogICAgICAgIGxpZmU6IDMuNiwgbWF4OiAzLjYsIGNhdG5pcDogdHJ1ZQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgbGV2ZWxCYW5uZXIgPSB7dGl0bGU6ICJMZXZlbCAiICsgKGlkeCArIDEpLCBuYW1lOiBsbmFtZSwgbGlmZTogMy4yLCBtYXg6IDMuMiwgY2F0bmlwOiBmYWxzZX07CiAgICB9CiAgICBmaXRDYW52YXMoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dMZXZlbEludHJvKGlkeCkgewogICAgbGV2ZWxJbmRleCA9IGlkeDsKICAgIHZhciBsdiA9IExFVkVMU1tpZHhdOwogICAgc2V0Qm9hcmRUaGVtZUZvckxldmVsKCk7CiAgICBpZiAobGV2ZWxUaXRsZSkgbGV2ZWxUaXRsZS50ZXh0Q29udGVudCA9ICJMZXZlbCAiICsgKGlkeCArIDEpICsgKGx2Lm5hbWUgPyAoIiAgIiArIGx2Lm5hbWUpIDogIiIpOwogICAgaWYgKGxldmVsR29hbCkgbGV2ZWxHb2FsLmlubmVySFRNTCA9ICI8Yj4iICsgZ29hbFRleHQobHYpICsgIjwvYj48YnI+IiArIChsdi50aXAgfHwgIiIpOwogICAgc2hvd0NhcmQobGV2ZWxDYXJkKTsKICAgIHN0YXRlID0gImxldmVsIjsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9IGZhbHNlOwogICAgdXBkYXRlSGludEJ0bigpOwogICAgZml0Q2FudmFzKCk7CiAgfQoKICAvKiA9PT09PSBJTlBVVCA9PT09PSAqLwogIGZ1bmN0aW9uIGNhbnZhc1BvcyhlKSB7CiAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBjbGllbnRYID0gZS5jbGllbnRYLCBjbGllbnRZID0gZS5jbGllbnRZOwogICAgaWYgKGUudG91Y2hlcyAmJiBlLnRvdWNoZXMubGVuZ3RoKSB7CiAgICAgIGNsaWVudFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgY2xpZW50WSA9IGUudG91Y2hlc1swXS5jbGllbnRZOwogICAgfSBlbHNlIGlmIChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7CiAgICAgIGNsaWVudFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGNsaWVudFkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7CiAgICB9CiAgICByZXR1cm4gewogICAgICB4OiAoY2xpZW50WCAtIHJlY3QubGVmdCkgKiAoVyAvIHJlY3Qud2lkdGgpLAogICAgICB5OiAoY2xpZW50WSAtIHJlY3QudG9wKSAqIChIIC8gcmVjdC5oZWlnaHQpCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gY2VsbEF0KHgsIHkpIHsKICAgIHZhciBjeCA9IE1hdGguZmxvb3IoKHggLSBib2FyZFgpIC8gY2VsbFcpOwogICAgdmFyIGN5ID0gTWF0aC5mbG9vcigoeSAtIGJvYXJkWSkgLyBjZWxsSCk7CiAgICBpZiAoY3ggPCAwIHx8IGN5IDwgMCB8fCBjeCA+PSBHUklEIHx8IGN5ID49IEdSSUQpIHJldHVybiBudWxsOwogICAgcmV0dXJuIFtjeSwgY3hdOwogIH0KCiAgZnVuY3Rpb24gb25Eb3duKGUpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiIHx8IGJ1c3kpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIHZhciBwID0gY2FudmFzUG9zKGUpOwogICAgdmFyIGNlbGxQb3MgPSBjZWxsQXQocC54LCBwLnkpOwogICAgaWYgKCFjZWxsUG9zKSByZXR1cm47CiAgICBkcmFnU3RhcnQgPSB7cjogY2VsbFBvc1swXSwgYzogY2VsbFBvc1sxXSwgeDogcC54LCB5OiBwLnl9OwogICAgcG9pbnRlcklkID0gZS5wb2ludGVySWQ7CiAgfQoKICBmdW5jdGlvbiBvbk1vdmUoZSkgewogICAgaWYgKCFkcmFnU3RhcnQgfHwgc3RhdGUgIT09ICJwbGF5IiB8fCBidXN5KSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgcCA9IGNhbnZhc1BvcyhlKTsKICAgIHZhciBkeCA9IHAueCAtIGRyYWdTdGFydC54LCBkeSA9IHAueSAtIGRyYWdTdGFydC55OwogICAgdmFyIHRociA9IE1hdGgubWF4KDEyLCBNYXRoLm1pbihjZWxsVywgY2VsbEgpICogMC4yOCk7CiAgICBpZiAoTWF0aC5hYnMoZHgpIDwgdGhyICYmIE1hdGguYWJzKGR5KSA8IHRocikgcmV0dXJuOwogICAgdmFyIG5yID0gZHJhZ1N0YXJ0LnIsIG5jID0gZHJhZ1N0YXJ0LmM7CiAgICBpZiAoTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpKSBuYyArPSBkeCA+IDAgPyAxIDogLTE7CiAgICBlbHNlIG5yICs9IGR5ID4gMCA\/IDEgOiAtMTsKICAgIHZhciBzciA9IGRyYWdTdGFydC5yLCBzYyA9IGRyYWdTdGFydC5jOwogICAgZHJhZ1N0YXJ0ID0gbnVsbDsKICAgIGRvU3dhcChzciwgc2MsIG5yLCBuYyk7CiAgfQoKICBmdW5jdGlvbiBvblVwKGUpIHsKICAgIGlmIChzdGF0ZSAhPT0gInBsYXkiIHx8IGJ1c3kpIHsgZHJhZ1N0YXJ0ID0gbnVsbDsgcmV0dXJuOyB9CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgcCA9IGNhbnZhc1BvcyhlKTsKICAgIGlmIChkcmFnU3RhcnQpIHsKICAgICAgdmFyIGNlbGxQb3MgPSBjZWxsQXQocC54LCBwLnkpOwogICAgICB2YXIgZHggPSBwLnggLSBkcmFnU3RhcnQueCwgZHkgPSBwLnkgLSBkcmFnU3RhcnQueTsKICAgICAgaWYgKE1hdGguYWJzKGR4KSA8IE1hdGgubWF4KDEwLCBNYXRoLm1pbihjZWxsVywgY2VsbEgpICogMC4yKSAmJiBNYXRoLmFicyhkeSkgPCBNYXRoLm1heCgxMCwgTWF0aC5taW4oY2VsbFcsIGNlbGxIKSAqIDAuMikgJiYgY2VsbFBvcykgewogICAgICAgIC8vIGNsaWNrLWNsaWNrIHNlbGVjdAogICAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFswXSA9PT0gY2VsbFBvc1swXSAmJiBzZWxlY3RlZFsxXSA9PT0gY2VsbFBvc1sxXSkgewogICAgICAgICAgc2VsZWN0ZWQgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgJiYgTWF0aC5hYnMoc2VsZWN0ZWRbMF0gLSBjZWxsUG9zWzBdKSArIE1hdGguYWJzKHNlbGVjdGVkWzFdIC0gY2VsbFBvc1sxXSkgPT09IDEpIHsKICAgICAgICAgIHZhciBzciA9IHNlbGVjdGVkWzBdLCBzYyA9IHNlbGVjdGVkWzFdOwogICAgICAgICAgc2VsZWN0ZWQgPSBudWxsOwogICAgICAgICAgZHJhZ1N0YXJ0ID0gbnVsbDsKICAgICAgICAgIGRvU3dhcChzciwgc2MsIGNlbGxQb3NbMF0sIGNlbGxQb3NbMV0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZWxlY3RlZCA9IGNlbGxQb3M7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkcmFnU3RhcnQgPSBudWxsOwogIH0KCiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25Eb3duKTsKICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvbk1vdmUpOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvblVwKTsKICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIGZ1bmN0aW9uICgpIHsgZHJhZ1N0YXJ0ID0gbnVsbDsgfSk7CiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH0sIHtwYXNzaXZlOiBmYWxzZX0pOwoKICAvKiA9PT09PSBSRU5ERVIgPT09PT0gKi8KICBmdW5jdGlvbiBkcmF3Qm9hcmQoKSB7CiAgICBkcmF3Qm9hcmRHcmlkQmcoKTsKCiAgICB2YXIgdCA9IHBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMDsKICAgIHZhciBjcyA9IE1hdGgubWluKGNlbGxXLCBjZWxsSCk7CiAgICBmb3IgKHZhciByMiA9IDA7IHIyIDwgR1JJRDsgcjIrKykgewogICAgICBmb3IgKHZhciBjMiA9IDA7IGMyIDwgR1JJRDsgYzIrKykgewogICAgICAgIHZhciB0aWxlID0gZ3JpZFtyMl1bYzJdOwogICAgICAgIHZhciB4ID0gYm9hcmRYICsgYzIgKiBjZWxsVyArICh0aWxlLnNsaWRlWCB8fCAwKTsKICAgICAgICB2YXIgeSA9IGJvYXJkWSArIHIyICogY2VsbEggLSAodGlsZS5mYWxsIHx8IDApICogY2VsbEggKyAodGlsZS5zbGlkZVkgfHwgMCk7CiAgICAgICAgdmFyIHNoYWtlWCA9IHRpbGUuc2hha2UgPyBNYXRoLnNpbih0ICogNDApICogMyA6IDA7CiAgICAgICAgaWYgKHRpbGUuc2hha2UpIHRpbGUuc2hha2UgPSBNYXRoLm1heCgwLCB0aWxlLnNoYWtlIC0gMC4zKTsKCiAgICAgICAgaWYgKHRpbGUudHlwZSA+PSAwKSB7CiAgICAgICAgICB2YXIgcGFjayA9IHNwcml0ZXNbdGlsZS50eXBlXTsKICAgICAgICAgIHZhciBzcHIgPSBwYWNrLmhhcHB5OwogICAgICAgICAgaWYgKHRpbGUucG9wKSBzcHIgPSBwYWNrLnN1cnByaXNlOwogICAgICAgICAgZWxzZSBpZiAoYW5pbU9uICYmIHRpbGUuZmFjZSAmJiB0aWxlLmZhY2VVbnRpbCAmJiB0IDwgdGlsZS5mYWNlVW50aWwpIHsKICAgICAgICAgICAgaWYgKHRpbGUuZmFjZSA9PT0gIm5vc2UiKSB7CiAgICAgICAgICAgICAgLy8gTm9zZSB0d2l0Y2ggfjEvOCBwcmlvciBmbGlja2VyIHJhdGUKICAgICAgICAgICAgICBzcHIgPSAoTWF0aC5mbG9vcih0ICogMC4zNzUpICUgMiA9PT0gMCkgPyAocGFjay5ub3NlIHx8IHBhY2sucmVzdCkgOiAocGFjay5ub3NlMiB8fCBwYWNrLm5vc2UgfHwgcGFjay5yZXN0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzcHIgPSBwYWNrW3RpbGUuZmFjZV0gfHwgcGFjay5oYXBweTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChhbmltT24gJiYgdGlsZS53aW5rVW50aWwgJiYgdCA8IHRpbGUud2lua1VudGlsKSBzcHIgPSBwYWNrLndpbms7CiAgICAgICAgICB2YXIgc2MgPSB0aWxlLnNjYWxlIHx8IDE7CiAgICAgICAgICB2YXIgcGFkWCA9IE1hdGgubWF4KDIsIE1hdGguZmxvb3IoY2VsbFcgKiAwLjA2KSk7CiAgICAgICAgICB2YXIgcGFkWSA9IE1hdGgubWF4KDIsIE1hdGguZmxvb3IoY2VsbEggKiAwLjA2KSk7CiAgICAgICAgICB2YXIgZml0ID0gTWF0aC5taW4oY2VsbFcgLSBwYWRYICogMiwgY2VsbEggLSBwYWRZICogMik7CiAgICAgICAgICB2YXIgc3ogPSBmaXQgKiBzYzsKICAgICAgICAgIHZhciBveCA9IHggKyAoY2VsbFcgLSBzeikgLyAyICsgc2hha2VYOwogICAgICAgICAgdmFyIG95ID0geSArIChjZWxsSCAtIHN6KSAvIDI7CiAgICAgICAgICBpZiAoaGludHNPbiAmJiBoaW50Q2VsbHMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCBoaW50Q2VsbHMubGVuZ3RoOyBoKyspIHsKICAgICAgICAgICAgICBpZiAoaGludENlbGxzW2hdWzBdID09PSByMiAmJiBoaW50Q2VsbHNbaF1bMV0gPT09IGMyKSB7CiAgICAgICAgICAgICAgICBveCArPSBNYXRoLnNpbih0ICogOCkgKiAzOwogICAgICAgICAgICAgICAgb3kgKz0gTWF0aC5hYnMoTWF0aC5zaW4odCAqIDgpKSAqIC0yOwogICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDI1NSwyMjAsODAsMC44NSkiOwogICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDIuNTsKICAgICAgICAgICAgICAgIHJvdW5kUmVjdChjdHgsIHggKyAxLCB5ICsgMSwgY2VsbFcgLSAyLCBjZWxsSCAtIDIsIDgpOwogICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGN0eC5kcmF3SW1hZ2Uoc3ByLCBveCwgb3ksIHN6LCBzeik7CiAgICAgICAgICBpZiAodGlsZS5zcGVjaWFsICYmIHNwZWNpYWxTcHJpdGVzW3RpbGUuc3BlY2lhbF0pIHsKICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMC44NSArIDAuMTUgKiBNYXRoLnNpbih0ICogNCk7CiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2Uoc3BlY2lhbFNwcml0ZXNbdGlsZS5zcGVjaWFsXSwgb3gsIG95LCBzeiwgc3opOwogICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkWzBdID09PSByMiAmJiBzZWxlY3RlZFsxXSA9PT0gYzIpIHsKICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiNmZjgwNDAiOwogICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMzsKICAgICAgICAgICAgcm91bmRSZWN0KGN0eCwgeCArIDIsIHkgKyAyLCBjZWxsVyAtIDQsIGNlbGxIIC0gNCwgOCk7CiAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aWxlLm9ic3RhY2xlKSB7CiAgICAgICAgICB2YXIgb3MgPSBvYnN0YWNsZVNwcml0ZXNbdGlsZS5vYnN0YWNsZSA9PT0gImJveDIiID8gImJveDIiIDogdGlsZS5vYnN0YWNsZV07CiAgICAgICAgICBpZiAob3MpIHsKICAgICAgICAgICAgdmFyIG9wID0gdGlsZS5vYnN0YWNsZSA9PT0gImNhcnJpZXIiID8gMiA6IDY7CiAgICAgICAgICAgIHZhciBvc3ogPSBNYXRoLm1pbihjZWxsVywgY2VsbEgpIC0gb3AgKiAyOwogICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aWxlLm9ic3RhY2xlID09PSAiY2FycmllciIgPyAxIDogMC45MjsKICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShvcywgeCArIChjZWxsVyAtIG9zeikgLyAyICsgc2hha2VYLCB5ICsgKGNlbGxIIC0gb3N6KSAvIDIsIG9zeiwgb3N6KTsKICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRyYXdIVUQoKSB7CiAgICB2YXIgbHYgPSBMRVZFTFNbbGV2ZWxJbmRleF07CiAgICB2YXIgc2NuID0gc3RhckNvdW50KHNjb3JlLCBsdi5zdGFycyk7CiAgICB2YXIgZ29hbEJpdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ29hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGcgPSBnb2Fsc1tpXTsKICAgICAgdmFyIGxhYmVsID0gIiI7CiAgICAgIGlmIChnLmtpbmQgPT09ICJjb2xsZWN0IikgbGFiZWwgPSBDQVRfTkFNRVNbZy50eXBlXTsKICAgICAgZWxzZSBpZiAoZy5raW5kID09PSAiYm94ZXMiKSBsYWJlbCA9ICJCb3hlcyI7CiAgICAgIGVsc2UgaWYgKGcua2luZCA9PT0gImtpdHRlbnMiKSBsYWJlbCA9ICJLaXR0ZW5zIjsKICAgICAgZWxzZSBpZiAoZy5raW5kID09PSAieWFybiIpIGxhYmVsID0gIllhcm4iOwogICAgICBnb2FsQml0cy5wdXNoKHtsYWJlbDogbGFiZWwsIGhhdmU6IGcuaGF2ZSB8fCAwLCBuZWVkOiBnLm5lZWQsIGRvbmU6IChnLmhhdmUgfHwgMCkgPj0gZy5uZWVkfSk7CiAgICB9CiAgICB2YXIgc3RhcnNUeHQgPSBbIiIsICIqIiwgIioqIiwgIioqKiJdW3Njbl07CgogICAgaWYgKGh1ZE1vZGUgPT09ICJzaWRlIikgewogICAgICB2YXIgcGFuZWxXID0gTWF0aC5tYXgoMTAwLCBib2FyZFggLSBib2FyZFBhZCAtIDYpOwogICAgICB2YXIgcGFuZWxIID0gTWF0aC5taW4oSCAtIDgsIGJvYXJkU2l6ZVNhZmUoKSk7CiAgICAgIHZhciBweCA9IDQsIHB5ID0gTWF0aC5tYXgoNCwgYm9hcmRZIC0gYm9hcmRQYWQpOwogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjgsMTYsMTAsMC45KSI7CiAgICAgIHJvdW5kUmVjdChjdHgsIHB4LCBweSwgcGFuZWxXLCBwYW5lbEgsIDE0KTsKICAgICAgY3R4LmZpbGwoKTsKICAgICAgdmFyIGZzVGl0bGUgPSBNYXRoLm1pbigyMiwgTWF0aC5tYXgoMTQsIE1hdGguZmxvb3IoSCAqIDAuMDQ1KSkpOwogICAgICB2YXIgZnNTY29yZSA9IE1hdGgubWluKDM2LCBNYXRoLm1heCgyMiwgTWF0aC5mbG9vcihIICogMC4wNykpKTsKICAgICAgdmFyIGZzQm9keSA9IE1hdGgubWluKDE4LCBNYXRoLm1heCgxMywgTWF0aC5mbG9vcihIICogMC4wMzgpKSk7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjRlMCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzVGl0bGUgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoIkxldmVsICIgKyAobGV2ZWxJbmRleCArIDEpLCBweCArIDE0LCBweSArIGZzVGl0bGUgKyAxMCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmYjA2MCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzU2NvcmUgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoU3RyaW5nKHNjb3JlKSwgcHggKyAxNCwgcHkgKyBmc1RpdGxlICsgZnNTY29yZSArIDI0KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZDhjMGEwIjsKICAgICAgY3R4LmZvbnQgPSBmc0JvZHkgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoIlNjb3JlIiwgcHggKyAxNCwgcHkgKyBmc1RpdGxlICsgZnNTY29yZSArIDI0ICsgZnNCb2R5ICsgNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjRlMCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzVGl0bGUgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoIk1vdmVzIiwgcHggKyAxNCwgcHkgKyBNYXRoLmZsb29yKHBhbmVsSCAqIDAuNDIpKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZkOWEwIjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgZnNTY29yZSArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dChTdHJpbmcobW92ZXNMZWZ0KSwgcHggKyAxNCwgcHkgKyBNYXRoLmZsb29yKHBhbmVsSCAqIDAuNDIpICsgZnNTY29yZSArIDYpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmUwYjAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmc0JvZHkgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoIkdvYWxzIiwgcHggKyAxNCwgcHkgKyBNYXRoLmZsb29yKHBhbmVsSCAqIDAuNjgpKTsKICAgICAgdmFyIGd5ID0gcHkgKyBNYXRoLmZsb29yKHBhbmVsSCAqIDAuNjgpICsgZnNCb2R5ICsgMTQ7CiAgICAgIGZvciAodmFyIGdpID0gMDsgZ2kgPCBnb2FsQml0cy5sZW5ndGg7IGdpKyspIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gZ29hbEJpdHNbZ2ldLmRvbmUgPyAiIzgwZTA4MCIgOiAiI2ZmZjRlMCI7CiAgICAgICAgY3R4LmZvbnQgPSBmc0JvZHkgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC5maWxsVGV4dChnb2FsQml0c1tnaV0ubGFiZWwgKyAiICAiICsgZ29hbEJpdHNbZ2ldLmhhdmUgKyAiLyIgKyBnb2FsQml0c1tnaV0ubmVlZCwgcHggKyAxNCwgZ3kpOwogICAgICAgIGd5ICs9IGZzQm9keSArIDEwOwogICAgICB9CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZDA3MCI7CiAgICAgIGN0eC5mb250ID0gTWF0aC5tYXgoMTgsIGZzVGl0bGUpICsgInB4IHNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KHN0YXJzVHh0LCBweCArIDE0LCBweSArIHBhbmVsSCAtIDE2KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFBvcnRyYWl0OiB0b3Agc3RyaXAgKyBib3R0b20gZ29hbHMgcGFuZWwgZmlsbGluZyBsZWZ0b3ZlcgogICAgICB2YXIgdG9wSCA9IE1hdGgubWF4KDQ4LCBib2FyZFkgLSA0KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI4LDE2LDEwLDAuOTIpIjsKICAgICAgcm91bmRSZWN0KGN0eCwgNCwgMiwgVyAtIDgsIHRvcEgsIDEyKTsKICAgICAgY3R4LmZpbGwoKTsKICAgICAgdmFyIGZzID0gTWF0aC5tYXgoMTMsIE1hdGguZmxvb3IodG9wSCAqIDAuMjgpKTsKICAgICAgdmFyIGZzQmlnID0gTWF0aC5tYXgoMTYsIE1hdGguZmxvb3IodG9wSCAqIDAuMzYpKTsKICAgICAgdmFyIHkxID0gMiArIE1hdGguZmxvb3IodG9wSCAqIDAuNDIpOwogICAgICB2YXIgeTIgPSAyICsgTWF0aC5mbG9vcih0b3BIICogMC43OCk7CiAgICAgIHZhciBjMSA9IDEyLCBjMiA9IE1hdGguZmxvb3IoVyAqIDAuMjIpLCBjMyA9IE1hdGguZmxvb3IoVyAqIDAuNDgpOwogICAgICBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmcyArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dCgiTHYgIiArIChsZXZlbEluZGV4ICsgMSksIGMxLCB5MSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmYjA2MCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzQmlnICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KFN0cmluZyhzY29yZSksIGMyLCB5MSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2Q4YzBhMCI7CiAgICAgIGN0eC5mb250ID0gTWF0aC5tYXgoMTAsIE1hdGguZmxvb3IodG9wSCAqIDAuMikpICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJzY29yZSIsIGMyLCB5Mik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjRlMCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJNb3ZlcyAiICsgbW92ZXNMZWZ0LCBjMywgeTEpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmQwNzAiOwogICAgICBjdHguZm9udCA9IE1hdGgubWF4KDE0LCBmcykgKyAicHggc2VyaWYiOwogICAgICBjdHgudGV4dEFsaWduID0gInJpZ2h0IjsKICAgICAgY3R4LmZpbGxUZXh0KHN0YXJzVHh0LCBXIC0gMTA4LCB5MSk7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CgogICAgICB2YXIgYm90dG9tVG9wID0gTWF0aC5tYXgoYm9hcmRZICsgR1JJRCAqIGNlbGwgKyA4LCBoaW50QW5jaG9yLnkgKyBoaW50QW5jaG9yLmggKyA2KTsKICAgICAgaWYgKGJvdHRvbVRvcCA8IEggLSAzNikgewogICAgICAgIHZhciBiaCA9IEggLSBib3R0b21Ub3AgLSA0OwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyOCwxNiwxMCwwLjkpIjsKICAgICAgICByb3VuZFJlY3QoY3R4LCA0LCBib3R0b21Ub3AsIFcgLSA4LCBiaCwgMTQpOwogICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgdmFyIGdmcyA9IE1hdGgubWluKDIyLCBNYXRoLm1heCgxNCwgTWF0aC5mbG9vcihNYXRoLm1pbihiaCAqIDAuMjIsIFcgKiAwLjA0NSkpKSk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZlMGIwIjsKICAgICAgICBjdHguZm9udCA9ICJib2xkICIgKyBnZnMgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICAgIGN0eC5maWxsVGV4dCgiR29hbHMiLCAxNiwgYm90dG9tVG9wICsgZ2ZzICsgMTApOwogICAgICAgIHZhciBneCA9IDE2OwogICAgICAgIHZhciBneTIgPSBib3R0b21Ub3AgKyBnZnMgKiAyICsgMjQ7CiAgICAgICAgZm9yICh2YXIgZ2ogPSAwOyBnaiA8IGdvYWxCaXRzLmxlbmd0aDsgZ2orKykgewogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGdvYWxCaXRzW2dqXS5kb25lID8gIiM4MGUwODAiIDogIiNmZmY0ZTAiOwogICAgICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgZ2ZzICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgICAgIHZhciBndHh0ID0gZ29hbEJpdHNbZ2pdLmxhYmVsICsgIiAgIiArIGdvYWxCaXRzW2dqXS5oYXZlICsgIi8iICsgZ29hbEJpdHNbZ2pdLm5lZWQ7CiAgICAgICAgICBjdHguZmlsbFRleHQoZ3R4dCwgZ3gsIGd5Mik7CiAgICAgICAgICBneCArPSBNYXRoLm1heCgxMjAsIE1hdGguZmxvb3IoY3R4Lm1lYXN1cmVUZXh0KGd0eHQpLndpZHRoICsgMjQpKTsKICAgICAgICAgIGlmIChneCA+IFcgLSA4MCkgeyBneCA9IDE2OyBneTIgKz0gZ2ZzICsgMTI7IH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZmxhc2hUaW1lciA+IDAgJiYgZmxhc2hNc2cpIHsKICAgICAgY3R4LnNhdmUoKTsKICAgICAgdmFyIGZhZGUgPSBNYXRoLm1pbigxLCBmbGFzaFRpbWVyICogMS40KTsKICAgICAgdmFyIGFnZSA9IDEuNTUgLSBmbGFzaFRpbWVyOwogICAgICB2YXIgcG9wID0gYWdlIDwgMC4yMiA\/ICgwLjcyICsgYWdlIC8gMC4yMiAqIDAuMzgpIDogKDEuMSAtIE1hdGgubWluKDAuMTIsIChhZ2UgLSAwLjIyKSAqIDAuMTUpKTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gZmFkZTsKICAgICAgdmFyIGZzID0gTWF0aC5tYXgoNDIsIE1hdGguZmxvb3IoTWF0aC5taW4oYm9hcmRXLCBib2FyZEgpICogMC4xNSkpOwogICAgICBmcyA9IE1hdGguZmxvb3IoZnMgKiBwb3ApOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmcyArICJweCBJbXBhY3QsQXJpYWwgQmxhY2ssc2Fucy1zZXJpZiI7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICJtaWRkbGUiOwogICAgICB2YXIgZnggPSBib2FyZFggKyBib2FyZFcgLyAyOwogICAgICB2YXIgZnkgPSBib2FyZFkgKyBib2FyZEggKiAwLjQ7CiAgICAgIHZhciB0dyA9IGN0eC5tZWFzdXJlVGV4dChmbGFzaE1zZykud2lkdGg7CiAgICAgIHZhciBiYW5uZXJIID0gZnMgKiAoZmxhc2hDb21ib04gPj0gMiA\/IDEuODUgOiAxLjM1KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDE4LCA4LCA0LCAwLjU4KSI7CiAgICAgIHJvdW5kUmVjdChjdHgsIGZ4IC0gdHcgLyAyIC0gMjgsIGZ5IC0gZnMgKiAwLjcyLCB0dyArIDU2LCBiYW5uZXJILCAxOCk7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjYzA1MDE4IjsKICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KDUsIE1hdGguZmxvb3IoZnMgKiAwLjExKSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjhlOCI7CiAgICAgIGN0eC5zdHJva2VUZXh0KGZsYXNoTXNnLCBmeCwgZnkpOwogICAgICBjdHguZmlsbFRleHQoZmxhc2hNc2csIGZ4LCBmeSk7CiAgICAgIGlmIChmbGFzaENvbWJvTiA+PSAyKSB7CiAgICAgICAgdmFyIHN1YiA9ICJjb21ibyB4IiArIGZsYXNoQ29tYm9OOwogICAgICAgIHZhciBzZnMgPSBNYXRoLm1heCgyMCwgTWF0aC5mbG9vcihmcyAqIDAuNCkpOwogICAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIHNmcyArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiM4MDMwMTAiOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAzOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZDA3MCI7CiAgICAgICAgY3R4LnN0cm9rZVRleHQoc3ViLCBmeCwgZnkgKyBmcyAqIDAuNyk7CiAgICAgICAgY3R4LmZpbGxUZXh0KHN1YiwgZngsIGZ5ICsgZnMgKiAwLjcpOwogICAgICB9CiAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9CgogICAgY3R4LmZvbnQgPSBNYXRoLm1heCgxMCwgTWF0aC5mbG9vcihNYXRoLm1pbihXLCBIKSAqIDAuMDE4KSkgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNDAsMjIwLDAuNDUpIjsKICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICBjdHguZmlsbFRleHQoVkVSU0lPTiwgOCwgSCAtIDgpOwogIH0KCgogIGZ1bmN0aW9uIGVuc3VyZVNwbGFzaCgpIHsKICAgIGlmIChzcGxhc2hDYW52YXMpIHJldHVybiBzcGxhc2hDYW52YXM7CiAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGN2LndpZHRoID0gNTEyOyBjdi5oZWlnaHQgPSAzMjA7CiAgICB2YXIgYyA9IGN2LmdldENvbnRleHQoIjJkIik7CiAgICBjLmNsZWFyUmVjdCgwLCAwLCA1MTIsIDMyMCk7CiAgICBmdW5jdGlvbiBibG9iKHgsIHksIHIsIGEsIGNvbCkgewogICAgICBjLnNhdmUoKTsKICAgICAgYy5nbG9iYWxBbHBoYSA9IGE7CiAgICAgIGMuZmlsbFN0eWxlID0gY29sIHx8ICJyZ2JhKDYwLDE4MCw3MCwxKSI7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMubW92ZVRvKHggKyByLCB5KTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgdmFyIGFuZyA9IChpIC8gMTApICogTWF0aC5QSSAqIDI7CiAgICAgICAgdmFyIHJyID0gciAqICgwLjU1ICsgKChpICogMzcpICUgNykgKiAwLjA5KTsKICAgICAgICBjLnF1YWRyYXRpY0N1cnZlVG8oCiAgICAgICAgICB4ICsgTWF0aC5jb3MoYW5nICsgMC4yKSAqIHJyICogMS4yNSwKICAgICAgICAgIHkgKyBNYXRoLnNpbihhbmcgKyAwLjIpICogcnIgKiAxLjI1LAogICAgICAgICAgeCArIE1hdGguY29zKGFuZyArIDAuNjIpICogcnIsCiAgICAgICAgICB5ICsgTWF0aC5zaW4oYW5nICsgMC42MikgKiBycgogICAgICAgICk7CiAgICAgIH0KICAgICAgYy5jbG9zZVBhdGgoKTsKICAgICAgYy5maWxsKCk7CiAgICAgIGMucmVzdG9yZSgpOwogICAgfQogICAgZnVuY3Rpb24gZHJpcCh4LCB5LCBsZW4sIGEpIHsKICAgICAgYy5zYXZlKCk7CiAgICAgIGMuZ2xvYmFsQWxwaGEgPSBhOwogICAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDQwLDE2MCw1NSwxKSI7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMuZWxsaXBzZSh4LCB5LCA4ICsgKGxlbiAlIDUpLCBsZW4sIDAsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgYy5maWxsKCk7CiAgICAgIGMucmVzdG9yZSgpOwogICAgfQogICAgYmxvYigyNTYsIDE2MCwgMTIwLCAwLjU1LCAicmdiYSg3MCwxOTAsODAsMSkiKTsKICAgIGJsb2IoMTcwLCAxMjAsIDcwLCAwLjQ1KTsKICAgIGJsb2IoMzQwLCAxMzAsIDgwLCAwLjQyKTsKICAgIGJsb2IoMjEwLCAyMTAsIDU1LCAwLjQpOwogICAgYmxvYigzMjAsIDIwMCwgNjAsIDAuMzgpOwogICAgYmxvYigxMjAsIDE4MCwgNDAsIDAuMzUpOwogICAgYmxvYig0MDAsIDE4MCwgNDUsIDAuMzUpOwogICAgYmxvYigyNTYsIDkwLCA1MCwgMC4zMik7CiAgICBibG9iKDI1NiwgMjMwLCA0OCwgMC4zKTsKICAgIGRyaXAoMTUwLCAyNDAsIDI4LCAwLjM1KTsKICAgIGRyaXAoMzgwLCAyNTAsIDM0LCAwLjMyKTsKICAgIGRyaXAoMjYwLCAyNTUsIDIyLCAwLjI4KTsKICAgIGRyaXAoMjAwLCA3MCwgMTgsIDAuMjUpOwogICAgZHJpcCgzMzAsIDc1LCAyMCwgMC4yNSk7CiAgICAvLyBzcGVja2xlcwogICAgZm9yICh2YXIgayA9IDA7IGsgPCA0ODsgaysrKSB7CiAgICAgIHZhciBzeCA9IChrICogOTcgKyA0MCkgJSA1MDA7CiAgICAgIHZhciBzeSA9IChrICogNTMgKyAyMCkgJSAzMDA7CiAgICAgIGMuZ2xvYmFsQWxwaGEgPSAwLjIyICsgKGsgJSA1KSAqIDAuMDQ7CiAgICAgIGMuZmlsbFN0eWxlID0gKGsgJSAyKSA\/ICJyZ2JhKDkwLDIxMCwxMDAsMSkiIDogInJnYmEoMzAsMTQwLDUwLDEpIjsKICAgICAgYy5iZWdpblBhdGgoKTsKICAgICAgYy5hcmMoc3gsIHN5LCAyICsgKGsgJSA0KSwgMCwgTWF0aC5QSSAqIDIpOwogICAgICBjLmZpbGwoKTsKICAgIH0KICAgIGMuZ2xvYmFsQWxwaGEgPSAxOwogICAgc3BsYXNoQ2FudmFzID0gY3Y7CiAgICByZXR1cm4gc3BsYXNoQ2FudmFzOwogIH0KCiAgZnVuY3Rpb24gZHJhd0xldmVsQmFubmVyKGR0KSB7CiAgICBpZiAoIWxldmVsQmFubmVyKSByZXR1cm47CiAgICBsZXZlbEJhbm5lci5saWZlIC09IGR0OwogICAgaWYgKGxldmVsQmFubmVyLmxpZmUgPD0gMCkgeyBsZXZlbEJhbm5lciA9IG51bGw7IHJldHVybjsgfQogICAgdmFyIHQgPSBsZXZlbEJhbm5lci5saWZlIC8gbGV2ZWxCYW5uZXIubWF4OwogICAgLy8gU21vb3RoIGVhc2U6IHF1aWNrIGZhZGUtaW4sIGxvbmcgaG9sZCwgc29mdCBmYWRlLW91dAogICAgdmFyIGFscGhhOwogICAgaWYgKHQgPiAwLjgyKSBhbHBoYSA9ICgxIC0gdCkgLyAwLjE4OwogICAgZWxzZSBpZiAodCA8IDAuMjgpIGFscGhhID0gdCAvIDAuMjg7CiAgICBlbHNlIGFscGhhID0gMTsKICAgIGFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYWxwaGEpKTsKICAgIC8vIEVhc2UgdGhlIGZhZGUgY3VydmUgZm9yIGEgZ2VudGxlciBleGl0CiAgICB2YXIgZmFkZSA9IGFscGhhICogYWxwaGEgKiAoMyAtIDIgKiBhbHBoYSk7CiAgICB2YXIgY3ggPSBib2FyZFggKyBib2FyZFcgLyAyOwogICAgdmFyIGN5ID0gYm9hcmRZICsgYm9hcmRIICogMC40MjsKICAgIHZhciBidyA9IE1hdGgubWluKGJvYXJkVyAqIDAuOTIsIE1hdGgubWF4KDIyMCwgVyAqIDAuNTUpKTsKICAgIHZhciBiaCA9IE1hdGgubWF4KDcwLCBNYXRoLm1pbigxMjAsIEggKiAwLjIyKSk7CiAgICB2YXIgc3cgPSBidyAqIDEuMzU7CiAgICB2YXIgc2ggPSBiaCAqIDIuMTU7CiAgICBjdHguc2F2ZSgpOwogICAgY3R4Lmdsb2JhbEFscGhhID0gZmFkZSAqIDAuNzI7CiAgICB2YXIgc3BsYXNoID0gZW5zdXJlU3BsYXNoKCk7CiAgICBjdHguZHJhd0ltYWdlKHNwbGFzaCwgY3ggLSBzdyAvIDIsIGN5IC0gc2ggLyAyLCBzdywgc2gpOwogICAgY3R4Lmdsb2JhbEFscGhhID0gZmFkZSAqIDAuNTU7CiAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMTIsOCw2LDAuNTUpIjsKICAgIHJvdW5kUmVjdChjdHgsIGN4IC0gYncgLyAyLCBjeSAtIGJoIC8gMiwgYncsIGJoLCAxOCk7CiAgICBjdHguZmlsbCgpOwogICAgY3R4Lmdsb2JhbEFscGhhID0gZmFkZTsKICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgIHZhciBmZWF0ID0gbGV2ZWxCYW5uZXIuZmVhdHVyZSB8fCAobGV2ZWxCYW5uZXIuY2F0bmlwID8gImNhdG5pcCIgOiBudWxsKTsKICAgIGlmIChmZWF0KSB7CiAgICAgIHZhciBhcnQgPSBudWxsOwogICAgICB2YXIgdGl0bGVDb2wgPSAiI2ZmYjM1YyI7CiAgICAgIGlmIChmZWF0ID09PSAiY2F0bmlwIikgeyBhcnQgPSBzcGVjaWFsU3ByaXRlcyAmJiBzcGVjaWFsU3ByaXRlcy5jYXRuaXA7IHRpdGxlQ29sID0gIiM3Q0ZGOUEiOyB9CiAgICAgIGVsc2UgaWYgKGZlYXQgPT09ICJzdXBlcmNhdCIpIHsgYXJ0ID0gc3BlY2lhbFNwcml0ZXMgJiYgc3BlY2lhbFNwcml0ZXMuc3VwZXJjYXQ7IHRpdGxlQ29sID0gIiNGRkUwNjYiOyB9CiAgICAgIGVsc2UgaWYgKGZlYXQgPT09ICJib21iIikgeyBhcnQgPSBzcGVjaWFsU3ByaXRlcyAmJiBzcGVjaWFsU3ByaXRlcy5ib21iOyB0aXRsZUNvbCA9ICIjRkY2MDQwIjsgfQogICAgICBlbHNlIGlmIChmZWF0ID09PSAic3RyaXBlIikgeyBhcnQgPSBzcGVjaWFsU3ByaXRlcyAmJiBzcGVjaWFsU3ByaXRlcy5zdHJpcGVkX2g7IHRpdGxlQ29sID0gIiM3RUM4RkYiOyB9CiAgICAgIGVsc2UgaWYgKGZlYXQgPT09ICJwYXdjbGFwIikgeyB0aXRsZUNvbCA9ICIjRkZCMEQwIjsgfQogICAgICBlbHNlIGlmIChmZWF0ID09PSAiY2F0ZGFzaCIpIHsgdGl0bGVDb2wgPSAiIzdFQzhGRiI7IH0KICAgICAgdmFyIGFydFMgPSBNYXRoLm1heCg0MCwgTWF0aC5mbG9vcihiaCAqIDAuNykpOwogICAgICBpZiAoYXJ0KSB7CiAgICAgICAgY3R4LmRyYXdJbWFnZShhcnQsIGN4IC0gYXJ0UyAvIDIsIGN5IC0gYmggKiAwLjc4IC0gYXJ0UyAqIDAuMTUsIGFydFMsIGFydFMpOwogICAgICB9IGVsc2UgaWYgKGZlYXQgPT09ICJwYXdjbGFwIikgewogICAgICAgIC8vIG1pbmkgcGF3IGljb25zCiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZjVkMGIwIjsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5lbGxpcHNlKGN4IC0gMzYsIGN5IC0gYmggKiAwLjcsIDE2LCAyMCwgLTAuMywgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmVsbGlwc2UoY3ggKyAzNiwgY3kgLSBiaCAqIDAuNywgMTYsIDIwLCAwLjMsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKICAgICAgfSBlbHNlIGlmIChmZWF0ID09PSAiY2F0ZGFzaCIpIHsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmMwNzAiOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyhjeCwgY3kgLSBiaCAqIDAuNjUsIDE4LCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiNmZmUwYTAiOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAzOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhjeCAtIDUwLCBjeSAtIGJoICogMC42NSk7IGN0eC5saW5lVG8oY3ggKyA1MCwgY3kgLSBiaCAqIDAuNjUpOyBjdHguc3Ryb2tlKCk7CiAgICAgIH0KICAgICAgY3R4LmZpbGxTdHlsZSA9IHRpdGxlQ29sOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBNYXRoLm1heCgyNCwgTWF0aC5mbG9vcihiaCAqIDAuNCkpICsgInB4IEltcGFjdCxBcmlhbCBCbGFjayxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KGxldmVsQmFubmVyLnRpdGxlLCBjeCwgY3kgKyBiaCAqIDAuMDIpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBNYXRoLm1heCgxMiwgTWF0aC5mbG9vcihiaCAqIDAuMikpICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KGxldmVsQmFubmVyLm5hbWUsIGN4LCBjeSArIGJoICogMC4zOCk7CiAgICB9IGVsc2UgewogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmIzNWMiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBNYXRoLm1heCgyMiwgTWF0aC5mbG9vcihiaCAqIDAuMzYpKSArICJweCBJbXBhY3QsQXJpYWwgQmxhY2ssc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dChsZXZlbEJhbm5lci50aXRsZSwgY3gsIGN5IC0gYmggKiAwLjA4KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmNGUwIjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgTWF0aC5tYXgoMTMsIE1hdGguZmxvb3IoYmggKiAwLjIyKSkgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQobGV2ZWxCYW5uZXIubmFtZSwgY3gsIGN5ICsgYmggKiAwLjI4KTsKICAgIH0KICAgIGN0eC5yZXN0b3JlKCk7CiAgfQoKICBmdW5jdGlvbiBib2FyZFNpemVTYWZlKCkgewogICAgcmV0dXJuIGJvYXJkSCArIGJvYXJkUGFkICogMjsKICB9CiAgZnVuY3Rpb24gYm9hcmRXaWR0aFNhZmUoKSB7CiAgICByZXR1cm4gYm9hcmRXICsgYm9hcmRQYWQgKiAyOwogIH0KCiAgZnVuY3Rpb24gZHJhd1BhcnRpY2xlcyhkdCkgewogICAgZm9yICh2YXIgaSA9IHBhcnRpY2xlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgcCA9IHBhcnRpY2xlc1tpXTsKICAgICAgcC5saWZlIC09IGR0OwogICAgICBwLnggKz0gcC52eCAqIGR0OwogICAgICBwLnkgKz0gcC52eSAqIGR0OwogICAgICBwLnZ5ICs9IDMwMCAqIGR0OwogICAgICBpZiAocC5saWZlIDw9IDApIHsgcGFydGljbGVzLnNwbGljZShpLCAxKTsgY29udGludWU7IH0KICAgICAgY3R4Lmdsb2JhbEFscGhhID0gTWF0aC5tYXgoMCwgcC5saWZlICogMik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBwLmNvbDsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHguYXJjKHAueCwgcC55LCBwLnNpemUgKiBwLmxpZmUsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgY3R4LmZpbGwoKTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgIH0KICB9CgogIHZhciBsYXN0VHMgPSBwZXJmb3JtYW5jZS5ub3coKTsKICBmdW5jdGlvbiBmcmFtZSh0cykgewogICAgdmFyIGR0ID0gTWF0aC5taW4oMC4wNSwgKHRzIC0gbGFzdFRzKSAvIDEwMDApOwogICAgbGFzdFRzID0gdHM7CiAgICBpZiAoZmxhc2hUaW1lciA+IDApIGZsYXNoVGltZXIgLT0gZHQ7CgogICAgaWYgKHN0YXRlID09PSAicGxheSIpIHsKICAgICAgdXBkYXRlV2lua3MoZHQpOwogICAgICBpZiAoaGludHNPbikgewogICAgICAgIGlmICghaGludENlbGxzKSBoaW50Q2VsbHMgPSBmaW5kSGludCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGhpbnRDZWxscyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIFcsIEgpOwogICAgaWYgKGJnQ2FudmFzKSBjdHguZHJhd0ltYWdlKGJnQ2FudmFzLCAwLCAwKTsKICAgIGVsc2UgewogICAgICBjdHguZmlsbFN0eWxlID0gIiM4N2I4ZTAiOwogICAgICBjdHguZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgICB9CgogICAgaWYgKHN0YXRlID09PSAicGxheSIgfHwgc3RhdGUgPT09ICJ3aW4iIHx8IHN0YXRlID09PSAibG9zZSIgfHwgc3RhdGUgPT09ICJwYXVzZSIpIHsKICAgICAgaWYgKGdyaWQubGVuZ3RoKSB7CiAgICAgICAgZHJhd0JvYXJkKCk7CiAgICAgICAgZHJhd0hVRCgpOwogICAgICAgIGRyYXdQYXJ0aWNsZXMoZHQpOwogICAgICAgIGRyYXdGeChkdCk7CiAgICAgICAgaWYgKHN0YXRlID09PSAicGxheSIpIGRyYXdMZXZlbEJhbm5lcihkdCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIHRpdGxlIGJhY2tkcm9wIGNhdHMKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDQwLDI1LDE1LDAuMjUpIjsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIEgpOwogICAgICBpZiAoc3ByaXRlcy5sZW5ndGgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgICAgY3R4LmRyYXdJbWFnZShzcHJpdGVzW2ldLmhhcHB5IHx8IHNwcml0ZXNbaV0ubm9ybWFsLCA4MCArIGkgKiAxNDAsIDIwMCwgMTAwLCAxMDApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgfQoKICAvKiA9PT09PSBGVUxMU0NSRUVOIC8gTU9CSUxFID09PT09ICovCiAgdmFyIG1vYmlsZVBsYXkgPSBmYWxzZTsKICB2YXIgZnNGYWxsYmFjayA9IGZhbHNlOwoKICBmdW5jdGlvbiBpc01vYmlsZSgpIHsKICAgIHJldHVybiAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kfE1vYmlsZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgKG1hdGNoTWVkaWEgJiYgbWF0Y2hNZWRpYSgiKHBvaW50ZXI6IGNvYXJzZSkiKS5tYXRjaGVzKTsKICB9CiAgZnVuY3Rpb24gaXNGc0FjdGl2ZSgpIHsKICAgIHJldHVybiAhIShkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCk7CiAgfQogIGZ1bmN0aW9uIGlzUG9ydHJhaXQoKSB7IHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgPiB3aW5kb3cuaW5uZXJXaWR0aDsgfQoKICBmdW5jdGlvbiB1cGRhdGVSb3RhdGUoKSB7CiAgICAvLyBQb3J0cmFpdCBpcyBwbGF5YWJsZTsga2VlcCBvdmVybGF5IGhpZGRlbiAobGFuZHNjYXBlIGxvY2sgc3RpbGwgYXR0ZW1wdGVkKS4KICAgIGlmICghcm90YXRlRWwpIHJldHVybjsKICAgIHJvdGF0ZUVsLmhpZGRlbiA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBsb2NrTGFuZHNjYXBlKCkgewogICAgdHJ5IHsKICAgICAgaWYgKHNjcmVlbi5vcmllbnRhdGlvbiAmJiBzY3JlZW4ub3JpZW50YXRpb24ubG9jaykgewogICAgICAgIHZhciBwID0gc2NyZWVuLm9yaWVudGF0aW9uLmxvY2soImxhbmRzY2FwZSIpOwogICAgICAgIGlmIChwICYmIHAuY2F0Y2gpIHAuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gZml0Q2FudmFzKCkgewogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGggfHwgMzIwLCB2aCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAxODA7CiAgICAvLyBUaXRsZS9sYXVuY2gvcGxheSBhbGwgZmlsbCB0aGUgdmlld3BvcnQgKG5vIGxldHRlcmJveGVkIHNxdWFyZSkuCiAgICB2YXIgc3RhZ2UgPSAkKCJjbS1zdGFnZSIpOwogICAgdmFyIGN3LCBjaDsKICAgIGN3ID0gTWF0aC5tYXgoMTYwLCBNYXRoLmZsb29yKHZ3KSk7CiAgICBjaCA9IE1hdGgubWF4KDE2MCwgTWF0aC5mbG9vcih2aCkpOwogICAgY2FudmFzLnN0eWxlLndpZHRoID0gY3cgKyAicHgiOwogICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGNoICsgInB4IjsKICAgIGlmIChzdGFnZSkgewogICAgICBzdGFnZS5zdHlsZS53aWR0aCA9IGN3ICsgInB4IjsKICAgICAgc3RhZ2Uuc3R5bGUuaGVpZ2h0ID0gY2ggKyAicHgiOwogICAgICBzdGFnZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgIHN0YWdlLnN0eWxlLmxlZnQgPSAiMHB4IjsKICAgICAgc3RhZ2Uuc3R5bGUudG9wID0gIjBweCI7CiAgICAgIHN0YWdlLnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgICAgc3RhZ2Uuc3R5bGUubWF4V2lkdGggPSAibm9uZSI7CiAgICAgIHN0YWdlLnN0eWxlLm1heEhlaWdodCA9ICJub25lIjsKICAgIH0KICAgIHZhciBkcHIgPSBNYXRoLm1pbigyLjUsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpOwogICAgdmFyIG53ID0gTWF0aC5tYXgoMTYwLCBNYXRoLmZsb29yKGN3ICogZHByKSk7CiAgICB2YXIgbmggPSBNYXRoLm1heCgxNjAsIE1hdGguZmxvb3IoY2ggKiBkcHIpKTsKICAgIC8vIExheW91dCBtYXRoIHN0YXlzIGluIENTUyBwaXhlbHM7IGJhY2tpbmcgc3RvcmUgaXMgRFBSLXNjYWxlZAogICAgVyA9IGN3OwogICAgSCA9IGNoOwogICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gbncgfHwgY2FudmFzLmhlaWdodCAhPT0gbmgpIHsKICAgICAgY2FudmFzLndpZHRoID0gbnc7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBuaDsKICAgIH0KICAgIHRyeSB7IGN0eC5zZXRUcmFuc2Zvcm0oZHByLCAwLCAwLCBkcHIsIDAsIDApOyB9IGNhdGNoIChlVCkge30KICAgIGxheW91dFBsYXlmaWVsZCgpOwogICAgcGxhY2VTaWRlQnV0dG9ucyhjdywgY2gsIHZ3LCB2aCk7CiAgICB1cGRhdGVSb3RhdGUoKTsKICB9CgogIGZ1bmN0aW9uIHBsYWNlU2lkZUJ1dHRvbnMoY3csIGNoLCB2dywgdmgpIHsKICAgIHZhciBwbGF5aW5nID0gc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gInBhdXNlIiB8fCBzdGF0ZSA9PT0gImxldmVsIiB8fCBzdGF0ZSA9PT0gIndpbiIgfHwgc3RhdGUgPT09ICJsb3NlIjsKICAgIHZhciBvbiA9ICEhKGFwcEVsICYmIGFwcEVsLmNsYXNzTGlzdC5jb250YWlucygiY20tcGxheWluZyIpKSB8fCBtb2JpbGVQbGF5IHx8IHBsYXlpbmc7CiAgICBpZiAoZXhpdEJ0bikgZXhpdEJ0bi5oaWRkZW4gPSAhb247CiAgICBpZiAocGF1c2VCdG4pIHBhdXNlQnRuLmhpZGRlbiA9ICEob24gJiYgKHN0YXRlID09PSAicGxheSIgfHwgc3RhdGUgPT09ICJwYXVzZSIpKTsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9ICEob24gJiYgKHN0YXRlID09PSAicGxheSIgfHwgc3RhdGUgPT09ICJwYXVzZSIgfHwgc3RhdGUgPT09ICJsZXZlbCIpKTsKICAgIGlmIChhcnRCdG4pIGFydEJ0bi5oaWRkZW4gPSAhKG9uICYmIChzdGF0ZSA9PT0gInBsYXkiIHx8IHN0YXRlID09PSAicGF1c2UiIHx8IHN0YXRlID09PSAibGV2ZWwiKSk7CiAgICBpZiAoYW5pbUJ0bikgYW5pbUJ0bi5oaWRkZW4gPSAhKG9uICYmIChzdGF0ZSA9PT0gInBsYXkiIHx8IHN0YXRlID09PSAicGF1c2UiIHx8IHN0YXRlID09PSAibGV2ZWwiKSk7CiAgICBpZiAoIW9uKSB7CiAgICAgIGlmIChhcnRCdG4pIGFydEJ0bi5oaWRkZW4gPSB0cnVlOwogICAgICBpZiAoYW5pbUJ0bikgYW5pbUJ0bi5oaWRkZW4gPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gRXhpdCAvIFBhdXNlOiB0b3AtcmlnaHQgY2hyb21lIGNvcm5lciAob3ZlciBIVUQgZWRnZSwgbm90IGZsb2F0aW5nIGluIGVtcHR5IG1hcmdpbikKICAgIGlmIChleGl0QnRuKSB7CiAgICAgIGV4aXRCdG4uc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOwogICAgICBleGl0QnRuLnN0eWxlLnRvcCA9ICI2cHgiOwogICAgICBleGl0QnRuLnN0eWxlLnJpZ2h0ID0gIjZweCI7CiAgICAgIGV4aXRCdG4uc3R5bGUubGVmdCA9ICJhdXRvIjsKICAgICAgZXhpdEJ0bi5zdHlsZS5ib3R0b20gPSAiYXV0byI7CiAgICB9CiAgICBpZiAocGF1c2VCdG4pIHsKICAgICAgcGF1c2VCdG4uc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOwogICAgICBwYXVzZUJ0bi5zdHlsZS50b3AgPSAiNnB4IjsKICAgICAgcGF1c2VCdG4uc3R5bGUucmlnaHQgPSAiNTZweCI7CiAgICAgIHBhdXNlQnRuLnN0eWxlLmxlZnQgPSAiYXV0byI7CiAgICAgIHBhdXNlQnRuLnN0eWxlLmJvdHRvbSA9ICJhdXRvIjsKICAgIH0KCiAgICAvLyBIaW50ICsgQW5pbWF0ZSArIGNhdC1oZWFkOiBob3Jpem9udGFsIGNsdXN0ZXIgdW5kZXIvIGJlc2lkZSBib2FyZCAobmV2ZXIgb3ZlciB0aWxlcykKICAgIHZhciBoaW50TGVmdCA9IDAsIGhpbnRUb3AgPSAwLCBoaW50V2NzcyA9IDAsIGhpbnRIY3NzID0gMDsKICAgIHZhciByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHN4ID0gcmVjdC53aWR0aCAvIFc7CiAgICB2YXIgc3kgPSByZWN0LmhlaWdodCAvIEg7CiAgICB2YXIgYm9hcmRMZWZ0ID0gcmVjdC5sZWZ0ICsgYm9hcmRYICogc3g7CiAgICB2YXIgYm9hcmRSaWdodCA9IHJlY3QubGVmdCArIChib2FyZFggKyBib2FyZFcpICogc3g7CiAgICB2YXIgYm9hcmRUb3AgPSByZWN0LnRvcCArIGJvYXJkWSAqIHN5OwogICAgdmFyIGJvYXJkQm90ID0gcmVjdC50b3AgKyAoYm9hcmRZICsgYm9hcmRIKSAqIHN5OwogICAgZnVuY3Rpb24gb3ZlcmxhcHNCb2FyZChieCwgYnksIGJ3LCBiaCkgewogICAgICByZXR1cm4gYnggPCBib2FyZFJpZ2h0IC0gMiAmJiAoYnggKyBidykgPiBib2FyZExlZnQgKyAyICYmIGJ5IDwgYm9hcmRCb3QgLSAyICYmIChieSArIGJoKSA+IGJvYXJkVG9wICsgMjsKICAgIH0KICAgIGZ1bmN0aW9uIGNsYW1wQm94KGJ4LCBieSwgYncsIGJoKSB7CiAgICAgIGlmIChieCA8IDQpIGJ4ID0gNDsKICAgICAgaWYgKGJ5IDwgNCkgYnkgPSA0OwogICAgICBpZiAoYnggKyBidyA+IHZ3IC0gNCkgYnggPSBNYXRoLm1heCg0LCBNYXRoLmZsb29yKHZ3IC0gYncgLSA0KSk7CiAgICAgIGlmIChieSArIGJoID4gdmggLSA0KSBieSA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IodmggLSBiaCAtIDQpKTsKICAgICAgLy8gUHJlZmVyIHB1c2hpbmcgYmVsb3cgdGhlIGJvYXJkIGlmIHN0aWxsIG92ZXJsYXBwaW5nIHRpbGVzCiAgICAgIGlmIChvdmVybGFwc0JvYXJkKGJ4LCBieSwgYncsIGJoKSkgewogICAgICAgIGJ5ID0gTWF0aC5mbG9vcihib2FyZEJvdCArIDYpOwogICAgICAgIGlmIChieSArIGJoID4gdmggLSA0KSBieSA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IodmggLSBiaCAtIDQpKTsKICAgICAgfQogICAgICBpZiAob3ZlcmxhcHNCb2FyZChieCwgYnksIGJ3LCBiaCkpIHsKICAgICAgICBieCA9IE1hdGguZmxvb3IoYm9hcmRSaWdodCArIDQpOwogICAgICAgIGlmIChieCArIGJ3ID4gdncgLSA0KSBieCA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IodncgLSBidyAtIDQpKTsKICAgICAgICBieSA9IE1hdGguZmxvb3IoTWF0aC5taW4oYnksIGJvYXJkQm90IC0gYmggLSA0KSk7CiAgICAgICAgaWYgKGJ5IDwgNCkgYnkgPSA0OwogICAgICB9CiAgICAgIHJldHVybiB7eDogYngsIHk6IGJ5fTsKICAgIH0KICAgIGlmIChoaW50QnRuKSB7CiAgICAgIHZhciBoeCA9IHJlY3QubGVmdCArIGhpbnRBbmNob3IueCAqIHN4OwogICAgICB2YXIgaHkgPSByZWN0LnRvcCArIGhpbnRBbmNob3IueSAqIHN5OwogICAgICB2YXIgaHcgPSBNYXRoLm1heCg0OCwgaGludEFuY2hvci53ICogc3gpOwogICAgICB2YXIgaGggPSBNYXRoLm1heCg0OCwgaGludEFuY2hvci5oICogc3kpOwogICAgICBoaW50QnRuLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgaGludEJ0bi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IoaHcpICsgInB4IjsKICAgICAgaGludEJ0bi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKGhoKSArICJweCI7CiAgICAgIGhpbnRCdG4uc3R5bGUubWluV2lkdGggPSAiNDhweCI7CiAgICAgIGhpbnRCdG4uc3R5bGUubWluSGVpZ2h0ID0gIjQ4cHgiOwogICAgICBoaW50QnRuLnN0eWxlLnBhZGRpbmcgPSAiMCAxMnB4IjsKICAgICAgaGludEJ0bi5zdHlsZS5ib3hTaXppbmcgPSAiYm9yZGVyLWJveCI7CiAgICAgIHZhciBsZWZ0ID0gTWF0aC5mbG9vcihoeCk7CiAgICAgIHZhciB0b3AgPSBNYXRoLmZsb29yKGh5KTsKICAgICAgdmFyIGhiID0gY2xhbXBCb3gobGVmdCwgdG9wLCBodywgaGgpOwogICAgICBsZWZ0ID0gaGIueDsgdG9wID0gaGIueTsKICAgICAgaGludEJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGhpbnRCdG4uc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgICAgaGludEJ0bi5zdHlsZS5yaWdodCA9ICJhdXRvIjsKICAgICAgaGludEJ0bi5zdHlsZS5ib3R0b20gPSAiYXV0byI7CiAgICAgIGhpbnRCdG4uc3R5bGUuZm9udFNpemUgPSBNYXRoLm1heCgxNCwgTWF0aC5mbG9vcihoaCAqIDAuMzQpKSArICJweCI7CiAgICAgIGhpbnRMZWZ0ID0gbGVmdDsgaGludFRvcCA9IHRvcDsgaGludFdjc3MgPSBodzsgaGludEhjc3MgPSBoaDsKICAgIH0KICAgIGlmIChhcnRCdG4gJiYgaGludEJ0biAmJiAhaGludEJ0bi5oaWRkZW4pIHsKICAgICAgdmFyIHNpemUgPSBNYXRoLm1heCg0OCwgTWF0aC5taW4oNjQsIE1hdGguZmxvb3IoaGludEhjc3MgfHwgNTIpKSk7CiAgICAgIHZhciBnYXBCID0gODsKICAgICAgdmFyIGFoID0gTWF0aC5tYXgoMzQsIE1hdGgubWluKDQyLCBNYXRoLmZsb29yKHNpemUgKiAwLjcyKSkpOwogICAgICB2YXIgYXcgPSBNYXRoLm1heCg2NCwgTWF0aC5mbG9vcihzaXplICogMS4zNSkpOwogICAgICB2YXIgcm93SCA9IE1hdGgubWF4KHNpemUsIGhpbnRIY3NzKTsKICAgICAgLy8gSG9yaXpvbnRhbCBjbHVzdGVyIGxlZnQgb2YgSGludDogW2FuaW1hdGVdIFthcnRdIFtIaW50XSwgc2FtZSByb3cgdW5kZXIgYm9hcmQKICAgICAgdmFyIGF4ID0gTWF0aC5mbG9vcihoaW50TGVmdCAtIGdhcEIgLSBzaXplKTsKICAgICAgdmFyIGF5ID0gTWF0aC5mbG9vcihoaW50VG9wICsgKHJvd0ggLSBzaXplKSAvIDIpOwogICAgICB2YXIgYXgyID0gTWF0aC5mbG9vcihheCAtIGdhcEIgLSBhdyk7CiAgICAgIHZhciBheTIgPSBNYXRoLmZsb29yKGhpbnRUb3AgKyAocm93SCAtIGFoKSAvIDIpOwogICAgICB2YXIgYWIgPSBjbGFtcEJveChheCwgYXksIHNpemUsIHNpemUpOwogICAgICBheCA9IGFiLng7IGF5ID0gYWIueTsKICAgICAgdmFyIG5iID0gY2xhbXBCb3goYXgyLCBheTIsIGF3LCBhaCk7CiAgICAgIGF4MiA9IG5iLng7IGF5MiA9IG5iLnk7CiAgICAgIC8vIElmIGNsYW1wIHB1c2hlZCB0aGVtIGFwYXJ0IG9kZGx5LCByZS1wYWNrIGxlZnQgb2YgSGludCBvbiB0aGUgc2FmZSByb3cKICAgICAgdmFyIHNhZmVUb3AgPSBNYXRoLm1heChoaW50VG9wLCBNYXRoLmZsb29yKGJvYXJkQm90ICsgNikpOwogICAgICBpZiAoc2FmZVRvcCArIHJvd0ggPiB2aCAtIDQpIHNhZmVUb3AgPSBNYXRoLm1heCg0LCBNYXRoLmZsb29yKHZoIC0gcm93SCAtIDQpKTsKICAgICAgaWYgKG92ZXJsYXBzQm9hcmQoYXgsIGF5LCBzaXplLCBzaXplKSB8fCBvdmVybGFwc0JvYXJkKGF4MiwgYXkyLCBhdywgYWgpIHx8IGF4MiA8IDQpIHsKICAgICAgICBheSA9IE1hdGguZmxvb3Ioc2FmZVRvcCArIChyb3dIIC0gc2l6ZSkgLyAyKTsKICAgICAgICBheTIgPSBNYXRoLmZsb29yKHNhZmVUb3AgKyAocm93SCAtIGFoKSAvIDIpOwogICAgICAgIGF4ID0gTWF0aC5mbG9vcihoaW50TGVmdCAtIGdhcEIgLSBzaXplKTsKICAgICAgICBheDIgPSBNYXRoLmZsb29yKGF4IC0gZ2FwQiAtIGF3KTsKICAgICAgICBpZiAoYXgyIDwgNCkgewogICAgICAgICAgYXgyID0gNDsKICAgICAgICAgIGF4ID0gYXgyICsgYXcgKyBnYXBCOwogICAgICAgIH0KICAgICAgICBoaW50QnRuLnN0eWxlLnRvcCA9IHNhZmVUb3AgKyAicHgiOwogICAgICAgIGhpbnRUb3AgPSBzYWZlVG9wOwogICAgICB9CiAgICAgIGFydEJ0bi5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgIGFydEJ0bi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3Ioc2l6ZSkgKyAicHgiOwogICAgICBhcnRCdG4uc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcihzaXplKSArICJweCI7CiAgICAgIGFydEJ0bi5zdHlsZS5sZWZ0ID0gYXggKyAicHgiOwogICAgICBhcnRCdG4uc3R5bGUudG9wID0gYXkgKyAicHgiOwogICAgICBhcnRCdG4uc3R5bGUucmlnaHQgPSAiYXV0byI7CiAgICAgIGFydEJ0bi5zdHlsZS5ib3R0b20gPSAiYXV0byI7CiAgICAgIGlmIChhbmltQnRuKSB7CiAgICAgICAgYW5pbUJ0bi5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgICAgYW5pbUJ0bi5zdHlsZS53aWR0aCA9IGF3ICsgInB4IjsKICAgICAgICBhbmltQnRuLnN0eWxlLmhlaWdodCA9IGFoICsgInB4IjsKICAgICAgICBhbmltQnRuLnN0eWxlLmxlZnQgPSBheDIgKyAicHgiOwogICAgICAgIGFuaW1CdG4uc3R5bGUudG9wID0gYXkyICsgInB4IjsKICAgICAgICBhbmltQnRuLnN0eWxlLnJpZ2h0ID0gImF1dG8iOwogICAgICAgIGFuaW1CdG4uc3R5bGUuYm90dG9tID0gImF1dG8iOwogICAgICAgIGFuaW1CdG4uc3R5bGUuZm9udFNpemUgPSBNYXRoLm1heCgxMCwgTWF0aC5mbG9vcihhaCAqIDAuMzIpKSArICJweCI7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUhpbnRCdG4oKSB7CiAgICBpZiAoIWhpbnRCdG4pIHJldHVybjsKICAgIC8vIEFsd2F5cyAiSGludCIgLSBsaXQvdW5saXQgKGNtLWhpbnQtb24pIGlzIGVub3VnaDsgbmV2ZXIgc2hvdyBPTi9PRkYgdGV4dC4KICAgIGhpbnRCdG4udGV4dENvbnRlbnQgPSAiSGludCI7CiAgICBoaW50QnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgaGludHNPbiA\/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgaGludEJ0bi50aXRsZSA9IGhpbnRzT24gPyAiSGludHMgb24iIDogIkhpbnRzIG9mZiI7CiAgICBpZiAoaGludHNPbikgaGludEJ0bi5jbGFzc0xpc3QuYWRkKCJjbS1oaW50LW9uIik7CiAgICBlbHNlIGhpbnRCdG4uY2xhc3NMaXN0LnJlbW92ZSgiY20taGludC1vbiIpOwogIH0KCiAgZnVuY3Rpb24gc2V0SGludHMob24pIHsKICAgIGhpbnRzT24gPSAhIW9uOwogICAgaWYgKGhpbnRzT24pIGhpbnRDZWxscyA9IGZpbmRIaW50KCk7CiAgICBlbHNlIGhpbnRDZWxscyA9IG51bGw7CiAgICB1cGRhdGVIaW50QnRuKCk7CiAgfQoKICBmdW5jdGlvbiBlbnRlclBsYXlNb2RlKCkgewogICAgbW9iaWxlUGxheSA9IGlzTW9iaWxlKCk7CiAgICBpZiAoYXBwRWwpIHsKICAgICAgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tcGxheWluZyIpOwogICAgICBpZiAobW9iaWxlUGxheSkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tbW9iaWxlIik7CiAgICB9CiAgICB0cnkgewogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY20tbm9zY3JvbGwiLCAiY20tYm9vdCIpOwogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNtLW5vc2Nyb2xsIiwgImNtLWJvb3QiKTsKICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApOwogICAgfSBjYXRjaCAoZSkge30KICAgIHZhciBlbCA9IGFwcEVsOwogICAgdmFyIHJlcSA9IGVsICYmIChlbC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBlbC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbiB8fCBlbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbik7CiAgICBmdW5jdGlvbiBmYWxsYmFjaygpIHsKICAgICAgZnNGYWxsYmFjayA9IHRydWU7CiAgICAgIGlmIChhcHBFbCkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tZmFsbGJhY2siKTsKICAgICAgZml0Q2FudmFzKCk7CiAgICB9CiAgICBpZiAocmVxKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldCA9IHJlcS5jYWxsKGVsKTsKICAgICAgICBpZiAocmV0ICYmIHR5cGVvZiByZXQudGhlbiA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgcmV0LnRoZW4oZnVuY3Rpb24gKCkgeyBsb2NrTGFuZHNjYXBlKCk7IGZpdENhbnZhcygpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGZhbGxiYWNrKCk7IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsb2NrTGFuZHNjYXBlKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlMikgeyBmYWxsYmFjaygpOyB9CiAgICB9IGVsc2UgaWYgKG1vYmlsZVBsYXkpIHsKICAgICAgZmFsbGJhY2soKTsKICAgIH0KICAgIGxvY2tMYW5kc2NhcGUoKTsKICAgIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoZXhpdEJ0bikgZXhpdEJ0bi5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKGFydEJ0bikgYXJ0QnRuLmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKGFuaW1CdG4pIGFuaW1CdG4uaGlkZGVuID0gZmFsc2U7CiAgICB1cGRhdGVIaW50QnRuKCk7CiAgICB1cGRhdGVBcnRCdG4oKTsKICAgIHVwZGF0ZUFuaW1CdG4oKTsKICAgIGZpdENhbnZhcygpOwogICAgc2V0VGltZW91dChmaXRDYW52YXMsIDgwKTsKICAgIHNldFRpbWVvdXQoZml0Q2FudmFzLCA0NTApOwogICAgdXBkYXRlUm90YXRlKCk7CiAgfQoKICBmdW5jdGlvbiBleGl0UGxheU1vZGUoKSB7CiAgICBtb2JpbGVQbGF5ID0gZmFsc2U7CiAgICB2YXIgZXggPSBkb2N1bWVudC5leGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuOwogICAgaWYgKGlzRnNBY3RpdmUoKSAmJiBleCkgewogICAgICB0cnkgeyB2YXIgciA9IGV4LmNhbGwoZG9jdW1lbnQpOyBpZiAociAmJiByLmNhdGNoKSByLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsgfSBjYXRjaCAoZTApIHt9CiAgICB9CiAgICBmc0ZhbGxiYWNrID0gZmFsc2U7CiAgICBpZiAoYXBwRWwpIGFwcEVsLmNsYXNzTGlzdC5yZW1vdmUoImNtLXBsYXlpbmciLCAiY20tbW9iaWxlIiwgImNtLWZhbGxiYWNrIik7CiAgICB0cnkgewogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgiY20tbm9zY3JvbGwiKTsKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjbS1ub3Njcm9sbCIpOwogICAgfSBjYXRjaCAoZSkge30KICAgIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uaGlkZGVuID0gdHJ1ZTsKICAgIGlmIChleGl0QnRuKSBleGl0QnRuLmhpZGRlbiA9IHRydWU7CiAgICBpZiAoaGludEJ0bikgaGludEJ0bi5oaWRkZW4gPSB0cnVlOwogICAgaWYgKGFydEJ0bikgYXJ0QnRuLmhpZGRlbiA9IHRydWU7CiAgICBpZiAoYW5pbUJ0bikgYW5pbUJ0bi5oaWRkZW4gPSB0cnVlOwogICAgc2V0SGludHMoZmFsc2UpOwogICAgZml0Q2FudmFzKCk7CiAgfQoKICBmdW5jdGlvbiBpZGxlUGFjZU11bCgpIHsKICAgIC8vIENhbG0gaWRsZSBwYWNlOiBtaWxkIGppdHRlciBvbmx5LiAodjllL3Y5ZiB1c2VkIDgvMTZ4IG9uIGFscmVhZHktbG9uZwogICAgLy8gYmFzZXMsIHByb2R1Y2luZyAxLTcrIG1pbnV0ZSBnYXBzIHRoYXQgbG9va2VkIGxpa2UgYW5pbXMgd2VyZSBzdHVjayBPRkYuKQogICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIDwgMC4yNSkgPyAxLjM1IDogMTsKICB9CgogIGZ1bmN0aW9uIGlkbGVHYXBEZWxheSgpIHsKICAgIC8vIFBlci10aWxlIGdhcCB+Ni0yMnMgc28gZmFjZXMgcmVhZCBhcyBpZGxlLCBub3QgZnJvemVuLgogICAgdmFyIG11bCA9IGlkbGVQYWNlTXVsKCk7CiAgICByZXR1cm4gKDYgKyBNYXRoLnJhbmRvbSgpICogMTApICogbXVsICsgTWF0aC5yYW5kb20oKSAqIDQgKiBtdWw7CiAgfQoKICBmdW5jdGlvbiBwaWNrSWRsZUZhY2UoKSB7CiAgICAvLyBIb2xkIGR1cmF0aW9ucyBzdGF5IHJlYWRhYmxlOyBnYXBzIGNhbG0gd2l0aCBsaWdodCBqaXR0ZXIuCiAgICB2YXIgbXVsID0gaWRsZVBhY2VNdWwoKTsKICAgIHZhciByb2xsID0gTWF0aC5yYW5kb20oKTsKICAgIHZhciBleHRyYSA9ICgxICsgTWF0aC5yYW5kb20oKSAqIDQpICogbXVsOwogICAgaWYgKHJvbGwgPCAwLjAxNSkgcmV0dXJuIHtmYWNlOiAibGljayIsIGR1cjogMS40ICsgTWF0aC5yYW5kb20oKSAqIDAuNywgZ2FwOiAoMTQgKyBNYXRoLnJhbmRvbSgpICogMTYpICogbXVsICsgZXh0cmF9OwogICAgaWYgKHJvbGwgPCAwLjA4KSByZXR1cm4ge2ZhY2U6ICJub3NlIiwgZHVyOiAyLjAgKyBNYXRoLnJhbmRvbSgpICogMS4yLCBnYXA6ICgxMiArIE1hdGgucmFuZG9tKCkgKiAxNCkgKiBtdWwgKyBleHRyYX07CiAgICBpZiAocm9sbCA8IDAuMjgpIHJldHVybiB7ZmFjZTogInJlc3QiLCBkdXI6IDIuOCArIE1hdGgucmFuZG9tKCkgKiAyLjQsIGdhcDogKDkgKyBNYXRoLnJhbmRvbSgpICogMTIpICogbXVsICsgZXh0cmF9OwogICAgaWYgKHJvbGwgPCAwLjQyKSByZXR1cm4ge2ZhY2U6ICJqb3lmdWwiLCBkdXI6IDEuMSArIE1hdGgucmFuZG9tKCkgKiAwLjcsIGdhcDogKDEwICsgTWF0aC5yYW5kb20oKSAqIDEyKSAqIG11bCArIGV4dHJhfTsKICAgIGlmIChyb2xsIDwgMC41KSByZXR1cm4ge2ZhY2U6ICJhbmdyeSIsIGR1cjogMS4wICsgTWF0aC5yYW5kb20oKSAqIDAuNiwgZ2FwOiAoMTAgKyBNYXRoLnJhbmRvbSgpICogMTIpICogbXVsICsgZXh0cmF9OwogICAgaWYgKHJvbGwgPCAwLjYyKSByZXR1cm4ge2ZhY2U6ICJzdXJwcmlzZSIsIGR1cjogMC45ICsgTWF0aC5yYW5kb20oKSAqIDAuNTUsIGdhcDogKDkgKyBNYXRoLnJhbmRvbSgpICogMTEpICogbXVsICsgZXh0cmF9OwogICAgcmV0dXJuIHtmYWNlOiAid2luayIsIGR1cjogMC45ICsgTWF0aC5yYW5kb20oKSAqIDAuNTUsIGdhcDogKDExICsgTWF0aC5yYW5kb20oKSAqIDE0KSAqIG11bCArIGV4dHJhfTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyRmFjZUFuaW1zKCkgewogICAgaWYgKCFncmlkLmxlbmd0aCkgcmV0dXJuOwogICAgZm9yICh2YXIgciA9IDA7IHIgPCBHUklEOyByKyspIHsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdGlsZSA9IGdyaWRbcl1bY107CiAgICAgICAgdGlsZS5mYWNlID0gbnVsbDsKICAgICAgICB0aWxlLmZhY2VVbnRpbCA9IDA7CiAgICAgICAgdGlsZS53aW5rVW50aWwgPSAwOwogICAgICAgIC8vIFJlc2V0IHNjaGVkdWxlIHNvIEFuaW1hdGUgT04gY2FuIHJlc3RhcnQgc29vbiAobm90IHN0dWNrIG9uIG9sZCBmYXIgdGltZXJzKS4KICAgICAgICB0aWxlLm5leHRGYWNlID0gMDsKICAgICAgICB0aWxlLm5leHRXaW5rID0gMDsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2NoZWR1bGVJZGxlRmFjZXNTb29uKCkgewogICAgaWYgKCFncmlkLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMDsKICAgIGZvciAodmFyIHIgPSAwOyByIDwgR1JJRDsgcisrKSB7CiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgR1JJRDsgYysrKSB7CiAgICAgICAgdmFyIHRpbGUgPSBncmlkW3JdW2NdOwogICAgICAgIGlmICghdGlsZSB8fCB0aWxlLnR5cGUgPCAwKSBjb250aW51ZTsKICAgICAgICB0aWxlLm5leHRXaW5rID0gbm93ICsgMC44ICsgTWF0aC5yYW5kb20oKSAqIDMuNTsKICAgICAgICB0aWxlLm5leHRGYWNlID0gbm93ICsgMS4yICsgTWF0aC5yYW5kb20oKSAqIDU7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUFuaW1CdG4oKSB7CiAgICBpZiAoIWFuaW1CdG4pIHJldHVybjsKICAgIGFuaW1CdG4udGV4dENvbnRlbnQgPSAiYW5pbWF0ZSI7CiAgICBhbmltQnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgYW5pbU9uID8gInRydWUiIDogImZhbHNlIik7CiAgICBhbmltQnRuLnRpdGxlID0gYW5pbU9uID8gIkFuaW1hdGU6IE9OIiA6ICJBbmltYXRlOiBPRkYiOwogICAgYW5pbUJ0bi5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBhbmltT24gPyAiRmFjZSBhbmltYXRpb25zIG9uIiA6ICJGYWNlIGFuaW1hdGlvbnMgb2ZmIik7CiAgICBpZiAoYW5pbU9uKSBhbmltQnRuLmNsYXNzTGlzdC5hZGQoImNtLWFuaW0tb24iKTsKICAgIGVsc2UgYW5pbUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCJjbS1hbmltLW9uIik7CiAgfQoKICBmdW5jdGlvbiBzZXRBbmltT24ob24pIHsKICAgIGFuaW1PbiA9ICEhb247CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY2F0TWF0Y2hBbmltIiwgYW5pbU9uID8gIjEiIDogIjAiKTsgfSBjYXRjaCAoZVNldEEpIHt9CiAgICBpZiAoIWFuaW1PbikgY2xlYXJGYWNlQW5pbXMoKTsKICAgIGVsc2Ugc2NoZWR1bGVJZGxlRmFjZXNTb29uKCk7CiAgICB1cGRhdGVBbmltQnRuKCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVXaW5rcyhkdCkgewogICAgaWYgKCFncmlkLmxlbmd0aCB8fCAhYW5pbU9uKSByZXR1cm47CiAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgZm9yICh2YXIgciA9IDA7IHIgPCBHUklEOyByKyspIHsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdGlsZSA9IGdyaWRbcl1bY107CiAgICAgICAgaWYgKHRpbGUudHlwZSA8IDApIGNvbnRpbnVlOwogICAgICAgIGlmICh0aWxlLmZhY2VVbnRpbCAmJiBub3cgPj0gdGlsZS5mYWNlVW50aWwpIHsKICAgICAgICAgIHRpbGUuZmFjZSA9IG51bGw7CiAgICAgICAgICB0aWxlLmZhY2VVbnRpbCA9IDA7CiAgICAgICAgICB0aWxlLm5leHRGYWNlID0gbm93ICsgaWRsZUdhcERlbGF5KCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aWxlLndpbmtVbnRpbCAmJiBub3cgPj0gdGlsZS53aW5rVW50aWwpIHsKICAgICAgICAgIHRpbGUud2lua1VudGlsID0gMDsKICAgICAgICAgIHRpbGUubmV4dFdpbmsgPSBub3cgKyBpZGxlR2FwRGVsYXkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aWxlLmZhY2UgJiYgIXRpbGUud2lua1VudGlsICYmICF0aWxlLnBvcCkgewogICAgICAgICAgaWYgKCF0aWxlLm5leHRGYWNlKSB0aWxlLm5leHRGYWNlID0gbm93ICsgaWRsZUdhcERlbGF5KCk7CiAgICAgICAgICBpZiAobm93ID49IHRpbGUubmV4dEZhY2UpIHsKICAgICAgICAgICAgLy8gT2NjYXNpb25hbCBzaG9ydCBleHRyYSB3YWl0IChub3QgbXVsdGktbWludXRlKS4KICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjIyKSB7CiAgICAgICAgICAgICAgdGlsZS5uZXh0RmFjZSA9IG5vdyArIDEuMiArIE1hdGgucmFuZG9tKCkgKiAzLjU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIHBpY2sgPSBwaWNrSWRsZUZhY2UoKTsKICAgICAgICAgICAgICBpZiAocGljay5mYWNlID09PSAid2luayIpIHsKICAgICAgICAgICAgICAgIHRpbGUud2lua1VudGlsID0gbm93ICsgcGljay5kdXI7CiAgICAgICAgICAgICAgICB0aWxlLm5leHRXaW5rID0gbm93ICsgKHBpY2suZ2FwIHx8IGlkbGVHYXBEZWxheSgpKTsKICAgICAgICAgICAgICAgIHRpbGUubmV4dEZhY2UgPSBub3cgKyAocGljay5nYXAgfHwgaWRsZUdhcERlbGF5KCkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aWxlLmZhY2UgPSBwaWNrLmZhY2U7CiAgICAgICAgICAgICAgICB0aWxlLmZhY2VVbnRpbCA9IG5vdyArIHBpY2suZHVyOwogICAgICAgICAgICAgICAgdGlsZS5uZXh0RmFjZSA9IG5vdyArIChwaWNrLmdhcCB8fCBpZGxlR2FwRGVsYXkoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKCF0aWxlLm5leHRXaW5rKSB7CiAgICAgICAgICAgIHRpbGUubmV4dFdpbmsgPSBub3cgKyBpZGxlR2FwRGVsYXkoKTsKICAgICAgICAgIH0gZWxzZSBpZiAobm93ID49IHRpbGUubmV4dFdpbmsgJiYgTWF0aC5yYW5kb20oKSA8IDAuMTQpIHsKICAgICAgICAgICAgLy8gQ2xhc3NpYyB3aW5rIGJldHdlZW4gcmljaGVyIGZhY2VzCiAgICAgICAgICAgIHRpbGUud2lua1VudGlsID0gbm93ICsgMC44NSArIE1hdGgucmFuZG9tKCkgKiAwLjQ1OwogICAgICAgICAgICB0aWxlLm5leHRXaW5rID0gbm93ICsgaWRsZUdhcERlbGF5KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKiA9PT09PSBCVVRUT05TID09PT09ICovCiAgZnVuY3Rpb24gdHJ5U3RhcnRGcm9tVGl0bGUoKSB7CiAgICBpZiAoc3RhdGUgIT09ICJ0aXRsZSIpIHJldHVybiBmYWxzZTsKICAgIGlmICghc3ByaXRlc1JlYWR5IHx8IChzdGFydEJ0biAmJiBzdGFydEJ0bi5kaXNhYmxlZCkpIHJldHVybiBmYWxzZTsKICAgIGVudGVyUGxheU1vZGUoKTsKICAgIHNob3dMZXZlbEludHJvKDApOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHRyeVN0YXJ0RnJvbUxldmVsKCkgewogICAgaWYgKHN0YXRlICE9PSAibGV2ZWwiKSByZXR1cm4gZmFsc2U7CiAgICBzdGFydExldmVsKGxldmVsSW5kZXgpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIG9uT3ZlcmxheVRhcFN0YXJ0KGUpIHsKICAgIC8vIEZ1bGwtdmlld3BvcnQgdGFwL2NsaWNrIHN0YXJ0cyBvbiB0aXRsZSArIGxldmVsIGludHJvIG9ubHkuCiAgICAvLyBLZWVwIFBsYXkvR28gbGFiZWxzOyBlbXB0eSBhcmVhcyBvZiB0aGUgb3ZlcmxheSBhbHNvIHN0YXJ0LgogICAgaWYgKHN0YXRlICE9PSAidGl0bGUiICYmIHN0YXRlICE9PSAibGV2ZWwiKSByZXR1cm47CiAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQuY2xvc2VzdCkgewogICAgICB2YXIgb3RoZXIgPSBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24uY20tc21hbGwsICNjbS1leGl0LCAjY20tcGF1c2VidG4sICNjbS1oaW50YnRuLCAjY20tYXJ0YnRuLCAjY20tYW5pbWJ0biIpOwogICAgICBpZiAob3RoZXIpIHJldHVybjsKICAgIH0KICAgIGlmIChzdGF0ZSA9PT0gInRpdGxlIikgdHJ5U3RhcnRGcm9tVGl0bGUoKTsKICAgIGVsc2UgdHJ5U3RhcnRGcm9tTGV2ZWwoKTsKICB9CiAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgdHJ5U3RhcnRGcm9tVGl0bGUoKTsKICB9KTsKICBpZiAoJCgiY20tcGxheS1sZXZlbCIpKSAkKCJjbS1wbGF5LWxldmVsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHRyeVN0YXJ0RnJvbUxldmVsKCk7CiAgfSk7CiAgaWYgKG92ZXJsYXlFbCkgewogICAgb3ZlcmxheUVsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25PdmVybGF5VGFwU3RhcnQpOwogICAgb3ZlcmxheUVsLnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKICAgIG92ZXJsYXlFbC5zZXRBdHRyaWJ1dGUoInJvbGUiLCAiYnV0dG9uIik7CiAgICBvdmVybGF5RWwuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlRhcCBhbnl3aGVyZSB0byBwbGF5Iik7CiAgfQogIGlmIChuZXh0QnRuKSBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGxldmVsSW5kZXggKyAxIDwgTEVWRUxTLmxlbmd0aCkgc2hvd0xldmVsSW50cm8obGV2ZWxJbmRleCArIDEpOwogICAgZWxzZSB7CiAgICAgIHN0YXRlID0gInRpdGxlIjsKICAgICAgZXhpdFBsYXlNb2RlKCk7CiAgICAgIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgICB9CiAgfSk7CiAgaWYgKHJldHJ5QnRuKSByZXRyeUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc3RhcnRMZXZlbChsZXZlbEluZGV4KTsgfSk7CiAgaWYgKHJldHJ5TG9zZUJ0bikgcmV0cnlMb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzdGFydExldmVsKGxldmVsSW5kZXgpOyB9KTsKICBpZiAobWVudUJ0bikgbWVudUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXRlID0gInRpdGxlIjsKICAgIGV4aXRQbGF5TW9kZSgpOwogICAgc2hvd0NhcmQodGl0bGVDYXJkKTsKICB9KTsKICBpZiAoJCgiY20tbWVudS1sb3NlIikpICQoImNtLW1lbnUtbG9zZSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgc3RhdGUgPSAidGl0bGUiOwogICAgZXhpdFBsYXlNb2RlKCk7CiAgICBzaG93Q2FyZCh0aXRsZUNhcmQpOwogIH0pOwogIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoc3RhdGUgIT09ICJwbGF5IiB8fCBidXN5KSByZXR1cm47CiAgICBzdGF0ZSA9ICJwYXVzZSI7CiAgICBzaG93Q2FyZChwYXVzZUNhcmQpOwogIH0pOwogIGlmIChyZXN1bWVCdG4pIHJlc3VtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXRlID0gInBsYXkiOwogICAgaGlkZU92ZXJsYXkoKTsKICB9KTsKICBpZiAocmVzdGFydEJ0bikgcmVzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXJ0TGV2ZWwobGV2ZWxJbmRleCk7CiAgfSk7CiAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICBzdGF0ZSA9ICJ0aXRsZSI7CiAgICBleGl0UGxheU1vZGUoKTsKICAgIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgfSk7CgogIGlmIChoaW50QnRuKSBoaW50QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIHNldEhpbnRzKCFoaW50c09uKTsKICB9KTsKICBpZiAoYXJ0QnRuKSBhcnRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHNldFNpbXBsZU1vZGUoIXNpbXBsZU1vZGUpOwogIH0pOwogIGlmIChhbmltQnRuKSBhbmltQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzZXRBbmltT24oIWFuaW1Pbik7CiAgfSk7CgogIHdpbmRvdy5fX2NtRGVidWcgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZmFjZU4gPSAwLCB3aW5rTiA9IDA7CiAgICBpZiAoZ3JpZCAmJiBncmlkLmxlbmd0aCkgewogICAgICB2YXIgbm93RGJnID0gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgICBmb3IgKHZhciByciA9IDA7IHJyIDwgR1JJRDsgcnIrKykgewogICAgICAgIGZvciAodmFyIGNjID0gMDsgY2MgPCBHUklEOyBjYysrKSB7CiAgICAgICAgICB2YXIgdGQgPSBncmlkW3JyXVtjY107CiAgICAgICAgICBpZiAoIXRkIHx8IHRkLnR5cGUgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGlmICh0ZC5mYWNlICYmIHRkLmZhY2VVbnRpbCAmJiBub3dEYmcgPCB0ZC5mYWNlVW50aWwpIGZhY2VOKys7CiAgICAgICAgICBpZiAodGQud2lua1VudGlsICYmIG5vd0RiZyA8IHRkLndpbmtVbnRpbCkgd2lua04rKzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZlcnNpb246IFZFUlNJT04sCiAgICAgIFc6IFcsIEg6IEgsCiAgICAgIGNlbGxXOiBjZWxsVywgY2VsbEg6IGNlbGxILCBjZWxsOiBjZWxsLAogICAgICBib2FyZFg6IGJvYXJkWCwgYm9hcmRZOiBib2FyZFksIGJvYXJkVzogYm9hcmRXLCBib2FyZEg6IGJvYXJkSCwKICAgICAgaHVkTW9kZTogaHVkTW9kZSwKICAgICAgbGFuZHNjYXBlOiBXID49IEgsCiAgICAgIGFjdGl2ZVR5cGVzOiBhY3RpdmVUeXBlcy5zbGljZSgpLAogICAgICBoYXNIaW50OiBzdGF0ZSA9PT0gInBsYXkiID8gISFmaW5kSGludCgpIDogbnVsbCwKICAgICAgYm9hcmRGaWxsWDogYm9hcmRXIC8gTWF0aC5tYXgoMSwgVyksCiAgICAgIGJvYXJkRmlsbFk6IGJvYXJkSCAvIE1hdGgubWF4KDEsIEgpLAogICAgICBhc3BlY3Q6IGNlbGxXIC8gTWF0aC5tYXgoMSwgY2VsbEgpLAogICAgICBzaW1wbGVNb2RlOiBzaW1wbGVNb2RlLAogICAgICBhbmltT246IGFuaW1PbiwKICAgICAgZmFjZUFjdGl2ZTogZmFjZU4sCiAgICAgIHdpbmtBY3RpdmU6IHdpbmtOLAogICAgICBmbGFzaE1zZzogZmxhc2hNc2csCiAgICAgIGZsYXNoQ29tYm9OOiBmbGFzaENvbWJvTiwKICAgICAgY2F0bmlwQWxsb3dlZDogY2F0bmlwQWxsb3dlZCgpLAogICAgICBjYXRuaXBDb3VudDogY291bnRDYXRuaXBPbkJvYXJkKCksCiAgICAgIHZlcnNpb25TdGFtcDogVkVSU0lPTgogICAgfTsKICB9OwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBmaXRDYW52YXMpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsIGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmaXRDYW52YXMsIDI1MCk7IH0pOwogIGZ1bmN0aW9uIG9uRnNDaGFuZ2UoKSB7CiAgICBpZiAoIWlzRnNBY3RpdmUoKSAmJiBtb2JpbGVQbGF5ICYmICFmc0ZhbGxiYWNrKSB7CiAgICAgIC8vIHVzZXIgZXhpdGVkIGZ1bGxzY3JlZW46IGtlZXAgcGxheWluZyBpbiBmYWxsYmFjayBmaWxsCiAgICAgIGZzRmFsbGJhY2sgPSB0cnVlOwogICAgICBpZiAoYXBwRWwpIGFwcEVsLmNsYXNzTGlzdC5hZGQoImNtLWZhbGxiYWNrIik7CiAgICB9CiAgICBmaXRDYW52YXMoKTsKICB9CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZnVsbHNjcmVlbmNoYW5nZSIsIG9uRnNDaGFuZ2UpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBvbkZzQ2hhbmdlKTsKCiAgLy8gYm9vdAogIGlmIChzdGFydEJ0bikgewogICAgc3RhcnRCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgc3RhcnRCdG4udGV4dENvbnRlbnQgPSAiTG9hZGluZyI7CiAgfQogIHVwZGF0ZUhpbnRCdG4oKTsKICB1cGRhdGVBcnRCdG4oKTsKICB1cGRhdGVBbmltQnRuKCk7CiAgLy8gTGF1bmNoL3RpdGxlIGZpbGxzIHRoZSB2aWV3cG9ydCBhdXRvbWF0aWNhbGx5IChzYW1lIGZpbGwgYXMgcGxheSkuCiAgaWYgKGFwcEVsKSBhcHBFbC5jbGFzc0xpc3QuYWRkKCJjbS1mYWxsYmFjayIpOwogIHRyeSB7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY20tbm9zY3JvbGwiLCAiY20tYm9vdCIpOwogICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY20tbm9zY3JvbGwiLCAiY20tYm9vdCIpOwogIH0gY2F0Y2ggKGVCb290KSB7fQogIGxvYWRBdGxhcygpOwogIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgZml0Q2FudmFzKCk7CiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsKfSkoKTsK\");\n  document.body.appendChild(el);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>X II Hint animate &#8635; Turn your phone sideways Landscape fits more board. Portrait works too. Cat Match Version 9.5 What: A cozy match-3. Swap cute cats, make combos, clear boxes, and free kittens. Goal: Beat each level&#8217;s objective before you run out of moves. Match 4 for stripes, 5 for rainbow, T\/L for bombs. [&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-337","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/337","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=337"}],"version-history":[{"count":5,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/337\/revisions"}],"predecessor-version":[{"id":363,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/337\/revisions\/363"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}