{"id":382675,"date":"2026-05-31T16:54:26","date_gmt":"2026-05-31T19:54:26","guid":{"rendered":"https:\/\/mkt.estrategia.com\/militares\/?page_id=382675"},"modified":"2026-06-10T15:11:08","modified_gmt":"2026-06-10T18:11:08","slug":"bolao","status":"publish","type":"page","link":"https:\/\/mkt.estrategia.com\/militares\/bolao\/","title":{"rendered":"Bol\u00e3o da Coruja"},"content":{"rendered":"\n<div class=\"lp-reset\" style=\"display:contents\">\n<style id=\"lp-divi-reset\">\n\/* ============================================================\n   RESET CAN\u00d4NICO \u2014 Divi\/estrategia_gratis (MIL + EV)\n   Aplicar em TODA LP standalone publicada no WP Estrat\u00e9gia.\n   Origem: page 382382 (MIL EsPCEx) + 377366 (EV Medicina) \u2014 maio\/2026\n   ============================================================ *\/\n\n\/* \u2500\u2500 1. Esconde wrappers visuais do tema \u2500\u2500 *\/\n#main-header,\n#main-footer,\n#footer-info,\n#et-secondary-nav,\nheader.et-l,\n.et_pb_section_0_tb_header,\n#wpadminbar,\n#top-header,\n#et-top-navigation,\n#et-secondary-menu,\n#footer-widgets,\n#footer-bottom,\n#et-main-area > footer,\n.mobile_nav,\n.mobile_menu_bar,\n#et_mobile_nav_menu,\n#et-info,\n.main_title,\n.post-meta,\n.et_post_meta_wrapper,\n.nav_container,\n.et_search_outer { display: none !important; }\n\n\/* \u2500\u2500 2. CRITICAL \u2014 libera scroll travado pelo et_smooth_scroll\n       Sem isto a p\u00e1gina fica BRANCA abaixo do header. \u2500\u2500 *\/\nhtml, body {\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow-x: hidden !important;\n  overflow-y: auto !important;\n  scroll-behavior: auto !important;\n  -webkit-overflow-scrolling: touch !important;\n  height: auto !important;\n  background: #ffffff !important;\n}\n.et_smooth_scroll_disabled #page-container,\n.et_smooth_scroll_disabled,\n#page-container,\n#et-main-area,\n#et-boc {\n  overflow: visible !important;\n  height: auto !important;\n}\n#page-container { background: #ffffff !important; }\n\n\/* \u2500\u2500 3. For\u00e7a fullwidth nos wrappers Divi\/estrategia_gratis \u2500\u2500 *\/\n#page-container,\n#et-main-area,\n#primary-content,\n#main-content,\n#main-content > .container,\n#content-area,\n#left-area,\narticle.type-page,\n.entry-content,\n.et_pb_section,\n.et_pb_row,\n.et_pb_column,\n.et_pb_text,\n.et_pb_text_inner,\n.et_pb_module {\n  width: 100% !important;\n  max-width: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  float: none !important;\n  background: transparent !important;\n  box-shadow: none !important;\n}\n#content-area.clearfix,\n#main-content > .container.clearfix { display: block !important; }\n\n\/* \u2500\u2500 4. Bypass visual do wpautop residual \u2500\u2500 *\/\n.entry-content > p:empty { display: none !important; }\n.entry-content > p { margin: 0 !important; padding: 0 !important; }\n.entry-content > br { display: none !important; }\n\n\/* \u2500\u2500 5. Remove linha vertical cinza injetada por\n       .container::before\/::after do tema Divi \u2500\u2500 *\/\n#page-container .container::before,\n#page-container .container::after,\n.entry-content .container::before,\n.entry-content .container::after,\n#left-area .container::before,\n#left-area .container::after,\narticle.type-page .container::before,\narticle.type-page .container::after {\n  display: none !important;\n  content: none !important;\n  background: transparent !important;\n  width: 0 !important;\n  height: 0 !important;\n  border: 0 !important;\n}\n\n\n<\/style>\n<\/div>\n<div class=\"lp-head-assets\" style=\"display:contents\">\n<script>document.documentElement.className='js';<\/script>\n<link rel=\"icon\" href=\"data:image\/svg+xml,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 64 64'>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link rel=\"preload\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&#038;family=Hanken+Grotesk:wght@400;700&#038;display=swap\" as=\"style\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&#038;family=Hanken+Grotesk:wght@400;700&#038;display=swap\" rel=\"stylesheet\">\n<style id=\"bolao-css\">\n:root{--bg:#ffffff;--bg-soft:#f3f9f6;--bg-mute:#eaf4ef;--ink:#0b201a;--ink-2:#1d3a31;--mut:#5c756b;--mut-2:#6b7d72;--line:#e3ede9;--line-2:#d2e0da;--teal:#0e8e70;--teal-d:#0a6c55;--teal-x:#13a684;--teal-deep:#06352a;--teal-deeper:#04261e;--teal-tint:#e6f4ef;--teal-tint-2:#d3ebe2;--gold:#e3a51f;--gold-d:#b9821a;--gold-deep:#5a4209;--gold-tint:#fbf2da;--red:#d6453f;--red-tint:#fbeaea;--green:#1f9d63;--ev:#e46c00;--ev-d:#b85700;--ev-x:#ff8520;--ev-deep:#5a2a00;--ev-tint:#fdecd9;--ev-tint-2:#f9d7b0;--bra-a:#009b3a;--bra-b:#ffdf00;--fra-a:#0a4ea2;--fra-b:#ec3b43;--arg-a:#74acdc;--arg-b:#2f74b5;--esp-a:#c8102e;--esp-b:#f1bf00;--shadow-xs:0 1px 2px rgba(11,32,26,.05);--shadow:0 1px 2px rgba(11,32,26,.04),0 10px 30px rgba(11,32,26,.07);--shadow-lg:0 18px 50px rgba(10,108,84,.16);--shadow-gold:0 18px 44px rgba(184,130,26,.22);--r:14px;--r-lg:20px;--r-xl:26px;--maxw:1140px}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-family:'Hanken Grotesk',system-ui,sans-serif;background:var(--bg);color:var(--ink);line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow-x:hidden}.dsp{font-family:'Bricolage Grotesque',sans-serif;font-weight:800;letter-spacing:-.022em;line-height:1.02}a{color:inherit;text-decoration:none}img{display:block;max-width:100%}.wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}section{padding:84px 0;position:relative}@media(max-width:780px){section{padding:60px 0}}.eyebrow{display:inline-flex;align-items:center;gap:9px;font-size:12px;letter-spacing:.18em;text-transform:uppercase;font-weight:800;color:var(--teal)}.eyebrow::before{content:\"\";width:22px;height:2px;background:linear-gradient(90deg,var(--gold) 0%,var(--gold) 55%,var(--ev) 55%,var(--ev) 100%);border-radius:2px}section:nth-of-type(even) .eyebrow{color:var(--ev-d)}section:nth-of-type(even) .eyebrow::before{background:linear-gradient(90deg,var(--ev) 0%,var(--ev-x) 100%)}.h2{font-size:clamp(30px,4.8vw,46px);margin:14px 0 14px;color:var(--ink)}.lead{color:var(--mut);font-size:clamp(16px,1.6vw,18px);max-width:660px}.js .reveal{opacity:0;transform:translateY(22px);transition:.7s cubic-bezier(.2,.7,.2,1)}.js .reveal.vis{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){.js .reveal{opacity:1;transform:none;transition:none}}html{scroll-padding-top:78px}body{padding-top:68px !important}@media(max-width:880px){body{padding-top:72px !important}}nav:not(.as-nav){position:fixed;top:0;left:0;right:0;z-index:60;background:linear-gradient(100deg,var(--teal-deep) 0%,var(--teal-d) 38%,#6a2d00 78%,var(--ev-d) 100%),linear-gradient(180deg,var(--teal-deep),var(--teal-d));box-shadow:0 1px 0 rgba(255,255,255,.06),0 6px 26px rgba(4,38,30,.28);border-bottom:2px solid transparent;border-image:linear-gradient(90deg,var(--teal-x) 0%,var(--teal-x) 50%,var(--ev) 50%,var(--ev) 100%) 1}nav .wrap{display:flex;align-items:center;justify-content:space-between;height:68px;gap:18px}nav .logo{display:flex;align-items:center;gap:10px;height:34px}nav .logo img{height:34px;width:auto}nav .logo-dual{display:inline-flex;align-items:center;gap:10px}nav .logo-dual .plus{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:rgba(255,255,255,.16);color:#fff;font-size:12px;font-weight:800;line-height:1;border:1px solid rgba(255,255,255,.28)}nav .logo-dual .ev-mark{display:inline-flex;align-items:center;gap:7px;padding:4px 9px;border-radius:99px;background:linear-gradient(135deg,var(--ev),var(--ev-d));color:#fff;font-weight:800;font-size:12.5px;letter-spacing:.02em;box-shadow:0 4px 12px rgba(228,108,0,.35)}nav .logo-dual .ev-mark::before{content:\"\";width:8px;height:8px;border-radius:50%;background:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.35)}nav .logo-dual .logo-em,nav .logo-dual .logo-ev{height:34px;width:auto;display:block;filter:drop-shadow(0 1px 3px rgba(0,0,0,.25))}@media(max-width:600px){nav .logo-dual .ev-mark{font-size:11px;padding:3px 7px}nav .logo-dual .plus{width:16px;height:16px;font-size:11px}nav .logo-dual .logo-em,nav .logo-dual .logo-ev{height:28px}}nav .logo .fb{display:none;align-items:center;gap:9px;color:#fff;font-weight:800;font-size:17px}nav .logo .fb svg{width:30px;height:30px}nav .links{display:flex;gap:3px;align-items:center}nav .links a{font-size:14px;font-weight:600;color:rgba(255,255,255,.8);padding:9px 14px;border-radius:9px;transition:.16s;white-space:nowrap}nav .links a:hover{color:#fff;background:rgba(255,255,255,.1)}nav .cta{background:linear-gradient(95deg,var(--gold) 0%,#f3b837 55%,var(--ev-x) 100%);color:var(--gold-deep)!important;font-weight:800;box-shadow:0 6px 16px rgba(228,108,0,.36)}nav .cta:hover{background:linear-gradient(95deg,#f3b837 0%,var(--ev-x) 70%,var(--ev) 100%)!important;color:#3a1b00!important;transform:translateY(-1px);box-shadow:0 8px 20px rgba(228,108,0,.5)}nav .cta-outline{background:transparent;color:#fff!important;font-weight:700;border:1.5px solid rgba(255,255,255,.42);box-shadow:none}nav .cta-outline:hover{background:rgba(255,255,255,.1);transform:translateY(-1px)}nav .gear{opacity:.55;font-size:16px}nav .gear:hover{opacity:1}.navtoggle{display:none;background:none;border:0;cursor:pointer;width:44px;height:44px;flex-direction:column;justify-content:center;gap:5px;padding:0}.navtoggle span{display:block;height:2.5px;width:24px;background:#fff;border-radius:2px;transition:.25s;margin:0 auto}nav.open .navtoggle span:nth-child(1){transform:translateY(7.5px) rotate(45deg)}nav.open .navtoggle span:nth-child(2){opacity:0}nav.open .navtoggle span:nth-child(3){transform:translateY(-7.5px) rotate(-45deg)}@media(max-width:880px){.navtoggle{display:flex}nav .links{position:absolute;top:68px;left:0;right:0;flex-direction:column;align-items:stretch;gap:3px;background:linear-gradient(135deg,var(--teal-deep) 0%,#5a2a00 70%,var(--ev-d) 100%);padding:12px 16px 18px;box-shadow:0 20px 34px rgba(4,38,30,.42);border-top:1px solid rgba(255,255,255,.08);display:none}nav.open .links{display:flex}nav .links a:not(.cta):not(.gear){display:block;padding:13px 14px;font-size:15px;border-radius:10px}nav .links .cta{text-align:center;margin-top:7px;padding:14px}nav .links .gear{display:none}}nav .live-link{display:inline-flex!important;align-items:center;gap:8px}.live-dot{width:9px;height:9px;border-radius:50%;background:#ff5b52;position:relative;flex:none;box-shadow:0 0 0 0 rgba(255,91,82,.6);animation:liveblink 1.5s ease-in-out infinite}.live-dot::after{content:\"\";position:absolute;inset:-3px;border-radius:50%;border:2px solid #ff5b52;animation:livepulse 1.5s ease-out infinite}@keyframes liveblink{0%,100%{opacity:1}50%{opacity:.45}}@keyframes livepulse{0%{transform:scale(.5);opacity:.85}100%{transform:scale(1.8);opacity:0}}@media (prefers-reduced-motion:reduce){.live-dot,.live-dot::after{animation:none}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;border:0;cursor:pointer;font-family:inherit;font-weight:800;font-size:15px;padding:15px 28px;border-radius:13px;transition:.18s;line-height:1}.btn.primary{background:var(--teal);color:#fff;box-shadow:0 10px 24px rgba(14,142,112,.3)}.btn.primary:hover{background:var(--teal-x);transform:translateY(-2px);box-shadow:0 14px 30px rgba(14,142,112,.36)}.btn.gold{background:linear-gradient(95deg,var(--gold) 0%,#f3b837 50%,var(--ev-x) 100%);color:var(--gold-deep);box-shadow:0 10px 24px rgba(228,108,0,.32)}.btn.gold:hover{background:linear-gradient(95deg,#f3b837 0%,var(--ev-x) 60%,var(--ev) 100%);color:#3a1b00;transform:translateY(-2px);box-shadow:0 14px 30px rgba(228,108,0,.46)}.btn.ghost{background:#fff;border:1.5px solid var(--line-2);color:var(--ink)}.btn.ghost:hover{border-color:var(--teal);color:var(--teal-d);transform:translateY(-2px)}.btn.light{background:rgba(255,255,255,.12);color:#fff;border:1.5px solid rgba(255,255,255,.28);backdrop-filter:blur(4px)}.btn.light:hover{background:rgba(255,255,255,.2);transform:translateY(-2px)}.btn.block{width:100%}.btn.danger{background:#fff;border:1.5px solid #f0c4c2;color:var(--red)}.btn.danger:hover{background:var(--red-tint)}.btn:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}.hero{position:relative;overflow:hidden;color:#fff;min-height:620px;display:flex;align-items:center;background:linear-gradient(155deg,#0a6c55 0%,#06352a 58%,#04261e 100%)}.herobg{position:absolute;inset:0;z-index:0;display:grid;grid-template-columns:repeat(4,1fr)}.herobg img{display:block;width:100%;height:100%;object-fit:cover;min-width:0;min-height:0}@media(max-width:760px){.herobg{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}.herobg img[src*=\"postal-brasil\"]{object-position:30% 25%;transform:scale(1.35);transform-origin:30% 35%;filter:brightness(1.18) contrast(1.08) saturate(1.05)}}.heroveil{position:absolute;inset:0;z-index:1;pointer-events:none;background:repeating-linear-gradient(106deg,transparent 0 70px,rgba(255,255,255,.022) 70px 140px),linear-gradient(98deg,rgba(4,28,22,.95) 0%,rgba(5,46,37,.84) 30%,rgba(5,46,37,.5) 62%,rgba(5,46,37,.24) 100%),linear-gradient(180deg,rgba(4,28,22,.18),rgba(4,28,22,.5))}.hero .wrap{position:relative;z-index:2;padding:84px 24px;width:100%}.herocopy{max-width:600px;pointer-events:none;text-shadow:0 2px 22px rgba(2,18,14,.45)}.herocopy a,.herocopy .btn{pointer-events:auto;text-shadow:none}@media(max-width:920px){.hero .wrap{padding:60px 24px}}.flagband{display:flex;gap:6px;margin-bottom:24px;max-width:300px}.flagband i{height:6px;flex:1;border-radius:99px}.fb-bra{background:linear-gradient(90deg,var(--bra-a),var(--bra-b))}.fb-fra{background:linear-gradient(90deg,var(--fra-a),var(--fra-b))}.fb-arg{background:linear-gradient(90deg,var(--arg-a),var(--arg-b))}.fb-esp{background:linear-gradient(90deg,var(--esp-a),var(--esp-b))}.tag{display:inline-flex;align-items:center;gap:9px;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.22);border-radius:99px;padding:7px 16px 7px 7px;font-size:13px;font-weight:700;color:#fff;backdrop-filter:blur(6px)}.tag .tagtrophy{width:28px;height:28px;border-radius:50%;object-fit:cover;flex:none;border:1.5px solid rgba(255,255,255,.55);box-shadow:0 2px 8px rgba(0,0,0,.25)}.tag.tag-dual{padding-right:14px;background:linear-gradient(90deg,rgba(255,255,255,.12) 0%,rgba(255,255,255,.12) 55%,rgba(228,108,0,.22) 100%);border-color:rgba(255,255,255,.28)}.tag .tag-sep{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:rgba(255,255,255,.18);font-size:11px;font-weight:800;margin:0 2px;color:#fff}.tag .tag-ev{color:#ffd9b4;font-weight:800}.hero h1{font-size:clamp(46px,8.6vw,90px);margin:22px 0 0;color:#fff;line-height:.98}.hero h1 .o{color:var(--gold)}.hero .sub{font-size:clamp(17px,1.9vw,20px);color:rgba(255,255,255,.86);max-width:560px;margin:22px 0 30px}.hero .sub b{color:#fff;font-weight:800}.btnrow{display:flex;gap:13px;flex-wrap:wrap}.herostats{display:flex;gap:26px;margin-top:34px;flex-wrap:wrap}.herostats .st{display:flex;flex-direction:column;gap:2px}.herostats .st .n{font-family:'Bricolage Grotesque';font-weight:800;font-size:30px;color:var(--gold)}.herostats .st:last-child .n{color:var(--ev-x)}.herostats .st .l{font-size:12.5px;color:rgba(255,255,255,.7);font-weight:600;letter-spacing:.02em}.herostats .sep{width:1px;background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.32),rgba(255,255,255,.05))}.herostats .sep:last-of-type{background:linear-gradient(180deg,rgba(228,108,0,.1),rgba(228,108,0,.55),rgba(228,108,0,.1))}.herolive{display:inline-flex;align-items:center;gap:10px;margin-top:24px;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.22);border-radius:99px;padding:9px 17px;font-size:13.5px;font-weight:600;color:rgba(255,255,255,.92);backdrop-filter:blur(6px);text-decoration:none;transition:.2s;text-shadow:none}.herolive:hover{background:rgba(255,255,255,.16)}.herolive b{font-weight:800;color:#fff}.nextmatch{background:linear-gradient(95deg,var(--teal-deep) 0%,var(--teal-deeper) 55%,#5a2a00 88%,var(--ev-d) 100%);color:#fff;border-bottom:1px solid rgba(255,255,255,.08);border-top:1px solid transparent;border-image:linear-gradient(90deg,var(--teal-x) 0%,var(--teal-x) 50%,var(--ev) 50%,var(--ev) 100%) 1}.nextmatch .wrap{padding:18px 24px}.nm-in{display:flex;align-items:center;gap:18px 30px;flex-wrap:wrap;justify-content:space-between}.nm-info{display:flex;flex-direction:column;gap:5px;min-width:240px}.nm-lead{display:inline-flex;align-items:center;gap:9px;font-size:12px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--gold)}.nm-game{font-family:'Bricolage Grotesque';font-weight:700;font-size:clamp(18px,2.4vw,23px);line-height:1.1}.nm-note{font-size:12.5px;color:rgba(255,255,255,.62);font-weight:600}.nm-clock{display:inline-flex;align-items:center;gap:8px}.nm-seg{display:flex;flex-direction:column;align-items:center;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);border-radius:10px;padding:8px 11px;min-width:56px}.nm-seg b{font-family:'Bricolage Grotesque';font-weight:800;font-size:23px;line-height:1;color:#fff;font-variant-numeric:tabular-nums}.nm-seg span{font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:rgba(255,255,255,.6);margin-top:4px}@media(max-width:560px){.nm-clock{width:100%;justify-content:space-between}.nm-seg{flex:1}}.natgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:34px}@media(max-width:880px){.natgrid{grid-template-columns:repeat(2,1fr)}}@media(max-width:460px){.natgrid{grid-template-columns:1fr}}.nat{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--shadow);transition:.25s}.nat:hover{transform:translateY(-6px);box-shadow:var(--shadow-lg)}.nat .bar{height:6px}.nat .natflag{height:148px;background-size:cover;background-position:center;display:flex;align-items:flex-end;padding:16px}.nat .natlabel .nm{color:#fff;font-family:'Bricolage Grotesque';font-weight:800;font-size:23px;line-height:1;text-shadow:0 2px 14px rgba(0,0,0,.65)}.nat .natlabel .gp{display:inline-block;margin-top:6px;font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;font-weight:800;color:#fff;background:rgba(0,0,0,.34);padding:3px 9px;border-radius:99px;backdrop-filter:blur(3px)}.nat ul{list-style:none;padding:8px 16px 18px}.nat li{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}.nat li:last-child{border:0}.nat li .dt{font-family:'Bricolage Grotesque';font-weight:800;font-size:13px;color:var(--teal-d);background:var(--teal-tint);padding:5px 9px;border-radius:8px;flex:none;min-width:52px;text-align:center}.nat li .op{font-size:14px;color:var(--ink-2);font-weight:600}.nat li .op small{display:block;color:var(--mut-2);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.05em}.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:34px;position:relative}@media(max-width:780px){.steps{grid-template-columns:1fr}}.step{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:28px;box-shadow:var(--shadow);position:relative}.step .n{font-family:'Bricolage Grotesque';font-size:18px;font-weight:800;color:#fff;background:linear-gradient(150deg,var(--teal-x),var(--teal-d));width:48px;height:48px;border-radius:14px;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 18px rgba(14,142,112,.3)}.step h4{font-size:19px;margin:16px 0 7px}.step p{color:var(--mut);font-size:14.5px}.card{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:30px;margin-bottom:18px;box-shadow:var(--shadow)}@media(max-width:520px){.card{padding:22px}}.card h3{font-size:22px;margin-bottom:6px}.card .csub{color:var(--mut);font-size:14.5px;margin-bottom:6px}.ruletbl{width:100%;border-collapse:collapse;margin-top:10px}.ruletbl td{padding:18px 8px;border-bottom:1px solid var(--line);vertical-align:middle}.ruletbl tr:last-child td{border:0}.ruletbl .pt{font-family:'Bricolage Grotesque';font-weight:800;font-size:38px;width:96px;color:var(--teal);text-align:center}.ruletbl .pt span{display:block;font-family:'Hanken Grotesk';font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut-2);margin-top:2px}.ruletbl .pt.z{color:var(--mut-2)}.ruletbl .d{color:var(--mut);font-size:15.5px}.ruletbl .d b{color:var(--ink)}.rlist{list-style:none;margin-top:6px}.rlist > li{display:flex;gap:15px;padding:16px 0;border-bottom:1px solid var(--line);color:var(--mut);font-size:15.5px}.rlist > li:last-child{border:0}.rlist > li > div{min-width:0;flex:1}.rlist ul{margin:6px 0 0;padding-left:18px;list-style:disc}.rlist ul li{display:list-item;padding:4px 0;border:0;font-size:14.5px;line-height:1.5}.rlist b{color:var(--ink)}.rlist .b{color:#fff;background:linear-gradient(150deg,var(--teal-x),var(--teal-d));font-family:'Bricolage Grotesque';font-weight:800;font-size:14px;flex:none;width:32px;height:32px;border-radius:10px;display:flex;align-items:center;justify-content:center}.note{display:flex;gap:11px;align-items:flex-start;background:var(--gold-tint);border:1px solid #f0dca8;border-radius:13px;padding:16px 18px;font-size:14.5px;color:#7a5b12;margin-top:18px}.note .bigico{font-size:20px;line-height:1.2;flex:none}.note.lgpd{background:var(--teal-tint);border-color:#c5e6db;color:var(--teal-d)}.note a{color:inherit;text-decoration:underline;font-weight:700}.formgrid{display:grid;grid-template-columns:1fr 1fr;gap:18px}@media(max-width:640px){.formgrid{grid-template-columns:1fr}}.fld label{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--mut);font-weight:800;margin-bottom:8px}.fld label .req{color:var(--gold-d)}.fld input,.fld select{width:100%;background:var(--bg-soft);border:1.5px solid var(--line-2);color:var(--ink);font:inherit;font-size:15px;padding:14px 16px;border-radius:12px;outline:none;transition:.16s}.fld input::placeholder{color:var(--mut-2)}.fld input:focus,.fld select:focus{border-color:var(--teal);background:#fff;box-shadow:0 0 0 4px var(--teal-tint)}.fld input.err{border-color:var(--red);background:var(--red-tint)}.consent{display:flex;gap:12px;align-items:flex-start;margin-top:10px;font-size:14px;color:var(--mut);line-height:1.5}.consent input{margin-top:3px;width:19px;height:19px;accent-color:var(--teal);flex:none}.consent a{color:var(--teal);text-decoration:underline;font-weight:700}.full{grid-column:1\/-1}.matchgrid{display:grid;grid-template-columns:1fr 1fr;gap:15px;margin-top:6px}@media(max-width:640px){.matchgrid{grid-template-columns:1fr}}.match{border:1px solid var(--line);border-radius:16px;padding:18px;background:#fff;position:relative;overflow:hidden;box-shadow:var(--shadow);transition:.2s}.match:hover{box-shadow:var(--shadow-lg)}.match .accent{position:absolute;left:0;top:0;bottom:0;width:5px}.match .meta{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:var(--mut-2);margin-bottom:15px;gap:6px;padding-left:8px}.bdg{font-size:9.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;padding:4px 9px;border-radius:99px;white-space:nowrap}.bdg.dbl{background:var(--gold);color:var(--gold-deep)}.bdg.open{background:var(--teal-tint);color:var(--teal-d)}.bdg.shut{background:var(--red-tint);color:var(--red)}.teams{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:8px}.tm{display:flex;flex-direction:column;align-items:center;gap:5px;text-align:center}.tm .fg{font-size:30px;line-height:1}.tm .nm{font-size:12.5px;font-weight:700}.sc{display:flex;align-items:center;gap:6px}.sc input{width:46px;height:48px;text-align:center;font-family:'Bricolage Grotesque';font-weight:800;font-size:22px;background:var(--bg-soft);border:1.5px solid var(--line-2);color:var(--ink);border-radius:11px;outline:none;transition:.15s}.sc input:focus{border-color:var(--teal);background:#fff;box-shadow:0 0 0 3px var(--teal-tint)}.sc .x{color:var(--mut-2);font-weight:700}.match.win{box-shadow:0 0 0 2px var(--gold),0 18px 44px rgba(227,165,31,.24)}.betln{font-size:12px;color:var(--mut);margin-top:11px;text-align:center}.betln b{color:var(--ink);font-family:'Bricolage Grotesque';font-weight:800}.betln.muted{color:var(--mut-2)}.rescard{margin-top:12px;border-radius:12px;padding:12px 14px;border:1px solid var(--line)}.rescard .resofficial{font-size:12px;color:var(--mut)}.rescard .resofficial b{color:var(--ink)}.rescard .resrow{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:8px}.rescard .reslabel{font-size:13.5px;font-weight:800;display:flex;align-items:center;gap:8px}.rescard .resic{flex:none;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;background:rgba(0,0,0,.06)}.rescard .respts{font-family:'Bricolage Grotesque';font-weight:800;font-size:24px;line-height:1;white-space:nowrap}.rescard .respts small{font-size:11px;font-weight:700;margin-left:2px}.rescard .resdbl{margin-top:8px;font-size:11.5px;font-weight:700;color:var(--gold-d)}.rescard.hit-exact{background:linear-gradient(150deg,#fff7e4,#fff);border-color:#f0dca8}.rescard.hit-exact .reslabel,.rescard.hit-exact .respts{color:var(--gold-d)}.rescard.hit-exact .resic{background:var(--gold);color:#fff}.rescard.hit-good,.rescard.hit-ok{background:var(--teal-tint);border-color:#c5e6db}.rescard.hit-good .reslabel,.rescard.hit-good .respts,.rescard.hit-ok .reslabel,.rescard.hit-ok .respts{color:var(--teal-d)}.rescard.hit-good .resic,.rescard.hit-ok .resic{background:var(--teal);color:#fff}.rescard.miss{background:var(--red-tint);border-color:#f0d4d2}.rescard.miss .reslabel,.rescard.miss .respts{color:var(--red)}.rescard.miss .resic{background:var(--red);color:#fff}.confetti{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:5}.confetti i{position:absolute;top:-14px;width:8px;height:12px;border-radius:2px;opacity:0;animation:conffall 1.7s cubic-bezier(.3,.6,.5,1) forwards}@keyframes conffall{0%{opacity:0;transform:translate(0,-14px) rotate(0)}12%{opacity:1}100%{opacity:0;transform:translate(var(--dx,0),300px) rotate(540deg)}}@media (prefers-reduced-motion:reduce){.confetti{display:none}}.rk-subhead{font-size:12.5px;font-weight:400;color:var(--mut);letter-spacing:.01em;margin-left:6px}.spos-mute{color:var(--mut-2)!important;font-weight:400!important}nav .links a.nav-highlight{color:#fff8e7;font-weight:800}nav .links a.nav-highlight .nav-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--gold,#e3a51f);box-shadow:0 0 0 0 rgba(227,165,31,.55);animation:navDotPulse 2.4s ease-out infinite;margin-left:4px;vertical-align:middle}@keyframes navDotPulse{0%{box-shadow:0 0 0 0 rgba(227,165,31,.55)}70%{box-shadow:0 0 0 6px rgba(227,165,31,0)}100%{box-shadow:0 0 0 0 rgba(227,165,31,0)}}@media (prefers-reduced-motion:reduce){nav .links a.nav-highlight .nav-dot{animation:none}}.refrow.refrow-home{padding:11px 14px;font-size:14.5px}.refrow.refrow-home.podium{background:linear-gradient(95deg,#fffaeb 0%,#fff 100%);border-color:#f0d97a}.refrow.refrow-home .rpos{font-size:20px}.refrow.refrow-home.podium .rpos{font-size:24px}.refrankhome-foot{margin-top:14px;padding:12px 16px;border-radius:10px;font-size:14px;line-height:1.5}.refrankhome-foot.in{background:var(--teal-tint);border:1px solid var(--teal-tint-2);color:var(--teal-d)}.refrankhome-foot.out{background:#fff;border:1px dashed var(--teal-tint-2);color:var(--mut)}.refrankhome-foot b{color:var(--ink)}.refrankhome-empty{display:flex;align-items:center;gap:16px;background:linear-gradient(135deg,#fff8e7 0%,#fffdf5 100%);border:1.5px solid #e3c87a;border-radius:14px;padding:18px 22px;color:#5a4408;font-size:14.5px;line-height:1.5}.refrankhome-empty b{color:#3d2d05}.rkpregame{display:flex;align-items:center;gap:16px;background:linear-gradient(135deg,#fff8e7 0%,#fffdf5 100%);border:1.5px solid #e3c87a;border-radius:16px;padding:18px 22px;margin:10px 0 22px;color:#5a4408;font-size:14.5px;line-height:1.5}.rkpregame-ic{font-size:32px;line-height:1;flex:none}.rkpregame b{color:#3d2d05}@media(max-width:520px){.rkpregame{padding:14px 16px;font-size:13.5px;gap:12px}.rkpregame-ic{font-size:26px}}.podium{display:grid;grid-template-columns:1fr 1.18fr 1fr;gap:14px;align-items:end;margin:10px 0 24px}@media(max-width:760px){.podium{grid-template-columns:1fr}.pod.g1{order:1}.pod.g2{order:2}.pod.g3{order:3}}.pod{background:var(--bg-soft);border:1px solid var(--line);border-radius:18px;padding:20px 10px;text-align:center}.pod .m{font-size:34px;line-height:1}.pod .nm{font-weight:800;font-size:13.5px;margin-top:6px;word-break:break-word}.pod .tu{font-size:11px;color:var(--mut-2)}.pod .pt{font-family:'Bricolage Grotesque';color:var(--teal);font-weight:800;font-size:18px;margin-top:5px}.pod.g1{border-color:var(--gold);background:linear-gradient(180deg,var(--gold-tint),#fff);padding-bottom:34px;box-shadow:var(--shadow)}.pod.g1 .pt{color:var(--gold-d)}.pod .prz{margin-top:10px;padding:6px 8px;border-radius:8px;background:rgba(0,0,0,.04);font-size:11px;font-weight:700;color:var(--ink);line-height:1.3}.pod.g1 .prz{background:var(--gold-tint);color:var(--gold-d)}table.rk{width:100%;border-collapse:collapse;font-size:14px}table.rk th,table.rk td{text-align:left;padding:13px 10px;border-bottom:1px solid var(--line)}table.rk th{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--mut-2);font-weight:800}table.rk td.r,table.rk th.r{text-align:right}table.rk tr td:first-child{font-family:'Bricolage Grotesque';font-weight:800;color:var(--mut-2);width:38px}table.rk tr.me{background:var(--teal-tint)}table.rk tr.me td:first-child{color:var(--teal)}.elig{font-size:12px;color:var(--gold-d);font-weight:800}.vtag{display:inline-block;margin-right:5px;font-size:13px;opacity:.85;vertical-align:-1px}.myrank{display:flex;align-items:center;gap:16px;background:linear-gradient(135deg,var(--teal-tint),var(--teal-tint-2));border:2px solid var(--teal);border-radius:16px;padding:16px 20px;margin:18px 0 0;text-decoration:none;color:inherit}.myrank-pos{font-family:'Bricolage Grotesque';font-weight:800;font-size:38px;line-height:1;color:var(--teal);min-width:54px;text-align:center}.myrank-info{flex:1;min-width:0}.myrank-nm{font-weight:800;color:var(--teal-d,#0a6b54);font-size:15.5px}.myrank-nm small{color:var(--mut);font-weight:600}.myrank-meta{font-size:13.5px;color:var(--mut);margin-top:3px}.myrank-meta b{color:var(--ink)}.myrank-elig{color:var(--gold-d);font-weight:800}.myrank-miss{color:var(--mut)}.myrank-cta{font-weight:800;color:var(--gold-d);font-size:14px;white-space:nowrap}.myrank.myrank-off{background:#fff;border:1.5px dashed var(--line);cursor:pointer;justify-content:space-between}.myrank.myrank-off:hover{border-color:var(--gold)}.myrank.myrank-off .myrank-nm{color:var(--ink)}@media(max-width:520px){.myrank{padding:14px;gap:12px}.myrank-pos{font-size:32px;min-width:48px}.myrank-nm{font-size:14px}}.rkblock{margin-top:18px}.rkblock-head{font-size:12.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:800;color:var(--mut);margin:0 0 6px;display:flex;align-items:center;gap:8px}.rkblock-foot{margin-top:14px;text-align:center}.rkblock-foot .rkmore{font-size:13px;padding:11px 18px}.rksearchbar{margin:18px 0 0}.rksearchbar input{width:100%;padding:12px 14px;border:1.5px solid var(--line-2);border-radius:11px;font-size:14.5px;background:#fff;color:var(--ink);font-family:inherit;transition:.15s border-color}.rksearchbar input:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(14,142,112,.15)}.rksearchbar input::placeholder{color:var(--mut-2)}.empty{text-align:center;color:var(--mut-2);padding:42px 12px}.ranklegend{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:18px}@media(max-width:780px){.ranklegend{grid-template-columns:1fr}}.ranklegend .lg{display:flex;gap:13px;align-items:flex-start;background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px 18px;box-shadow:var(--shadow-xs);font-size:14px;color:var(--mut)}.ranklegend .lg b{color:var(--ink)}.ranklegend .lg-ic{flex:none;width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;font-family:'Bricolage Grotesque';font-weight:800;font-size:15px}.ranklegend .lg-ic.medal{background:linear-gradient(150deg,#fbe9bd,var(--gold-tint));color:var(--gold-d);border:1px solid #f0dca8}.ranklegend .lg-ic.star{background:var(--gold);color:var(--gold-deep);font-size:19px}.ranklegend .lg-ic.dbl{background:var(--teal-tint);color:var(--teal-d)}#admin{display:none;background:var(--bg-soft);border-top:1px solid var(--line)}.adrow{display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center;border-bottom:1px solid var(--line);padding:12px 0}.adrow .nm{font-size:13.5px;font-weight:700}.adrow .nm small{display:block;color:var(--mut-2);font-weight:500}.mini{width:46px;height:40px;text-align:center;background:var(--bg-soft);border:1.5px solid var(--line-2);color:var(--ink);border-radius:9px;font:inherit;font-weight:700}.gtbl{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:6px;display:block;overflow-x:auto;white-space:nowrap}.gtbl th,.gtbl td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left}.gtbl th{color:var(--mut-2);text-transform:uppercase;letter-spacing:.06em;font-size:10.5px;font-weight:800}.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);background:var(--teal-deep);color:#fff;font-weight:800;padding:14px 26px;border-radius:99px;opacity:0;transition:.3s;z-index:99;box-shadow:0 16px 38px rgba(4,38,30,.45)}.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}body footer.bolao-footer{display:block!important;background:linear-gradient(102deg,#06352a 0%,#04261e 42%,#5a2a00 72%,#b85700 92%,#e46c00 100%)!important;color:rgba(255,255,255,.78)!important;padding:56px 0 30px!important;font-size:14px!important;width:100%!important;max-width:none!important;margin:0!important;border-top:4px solid #e46c00!important}footer{background:linear-gradient(102deg,var(--teal-deep) 0%,var(--teal-deeper) 42%,#5a2a00 72%,var(--ev-d) 92%,var(--ev) 100%);color:rgba(255,255,255,.78);padding:56px 0 30px;font-size:14px;border-top:4px solid transparent;border-image:linear-gradient(90deg,var(--teal-x) 0%,var(--teal-x) 49%,#ffffff 49%,#ffffff 51%,var(--ev) 51%,var(--ev) 100%) 1}footer .flinks .fcol:nth-child(2) h5{color:var(--ev-x)}footer .fbrand-lockup{display:flex;align-items:center;gap:14px;margin-bottom:16px;flex-wrap:wrap}footer .fbrand-lockup .flogo{margin-bottom:0}footer .fbrand-plus{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:rgba(255,255,255,.16);color:#fff;font-size:13px;font-weight:800;border:1px solid rgba(255,255,255,.28)}footer .fbrand-ev{display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border-radius:99px;background:linear-gradient(135deg,var(--ev),var(--ev-d));color:#fff;font-weight:800;font-size:14px;box-shadow:0 4px 14px rgba(228,108,0,.4)}footer .fbrand-ev::before{content:\"\";width:9px;height:9px;border-radius:50%;background:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.35)}footer .flogo-ev{height:40px;width:auto;margin-bottom:0;filter:drop-shadow(0 2px 6px rgba(0,0,0,.3))}footer .ftag-ev{color:#ffd9b4!important}footer .fmain{display:grid;grid-template-columns:1.5fr 1fr;gap:40px;padding-bottom:34px}@media(max-width:780px){footer .fmain{grid-template-columns:1fr;gap:32px}}footer .flogo{height:40px;width:auto;margin-bottom:16px}footer .ftag{max-width:440px;line-height:1.6;color:rgba(255,255,255,.72)}footer .ftag b{color:#fff}footer .fbrand .flagband{margin-top:20px;max-width:230px}footer .flinks{display:flex;gap:48px;flex-wrap:wrap}footer .fcol{display:flex;flex-direction:column;gap:11px}footer .fcol h5{font-size:12px;text-transform:uppercase;letter-spacing:.1em;color:var(--gold);font-weight:800;margin-bottom:2px}footer .fcol a{color:rgba(255,255,255,.8);font-size:14px;transition:.15s;width:fit-content}footer .fcol a:hover{color:#fff}footer .fbar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;padding-top:24px;border-top:1px solid rgba(255,255,255,.12);font-size:12.5px;color:rgba(255,255,255,.55)}footer b{color:#fff}footer a.prof{color:rgba(255,255,255,.5);font-size:12.5px;transition:.15s}footer a.prof:hover{color:rgba(255,255,255,.9)}#premios{padding-top:clamp(72px,9vw,118px);padding-bottom:clamp(72px,9vw,118px);background:radial-gradient(1200px 600px at 50% -10%,rgba(227,165,31,.10),transparent 60%),var(--bg-soft);position:relative;overflow:hidden}#premios::before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 85% 90%,rgba(14,142,112,.10),transparent 38%),radial-gradient(circle at 8% 100%,rgba(14,142,112,.08),transparent 40%);pointer-events:none}#premios .wrap{position:relative}#premios .prizeheader{display:flex;flex-direction:column;align-items:center;text-align:center;gap:18px;margin-bottom:30px}#premios .prizeheader>.reveal{max-width:820px;width:100%}#premios .prizeheader h2{font-size:clamp(30px,4.2vw,50px);line-height:1.06;letter-spacing:-.022em;margin-top:10px;text-wrap:balance}#premios .prizeheader .lead{font-size:clamp(15px,1.3vw,17.5px);line-height:1.5;color:var(--mut);margin:14px auto 0;max-width:640px}#premios .prizeheader .lead b{color:var(--ink)}#premios .prizeheader-badges{margin-top:18px;display:flex;gap:10px;flex-wrap:wrap;justify-content:center}#premios .totalbadge{display:inline-flex;align-items:center;gap:10px;background:linear-gradient(135deg,#fbf2da 0%,#f7e2a3 100%);border:1px solid rgba(184,130,26,.35);border-radius:999px;padding:9px 18px 9px 12px;font-weight:800;color:var(--gold-deep);font-size:13.5px;letter-spacing:.02em;box-shadow:0 6px 18px rgba(184,130,26,.18)}#premios .totalbadge .dot{width:26px;height:26px;border-radius:50%;background:radial-gradient(circle at 30% 30%,#fff5d6,#e3a51f);display:inline-flex;align-items:center;justify-content:center;font-size:14px;box-shadow:inset 0 0 0 1px rgba(184,130,26,.4)}#premios .totalbadge.teal{background:linear-gradient(135deg,#e6f4ef,#c8e4d8);border-color:rgba(10,108,84,.25);color:var(--teal-d);box-shadow:0 6px 18px rgba(10,108,84,.18)}#premios .totalbadge.teal .dot{background:radial-gradient(circle at 30% 30%,#c8f0e0,#0e8e70);box-shadow:inset 0 0 0 1px rgba(10,108,84,.4)}#premios .prizeshowcase{display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap}#premios .prizeshowcase .ps-item{width:104px;height:120px;background:#fff;border:1px solid var(--line);border-radius:18px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:10px;box-shadow:0 14px 30px rgba(11,32,26,.08);transition:transform .35s ease,box-shadow .35s ease}#premios .prizeshowcase .ps-item:hover{transform:translateY(-4px);box-shadow:0 22px 40px rgba(11,32,26,.12)}#premios .prizeshowcase .ps-item.featured{background:linear-gradient(160deg,#0a6c55,#06352a);border:0;color:#fff;box-shadow:0 18px 36px rgba(10,108,84,.32)}#premios .prizeshowcase .ps-item img,#premios .prizeshowcase .ps-item svg{width:62px;height:62px;object-fit:contain}#premios .prizeshowcase .ps-item .ps-lbl{font-size:10.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--mut);margin-top:8px;text-align:center;line-height:1.15}#premios .prizeshowcase .ps-item.featured .ps-lbl{color:rgba(255,255,255,.85)}@media(max-width:900px){#premios .prizeshowcase{justify-content:center}#premios .prizeshowcase .ps-item{width:92px;height:108px}#premios .prizeshowcase .ps-item img,#premios .prizeshowcase .ps-item svg{width:50px;height:50px}}#premios .prizeboard{display:grid;grid-template-columns:repeat(12,1fr);gap:22px;margin-top:6px}#premios .pcard.feat{grid-column:span 12;padding:clamp(34px,4vw,56px);border-radius:32px;background:radial-gradient(800px 400px at 90% -10%,rgba(227,165,31,.22),transparent 60%),linear-gradient(155deg,#0a6c55 0%,#06352a 55%,#04261e 100%);color:#fff;border:0;position:relative;overflow:hidden}#premios .pcard.feat::before{display:none}#premios .pcard.feat .feat-top{display:grid;grid-template-columns:1fr auto;gap:24px;align-items:flex-start;margin-bottom:36px}@media(max-width:760px){#premios .pcard.feat .feat-top{grid-template-columns:1fr}}#premios .pcard.feat .pkicker{display:inline-flex;align-items:center;gap:8px;font-size:12.5px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--gold);margin-bottom:0}#premios .pcard.feat h3{font-size:clamp(28px,3.4vw,40px);line-height:1.04;letter-spacing:-.02em;margin-top:6px;color:#fff;text-wrap:balance}#premios .pcard.feat .pintro{color:rgba(255,255,255,.84);font-size:clamp(15px,1.35vw,17.5px);max-width:560px;margin-top:14px}#premios .pcard.feat .feat-tag{display:inline-flex;align-items:center;gap:8px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14);border-radius:999px;padding:9px 16px;font-size:12px;font-weight:800;color:#fff;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap}#premios .pcard.feat .feat-tag .pulse{width:8px;height:8px;border-radius:50%;background:var(--gold);box-shadow:0 0 0 0 rgba(227,165,31,.6);animation:prz-pulse 1.8s infinite}@keyframes prz-pulse{0%{box-shadow:0 0 0 0 rgba(227,165,31,.55)}70%{box-shadow:0 0 0 12px rgba(227,165,31,0)}100%{box-shadow:0 0 0 0 rgba(227,165,31,0)}}#premios .tiers{display:grid;grid-template-columns:1fr 1.15fr 1fr;gap:18px;align-items:end}@media(max-width:760px){#premios .tiers{grid-template-columns:1fr;gap:14px}#premios .tier.t1{order:1}#premios .tier.t2{order:2}#premios .tier.t3{order:3}}#premios .tier{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:22px;padding:26px 22px 30px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:16px;position:relative}#premios .tier.t1{background:linear-gradient(180deg,rgba(227,165,31,.18),rgba(227,165,31,.06));border:1px solid rgba(227,165,31,.35);padding-top:34px;padding-bottom:38px}#premios .tier.t2{background:rgba(255,255,255,.07)}#premios .tier.t3{background:rgba(255,255,255,.05)}#premios .tier .place{display:flex;flex-direction:column;align-items:center;gap:8px}#premios .tier .medal{width:62px;height:62px;border-radius:18px;display:flex;align-items:center;justify-content:center;font-size:32px;box-shadow:0 10px 20px rgba(0,0,0,.28)}#premios .tier.t1 .medal{background:linear-gradient(150deg,#fde2a0,#e3a51f);box-shadow:0 14px 28px rgba(227,165,31,.4)}#premios .tier.t2 .medal{background:linear-gradient(150deg,#f4f6f8,#aab6bd)}#premios .tier.t3 .medal{background:linear-gradient(150deg,#eabb8a,#b87245)}#premios .tier .plnm{font-family:'Bricolage Grotesque';font-weight:800;font-size:22px;color:#fff;line-height:1}#premios .tier.t1 .plnm{font-size:26px}#premios .tier .plsub{font-size:11px;color:rgba(255,255,255,.62);text-transform:uppercase;letter-spacing:.1em;font-weight:800}#premios .tier .gstack{display:flex;align-items:flex-end;justify-content:center;gap:12px;margin-top:6px;width:100%}#premios .tier .ghero{width:130px;height:130px;background:#fff;border-radius:18px;padding:8px;display:flex;align-items:center;justify-content:center;box-shadow:0 12px 28px rgba(0,0,0,.25)}#premios .tier.t1 .ghero{width:148px;height:148px}#premios .tier .ghero img{max-width:100%;max-height:100%;object-fit:contain}#premios .tier .gextra{width:64px;height:84px;background:#fff;border-radius:14px;padding:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;box-shadow:0 8px 18px rgba(0,0,0,.18)}#premios .tier .gextra svg{width:38px;height:38px}#premios .tier .gextra .lbl{font-size:8.5px;font-weight:800;color:var(--mut);letter-spacing:.06em;text-transform:uppercase}#premios .tier .gnm{font-size:14px;font-weight:700;color:#fff;line-height:1.35;text-wrap:balance;max-width:200px}#premios .tier .gnm b{color:var(--gold);display:block;font-weight:800;font-size:15px;margin-top:2px}#premios .pcard.frente{grid-column:span 4;background:#fff;border:1px solid var(--line);border-radius:26px;padding:30px 28px 28px;display:flex;flex-direction:column;gap:18px;position:relative;overflow:hidden;min-height:380px;box-shadow:0 10px 32px rgba(11,32,26,.06);transition:transform .3s ease,box-shadow .3s ease}#premios .pcard.frente:hover{transform:translateY(-4px);box-shadow:0 22px 48px rgba(11,32,26,.12)}@media(max-width:1024px){#premios .pcard.frente{grid-column:span 6}}@media(max-width:720px){#premios .pcard.frente{grid-column:span 12}}#premios .pcard.frente.golden{background:linear-gradient(160deg,#fff 0%,#fffbef 100%);border:1px solid rgba(184,130,26,.22)}#premios .pcard.frente.golden::before{content:\"\";position:absolute;right:-60px;top:-60px;width:220px;height:220px;border-radius:50%;background:radial-gradient(circle,rgba(227,165,31,.18),transparent 70%);pointer-events:none}#premios .pcard.frente .frente-top{display:flex;align-items:flex-start;gap:14px}#premios .pcard.frente .picon{width:56px;height:56px;border-radius:16px;flex:none;display:flex;align-items:center;justify-content:center;font-size:28px;background:var(--teal-tint);margin-bottom:0}#premios .pcard.frente.golden .picon{background:linear-gradient(135deg,#fbf2da,#f4dc8e);box-shadow:inset 0 0 0 1px rgba(184,130,26,.25)}#premios .pcard.frente .frente-head{flex:1;min-width:0}#premios .pcard.frente .pkicker{display:inline-flex;align-items:center;gap:8px;font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--teal-d);margin-bottom:6px}#premios .pcard.frente.golden .pkicker{color:var(--gold-d)}#premios .pcard.frente h3{font-size:21px;line-height:1.15;letter-spacing:-.01em;margin-bottom:0;text-wrap:balance}#premios .pcard.frente .frente-body{font-size:14.5px;line-height:1.55;color:var(--mut);flex:1}#premios .pcard.frente .frente-body b{color:var(--ink)}#premios .pcard.frente .frente-prize{margin-top:auto;background:var(--bg-soft);border:1px dashed var(--line-2);border-radius:18px;padding:14px 16px;display:flex;align-items:center;gap:14px}#premios .pcard.frente.golden .frente-prize{background:rgba(227,165,31,.08);border:1px dashed rgba(184,130,26,.35)}#premios .pcard.frente .frente-prize .pp-lbl{font-size:10.5px;font-weight:800;color:var(--mut);letter-spacing:.07em;text-transform:uppercase}#premios .pcard.frente .frente-prize .pp-val{font-family:'Bricolage Grotesque';font-weight:800;font-size:18px;color:var(--ink);line-height:1.1;margin-top:3px}#premios .pcard.frente.golden .frente-prize .pp-val{color:var(--gold-deep)}#premios .pcard.frente .shirtgrid{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:6px}#premios .pcard.frente .shirtgrid .si{aspect-ratio:1;background:#fff;border:1px solid var(--line);border-radius:12px;padding:6px;display:flex;align-items:center;justify-content:center;transition:transform .25s ease}#premios .pcard.frente .shirtgrid .si:hover{transform:translateY(-2px) rotate(-2deg)}#premios .pcard.frente .shirtgrid .si img{max-width:100%;max-height:100%;object-fit:contain}#premios .pcard.frente .duoprize{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:4px}#premios .pcard.frente .duoprize .di{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px;display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center}#premios .pcard.frente .duoprize .di img,#premios .pcard.frente .duoprize .di svg{width:64px;height:64px;object-fit:contain}#premios .pcard.frente .duoprize .di .lbl{font-size:11.5px;font-weight:800;color:var(--ink);letter-spacing:.02em;line-height:1.2}#premios .pcard.frente .triogrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}#premios .pcard.frente .triogrid .ti{aspect-ratio:1;background:#fff;border:1px solid var(--line);border-radius:14px;padding:10px;display:flex;align-items:center;justify-content:center}#premios .pcard.frente .triogrid .ti img{max-width:100%;max-height:100%;object-fit:contain}#premios .prizenote{margin-top:30px;background:#fff;border:1px solid var(--line);border-radius:20px;padding:22px 26px;display:flex;align-items:flex-start;gap:18px;box-shadow:0 6px 18px rgba(11,32,26,.05)}#premios .prizenote .bigico{width:48px;height:48px;border-radius:14px;background:var(--teal-tint);color:var(--teal-d);display:flex;align-items:center;justify-content:center;font-size:22px;flex:none}#premios .prizenote p{font-size:14.5px;line-height:1.55;color:var(--mut)}#premios .prizenote p b{color:var(--ink)}#premios .prizecta{margin-top:34px;display:flex;justify-content:center}#premios .prizecta a{display:inline-flex;align-items:center;gap:10px;background:linear-gradient(135deg,#e3a51f,#b9821a);color:#fff;font-weight:800;letter-spacing:.02em;padding:18px 36px;border-radius:999px;font-size:16px;box-shadow:0 18px 38px rgba(184,130,26,.32);transition:transform .25s ease,box-shadow .25s ease}#premios .prizecta a:hover{transform:translateY(-2px);box-shadow:0 22px 44px rgba(184,130,26,.42)}#premios .prizecta a .arrow{transition:transform .25s ease}#premios .prizecta a:hover .arrow{transform:translateX(4px)}@media (prefers-reduced-motion:reduce){#premios *{animation:none!important;transition:none!important}}#indique{background:linear-gradient(160deg,#0a6c55,#06352a);color:#fff}#indique .eyebrow{color:var(--gold)}#indique .eyebrow::before{background:var(--gold)}#indique .h2{color:#fff}#indique .lead{color:rgba(255,255,255,.84)}.refsteps{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:34px}@media(max-width:780px){.refsteps{grid-template-columns:1fr}}.refstep{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:18px;padding:26px;position:relative}.refstep .rn{position:absolute;top:22px;right:24px;font-family:'Bricolage Grotesque';font-weight:800;font-size:34px;color:#fff}.refstep .ic{width:50px;height:50px;border-radius:14px;background:rgba(255,255,255,.1);display:flex;align-items:center;justify-content:center;font-size:24px;margin-bottom:14px}.refstep h4{font-size:18px;margin-bottom:7px;color:#fff}.refstep p{font-size:14.5px;color:rgba(255,255,255,.78);line-height:1.5}.refstep b{color:var(--gold)}.refnote{display:flex;gap:12px;align-items:center;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16);border-radius:14px;padding:16px 20px;margin-top:18px;font-size:14.5px;color:rgba(255,255,255,.88)}.refnote .bigico{font-size:22px;flex:none}.refnote b{color:#fff}.refbox{background:radial-gradient(ellipse 80% 70% at 100% 0%,rgba(245,199,79,.18) 0%,transparent 60%),radial-gradient(ellipse 60% 50% at 0% 100%,rgba(6,53,42,.06) 0%,transparent 60%),linear-gradient(150deg,var(--teal-tint) 0%,#fff 65%);border:2px solid #cfe5d8;box-shadow:0 18px 50px rgba(7,26,19,.10),0 0 0 6px rgba(245,199,79,.07);position:relative;overflow:hidden;padding-top:54px;margin-top:14px}.refbox::before{content:\"\ud83c\udfc6 Top 3 ganha camisa do Brasil\";position:absolute;top:0;left:0;right:0;min-height:38px;padding:8px 14px;background:linear-gradient(90deg,#06352a 0%,#0d7d56 60%,#1c5a3a 100%);color:#f5c74f;font-family:'Bricolage Grotesque';font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.09em;display:flex;align-items:center;justify-content:center;text-shadow:0 1px 6px rgba(0,0,0,.30);z-index:2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-sizing:border-box}@media(max-width:520px){.refbox::before{font-size:10.5px;letter-spacing:.04em;padding:8px 10px;min-height:34px}.refbox{padding-top:48px}}@media(max-width:380px){.refbox::before{content:\"\ud83c\udfc6 Top 3 ganha camisa\";font-size:10.5px;letter-spacing:.04em}}.refbox::after{content:\"\";position:absolute;top:-110px;right:-100px;width:300px;height:300px;background:radial-gradient(circle,rgba(245,199,79,.20) 0%,transparent 65%);pointer-events:none;z-index:0}.refbox > *{position:relative;z-index:1}.refbox .reflabel{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--teal-d);font-weight:800;margin-bottom:8px;display:flex;align-items:center;gap:8px}.refbox .reflabel::after{content:\"\";flex:1;height:1px;background:linear-gradient(90deg,rgba(6,53,42,.18) 0%,transparent 100%)}.reflink{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}.reflink input{flex:1;min-width:220px;background:#fff;border:1.5px solid var(--line-2);border-radius:11px;padding:13px 15px;font:inherit;font-size:14px;color:var(--ink-2);font-weight:600;outline:none}.refstat{display:flex;align-items:center;gap:14px;margin-top:14px;background:#fff;border:1px solid var(--line);border-radius:13px;padding:14px 18px}.refstat .big{font-family:'Bricolage Grotesque';font-weight:800;font-size:34px;color:var(--teal);line-height:1;flex:none}.refstat .lbl{font-size:13.5px;color:var(--mut)}.refstat .lbl b{color:var(--ink)}.refboard{margin-top:18px;background:#fff;border:1.5px solid var(--teal-tint-2)}.refboard-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}.refboard-head .rb-eyebrow{font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--teal-d);font-weight:800}.refboard-head .rb-sub{font-size:12.5px;color:var(--mut)}.refboard-list{display:flex;flex-direction:column;gap:6px}.refrow{display:grid;grid-template-columns:42px 1fr auto;align-items:center;gap:12px;padding:10px 12px;border-radius:11px;border:1px solid var(--line);background:#fff}.refrow.podium{background:linear-gradient(95deg,#fffaeb 0%,#fff 100%);border-color:#f0d97a}.refrow.me{background:linear-gradient(95deg,var(--teal-tint) 0%,#fff 100%);border-color:var(--teal);box-shadow:0 0 0 2px rgba(6,53,42,.08)}.refrow.me.podium{background:linear-gradient(95deg,#fff4cf 0%,var(--teal-tint) 100%);border-color:var(--teal-d)}.refrow .rpos{font-family:'Bricolage Grotesque';font-weight:800;font-size:18px;color:var(--teal-d);text-align:center;line-height:1}.refrow.podium .rpos{font-size:22px}.refrow .rwho{min-width:0;overflow:hidden}.refrow .rwho b{display:block;font-size:14px;color:var(--ink);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.refrow .rwho small{display:block;font-size:11.5px;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}.refrow .rwho .meyou{color:var(--teal-d);background:rgba(6,53,42,.08);padding:1px 6px;border-radius:5px;font-size:11px;text-transform:uppercase;letter-spacing:.05em}.refrow .rval{text-align:right;flex:none}.refrow .rval b{display:block;font-family:'Bricolage Grotesque';font-weight:800;font-size:20px;color:var(--teal);line-height:1}.refrow .rval small{display:block;font-size:11px;color:var(--mut);margin-top:2px}.refboard-you-out,.refboard-you-in,.refboard-you-top{margin-top:12px;padding:11px 14px;border-radius:10px;font-size:13.5px;line-height:1.45}.refboard-you-out{background:#fff8e7;border:1px solid #e3c87a;color:#7a5b12}.refboard-you-in{background:var(--teal-tint);border:1px solid var(--teal-tint-2);color:var(--teal-d)}.refboard-you-top{background:linear-gradient(95deg,#fff4cf,#fffaeb);border:1px solid #f0d97a;color:#6b4f0a}.refboard-empty{font-size:13.5px;color:var(--mut);padding:6px 2px}@media (max-width:520px){.refrow{grid-template-columns:36px 1fr auto;gap:10px;padding:9px 10px}.refrow .rwho b{font-size:13px}.refrow .rval b{font-size:17px}}.myrefdetails{margin-top:14px;background:#fff;border:1.5px solid var(--line);padding:0}.myrefdetails summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:12px;padding:16px 20px;user-select:none}.myrefdetails summary::-webkit-details-marker{display:none}.myrefdetails .myref-eyebrow{font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--teal-d);font-weight:800}.myrefdetails .myref-sum{flex:1;font-size:13px;color:var(--mut)}.myrefdetails .myref-chev{font-family:'Bricolage Grotesque';font-weight:800;font-size:22px;color:var(--mut-2);transform:rotate(90deg);transition:transform .2s ease}.myrefdetails[open] .myref-chev{transform:rotate(-90deg)}.myrefdetails > div{padding:0 20px 18px}.myref-list{display:flex;flex-direction:column;gap:8px;margin-top:4px}.myref-row{display:grid;grid-template-columns:1fr auto;align-items:center;gap:12px;padding:10px 12px;border-radius:10px;border:1px solid var(--line);background:#fff}.myref-row.val{background:linear-gradient(95deg,var(--teal-tint) 0%,#fff 80%);border-color:var(--teal-tint-2)}.myref-row.pend{background:linear-gradient(95deg,#fff8e7 0%,#fff 80%);border-color:#f0d97a}.myref-who b{display:block;font-size:14px;color:var(--ink);font-weight:700;line-height:1.2}.myref-who small{display:block;font-size:11.5px;color:var(--mut);margin-top:2px}.myref-meta{display:flex;align-items:center;gap:8px;flex:none}.myref-badge{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;padding:4px 9px;border-radius:6px;white-space:nowrap}.myref-badge.ok{background:rgba(6,53,42,.08);color:var(--teal-d)}.myref-badge.wait{background:#fff;color:#7a5b12;border:1px solid #e3c87a}.btn.whats.sm{padding:6px 11px;font-size:12px;border-radius:8px;line-height:1}.myref-hint{margin:14px 0 0;font-size:13px;color:var(--mut);background:#fff8e7;border:1px solid #e3c87a;border-radius:9px;padding:10px 12px;line-height:1.45}.myref-hint b{color:#7a5b12}.myref-empty{font-size:13.5px;color:var(--mut);padding:6px 2px}@media (max-width:520px){.myrefdetails summary{padding:14px 16px;gap:8px}.myrefdetails > div{padding:0 16px 16px}.myref-row{grid-template-columns:1fr;gap:8px}.myref-meta{justify-content:flex-start}}.schtag{display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-right:6px;line-height:1}.schtag.mil{color:var(--teal-d)}.schtag.ev{color:var(--ev-d)}.schoolboard{margin-top:6px}.srow{display:grid;grid-template-columns:40px 1fr auto;gap:14px;align-items:center;padding:16px 4px;border-bottom:1px solid var(--line)}.srow:last-child{border:0}.srow .spos{font-family:'Bricolage Grotesque';font-weight:800;font-size:20px;color:var(--mut-2);text-align:center}.srow.lead1 .spos{color:var(--gold-d)}.srow.is-mine{background:var(--teal-tint);border-radius:12px;padding-left:10px;padding-right:10px}.srow.is-mine .spos{color:var(--teal)}.srow.is-mine .sname{color:var(--teal-d,#0a6b54)}.smid{min-width:0}.sname{font-family:'Bricolage Grotesque';font-weight:800;font-size:16px;display:flex;align-items:center;gap:8px}.sname .crown{font-size:15px}.smeta{font-size:12.5px;color:var(--mut-2);margin-top:2px}.sbar{height:8px;border-radius:99px;background:var(--bg-mute);margin-top:9px;overflow:hidden}.sbar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,var(--teal-x),var(--teal-d));transition:width .6s cubic-bezier(.2,.7,.2,1)}.srow.lead1 .sbar i{background:linear-gradient(90deg,#f6d271,var(--gold))}.spts{text-align:right;white-space:nowrap}.spts .v{font-family:'Bricolage Grotesque';font-weight:800;font-size:22px;color:var(--teal)}.srow.lead1 .spts .v{color:var(--gold-d)}.spts .u{font-size:11px;color:var(--mut-2);font-weight:700;display:block;margin-top:1px}.liveflag{display:inline-flex;align-items:center;gap:7px;vertical-align:middle;font-family:'Hanken Grotesk';font-size:12px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#d6453f;background:#fbeaea;border:1px solid #f2cfcd;padding:5px 12px 5px 11px;border-radius:99px;margin-left:12px;position:relative;top:-5px}.liveupd{font-size:12px;color:var(--mut-2);font-weight:600;margin-top:12px;display:flex;align-items:center;gap:8px}.liveupd::before{content:\"\";width:7px;height:7px;border-radius:50%;background:var(--green);flex:none;animation:liveblink 1.5s ease-in-out infinite}@media (prefers-reduced-motion:reduce){.liveupd::before{animation:none}}.otpwrap{margin:6px 0 2px}.otpinput{width:230px;max-width:100%;text-align:center;font-family:'Bricolage Grotesque';font-weight:800;font-size:30px;letter-spacing:.42em;padding:14px 10px 14px 18px;background:var(--bg-soft);border:1.5px solid var(--line-2);color:var(--ink);border-radius:14px;outline:none;transition:.16s}.otpinput:focus{border-color:var(--teal);background:#fff;box-shadow:0 0 0 4px var(--teal-tint)}.otpinput.err{border-color:var(--red);background:var(--red-tint)}.demohint{background:var(--gold-tint);border:1px dashed #e3c87a;border-radius:11px;padding:12px 16px;font-size:13.5px;color:#7a5b12;margin:14px 0;line-height:1.5}.demohint .code{font-family:'Bricolage Grotesque';font-weight:800;letter-spacing:.18em;font-size:17px;background:#fff;padding:2px 11px;border-radius:7px;border:1px solid #e3c87a;color:var(--gold-d);white-space:nowrap}.vbtns{display:flex;gap:10px;flex-wrap:wrap;margin-top:18px}.vbtns .btn{padding:13px 20px;font-size:14px}.vbadge{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:800;color:var(--green);background:#e7f6ee;border:1px solid #bfe6d0;padding:4px 10px;border-radius:99px;margin-left:9px;vertical-align:middle;white-space:nowrap}.cpfnote{display:flex;gap:9px;align-items:flex-start;font-size:13px;color:var(--mut);margin-top:14px;line-height:1.5}.cpfnote .bigico{font-size:16px;flex:none;margin-top:1px}.card.slim{max-width:520px;margin:0 auto;padding:28px 30px}.card.slim .fld{margin-bottom:0}.savewrap{padding:12px 16px 4px;display:flex;justify-content:flex-end}.btn.save-game{padding:10px 18px;font-size:13.5px;min-width:160px;text-align:center;justify-content:center;border-radius:11px;border:1.5px solid transparent}.btn.save-game[disabled]{opacity:.7;cursor:wait}.btn.save-game.update-mode{background:var(--teal-tint);color:var(--teal-d);border-color:var(--teal-x);box-shadow:none}.btn.save-game.update-mode:hover{background:var(--teal-tint-2);border-color:var(--teal)}.btn.save-game.saved-state{background:linear-gradient(135deg,#13a684,#0e8e70)!important;color:#fff!important;border-color:transparent!important;box-shadow:0 6px 16px rgba(15,140,110,.28)}body:has(#adminGateLoading){margin:0;background:#f4f7f5;color:var(--ink);font-family:'Hanken Grotesk',system-ui,sans-serif}#adminGateLoading{display:flex;position:fixed;inset:0;background:linear-gradient(180deg,#06352a,#0a4b3a);z-index:9999;align-items:center;justify-content:center}body:has(#adminGateLoading) .admin-shell{display:none}body.admin-loaded:has(#adminGateLoading) .admin-shell{display:grid}body.admin-loaded:has(#adminGateLoading) #adminGateLoading{display:none}.admin-page{margin:0;background:#f4f7f5;color:var(--ink);font-family:'Hanken Grotesk',system-ui,sans-serif}.admin-page.gated .admin-shell{display:none}.admin-page.gated #adminGateLoading{display:flex}.agl-card{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:18px;padding:36px 44px;display:flex;flex-direction:column;align-items:center;gap:16px;color:#fff;backdrop-filter:blur(6px)}.agl-spin{width:28px;height:28px;border:2.5px solid rgba(255,255,255,.18);border-top-color:#e3a51f;border-radius:50%;animation:savespin .9s linear infinite}.agl-msg{font-size:14.5px;font-weight:600;color:#dfeae3}.admin-shell{display:grid;grid-template-columns:240px 1fr;min-height:100vh}.admin-sidebar{background:linear-gradient(180deg,#06352a 0%,#0a4b3a 65%,#5a2a00 92%,var(--ev-d) 100%);color:#fff;display:flex;flex-direction:column;padding:22px 0;position:sticky;top:0;height:100vh;overflow-y:auto;border-right:3px solid transparent;border-image:linear-gradient(180deg,var(--teal-x) 0%,var(--teal-x) 50%,var(--ev) 50%,var(--ev) 100%) 1}.as-toggle{display:none;background:transparent;border:0;color:#fff;font-size:22px;cursor:pointer;padding:6px 12px;align-self:flex-start;margin:0 12px 12px}.as-brand{display:flex;align-items:center;gap:12px;padding:0 20px 22px;border-bottom:1px solid rgba(255,255,255,.1);margin-bottom:14px}.as-brand svg{width:38px;height:38px;flex:none}.as-brand b{font-family:'Bricolage Grotesque';font-weight:800;font-size:15px;line-height:1.1;display:block;color:#fff}.as-brand small{font-size:11.5px;color:#bfd6cb;font-weight:600;display:block;margin-top:2px;text-transform:uppercase;letter-spacing:.06em}.as-brand-dual{flex-direction:column;align-items:flex-start;gap:10px}.as-brand-dual .as-brand-logos{display:flex;flex-direction:column;gap:6px;width:100%}.as-brand-dual .as-brand-logos img{height:22px;width:auto;filter:drop-shadow(0 1px 3px rgba(0,0,0,.25))}.as-brand-dual .as-brand-title b{font-size:14px}.admin-footer{margin-top:auto;padding:28px 32px 26px;background:linear-gradient(102deg,var(--teal-deep) 0%,var(--teal-deeper) 55%,#5a2a00 88%,var(--ev-d) 100%);color:rgba(255,255,255,.8);font-size:13px;border-top:3px solid transparent;border-image:linear-gradient(90deg,var(--teal-x) 0%,var(--teal-x) 50%,var(--ev) 50%,var(--ev) 100%) 1;display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}.admin-footer-lockup{display:flex;align-items:center;gap:14px}.admin-footer-lockup img{height:30px;width:auto;filter:drop-shadow(0 2px 5px rgba(0,0,0,.3))}.admin-footer-meta{font-size:12.5px;color:rgba(255,255,255,.7)}.admin-footer-meta b{color:#fff;font-weight:800}@media(max-width:640px){.admin-footer{padding:22px 16px}.admin-footer-lockup img{height:26px}}.as-nav{display:flex;flex-direction:column;gap:2px;padding:0 12px;flex:1}.as-nav a{display:flex;align-items:center;gap:11px;padding:11px 14px;border-radius:10px;color:#dfeae3;text-decoration:none;font-size:14px;font-weight:600;transition:background .15s,color .15s}.as-nav a span{font-size:16px;width:22px;text-align:center}.as-nav a:hover{background:rgba(255,255,255,.07);color:#fff}.as-nav a.active{background:#e3a51f;color:#5a4209;font-weight:800}.as-foot{padding:18px 20px 0;border-top:1px solid rgba(255,255,255,.1);margin-top:14px}.as-foot a{color:#bfd6cb;font-size:13px;text-decoration:none;font-weight:600}.as-foot a:hover{color:#fff}.admin-main{display:flex;flex-direction:column;min-width:0}.admin-topbar{display:flex;justify-content:space-between;align-items:center;padding:22px 32px;background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:10}.admin-topbar h1{font-family:'Bricolage Grotesque';font-weight:800;font-size:24px;color:var(--ink);margin:0}.at-user{display:flex;align-items:center;gap:12px}.at-name{font-weight:700;font-size:14px;color:var(--ink)}.at-badge{background:var(--gold-tint);color:var(--gold-d);font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;padding:4px 9px;border-radius:99px;border:1px solid #f0dca8}.at-user .btn{padding:8px 16px;font-size:13px}.admin-section{display:none;padding:28px 32px;max-width:100%;overflow-x:auto}.admin-section.active{display:block}.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-bottom:22px}.kpi{background:#fff;border:1px solid var(--line);border-radius:14px;padding:18px 20px;display:flex;flex-direction:column;gap:4px;transition:border-color .15s,transform .15s}.kpi:hover{border-color:var(--teal-x);transform:translateY(-1px)}.kpi.hl{background:linear-gradient(180deg,#fff8e7,#fff);border-color:#e3c87a}.kpi .kl{font-size:11.5px;text-transform:uppercase;letter-spacing:.06em;font-weight:800;color:var(--mut-2)}.kpi .kv{font-family:'Bricolage Grotesque';font-weight:800;font-size:34px;color:var(--ink);line-height:1.05;margin-top:2px}.kpi.hl .kv{color:var(--gold-d)}.kpi .kd{font-size:12px;color:var(--mut);margin-top:2px}.kpi .kd .up{color:var(--green);font-weight:700}.kpi .kd .down{color:var(--red);font-weight:700}.admin-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:20px;margin-bottom:18px}.admin-card h3{font-family:'Bricolage Grotesque';font-weight:800;font-size:17px;margin:0 0 12px;color:var(--ink)}.admin-table{width:100%;border-collapse:collapse;font-size:13.5px}.admin-table th{text-align:left;padding:11px 12px;border-bottom:1.5px solid var(--line);font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--mut-2);font-weight:800;background:var(--bg-soft);position:sticky;top:0}.admin-table td{padding:11px 12px;border-bottom:1px solid var(--line);color:var(--ink);vertical-align:middle}.admin-table tr:last-child td{border-bottom:0}.admin-table tr:hover td{background:#f9fbfa}.admin-table .num{text-align:right;font-variant-numeric:tabular-nums;font-weight:700}.admin-table .pill{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:800;padding:3px 8px;border-radius:99px;background:var(--bg-mute);color:var(--mut)}.admin-table .pill.ok{background:#e7f6ee;color:#0a5b3f;border:1px solid #bfe6d0}.admin-table .pill.err{background:#fbeaea;color:#d6453f;border:1px solid #f2cfcd}.admin-table .pill.gold{background:#fff4d6;color:var(--gold-d);border:1px solid #e3c87a}.admin-actions{display:flex;gap:8px;flex-wrap:wrap}.admin-actions .btn{padding:8px 14px;font-size:12.5px}.admin-filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px;background:#fff;padding:14px 16px;border-radius:12px;border:1px solid var(--line)}.admin-filters .fld{margin:0;flex:1;min-width:160px}.admin-filters .fld label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;font-weight:800;color:var(--mut-2);display:block;margin-bottom:5px}.admin-filters input,.admin-filters select{width:100%;padding:9px 12px;font-size:13.5px;border:1.5px solid var(--line-2);border-radius:9px;background:#fff;color:var(--ink)}.admin-filters input:focus,.admin-filters select:focus{outline:none;border-color:var(--teal);background:#fff;box-shadow:0 0 0 3px var(--teal-tint)}.admin-pagination{display:flex;justify-content:center;align-items:center;gap:14px;margin-top:18px;font-size:13px;color:var(--mut)}.admin-pagination .btn{padding:8px 14px;font-size:12.5px}.ad-matches{display:grid;gap:12px}.ad-match{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:border-color .15s}.ad-match:hover{border-color:var(--teal-x)}.adm-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}.adm-title{font-family:'Bricolage Grotesque';font-weight:700;font-size:16px;color:var(--ink)}.adm-meta{font-size:12px;color:var(--mut-2);font-weight:600;display:flex;gap:6px;align-items:center;flex-wrap:wrap}.adm-row{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.adm-score-row{display:flex;align-items:center;gap:6px}.adm-score-row .mini{width:54px;padding:8px 10px;font-size:16px;font-weight:800;text-align:center;border:1.5px solid var(--line-2);border-radius:8px;font-variant-numeric:tabular-nums}.adm-score-row .mini:focus{outline:none;border-color:var(--teal);background:#fff;box-shadow:0 0 0 3px var(--teal-tint)}.adm-score-row .x{font-weight:800;color:var(--mut-2);font-size:14px}.adm-stats{display:flex;gap:14px}.adm-stat{display:flex;flex-direction:column;text-align:right;font-size:11.5px}.adm-stat b{font-family:'Bricolage Grotesque';font-weight:800;font-size:18px;color:var(--ink);line-height:1.1}.adm-stat span{color:var(--mut-2);font-weight:600;text-transform:uppercase;letter-spacing:.03em;margin-top:2px}.adm-dist{display:flex;gap:6px;flex-wrap:wrap;padding-top:8px;border-top:1px dashed var(--line);font-size:11.5px}.adm-dist .pill{background:var(--bg-soft);color:var(--mut)}.adm-dist .pill b{color:var(--teal-d)}.admin-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}.admin-modal[hidden]{display:none!important}.amd-backdrop{position:absolute;inset:0;background:rgba(4,38,30,.55);backdrop-filter:blur(2px)}.amd-panel{position:relative;background:#fff;border-radius:18px;max-width:840px;width:calc(100vw - 40px);max-height:calc(100vh - 60px);overflow-y:auto;padding:30px 32px;box-shadow:0 30px 60px rgba(4,38,30,.32)}.amd-close{position:absolute;top:14px;right:18px;background:transparent;border:0;font-size:26px;cursor:pointer;color:var(--mut-2);line-height:1;padding:6px 10px;z-index:2}.amd-close:hover{color:var(--ink)}.admin-backdrop{position:fixed;inset:0;background:rgba(4,38,30,.55);z-index:40;animation:bdfade .2s ease-out}.admin-backdrop[hidden]{display:none!important}@keyframes bdfade{from{opacity:0}to{opacity:1}}.topbar-burger{display:none;background:transparent;border:0;font-size:24px;cursor:pointer;color:var(--ink);padding:6px 12px 6px 0;margin-right:4px;line-height:1}.topbar-burger:hover{color:var(--teal-d)}@media (max-width:900px){.admin-shell{grid-template-columns:1fr}.admin-sidebar{position:fixed;left:0;top:0;width:260px;transform:translateX(-100%);transition:transform .25s;z-index:50}.admin-sidebar.open{transform:translateX(0);box-shadow:18px 0 40px rgba(4,38,30,.32)}.as-toggle{display:none}.topbar-burger{display:inline-flex;align-items:center}.admin-topbar{padding:16px 16px}.admin-topbar h1{font-size:18px}.admin-section{padding:18px 14px}.admin-main{margin-left:0}.at-user{gap:8px}.at-user .at-name{display:none}.at-badge{padding:3px 7px;font-size:9.5px}.at-user .btn{padding:7px 12px;font-size:12px}.admin-table{min-width:640px}.kpi-grid{grid-template-columns:repeat(2,1fr);gap:10px}.kpi{padding:14px 16px}.kpi .kv{font-size:26px}.kpi .kl{font-size:10.5px}.kpi .kd{font-size:11px}.admin-table th,.admin-table td{padding:9px 10px;font-size:12.5px}.admin-card{padding:16px 14px;border-radius:12px}.admin-card h3{font-size:15.5px}.admin-filters{flex-direction:column;align-items:stretch;padding:12px 14px}.admin-filters .fld{min-width:0}.amd-panel{padding:24px 18px;border-radius:14px;width:100%;max-height:100vh;border-radius:14px 14px 0 0}.amd-close{top:10px;right:12px}}@media (max-width:500px){.kpi-grid{grid-template-columns:1fr}.ad-match{padding:12px 14px}.adm-row{flex-direction:column;align-items:flex-start;gap:10px}.adm-score-row{flex-wrap:wrap}}.hero-form{background:linear-gradient(180deg,#06352a 0%,#0a4b3a 100%);color:#fff;padding:72px 0 40px;position:relative;overflow:hidden}.hero-form::before{content:\"\";position:absolute;inset:-40% -25% auto auto;width:520px;height:520px;background:radial-gradient(closest-side,rgba(227,165,31,.18),transparent 70%);pointer-events:none}.hero-form .hf-copy{max-width:760px;position:relative}.hero-form .kicker{display:inline-flex;align-items:center;gap:8px;font-size:12.5px;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:#e3a51f;margin-bottom:12px}.hero-form .kicker .tagtrophy{height:18px;width:auto}.hero-form h1{color:#fff;font-size:clamp(34px,5vw,52px);line-height:1.05;margin:0 0 14px}.hero-form h1 .gold{color:#e3a51f}.hero-form .lead{color:#dfeae3;font-size:16.5px;max-width:640px;margin:0;line-height:1.55}.form-section{padding:56px 0 80px;background:var(--bg-soft);min-height:60vh}.form-section .card{margin-top:0}@media (max-width:720px){.hero-form{padding:54px 0 30px}.form-section{padding:38px 0 60px}}.hero-aluno{background:linear-gradient(180deg,#06352a 0%,#0a4b3a 100%);color:#fff;padding:74px 0 38px;border-bottom:1px solid rgba(255,255,255,.07);position:relative;overflow:hidden}.hero-aluno::before{content:\"\";position:absolute;inset:-40% -20% auto auto;width:520px;height:520px;background:radial-gradient(closest-side,rgba(227,165,31,.18),transparent 70%);pointer-events:none}.hero-aluno .hello{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}.hero-aluno .hello-l{max-width:760px}.hero-aluno .kicker{display:inline-flex;align-items:center;gap:8px;font-size:12px;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:#e3a51f;margin-bottom:10px}.hero-aluno h1{color:#fff;font-size:clamp(34px,5vw,52px);line-height:1.05;margin:0 0 14px}.hero-aluno h1 .gold{color:#e3a51f}.hero-aluno .lead{color:#dfeae3;font-size:16px;max-width:680px;margin:0}.hero-aluno .logout{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);color:#fff;padding:10px 18px;font-size:13px;flex:none}.hero-aluno .logout:hover{background:rgba(255,255,255,.14)}#mypanel{margin-top:28px}.dashgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.dash{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.13);border-radius:16px;padding:16px 18px;display:flex;flex-direction:column;gap:4px;backdrop-filter:blur(4px)}.dash.hl{background:linear-gradient(180deg,rgba(227,165,31,.18),rgba(227,165,31,.06));border-color:rgba(227,165,31,.45)}.dash .dl{font-size:11px;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:#bfd6cb}.dash.hl .dl{color:#f3d989}.dash .dv{font-family:'Bricolage Grotesque';font-weight:800;font-size:34px;color:#fff;line-height:1.05;margin-top:2px}.dash.hl .dv{color:#ffd86b}.dash .ds{font-size:12px;color:#bfd6cb;margin-top:2px}.dash.hl .ds{color:#e6c878}.studypack{background:linear-gradient(135deg,#fff 0%,#f0f7f3 100%);border:1.5px solid #cfe5d8;border-radius:20px;padding:20px 24px;display:flex;align-items:center;gap:22px;flex-wrap:wrap;position:relative;overflow:hidden}.studypack::before{content:\"\";position:absolute;top:-50px;right:-50px;width:180px;height:180px;background:radial-gradient(circle,rgba(227,165,31,.14) 0%,transparent 65%);pointer-events:none}.studypack.locked{background:linear-gradient(135deg,#fff 0%,#fbf5e8 100%);border:1.5px dashed #e3c87a}.studypack.locked::before{background:radial-gradient(circle,rgba(201,58,47,.10) 0%,transparent 65%)}.studypack .pack-icon{font-size:38px;flex:none;line-height:1;filter:drop-shadow(0 4px 12px rgba(7,26,19,.18))}.studypack .pack-copy{flex:1;min-width:220px;position:relative}.studypack .pack-eyebrow{font-family:'Bricolage Grotesque';font-weight:800;font-size:11px;text-transform:uppercase;letter-spacing:.14em;color:#06352a;margin-bottom:4px}.studypack.locked .pack-eyebrow{color:#7a5b12}.studypack .pack-title{font-family:'Bricolage Grotesque';font-weight:800;font-size:21px;line-height:1.2;color:var(--ink);margin-bottom:6px}.studypack .pack-sub{font-size:13.5px;color:var(--mut);line-height:1.5}.studypack .pack-cta-go{align-self:flex-start;flex:none;margin-top:6px}.pack-stats{display:flex;gap:18px;flex:none;padding-left:22px;border-left:1px solid var(--line);position:relative}.pack-stat{display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:64px}.pack-stat-n{font-family:'Bricolage Grotesque';font-weight:800;font-size:24px;color:#06352a;line-height:1;letter-spacing:-.02em}.pack-stat-l{font-size:10.5px;color:var(--mut-2);text-transform:uppercase;letter-spacing:.06em;margin-top:2px}@media(max-width:760px){.pack-stats{padding-left:0;border-left:0;width:100%;justify-content:space-between;padding-top:14px;border-top:1px solid var(--line)}}.studyverticals{display:flex;flex-direction:column;gap:18px;margin-top:16px}.studyvert{background:#fff;border:1.5px solid var(--line);border-radius:22px;padding:22px 24px;display:flex;flex-direction:column;gap:16px;position:relative;overflow:hidden}.studyvert.sv-em{background:radial-gradient(ellipse 80% 60% at 0% 0%,rgba(6,53,42,.07) 0%,transparent 60%),linear-gradient(170deg,#f0f7f3 0%,#fff 55%);border-color:#cfe5d8}.studyvert.sv-em::before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#06352a 0%,#0d7d56 100%);pointer-events:none}.studyvert.sv-ev{background:radial-gradient(ellipse 80% 60% at 0% 0%,rgba(227,165,31,.10) 0%,transparent 60%),linear-gradient(170deg,#fbf5e8 0%,#fff 55%);border-color:#e3c87a}.studyvert.sv-ev::before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#a07314 0%,#f5c74f 100%);pointer-events:none}.studyvert .sv-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.sv-badge{display:inline-flex;align-items:center;gap:8px;font-family:'Bricolage Grotesque';font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.1em;padding:7px 13px;border-radius:999px;line-height:1}.sv-badge.sv-em{background:#06352a;color:#fff}.sv-badge.sv-ev{background:#e3a51f;color:#1b1300}.studyvert .sv-kicker{font-size:13px;color:var(--mut-2);font-weight:600;letter-spacing:.01em}.studygrid{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:stretch}.studycard{background:var(--bg-soft);border:1.5px solid var(--line);border-radius:18px;position:relative;overflow:hidden;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;display:flex;flex-direction:column}.studycard:not(.locked):hover{transform:translateY(-3px);box-shadow:0 14px 36px rgba(7,26,19,.10);border-color:#06352a}.studycard.locked{opacity:.72;border-style:dashed;background:#fafbf7}.studycard.locked:hover{transform:none;border-color:var(--line);box-shadow:none}.studycard.feat{padding:0;display:flex;flex-direction:column}.studycard.feat .sc-cover{width:100%;height:104px;background:radial-gradient(circle at 28% 32%,rgba(227,165,31,.20) 0%,transparent 55%),linear-gradient(135deg,#06352a 0%,#0a5b3f 50%,#0d7d56 100%);position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;flex:none;align-self:stretch}.studycard.feat.sv-ev .sc-cover{background:radial-gradient(circle at 28% 32%,rgba(255,255,255,.25) 0%,transparent 55%),linear-gradient(135deg,#a07314 0%,#e3a51f 50%,#f5c74f 100%)}.studycard.feat .sc-cover::before{content:\"\";position:absolute;top:-50px;right:-50px;width:180px;height:180px;background:radial-gradient(circle,rgba(255,255,255,.20) 0%,transparent 65%)}.studycard.feat .sc-cover::after{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 80% 80%,rgba(0,0,0,.10) 0%,transparent 50%),repeating-linear-gradient(135deg,transparent 0,transparent 26px,rgba(255,255,255,.04) 26px,rgba(255,255,255,.04) 27px);pointer-events:none}.studycard.feat .sc-cover-ic{font-size:76px;z-index:1;filter:drop-shadow(0 6px 18px rgba(0,0,0,.42));line-height:1}.studycard.feat .sc-body{padding:16px 18px 18px;flex:1;display:flex;flex-direction:column;gap:8px}.studycard.feat .sc-title{font-family:'Bricolage Grotesque';font-weight:800;font-size:19px;line-height:1.18;color:var(--ink);letter-spacing:-.01em}.studycard.feat .sc-sub{font-size:13px;color:var(--mut);line-height:1.5}.sc-stats{display:flex;gap:18px;margin-top:auto;padding:12px 0 4px;border-top:1px solid rgba(7,26,19,.10)}.sc-stat{display:flex;flex-direction:column;align-items:flex-start;gap:1px}.sc-stat-n{font-family:'Bricolage Grotesque';font-weight:800;font-size:17px;color:#06352a;line-height:1;letter-spacing:-.01em}.studycard.sv-ev .sc-stat-n{color:#a07314}.sc-stat-l{font-size:10.5px;color:var(--mut-2);text-transform:uppercase;letter-spacing:.05em;margin-top:3px;font-weight:600}.studycard .sc-btn{width:100%;text-align:center;justify-content:center;margin-top:8px;flex:none}.studycard.secondary{padding:0;gap:0;display:flex;flex-direction:column;overflow:hidden}.studycard.secondary .sc-strip{height:6px;width:100%;background:linear-gradient(90deg,#06352a,#0d7d56)}.studycard.secondary.sv-ev .sc-strip{background:linear-gradient(90deg,#a07314,#f5c74f)}.studycard.secondary .sc-inner{padding:18px 20px 22px;display:flex;flex-direction:column;gap:8px;flex:1}.studycard.secondary .sc-head{display:flex;gap:14px;align-items:center;margin-bottom:2px}.studycard.secondary .sc-ic{font-size:38px;line-height:1;flex:none;filter:drop-shadow(0 4px 10px rgba(7,26,19,.16))}.studycard.secondary .sc-title{font-family:'Bricolage Grotesque';font-weight:800;font-size:17px;line-height:1.18;color:var(--ink);letter-spacing:-.01em}.studycard.secondary .sc-sub{font-size:13.5px;color:var(--mut);line-height:1.5}.sc-lockbadge{position:absolute;top:10px;right:10px;background:rgba(255,255,255,.95);border:1px solid #e3c87a;border-radius:999px;padding:4px 10px;font-family:'Bricolage Grotesque';font-weight:800;font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:#7a5b12;z-index:2;backdrop-filter:blur(2px)}.studyfooter{background:linear-gradient(135deg,#fafbf7 0%,#f0f7f3 100%);border:1px dashed #cfe5d8;border-radius:14px;padding:14px 18px;text-align:center;font-size:13.5px;color:var(--mut);margin-top:16px}.studyfooter a{font-weight:700;color:#06352a;text-decoration:none;border-bottom:2px solid #e3a51f;padding-bottom:1px;margin:0 2px}.studyfooter a:hover{color:#e3a51f;border-bottom-color:#06352a}@media(max-width:760px){.studygrid{grid-template-columns:1fr}.studycard.feat .sc-cover{height:96px}.studycard.feat .sc-cover-ic{font-size:54px}.studypack{padding:18px 18px}.studypack .pack-title{font-size:18px}}.studyok,.studylock{display:none!important}.kill-word{position:relative;color:var(--mut-2);font-style:italic;display:inline-block}.kill-word::after{content:\"\";position:absolute;left:-4px;right:-4px;top:54%;height:4px;background:#c93a2f;border-radius:2px;transform:rotate(-3deg) scaleX(0);transform-origin:left center;transition:transform .7s cubic-bezier(.2,.7,.2,1) .35s;pointer-events:none}.reveal.vis .kill-word::after{transform:rotate(-3deg) scaleX(1)}.win-word{position:relative;color:#e3a51f;display:inline-block;white-space:nowrap;font-weight:800}.win-word::after{content:\"\";position:absolute;left:0;right:0;bottom:-4px;height:5px;background:linear-gradient(90deg,#e3a51f,#f4cb6a);border-radius:3px;transform:scaleX(0);transform-origin:left center;transition:transform .8s cubic-bezier(.2,.7,.2,1) 1s;pointer-events:none}.reveal.vis .win-word::after{transform:scaleX(1)}.win-word::before{content:\"\";position:absolute;inset:-8px -10px;border-radius:10px;background:radial-gradient(closest-side,rgba(227,165,31,.28),transparent 75%);opacity:0;transition:opacity .7s ease 1.3s;pointer-events:none;z-index:-1}.reveal.vis .win-word::before{opacity:1}@media (prefers-reduced-motion:reduce){.kill-word::after,.win-word::after,.win-word::before{transition:none}.reveal .kill-word::after{transform:rotate(-3deg) scaleX(1)}.reveal .win-word::after{transform:scaleX(1)}.reveal .win-word::before{opacity:1}}.vfilter-btn{background:#fff;border:1.5px solid var(--line);color:var(--mut);border-radius:999px;font-weight:700;letter-spacing:.01em;transition:background .15s,color .15s,border-color .15s,transform .15s}.vfilter-btn b{margin-left:6px;background:var(--bg-mute);padding:1px 8px;border-radius:999px;font-size:11.5px;color:var(--mut)}.vfilter-btn:hover{border-color:#06352a;color:#06352a}.vfilter-btn.active{background:#06352a;border-color:#06352a;color:#fff}.vfilter-btn.active b{background:rgba(255,255,255,.18);color:#fff}.hist{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:6px}.hist:last-child{border:0}.hist .hd{display:flex;justify-content:space-between;gap:10px;align-items:baseline;flex-wrap:wrap}.hist .hm{font-family:'Bricolage Grotesque';font-weight:800;font-size:16px;color:var(--ink)}.hist .hs{font-size:12px;color:var(--mut-2);font-weight:700;text-transform:uppercase;letter-spacing:.04em}.hist .hr{display:flex;justify-content:space-between;gap:14px;align-items:center;flex-wrap:wrap;font-size:14px;color:var(--mut)}.hist .hr b{color:var(--ink)}.hist .muted{color:var(--mut-2)}.hist .hp{font-family:'Bricolage Grotesque';font-weight:800;font-size:18px;color:var(--teal);margin-left:auto}.hist .hp small{font-size:11px;color:var(--mut-2);font-weight:700;margin-left:4px}.hist .hp.pending{font-size:13px;color:var(--mut-2)}.hist .hi{font-size:13px;color:var(--mut);font-weight:600;margin-top:2px}.hist.hit-exact{background:linear-gradient(180deg,rgba(227,165,31,.07),transparent)}.hist.hit-exact .hp{color:var(--gold-d)}.hist.hit-exact .hi{color:var(--gold-d)}.hist.miss .hp{color:var(--red)}.refbtns{margin-top:10px;display:flex;gap:10px;flex-wrap:wrap}.btn.whats{background:#25d366;color:#fff;border:1px solid #20bd5a;padding:11px 18px 11px 16px;font-size:13.5px;font-weight:700;border-radius:11px;display:inline-flex;align-items:center;gap:10px;line-height:1}.btn.whats:hover{background:#20bd5a}#refcopy.ok{background:var(--green)!important;color:#fff!important;border-color:var(--green)!important;transition:background .2s,color .2s}body.aluno:not(.aluno-loaded) #whoami{visibility:hidden;opacity:0}body.aluno-loaded #whoami{visibility:visible;opacity:1;transition:opacity .15s}body.aluno-loaded #mypanel>.empty:only-child{display:none}.home-link{display:inline-flex;align-items:center;gap:4px;color:var(--teal-d);font-weight:700}.admin-gear{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:#fbeaea;color:#d6453f;font-size:16px;border:1px solid #f2cfcd;text-decoration:none;margin-left:6px;transition:transform .15s}.admin-gear:hover{transform:rotate(90deg) scale(1.05);background:#f9d8d6}.admin-gear[hidden]{display:none}@media (max-width:720px){.hero-aluno{padding:60px 0 30px}.hero-aluno .hello{flex-direction:column}.hero-aluno .logout{align-self:flex-end}.dash .dv{font-size:28px}}.bonusbox-wrap{padding:54px 0 36px;background:#fafbf7}@media(max-width:760px){.bonusbox-wrap{padding:32px 0 18px}}.bonusbox{position:relative;background:radial-gradient(ellipse 70% 90% at 95% 100%,rgba(245,199,79,.32) 0%,transparent 60%),radial-gradient(ellipse 55% 60% at 5% 0%,rgba(13,125,86,.30) 0%,transparent 60%),linear-gradient(125deg,#06352a 0%,#0a5b3f 32%,#1e5a35 52%,#a64a00 78%,#e46c00 100%);border:1.5px solid rgba(255,255,255,.10);border-radius:28px;padding:36px 38px;overflow:hidden;color:#fff;box-shadow:0 22px 60px rgba(7,26,19,.22)}.bonusbox::before{content:\"\";position:absolute;top:-130px;right:-100px;width:380px;height:380px;background:radial-gradient(circle,rgba(245,199,79,.30) 0%,transparent 65%);pointer-events:none}.bonusbox::after{content:\"\";position:absolute;inset:0;background:repeating-linear-gradient(125deg,transparent 0,transparent 32px,rgba(255,255,255,.028) 32px,rgba(255,255,255,.028) 33px);pointer-events:none;mix-blend-mode:overlay}.bb-strip{position:absolute;top:0;left:0;right:0;height:5px;background:linear-gradient(90deg,#06352a 0%,#0d7d56 35%,#f5c74f 65%,#e46c00 100%);z-index:1}@media(max-width:760px){.bonusbox{padding:26px 22px;border-radius:22px}}.bb-grid{display:grid;grid-template-columns:1.4fr 1fr;gap:34px;align-items:center}@media(max-width:880px){.bb-grid{grid-template-columns:1fr;gap:22px}}.bb-copy,.bb-stack{position:relative;z-index:2}.bb-eyebrow{font-family:'Bricolage Grotesque';font-weight:800;font-size:12.5px;text-transform:uppercase;letter-spacing:.14em;color:#f5c74f;margin-bottom:10px;text-shadow:0 1px 8px rgba(0,0,0,.25)}.bb-h2{font-family:'Bricolage Grotesque';font-weight:800;font-size:34px;line-height:1.08;letter-spacing:-.015em;color:#fff;margin:0 0 14px;text-shadow:0 2px 12px rgba(0,0,0,.30)}@media(max-width:760px){.bb-h2{font-size:26px}}.bb-hl{position:relative;color:#f5c74f;white-space:nowrap;text-shadow:0 0 24px rgba(245,199,79,.45),0 2px 12px rgba(0,0,0,.25)}.bb-lead{font-size:15.5px;line-height:1.55;color:rgba(255,255,255,.88);margin:0 0 18px;max-width:560px}.bb-lead b{color:#fff;font-weight:800}.bb-list{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:10px}.bb-list li{display:flex;gap:12px;font-size:14px;line-height:1.5;color:rgba(255,255,255,.90)}.bb-list .bb-ic{font-size:20px;flex:none;width:30px;text-align:center;line-height:1.4;filter:drop-shadow(0 2px 6px rgba(0,0,0,.30))}.bb-list b{color:#fff;font-weight:800}.bb-cta-row{display:flex;gap:18px;align-items:center;flex-wrap:wrap}.bb-cta{padding:14px 26px;font-size:15px;font-weight:800;box-shadow:0 6px 22px rgba(245,199,79,.45)}.bb-fineprint{font-size:12.5px;color:rgba(255,255,255,.75);line-height:1.4}.bb-fineprint b{color:#fff;font-weight:800}.bb-stack{display:flex;flex-direction:column;gap:14px}.bb-card{border-radius:18px;padding:18px 20px;border:1.5px solid var(--line);background:#fff;display:flex;flex-direction:column;gap:8px;position:relative;overflow:hidden}.bb-card.bb-em{background:radial-gradient(ellipse 80% 60% at 100% 0%,rgba(6,53,42,.08) 0%,transparent 60%),linear-gradient(160deg,#f0f7f3 0%,#fff 60%);border-color:#cfe5d8}.bb-card.bb-em::before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#06352a 0%,#0d7d56 100%)}.bb-card.bb-ev{background:radial-gradient(ellipse 80% 60% at 100% 0%,rgba(227,165,31,.13) 0%,transparent 60%),linear-gradient(160deg,#fbf5e8 0%,#fff 60%);border-color:#e3c87a}.bb-card.bb-ev::before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,#a07314 0%,#f5c74f 100%)}.bb-badge{font-family:'Bricolage Grotesque';font-weight:800;font-size:11.5px;text-transform:uppercase;letter-spacing:.1em;padding:5px 10px;border-radius:999px;align-self:flex-start;margin-bottom:4px}.bb-em .bb-badge{background:#06352a;color:#fff}.bb-ev .bb-badge{background:#e3a51f;color:#1b1300}.bb-stat{display:flex;align-items:baseline;gap:8px;padding:6px 0;border-bottom:1px dashed rgba(7,26,19,.10)}.bb-stat:last-child{border-bottom:none}.bb-stat b{font-family:'Bricolage Grotesque';font-weight:800;font-size:22px;line-height:1;color:#06352a;min-width:88px;letter-spacing:-.01em}.bb-ev .bb-stat b{color:#a07314}.bb-stat span{font-size:12.5px;color:#6b7280;text-transform:uppercase;letter-spacing:.04em;font-weight:600}#estudo{background:radial-gradient(ellipse 60% 60% at 95% 100%,rgba(245,199,79,.22) 0%,transparent 65%),radial-gradient(ellipse 50% 50% at 5% 0%,rgba(13,125,86,.20) 0%,transparent 60%),linear-gradient(125deg,#06352a 0%,#0a5b3f 40%,#1c5a3a 55%,#a64a00 80%,#e46c00 100%) !important;border-top:none !important;border-bottom:none !important;color:#fff;position:relative;overflow:hidden}#estudo::after{content:\"\";position:absolute;inset:0;background:repeating-linear-gradient(125deg,transparent 0,transparent 32px,rgba(255,255,255,.025) 32px,rgba(255,255,255,.025) 33px);pointer-events:none;z-index:0;mix-blend-mode:overlay}#estudo > .wrap{position:relative;z-index:1}#estudo .eyebrow{color:#f5c74f;text-shadow:0 1px 8px rgba(0,0,0,.25)}#estudo .eyebrow::before{background:#f5c74f}#estudo .h2{color:#fff;text-shadow:0 2px 12px rgba(0,0,0,.30)}#estudo .lead{color:rgba(255,255,255,.88)}#estudo .lead b{color:#fff;font-weight:800}#estudo .kill-word{color:rgba(255,255,255,.72)}#estudo .kill-word::after{background:#ff6b62}#estudo .win-word{color:#f5c74f;text-shadow:0 0 24px rgba(245,199,79,.45),0 2px 12px rgba(0,0,0,.25)}#estudo .win-word::after{background:linear-gradient(90deg,#f5c74f,#fff5cc)}#estudo .win-word::before{background:radial-gradient(closest-side,rgba(245,199,79,.45),transparent 75%)}#estudo .studypack,#estudo .studyvert{box-shadow:0 14px 38px rgba(0,0,0,.18)}#indique.indique-white{background:#fff !important;color:var(--ink) !important}#indique.indique-white .eyebrow{color:var(--teal-d)}#indique.indique-white .eyebrow::before{background:var(--teal-d)}#indique.indique-white .h2{color:var(--ink)}#indique.indique-white .lead{color:var(--mut)}#indique.indique-white .lead b{color:var(--ink)}\n<\/style>\n<\/div>\n<div class=\"lp-gtm-head\" style=\"display:contents\">\n<!-- Google Tag Manager -->\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https:\/\/www.googletagmanager.com\/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-WRNGBFN');<\/script>\n<!-- End Google Tag Manager -->\n<\/div>\n<div class=\"lp-gtm-ns\" style=\"display:contents\">\n<noscript><iframe src=\"https:\/\/www.googletagmanager.com\/ns.html?id=GTM-WRNGBFN\" height=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"><\/iframe><\/noscript>\n<\/div>\n\n<template id=\"__bundler_thumbnail\" data-bg-color=\"#06352a\">\n  <svg viewBox=\"0 0 1200 800\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <rect width=\"1200\" height=\"800\" fill=\"#06352a\"\/>\n    <g transform=\"translate(600,330) scale(6.4) translate(-32,-32)\">\n      <path d=\"M32 6c-9 0-16 6-16 17 0 4 1 7 3 10-3 2-5 6-5 10v9c0 3 2 4 4 4 3 0 4-2 4-5 2 1 4 1 6 1h8c2 0 4 0 6-1 0 3 1 5 4 5 2 0 4-1 4-4v-9c0-4-2-8-5-10 2-3 3-6 3-10C48 12 41 6 32 6Z\" fill=\"#ffffff\"\/>\n      <circle cx=\"24\" cy=\"24\" r=\"7.5\" fill=\"#06352a\"\/><circle cx=\"40\" cy=\"24\" r=\"7.5\" fill=\"#06352a\"\/>\n    <\/g>\n    <text x=\"600\" y=\"560\" font-family=\"sans-serif\" font-weight=\"800\" font-size=\"60\" fill=\"#ffffff\" text-anchor=\"middle\">Bol\u00e3o da Coruja<\/text>\n    <text x=\"600\" y=\"612\" font-family=\"sans-serif\" font-weight=\"700\" font-size=\"26\" fill=\"#e3a51f\" text-anchor=\"middle\" letter-spacing=\"2\">COPA DA CORUJA<\/text>\n  <\/svg>\n<\/template>\n\n<nav>\n  <div class=\"wrap\">\n    <a href=\"#topo\" class=\"logo logo-dual\" aria-label=\"Bol\u00e3o da Coruja, Estrat\u00e9gia Militares + Vestibulares\">\n      <img decoding=\"async\" class=\"logo-em\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/06\/logo-em-branca-scaled.webp\" alt=\"Estrat\u00e9gia Militares\">\n      <img decoding=\"async\" class=\"logo-ev\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/06\/logo-ev-branca.webp\" alt=\"Estrat\u00e9gia Vestibulares\">\n    <\/a>\n    <button class=\"navtoggle\" id=\"navToggle\" aria-label=\"Abrir menu\" aria-expanded=\"false\" aria-controls=\"navLinks\"><span><\/span><span><\/span><span><\/span><\/button>\n    <div class=\"links\" id=\"navLinks\">\n      <a href=\"#selecoes\">Sele\u00e7\u00f5es<\/a><a href=\"#premios\">Pr\u00eamios<\/a><a href=\"#regras\">Regras<\/a><a href=\"#ranking\" class=\"live-link\"><span class=\"live-dot\"><\/span>Ranking<\/a><a href=\"#refranking\" class=\"live-link\"><span class=\"live-dot\"><\/span>Top indicadores<\/a><a href=\"#escolas\">Escolas<\/a>\n      <a href=\"#\" class=\"cta\" id=\"navCadastro\">Participar<\/a>\n      <a href=\"#\" class=\"cta cta-outline\" id=\"navAcessar\">Acessar<\/a>\n    <\/div>\n  <\/div>\n<\/nav>\n\n<header class=\"hero\" id=\"topo\">\n  <div class=\"herobg\" aria-hidden=\"true\">\n    <img decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/postal-espanha.webp\" alt=\"\">\n    <img decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/postal-franca.webp\" alt=\"\">\n    <img decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/postal-argentina.webp\" alt=\"\">\n    <img decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/postal-brasil.webp\" alt=\"\">\n  <\/div>\n  <div class=\"heroveil\" aria-hidden=\"true\"><\/div>\n  <div class=\"wrap\">\n    <div class=\"herocopy\">\n      <div class=\"flagband reveal\"><i class=\"fb-bra\"><\/i><i class=\"fb-fra\"><\/i><i class=\"fb-arg\"><\/i><i class=\"fb-esp\"><\/i><\/div>\n      <h1 class=\"dsp reveal\">Bol\u00e3o da C<span class=\"o\">o<\/span>ruja<\/h1>\n      <p class=\"sub reveal\">Crave os placares dos jogos do <b>Brasil, Fran\u00e7a, Argentina e Espanha<\/b> na Copa e concorra a <b>camisas oficiais, tablet, fone e at\u00e9 um Apple Watch<\/b>.<\/p>\n      <div class=\"btnrow reveal\">\n        <a href=\"#\" class=\"btn light\" id=\"heroAcessar\">J\u00e1 sou inscrito \u00b7 Acessar<\/a>\n        <a href=\"#\" class=\"btn gold\" id=\"heroCadastro\">Quero participar \u2192<\/a>\n      <\/div>\n      <a href=\"#ranking\" class=\"herolive reveal\" id=\"herolive\" style=\"display:none\"><span class=\"live-dot\"><\/span><span><b id=\"herocount\">0<\/b> alunos j\u00e1 est\u00e3o no bol\u00e3o<\/span><\/a>\n      <div class=\"herostats reveal\">\n        <div class=\"st\"><span class=\"n\">4<\/span><span class=\"l\">Sele\u00e7\u00f5es no bol\u00e3o<\/span><\/div>\n        <div class=\"sep\"><\/div>\n        <div class=\"st\"><span class=\"n\">12<\/span><span class=\"l\">Jogos para cravar<\/span><\/div>\n        <div class=\"sep\"><\/div>\n        <div class=\"st\"><span class=\"n\">4<\/span><span class=\"l\">Frentes de pr\u00eamios<\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/header>\n\n<div class=\"nextmatch\" id=\"nextmatch\" style=\"display:none\">\n  <div class=\"wrap\">\n    <div class=\"nm-in\">\n      <div class=\"nm-info\">\n        <div class=\"nm-lead\"><span class=\"live-dot\"><\/span>Pr\u00f3ximo jogo do bol\u00e3o<\/div>\n        <div class=\"nm-game\" id=\"nm-game\"><\/div>\n        <div class=\"nm-note\">O palpite fecha no apito inicial. Crave o placar antes.<\/div>\n      <\/div>\n      <div class=\"nm-clock\" id=\"nm-clock\" aria-live=\"polite\" aria-label=\"Tempo at\u00e9 o pr\u00f3ximo jogo\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<section id=\"selecoes\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Sele\u00e7\u00f5es do bol\u00e3o<\/div><h2 class=\"dsp h2\">Quatro gigantes, tr\u00eas jogos cada<\/h2>\n    <p class=\"lead\">O bol\u00e3o cobre apenas os jogos da fase de grupos destas quatro sele\u00e7\u00f5es. Datas e hor\u00e1rios de Bras\u00edlia.<\/p><\/div>\n    <div class=\"natgrid\" id=\"natgrid\"><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"premios\">\n  <div class=\"wrap\">\n    <div class=\"prizeheader\">\n      <div class=\"reveal\">\n        <div class=\"eyebrow\">O que est\u00e1 em jogo<\/div>\n        <h2 class=\"dsp h2\">Aqui tem pr\u00eamio de verdade. Participe e concorra!<\/h2>\n        <p class=\"lead\"><b>Quatro frentes de competi\u00e7\u00e3o<\/b> independentes para o p\u00f3dio do bol\u00e3o, para quem joga para valer, para a escola mais unida e para quem mais convida amigos.<\/p>\n        <div class=\"prizeheader-badges\">\n          <span class=\"totalbadge\"><span class=\"dot\" aria-hidden=\"true\">\ud83c\udfc6<\/span> 12 pr\u00eamios em jogo<\/span>\n          <span class=\"totalbadge teal\"><span class=\"dot\" aria-hidden=\"true\">\ud83c\udfaf<\/span> 4 frentes independentes<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"prizeshowcase reveal\" aria-hidden=\"true\">\n        <div class=\"ps-item featured\">\n          <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <rect x=\"20\" y=\"18\" width=\"24\" height=\"28\" rx=\"4\"\/>\n            <path d=\"M26 8h12l-2 10H28z\"\/>\n            <path d=\"M26 56h12l-2-10H28z\"\/>\n            <path d=\"M28 26h8M28 32h8M28 38h5\"\/>\n          <\/svg>\n          <div class=\"ps-lbl\">Apple Watch<\/div>\n        <\/div>\n        <div class=\"ps-item\">\n          <img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\">\n          <div class=\"ps-lbl\">Camisa Brasil<\/div>\n        <\/div>\n        <div class=\"ps-item\">\n          <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#0a6c55\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <rect x=\"10\" y=\"14\" width=\"44\" height=\"32\" rx=\"4\"\/>\n            <path d=\"M18 22h28M18 30h28M18 38h20\"\/>\n            <rect x=\"22\" y=\"50\" width=\"20\" height=\"6\" rx=\"2\"\/>\n          <\/svg>\n          <div class=\"ps-lbl\">Tablet<\/div>\n        <\/div>\n        <div class=\"ps-item\">\n          <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#0a6c55\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <path d=\"M14 36v-4a18 18 0 0 1 36 0v4\"\/>\n            <rect x=\"10\" y=\"34\" width=\"12\" height=\"18\" rx=\"4\"\/>\n            <rect x=\"42\" y=\"34\" width=\"12\" height=\"18\" rx=\"4\"\/>\n          <\/svg>\n          <div class=\"ps-lbl\">Fone<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"prizeboard\">\n      <div class=\"pcard feat reveal\">\n        <div class=\"feat-top\">\n          <div>\n            <div class=\"pkicker\">\ud83c\udfc6 Frente 1 \u00b7 Ranking individual<\/div>\n            <h3 class=\"dsp\">O p\u00f3dio do bol\u00e3o<\/h3>\n            <p class=\"pintro\">Quem somar mais pontos ao longo de toda a Copa sobe ao p\u00f3dio e leva pr\u00eamio <b>garantido, sem sorteio<\/b>.<\/p>\n          <\/div>\n          <span class=\"feat-tag\"><span class=\"pulse\" aria-hidden=\"true\"><\/span>3 pr\u00eamios garantidos<\/span>\n        <\/div>\n        <div class=\"tiers\">\n          <div class=\"tier t2\">\n            <div class=\"place\">\n              <span class=\"medal\" aria-hidden=\"true\">\ud83e\udd48<\/span>\n              <div class=\"plnm\">2\u00ba<\/div>\n              <div class=\"plsub\">Vice-campe\u00e3o<\/div>\n            <\/div>\n            <div class=\"gstack\">\n              <div class=\"ghero\">\n                <img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"Camisa oficial do Brasil\" width=\"120\" height=\"120\">\n              <\/div>\n              <div class=\"gextra\" aria-label=\"Fone de ouvido\">\n                <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#0a6c55\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                  <path d=\"M14 36v-4a18 18 0 0 1 36 0v4\"\/>\n                  <rect x=\"10\" y=\"34\" width=\"12\" height=\"18\" rx=\"4\"\/>\n                  <rect x=\"42\" y=\"34\" width=\"12\" height=\"18\" rx=\"4\"\/>\n                <\/svg>\n                <div class=\"lbl\">Fone<\/div>\n              <\/div>\n            <\/div>\n            <div class=\"gnm\">Camisa oficial do Brasil<b>+ Fone de ouvido<\/b><\/div>\n          <\/div>\n          <div class=\"tier t1\">\n            <div class=\"place\">\n              <span class=\"medal\" aria-hidden=\"true\">\ud83e\udd47<\/span>\n              <div class=\"plnm\">1\u00ba<\/div>\n              <div class=\"plsub\">Campe\u00e3o geral<\/div>\n            <\/div>\n            <div class=\"gstack\">\n              <div class=\"ghero\">\n                <img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"Camisa oficial do Brasil\" width=\"140\" height=\"140\">\n              <\/div>\n              <div class=\"gextra\" aria-label=\"Tablet\">\n                <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#0a6c55\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                  <rect x=\"10\" y=\"14\" width=\"44\" height=\"32\" rx=\"4\"\/>\n                  <path d=\"M18 22h28M18 30h28M18 38h20\"\/>\n                  <rect x=\"22\" y=\"50\" width=\"20\" height=\"6\" rx=\"2\"\/>\n                <\/svg>\n                <div class=\"lbl\">Tablet<\/div>\n              <\/div>\n            <\/div>\n            <div class=\"gnm\">Camisa oficial do Brasil<b>+ Tablet<\/b><\/div>\n          <\/div>\n          <div class=\"tier t3\">\n            <div class=\"place\">\n              <span class=\"medal\" aria-hidden=\"true\">\ud83e\udd49<\/span>\n              <div class=\"plnm\">3\u00ba<\/div>\n              <div class=\"plsub\">P\u00f3dio<\/div>\n            <\/div>\n            <div class=\"gstack\">\n              <div class=\"ghero\">\n                <img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-azul.webp\" alt=\"Camisa oficial do Brasil\" width=\"120\" height=\"120\">\n              <\/div>\n            <\/div>\n            <div class=\"gnm\"><b>Camisa oficial do Brasil<\/b><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pcard frente golden reveal\">\n        <div class=\"frente-top\">\n          <div class=\"picon\" aria-hidden=\"true\">\ud83c\udf81<\/div>\n          <div class=\"frente-head\">\n            <div class=\"pkicker\">Frente 2 \u00b7 Sorteio geral<\/div>\n            <h3 class=\"dsp\">5 camisas no sorteio<\/h3>\n          <\/div>\n        <\/div>\n        <div class=\"frente-body\">\n          N\u00e3o precisa terminar no topo. <b>Todo participante que passar de <span id=\"thrtxt\">30 pontos<\/span><\/b> entra no sorteio de <b>5 camisas oficiais do Brasil<\/b>.\n        <\/div>\n        <div class=\"shirtgrid\">\n          <div class=\"si\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"60\" height=\"60\"><\/div>\n          <div class=\"si\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-azul.webp\" alt=\"\" width=\"60\" height=\"60\"><\/div>\n          <div class=\"si\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"60\" height=\"60\"><\/div>\n          <div class=\"si\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-azul.webp\" alt=\"\" width=\"60\" height=\"60\"><\/div>\n          <div class=\"si\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"60\" height=\"60\"><\/div>\n        <\/div>\n        <div class=\"frente-prize\">\n          <div>\n            <div class=\"pp-lbl\">Pr\u00eamio<\/div>\n            <div class=\"pp-val\">5\u00d7 Camisa oficial<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pcard frente reveal\">\n        <div class=\"frente-top\">\n          <div class=\"picon\" aria-hidden=\"true\">\ud83c\udfeb<\/div>\n          <div class=\"frente-head\">\n            <div class=\"pkicker\">Frente 3 \u00b7 Disputa entre escolas<\/div>\n            <h3 class=\"dsp\">Sua escola na disputa<\/h3>\n          <\/div>\n        <\/div>\n        <div class=\"frente-body\">\n          Vence a escola com a maior <b>m\u00e9dia dos 10 melhores colocados<\/b>. A campe\u00e3 ganha <b>2 sorteios separados<\/b> entre seus 100 melhores: <b>um aluno leva a camisa, outro aluno leva o Apple Watch<\/b>.\n        <\/div>\n        <div class=\"duoprize\">\n          <div class=\"di\">\n            <img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"64\" height=\"64\">\n            <div class=\"lbl\">Camisa Brasil<\/div>\n          <\/div>\n          <div class=\"di\">\n            <svg viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"#0b201a\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n              <rect x=\"20\" y=\"18\" width=\"24\" height=\"28\" rx=\"4\"\/>\n              <path d=\"M26 8h12l-2 10H28z\"\/>\n              <path d=\"M26 56h12l-2-10H28z\"\/>\n              <path d=\"M28 26h8M28 32h8M28 38h5\"\/>\n            <\/svg>\n            <div class=\"lbl\">Apple Watch<\/div>\n          <\/div>\n        <\/div>\n        <div class=\"frente-prize\">\n          <div>\n            <div class=\"pp-lbl\">2 pr\u00eamios<\/div>\n            <div class=\"pp-val\">1 camisa + 1 Apple Watch<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pcard frente reveal\">\n        <div class=\"frente-top\">\n          <div class=\"picon\" aria-hidden=\"true\">\ud83d\udce3<\/div>\n          <div class=\"frente-head\">\n            <div class=\"pkicker\">Frente 4 \u00b7 Top 3 indica\u00e7\u00f5es<\/div>\n            <h3 class=\"dsp\">Convide seus colegas<\/h3>\n          <\/div>\n        <\/div>\n        <div class=\"frente-body\">\n          Os <b>3 alunos que mais indicarem amigos<\/b> (indica\u00e7\u00f5es v\u00e1lidas) recebem, cada um, uma <b>camisa oficial do Brasil<\/b>.\n        <\/div>\n        <div class=\"triogrid\">\n          <div class=\"ti\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"80\" height=\"80\"><\/div>\n          <div class=\"ti\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-azul.webp\" alt=\"\" width=\"80\" height=\"80\"><\/div>\n          <div class=\"ti\"><img loading=\"eager\" decoding=\"async\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/05\/camisa-brasil-amarela.webp\" alt=\"\" width=\"80\" height=\"80\"><\/div>\n        <\/div>\n        <div class=\"frente-prize\">\n          <div>\n            <div class=\"pp-lbl\">Pr\u00eamio<\/div>\n            <div class=\"pp-val\">3\u00d7 Camisa oficial<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"prizenote reveal\">\n      <span class=\"bigico\" aria-hidden=\"true\">\u2696\ufe0f<\/span>\n      <p><b>Regra anti-ac\u00famulo.<\/b> Cada participante leva no m\u00e1ximo <b>um pr\u00eamio<\/b> em toda a Copa, sempre o de <b>maior valor<\/b>. Ordem: 1) Ranking individual, 2) Apple Watch da escola, 3) Camisa da escola, 4) Top 3 indica\u00e7\u00f5es, 5) Sorteio geral. As vagas liberadas v\u00e3o para o pr\u00f3ximo sorteado.<\/p>\n    <\/div>\n\n    <div class=\"prizecta reveal\">\n      <a href=\"#\" id=\"prizeCtaCadastro\">Quero meu lugar no bol\u00e3o <span class=\"arrow\" aria-hidden=\"true\">\u2192<\/span><\/a>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"como\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Passo a passo<\/div><h2 class=\"dsp h2\">Como funciona<\/h2><\/div>\n    <div class=\"steps\">\n      <div class=\"step reveal\"><div class=\"n\">1<\/div><h4>Cadastre-se<\/h4><p>Preencha seus dados uma vez. \u00c9 r\u00e1pido e garante seu lugar no ranking.<\/p><\/div>\n      <div class=\"step reveal\"><div class=\"n\">2<\/div><h4>Crave os placares<\/h4><p>D\u00ea seu palpite para cada jogo antes do apito inicial. Cravar nos jogos da reta final (24 a 27 de junho) vale o dobro: 20 pontos.<\/p><\/div>\n      <div class=\"step reveal\"><div class=\"n\">3<\/div><h4>Suba no ranking<\/h4><p>A cada resultado, sua pontua\u00e7\u00e3o atualiza. Chegue ao topo e leve o pr\u00eamio.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"regras\" style=\"background:var(--bg-soft);border-top:1px solid var(--line)\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Sem letra mi\u00fada<\/div><h2 class=\"dsp h2\">Regras detalhadas<\/h2><\/div>\n    <div class=\"card reveal\"><h3 class=\"dsp\">Pontua\u00e7\u00e3o por jogo<\/h3>\n      <table class=\"ruletbl\">\n        <tr><td class=\"pt\">10<span>pontos<\/span><\/td><td class=\"d\"><b>Cravou o placar exato.<\/b> Acertou os gols das duas sele\u00e7\u00f5es (palpitou 2\u00d71, terminou 2\u00d71).<\/td><\/tr>\n        <tr><td class=\"pt\">7<span>pontos<\/span><\/td><td class=\"d\"><b>Acertou o vencedor e o saldo de gols<\/b>, mas n\u00e3o o placar exato (palpitou 2\u00d71, deu 3\u00d72).<\/td><\/tr>\n        <tr><td class=\"pt\">5<span>pontos<\/span><\/td><td class=\"d\"><b>Acertou s\u00f3 o resultado<\/b> (quem venceu ou que foi empate), com placar diferente.<\/td><\/tr>\n        <tr><td class=\"pt z\">0<span>pontos<\/span><\/td><td class=\"d\"><b>Errou o resultado<\/b> do jogo.<\/td><\/tr>\n      <\/table>\n      <div class=\"note\"><span class=\"bigico\">\u26a1<\/span><div><b>Reta final em DOBRO.<\/b> Nos 4 jogos da \u00faltima rodada (24 a 27 de junho), <b>cravar o placar vale 20 pontos<\/b>. Saldo (7) e vencedor (5) seguem iguais em todos os jogos.<\/div><\/div>\n    <\/div>\n    <div class=\"card reveal\"><h3 class=\"dsp\">Como funcionam os pr\u00eamios<\/h3>\n      <p class=\"csub\" style=\"margin-bottom:6px\">S\u00e3o quatro frentes independentes, mas <b>cada participante ganha no m\u00e1ximo um pr\u00eamio<\/b>: o de maior valor entre todos que tiver direito. <b>Os pr\u00eamios n\u00e3o s\u00e3o cumulativos.<\/b><\/p>\n      <ul class=\"rlist\">\n        <li><span class=\"b\">1<\/span><div><b>Ranking individual.<\/b> 1\u00ba lugar leva camisa oficial do Brasil <b>+ tablet<\/b>; 2\u00ba leva camisa <b>+ fone de ouvido<\/b>; 3\u00ba leva <b>camisa oficial<\/b>. Tudo garantido pela coloca\u00e7\u00e3o, sem sorteio.<\/div><\/li>\n        <li><span class=\"b\">2<\/span><div><b>Sorteio geral.<\/b> Todo participante que passar de <b id=\"thrtxt2\">30 pontos<\/b> entra no sorteio de <b>5 camisas oficiais do Brasil<\/b>. Quem j\u00e1 tiver ganho em qualquer outra frente <b>n\u00e3o participa<\/b> deste sorteio.<\/div><\/li>\n        <li><span class=\"b\">3<\/span><div><b>Disputa entre escolas.<\/b> Vence a escola\/concurso com a maior <b>m\u00e9dia de pontos dos seus 10 melhores colocados (Top 10)<\/b>. A escola campe\u00e3 ganha 2 sorteios entre os seus <b>100 melhores colocados (Top 100)<\/b>: <b>1 camisa do Brasil<\/b> e <b>1 Apple Watch<\/b>. Se um sorteado j\u00e1 tiver ganho em outra frente, o sorteio segue para o pr\u00f3ximo da lista. <b>Empate na linha de corte do Top 100:<\/b> todos os alunos empatados na pontua\u00e7\u00e3o que define o 100\u00ba lugar entram no sorteio. O Top 100 pode virar Top 101, 102 etc.<\/div><\/li>\n        <li><span class=\"b\">4<\/span><div><b>Top 3 indica\u00e7\u00f5es.<\/b> Os 3 alunos com mais <b>indica\u00e7\u00f5es v\u00e1lidas<\/b> (amigo que se cadastra e d\u00e1 palpites) levam, cada um, uma <b>camisa oficial do Brasil<\/b>. Em caso de empate no n\u00famero de indica\u00e7\u00f5es, ver o crit\u00e9rio de desempate no Regulamento.<\/div><\/li>\n      <\/ul>\n      <div class=\"note\" style=\"margin-top:14px\"><span class=\"bigico\">\u2696\ufe0f<\/span><div><b>Regra anti-ac\u00famulo.<\/b> Se voc\u00ea se classificar em mais de uma frente, recebe s\u00f3 <b>o pr\u00eamio de maior valor<\/b>. Ordem de prioridade: <b>1) Ranking individual \u2192 2) Apple Watch da escola \u2192 3) Camisa da escola \u2192 4) Top 3 indica\u00e7\u00f5es \u2192 5) Sorteio geral<\/b>. As vagas liberadas voltam para o sorteio seguinte, para espalhar os pr\u00eamios para mais gente.<\/div><\/div>\n    <\/div>\n    <div class=\"card reveal\"><h3 class=\"dsp\">Regulamento<\/h3>\n      <ul class=\"rlist\">\n        <li><span class=\"b\">1<\/span><div>Valem apenas os jogos de <b>Brasil, Fran\u00e7a, Argentina e Espanha<\/b> na fase de grupos da Copa 2026.<\/div><\/li>\n        <li><span class=\"b\">2<\/span><div>O palpite precisa ser enviado <b>antes do apito inicial<\/b>. No hor\u00e1rio do jogo, ele <b>trava automaticamente<\/b> e o hor\u00e1rio do envio fica registrado.<\/div><\/li>\n        <li><span class=\"b\">3<\/span><div>Um palpite por jogo, por participante. Voc\u00ea pode <b>editar enquanto o jogo n\u00e3o fechar<\/b>.<\/div><\/li>\n        <li><span class=\"b\">4<\/span><div>Acesse e <b>edite seus palpites quando quiser<\/b> usando o <b>mesmo CPF<\/b> do cadastro: \u00e9 por ele que reconhecemos voc\u00ea.<\/div><\/li>\n        <li><span class=\"b\">5<\/span><div><b>Reta final em DOBRO.<\/b> Nos 4 jogos da \u00faltima rodada da fase de grupos (24 a 27 de junho), cravar o placar vale 20 pontos. Os demais acertos (7 e 5) valem igual em todos os jogos.<\/div><\/li>\n        <li><span class=\"b\">6<\/span><div><b>Crit\u00e9rios de desempate<\/b> (aplicados em todas as frentes):\n          <ul style=\"margin:6px 0 0 0;padding-left:18px\">\n            <li><b>Ranking individual e Top 3 indica\u00e7\u00f5es:<\/b> \u2460 mais placares cravados \u2192 \u2461 mais resultados certos \u2192 \u2462 inscri\u00e7\u00e3o (ou indica\u00e7\u00e3o v\u00e1lida) mais antiga, pelo timestamp.<\/li>\n            <li><b>Ranking entre escolas:<\/b> \u2460 maior n\u00ba de placares cravados somados no Top 10 \u2192 \u2461 maior n\u00ba de resultados certos somados no Top 10 \u2192 \u2462 escola cujo aluno de melhor coloca\u00e7\u00e3o se cadastrou primeiro.<\/li>\n            <li><b>Sorteio do Top 100 da escola campe\u00e3:<\/b> n\u00e3o h\u00e1 desempate. Alunos empatados na pontua\u00e7\u00e3o que define a linha de corte do 100\u00ba lugar <b>entram todos<\/b> no sorteio.<\/li>\n          <\/ul>\n        <\/div><\/li>\n        <li><span class=\"b\">7<\/span><div>O ranking \u00e9 a fonte oficial da disputa. Erros de digita\u00e7\u00e3o de resultado s\u00e3o corrigidos e recalculados.<\/div><\/li>\n        <li><span class=\"b\">8<\/span><div><b>Pr\u00eamios n\u00e3o cumulativos.<\/b> Cada participante recebe no m\u00e1ximo <b>um pr\u00eamio<\/b> em toda a Copa, sempre o de <b>maior valor<\/b> entre os que tiver direito. Ordem de prioridade: <b>1)<\/b> Ranking individual (1\u00ba\/2\u00ba\/3\u00ba) \u2192 <b>2)<\/b> Apple Watch da escola campe\u00e3 \u2192 <b>3)<\/b> Camisa da escola campe\u00e3 \u2192 <b>4)<\/b> Top 3 indica\u00e7\u00f5es \u2192 <b>5)<\/b> Sorteio geral. Vagas liberadas voltam para o pr\u00f3ximo sorteado da lista.<\/div><\/li>\n      <\/ul>\n      <div class=\"note lgpd\"><span class=\"bigico\">\ud83d\udd12<\/span><div><b>Seus dados:<\/b> coletamos nome, CPF, e-mail, telefone e concurso apenas para operar o bol\u00e3o e contatar os ganhadores. Voc\u00ea pode pedir acesso ou exclus\u00e3o a qualquer momento. Consulte a <a href=\"https:\/\/public-miscellaneous.s3-sa-east-1.amazonaws.com\/termos\/Poli%CC%81tica+de+Privacidade+-+Estrate%CC%81gia+Educacional.pdf\" target=\"_blank\" rel=\"noopener\">Pol\u00edtica de Privacidade<\/a>.<\/div><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"indique\" style=\"border-top:1px solid var(--line)\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Programa de indica\u00e7\u00e3o<\/div><h2 class=\"dsp h2\">Indique amigos e concorra<\/h2>\n    <p class=\"lead\">Quanto mais pessoas voc\u00ea traz para o bol\u00e3o, mais perto voc\u00ea fica de uma camisa oficial. Os <b style=\"color:#fff\">3 alunos que mais indicarem<\/b> ganham.<\/p><\/div>\n    <div class=\"refsteps\">\n      <div class=\"refstep reveal\"><span class=\"rn\">1<\/span><div class=\"ic\">\ud83d\udd17<\/div><h4>Pegue seu link<\/h4><p>Ao se cadastrar, voc\u00ea recebe um <b>link de indica\u00e7\u00e3o exclusivo<\/b>, que fica na sua \u00e1rea de palpites, pronto para compartilhar.<\/p><\/div>\n      <div class=\"refstep reveal\"><span class=\"rn\">2<\/span><div class=\"ic\">\ud83d\udcf2<\/div><h4>Compartilhe<\/h4><p>Envie no grupo da turma, no WhatsApp ou nos stories. Cada amigo que entrar pelo seu link j\u00e1 fica <b>vinculado a voc\u00ea<\/b>.<\/p><\/div>\n      <div class=\"refstep reveal\"><span class=\"rn\">3<\/span><div class=\"ic\">\ud83c\udfc6<\/div><h4>Conte os pontos<\/h4><p>Vale a <b>indica\u00e7\u00e3o v\u00e1lida<\/b>: o amigo precisa se cadastrar <b>e<\/b> dar palpites. Os 3 que mais indicarem recebem camisa do Brasil.<\/p><\/div>\n    <\/div>\n    <div class=\"refnote reveal\"><span class=\"bigico\">\ud83d\udca1<\/span><div><b>Onde fica meu link?<\/b> <a href=\"#\" id=\"refnoteCadastro\" style=\"font-weight:700\">Fa\u00e7a sua inscri\u00e7\u00e3o em 1 minuto<\/a>: assim que entrar no bol\u00e3o, seu link e o n\u00famero de indica\u00e7\u00f5es v\u00e1lidas aparecem na sua \u00e1rea de aluno.<\/div><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"ranking\" style=\"background:var(--bg-soft);border-top:1px solid var(--line)\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Classifica\u00e7\u00e3o<\/div><h2 class=\"dsp h2\">Ranking geral <span class=\"liveflag\"><span class=\"live-dot\"><\/span>ao vivo<\/span><\/h2>\n    <p class=\"lead\"><b>Top 3 leva tablet, fone de ouvido e camisa do Brasil.<\/b> A classifica\u00e7\u00e3o atualiza automaticamente a cada palpite salvo e a cada resultado lan\u00e7ado.<\/p><\/div>\n    <div class=\"card reveal\" id=\"rankbody\"><div class=\"empty\">Carregando\u2026<\/div><\/div>\n    <div class=\"liveupd\" id=\"rankupd\"><\/div>\n    <div class=\"ranklegend reveal\">\n      <div class=\"lg\"><span class=\"lg-ic medal\">1\u00ba<\/span><div><b>P\u00f3dio individual<\/b> leva camisa do Brasil. O 1\u00ba ainda ganha tablet e o 2\u00ba, fone.<\/div><\/div>\n      <div class=\"lg\"><span class=\"lg-ic star\">\u2605<\/span><div>Quem passa de <b id=\"thrtxt3\">30 pontos<\/b> ganha a estrela e <b>concorre ao sorteio de 5 camisas<\/b>.<\/div><\/div>\n      <div class=\"lg\"><span class=\"lg-ic dbl\">2\u00d7<\/span><div><b>Reta final (24 a 27 de junho)<\/b>: cravar o placar vale 20 pontos em qualquer um dos 4 \u00faltimos jogos.<\/div><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"refranking\" style=\"border-top:1px solid var(--line)\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Programa de indica\u00e7\u00e3o<\/div><h2 class=\"dsp h2\">Top 10 indicadores <span class=\"liveflag\"><span class=\"live-dot\"><\/span>ao vivo<\/span><\/h2>\n    <p class=\"lead\">Cada amigo que entra pelo seu link e d\u00e1 pelo menos um palpite vira <b>uma indica\u00e7\u00e3o v\u00e1lida<\/b>. <b>Os 3 alunos que mais indicarem ganham uma camisa oficial do Brasil cada.<\/b> Quer ver seu link de indica\u00e7\u00e3o? Acesse a sua \u00e1rea e compartilhe.<\/p><\/div>\n    <div class=\"card reveal\" id=\"refrankhome\"><div class=\"empty\">Carregando ranking de indica\u00e7\u00f5es\u2026<\/div><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"escolas\">\n  <div class=\"wrap\">\n    <div class=\"reveal\"><div class=\"eyebrow\">Torcida coletiva<\/div><h2 class=\"dsp h2\">Ranking das escolas <span class=\"liveflag\"><span class=\"live-dot\"><\/span>ao vivo<\/span><\/h2>\n    <p class=\"lead\">Cada concurso entra com a <b>m\u00e9dia dos seus 10 melhores colocados<\/b>, recalculada <b>em tempo real<\/b>. Escola pequena e escola grande competem em p\u00e9 de igualdade: vale a m\u00e9dia, n\u00e3o o tamanho. A escola na frente leva camisa do Brasil e um Apple Watch sorteados entre os seus 100 melhores colocados. Convide os colegas da sua turma para refor\u00e7ar o seu Top 10 e subir o placar.<\/p><\/div>\n    <div class=\"card reveal\" id=\"schoolbody\"><div class=\"empty\">Carregando\u2026<\/div><\/div>\n    <div class=\"liveupd\" id=\"schupd\"><\/div>\n    <div class=\"schoolprize note reveal\" style=\"align-items:center\"><span class=\"bigico\">\ud83c\udfeb<\/span><div>A escola campe\u00e3 ganha <b>2 sorteios entre seus integrantes<\/b>: <b>1 camisa oficial do Brasil<\/b> e <b>1 Apple Watch<\/b>. Quanto mais colegas da sua turma jogando bem, mais alto a escola sobe.<\/div><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"bonus\" class=\"bonusbox-wrap\">\n  <div class=\"wrap\">\n    <div class=\"bonusbox reveal\">\n      <div class=\"bb-strip\"><\/div>\n      <div class=\"bb-grid\">\n        <div class=\"bb-copy\">\n          <div class=\"bb-eyebrow\">\ud83c\udf81 Mais que um bol\u00e3o<\/div>\n          <h2 class=\"dsp bb-h2\">Enquanto a sele\u00e7\u00e3o corre atr\u00e1s do hexa, <span class=\"bb-hl\">voc\u00ea corre atr\u00e1s da sua vaga!<\/span><\/h2>\n          <p class=\"bb-lead\"><b>Materiais que custariam mais de R$ 1 mil est\u00e3o liberados gratuitamente at\u00e9 o final da Copa.<\/b> Acesso aos bancos de quest\u00f5es e sprints do Estrat\u00e9gia Militares e do Estrat\u00e9gia Vestibulares, mais o Guia ENEM em PDF.<\/p>\n          <ul class=\"bb-list\">\n            <li><span class=\"bb-ic\">\ud83c\udfaf<\/span><span><b>+110 mil quest\u00f5es militares<\/b>. EsPCEx, AFA, EFOMM, EAGS e mais.<\/span><\/li>\n            <li><span class=\"bb-ic\">\ud83c\udf93<\/span><span><b>+300 mil quest\u00f5es para vestibulares<\/b>. ENEM, FUVEST, UNICAMP e principais provas.<\/span><\/li>\n            <li><span class=\"bb-ic\">\u26a1<\/span><span><b>10 SPRINT de Quest\u00f5es<\/b> tem\u00e1ticos dos conte\u00fados que mais caem.<\/span><\/li>\n            <li><span class=\"bb-ic\">\ud83d\udcd8<\/span><span><b>Guia ENEM<\/b> em PDF: estrat\u00e9gia de prova, reda\u00e7\u00e3o 1000, gest\u00e3o do tempo.<\/span><\/li>\n          <\/ul>\n          <div class=\"bb-cta-row\">\n            <a href=\"#\" class=\"btn gold bb-cta\" id=\"bonusCta\">Quero o bol\u00e3o e os materiais \u2192<\/a>\n            <span class=\"bb-fineprint\">Acesso v\u00e1lido at\u00e9 <b>o final da Copa do Mundo<\/b>. Sem assinatura, sem cart\u00e3o de cr\u00e9dito.<\/span>\n          <\/div>\n        <\/div>\n        <aside class=\"bb-stack\">\n          <div class=\"bb-card bb-em\">\n            <div class=\"bb-badge\">Estrat\u00e9gia Militares<\/div>\n            <div class=\"bb-stat\"><b>+110 mil<\/b><span>quest\u00f5es<\/span><\/div>\n            <div class=\"bb-stat\"><b>+15<\/b><span>escolas militares<\/span><\/div>\n            <div class=\"bb-stat\"><b>10<\/b><span>SPRINT de Quest\u00f5es<\/span><\/div>\n          <\/div>\n          <div class=\"bb-card bb-ev\">\n            <div class=\"bb-badge\">Estrat\u00e9gia Vestibulares<\/div>\n            <div class=\"bb-stat\"><b>+300 mil<\/b><span>quest\u00f5es<\/span><\/div>\n            <div class=\"bb-stat\"><b>30+<\/b><span>vestibulares<\/span><\/div>\n            <div class=\"bb-stat\"><b>1<\/b><span>guia ENEM em PDF<\/span><\/div>\n          <\/div>\n        <\/aside>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<footer class=\"bolao-footer\" style=\"display:block !important;background:linear-gradient(102deg,#06352a 0%,#04261e 42%,#5a2a00 72%,#b85700 92%,#e46c00 100%) !important;color:rgba(255,255,255,.78) !important;padding:56px 0 30px !important;width:100% !important;\">\n  <div class=\"wrap\">\n    <div class=\"fmain\">\n      <div class=\"fbrand\">\n        <div class=\"fbrand-lockup\">\n          <img decoding=\"async\" class=\"flogo\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/06\/logo-em-branca-scaled.webp\" alt=\"Estrat\u00e9gia Militares\">\n          <img decoding=\"async\" class=\"flogo flogo-ev\" src=\"https:\/\/mkt.estrategia.com\/militares\/wp-content\/uploads\/sites\/7\/2026\/06\/logo-ev-branca.webp\" alt=\"Estrat\u00e9gia Vestibulares\">\n        <\/div>\n        <p class=\"ftag\">O <b>Bol\u00e3o da Coruja<\/b> \u00e9 a brincadeira do <b>Estrat\u00e9gia Militares<\/b> e do <b class=\"ftag-ev\">Estrat\u00e9gia Vestibulares<\/b> para a Copa da Coruja: estude pelo futebol, suba no ranking e concorra a camisas oficiais das sele\u00e7\u00f5es.<\/p>\n        <div class=\"flagband\"><i class=\"fb-bra\"><\/i><i class=\"fb-fra\"><\/i><i class=\"fb-arg\"><\/i><i class=\"fb-esp\"><\/i><\/div>\n      <\/div>\n      <div class=\"flinks\">\n        <div class=\"fcol\">\n          <h5>O bol\u00e3o<\/h5>\n          <a href=\"#selecoes\">Sele\u00e7\u00f5es participantes<\/a>\n          <a href=\"#premios\">Pr\u00eamios<\/a>\n          <a href=\"#regras\">Regras e pontua\u00e7\u00e3o<\/a>\n          <a href=\"#ranking\">Ranking ao vivo<\/a>\n          <a href=\"#escolas\">Ranking das escolas<\/a>\n        <\/div>\n        <div class=\"fcol\">\n          <h5>Sua conta<\/h5>\n          <a href=\"#\" id=\"fCadastro\">Inscreva-se<\/a>\n          <a href=\"#\" id=\"fAcessar\">Acessar (j\u00e1 sou inscrito)<\/a>\n          <a href=\"#como\">Como funciona<\/a>\n          <a href=\"#indique\">Indicar amigos<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"fbar\">\n      <span>\u00a9 2026 Estrat\u00e9gia Militares <span style=\"color:var(--ev,#e46c00);font-weight:800\">+<\/span> Vestibulares \u00b7 Bol\u00e3o da Coruja \u00b7 Copa da Coruja<\/span>\n    <\/div>\n  <\/div>\n<\/footer>\n<div class=\"toast\" id=\"toast\"><\/div>\n\n<!-- 2026-06-05: pin + SRI (supply-chain defense). Atualizar vers\u00e3o+hash juntos. -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@supabase\/supabase-js@2.107.0\"\n        integrity=\"sha384-o+Hkm\/usHFhCEWo1Ae1cLsOLiQQNrD2UfI424QDAaiZR7URnC8v35ey7s2sbGZHB\"\n        crossorigin=\"anonymous\"><\/script>\n<script>\n  window.__BOLAO_PAGE = 'home';\n  window.__BOLAO_HOME_URL     = 'https:\/\/mkt.estrategia.com\/militares\/bolao\/';\n  window.__BOLAO_CADASTRO_URL = 'https:\/\/mkt.estrategia.com\/militares\/bolao\/cadastro\/';\n  window.__BOLAO_ACESSAR_URL  = 'https:\/\/mkt.estrategia.com\/militares\/bolao\/acessar\/';\n  window.__BOLAO_ADMIN_URL    = 'https:\/\/mkt.estrategia.com\/militares\/bolao\/admin\/';\n  window.__BOLAO_ALUNO_URL    = 'https:\/\/mkt.estrategia.com\/militares\/bolao\/minha-area\/';\n  window.__BOLAO_SUPA = {\n    url: \"https:\/\/uwcvpowaszqyecoecbsb.supabase.co\",\n    key: \"sb_publishable_Gq6YPKxXJ7API-X0pHMWrw_Mem5PFHo\"\n  };\n  \/\/ Em produ\u00e7\u00e3o (WP), build_wp_content.py injeta:\n  \/\/   window.__BOLAO_HOME_URL, __BOLAO_ALUNO_URL, __BOLAO_CADASTRO_URL, __BOLAO_ACESSAR_URL.\n\n  \/\/ Liga os CTAs do nav\/hero\/footer pras pages dedicadas \/cadastro\/ e \/acessar\/.\n  document.addEventListener('DOMContentLoaded', function(){\n    var ref = '';\n    try { ref = new URLSearchParams(location.search).get('ref') || ''; } catch(e){}\n    var refQ = ref ? ('?ref=' + encodeURIComponent(ref)) : '';\n    var cadastro = (window.__BOLAO_CADASTRO_URL || '.\/Bol\u00e3o da Coruja - Cadastro.html') + refQ;\n    var acessar  = (window.__BOLAO_ACESSAR_URL  || '.\/Bol\u00e3o da Coruja - Acessar.html');\n    function bind(id, href){\n      var el = document.getElementById(id); if(!el) return;\n      el.setAttribute('href', href);\n      el.onclick = function(e){ e.preventDefault(); location.href = href; };\n    }\n    bind('navCadastro',    cadastro);\n    bind('navAcessar',     acessar);\n    bind('heroCadastro',   cadastro);\n    bind('heroAcessar',    acessar);\n    bind('refnoteCadastro',cadastro);\n    bind('prizeCtaCadastro', cadastro);\n    bind('bonusCta',       cadastro);\n    bind('fCadastro',      cadastro);\n    bind('fAcessar',       acessar);\n  });\n<\/script>\n<script id=\"bolao-js-boot\">\n(function(){\n  var SRC = 'LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEJvbMOjbyBkYSBDb3J1amEg4oCUIGZyb250IGNvbmVjdGFkbyBhbyBTdXBhYmFzZQogICAoQXV0aCBPVFAgcG9yIGVtYWlsICsgUG9zdGdyZXMvUkxTICsgUlBDcyArIFJlYWx0aW1lKQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIC0tLSBjbGllbnRlIFN1cGFiYXNlIChjb25maWcgaW5qZXRhZGEgbm8gSFRNTCBlbSB3aW5kb3cuX19CT0xBT19TVVBBKSAtLS0gKi8KY29uc3QgU1VQQSA9IHdpbmRvdy5fX0JPTEFPX1NVUEEgfHwge307CmxldCBzdXBhID0gbnVsbDsKaWYgKHdpbmRvdy5zdXBhYmFzZSAmJiBTVVBBLnVybCAmJiBTVVBBLmtleSkgewogIHN1cGEgPSB3aW5kb3cuc3VwYWJhc2UuY3JlYXRlQ2xpZW50KFNVUEEudXJsLCBTVVBBLmtleSwgewogICAgYXV0aDogeyBwZXJzaXN0U2Vzc2lvbjogdHJ1ZSwgYXV0b1JlZnJlc2hUb2tlbjogdHJ1ZSwgZGV0ZWN0U2Vzc2lvbkluVXJsOiBmYWxzZSB9CiAgfSk7Cn0KCi8qIERpc3B1dGEgZW50cmUgZXNjb2xhczogbWVkaWEgZG9zIEVTQ09MQV9UT1BOIG1lbGhvcmVzIGRlIGNhZGEgY29uY3Vyc28uCiAgIFByZW1pbyBjb2xldGl2byBkYSBjYW1wZWEgc29ydGVhZG8gZW50cmUgb3MgRVNDT0xBX1BSRU1JT19UT1BOIG1lbGhvcmVzLgogICBWYWxvcmVzIHJlYWlzIHZlbSBkYSB0YWJlbGEgY29uZmlnOyBlc3RlcyBzYW8gc28gbyBkZWZhdWx0IGRlIGV4aWJpY2FvLiAqLwpsZXQgRVNDT0xBX1RPUE4gPSAxMDsKbGV0IEVTQ09MQV9QUkVNSU9fVE9QTiA9IDEwMDsKCmNvbnN0IEY9e0JSQToi8J+Hp\/Cfh7ciLE1BUjoi8J+HsvCfh6YiLEhBSToi8J+HrfCfh7kiLFNDTzoi8J+PtPOggafzoIGi86CBs\/OggaPzoIG086CBvyIsRVNQOiLwn4eq8J+HuCIsQ1BWOiLwn4eo8J+HuyIsU0FVOiLwn4e48J+HpiIsVVJVOiLwn4e68J+HviIsRlJBOiLwn4er8J+HtyIsU0VOOiLwn4e48J+HsyIsSVJROiLwn4eu8J+HtiIsTk9SOiLwn4ez8J+HtCIsQVJHOiLwn4em8J+HtyIsQUxHOiLwn4ep8J+HvyIsQVVUOiLwn4em8J+HuSIsSk9SOiLwn4ev8J+HtCJ9Owpjb25zdCBDT0xPUj17CiAgQnJhc2lsOiJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCMwMDliM2EsI2ZmZGYwMCkiLAogIEZyYW7Dp2E6ImxpbmVhci1ncmFkaWVudCgxODBkZWcsIzBhNGVhMiwjZWMzYjQzKSIsCiAgQXJnZW50aW5hOiJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCM3NGFjZGMsIzJmNzRiNSkiLAogIEVzcGFuaGE6ImxpbmVhci1ncmFkaWVudCgxODBkZWcsI2M4MTAyZSwjZjFiZjAwKSIKfTsKY29uc3QgX1I9KHdpbmRvdy5fX3Jlc291cmNlc3x8e30pOwpjb25zdCBGTEFHSU1HPXsKICBCcmFzaWw6X1IuZmxhZ0JyYXx8Imh0dHBzOi8vbWt0LmVzdHJhdGVnaWEuY29tL21pbGl0YXJlcy93cC1jb250ZW50L3VwbG9hZHMvc2l0ZXMvNy8yMDI2LzA1L2JhbmRlaXJhLWJyYXNpbC53ZWJwIiwKICBGcmFuw6dhOl9SLmZsYWdGcmF8fCJodHRwczovL21rdC5lc3RyYXRlZ2lhLmNvbS9taWxpdGFyZXMvd3AtY29udGVudC91cGxvYWRzL3NpdGVzLzcvMjAyNi8wNS9iYW5kZWlyYS1mcmFuY2Eud2VicCIsCiAgQXJnZW50aW5hOl9SLmZsYWdBcmd8fCJodHRwczovL21rdC5lc3RyYXRlZ2lhLmNvbS9taWxpdGFyZXMvd3AtY29udGVudC91cGxvYWRzL3NpdGVzLzcvMjAyNi8wNS9iYW5kZWlyYS1hcmdlbnRpbmEud2VicCIsCiAgRXNwYW5oYTpfUi5mbGFnRXNwfHwiaHR0cHM6Ly9ta3QuZXN0cmF0ZWdpYS5jb20vbWlsaXRhcmVzL3dwLWNvbnRlbnQvdXBsb2Fkcy9zaXRlcy83LzIwMjYvMDUvYmFuZGVpcmEtZXNwYW5oYS53ZWJwIgp9Owpjb25zdCBOQVQ9Wwoge25tOiJCcmFzaWwiLGNjOiJCUkEiLGdwOiJHcnVwbyBDIixnYW1lczpbWyIxMy8wNiIsIk1hcnJvY29zIl0sWyIxOS8wNiIsIkhhaXRpIl0sWyIyNC8wNiIsIkVzY8OzY2lhIl1dfSwKIHtubToiRnJhbsOnYSIsY2M6IkZSQSIsZ3A6IkdydXBvIEkiLGdhbWVzOltbIjE2LzA2IiwiU2VuZWdhbCJdLFsiMjIvMDYiLCJJcmFxdWUiXSxbIjI2LzA2IiwiTm9ydWVnYSJdXX0sCiB7bm06IkFyZ2VudGluYSIsY2M6IkFSRyIsZ3A6IkdydXBvIEoiLGdhbWVzOltbIjE2LzA2IiwiQXJnw6lsaWEiXSxbIjIyLzA2Iiwiw4F1c3RyaWEiXSxbIjI3LzA2IiwiSm9yZMOibmlhIl1dfSwKIHtubToiRXNwYW5oYSIsY2M6IkVTUCIsZ3A6IkdydXBvIEgiLGdhbWVzOltbIjE1LzA2IiwiQ2FibyBWZXJkZSJdLFsiMjEvMDYiLCJBLiBTYXVkaXRhIl0sWyIyNi8wNiIsIlVydWd1YWkiXV19LApdOwovKiBFc3BlbGhhIG8gc2VlZCBkYSBtaWdyYXRpb24gMDAwMS4gQXF1aSBzZXJ2ZSBzbyBwYXJhIG1hcGVhciBub21lLT5jb2RpZ28KICAgZGUgYmFuZGVpcmEgKGEgdGFiZWxhIG1hdGNoZXMgbm8gYmFuY28gbmFvIGd1YXJkYSBvIGNvZGlnbykuICovCmNvbnN0IERFRkFVTFRfTUFUQ0hFUz1bCiB7aWQ6Im0wMSIsaDpbIkJyYXNpbCIsIkJSQSJdLGE6WyJNYXJyb2NvcyIsIk1BUiJdLGs6IjIwMjYtMDYtMTNUMTk6MDA6MDAtMDM6MDAiLHNlbDoiQnJhc2lsIixicmE6dHJ1ZSxmcjpmYWxzZX0sCiB7aWQ6Im0wMiIsaDpbIkJyYXNpbCIsIkJSQSJdLGE6WyJIYWl0aSIsIkhBSSJdLGs6IjIwMjYtMDYtMTlUMjE6MzA6MDAtMDM6MDAiLHNlbDoiQnJhc2lsIixicmE6dHJ1ZSxmcjpmYWxzZX0sCiB7aWQ6Im0wMyIsaDpbIkVzY8OzY2lhIiwiU0NPIl0sYTpbIkJyYXNpbCIsIkJSQSJdLGs6IjIwMjYtMDYtMjRUMTk6MDA6MDAtMDM6MDAiLHNlbDoiQnJhc2lsIixicmE6dHJ1ZSxmcjp0cnVlfSwKIHtpZDoibTA0IixoOlsiRXNwYW5oYSIsIkVTUCJdLGE6WyJDYWJvIFZlcmRlIiwiQ1BWIl0sazoiMjAyNi0wNi0xNVQxMzowMDowMC0wMzowMCIsc2VsOiJFc3BhbmhhIixicmE6ZmFsc2UsZnI6ZmFsc2V9LAoge2lkOiJtMDUiLGg6WyJFc3BhbmhhIiwiRVNQIl0sYTpbIkFyw6FiaWEgU2F1ZGl0YSIsIlNBVSJdLGs6IjIwMjYtMDYtMjFUMTM6MDA6MDAtMDM6MDAiLHNlbDoiRXNwYW5oYSIsYnJhOmZhbHNlLGZyOmZhbHNlfSwKIHtpZDoibTA2IixoOlsiVXJ1Z3VhaSIsIlVSVSJdLGE6WyJFc3BhbmhhIiwiRVNQIl0sazoiMjAyNi0wNi0yNlQyMTowMDowMC0wMzowMCIsc2VsOiJFc3BhbmhhIixicmE6ZmFsc2UsZnI6dHJ1ZX0sCiB7aWQ6Im0wNyIsaDpbIkZyYW7Dp2EiLCJGUkEiXSxhOlsiU2VuZWdhbCIsIlNFTiJdLGs6IjIwMjYtMDYtMTZUMTY6MDA6MDAtMDM6MDAiLHNlbDoiRnJhbsOnYSIsYnJhOmZhbHNlLGZyOmZhbHNlfSwKIHtpZDoibTA4IixoOlsiRnJhbsOnYSIsIkZSQSJdLGE6WyJJcmFxdWUiLCJJUlEiXSxrOiIyMDI2LTA2LTIyVDE4OjAwOjAwLTAzOjAwIixzZWw6IkZyYW7Dp2EiLGJyYTpmYWxzZSxmcjpmYWxzZX0sCiB7aWQ6Im0wOSIsaDpbIk5vcnVlZ2EiLCJOT1IiXSxhOlsiRnJhbsOnYSIsIkZSQSJdLGs6IjIwMjYtMDYtMjZUMTY6MDA6MDAtMDM6MDAiLHNlbDoiRnJhbsOnYSIsYnJhOmZhbHNlLGZyOnRydWV9LAoge2lkOiJtMTAiLGg6WyJBcmdlbnRpbmEiLCJBUkciXSxhOlsiQXJnw6lsaWEiLCJBTEciXSxrOiIyMDI2LTA2LTE2VDIyOjAwOjAwLTAzOjAwIixzZWw6IkFyZ2VudGluYSIsYnJhOmZhbHNlLGZyOmZhbHNlfSwKIHtpZDoibTExIixoOlsiQXJnZW50aW5hIiwiQVJHIl0sYTpbIsOBdXN0cmlhIiwiQVVUIl0sazoiMjAyNi0wNi0yMlQxNDowMDowMC0wMzowMCIsc2VsOiJBcmdlbnRpbmEiLGJyYTpmYWxzZSxmcjpmYWxzZX0sCiB7aWQ6Im0xMiIsaDpbIkpvcmTDom5pYSIsIkpPUiJdLGE6WyJBcmdlbnRpbmEiLCJBUkciXSxrOiIyMDI2LTA2LTI3VDIzOjAwOjAwLTAzOjAwIixzZWw6IkFyZ2VudGluYSIsYnJhOmZhbHNlLGZyOnRydWV9LApdOwpjb25zdCBDQ19CWV9OQU1FPXt9OwpERUZBVUxUX01BVENIRVMuZm9yRWFjaChtPT57Q0NfQllfTkFNRVttLmhbMF1dPW0uaFsxXTtDQ19CWV9OQU1FW20uYVswXV09bS5hWzFdO30pOwoKbGV0IGNmZz1udWxsLCBtZT1udWxsLCBtZURhdGE9bnVsbCwgcGVuZGluZ1JlZz1udWxsLCBwZW5kaW5nUmVmPW51bGw7CmxldCBzdHVkeUxpbmtzPW51bGw7CmxldCBsb2dpbk9ubHk9ZmFsc2U7IC8vIHRydWUgcXVhbmRvIG8gYWx1bm8gZW50cmEgcGVsbyBib3TDo28gIkFjZXNzYXIiIChzw7MgQ1BGKQpjb25zdCBBVVRIX0ZOX1VSTCA9IChTVVBBLnVybHx8JycpLnJlcGxhY2UoL1wvJC8sJycpICsgJy9mdW5jdGlvbnMvdjEvYm9sYW8tYXV0aCc7CgovKiAtLS0tLS0tLS0tIG1vZG8gZGEgcMOhZ2luYSAoaG9tZSAvIGFsdW5vIC8gY2FkYXN0cm8gLyBhY2Vzc2FyKSAtLS0tLS0tLS0tCiAgIENhZGEgSFRNTCBzZXRhIHdpbmRvdy5fX0JPTEFPX1BBR0UuIEVtIHByb2R1w6fDo28gKFdQKSwgYXMgcGFnZXMgZGVjbGFyYW0KICAgX19CT0xBT19IT01FX1VSTCwgX19CT0xBT19BTFVOT19VUkwsIF9fQk9MQU9fQ0FEQVNUUk9fVVJMIGUKICAgX19CT0xBT19BQ0VTU0FSX1VSTCBhYnNvbHV0b3MuIFNlbSBpc3NvLCBmYWxsYmFjayBwLyBhcnF1aXZvcyBsb2NhaXMuICovCmZ1bmN0aW9uIF9wYWdlKCl7cmV0dXJuIHdpbmRvdy5fX0JPTEFPX1BBR0V8fCdob21lJzt9CmZ1bmN0aW9uIF9pc0FsdW5vUGFnZSgpe3JldHVybiBfcGFnZSgpPT09J2FsdW5vJzt9CmZ1bmN0aW9uIF9pc0hvbWVQYWdlKCl7cmV0dXJuIF9wYWdlKCk9PT0naG9tZSc7fQpmdW5jdGlvbiBfaXNDYWRhc3Ryb1BhZ2UoKXtyZXR1cm4gX3BhZ2UoKT09PSdjYWRhc3Rybyc7fQpmdW5jdGlvbiBfaXNBY2Vzc2FyUGFnZSgpe3JldHVybiBfcGFnZSgpPT09J2FjZXNzYXInO30KZnVuY3Rpb24gX2lzQWRtaW5QYWdlKCl7cmV0dXJuIF9wYWdlKCk9PT0nYWRtaW4nO30KZnVuY3Rpb24gX2dvdG9BbHVubygpe2NvbnN0IHU9d2luZG93Ll9fQk9MQU9fQUxVTk9fVVJMfHwnLi9Cb2zDo28gZGEgQ29ydWphIC0gQWx1bm8uaHRtbCc7bG9jYXRpb24uaHJlZj11O30KZnVuY3Rpb24gX2dvdG9Ib21lKGhhc2gpe2NvbnN0IGJhc2U9d2luZG93Ll9fQk9MQU9fSE9NRV9VUkx8fCcuL0JvbMOjbyBkYSBDb3J1amEuaHRtbCc7bG9jYXRpb24uaHJlZj1iYXNlKyhoYXNofHwnJyk7fQpmdW5jdGlvbiBfZ290b0NhZGFzdHJvKGV4dHJhKXtjb25zdCB1PXdpbmRvdy5fX0JPTEFPX0NBREFTVFJPX1VSTHx8Jy4vQm9sw6NvIGRhIENvcnVqYSAtIENhZGFzdHJvLmh0bWwnO2xvY2F0aW9uLmhyZWY9dSsoZXh0cmF8fCcnKTt9CmZ1bmN0aW9uIF9nb3RvQWNlc3NhcihleHRyYSl7Y29uc3QgdT13aW5kb3cuX19CT0xBT19BQ0VTU0FSX1VSTHx8Jy4vQm9sw6NvIGRhIENvcnVqYSAtIEFjZXNzYXIuaHRtbCc7bG9jYXRpb24uaHJlZj11KyhleHRyYXx8JycpO30KZnVuY3Rpb24gX2dvdG9BZG1pbigpe2NvbnN0IHU9d2luZG93Ll9fQk9MQU9fQURNSU5fVVJMfHwnLi9Cb2zDo28gZGEgQ29ydWphIC0gQWRtaW4uaHRtbCc7bG9jYXRpb24uaHJlZj11O30KCi8qIC0tLS0tLS0tLS0gaGVscGVycyBkZSBVSSAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIG1hc2tDUEYodil7dj0odnx8JycpLnJlcGxhY2UoL1xEL2csJycpLnNsaWNlKDAsMTEpO3JldHVybiB2LnJlcGxhY2UoLyhcZHszfSkoXGQpLywnJDEuJDInKS5yZXBsYWNlKC8oXGR7M30pXC4oXGR7M30pKFxkKS8sJyQxLiQyLiQzJykucmVwbGFjZSgvKFxkezN9KVwuKFxkezN9KVwuKFxkezN9KShcZCkvLCckMS4kMi4kMy0kNCcpO30KZnVuY3Rpb24gdmFsaWRDUEYocmF3KXtjb25zdCBjPShyYXd8fCcnKS5yZXBsYWNlKC9cRC9nLCcnKTtpZihjLmxlbmd0aCE9PTExfHwvXihcZClcMXsxMH0kLy50ZXN0KGMpKXJldHVybiBmYWxzZTsKICBsZXQgcz0wO2ZvcihsZXQgaT0wO2k8OTtpKyspcys9KCtjW2ldKSooMTAtaSk7bGV0IGQxPShzKjEwKSUxMTtpZihkMT09PTEwKWQxPTA7aWYoZDEhPT0rY1s5XSlyZXR1cm4gZmFsc2U7CiAgcz0wO2ZvcihsZXQgaT0wO2k8MTA7aSsrKXMrPSgrY1tpXSkqKDExLWkpO2xldCBkMj0ocyoxMCklMTE7aWYoZDI9PT0xMClkMj0wO3JldHVybiBkMj09PStjWzEwXTt9CmZ1bmN0aW9uIG5vd1N0YW1wKCl7cmV0dXJuIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCdwdC1CUicse2hvdXI6JzItZGlnaXQnLG1pbnV0ZTonMi1kaWdpdCcsc2Vjb25kOicyLWRpZ2l0J30pO30KZnVuY3Rpb24gdG9hc3QobSl7Y29uc3QgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9hc3QnKTtpZighdClyZXR1cm47dC50ZXh0Q29udGVudD1tO3QuY2xhc3NMaXN0LmFkZCgnc2hvdycpO2NsZWFyVGltZW91dCh0Ll90KTt0Ll90PXNldFRpbWVvdXQoKCk9PnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpLDIzMDApO30KZnVuY3Rpb24gZm10RGF0ZShpc28pe2NvbnN0IGQ9bmV3IERhdGUoaXNvKTtyZXR1cm4gZC50b0xvY2FsZVN0cmluZygncHQtQlInLHtkYXk6JzItZGlnaXQnLG1vbnRoOicyLWRpZ2l0Jyxob3VyOicyLWRpZ2l0JyxtaW51dGU6JzItZGlnaXQnfSkrJ2gnO30KZnVuY3Rpb24gZm10VHModHMpe3JldHVybiB0cz9uZXcgRGF0ZSh0cykudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJyk6Jyc7fQpmdW5jdGlvbiBmbXRCZXQodHMpe3JldHVybiB0cz9uZXcgRGF0ZSh0cykudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJyx7ZGF5OicyLWRpZ2l0Jyxtb250aDonMi1kaWdpdCcsaG91cjonMi1kaWdpdCcsbWludXRlOicyLWRpZ2l0J30pKydoJzonJzt9CmZ1bmN0aW9uIGVzYyhzKXtyZXR1cm4gKHM9PW51bGw\/Jyc6U3RyaW5nKHMpKS5yZXBsYWNlKC9bJjw+IiddL2csYz0+KHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJyInOicmcXVvdDsnLCInIjonJiMzOTsnfVtjXSkpO30KLyogUDItMTogZGVidWcgbG9nZ2VyIGdhdGVkIHBvciB3aW5kb3cuX19ERUJVRy4gTWFudGVtb3MgY29uc29sZS5lcnJvciBwcmEgZXJyb3MgcmVhaXMKICAgbWFzIGxvZ3MgaW5mb3JtYXRpdm9zIHPDsyBhcGFyZWNlbSBzZSBERUJVRz10cnVlIChzZXQgdmlhIERldlRvb2xzIGFudGVzIGRvIGxvYWQpLiAqLwpjb25zdCBfX0RFQlVHID0gKHR5cGVvZiB3aW5kb3chPT0ndW5kZWZpbmVkJyAmJiB3aW5kb3cuX19CT0xBT19ERUJVRz09PXRydWUpOwpmdW5jdGlvbiBfZGJnKCl7aWYoIV9fREVCVUcpcmV0dXJuO3RyeXtjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLGFyZ3VtZW50cyk7fWNhdGNoKGUpe319CmZ1bmN0aW9uIF9kYmd3KCl7aWYoIV9fREVCVUcpcmV0dXJuO3RyeXtjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhcmd1bWVudHMpO31jYXRjaChlKXt9fQpmdW5jdGlvbiByZWZMaW5rKGNvZGUpewogIC8vIExpbmsgZGUgaW5kaWNhw6fDo28gYXBvbnRhIHByYSAvY2FkYXN0cm8vP3JlZj1DT0RFIChvbmRlIG8gYW1pZ28gw6kgY2FwdHVyYWRvKS4KICBsZXQgYmFzZT13aW5kb3cuX19CT0xBT19DQURBU1RST19VUkw7CiAgaWYoIWJhc2Upe2Jhc2U9bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lO2lmKGxvY2F0aW9uLnByb3RvY29sPT09J2ZpbGU6JyliYXNlPWxvY2F0aW9uLmhyZWYuc3BsaXQoJyMnKVswXS5zcGxpdCgnPycpWzBdO30KICByZXR1cm4gYmFzZSsnP3JlZj0nK2NvZGU7Cn0KZnVuY3Rpb24gaXNDbG9zZWQobSl7cmV0dXJuIChjZmcmJmNmZy5sb2NrZWQmJmNmZy5sb2NrZWRbbS5pZF0pfHwoRGF0ZS5ub3coKT49bmV3IERhdGUobS5rKS5nZXRUaW1lKCkpO30KZnVuY3Rpb24gcG9pbnRzRm9yKHAscmVzLGJyYSl7aWYoIXB8fCFyZXN8fHJlcy5oPT1udWxsfHxyZXMuYT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBzZz14PT54Lmg+eC5hPzE6eC5oPHguYT8tMTowOwogIGNvbnN0IGV4YWN0PXAuaD09PXJlcy5oJiZwLmE9PT1yZXMuYSxyZXNPaz1zZyhwKT09PXNnKHJlcyksZGlmZk9rPShwLmgtcC5hKT09PShyZXMuaC1yZXMuYSksZGVjaWRlZD1zZyhyZXMpIT09MDsKICBsZXQgcHRzPWV4YWN0PzEwOihyZXNPayYmZGlmZk9rJiZkZWNpZGVkPzc6KHJlc09rPzU6MCkpO2lmKGV4YWN0JiZicmEpcHRzKj0yO3JldHVybiB7cHRzLGV4YWN0LHJlc09rfTt9CgovKiAtLS0tLS0tLS0tIGNvdW50ZG93biAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIG5leHRPcGVuTWF0Y2goKXtpZighY2ZnfHwhY2ZnLm1hdGNoZXMpcmV0dXJuIG51bGw7Y29uc3Qgb3Blbj1jZmcubWF0Y2hlcy5maWx0ZXIobT0+IWlzQ2xvc2VkKG0pKS5zb3J0KChhLGIpPT5uZXcgRGF0ZShhLmspLmdldFRpbWUoKS1uZXcgRGF0ZShiLmspLmdldFRpbWUoKSk7cmV0dXJuIG9wZW5bMF18fG51bGw7fQpmdW5jdGlvbiByZW5kZXJDb3VudGRvd24oKXtjb25zdCBzdHJpcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV4dG1hdGNoJyk7aWYoIXN0cmlwKXJldHVybjtpZighY2ZnKXtzdHJpcC5zdHlsZS5kaXNwbGF5PSdub25lJztyZXR1cm47fQogIGNvbnN0IG09bmV4dE9wZW5NYXRjaCgpO2lmKCFtKXtzdHJpcC5zdHlsZS5kaXNwbGF5PSdub25lJztyZXR1cm47fQogIGNvbnN0IGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25tLWdhbWUnKTtpZihnKWcudGV4dENvbnRlbnQ9bS5oWzBdKycgeCAnK20uYVswXSsnIMK3ICcrZm10RGF0ZShtLmspOwogIGNvbnN0IGNsaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm0tY2xvY2snKTtjb25zdCBkaWZmPW5ldyBEYXRlKG0uaykuZ2V0VGltZSgpLURhdGUubm93KCk7CiAgY29uc3Qgcz1NYXRoLm1heCgwLE1hdGguZmxvb3IoZGlmZi8xMDAwKSksZD1NYXRoLmZsb29yKHMvODY0MDApLGg9TWF0aC5mbG9vcihzJTg2NDAwLzM2MDApLG1pPU1hdGguZmxvb3IocyUzNjAwLzYwKSxzZT1zJTYwLHo9bj0+U3RyaW5nKG4pLnBhZFN0YXJ0KDIsJzAnKTsKICBpZihjbGspY2xrLmlubmVySFRNTD0oZD4wP2A8ZGl2IGNsYXNzPSJubS1zZWciPjxiPiR7eihkKX08L2I+PHNwYW4+JHtkPT09MT8nZGlhJzonZGlhcyd9PC9zcGFuPjwvZGl2PmA6JycpK2A8ZGl2IGNsYXNzPSJubS1zZWciPjxiPiR7eihoKX08L2I+PHNwYW4+aG9yYXM8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibm0tc2VnIj48Yj4ke3oobWkpfTwvYj48c3Bhbj5taW48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibm0tc2VnIj48Yj4ke3ooc2UpfTwvYj48c3Bhbj5zZWc8L3NwYW4+PC9kaXY+YDsKICBzdHJpcC5zdHlsZS5kaXNwbGF5PScnO30Kc2V0SW50ZXJ2YWwocmVuZGVyQ291bnRkb3duLDEwMDApOwoKLyogLS0tLS0tLS0tLSByZXZlYWwtb24tc2Nyb2xsIC0tLS0tLS0tLS0gKi8KY29uc3QgaW89KCJJbnRlcnNlY3Rpb25PYnNlcnZlciIgaW4gd2luZG93KT9uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZXM9PmVzLmZvckVhY2goZT0+e2lmKGUuaXNJbnRlcnNlY3Rpbmcpe2UudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ3ZpcycpO2lvLnVub2JzZXJ2ZShlLnRhcmdldCk7fX0pLHt0aHJlc2hvbGQ6LjA4LHJvb3RNYXJnaW46IjBweCAwcHggLTglIDBweCJ9KTpudWxsOwpmdW5jdGlvbiByZXZlYWxJblZpZXcoKXtjb25zdCBoPXdpbmRvdy5pbm5lckhlaWdodHx8ODAwO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZlYWw6bm90KC52aXMpJykuZm9yRWFjaChlbD0+e2NvbnN0IHQ9ZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO2lmKHQ8aCowLjkyKWVsLmNsYXNzTGlzdC5hZGQoJ3ZpcycpO30pO30KZnVuY3Rpb24gb2JzUmV2ZWFsKCl7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmVhbDpub3QoLnZpcyknKS5mb3JFYWNoKChlbCxpKT0+e2VsLnN0eWxlLnRyYW5zaXRpb25EZWxheT0oTWF0aC5taW4oaSw0KSo2MCkrJ21zJztpZihpbylpby5vYnNlcnZlKGVsKTt9KTsKICByZXZlYWxJblZpZXcoKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxyZXZlYWxJblZpZXcse3Bhc3NpdmU6dHJ1ZX0pOwogIHNldFRpbWVvdXQoKCk9PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZlYWw6bm90KC52aXMpJykuZm9yRWFjaChlbD0+ZWwuY2xhc3NMaXN0LmFkZCgndmlzJykpLDE2MDApOwp9CmZ1bmN0aW9uIHJlbmRlck5hdCgpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXRncmlkJykuaW5uZXJIVE1MPU5BVC5tYXAobj0+YDxkaXYgY2xhc3M9Im5hdCByZXZlYWwiPjxkaXYgY2xhc3M9ImJhciIgc3R5bGU9ImJhY2tncm91bmQ6JHtDT0xPUltuLm5tXX0iPjwvZGl2PjxkaXYgY2xhc3M9Im5hdGZsYWciIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgxODBkZWcscmdiYSg3LDI2LDE5LC4wNSkscmdiYSg3LDI2LDE5LC43KSksdXJsKCcke0ZMQUdJTUdbbi5ubV19JykiPjxkaXYgY2xhc3M9Im5hdGxhYmVsIj48ZGl2IGNsYXNzPSJubSI+JHtuLm5tfTwvZGl2PjxkaXYgY2xhc3M9ImdwIj4ke24uZ3B9PC9kaXY+PC9kaXY+PC9kaXY+PHVsPiR7bi5nYW1lcy5tYXAoZz0+YDxsaT48c3BhbiBjbGFzcz0iZHQiPiR7Z1swXX08L3NwYW4+PHNwYW4gY2xhc3M9Im9wIj7DlyAke2dbMV19PHNtYWxsPkZhc2UgZGUgZ3J1cG9zPC9zbWFsbD48L3NwYW4+PC9saT5gKS5qb2luKCcnKX08L3VsPjwvZGl2PmApLmpvaW4oJycpO30KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBDT05GSUcgKG1hdGNoZXMgKyBjb25maWcpIHZpbmRhIGRvIGJhbmNvCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpmdW5jdGlvbiBtYXBNYXRjaChyKXtyZXR1cm4ge2lkOnIuaWQsaDpbci5ob21lLENDX0JZX05BTUVbci5ob21lXXx8JyddLGE6W3IuYXdheSxDQ19CWV9OQU1FW3IuYXdheV18fCcnXSxrOnIua2lja29mZixzZWw6ci5zZWwsYnJhOiEhci5pc19icmF6aWwsZnI6ISFyLmlzX2ZpbmFsX3JvdW5kfTt9CmFzeW5jIGZ1bmN0aW9uIGxvYWRDZmcoKXsKICBpZighc3VwYSl7Y2ZnPXttYXRjaGVzOkRFRkFVTFRfTUFUQ0hFUyxyZXN1bHRzOnt9LGxvY2tlZDp7fSxyYWZmbGVNaW46MzB9O3JldHVybjt9CiAgY29uc3QgW21SZXMsY1Jlc109YXdhaXQgUHJvbWlzZS5hbGwoWwogICAgc3VwYS5mcm9tKCdtYXRjaGVzJykuc2VsZWN0KCcqJykub3JkZXIoJ2lkJyksCiAgICBzdXBhLmZyb20oJ2NvbmZpZycpLnNlbGVjdCgnKicpCiAgXSk7CiAgLy8gUm9idXN0ZXo6IG8gc3VwYWJhc2UtanMgdjIgTsODTyBsYW7Dp2EgZW0gZmFsaGEsIGRldm9sdmUge2Vycm9yfS4gU2UgaWdub3Jhcm1vcywKICAvLyB1bSBibGlwIGRlIHJlZGUgbnVtIHRpY2sgemVyYSByZXN1bHRzL2xvY2tlZCBlIG9zIGpvZ29zIHRyYXZhZG9zIHJlYXBhcmVjZW0KICAvLyAiQWJlcnRvcyIgKyByZXN1bHRhZG9zIHNvbWVtIGRhIHRlbGEgZHVyYW50ZSBhIENvcGEuIEVtIGVycm8sIHByZXNlcnZhIG8gY2ZnCiAgLy8gYW50ZXJpb3I7IHPDsyBjYWkgcHJvIGRlZmF1bHQgc2UgYWluZGEgbsOjbyBob3V2ZXIgbmVuaHVtIGNmZyBjYXJyZWdhZG8uCiAgaWYobVJlcy5lcnJvcnx8Y1Jlcy5lcnJvcil7CiAgICBfZGJndygnW2xvYWRDZmddIGVycm8gZG8gU3VwYWJhc2UsIG1hbnRlbmRvIGNvbmZpZyBhbnRlcmlvcicsbVJlcy5lcnJvcnx8Y1Jlcy5lcnJvcik7CiAgICBpZihjZmcpcmV0dXJuOwogICAgY2ZnPXttYXRjaGVzOkRFRkFVTFRfTUFUQ0hFUyxyZXN1bHRzOnt9LGxvY2tlZDp7fSxyYWZmbGVNaW46MzB9OwogICAgcmV0dXJuOwogIH0KICBjb25zdCBtYXRjaGVzPW1SZXMuZGF0YSxjb25mPWNSZXMuZGF0YTsKICBjb25zdCByZXN1bHRzPXt9LGxvY2tlZD17fTsKICBjb25zdCByb3dzPShtYXRjaGVzJiZtYXRjaGVzLmxlbmd0aCk\/bWF0Y2hlczpbXTsKICAocm93cykuZm9yRWFjaChyPT57aWYoci5yZXN1bHRfaG9tZSE9bnVsbCYmci5yZXN1bHRfYXdheSE9bnVsbClyZXN1bHRzW3IuaWRdPXtoOnIucmVzdWx0X2hvbWUsYTpyLnJlc3VsdF9hd2F5fTtsb2NrZWRbci5pZF09ISFyLmxvY2tlZDt9KTsKICBjb25zdCBjbWFwPXt9Oyhjb25mfHxbXSkuZm9yRWFjaChjPT57Y21hcFtjLmtleV09Yy52YWx1ZTt9KTsKICBjZmc9ewogICAgbWF0Y2hlczpyb3dzLmxlbmd0aD9yb3dzLm1hcChtYXBNYXRjaCk6REVGQVVMVF9NQVRDSEVTLAogICAgcmVzdWx0cyxsb2NrZWQsCiAgICByYWZmbGVNaW46Y21hcC5yYWZmbGVfbWluIT1udWxsP051bWJlcihjbWFwLnJhZmZsZV9taW4pOjMwCiAgfTsKICBpZihjbWFwLmVzY29sYV90b3BuIT1udWxsKUVTQ09MQV9UT1BOPU51bWJlcihjbWFwLmVzY29sYV90b3BuKTsKICBpZihjbWFwLmVzY29sYV9wcmVtaW9fdG9wbiE9bnVsbClFU0NPTEFfUFJFTUlPX1RPUE49TnVtYmVyKGNtYXAuZXNjb2xhX3ByZW1pb190b3BuKTsKICBzdHVkeUxpbmtzPWNtYXAuc3R1ZHlfbGlua3N8fG51bGw7CiAgY29uc3QgdGhyPWNmZy5yYWZmbGVNaW4rJyBwb250b3MnOwogIFsndGhydHh0JywndGhydHh0MicsJ3RocnR4dDMnXS5mb3JFYWNoKGlkPT57Y29uc3QgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYoZSllLnRleHRDb250ZW50PXRocjt9KTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEFVVEggKyBDQURBU1RSTwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KYXN5bmMgZnVuY3Rpb24gY3VycmVudFVzZXIoKXtpZighc3VwYSlyZXR1cm4gbnVsbDtjb25zdCB7ZGF0YX09YXdhaXQgc3VwYS5hdXRoLmdldFVzZXIoKTtyZXR1cm4gZGF0YT9kYXRhLnVzZXI6bnVsbDt9Ci8vIFNvdXJjZSBvZiB0cnV0aCA9IHRhYmVsYSBwdWJsaWMuYWRtaW5zIChjb25zdWx0YWRhIHZpYSBSUEMgaXNfYWRtaW4oKSkuCi8vIEhhcmRlbmluZyBIMTogYW50ZXMgbGlhIGFwcF9tZXRhZGF0YS5pc19hZG1pbiBkbyBKV1QsIHF1ZSBwb2RpYSBmaWNhcgovLyBkZXNzaW5jcm9uaXphZG8gZGEgdGFiZWxhLiBDYWNoZSBlbSBtZW3Ds3JpYSBwcmEgZXZpdGFyIDEgUlBDIHBvciB1c28uCmxldCBfaXNBZG1pbkNhY2hlPW51bGw7CmFzeW5jIGZ1bmN0aW9uIGlzQWRtaW5Vc2VyKHUpewogIGlmKCF1fHwhc3VwYSlyZXR1cm4gZmFsc2U7CiAgaWYoX2lzQWRtaW5DYWNoZSE9PW51bGwpcmV0dXJuIF9pc0FkbWluQ2FjaGU7CiAgdHJ5ewogICAgY29uc3Qge2RhdGEsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdpc19hZG1pbicpOwogICAgX2lzQWRtaW5DYWNoZT0hZXJyb3ImJmRhdGE9PT10cnVlOwogICAgcmV0dXJuIF9pc0FkbWluQ2FjaGU7CiAgfWNhdGNoKF9lKXtyZXR1cm4gZmFsc2U7fQp9Ci8vIExpbXBhIGNhY2hlIGFvIGRlc2xvZ2FyIChwcsOzeGltbyBsb2dpbiByZWZheiBhIGNoZWNhZ2VtKS4KZnVuY3Rpb24gX3Jlc2V0QWRtaW5DYWNoZSgpe19pc0FkbWluQ2FjaGU9bnVsbDt9Cgphc3luYyBmdW5jdGlvbiBsb2FkTWUodXNlcil7CiAgbWU9e2lkOnVzZXIuaWQsZW1haWw6dXNlci5lbWFpbH07CiAgY29uc3Qge2RhdGE6cGxheWVyfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5zZWxlY3QoJyonKS5lcSgnaWQnLHVzZXIuaWQpLm1heWJlU2luZ2xlKCk7CiAgaWYoIXBsYXllcil7bWVEYXRhPW51bGw7cmV0dXJuO30KICBjb25zdCB7ZGF0YTpwcmVkc309YXdhaXQgc3VwYS5mcm9tKCdwcmVkaWN0aW9ucycpLnNlbGVjdCgnbWF0Y2hfaWQsaG9tZV9nb2Fscyxhd2F5X2dvYWxzLHVwZGF0ZWRfYXQnKS5lcSgncGxheWVyX2lkJyx1c2VyLmlkKTsKICBjb25zdCBwbWFwPXt9OyhwcmVkc3x8W10pLmZvckVhY2gocj0+cG1hcFtyLm1hdGNoX2lkXT17aDpyLmhvbWVfZ29hbHMsYTpyLmF3YXlfZ29hbHMsdHM6ci51cGRhdGVkX2F0fSk7CiAgbWVEYXRhPXtub21lOnBsYXllci5ub21lLHVzZXJuYW1lOnBsYXllci51c2VybmFtZSx2ZXJ0aWNhbDpwbGF5ZXIudmVydGljYWwsZW1haWw6cGxheWVyLmVtYWlsLGNwZjpwbGF5ZXIuY3BmLHRlbDpwbGF5ZXIudGVsZWZvbmUsY29uYzpwbGF5ZXIuY29uY3Vyc28sbWFya2V0aW5nOnBsYXllci5tYXJrZXRpbmdfY29uc2VudCxyZWZDb2RlOnBsYXllci5yZWZfY29kZSxyZWZlcnJlZEJ5OnBsYXllci5yZWZlcnJlZF9ieSxjcmVhdGVkQXQ6cGxheWVyLmNyZWF0ZWRfYXQscHJlZGljdGlvbnM6cG1hcH07Cn0KYXN5bmMgZnVuY3Rpb24gcmVsb2FkTXlQcmVkcygpe2lmKCFtZSlyZXR1cm47Y29uc3Qge2RhdGE6cHJlZHN9PWF3YWl0IHN1cGEuZnJvbSgncHJlZGljdGlvbnMnKS5zZWxlY3QoJ21hdGNoX2lkLGhvbWVfZ29hbHMsYXdheV9nb2Fscyx1cGRhdGVkX2F0JykuZXEoJ3BsYXllcl9pZCcsbWUuaWQpO2NvbnN0IHBtYXA9e307KHByZWRzfHxbXSkuZm9yRWFjaChyPT5wbWFwW3IubWF0Y2hfaWRdPXtoOnIuaG9tZV9nb2FscyxhOnIuYXdheV9nb2Fscyx0czpyLnVwZGF0ZWRfYXR9KTttZURhdGEucHJlZGljdGlvbnM9cG1hcDt9CgpmdW5jdGlvbiBlbnRlclBsYXkobm9tZSl7CiAgLy8gU2UgZm9yIGEgcMOhZ2luYSBkYSBob21lIEUgaG91dmVyIMOhcmVhIGRvIGFsdW5vIGNvbmZpZ3VyYWRhLCBtYW5kYSBwcmEgbMOhLgogIGlmKF9pc0hvbWVQYWdlKCkmJndpbmRvdy5fX0JPTEFPX0FMVU5PX1VSTCl7X2dvdG9BbHVubygpO3JldHVybjt9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2NhcmQnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICBjb25zdCB2Yz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmVyaWZ5Y2FyZCcpO2lmKHZjKXZjLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5YXJlYScpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2hvYW1pJykuaW5uZXJIVE1MPWVzYyhub21lKSsnIDxzcGFuIGNsYXNzPSJ2YmFkZ2UiPuKckyBlbWFpbCB2ZXJpZmljYWRvPC9zcGFuPic7CiAgcmVuZGVyTWF0Y2hlcygpO3JlbmRlclJlZmVycmFsKCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnRpY2lwYXInKS5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCd9KTsKfQpmdW5jdGlvbiBlbnRlckFsdW5vKCl7CiAgaWYoIW1lRGF0YSlyZXR1cm47CiAgY29uc3QgaGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dob2FtaScpOwogIGlmKGhpKWhpLnRleHRDb250ZW50PW1lRGF0YS5ub21lLnNwbGl0KCcgJylbMF07CiAgLy8gRW5ncmVuYWdlbSB2aXPDrXZlbCBzw7MgcHJhIGFkbWluIChhdGFsaG8gcHJvIHBhaW5lbCAvYWRtaW4vKQogIGNvbnN0IGdlYXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluR2VhcicpOwogIGlmKGdlYXImJnN1cGEpewogICAgc3VwYS5hdXRoLmdldFVzZXIoKS50aGVuKGFzeW5jKHtkYXRhfSk9PnsKICAgICAgaWYoZGF0YSYmZGF0YS51c2VyJiZhd2FpdCBpc0FkbWluVXNlcihkYXRhLnVzZXIpKXsKICAgICAgICBnZWFyLmhpZGRlbj1mYWxzZTsKICAgICAgICBnZWFyLm9uY2xpY2s9ZT0+e2UucHJldmVudERlZmF1bHQoKTtfZ290b0FkbWluKCk7fTsKICAgICAgfQogICAgfSk7CiAgfQogIHJlbmRlck1hdGNoZXMoKTsKICByZW5kZXJSZWZlcnJhbCgpOwogIHJlbmRlclJlZmVycmFsTGVhZGVyYm9hcmQoKTsKICByZW5kZXJNeVJlZmVycmFscygpOwogIHJlbmRlckRhc2hib2FyZCgpOwogIHJlbmRlclN0dWR5TWF0ZXJpYWxzKCk7CiAgcmVuZGVySGlzdG9yeSgpOwogIC8vIDIwMjYtMDYtMDYgQlVHLTEwOiBzaW5hbGl6YSBwcm8gQ1NTIHF1ZSBjYXJyZWdvdSAocmV2ZWxhIHdob2FtaSwgZXNjb25kZSAiQ2FycmVnYW5kb+KApiIpCiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdhbHVuby1sb2FkZWQnKTsKfQoKZnVuY3Rpb24gc2hvd1ZlcmlmeShyZWcpewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2bWFpbCcpLnRleHRDb250ZW50PXJlZy5lbWFpbDsKICBjb25zdCBvdHA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zfb3RwJyk7b3RwLnZhbHVlPScnO290cC5jbGFzc0xpc3QucmVtb3ZlKCdlcnInKTsKICBjb25zdCBoaW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW1vaGludCcpO2lmKGhpbnQpe2hpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7aGludC5pbm5lckhUTUw9Jyc7fQogIGNvbnN0IHJjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWdjYXJkJyk7aWYocmMpcmMuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgY29uc3QgYWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjZXNzY2FyZCcpO2lmKGFjKWFjLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2ZXJpZnljYXJkJykuc3R5bGUuZGlzcGxheT0nYmxvY2snOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2ZXJpZnljYXJkJykuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnfSk7CiAgc2V0VGltZW91dCgoKT0+b3RwLmZvY3VzKCksMjUwKTsKfQoKYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UGxheWVyKHVzZXIpewogIGNvbnN0IHtkYXRhOmV4aXN0aW5nfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5zZWxlY3QoJ2lkLGNvbmN1cnNvJykuZXEoJ2lkJyx1c2VyLmlkKS5tYXliZVNpbmdsZSgpOwogIGlmKGV4aXN0aW5nKXsKICAgIC8vIDAwMTUgQzI6IFJFVk9LRSBVUERBVEUgb24gcGxheWVycyDihpIgdXNhIFJQQyB1cGRhdGVfbXlfYmFzaWMKICAgIGF3YWl0IHN1cGEucnBjKCd1cGRhdGVfbXlfYmFzaWMnLHtwX25vbWU6cGVuZGluZ1JlZy5ub21lLHBfdGVsZWZvbmU6cGVuZGluZ1JlZy50ZWwscF9tYXJrZXRpbmc6cGVuZGluZ1JlZy5tYXJrZXRpbmd9KTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgcm93PXtpZDp1c2VyLmlkLG5vbWU6cGVuZGluZ1JlZy5ub21lLGNwZjpwZW5kaW5nUmVnLmNwZixlbWFpbDpwZW5kaW5nUmVnLmVtYWlsLHRlbGVmb25lOnBlbmRpbmdSZWcudGVsLGNvbmN1cnNvOnBlbmRpbmdSZWcuY29uYyxtYXJrZXRpbmdfY29uc2VudDpwZW5kaW5nUmVnLm1hcmtldGluZ307CiAgaWYocGVuZGluZ1JlZilyb3cucmVmZXJyZWRfYnk9cGVuZGluZ1JlZjsKICBsZXQge2Vycm9yfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5pbnNlcnQocm93KTsKICBpZihlcnJvciYmZXJyb3IuY29kZT09PScyMzUwMycmJnJvdy5yZWZlcnJlZF9ieSl7ZGVsZXRlIHJvdy5yZWZlcnJlZF9ieTsoe2Vycm9yfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5pbnNlcnQocm93KSk7fQogIGlmKGVycm9yKXsKICAgIGlmKGVycm9yLmNvZGU9PT0nMjM1MDUnJiYvY3BmL2kudGVzdCgoZXJyb3IubWVzc2FnZXx8JycpKyhlcnJvci5kZXRhaWxzfHwnJykpKXRocm93ICdDUEZfVEFLRU4nOwogICAgdGhyb3cgZXJyb3I7CiAgfQp9CgovKiAtLS0gQVVUSCBDUEYtT05MWSAodmlhIEVkZ2UgRnVuY3Rpb24gYm9sYW8tYXV0aCkgLS0tCiAgIFNlbSBPVFAgcG9yIGVtYWlsLiBzaWdudXAgY3JpYSB1c2VyK2xpbmhhIGVtIHBsYXllcnMgdmlhIHNlcnZpY2Vfcm9sZS4KICAgbG9naW4gZW5jb250cmEgcGxheWVyIHBvciBDUEYuIEVtIGFtYm9zIG9zIGNhc29zIGEgRnVuY3Rpb24gZGV2b2x2ZQogICB7ZW1haWwsIG90cH0gcXVlIG8gZnJvbnQgY29uc29tZSBjb20gdmVyaWZ5T3RwIHAvIG1hdGVyaWFsaXphciBzZXNzw6NvLiAqLwphc3luYyBmdW5jdGlvbiBib2xhb0F1dGgocGF5bG9hZCl7CiAgaWYoIXN1cGEpe3JldHVybiB7b2s6ZmFsc2UsZXJyb3I6J0NvbmV4w6NvIGluZGlzcG9uw612ZWwnfTt9CiAgbGV0IHIsZGF0YTsKICB0cnl7CiAgICByPWF3YWl0IGZldGNoKEFVVEhfRk5fVVJMLHttZXRob2Q6J1BPU1QnLAogICAgICBoZWFkZXJzOnsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbicsJ2FwaWtleSc6U1VQQS5rZXksJ0F1dGhvcml6YXRpb24nOidCZWFyZXIgJytTVVBBLmtleX0sCiAgICAgIGJvZHk6SlNPTi5zdHJpbmdpZnkocGF5bG9hZCl9KTsKICB9Y2F0Y2goZSl7cmV0dXJuIHtvazpmYWxzZSxlcnJvcjonRmFsaGEgbmEgY29uZXjDo28uIFJlY2FycmVndWUgZSB0ZW50ZSBkZSBub3ZvLid9O30KICB0cnl7ZGF0YT1hd2FpdCByLmpzb24oKTt9Y2F0Y2goZSl7cmV0dXJuIHtvazpmYWxzZSxlcnJvcjonUmVzcG9zdGEgaW52w6FsaWRhIGRvIHNlcnZpZG9yLicsc3RhdHVzOnIuc3RhdHVzfTt9CiAgaWYoIXIub2t8fCFkYXRhLm9rKXtyZXR1cm4ge29rOmZhbHNlLGVycm9yOmRhdGEuZXJyb3J8fCgnSFRUUCAnK3Iuc3RhdHVzKSxzdGF0dXM6ci5zdGF0dXMsZXh0cmE6ZGF0YX07fQogIC8vIE1hdGVyaWFsaXphIHNlc3PDo28gdmlhIHZlcmlmeU90cCAodHlwZTonbWFnaWNsaW5rJyBiYXRlIGNvbSBnZW5lcmF0ZV9saW5rL21hZ2ljbGluayBubyBzZXJ2ZXIpCiAgY29uc3Qge2RhdGE6dmQsZXJyb3I6dkVycn09YXdhaXQgc3VwYS5hdXRoLnZlcmlmeU90cCh7ZW1haWw6ZGF0YS5lbWFpbCx0b2tlbjpkYXRhLm90cCx0eXBlOidtYWdpY2xpbmsnfSk7CiAgaWYodkVycil7cmV0dXJuIHtvazpmYWxzZSxlcnJvcjonU2Vzc8OjbyBuw6NvIHDDtGRlIHNlciBhYmVydGE6ICcrdkVyci5tZXNzYWdlLHN0YXR1czo1MDB9O30KICBjb25zdCB1c2VyPSh2ZCYmdmQudXNlcil8fGF3YWl0IGN1cnJlbnRVc2VyKCk7CiAgaWYoIXVzZXIpcmV0dXJuIHtvazpmYWxzZSxlcnJvcjonU2Vzc8OjbyBuw6NvIG1hdGVyaWFsaXphZGEnLHN0YXR1czo1MDB9OwogIGF3YWl0IGxvYWRNZSh1c2VyKTsKICByZXR1cm4ge29rOnRydWUsdXNlcixub21lOmRhdGEubm9tZX07Cn0KCi8qIC0tLSBBQ0VTU0FSIChlbnRyYSBzw7MgY29tIENQRikgLS0tICovCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2Vzc2Zvcm0nKSkKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjZXNzZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsYXN5bmMoZSk9PntlLnByZXZlbnREZWZhdWx0KCk7CiAgY29uc3QgaW5wPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX2FjZXNzX2NwZicpOwogIGNvbnN0IGNwZlJhdz0oaW5wLnZhbHVlfHwnJykudHJpbSgpOwogIGlmKCF2YWxpZENQRihjcGZSYXcpKXtpbnAuY2xhc3NMaXN0LmFkZCgnZXJyJyk7dG9hc3QoJ0NQRiBpbnbDoWxpZG8uIENvbmZpcmEgb3MgbsO6bWVyb3MuJyk7cmV0dXJuO30KICBpbnAuY2xhc3NMaXN0LnJlbW92ZSgnZXJyJyk7CiAgY29uc3QgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2Vzc2J0bicpO2J0bi5kaXNhYmxlZD10cnVlOwogIGxvZ2luT25seT10cnVlOwogIGNvbnN0IHI9YXdhaXQgYm9sYW9BdXRoKHthY3Rpb246J2xvZ2luJyxjcGY6Y3BmUmF3fSk7CiAgYnRuLmRpc2FibGVkPWZhbHNlOwogIGlmKCFyLm9rKXsKICAgIGlmKHIuc3RhdHVzPT09NDA0KXsKICAgICAgdG9hc3QoJ0NQRiBuw6NvIGVuY29udHJhZG8uIEZhw6dhIHN1YSBpbnNjcmnDp8OjbyBhZ29yYS4nKTsKICAgICAgc2V0VGltZW91dCgoKT0+X2dvdG9DYWRhc3RybygpLDExMDApOwogICAgICBsb2dpbk9ubHk9ZmFsc2U7cmV0dXJuOwogICAgfQogICAgdG9hc3Qoci5lcnJvcnx8J07Do28gZm9pIHBvc3PDrXZlbCBlbnRyYXIuJyk7CiAgICBsb2dpbk9ubHk9ZmFsc2U7cmV0dXJuOwogIH0KICBjb25zdCBmaXJzdD0obWVEYXRhJiZtZURhdGEubm9tZXx8ci5ub21lfHwnYWx1bm8nKS5zcGxpdCgnICcpWzBdOwogIHRvYXN0KCdCZW0tdmluZG8gZGUgdm9sdGEsICcrZmlyc3QrJyEg8J+miScpOwogIGxvZ2luT25seT1mYWxzZTsKICBfZ290b0FsdW5vKCk7Cn0pOwpjb25zdCBfYWNlc3NDcGZJbnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZfYWNlc3NfY3BmJyk7CmlmKF9hY2Vzc0NwZklucCl7CiAgX2FjZXNzQ3BmSW5wLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e19hY2Vzc0NwZklucC52YWx1ZT1tYXNrQ1BGKF9hY2Vzc0NwZklucC52YWx1ZSk7X2FjZXNzQ3BmSW5wLmNsYXNzTGlzdC5yZW1vdmUoJ2VycicpO30pOwp9CgovKiAtLS0gTGlzdGFzIGRlIGVzY29sYS9jdXJzbyBwb3IgdmVydGljYWwgLS0tICovCmNvbnN0IFNDSE9PTFNfTUlMPVsnSU1FIC8gSVRBJywnQUZBJywnRUZPTU0nLCdFc2NvbGEgTmF2YWwnLCdFc1BDRXgnLCdDRk8gQ0JNRVJKJywnRVNBJywnRUVBUicsJ0NvbMOpZ2lvIE5hdmFsJywnRVBDQVInLCdDb2zDqWdpbyBNaWxpdGFyICgxwrogYW5vKScsJ0NvbMOpZ2lvIE1pbGl0YXIgKDbCuiBhbm8pJywnRUFNJywnRnV6aWxlaXJvIE5hdmFsJywnUU9BTScsJ1NNVicsJ091dHJhIEluc3RpdHVpw6fDo28nLCdTw7MgdmltIHBlbG8gYm9sw6NvJ107CmNvbnN0IFNDSE9PTFNfRVY9WydNZWRpY2luYScsJ0RpcmVpdG8nLCdFbmdlbmhhcmlhJywnUHNpY29sb2dpYScsJ0FkbWluaXN0cmHDp8OjbycsJ0Npw6puY2lhIGRhIENvbXB1dGHDp8OjbycsJ0Zhcm3DoWNpYScsJ0VuZmVybWFnZW0nLCdNZWRpY2luYSBWZXRlcmluw6FyaWEnLCdFZHVjYcOnw6NvIEbDrXNpY2EnLCdQZWRhZ29naWEnLCdMZXRyYXMnLCdCaW9sb2dpYScsJ091dHJvIEN1cnNvJywnU8OzIHZpbSBwZWxvIGJvbMOjbyddOwpjb25zdCBOT05fU1RVREVOVF9DT05DVVJTTz0nU8OzIHZpbSBwZWxvIGJvbMOjbyc7CgovKiAtLS0gVXNlcm5hbWUgaGVscGVycyAoYXV0by1zdWdlc3TDo28gKyB2YWxpZGHDp8OjbyArIGRpc3BsYXkgcMO6YmxpY28pIC0tLSAqLwpjb25zdCBVU0VSTkFNRV9SWD0vXlthLXowLTkuX117MywxNX0kLzsKLyogUDItNDogVVNFUk5BTUVfQkFEIGVtIDQgY2F0ZWdvcmlhcyBjb20gbm9ybWFsaXphw6fDo28gKGwzM3QgKyBzZXBhcmFkb3JlcyArIHJlcGV0acOnw7VlcyAzKykuCiAgIFNpbmNyb25pemFkYSBjb20gVVNFUk5BTUVfUFJPRkFOSVRZL1JFU0VSVkVEL0NPTVBFVElUT1JTIGVtIHN1cGFiYXNlL2Z1bmN0aW9ucy9ib2xhby1hdXRoL2luZGV4LnRzLgogICBRdWFscXVlciBhbHRlcmHDp8OjbyBwcmVjaXNhIHNlciBmZWl0YSBub3MgZG9pcyBsYWRvcy4gKi8KY29uc3QgVVNFUk5BTUVfUFJPRkFOSVRZPVsKICAnY2FyYWxobycsJ3BvcnJhJywnbWVyZGEnLCdmb2RhJywnZm9kZXInLCd2aWFkbycsJ3ZpYWRpbmhvJywnY3UnLCdidWNldGEnLCdmZHAnLCdjdXphbycsJ3JvbGEnLAogICdwaW50bycsJ3BlbmlzJywndmFnaW5hJywneG90YScsJ3hveG90YScsJ3BhdScsJ3JhcGFyaWdhJywncHV0YScsJ3BpcmFuaGEnLCd2YWRpYScsCiAgJ2Z1Y2snLCdzaGl0JywnYXNzaG9sZScsJ2JpdGNoJywnZGljaycsJ2NvY2snLCdjdW50JywncHVzc3knLCdzbHV0Jywnd2hvcmUnLCduaWdnZXInLCduaWdnYScsJ2ZhZycsCiAgJ25hemknLCdoaXRsZXInLCdpc2lzJywna2trJywnc3dhc3Rpa2EnLAogICdpZGlvdGEnLCdpbWJlY2lsJywncmV0YXJkYWRvJywncmV0YXJkJywnbm9vYicsCl07CmNvbnN0IFVTRVJOQU1FX1JFU0VSVkVEPVsKICAnYWRtaW4nLCdyb290Jywnc3Vwb3J0ZScsJ2VzdHJhdGVnaWEnLCdjb3J1amEnLCdib2xhbycsJ2FsdW5vJywncHJvZmVzc29yJywnc3RhZmYnLCdtb2QnLAogICd0ZXN0JywndGVzdGUnLCdvZmljaWFsJywnb2ZmaWNpYWwnLCdzeXNhZG1pbicsJ3N1cGVydXNlcicsJ21vZGVyYXRvcicsJ2F0ZW5kaW1lbnRvJywKICAnYWp1ZGEnLCdzdXBwb3J0JywnaGVscCcsJ3Npc3RlbWEnLCdzeXN0ZW0nLApdOwpjb25zdCBVU0VSTkFNRV9DT01QRVRJVE9SUz1bCiAgJ2FsZmFjb24nLCdncmFuJywnZ3JhbmN1cnNvcycsJ2dyYW5jdXJzb3NvbmxpbmUnLCd2b2x0eicsJ3ZvbHR6Y3Vyc29zJywnZXVtaWxpdGFyJywKICAnZm9jb25vJywnZm9jb25vY29uY3Vyc28nLCdjcnV6ZWlybycsJ2N1cnNvY3J1emVpcm8nLCdhcHJvdmFjYW8nLAogICdmZW5peCcsJ2ZueCcsJ2VsaXRlbWlsJywnZWxpdGUnLCdtYXRyaXonLCdwcmF0aWNhbmRvJywncnVnbm8nLCdicnVnbm8nLCdmYXJpYXNicml0bycsJ2ZiJywndG0nLAogICd0ZWNjb25jdXJzb3MnLCdkaXJlY2FvJywnZGlyZWNhb2NvbmN1cnNvcycsJ3Fjb25jdXJzbycsJ3Fjb25jdXJzb3MnLCdjZWJyYXNwZScsCiAgJ2Rlc2NvbXBsaWNhJywnc3Rvb2RpJywncHJvZW5lbScsJ21lc2FsdmEnLCdrdWFkcm8nLCdrdWx0aXZpJywnZXhwbGljYWFlJywKICAnYW5nbG8nLCdldGFwYScsJ29iamV0aXZvJywncG9saWVkcm8nLCdjb2MnLCdiZXJub3VsbGknLCdhcmknLCdjcHYnLCdhcml1c3AnLApdOwpjb25zdCBVU0VSTkFNRV9CQUQ9Wy4uLlVTRVJOQU1FX1BST0ZBTklUWSwuLi5VU0VSTkFNRV9SRVNFUlZFRCwuLi5VU0VSTkFNRV9DT01QRVRJVE9SU107CmZ1bmN0aW9uIF9ub3JtYWxpemVVc2VybmFtZSh1KXsKICByZXR1cm4gKHV8fCcnKS50b0xvd2VyQ2FzZSgpCiAgICAucmVwbGFjZSgvWy5fXS9nLCcnKQogICAgLnJlcGxhY2UoLzAvZywnbycpLnJlcGxhY2UoLzEvZywnaScpLnJlcGxhY2UoLzMvZywnZScpLnJlcGxhY2UoLzQvZywnYScpCiAgICAucmVwbGFjZSgvNS9nLCdzJykucmVwbGFjZSgvNy9nLCd0JykucmVwbGFjZSgvOC9nLCdiJykucmVwbGFjZSgvOS9nLCdnJykKICAgIC5yZXBsYWNlKC9AL2csJ2EnKS5yZXBsYWNlKC9cJC9nLCdzJykKICAgIC5yZXBsYWNlKC8oLilcMXsyLH0vZywnJDEnKTsKfQpmdW5jdGlvbiBfc2x1Z2lmeU5hbWUobm9tZSl7cmV0dXJuIChub21lfHwnJykudG9Mb3dlckNhc2UoKS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCcnKS5yZXBsYWNlKC9bXmEtejAtOSBdL2csJycpLnRyaW0oKS5zcGxpdCgvXHMrLyk7fQpmdW5jdGlvbiBzdWdnZXN0VXNlcm5hbWUobm9tZSl7CiAgY29uc3QgcGFydHM9X3NsdWdpZnlOYW1lKG5vbWUpLmZpbHRlcihCb29sZWFuKTsKICBpZighcGFydHMubGVuZ3RoKXJldHVybiAnJzsKICBjb25zdCBmaXJzdD1wYXJ0c1swXSwgbGFzdD1wYXJ0cy5sZW5ndGg+MT9wYXJ0c1twYXJ0cy5sZW5ndGgtMV06Jyc7CiAgY29uc3QgY2FuZGlkYXRlcz1bXTsKICBpZihsYXN0KSBjYW5kaWRhdGVzLnB1c2goYCR7Zmlyc3R9LiR7bGFzdFswXX1gLCBgJHtmaXJzdH0uJHtsYXN0fWAuc2xpY2UoMCwxNSkpOwogIGNhbmRpZGF0ZXMucHVzaChmaXJzdCwgYCR7Zmlyc3R9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqOTAwKzEwMCl9YCk7CiAgZm9yKGNvbnN0IGMgb2YgY2FuZGlkYXRlcyl7IGlmKFVTRVJOQU1FX1JYLnRlc3QoYykpIHJldHVybiBjOyB9CiAgcmV0dXJuIGZpcnN0LnNsaWNlKDAsMTUpfHwnJzsKfQpmdW5jdGlvbiB2YWxpZGF0ZVVzZXJuYW1lKHUpewogIGlmKCF1KSByZXR1cm4ge29rOmZhbHNlLG1zZzonSW5mb3JtZSB1bSBhcGVsaWRvJ307CiAgaWYoIVVTRVJOQU1FX1JYLnRlc3QodSkpIHJldHVybiB7b2s6ZmFsc2UsbXNnOiczIGEgMTUgY2hhcnM6IGEteiwgMC05LCAuIG91IF8nfTsKICBjb25zdCBsb3c9dS50b0xvd2VyQ2FzZSgpLG5vcm09X25vcm1hbGl6ZVVzZXJuYW1lKHUpOwogIGlmKFVTRVJOQU1FX0JBRC5zb21lKHc9Pmxvdy5pbmNsdWRlcyh3KXx8bm9ybS5pbmNsdWRlcyh3KSkpIHJldHVybiB7b2s6ZmFsc2UsbXNnOidBcGVsaWRvIG7Do28gcGVybWl0aWRvJ307CiAgcmV0dXJuIHtvazp0cnVlfTsKfQphc3luYyBmdW5jdGlvbiBpc1VzZXJuYW1lQXZhaWxhYmxlKHUpewogIGlmKCFzdXBhKSByZXR1cm4gdHJ1ZTsgLy8gc2VtIHN1cGEgbsOjbyBjaGVjYQogIHRyeXsKICAgIGNvbnN0IHtkYXRhLGVycm9yfT1hd2FpdCBzdXBhLnJwYygnY2hlY2tfdXNlcm5hbWUnLHt1X2luOnV9KTsKICAgIGlmKGVycm9yKSByZXR1cm4gdHJ1ZTsgLy8gZmFsaGEg4oCUIGJhY2tlbmQgdmFsaWRhIG5vIHNpZ251cAogICAgcmV0dXJuICFkYXRhOwogIH1jYXRjaChlKXtyZXR1cm4gdHJ1ZTt9Cn0KZnVuY3Rpb24gX3B1YmxpY0hhbmRsZShwKXsKICBpZighcCkgcmV0dXJuICdhbHVubyc7CiAgaWYocC51c2VybmFtZSkgcmV0dXJuICdAJytwLnVzZXJuYW1lOwogIC8vIGZhbGxiYWNrIHAvIHBsYXllcnMgYW50aWdvcyBzZW0gdXNlcm5hbWU6IHByaW1laXJvIG5vbWUgKyBpbmljaWFsIHNvYnJlbm9tZQogIGNvbnN0IHBhcnRzPShwLm5vbWV8fCdhbHVubycpLnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik7CiAgaWYocGFydHMubGVuZ3RoPj0yKSByZXR1cm4gYCR7cGFydHNbMF19ICR7cGFydHNbcGFydHMubGVuZ3RoLTFdWzBdfS5gOwogIHJldHVybiBwYXJ0c1swXXx8J2FsdW5vJzsKfQpmdW5jdGlvbiBfcG9wdWxhdGVDb25jU2VsZWN0KHZlcnQpewogIGNvbnN0IHNlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9jb25jJyk7aWYoIXNlbClyZXR1cm47CiAgY29uc3Qgd3JhcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uY3dyYXAnKTsKICBjb25zdCBsYWJlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uY2xhYmVsJyk7CiAgaWYoIXZlcnQpe3NlbC5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+U2VsZWNpb25lIHByaW1laXJvIG8gb2JqZXRpdm8gYWNpbWHigKY8L29wdGlvbj4nO3NlbC5kaXNhYmxlZD10cnVlO2lmKHdyYXApd3JhcC5zdHlsZS5kaXNwbGF5PSdub25lJztyZXR1cm47fQogIGNvbnN0IGxpc3QgPSB2ZXJ0PT09J3Zlc3RpYnVsYXJlcycgPyBTQ0hPT0xTX0VWIDogU0NIT09MU19NSUw7CiAgaWYobGFiZWwpIGxhYmVsLnRleHRDb250ZW50ID0gdmVydD09PSd2ZXN0aWJ1bGFyZXMnID8gJ1F1YWwgc2V1IG9iamV0aXZvIGRlIGN1cnNvPycgOiAnUXVhbCBjb25jdXJzbyB2b2PDqiBlc3TDoSBlc3R1ZGFuZG8\/JzsKICBzZWwuaW5uZXJIVE1MPSc8b3B0aW9uIHZhbHVlPSIiPlNlbGVjaW9uZeKApjwvb3B0aW9uPicrbGlzdC5tYXAocz0+YDxvcHRpb24+JHtzfTwvb3B0aW9uPmApLmpvaW4oJycpOwogIHNlbC5kaXNhYmxlZD1mYWxzZTsKICBpZih3cmFwKXdyYXAuc3R5bGUuZGlzcGxheT0nJzsKfQppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl92ZXJ0aWNhbCcpKXsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl92ZXJ0aWNhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKGUpPT57CiAgICBfcG9wdWxhdGVDb25jU2VsZWN0KGUudGFyZ2V0LnZhbHVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX2NvbmMnKT8uY2xhc3NMaXN0LnJlbW92ZSgnZXJyJyk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl92ZXJ0aWNhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2VycicpOwogIH0pOwp9Ci8qIEF1dG8tc3VnZXJlIHVzZXJuYW1lIHF1YW5kbyBub21lIHBlcmRlIGZvY28gZSBvIGNhbXBvIHVzZXJuYW1lIGFpbmRhIGVzdMOhIHZhemlvICovCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX25vbWUnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VybmFtZScpKXsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9ub21lJykuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsKCk9PnsKICAgIGNvbnN0IHVpbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VybmFtZScpOwogICAgaWYodWluICYmICF1aW4udmFsdWUudHJpbSgpKXsKICAgICAgY29uc3Qgc3VnPXN1Z2dlc3RVc2VybmFtZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9ub21lJykudmFsdWUpOwogICAgICBpZihzdWcpeyB1aW4udmFsdWU9c3VnOyB1aW4uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JykpOyB9CiAgICB9CiAgfSk7Cn0KLyogVmFsaWRhw6fDo28gKyBjaGVjayBkaXNwb25pYmlsaWRhZGUgYW8gZGlnaXRhciAoZGVib3VuY2UgNDAwbXMpICovCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX3VzZXJuYW1lJykpewogIGNvbnN0IHVpbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VybmFtZScpOwogIGNvbnN0IHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1X3N0YXR1cycpOwogIGxldCBfdXRpbWVyPW51bGw7CiAgdWluLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+ewogICAgdWluLnZhbHVlPXVpbi52YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05Ll9dL2csJycpLnNsaWNlKDAsMTUpOwogICAgdWluLmNsYXNzTGlzdC5yZW1vdmUoJ2VycicpOwogICAgaWYoc3Qpe3N0LnRleHRDb250ZW50PScnO3N0LnN0eWxlLmNvbG9yPScnO30KICAgIGNsZWFyVGltZW91dChfdXRpbWVyKTsKICAgIGNvbnN0IHY9dWluLnZhbHVlOwogICAgY29uc3Qgcj12YWxpZGF0ZVVzZXJuYW1lKHYpOwogICAgaWYoIXIub2spewogICAgICBpZihzdCAmJiB2KXtzdC50ZXh0Q29udGVudD0n4pyXICcrci5tc2c7c3Quc3R5bGUuY29sb3I9J3ZhcigtLXJlZCknO30KICAgICAgcmV0dXJuOwogICAgfQogICAgX3V0aW1lcj1zZXRUaW1lb3V0KGFzeW5jKCk9PnsKICAgICAgY29uc3QgZnJlZT1hd2FpdCBpc1VzZXJuYW1lQXZhaWxhYmxlKHYpOwogICAgICBpZihzdCl7CiAgICAgICAgaWYoZnJlZSl7c3QudGV4dENvbnRlbnQ9J+KckyBkaXNwb27DrXZlbCc7c3Quc3R5bGUuY29sb3I9J3ZhcigtLWdyZWVuKSc7fQogICAgICAgIGVsc2V7c3QudGV4dENvbnRlbnQ9J+KclyBqw6EgZW0gdXNvJztzdC5zdHlsZS5jb2xvcj0ndmFyKC0tcmVkKSc7fQogICAgICB9CiAgICB9LDQwMCk7CiAgfSk7Cn0KCi8qIC0tLSBDQURBU1RSTyAoZW50cmEgZGlyZXRvLCBzZW0gT1RQKSAtLS0gKi8KaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2Zvcm0nKSkKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLGFzeW5jKGUpPT57ZS5wcmV2ZW50RGVmYXVsdCgpOwogIGxvZ2luT25seT1mYWxzZTsKICBjb25zdCBub21lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX25vbWUnKS52YWx1ZS50cmltKCksdWluPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX3VzZXJuYW1lJyk\/LnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpfHwnJyxlbWFpbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9lbWFpbCcpLnZhbHVlLnRyaW0oKSxlbWFpbDI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZfZW1haWwyJykudmFsdWUudHJpbSgpLHRlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl90ZWwnKS52YWx1ZS50cmltKCksY3BmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX2NwZicpLnZhbHVlLnRyaW0oKSx2ZXJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX3ZlcnRpY2FsJyk\/LnZhbHVlfHwnbWlsaXRhcmVzJyxjb25jPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX2NvbmMnKS52YWx1ZSxwZXJmaWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZfcGVyZmlsJyk\/LnZhbHVlfHwnJyxjMT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9jMScpLmNoZWNrZWQsYzI9dHJ1ZTsKICBsZXQgb2s9dHJ1ZTtjb25zdCBtYXJrPShpZCxiYWQpPT57Y29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKCFlbClyZXR1cm47ZWwuY2xhc3NMaXN0LnRvZ2dsZSgnZXJyJyxiYWQpO2lmKGJhZClvaz1mYWxzZTt9OwogIGNvbnN0IGNwZkJhZD0hdmFsaWRDUEYoY3BmKSxlbWFpbEJhZD0hL15bXkBcc10rQFteQFxzXStcLlteQFxzXSskLy50ZXN0KGVtYWlsKSxlbWFpbDJCYWQ9IWVtYWlsMnx8ZW1haWwyLnRvTG93ZXJDYXNlKCkhPT1lbWFpbC50b0xvd2VyQ2FzZSgpOwogIGNvbnN0IHVWYWw9dmFsaWRhdGVVc2VybmFtZSh1aW4pOwogIG1hcmsoJ2Zfbm9tZScsbm9tZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg8Mik7bWFyaygnZl91c2VybmFtZScsIXVWYWwub2spO21hcmsoJ2ZfY3BmJyxjcGZCYWQpO21hcmsoJ2ZfZW1haWwnLGVtYWlsQmFkKTttYXJrKCdmX2VtYWlsMicsZW1haWwyQmFkKTttYXJrKCdmX3RlbCcsdGVsLnJlcGxhY2UoL1xEL2csJycpLmxlbmd0aDwxMCk7bWFyaygnZl9wZXJmaWwnLCFwZXJmaWwpO21hcmsoJ2ZfdmVydGljYWwnLCF2ZXJ0KTttYXJrKCdmX2NvbmMnLCFjb25jKTsKICBpZighb2spe2NvbnN0IGZpcnN0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZWdmb3JtIC5lcnInKTtpZihmaXJzdCYmZmlyc3QuZm9jdXMpZmlyc3QuZm9jdXMoKTt0b2FzdChjcGZCYWQmJmNwZi5yZXBsYWNlKC9cRC9nLCcnKS5sZW5ndGg+PTExPydDUEYgaW52w6FsaWRvLCBjb25maXJhIG9zIG7Dum1lcm9zJzooZW1haWwyQmFkJiYhZW1haWxCYWQ\/J09zIGUtbWFpbHMgbsOjbyBjb25mZXJlbSc6KCF1VmFsLm9rP3VWYWwubXNnOidDb25maXJhIG9zIGNhbXBvcyBkZXN0YWNhZG9zJykpKTtyZXR1cm47fQogIGlmKCFjMSl7dG9hc3QoJ8OJIHByZWNpc28gYWNlaXRhciBvIHVzbyBkb3MgZGFkb3MnKTtyZXR1cm47fQogIC8vIFF1ZW0gZXNjb2xoZSAiU8OzIHZpbSBwZWxvIGJvbMOjbyIgbsOjbyDDqSBhbHVubyDigJQgZm9yw6dhIHBlcmZpbD1vdXRybyBpbmRlcGVuZGVudGUgZG8gcXVlIHNlbGVjaW9ub3UKICBjb25zdCBwZXJmaWxGaW5hbCA9IChjb25jPT09Tk9OX1NUVURFTlRfQ09OQ1VSU08pID8gJ291dHJvJyA6IHBlcmZpbDsKICAvLyAwMDIyOiBjYXB0dXJhIHV0bV8qIGRhIFVSTCBubyBtb21lbnRvIGRvIHN1Ym1pdCAoY29icmUgbyBjYXNvIGRlIG8gYWx1bm8gdGVyCiAgLy8gY2hlZ2FkbyB2aWEgY2FtcGFuaGEg4oCUIERFLVBBUkEgZG8gQ1JNIDIwMjYtMDYtMDggcGVkZSBlc3NlcyA1IGNhbXBvcyBubyBTRk1DKS4KICBjb25zdCBfdXRtPXt9OyB0cnl7Y29uc3QgcXM9bmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1sndXRtX3NvdXJjZScsJ3V0bV9tZWRpdW0nLCd1dG1fY2FtcGFpZ24nLCd1dG1fY29udGVudCcsJ3V0bV90ZXJtJ10uZm9yRWFjaChrPT57Y29uc3Qgdj1xcy5nZXQoayk7aWYodilfdXRtW2tdPXYuc2xpY2UoMCwyMDApO30pO31jYXRjaChfZSl7fQogIGNvbnN0IGJ0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnYnRuJyk7YnRuLmRpc2FibGVkPXRydWU7CiAgY29uc3Qgcj1hd2FpdCBib2xhb0F1dGgoT2JqZWN0LmFzc2lnbih7YWN0aW9uOidzaWdudXAnLG5vbWUsdXNlcm5hbWU6dWluLGNwZixlbWFpbCx0ZWxlZm9uZTp0ZWwsdmVydGljYWw6dmVydCxjb25jdXJzbzpjb25jLHBlcmZpbDpwZXJmaWxGaW5hbCxtYXJrZXRpbmc6YzIscmVmOnBlbmRpbmdSZWZ9LF91dG0pKTsKICBidG4uZGlzYWJsZWQ9ZmFsc2U7CiAgaWYoIXIub2spewogICAgaWYoci5zdGF0dXM9PT00MDkmJnIuZXJyb3I9PT0nQ1BGX1RBS0VOJyl7CiAgICAgIHRvYXN0KCdDUEYgasOhIGNhZGFzdHJhZG8uIFRlIGxldm8gcGFyYSBhIHRlbGEgZGUgQWNlc3Nhci4nKTsKICAgICAgc2V0VGltZW91dCgoKT0+X2dvdG9BY2Vzc2FyKCksMTEwMCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHIuc3RhdHVzPT09NDA5JiZyLmVycm9yPT09J0VNQUlMX1RBS0VOJyl7dG9hc3QoJ0Vzc2UgZS1tYWlsIGrDoSBlc3TDoSBlbSB1c28gcG9yIG91dHJhIGNvbnRhLicpO3JldHVybjt9CiAgICBpZihyLnN0YXR1cz09PTQwOSYmci5lcnJvcj09PSdVU0VSTkFNRV9UQUtFTicpe3RvYXN0KCdFc3NlIGFwZWxpZG8gasOhIGVzdMOhIGVtIHVzby4gRXNjb2xoYSBvdXRyby4nKTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VybmFtZScpPy5jbGFzc0xpc3QuYWRkKCdlcnInKTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VybmFtZScpPy5mb2N1cygpO3JldHVybjt9CiAgICB0b2FzdChyLmVycm9yfHwnRXJybyBubyBjYWRhc3Ryby4gVGVudGUgbm92YW1lbnRlLicpO3JldHVybjsKICB9CiAgdG9hc3QoJ0NvbnRhIGNyaWFkYSEgQm9hIHNvcnRlIGUgYm9ucyBwYWxwaXRlcyDwn6aJJyk7CiAgX2dvdG9BbHVubygpOwp9KTsKaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ291dGJ0bicpKQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nb3V0YnRuJykub25jbGljaz1hc3luYygpPT57CiAgaWYoc3VwYSlhd2FpdCBzdXBhLmF1dGguc2lnbk91dCgpO21lPW51bGw7bWVEYXRhPW51bGw7X3Jlc2V0QWRtaW5DYWNoZSgpOwogIGlmKF9pc0FsdW5vUGFnZSgpKXtfZ290b0hvbWUoKTtyZXR1cm47fQogIGNvbnN0IHZjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2ZXJpZnljYXJkJyk7aWYodmMpdmMuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgY29uc3QgcmM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2NhcmQnKTtpZihyYylyYy5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgY29uc3QgcGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsYXlhcmVhJyk7aWYocGEpcGEuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgcmVuZGVyUmFua2luZygpO3JlbmRlclNjaG9vbHMoKTtyZW5kZXJSZWZSYW5raW5nSG9tZSgpOwp9OwoKKGZ1bmN0aW9uKCl7Y29uc3QgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9jcGYnKTtpZihjKWMuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57Yy52YWx1ZT1tYXNrQ1BGKGMudmFsdWUpO2MuY2xhc3NMaXN0LnJlbW92ZSgnZXJyJyk7fSk7CiAgY29uc3Qgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9vdHAnKTtpZihvKW8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57by52YWx1ZT1vLnZhbHVlLnJlcGxhY2UoL1xEL2csJycpLnNsaWNlKDAsNik7by5jbGFzc0xpc3QucmVtb3ZlKCdlcnInKTt9KTsKICBjb25zdCBlMj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9lbWFpbDInKTtpZihlMillMi5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsKCk9PmUyLmNsYXNzTGlzdC5yZW1vdmUoJ2VycicpKTsKICBjb25zdCBlMT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9lbWFpbCcpO2lmKGUxKWUxLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+ZTEuY2xhc3NMaXN0LnJlbW92ZSgnZXJyJykpO30pKCk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgUEFMUElURVMgKG1hdGNoZXMgKyBwcmVkaWN0aW9ucykKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmZ1bmN0aW9uIHRlYW1IVE1MKHQpe3JldHVybiBgPGRpdiBjbGFzcz0idG0iPjxzcGFuIGNsYXNzPSJmZyI+JHtGW3RbMV1dfHwn4pq9J308L3NwYW4+PHNwYW4gY2xhc3M9Im5tIj4ke3RbMF19PC9zcGFuPjwvZGl2PmA7fQpmdW5jdGlvbiByZXN1bHRJbmZvKHNjLGJyYSl7aWYoIXNjKXJldHVybiBudWxsOwogIGlmKHNjLmV4YWN0KXJldHVybntjbHM6J2hpdC1leGFjdCcsbGFiZWw6J0NyYXZvdSBvIHBsYWNhciBleGF0byEnLGljOifwn46vJyxjb25mZXR0aTp0cnVlfTsKICBpZihzYy5wdHM9PT03KXJldHVybntjbHM6J2hpdC1nb29kJyxsYWJlbDonQWNlcnRvdSBvIHZlbmNlZG9yIGUgbyBzYWxkbycsaWM6J+Kckyd9OwogIGlmKHNjLnB0cz09PTUpcmV0dXJue2NsczonaGl0LW9rJyxsYWJlbDonQWNlcnRvdSBvIHJlc3VsdGFkbycsaWM6J+Kckyd9OwogIHJldHVybntjbHM6J21pc3MnLGxhYmVsOidOw6NvIHBvbnR1b3UgbmVzdGUgam9nbycsaWM6J+KclSd9O30KY29uc3QgX2NvbmZEb25lPW5ldyBTZXQoKTsKZnVuY3Rpb24gY29uZmV0dGlCdXJzdChlbCl7Y29uc3QgY29sb3JzPVsnI2UzYTUxZicsJyMwZThlNzAnLCcjMTNhNjg0JywnIzAwOWIzYScsJyNmZmRmMDAnLCcjZmZmZmZmJ107CiAgY29uc3QgbGF5ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7bGF5ZXIuY2xhc3NOYW1lPSdjb25mZXR0aSc7CiAgZm9yKGxldCBpPTA7aTwyODtpKyspe2NvbnN0IHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO3Auc3R5bGUubGVmdD0oNitNYXRoLnJhbmRvbSgpKjg4KSsnJSc7cC5zdHlsZS5iYWNrZ3JvdW5kPWNvbG9yc1tpJWNvbG9ycy5sZW5ndGhdO3Auc3R5bGUuYW5pbWF0aW9uRGVsYXk9KE1hdGgucmFuZG9tKCkqLjMpLnRvRml4ZWQoMikrJ3MnO3Auc3R5bGUuc2V0UHJvcGVydHkoJy0tZHgnLChNYXRoLnJhbmRvbSgpKjYwLTMwKS50b0ZpeGVkKDApKydweCcpO2xheWVyLmFwcGVuZENoaWxkKHApO30KICBlbC5hcHBlbmRDaGlsZChsYXllcik7c2V0VGltZW91dCgoKT0+bGF5ZXIucmVtb3ZlKCksMjQwMCk7fQpmdW5jdGlvbiByZW5kZXJNYXRjaGVzKCl7aWYoIW1lRGF0YSlyZXR1cm47Y29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXRjaGVzJyk7aWYoIWJveClyZXR1cm47Ym94LmlubmVySFRNTD0nJzsKICBjZmcubWF0Y2hlcy5mb3JFYWNoKG09Pntjb25zdCBjbG9zZWQ9aXNDbG9zZWQobSkscmVzPWNmZy5yZXN1bHRzW20uaWRdLHByZWQ9bWVEYXRhLnByZWRpY3Rpb25zW20uaWRdO2NvbnN0IGhhc1Jlcz1yZXMmJnJlcy5oIT1udWxsJiZyZXMuYSE9bnVsbCxzYz1oYXNSZXM\/cG9pbnRzRm9yKHByZWQscmVzLG0uZnIpOm51bGw7Y29uc3QgaW5mbz1yZXN1bHRJbmZvKHNjLG0uZnIpOwogICAgY29uc3QgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7ZWwuY2xhc3NOYW1lPSdtYXRjaCcrKGluZm8mJmluZm8uY2xzPT09J2hpdC1leGFjdCc\/JyB3aW4nOicnKTsKICAgIGNvbnN0IHNhdmVDbHMgPSBwcmVkID8gJ2J0biBwcmltYXJ5IHNhdmUtZ2FtZSB1cGRhdGUtbW9kZScgOiAnYnRuIGdvbGQgc2F2ZS1nYW1lJzsKICAgIGNvbnN0IHNhdmVCbG9jayA9IGNsb3NlZCA\/ICcnIDogYDxkaXYgY2xhc3M9InNhdmV3cmFwIj48YnV0dG9uIGNsYXNzPSIke3NhdmVDbHN9IiBkYXRhLXNhdmU9IiR7bS5pZH0iIHR5cGU9ImJ1dHRvbiI+JHtwcmVkPydBdHVhbGl6YXIgcGFscGl0ZSc6J1NhbHZhciBwYWxwaXRlJ308L2J1dHRvbj48L2Rpdj5gOwogICAgY29uc3QgYmV0QmxvY2sgPSBwcmVkID8gYDxkaXYgY2xhc3M9ImJldGxuIj5TZXUgcGFscGl0ZTogPGI+JHtwcmVkLmh9w5cke3ByZWQuYX08L2I+JHtwcmVkLnRzP2AgwrcgZW52aWFkbyBlbSAke2ZtdEJldChwcmVkLnRzKX1gOicnfTwvZGl2PmAgOiAoY2xvc2VkP2A8ZGl2IGNsYXNzPSJiZXRsbiBtdXRlZCI+Vm9jw6ogbsOjbyBwYWxwaXRvdSBuZXN0ZSBqb2dvLjwvZGl2PmA6JycpOwogICAgLy8gMjAyNi0wNi0wNSBmaXg6IHF1YW5kbyBvIGpvZ28gdGVtIHBsYWNhciBvZmljaWFsIG1hcyBvIGFsdW5vIG7Do28gcGFscGl0b3UKICAgIC8vIChwcmVkPXVuZGVmaW5lZCksIHBvaW50c0ZvciByZXRvcm5hIG51bGwg4oaSIGluZm89bnVsbCDihpIgaW5mby5jbHMgY3Jhc2hhdmEKICAgIC8vIHRvZGEgYSByZW5kZXJpemHDp8Ojby4gRGVmZXNhOiBtb3N0cmEgbyBwbGFjYXIgb2ZpY2lhbCBzZW0gbyBjYXJkIGRlIHBvbnRvcy4KICAgIGNvbnN0IHJlc0Jsb2NrID0gaGFzUmVzCiAgICAgID8gKGluZm8gJiYgc2MKICAgICAgICAgID8gYDxkaXYgY2xhc3M9InJlc2NhcmQgJHtpbmZvLmNsc30iPgogICAgICAgIDxkaXYgY2xhc3M9InJlc29mZmljaWFsIj5SZXN1bHRhZG8gb2ZpY2lhbCDCtyA8Yj4ke20uaFswXX0gJHtyZXMuaH3DlyR7cmVzLmF9ICR7bS5hWzBdfTwvYj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyZXNyb3ciPjxzcGFuIGNsYXNzPSJyZXNsYWJlbCI+PHNwYW4gY2xhc3M9InJlc2ljIj4ke2luZm8uaWN9PC9zcGFuPiR7aW5mby5sYWJlbH08L3NwYW4+PHNwYW4gY2xhc3M9InJlc3B0cyI+KyR7c2MucHRzfTxzbWFsbD5wdHM8L3NtYWxsPjwvc3Bhbj48L2Rpdj4KICAgICAgICAke20uZnImJnNjLmV4YWN0Pyc8ZGl2IGNsYXNzPSJyZXNkYmwiPuKaoSBCw7RudXMgZGEgcmV0YSBmaW5hbDogcGxhY2FyIGNyYXZhZG8gdmFsZSAyMCBwb250b3M8L2Rpdj4nOicnfQogICAgICA8L2Rpdj5gCiAgICAgICAgICA6IGA8ZGl2IGNsYXNzPSJyZXNjYXJkIG1pc3MiPgogICAgICAgIDxkaXYgY2xhc3M9InJlc29mZmljaWFsIj5SZXN1bHRhZG8gb2ZpY2lhbCDCtyA8Yj4ke20uaFswXX0gJHtyZXMuaH3DlyR7cmVzLmF9ICR7bS5hWzBdfTwvYj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyZXNyb3ciPjxzcGFuIGNsYXNzPSJyZXNsYWJlbCI+Vm9jw6ogbsOjbyBwYWxwaXRvdTwvc3Bhbj48c3BhbiBjbGFzcz0icmVzcHRzIj4wPHNtYWxsPnB0czwvc21hbGw+PC9zcGFuPjwvZGl2PgogICAgICA8L2Rpdj5gKQogICAgICA6ICcnOwogICAgZWwuaW5uZXJIVE1MPWA8c3BhbiBjbGFzcz0iYWNjZW50IiBzdHlsZT0iYmFja2dyb3VuZDoke0NPTE9SW20uc2VsXX0iPjwvc3Bhbj48ZGl2IGNsYXNzPSJtZXRhIj48c3Bhbj4ke20uc2VsfSDigKIgJHtmbXREYXRlKG0uayl9PC9zcGFuPjxzcGFuIHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjVweCI+JHttLmZyPyc8c3BhbiBjbGFzcz0iYmRnIGRibCI+MsOXPC9zcGFuPic6Jyd9PHNwYW4gY2xhc3M9ImJkZyAke2Nsb3NlZD8nc2h1dCc6J29wZW4nfSI+JHtjbG9zZWQ\/J0ZlY2hhZG8nOidBYmVydG8nfTwvc3Bhbj48L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRlYW1zIj4ke3RlYW1IVE1MKG0uaCl9PGRpdiBjbGFzcz0ic2MiPjxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSIyMCIgc3RlcD0iMSIgaW5wdXRtb2RlPSJudW1lcmljIiBhcmlhLWxhYmVsPSJHb2xzICR7ZXNjKG0uaFswXSl9IiBkYXRhLW09IiR7bS5pZH0iIGRhdGEtcz0iaCIgdmFsdWU9IiR7cHJlZD9wcmVkLmg6Jyd9IiAke2Nsb3NlZD8nZGlzYWJsZWQnOicnfT48c3BhbiBjbGFzcz0ieCI+w5c8L3NwYW4+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjIwIiBzdGVwPSIxIiBpbnB1dG1vZGU9Im51bWVyaWMiIGFyaWEtbGFiZWw9IkdvbHMgJHtlc2MobS5hWzBdKX0iIGRhdGEtbT0iJHttLmlkfSIgZGF0YS1zPSJhIiB2YWx1ZT0iJHtwcmVkP3ByZWQuYTonJ30iICR7Y2xvc2VkPydkaXNhYmxlZCc6Jyd9PjwvZGl2PiR7dGVhbUhUTUwobS5hKX08L2Rpdj4KICAgICAgJHtzYXZlQmxvY2t9JHtiZXRCbG9ja30ke3Jlc0Jsb2NrfWA7CiAgICBib3guYXBwZW5kQ2hpbGQoZWwpOwogICAgaWYoaW5mbyYmaW5mby5jb25mZXR0aSYmIV9jb25mRG9uZS5oYXMobS5pZCkpe19jb25mRG9uZS5hZGQobS5pZCk7c2V0VGltZW91dCgoKT0+Y29uZmV0dGlCdXJzdChlbCksMTQwKTt9fSk7CiAgLy8gQm90w6NvIGdsb2JhbCBlc2NvbmRpZG8gKGF1dG8tc2F2ZSBpbmRpdmlkdWFsIHBvciBqb2dvIGNvYnJlIHR1ZG8pCiAgY29uc3Qgc2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmVidG4nKTtpZihzYilzYi5zdHlsZS5kaXNwbGF5PSdub25lJzsKICBjb25zdCBhbnlPcGVuPWNmZy5tYXRjaGVzLnNvbWUobT0+IWlzQ2xvc2VkKG0pKTsKICBjb25zdCBzaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZWhpbnQnKTsKICBpZihzaClzaC5pbm5lckhUTUw9YW55T3Blbj8nQ2FkYSBwYWxwaXRlIMOpIDxiPnNhbHZvIGluZGl2aWR1YWxtZW50ZTwvYj46IHByZWVuY2hhIG9zIGRvaXMgcGxhY2FyZXMgZSBjbGlxdWUgZW0gPGI+U2FsdmFyIHBhbHBpdGU8L2I+IG5vIGNhcmQuIFZvY8OqIHBvZGUgZWRpdGFyIGF0w6kgbyBhcGl0byBpbmljaWFsLiA8Yj5DcmF2YXIgbm9zIGpvZ29zIGRhIHJldGEgZmluYWwgKDI0IGEgMjcvMDYpIHZhbGUgMjAgcG9udG9zPC9iPiDimqEnOidUb2RvcyBvcyBqb2dvcyBqw6EgZmVjaGFyYW0uIEFjb21wYW5oZSBzdWEgcG9udHVhw6fDo28gYWNpbWEgZSBvIFJhbmtpbmcuJzsKfQoKLyogLS0tIFNhdmUgcG9yIGpvZ286IDEgYm90w6NvIHBvciBjYXJkLCAxIHJvdW5kLXRyaXAgcG9yIHNhdmUgLS0tICovCmFzeW5jIGZ1bmN0aW9uIHNhdmVNYXRjaElubGluZShtYXRjaElkLCBidG4pewogIGlmKCFzdXBhfHwhbWV8fCFtZURhdGEpcmV0dXJuOwogIGNvbnN0IG09Y2ZnLm1hdGNoZXMuZmluZCh4PT54LmlkPT09bWF0Y2hJZCk7aWYoIW0pcmV0dXJuOwogIGlmKGlzQ2xvc2VkKG0pKXt0b2FzdCgnSm9nbyBqw6EgZmVjaGFkby4gUGFscGl0ZSB0cmF2YWRvLicpO3JldHVybjt9CiAgY29uc3QgaElucD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWF0Y2hlcyBpbnB1dFtkYXRhLW09IicrbWF0Y2hJZCsnIl1bZGF0YS1zPSJoIl0nKTsKICBjb25zdCBhSW5wPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYXRjaGVzIGlucHV0W2RhdGEtbT0iJyttYXRjaElkKyciXVtkYXRhLXM9ImEiXScpOwogIGlmKCFoSW5wfHwhYUlucClyZXR1cm47CiAgY29uc3QgaHY9aElucC52YWx1ZSxhdj1hSW5wLnZhbHVlOwogIGNvbnN0IGhFbXB0eT0oaHY9PW51bGx8fGh2PT09JycpLGFFbXB0eT0oYXY9PW51bGx8fGF2PT09JycpOwoKICAvLyBTZW0gcGxhY2FyOiBzZSBqw6EgaGF2aWEgcGFscGl0ZSwgb2ZlcmVjZSBhcGFnYXIKICBpZihoRW1wdHkmJmFFbXB0eSl7CiAgICBpZighbWVEYXRhLnByZWRpY3Rpb25zW21hdGNoSWRdKXt0b2FzdCgnUHJlZW5jaGEgb3MgZG9pcyBwbGFjYXJlcyBwYXJhIHNhbHZhci4nKTtyZXR1cm47fQogICAgaWYoIWNvbmZpcm0oJ0FwYWdhciBvIHNldSBwYWxwaXRlIGF0dWFsIHBhcmEgZXN0ZSBqb2dvPycpKXJldHVybjsKICAgIGlmKGJ0bil7YnRuLl9vbGRUZXh0PWJ0bi50ZXh0Q29udGVudDtidG4uZGlzYWJsZWQ9dHJ1ZTtidG4udGV4dENvbnRlbnQ9J0FwYWdhbmRv4oCmJzt9CiAgICBjb25zdCB7ZXJyb3J9PWF3YWl0IHN1cGEuZnJvbSgncHJlZGljdGlvbnMnKS5kZWxldGUoKS5lcSgncGxheWVyX2lkJyxtZS5pZCkuZXEoJ21hdGNoX2lkJyxtYXRjaElkKTsKICAgIGlmKGVycm9yKXtpZihidG4pe2J0bi5kaXNhYmxlZD1mYWxzZTtidG4udGV4dENvbnRlbnQ9J0Vycm8gwrcgVGVudGFyIGRlIG5vdm8nO3NldFRpbWVvdXQoKCk9PntidG4udGV4dENvbnRlbnQ9YnRuLl9vbGRUZXh0fHwnU2FsdmFyIHBhbHBpdGUnO30sMjQwMCk7fXRvYXN0KCdOw6NvIGZvaSBwb3Nzw612ZWwgYXBhZ2FyLicpO3JldHVybjt9CiAgICBhd2FpdCByZWxvYWRNeVByZWRzKCk7CiAgICB0b2FzdCgnUGFscGl0ZSByZW1vdmlkby4nKTsKICAgIG9uUHJlZGljdGlvbnNDaGFuZ2VkKCk7CiAgICByZW5kZXJNYXRjaGVzKCk7cmV0dXJuOwogIH0KCiAgaWYoaEVtcHR5fHxhRW1wdHkpe3RvYXN0KCdQcmVlbmNoYSBvcyBkb2lzIHBsYWNhcmVzIHBhcmEgc2FsdmFyLicpO3JldHVybjt9CgogIGlmKGJ0bil7YnRuLl9vbGRUZXh0PWJ0bi50ZXh0Q29udGVudDtidG4uZGlzYWJsZWQ9dHJ1ZTtidG4udGV4dENvbnRlbnQ9J1NhbHZhbmRv4oCmJzt9CiAgY29uc3Qgcm93PXsKICAgIHBsYXllcl9pZDptZS5pZCwKICAgIG1hdGNoX2lkOm1hdGNoSWQsCiAgICBob21lX2dvYWxzOk1hdGgubWF4KDAsTWF0aC5taW4oMjAscGFyc2VJbnQoaHYpfHwwKSksCiAgICBhd2F5X2dvYWxzOk1hdGgubWF4KDAsTWF0aC5taW4oMjAscGFyc2VJbnQoYXYpfHwwKSkKICB9OwogIGNvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5mcm9tKCdwcmVkaWN0aW9ucycpLnVwc2VydChyb3cse29uQ29uZmxpY3Q6J3BsYXllcl9pZCxtYXRjaF9pZCd9KTsKICBpZihlcnJvcil7aWYoYnRuKXtidG4uZGlzYWJsZWQ9ZmFsc2U7YnRuLnRleHRDb250ZW50PSdFcnJvIMK3IFRlbnRhciBkZSBub3ZvJztzZXRUaW1lb3V0KCgpPT57YnRuLnRleHRDb250ZW50PWJ0bi5fb2xkVGV4dHx8J1NhbHZhciBwYWxwaXRlJzt9LDI0MDApO310b2FzdCgnTsOjbyBmb2kgcG9zc8OtdmVsIHNhbHZhci4gTyBqb2dvIHBvZGUgdGVyIGZlY2hhZG8uJyk7cmV0dXJuO30KICBhd2FpdCByZWxvYWRNeVByZWRzKCk7CiAgaWYoYnRuKXsKICAgIGJ0bi50ZXh0Q29udGVudD0n4pyTIFNhbHZvISc7YnRuLmNsYXNzTGlzdC5hZGQoJ3NhdmVkLXN0YXRlJyk7CiAgICBzZXRUaW1lb3V0KCgpPT57CiAgICAgIGJ0bi5kaXNhYmxlZD1mYWxzZTtidG4uY2xhc3NMaXN0LnJlbW92ZSgnc2F2ZWQtc3RhdGUnKTsKICAgICAgLy8gQWdvcmEgaMOhIHBhbHBpdGU6IHZpcmEgIkF0dWFsaXphciBwYWxwaXRlIiBjb20gY29yIHRlYWwgKHByaW1hcnkpCiAgICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdnb2xkJyk7YnRuLmNsYXNzTGlzdC5hZGQoJ3ByaW1hcnknLCd1cGRhdGUtbW9kZScpOwogICAgICBidG4udGV4dENvbnRlbnQ9J0F0dWFsaXphciBwYWxwaXRlJzsKICAgIH0sMTgwMCk7CiAgfQogIG9uUHJlZGljdGlvbnNDaGFuZ2VkKCk7Cn0KCmZ1bmN0aW9uIG9uUHJlZGljdGlvbnNDaGFuZ2VkKCl7CiAgcmVuZGVyUmFua2luZygpO3JlbmRlclNjaG9vbHMoKTtyZW5kZXJSZWZSYW5raW5nSG9tZSgpO3JlbmRlclJlZmVycmFsKCk7CiAgaWYoX2lzQWx1bm9QYWdlKCkpe3JlbmRlckRhc2hib2FyZCgpO3JlbmRlclN0dWR5TWF0ZXJpYWxzKCk7cmVuZGVySGlzdG9yeSgpO3JlbmRlclJlZmVycmFsTGVhZGVyYm9hcmQoKTtyZW5kZXJNeVJlZmVycmFscygpO30KfQoKKGZ1bmN0aW9uKCl7Y29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXRjaGVzJyk7aWYoIWJveClyZXR1cm47CiAgY29uc3QgYmFkPVsnZScsJ0UnLCcrJywnLScsJy4nLCcsJywnICddOwogIGJveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxlPT57aWYoZS50YXJnZXQubWF0Y2hlcygnaW5wdXRbdHlwZT1udW1iZXJdJykmJmJhZC5pbmNsdWRlcyhlLmtleSkpZS5wcmV2ZW50RGVmYXVsdCgpO30pOwogIGJveC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsZT0+e2NvbnN0IHQ9ZS50YXJnZXQ7aWYoIXQubWF0Y2hlcygnaW5wdXRbdHlwZT1udW1iZXJdJykpcmV0dXJuO2xldCB2PXQudmFsdWUucmVwbGFjZSgvW15cZF0vZywnJykuc2xpY2UoMCwyKTtpZih2IT09JycmJit2PjIwKXY9JzIwJztpZih0LnZhbHVlIT09dil0LnZhbHVlPXY7fSk7CiAgYm94LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJyxlPT57aWYoZS50YXJnZXQubWF0Y2hlcygnaW5wdXRbdHlwZT1udW1iZXJdJykpe2UucHJldmVudERlZmF1bHQoKTtjb25zdCB0eHQ9KGUuY2xpcGJvYXJkRGF0YXx8d2luZG93LmNsaXBib2FyZERhdGEpLmdldERhdGEoJ3RleHQnKS5yZXBsYWNlKC9bXlxkXS9nLCcnKS5zbGljZSgwLDIpO2xldCB2PXR4dDtpZih2IT09JycmJit2PjIwKXY9JzIwJztlLnRhcmdldC52YWx1ZT12O319KTsKICAvLyBEZWxlZ2HDp8OjbyBkbyBjbGljayBubyBib3TDo28gIlNhbHZhciBwYWxwaXRlIiBkZSBjYWRhIGpvZ28KICBib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9Pntjb25zdCBidG49ZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtc2F2ZV0nKTtpZighYnRuKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7c2F2ZU1hdGNoSW5saW5lKGJ0bi5kYXRhc2V0LnNhdmUsYnRuKTt9KTsKfSkoKTsKCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlYnRuJykpCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlYnRuJykub25jbGljaz1hc3luYygpPT57CiAgaWYoIXN1cGF8fCFtZXx8IW1lRGF0YSl7dG9hc3QoJ0Zhw6dhIGxvZ2luIHBhcmEgc2FsdmFyJyk7cmV0dXJuO30KICBjb25zdCBieU1hdGNoPXt9OwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNtYXRjaGVzIGlucHV0W3R5cGU9bnVtYmVyXScpLmZvckVhY2goaW5wPT57KGJ5TWF0Y2hbaW5wLmRhdGFzZXQubV09YnlNYXRjaFtpbnAuZGF0YXNldC5tXXx8e30pW2lucC5kYXRhc2V0LnNdPWlucC52YWx1ZTt9KTsKICBjb25zdCByb3dzPVtdLGRlbHM9W107bGV0IGluY29tcGxldGU9MDsKICBjZmcubWF0Y2hlcy5mb3JFYWNoKG09PntpZihpc0Nsb3NlZChtKSlyZXR1cm47Y29uc3QgYj1ieU1hdGNoW20uaWRdfHx7fTtjb25zdCBodj1iLmgsYXY9Yi5hLGhFbXB0eT0oaHY9PW51bGx8fGh2PT09JycpLGFFbXB0eT0oYXY9PW51bGx8fGF2PT09JycpOwogICAgaWYoaEVtcHR5JiZhRW1wdHkpe2lmKG1lRGF0YS5wcmVkaWN0aW9uc1ttLmlkXSlkZWxzLnB1c2gobS5pZCk7cmV0dXJuO30KICAgIGlmKGhFbXB0eXx8YUVtcHR5KXtpbmNvbXBsZXRlKys7cmV0dXJuO30KICAgIHJvd3MucHVzaCh7cGxheWVyX2lkOm1lLmlkLG1hdGNoX2lkOm0uaWQsaG9tZV9nb2FsczpNYXRoLm1heCgwLE1hdGgubWluKDIwLHBhcnNlSW50KGh2KXx8MCkpLGF3YXlfZ29hbHM6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxwYXJzZUludChhdil8fDApKX0pO30pOwogIGxldCBmYWlsZWQ9ZmFsc2U7CiAgaWYocm93cy5sZW5ndGgpe2NvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5mcm9tKCdwcmVkaWN0aW9ucycpLnVwc2VydChyb3dzLHtvbkNvbmZsaWN0OidwbGF5ZXJfaWQsbWF0Y2hfaWQnfSk7aWYoZXJyb3IpZmFpbGVkPXRydWU7fQogIGZvcihjb25zdCBtaWQgb2YgZGVscyl7Y29uc3Qge2Vycm9yfT1hd2FpdCBzdXBhLmZyb20oJ3ByZWRpY3Rpb25zJykuZGVsZXRlKCkuZXEoJ3BsYXllcl9pZCcsbWUuaWQpLmVxKCdtYXRjaF9pZCcsbWlkKTtpZihlcnJvcilmYWlsZWQ9dHJ1ZTt9CiAgYXdhaXQgcmVsb2FkTXlQcmVkcygpOwogIGlmKGZhaWxlZCl0b2FzdCgnQWxndW5zIHBhbHBpdGVzIG7Do28gZm9yYW0gc2Fsdm9zLiBPIGpvZ28gcG9kZSB0ZXIgZmVjaGFkby4nKTsKICBlbHNlIGlmKHJvd3MubGVuZ3RoPT09MCYmZGVscy5sZW5ndGg9PT0wJiZpbmNvbXBsZXRlPT09MCl0b2FzdCgnUHJlZW5jaGEgbyBwbGFjYXIgZGUgcGVsbyBtZW5vcyB1bSBqb2dvIHBhcmEgc2FsdmFyLicpOwogIGVsc2UgaWYoaW5jb21wbGV0ZT4wJiZyb3dzLmxlbmd0aD09PTApdG9hc3QoaW5jb21wbGV0ZT09PTE\/JzEgam9nbyBmaWNvdSBjb20gc8OzIHVtIHBsYWNhciBlIG7Do28gZm9pIHNhbHZvLiBQcmVlbmNoYSBvcyBkb2lzIGxhZG9zLic6aW5jb21wbGV0ZSsnIGpvZ29zIGZpY2FyYW0gY29tIHPDsyB1bSBwbGFjYXIgZSBuw6NvIGZvcmFtIHNhbHZvcy4nKTsKICBlbHNlIGlmKGluY29tcGxldGU+MCl0b2FzdChyb3dzLmxlbmd0aCsnIHBhbHBpdGUnKyhyb3dzLmxlbmd0aD09PTE\/Jyc6J3MnKSsnIHNhbHZvJysocm93cy5sZW5ndGg9PT0xPycnOidzJykrJywgbWFzICcraW5jb21wbGV0ZSsnIGZpY291JysoaW5jb21wbGV0ZT09PTE\/Jyc6J3JhbScpKycgY29tIHPDsyB1bSBwbGFjYXIuJyk7CiAgZWxzZSBpZihyb3dzLmxlbmd0aD09PTAmJmRlbHMubGVuZ3RoPjApdG9hc3QoZGVscy5sZW5ndGg9PT0xPydQYWxwaXRlIHJlbW92aWRvLic6ZGVscy5sZW5ndGgrJyBwYWxwaXRlcyByZW1vdmlkb3MuJyk7CiAgZWxzZSB0b2FzdCgnUGFscGl0ZXMgc2Fsdm9zISDwn6aJJyk7CiAgcmVuZGVyTWF0Y2hlcygpO3JlbmRlclJhbmtpbmcoKTtyZW5kZXJTY2hvb2xzKCk7cmVuZGVyUmVmUmFua2luZ0hvbWUoKTtyZW5kZXJSZWZlcnJhbCgpOwogIGlmKF9pc0FsdW5vUGFnZSgpKXtyZW5kZXJEYXNoYm9hcmQoKTtyZW5kZXJTdHVkeU1hdGVyaWFscygpO3JlbmRlckhpc3RvcnkoKTtyZW5kZXJSZWZlcnJhbExlYWRlcmJvYXJkKCk7cmVuZGVyTXlSZWZlcnJhbHMoKTt9Cn07CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgUkFOS0lORyArIEVTQ09MQVMgKFJQQ3MgcHVibGljYXMsIHNlbSBQSUkpCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpmdW5jdGlvbiB1cGRhdGVIZXJvQ291bnQobil7Y29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlcm9saXZlJyk7aWYoIWVsKXJldHVybjtpZihuPjApe2NvbnN0IGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlcm9jb3VudCcpO2lmKGMpYy50ZXh0Q29udGVudD1OdW1iZXIobikudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJyk7ZWwuc3R5bGUuZGlzcGxheT0nJzt9ZWxzZXtlbC5zdHlsZS5kaXNwbGF5PSdub25lJzt9fQovKiBFc3RhZG8gZG8gcmFua2luZzogYnVzY2EgKyBwYWdlU2l6ZSAoVG9wIE4gdmlzw612ZWlzLCBpbmNyZW1lbnRhbCkgKi8KY29uc3QgUktfUEFHRV9JTklUSUFMPTEwOwpjb25zdCBSS19QQUdFX1NURVA9MjA7CmxldCBfcmtTdGF0ZT17c2VhcmNoOicnLCBwYWdlU2l6ZTpSS19QQUdFX0lOSVRJQUwsIGxhc3REYXRhOm51bGwsIG15UmFuazpudWxsfTsKY29uc3QgUE9ESVVNX1BSSVpFPVsn8J+RlSBDYW1pc2EgKyDwn5OxIFRhYmxldCcsJ\/CfkZUgQ2FtaXNhICsg8J+OpyBGb25lJywn8J+RlSBDYW1pc2EgZG8gQnJhc2lsJ107CmZ1bmN0aW9uIF9ya1Jvd0h0bWwocCxpLG1pbmVLZXkpewogIGNvbnN0IG1pbmU9KG1pbmVLZXkmJigobWluZUtleS51JiZwLnVzZXJuYW1lPT09bWluZUtleS51KXx8KHAubm9tZT09PW1pbmVLZXkubiYmKHAuY29uY3Vyc298fCcnKT09PShtaW5lS2V5LmN8fCcnKSkpKTsKICBjb25zdCB2dGFnID0gcC52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnID8gJzxzcGFuIGNsYXNzPSJ2dGFnIGV2IiB0aXRsZT0iRXN0cmF0w6lnaWEgVmVzdGlidWxhcmVzIj7wn46TPC9zcGFuPicgOiAnPHNwYW4gY2xhc3M9InZ0YWcgbWlsIiB0aXRsZT0iRXN0cmF0w6lnaWEgTWlsaXRhcmVzIj7wn6qWPC9zcGFuPic7CiAgcmV0dXJuIGA8dHIgY2xhc3M9IiR7bWluZT8nbWUnOicnfSI+PHRkPiR7aSsxfTwvdGQ+PHRkPiR7dnRhZ30ke2VzYyhfcHVibGljSGFuZGxlKHApKX0gJHtwLmVsaWdpdmVsPyc8c3BhbiBjbGFzcz0iZWxpZyI+4piFPC9zcGFuPic6Jyd9JHtwLmNvbmN1cnNvP2AgPHNtYWxsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMikiPuKAoiAke2VzYyhwLmNvbmN1cnNvKX08L3NtYWxsPmA6Jyd9PC90ZD48dGQgY2xhc3M9InIiPiR7cC5jcmF2YWRhc308L3RkPjx0ZCBjbGFzcz0iciIgc3R5bGU9ImNvbG9yOnZhcigtLXRlYWwpO2ZvbnQtd2VpZ2h0OjgwMCI+JHtwLnB0c308L3RkPjwvdHI+YDsKfQpmdW5jdGlvbiBfcmVuZGVyUmFua2luZ0JvZHkoKXsKICBjb25zdCBib2R5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYW5rYm9keScpO2lmKCFib2R5KXJldHVybjsKICBjb25zdCBwcz1fcmtTdGF0ZS5sYXN0RGF0YXx8W107CiAgaWYoIXBzLmxlbmd0aCl7Ym9keS5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5OaW5ndcOpbSBqb2dvdSBhaW5kYS4gU2VqYSBvIHByaW1laXJvIGEgY3JhdmFyIG9zIHBsYWNhcmVzITwvZGl2Pic7cmV0dXJuO30KICBjb25zdCBtaW5lS2V5PW1lRGF0YT97dTptZURhdGEudXNlcm5hbWV8fG51bGwsbjptZURhdGEubm9tZSxjOm1lRGF0YS5jb25jfHwnJ306bnVsbDsKICAvLyAyMDI2LTA2LTA2OiBlbnF1YW50byBuaW5ndcOpbSBwb250dW91IChDb3BhIG7Do28gcm9sb3UpLCByYW5raW5nIMOpIHPDsyBvcmRlbQogIC8vIGFsZmFiw6l0aWNhIGRvIFNRTC4gRXNjb25kZSBww7NkaW8gKyBwcsOqbWlvcyBwcmEgbsOjbyBmaW5naXIgY29tcGV0acOnw6NvIHF1ZQogIC8vIGFpbmRhIG7Do28gZXhpc3RlIGUgcHJhIG7Do28gcHJlbWlhciBxdWVtIGVudHJvdSBuYSBmcmVudGUgcG9yIHNvcnRlIGRvIG5vbWUuCiAgY29uc3QgYWxsWmVybyA9ICFwc1swXSB8fCAocHNbMF0ucHRzfHwwKT09PTA7CiAgbGV0IHBvZD0nJzsKICBpZighYWxsWmVybyl7CiAgICBjb25zdCB0b3A9cHMuc2xpY2UoMCwzKSxvcmQ9WzEsMCwyXTtwb2Q9JzxkaXYgY2xhc3M9InBvZGl1bSI+JzsKICAgIG9yZC5mb3JFYWNoKGk9PnsKICAgICAgaWYoIXRvcFtpXSl7cG9kKz0nPGRpdj48L2Rpdj4nO3JldHVybjt9CiAgICAgIGNvbnN0IHA9dG9wW2ldLHBsPWkrMSxtZD1bJ\/CfpYcnLCfwn6WIJywn8J+liSddW2ldOwogICAgICBjb25zdCB2dGFnPXAudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8n8J+OkyAnOifwn6qWICc7CiAgICAgIHBvZCs9YDxkaXYgY2xhc3M9InBvZCBnJHtwbH0iPjxkaXYgY2xhc3M9Im0iPiR7bWR9PC9kaXY+PGRpdiBjbGFzcz0ibm0iPiR7dnRhZ30ke2VzYyhfcHVibGljSGFuZGxlKHApKX08L2Rpdj4ke3AuY29uY3Vyc28\/YDxkaXYgY2xhc3M9InR1Ij4ke2VzYyhwLmNvbmN1cnNvKX08L2Rpdj5gOicnfTxkaXYgY2xhc3M9InB0Ij4ke3AucHRzfSBwdHM8L2Rpdj48ZGl2IGNsYXNzPSJwcnoiPiR7UE9ESVVNX1BSSVpFW2ldfTwvZGl2PjwvZGl2PmA7CiAgICB9KTsKICAgIHBvZCs9JzwvZGl2Pic7CiAgfSBlbHNlIHsKICAgIHBvZD0nPGRpdiBjbGFzcz0icmtwcmVnYW1lIj48c3BhbiBjbGFzcz0icmtwcmVnYW1lLWljIj7wn4+BPC9zcGFuPjxkaXY+PGI+QSBDb3BhIGFpbmRhIG7Do28gY29tZcOnb3UuPC9iPiBPIHDDs2RpbyBhcGFyZWNlIHF1YW5kbyBvIHByaW1laXJvIHBsYWNhciBvZmljaWFsIGZvciBsYW7Dp2Fkby4gT3MgMyBhbHVub3MgcXVlIG1haXMgcG9udHVhcmVtIG5hIENvcGEgbGV2YW0gPGI+Q2FtaXNhIGRvIEJyYXNpbCArIFRhYmxldDwvYj4sIDxiPkNhbWlzYSBkbyBCcmFzaWwgKyBGb25lPC9iPiBlIDxiPkNhbWlzYSBkbyBCcmFzaWw8L2I+LjwvZGl2PjwvZGl2Pic7CiAgfQogIC8vIEJhbm5lciAiTWluaGEgcG9zacOnw6NvIiDigJQgU0VNUFJFIHZpc8OtdmVsIHF1YW5kbyBsb2dhZG8sIHVzYW5kbyBSUEMgZGVkaWNhZGEKICAvLyBnZXRfbXlfcmFuayAobsOjbyBkZXBlbmRlIGRlIG8gdXN1w6FyaW8gZXN0YXIgbm8gVG9wIDEwMCByZXRvcm5hZG8pLgogIGxldCBteUJhbm5lcj0nJzsKICBpZihtaW5lS2V5KXsKICAgIGNvbnN0IG15PV9ya1N0YXRlLm15UmFuazsKICAgIGlmKG15JiZteS5wb3NpY2FvKXsKICAgICAgLy8gU2UgbmluZ3XDqW0gcG9udHVvdSBhaW5kYSwgYSAicG9zacOnw6NvIiDDqSBzw7MgYWxmYWLDqXRpY2Eg4oCUIG7Do28gbW9zdHJhIHJhbmsgZmFsc28uCiAgICAgIGlmKGFsbFplcm8pewogICAgICAgIGNvbnN0IF9teVZUYWc9bXkudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8n8J+Okyc6J\/CfqpYnOwogICAgICAgIG15QmFubmVyPSc8ZGl2IGNsYXNzPSJteXJhbmsgbXlyYW5rLW9mZiI+PGRpdiBjbGFzcz0ibXlyYW5rLWluZm8iPicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW5tIj7wn5ONIFZvY8OqIGVzdMOhIGluc2NyaXRvIMK3ICcrX215VlRhZysnICcrZXNjKG15Lm5vbWV8fG1lRGF0YS5ub21lKSsobXkuY29uY3Vyc28\/JyA8c21hbGw+wrcgJytlc2MobXkuY29uY3Vyc28pKyc8L3NtYWxsPic6JycpKyc8L2Rpdj4nCiAgICAgICAgICArJzxkaXYgY2xhc3M9Im15cmFuay1tZXRhIj5TdWEgcG9zacOnw6NvIG5vIHJhbmtpbmcgYXBhcmVjZSBhcXVpIHF1YW5kbyBvcyBqb2dvcyBjb21lw6dhcmVtLjwvZGl2PicKICAgICAgICAgICsnPC9kaXY+PC9kaXY+JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBzdGF0dXNIdG1sPW15LmVsaWdpdmVsCiAgICAgICAgICA\/JzxzcGFuIGNsYXNzPSJteXJhbmstZWxpZyI+4piFIEVsZWfDrXZlbCBwcm8gc29ydGVpbzwvc3Bhbj4nCiAgICAgICAgICA6JzxzcGFuIGNsYXNzPSJteXJhbmstbWlzcyI+RmFsdGFtIDxiPicrKG15LnB0c19mYWx0YW5kb3x8MCkrJyBwdHM8L2I+IHBybyBzb3J0ZWlvPC9zcGFuPic7CiAgICAgICAgY29uc3QgX215VlRhZz1teS52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPyfwn46TJzon8J+qlic7CiAgICAgICAgbXlCYW5uZXI9JzxkaXYgY2xhc3M9Im15cmFuayI+PGRpdiBjbGFzcz0ibXlyYW5rLXBvcyI+JytteS5wb3NpY2FvKyfCujwvZGl2PicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLWluZm8iPicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW5tIj7wn5ONIFZvY8OqIMK3ICcrX215VlRhZysnICcrZXNjKG15Lm5vbWV8fG1lRGF0YS5ub21lKSsobXkuY29uY3Vyc28\/JyA8c21hbGw+wrcgJytlc2MobXkuY29uY3Vyc28pKyc8L3NtYWxsPic6JycpKyc8L2Rpdj4nCiAgICAgICAgICArJzxkaXYgY2xhc3M9Im15cmFuay1tZXRhIj48Yj4nK215LnB0cysnIHB0czwvYj4gwrcgJytteS5jcmF2YWRhcysnIGNyYXZhZGFzIMK3ICcrc3RhdHVzSHRtbCsnPC9kaXY+JwogICAgICAgICAgKyc8L2Rpdj48L2Rpdj4nOwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbnN0IGFjZXNzYXJVcmw9d2luZG93Ll9fQk9MQU9fQUNFU1NBUl9VUkx8fCcjYWNlc3Nhcic7CiAgICBteUJhbm5lcj0nPGEgaHJlZj0iJythY2Vzc2FyVXJsKyciIGNsYXNzPSJteXJhbmsgbXlyYW5rLW9mZiI+JwogICAgICArJzxkaXYgY2xhc3M9Im15cmFuay1pbmZvIj48ZGl2IGNsYXNzPSJteXJhbmstbm0iPvCflJEgQWNlc3NlIHByYSB2ZXIgc3VhIHBvc2nDp8OjbzwvZGl2PicKICAgICAgKyc8ZGl2IGNsYXNzPSJteXJhbmstbWV0YSI+U2V1IG5vbWUgYXBhcmVjZSBkZXN0YWNhZG8gYXF1aSBhc3NpbSBxdWUgdm9jw6ogZW50cmFyLjwvZGl2PjwvZGl2PicKICAgICAgKyc8c3BhbiBjbGFzcz0ibXlyYW5rLWN0YSI+QWNlc3NhciDihpI8L3NwYW4+PC9hPic7CiAgfQogIC8vIGJ1c2NhCiAgY29uc3QgcT1fcmtTdGF0ZS5zZWFyY2gudG9Mb3dlckNhc2UoKS50cmltKCk7CiAgbGV0IG1haW49Jyc7CiAgaWYocSl7CiAgICBjb25zdCBtYXRjaGVzPXBzLm1hcCgocCxpKT0+KHtwLGl9KSkuZmlsdGVyKHg9Pih4LnAudXNlcm5hbWUmJngucC51c2VybmFtZS5pbmNsdWRlcyhxKSl8fCgoeC5wLm5vbWV8fCcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKXx8KCh4LnAuY29uY3Vyc298fCcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSk7CiAgICBtYWluPSc8ZGl2IGNsYXNzPSJya2Jsb2NrIj48ZGl2IGNsYXNzPSJya2Jsb2NrLWhlYWQiPvCflI4gUmVzdWx0YWRvcyBkYSBidXNjYSAnKyhtYXRjaGVzLmxlbmd0aD9gKCR7bWF0Y2hlcy5sZW5ndGh9KWA6JyhuZW5odW0pJykrJzwvZGl2Pic7CiAgICBpZihtYXRjaGVzLmxlbmd0aCkgbWFpbis9Jzx0YWJsZSBjbGFzcz0icmsiPjx0aGVhZD48dHI+PHRoPiM8L3RoPjx0aD5QYXJ0aWNpcGFudGU8L3RoPjx0aCBjbGFzcz0iciI+Q3JhdmFkYXM8L3RoPjx0aCBjbGFzcz0iciI+UG9udG9zPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PicrbWF0Y2hlcy5zbGljZSgwLDMwKS5tYXAoeD0+X3JrUm93SHRtbCh4LnAseC5pLG1pbmVLZXkpKS5qb2luKCcnKSsnPC90Ym9keT48L3RhYmxlPic7CiAgICBtYWluKz0nPC9kaXY+JzsKICB9IGVsc2UgewogICAgLy8gUmFua2luZyBwcmluY2lwYWwg4oCUIFRvcCBOIChpbmNyZW1lbnRhbCBwb3IgcGFnZVNpemUpCiAgICBjb25zdCB2aXNpYmxlPU1hdGgubWluKF9ya1N0YXRlLnBhZ2VTaXplLCBwcy5sZW5ndGgpOwogICAgY29uc3QgaGVhZCA9IGFsbFplcm8KICAgICAgPyAn8J+TiyBJbnNjcml0b3MgYXTDqSBhZ29yYSAoJytwcy5sZW5ndGgrJykgPHNtYWxsIGNsYXNzPSJyay1zdWJoZWFkIj7CtyBvcmRlbSBhbGZhYsOpdGljYSBhdMOpIG8gMcK6IGpvZ288L3NtYWxsPicKICAgICAgOiAodmlzaWJsZTw9UktfUEFHRV9JTklUSUFMPyfwn4+GIFRvcCAnK3Zpc2libGU6J\/Cfj4YgUmFua2luZyAoVG9wICcrdmlzaWJsZSsnIGRlICcrcHMubGVuZ3RoKycpJyk7CiAgICBjb25zdCBzbGljZT1wcy5zbGljZSgwLHZpc2libGUpOwogICAgbWFpbis9JzxkaXYgY2xhc3M9InJrYmxvY2siPjxkaXYgY2xhc3M9InJrYmxvY2staGVhZCI+JytoZWFkKyc8L2Rpdj48dGFibGUgY2xhc3M9InJrIj48dGhlYWQ+PHRyPjx0aD4jPC90aD48dGg+UGFydGljaXBhbnRlPC90aD48dGggY2xhc3M9InIiPkNyYXZhZGFzPC90aD48dGggY2xhc3M9InIiPlBvbnRvczwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nK3NsaWNlLm1hcCgocCxpKT0+X3JrUm93SHRtbChwLGksbWluZUtleSkpLmpvaW4oJycpKyc8L3Rib2R5PjwvdGFibGU+PC9kaXY+JzsKICAgIC8vIEFyb3VuZCBtZTogMiBhbnRlcyArIHZvY8OqICsgMiBkZXBvaXMgKHPDsyBhcGFyZWNlIHNlIG7Do28gZXN0w6Egbm8gVG9wIGrDoSB2aXPDrXZlbCkKICAgIGxldCBteUlkeD0tMTsKICAgIGlmKG1pbmVLZXkpewogICAgICBteUlkeD1wcy5maW5kSW5kZXgocD0+KG1pbmVLZXkudSYmcC51c2VybmFtZT09PW1pbmVLZXkudSl8fChwLm5vbWU9PT1taW5lS2V5Lm4mJihwLmNvbmN1cnNvfHwnJyk9PT0obWluZUtleS5jfHwnJykpKTsKICAgIH0KICAgIGlmKG15SWR4Pj12aXNpYmxlKXsKICAgICAgY29uc3Qgc3RhcnQ9TWF0aC5tYXgodmlzaWJsZSwgbXlJZHgtMiksIGVuZD1NYXRoLm1pbihwcy5sZW5ndGgsIG15SWR4KzMpOwogICAgICBjb25zdCBhcm91bmRTbGljZT1wcy5zbGljZShzdGFydCxlbmQpOwogICAgICBtYWluKz0nPGRpdiBjbGFzcz0icmtibG9jayI+PGRpdiBjbGFzcz0icmtibG9jay1oZWFkIj7wn5ONIFN1YSBwb3Npw6fDo286ICcrKG15SWR4KzEpKyfCuiBkZSAnK3BzLmxlbmd0aCsnPC9kaXY+PHRhYmxlIGNsYXNzPSJyayI+PHRoZWFkPjx0cj48dGg+IzwvdGg+PHRoPlBhcnRpY2lwYW50ZTwvdGg+PHRoIGNsYXNzPSJyIj5DcmF2YWRhczwvdGg+PHRoIGNsYXNzPSJyIj5Qb250b3M8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+Jythcm91bmRTbGljZS5tYXAoKHAsaSk9Pl9ya1Jvd0h0bWwocCxzdGFydCtpLG1pbmVLZXkpKS5qb2luKCcnKSsnPC90Ym9keT48L3RhYmxlPjwvZGl2Pic7CiAgICB9CiAgICAvLyBCb3TDtWVzICJWZXIgbWFpcyIgLyAiVmVyIG1lbm9zIgogICAgY29uc3QgbW9yZT1wcy5sZW5ndGgtdmlzaWJsZTsKICAgIGxldCBhY3Rpb25zPScnOwogICAgaWYobW9yZT4wKSBhY3Rpb25zKz0nPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IHJrbW9yZSIgaWQ9InJrTW9yZSI+VmVyIG1haXMgJytNYXRoLm1pbihSS19QQUdFX1NURVAsIG1vcmUpKycg4oaSPC9idXR0b24+JzsKICAgIGlmKHZpc2libGU+UktfUEFHRV9JTklUSUFMKSBhY3Rpb25zKz0nPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IHJrbW9yZSIgaWQ9InJrTGVzcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OjhweCI+4oaQIFZlciBtZW5vczwvYnV0dG9uPic7CiAgICBpZihhY3Rpb25zKSBtYWluKz0nPGRpdiBjbGFzcz0icmtibG9jay1mb290Ij4nK2FjdGlvbnMrJzwvZGl2Pic7CiAgfQogIC8vIEJhcnJhIGRlIGJ1c2NhCiAgY29uc3Qgc2VhcmNoQmFyPSc8ZGl2IGNsYXNzPSJya3NlYXJjaGJhciI+PGlucHV0IGlkPSJya1NlYXJjaCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IvCflI4gQnVzY2FyIEBhcGVsaWRvLCBub21lIG91IGN1cnNvIiB2YWx1ZT0iJytlc2MoX3JrU3RhdGUuc2VhcmNoKSsnIiBhdXRvY29tcGxldGU9Im9mZiI+PC9kaXY+JzsKICBib2R5LmlubmVySFRNTD1wb2QrbXlCYW5uZXIrc2VhcmNoQmFyK21haW47CiAgLy8gV2lyZSBldmVudG9zCiAgY29uc3Qgc0luPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdya1NlYXJjaCcpOwogIGlmKHNJbil7bGV0IF90PW51bGw7c0luLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e2NsZWFyVGltZW91dChfdCk7X3Q9c2V0VGltZW91dCgoKT0+e19ya1N0YXRlLnNlYXJjaD1zSW4udmFsdWU7X3JlbmRlclJhbmtpbmdCb2R5KCk7Y29uc3QgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmtTZWFyY2gnKTtpZihmKXtmLmZvY3VzKCk7Zi5zZXRTZWxlY3Rpb25SYW5nZShmLnZhbHVlLmxlbmd0aCxmLnZhbHVlLmxlbmd0aCk7fX0sMjUwKTt9KTt9CiAgY29uc3QgbXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JrTW9yZScpOwogIGlmKG1yKXttci5vbmNsaWNrPSgpPT57X3JrU3RhdGUucGFnZVNpemU9TWF0aC5taW4oX3JrU3RhdGUucGFnZVNpemUrUktfUEFHRV9TVEVQLChfcmtTdGF0ZS5sYXN0RGF0YXx8W10pLmxlbmd0aCk7X3JlbmRlclJhbmtpbmdCb2R5KCk7Y29uc3QgbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmtNb3JlJyl8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdya0xlc3MnKTtpZihtKW0uc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidjZW50ZXInfSk7fTt9CiAgY29uc3QgbHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JrTGVzcycpOwogIGlmKGxzKXtscy5vbmNsaWNrPSgpPT57X3JrU3RhdGUucGFnZVNpemU9UktfUEFHRV9JTklUSUFMO19yZW5kZXJSYW5raW5nQm9keSgpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYW5raW5nJyk\/LnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjonc21vb3RoJyxibG9jazonc3RhcnQnfSk7fTt9Cn0KYXN5bmMgZnVuY3Rpb24gcmVuZGVyUmFua2luZygpe2lmKCFzdXBhKXtyZXR1cm47fWNvbnN0IGJvZHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jhbmtib2R5Jyk7aWYoIWJvZHkpcmV0dXJuOwogIGNvbnN0IHtkYXRhLGVycm9yfT1hd2FpdCBzdXBhLnJwYygnZ2V0X3JhbmtpbmcnLHtwX2xpbWl0OjEwMH0pO2NvbnN0IHBzPShlcnJvcnx8IWRhdGEpP1tdOmRhdGE7CiAgX3JrU3RhdGUubGFzdERhdGE9cHM7CiAgLy8gUG9zacOnw6NvIHBlc3NvYWwgdmVtIGRlIFJQQyBkZWRpY2FkYSAobsOjbyBkZXBlbmRlIGRlIGVzdGFyIGRlbnRybyBkbyBUb3AgMTAwKQogIGlmKG1lKXt0cnl7Y29uc3Qge2RhdGE6bXl9PWF3YWl0IHN1cGEucnBjKCdnZXRfbXlfcmFuaycpO2lmKG15KV9ya1N0YXRlLm15UmFuaz1teTt9Y2F0Y2goZSl7X2RiZ3coJ2dldF9teV9yYW5rJyxlKTt9fQogIGxldCB0b3RhbD1wcy5sZW5ndGg7dHJ5e2NvbnN0IHtkYXRhOnN0fT1hd2FpdCBzdXBhLnJwYygnZ2V0X3N0YXRzJyk7aWYoc3QmJnN0WzBdJiZzdFswXS5wYXJ0aWNpcGFudGVzIT1udWxsKXRvdGFsPXN0WzBdLnBhcnRpY2lwYW50ZXM7fWNhdGNoKGUpe19kYmd3KCdyZW5kZXJSYW5raW5nIGdldF9zdGF0cycsZSk7fQogIHVwZGF0ZUhlcm9Db3VudCh0b3RhbCk7CiAgY29uc3QgX3J1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYW5rdXBkJyk7aWYoX3J1KV9ydS50ZXh0Q29udGVudD0nQXR1YWxpemFkbyBhdXRvbWF0aWNhbWVudGUgwrcgJytub3dTdGFtcCgpOwogIF9yZW5kZXJSYW5raW5nQm9keSgpOwp9CgovKiBFc3RhZG8gZGFzIHNjaG9vbHM6IGxpc3RhIMO6bmljYSAoRU0rRVYganVudG9zKSwgcGFnaW5hw6fDo28gaW5jcmVtZW50YWwgKi8KY29uc3QgU0NIX1BBR0VfSU5JVElBTD0xMDsKY29uc3QgU0NIX1BBR0VfU1RFUD0yMDsKbGV0IF9zY2hTdGF0ZT17cGFnZVNpemU6U0NIX1BBR0VfSU5JVElBTCwgbGFzdERhdGE6bnVsbH07CmZ1bmN0aW9uIF9yZW5kZXJTY2hvb2xzQm9keSgpewogIGNvbnN0IGJvZHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjaG9vbGJvZHknKTtpZighYm9keSlyZXR1cm47CiAgY29uc3QgYWxsPV9zY2hTdGF0ZS5sYXN0RGF0YXx8W107CiAgaWYoIWFsbC5sZW5ndGgpe2JvZHkuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJlbXB0eSI+TmVuaHVtYSBlc2NvbGEgbmEgZGlzcHV0YSBhaW5kYS4gSW5zY3JldmEtc2UgZSBjaGFtZSBhIHN1YSB0dXJtYSE8L2Rpdj4nO3JldHVybjt9CiAgLy8gMjAyNi0wNi0wNjogbWVzbW8gZ3VhcmQgZG8gcmFua2luZyBpbmRpdmlkdWFsLiBFbnF1YW50byBuaW5ndcOpbSBwb250dW91CiAgLy8gKENvcGEgbsOjbyByb2xvdSksIGEgImRpc3B1dGEiIMOpIG9yZGVtIGFsZmFiw6l0aWNhIGZhbHNhIOKAlCBlc2NvbmRlIHDDs2RpbywKICAvLyBjb3JvYSwgcG9zacOnw6NvIG51bWVyYWRhIGUgYmFubmVyICJtaW5oYSBlc2NvbGEgI1giLiBWb2x0YSBhdXRvbcOhdGljbwogIC8vIHF1YW5kbyBhIDHCqiBlc2NvbGEgc2FpciBkZSAwLjAuCiAgY29uc3QgYWxsWmVybyA9ICFhbGxbMF0gfHwgKE51bWJlcihhbGxbMF0uYXZnKXx8MCkgPT09IDA7CiAgLy8gQmFubmVyICJNaW5oYSBlc2NvbGEiIOKAlCBzZW1wcmUgdmlzw612ZWwgcXVhbmRvIGxvZ2FkbyBlIGEgZXNjb2xhIGVzdMOhIG5vIHJhbmtpbmcuCiAgbGV0IG15QmFubmVyPScnOwogIGlmKG1lRGF0YSYmbWVEYXRhLmNvbmMpewogICAgY29uc3QgbXlJZHg9YWxsLmZpbmRJbmRleChzPT5zLm5hbWU9PT1tZURhdGEuY29uYyk7CiAgICBpZihteUlkeD49MCl7CiAgICAgIGNvbnN0IG15Uz1hbGxbbXlJZHhdOwogICAgICBjb25zdCB2VGFnPW15Uy52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPyfwn46TJzon8J+qlic7CiAgICAgIGlmKGFsbFplcm8pewogICAgICAgIG15QmFubmVyPSc8ZGl2IGNsYXNzPSJteXJhbmsgbXlyYW5rLW9mZiI+PGRpdiBjbGFzcz0ibXlyYW5rLWluZm8iPicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW5tIj7wn4+rIFN1YSBlc2NvbGEgwrcgJyt2VGFnKycgJytlc2MobXlTLm5hbWUpKycgwrcgJytteVMuY291bnQrJyBhbHVubycrKG15Uy5jb3VudCE9PTE\/J3MnOicnKSsnIGluc2NyaXRvJysobXlTLmNvdW50IT09MT8ncyc6JycpKyc8L2Rpdj4nCiAgICAgICAgICArJzxkaXYgY2xhc3M9Im15cmFuay1tZXRhIj5BIHBvc2nDp8OjbyBkYSBzdWEgZXNjb2xhIGFwYXJlY2UgYXF1aSBxdWFuZG8gb3Mgam9nb3MgY29tZcOnYXJlbS48L2Rpdj4nCiAgICAgICAgICArJzwvZGl2PjwvZGl2Pic7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgbmV4dD1teUlkeD4wP2FsbFtteUlkeC0xXTpudWxsOwogICAgICAgIGNvbnN0IGRpZmZUeHQ9bmV4dD8nPHNwYW4gY2xhc3M9Im15cmFuay1taXNzIj5GYWx0YW0gPGI+JysobmV4dC5hdmctbXlTLmF2ZykudG9GaXhlZCgxKSsnIHB0cyBkZSBtw6lkaWE8L2I+IHByYSBzdWJpciBwcm8gJysobXlJZHgpKyfCujwvc3Bhbj4nOic8c3BhbiBjbGFzcz0ibXlyYW5rLWVsaWciPuKYhSBMw61kZXIgZG8gcmFua2luZzwvc3Bhbj4nOwogICAgICAgIG15QmFubmVyPSc8ZGl2IGNsYXNzPSJteXJhbmsiPjxkaXYgY2xhc3M9Im15cmFuay1wb3MiPicrKG15SWR4KzEpKyfCujwvZGl2PicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLWluZm8iPicKICAgICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW5tIj7wn4+rIFN1YSBlc2NvbGEgwrcgJyt2VGFnKycgJytlc2MobXlTLm5hbWUpKyc8L2Rpdj4nCiAgICAgICAgICArJzxkaXYgY2xhc3M9Im15cmFuay1tZXRhIj48Yj4nK215Uy5hdmcudG9GaXhlZCgxKSsnIHB0czwvYj4gZGUgbcOpZGlhIMK3ICcrbXlTLmNvdW50KycgYWx1bm8nKyhteVMuY291bnQhPT0xPydzJzonJykrJyDCtyAnK2RpZmZUeHQrJzwvZGl2PicKICAgICAgICAgICsnPC9kaXY+PC9kaXY+JzsKICAgICAgfQogICAgfSBlbHNlIGlmKG1lRGF0YS5jb25jKXsKICAgICAgbXlCYW5uZXI9JzxkaXYgY2xhc3M9Im15cmFuayBteXJhbmstb2ZmIj48ZGl2IGNsYXNzPSJteXJhbmstaW5mbyI+JwogICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW5tIj7wn4+rIFN1YSBlc2NvbGEgwrcgJytlc2MobWVEYXRhLmNvbmMpKycgYWluZGEgbsOjbyBlc3TDoSBubyByYW5raW5nPC9kaXY+JwogICAgICAgICsnPGRpdiBjbGFzcz0ibXlyYW5rLW1ldGEiPkNvbnZpZGUgY29sZWdhcyBwcmEgcG9udHVhciBlIGZhemVyIHN1YSBlc2NvbGEgZW50cmFyIG5hIGRpc3B1dGEuPC9kaXY+JwogICAgICAgICsnPC9kaXY+PC9kaXY+JzsKICAgIH0KICB9CiAgLy8gQmFubmVyIGRlIHByw6ktQ29wYSBwcmEgZXNjb2xhcyAoc3Vic3RpdHVpIHDDs2RpbyBmYWxzbykuIE1lc21vIHBhZHLDo28gZG8gcmtwcmVnYW1lLgogIGNvbnN0IHByZWdhbWUgPSBhbGxaZXJvCiAgICA\/ICc8ZGl2IGNsYXNzPSJya3ByZWdhbWUiPjxzcGFuIGNsYXNzPSJya3ByZWdhbWUtaWMiPvCfj4E8L3NwYW4+PGRpdj48Yj5BIGRpc3B1dGEgZW50cmUgZXNjb2xhcyBhaW5kYSBuw6NvIGNvbWXDp291LjwvYj4gJythbGwubGVuZ3RoKycgZXNjb2xhJysoYWxsLmxlbmd0aD09PTE\/Jyc6J3MnKSsnIGluc2NyaXRhJysoYWxsLmxlbmd0aD09PTE\/Jyc6J3MnKSsnIGF0w6kgYWdvcmEuIE8gcmFua2luZyBhcGFyZWNlIHF1YW5kbyBvIHByaW1laXJvIHBsYWNhciBvZmljaWFsIGZvciBsYW7Dp2Fkby4gQSBlc2NvbGEgY2FtcGXDoyBnYW5oYSAyIHNvcnRlaW9zIGVudHJlIHNldXMgVG9wIDEwMCBhbHVub3M6IDxiPjEgY2FtaXNhIGRvIEJyYXNpbCArIDEgQXBwbGUgV2F0Y2g8L2I+LjwvZGl2PjwvZGl2PicKICAgIDogJyc7CiAgY29uc3QgbWF4PU1hdGgubWF4KDEsIGFsbFswXS5hdmd8fDAuMDAwMSk7CiAgY29uc3QgdmlzaWJsZT1NYXRoLm1pbihfc2NoU3RhdGUucGFnZVNpemUsIGFsbC5sZW5ndGgpOwogIGNvbnN0IHNsaWNlPWFsbC5zbGljZSgwLCB2aXNpYmxlKTsKICBjb25zdCByb3dzPSc8ZGl2IGNsYXNzPSJzY2hvb2xib2FyZCI+JytzbGljZS5tYXAoKHMsaSk9PnsKICAgIGNvbnN0IHBjdD1NYXRoLm1heCg0LE1hdGgucm91bmQoKHMuYXZnfHwwKS9tYXgqMTAwKSk7CiAgICBjb25zdCBjcm93bj1pPT09MCYmcy5hdmc+MD8nPHNwYW4gY2xhc3M9ImNyb3duIj7wn5GRPC9zcGFuPic6Jyc7CiAgICBjb25zdCB0YWcgPSBzLnZlcnRpY2FsPT09J3Zlc3RpYnVsYXJlcycgPyAnPHNwYW4gY2xhc3M9InNjaHRhZyBldiIgdGl0bGU9IkVzdHJhdMOpZ2lhIFZlc3RpYnVsYXJlcyI+8J+Okzwvc3Bhbj4nIDogJzxzcGFuIGNsYXNzPSJzY2h0YWcgbWlsIiB0aXRsZT0iRXN0cmF0w6lnaWEgTWlsaXRhcmVzIj7wn6qWPC9zcGFuPic7CiAgICBjb25zdCBtaW5lQ2xzPShtZURhdGEmJm1lRGF0YS5jb25jJiZzLm5hbWU9PT1tZURhdGEuY29uYyk\/JyBpcy1taW5lJzonJzsKICAgIC8vIEVtIHByw6ktQ29wYTogb2N1bHRhIHBvc2nDp8OjbyBudW1lcmFkYSAoZmFrZSBhbGZhYsOpdGljYSksIGJhciBlIHZhbG9yIGRlIG3DqWRpYS4KICAgIGNvbnN0IHBvc0Jsb2NrID0gYWxsWmVybyA\/ICc8ZGl2IGNsYXNzPSJzcG9zIHNwb3MtbXV0ZSI+wrc8L2Rpdj4nIDogJzxkaXYgY2xhc3M9InNwb3MiPicrKGkrMSkrJ8K6PC9kaXY+JzsKICAgIGNvbnN0IGJhckJsb2NrID0gYWxsWmVybyA\/ICcnIDogJzxkaXYgY2xhc3M9InNiYXIiPjxpIHN0eWxlPSJ3aWR0aDonK3BjdCsnJSI+PC9pPjwvZGl2Pic7CiAgICBjb25zdCBtZXRhID0gYWxsWmVybwogICAgICA\/IHMuY291bnQrJyBhbHVubycrKHMuY291bnQhPT0xPydzIGluc2NyaXRvcyc6JyBpbnNjcml0bycpCiAgICAgIDogcy5jb3VudCsnIHBhcnRpY2lwYW50ZScrKHMuY291bnQhPT0xPydzJzonJykrJyDCtyBtw6lkaWEgZG9zICcrRVNDT0xBX1RPUE4rJyBtZWxob3Jlcyc7CiAgICBjb25zdCB2YWxCbG9jayA9IGFsbFplcm8KICAgICAgPyAnPGRpdiBjbGFzcz0ic3B0cyI+PHNwYW4gY2xhc3M9InYgc3B0cy1tdXRlIj7igJQ8L3NwYW4+PHNwYW4gY2xhc3M9InUiPmFndWFyZGFuZG8gam9nb3M8L3NwYW4+PC9kaXY+JwogICAgICA6ICc8ZGl2IGNsYXNzPSJzcHRzIj48c3BhbiBjbGFzcz0idiI+Jysocy5hdmd8fDApLnRvRml4ZWQoMSkrJzwvc3Bhbj48c3BhbiBjbGFzcz0idSI+bcOpZGlhIFRvcCAnK0VTQ09MQV9UT1BOKyc8L3NwYW4+PC9kaXY+JzsKICAgIHJldHVybiBgPGRpdiBjbGFzcz0ic3JvdyAke2k9PT0wJiZzLmF2Zz4wPydsZWFkMSc6Jyd9JHttaW5lQ2xzfSI+JHtwb3NCbG9ja308ZGl2IGNsYXNzPSJzbWlkIj48ZGl2IGNsYXNzPSJzbmFtZSI+JHtjcm93bn0ke3RhZ30ke2VzYyhzLm5hbWUpfTwvZGl2PjxkaXYgY2xhc3M9InNtZXRhIj4ke21ldGF9PC9kaXY+JHtiYXJCbG9ja308L2Rpdj4ke3ZhbEJsb2NrfTwvZGl2PmA7CiAgfSkuam9pbignJykrJzwvZGl2Pic7CiAgY29uc3QgbW9yZT1hbGwubGVuZ3RoLXZpc2libGU7CiAgbGV0IGFjdGlvbnM9Jyc7CiAgaWYobW9yZT4wKSBhY3Rpb25zKz0nPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IHJrbW9yZSIgaWQ9InNjaE1vcmUiPlZlciBtYWlzICcrTWF0aC5taW4oU0NIX1BBR0VfU1RFUCwgbW9yZSkrJyDihpI8L2J1dHRvbj4nOwogIGlmKHZpc2libGU+U0NIX1BBR0VfSU5JVElBTCkgYWN0aW9ucys9JzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCBya21vcmUiIGlkPSJzY2hMZXNzIiBzdHlsZT0ibWFyZ2luLWxlZnQ6OHB4Ij7ihpAgVmVyIG1lbm9zPC9idXR0b24+JzsKICBjb25zdCBmb290ID0gYWN0aW9ucyA\/ICc8ZGl2IGNsYXNzPSJya2Jsb2NrLWZvb3QiPicrYWN0aW9ucysnPC9kaXY+JyA6ICcnOwogIGJvZHkuaW5uZXJIVE1MPXByZWdhbWUrbXlCYW5uZXIrcm93cytmb290OwogIGNvbnN0IG1yPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hNb3JlJyk7CiAgaWYobXIpe21yLm9uY2xpY2s9KCk9Pntfc2NoU3RhdGUucGFnZVNpemU9TWF0aC5taW4oX3NjaFN0YXRlLnBhZ2VTaXplK1NDSF9QQUdFX1NURVAsKF9zY2hTdGF0ZS5sYXN0RGF0YXx8W10pLmxlbmd0aCk7X3JlbmRlclNjaG9vbHNCb2R5KCk7Y29uc3QgbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NoTW9yZScpfHxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NoTGVzcycpO2lmKG0pbS5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J2NlbnRlcid9KTt9O30KICBjb25zdCBscz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NoTGVzcycpOwogIGlmKGxzKXtscy5vbmNsaWNrPSgpPT57X3NjaFN0YXRlLnBhZ2VTaXplPVNDSF9QQUdFX0lOSVRJQUw7X3JlbmRlclNjaG9vbHNCb2R5KCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VzY29sYXMnKT8uc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9O30KfQphc3luYyBmdW5jdGlvbiByZW5kZXJTY2hvb2xzKCl7aWYoIXN1cGEpcmV0dXJuO2NvbnN0IGJvZHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjaG9vbGJvZHknKTtpZighYm9keSlyZXR1cm47CiAgY29uc3Qge2RhdGEsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdnZXRfc2Nob29sX3JhbmtpbmcnKTsKICBjb25zdCBzY2hvb2xzPShlcnJvcnx8IWRhdGEpP1tdOmRhdGEubWFwKHM9Pih7bmFtZTpzLmNvbmN1cnNvLGF2ZzpOdW1iZXIocy5tZWRpYSl8fDAsY291bnQ6cy5wYXJ0aWNpcGFudGVzLHZlcnRpY2FsOnMudmVydGljYWx8fCdtaWxpdGFyZXMnfSkpOwogIF9zY2hTdGF0ZS5sYXN0RGF0YT1zY2hvb2xzOwogIGNvbnN0IF9zdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NodXBkJyk7aWYoX3N1KV9zdS50ZXh0Q29udGVudD0nTcOpZGlhIHJlY2FsY3VsYWRhIGF1dG9tYXRpY2FtZW50ZSDCtyAnK25vd1N0YW1wKCk7CiAgX3JlbmRlclNjaG9vbHNCb2R5KCk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBJTkRJQ0FDQU8KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmFzeW5jIGZ1bmN0aW9uIHJlbmRlclJlZmVycmFsKCl7aWYoIW1lRGF0YSlyZXR1cm47Y29uc3QgY29kZT1tZURhdGEucmVmQ29kZTtpZighY29kZSlyZXR1cm47Y29uc3QgbGluaz1yZWZMaW5rKGNvZGUpOwogIGNvbnN0IGlucD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmbGlua2lucHV0Jyk7aWYoaW5wKWlucC52YWx1ZT1saW5rOwogIC8vIDIwMjYtMDYtMDYgZml4IEJVRy0xMjogYXJnIHJlbm9tZWFkbyBkZSBgY29kZWAgcC8gYHBfY29kZWAgKEZhc2UgQiBtdWRvdSBhc3NpbmF0dXJhIGRhIFJQQykKICBsZXQgbj0n4oCUJzt0cnl7Y29uc3Qge2RhdGEsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdnZXRfcmVmZXJyYWxfY291bnQnLHtwX2NvZGU6Y29kZX0pO2lmKCFlcnJvcil7aWYodHlwZW9mIGRhdGE9PT0nbnVtYmVyJyluPWRhdGE7ZWxzZSBpZihBcnJheS5pc0FycmF5KGRhdGEpJiZkYXRhWzBdKW49T2JqZWN0LnZhbHVlcyhkYXRhWzBdKVswXTtlbHNlIGlmKGRhdGEhPW51bGwpbj1kYXRhO31lbHNle19kYmd3KCdyZWZlcnJhbCBjb3VudCBlcnInLGVycm9yKTt9fWNhdGNoKGUpe19kYmd3KCdyZWZlcnJhbCBjb3VudCcsZSk7fQogIGNvbnN0IGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZmNvdW50Jyk7aWYoYyljLnRleHRDb250ZW50PW47fQpjb25zdCBfcmVmY29weT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmY29weScpOwppZihfcmVmY29weSlfcmVmY29weS5vbmNsaWNrPSgpPT57Y29uc3QgaW5wPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZsaW5raW5wdXQnKTtpZighaW5wfHwhaW5wLnZhbHVlKXJldHVybjtpbnAuZm9jdXMoKTtpbnAuc2VsZWN0KCk7CiAgLy8gMjAyNi0wNi0wNiBmaXggQlVHLTA5OiBmZWVkYmFjayB2aXN1YWwgTk8gYm90w6NvICsgdG9hc3QgKHRvYXN0IHBvZGUgZXN0YXIgYXRyw6FzIGRlIG92ZXJsYXkpCiAgY29uc3Qgb3JpZz1fcmVmY29weS50ZXh0Q29udGVudDsKICBjb25zdCBkb25lPSgpPT57dG9hc3QoJ0xpbmsgY29waWFkbyEg8J+miScpO19yZWZjb3B5LnRleHRDb250ZW50PSfinJMgQ29waWFkbyEnO19yZWZjb3B5LmNsYXNzTGlzdC5hZGQoJ29rJyk7c2V0VGltZW91dCgoKT0+e19yZWZjb3B5LnRleHRDb250ZW50PW9yaWc7X3JlZmNvcHkuY2xhc3NMaXN0LnJlbW92ZSgnb2snKTt9LDIyMDApO307CiAgaWYobmF2aWdhdG9yLmNsaXBib2FyZCYmbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpe25hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGlucC52YWx1ZSkudGhlbihkb25lLCgpPT57dHJ5e2RvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7fWNhdGNoKGUpe31kb25lKCk7fSk7fQogIGVsc2V7dHJ5e2RvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7fWNhdGNoKGUpe31kb25lKCk7fX07CgovKiBMaXN0YSBwZXNzb2FsIGRlIGluZGljYWRvczogbm9tZXMgKyBzdGF0dXMgKHZhbGlkYS9wZW5kZW50ZSkgKyBkYXRhLgogICBSUEMgZ2V0X215X3JlZmVycmFscyBzw7Mgcm9kYSBjb20gc2Vzc8OjbyAocmV2b2tlIGFub24pLgogICBQcmEgY2FkYSBwZW5kZW50ZSwgbW9zdHJhIGJvdMOjbyBkZSBjdXR1Y2FkYSB2aWEgd2EubWUgKHRleHRvIGNvbSAxwrogbm9tZSkuICovCmFzeW5jIGZ1bmN0aW9uIHJlbmRlck15UmVmZXJyYWxzKCl7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteXJlZmxpc3QnKTtpZighYm94KXJldHVybjsKICBsZXQgcm93cz1udWxsOwogIHRyeXtjb25zdCByPWF3YWl0IHN1cGEucnBjKCdnZXRfbXlfcmVmZXJyYWxzJyk7aWYoIXIuZXJyb3Ipcm93cz1yLmRhdGE7ZWxzZSBfZGJndygnbXkgcmVmcyBlcnInLHIuZXJyb3IpO30KICBjYXRjaChlKXtfZGJndygnbXkgcmVmcycsZSk7fQogIGlmKCFBcnJheS5pc0FycmF5KHJvd3MpfHwhcm93cy5sZW5ndGgpewogICAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0ibXlyZWYtZW1wdHkiPk5pbmd1w6ltIGVudHJvdSBwZWxvIHNldSBsaW5rIGFpbmRhLiBNYW5kYSBvIGxpbmsgbm8gZ3J1cG8gZGEgdHVybWEg8J+RhjwvZGl2Pic7CiAgICBjb25zdCBzdW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215cmVmc3VtJyk7aWYoc3VtKXN1bS50ZXh0Q29udGVudD0nJzsKICAgIHJldHVybjsKICB9CiAgY29uc3QgdmFsPXJvd3MuZmlsdGVyKHI9PnIuc3RhdHVzPT09J3ZhbGlkYScpLmxlbmd0aDsKICBjb25zdCBwZW5kPXJvd3MubGVuZ3RoLXZhbDsKICBjb25zdCBzdW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215cmVmc3VtJyk7CiAgaWYoc3VtKXN1bS50ZXh0Q29udGVudD1gJHtyb3dzLmxlbmd0aH0gaW5kaWNhZG8ke3Jvd3MubGVuZ3RoPT09MT8nJzoncyd9IMK3ICR7dmFsfSB2w6FsaWRhJHt2YWw9PT0xPycnOidzJ30gwrcgJHtwZW5kfSBwZW5kZW50ZSR7cGVuZD09PTE\/Jyc6J3MnfWA7CiAgY29uc3QgZm10PWQ9Pnt0cnl7cmV0dXJuIG5ldyBEYXRlKGQpLnRvTG9jYWxlRGF0ZVN0cmluZygncHQtQlInLHtkYXk6JzItZGlnaXQnLG1vbnRoOidzaG9ydCd9KTt9Y2F0Y2goZSl7cmV0dXJuICcnO319OwogIGNvbnN0IGN1dHVjYWRhTXNnPShwcmltZWlybyk9PmBFIGHDrSwgJHtwcmltZWlyb30hIFZpIHF1ZSB2b2PDqiBlbnRyb3Ugbm8gQm9sw6NvIGRhIENvcnVqYSBtYXMgYWluZGEgbsOjbyBwYWxwaXRvdS4gQm9yYSBjcmF2YXIgb3MgcGxhY2FyZXMgZGEgQ29wYSBhbnRlcyBkbyBhcGl0bz8gT3MgMTIgam9nb3MgdMOjbyBsw6E6IGh0dHBzOi8vbWt0LmVzdHJhdGVnaWEuY29tL21pbGl0YXJlcy9ib2xhby9gOwogIGNvbnN0IGl0ZW1zPXJvd3MubWFwKHI9PnsKICAgIGNvbnN0IG5vbWU9ZXNjKHIubm9tZXx8J0FsdW5vJyk7CiAgICBjb25zdCBwcmltZWlybz0oci5ub21lfHwnJykuc3BsaXQoJyAnKVswXXx8J2FtaWdvJzsKICAgIGNvbnN0IGNvbmM9ZXNjKHIuY29uY3Vyc298fCdzZW0gY29uY3Vyc28nKTsKICAgIGNvbnN0IGRhdGE9Zm10KHIuZGF0YSk7CiAgICBjb25zdCBpc1ZhbD1yLnN0YXR1cz09PSd2YWxpZGEnOwogICAgY29uc3QgYmFkZ2U9aXNWYWwKICAgICAgPyAnPHNwYW4gY2xhc3M9Im15cmVmLWJhZGdlIG9rIj7inJMgVsOhbGlkYTwvc3Bhbj4nCiAgICAgIDogJzxzcGFuIGNsYXNzPSJteXJlZi1iYWRnZSB3YWl0Ij7ij7MgUGVuZGVudGU8L3NwYW4+JzsKICAgIC8vIDIwMjYtMDYtMDYgZml4OiBkYXRhLWF0dHJpYnV0ZSBlbSB2ZXogZGUgaHJlZiBkaXJldG8uIHdhLm1lLz90ZXh0PSBuw6NvCiAgICAvLyBwYXNzYSB0ZXh0byBubyBkZXNrdG9wLiBIYW5kbGVyIGRlbGVnYWRvIGFicmUgd2ViLndoYXRzYXBwLmNvbSBubyBkZXNrdG9wICsKICAgIC8vIHdhLm1lIG5vIG1vYmlsZSwgZSBjb3BpYSBwcm8gY2xpcGJvYXJkIGNvbW8gcmVkZSBkZSBzZWd1cmFuw6dhLgogICAgY29uc3QgY3RhPWlzVmFsID8gJycgOgogICAgICBgPGJ1dHRvbiBjbGFzcz0iYnRuIHdoYXRzIHNtIiB0eXBlPSJidXR0b24iIGRhdGEtY3V0dWNhcj0iJHtlbmNvZGVVUklDb21wb25lbnQoY3V0dWNhZGFNc2cocHJpbWVpcm8pKX0iPvCfk7IgQ3V0dWNhcjwvYnV0dG9uPmA7CiAgICByZXR1cm4gYDxkaXYgY2xhc3M9Im15cmVmLXJvdyR7aXNWYWw\/JyB2YWwnOicgcGVuZCd9Ij4KICAgICAgPGRpdiBjbGFzcz0ibXlyZWYtd2hvIj48Yj4ke25vbWV9PC9iPjxzbWFsbD4ke2NvbmN9IMK3ICR7ZGF0YX08L3NtYWxsPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJteXJlZi1tZXRhIj4ke2JhZGdlfSR7Y3RhfTwvZGl2PgogICAgPC9kaXY+YDsKICB9KS5qb2luKCcnKTsKICBib3guaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJteXJlZi1saXN0Ij4ke2l0ZW1zfTwvZGl2PiR7cGVuZD4wP2A8cCBjbGFzcz0ibXlyZWYtaGludCI+8J+SoSA8Yj4ke3BlbmR9IGFtaWcke3BlbmQ9PT0xPydvJzonb3MnfTwvYj4gZW50ciR7cGVuZD09PTE\/J291JzonYXJhbSd9IHBlbG8gc2V1IGxpbmsgbWFzIGFpbmRhIG7Do28gcGFscGl0JHtwZW5kPT09MT8nb3UnOidhcmFtJ30uIENhZGEgcGFscGl0ZSB2YWxpZGEgYSBpbmRpY2HDp8OjbzogdW1hIGN1dHVjYWRhIHJlc29sdmUuPC9wPmA6Jyd9YDsKICAvLyBEZWxlZ2HDp8OjbyBkbyBjbGljayBwcm9zIGJvdMO1ZXMgQ3V0dWNhci4gUGF0dGVybiBzaGFyZS1maXJzdCBjb20gY2xpcGJvYXJkIGZhbGxiYWNrLgogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXR1Y2FyXScpLmZvckVhY2goYnRuPT57CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKT0+ewogICAgICBjb25zdCBtc2c9ZGVjb2RlVVJJQ29tcG9uZW50KGJ0bi5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3V0dWNhcicpfHwnJyk7CiAgICAgIGlmKCFtc2cpcmV0dXJuOwogICAgICAvLyAxKSBDbGlwYm9hcmQgc2VtcHJlCiAgICAgIHRyeXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dClhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChtc2cpO31jYXRjaChfKXt9CiAgICAgIC8vIDIpIG5hdmlnYXRvci5zaGFyZSBxdWFuZG8gZGlzcG9uw612ZWwgKG1vYmlsZSArIGRlc2t0b3AgbW9kZXJubykKICAgICAgaWYobmF2aWdhdG9yLnNoYXJlKXsKICAgICAgICB0cnl7CiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3Iuc2hhcmUoe3RpdGxlOidCb2zDo28gZGEgQ29ydWphJyx0ZXh0Om1zZ30pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH1jYXRjaChlcnIpewogICAgICAgICAgaWYoZXJyJiZlcnIubmFtZT09PSdBYm9ydEVycm9yJylyZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIDMpIEZhbGxiYWNrOiBhYnJlIFdBIFdlYiArIGNsaXBib2FyZCBjb21vIHJlc2VydmEKICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vd2ViLndoYXRzYXBwLmNvbS9zZW5kP3RleHQ9JytlbmNvZGVVUklDb21wb25lbnQobXNnKSwnX2JsYW5rJywnbm9vcGVuZXInKTsKICAgICAgdG9hc3QoJ0N1dHVjYWRhIGNvcGlhZGEhIENvbGEgbm8gV2hhdHNBcHAgZG8gYW1pZ28gKEN0cmwrVikuJyk7CiAgICB9KTsKICB9KTsKfQoKLyogUmFua2luZyBww7pibGljbyBkZSBpbmRpY2HDp8O1ZXMgbmEgSE9NRSAoI3JlZnJhbmtob21lKTogVG9wIDEwIGNvbSBkZXN0YXF1ZQogICBkZSBww7NkaW8gVG9wIDMgZSBsaW5oYSAiVm9jw6oiIHF1YW5kbyBsb2dhZG8uIFJldXNhIGEgbWVzbWEgUlBDIGRvIHJlZmJvYXJkLiAqLwphc3luYyBmdW5jdGlvbiByZW5kZXJSZWZSYW5raW5nSG9tZSgpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmFua2hvbWUnKTtpZighYm94KXJldHVybjsKICBsZXQgZGF0YT1udWxsOwogIHRyeXtjb25zdCByPWF3YWl0IHN1cGEucnBjKCdnZXRfcmVmZXJyYWxfbGVhZGVyYm9hcmRfcHVibGljJyx7bGltOjEwfSk7aWYoIXIuZXJyb3IpZGF0YT1yLmRhdGE7ZWxzZSBfZGJndygncmVmcmFuayBob21lIGVycicsci5lcnJvcik7fQogIGNhdGNoKGUpe19kYmd3KCdyZWZyYW5rIGhvbWUnLGUpO30KICBpZighQXJyYXkuaXNBcnJheShkYXRhKXx8IWRhdGEubGVuZ3RoKXsKICAgIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InJlZnJhbmtob21lLWVtcHR5Ij48c3BhbiBjbGFzcz0icmtwcmVnYW1lLWljIj7wn6aJPC9zcGFuPjxkaXY+PGI+QWluZGEgbmluZ3XDqW0gdGVtIGluZGljYcOnw6NvIHbDoWxpZGEuPC9iPiBPcyAzIGFsdW5vcyBxdWUgbWFpcyBjb252aWRhcmVtIGFtaWdvcyBwcmEgcGFscGl0YXIgbGV2YW0gY2FtaXNhIGRvIEJyYXNpbC4gQWNlc3NlIHN1YSDDoXJlYSBwcmEgcGVnYXIgc2V1IGxpbmsgZGUgaW5kaWNhw6fDo28gZSBjb21lY2UgYSBjYW1wYW5oYS48L2Rpdj48L2Rpdj4nOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBtZVJvdz1tZURhdGE\/ZGF0YS5maW5kKHI9PnIuZWhfbWUpOm51bGw7CiAgY29uc3Qgcm93cz1kYXRhLm1hcChyPT57CiAgICBjb25zdCBtZWRhbD1yLnBvcz09PTE\/J\/CfpYcnOnIucG9zPT09Mj8n8J+liCc6ci5wb3M9PT0zPyfwn6WJJzonJzsKICAgIGNvbnN0IGNscz0ncmVmcm93IHJlZnJvdy1ob21lJysoci5laF9tZT8nIG1lJzonJykrKHIucG9zPD0zPycgcG9kaXVtJzonJyk7CiAgICBjb25zdCBub21lPWVzYyhyLm5vbWV8fCdBbHVubycpOwogICAgY29uc3QgY29uYz1lc2Moci5jb25jdXJzb3x8J3NlbSBjb25jdXJzbycpOwogICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSIke2Nsc30iPjxzcGFuIGNsYXNzPSJycG9zIj4ke21lZGFsfHwnIycrci5wb3N9PC9zcGFuPjxkaXYgY2xhc3M9InJ3aG8iPjxiPiR7bm9tZX0ke3IuZWhfbWU\/JyDCtyA8c3BhbiBjbGFzcz0ibWV5b3UiPlZvY8OqPC9zcGFuPic6Jyd9PC9iPjxzbWFsbD4ke2NvbmN9PC9zbWFsbD48L2Rpdj48c3BhbiBjbGFzcz0icnZhbCI+PGI+JHtyLmluZGljYWNvZXNfdmFsaWRhc308L2I+PHNtYWxsPiR7ci5pbmRpY2Fjb2VzX3ZhbGlkYXM9PT0xPydhbWlnbyc6J2FtaWdvcyd9PC9zbWFsbD48L3NwYW4+PC9kaXY+YDsKICB9KS5qb2luKCcnKTsKICBjb25zdCBteUxpbmUgPSBtZVJvdwogICAgPyAobWVSb3cucG9zPD0zCiAgICAgICAgPyAnPGRpdiBjbGFzcz0icmVmcmFua2hvbWUtZm9vdCBpbiI+PGI+8J+PhiBWb2PDqiBlc3TDoSBlbSAjJyttZVJvdy5wb3MrJzwvYj46IGRlbnRybyBkbyBUb3AgMyBxdWUgbGV2YSBjYW1pc2EgZG8gQnJhc2lsLiBDb250aW51ZSBpbmRpY2FuZG8gcHJhIGdhcmFudGlyLjwvZGl2PicKICAgICAgICA6ICc8ZGl2IGNsYXNzPSJyZWZyYW5raG9tZS1mb290IGluIj48Yj5Wb2PDqiBlc3TDoSBlbSAjJyttZVJvdy5wb3MrJzwvYj4uIENvbnZpZGUgbWFpcyBhbWlnb3MgcHJhIHN1YmlyIGF0w6kgbyBUb3AgMyBlIGxldmFyIHVtYSBjYW1pc2EuPC9kaXY+JykKICAgIDogKG1lRGF0YQogICAgICAgID8gJzxkaXYgY2xhc3M9InJlZnJhbmtob21lLWZvb3Qgb3V0Ij48Yj5Wb2PDqiBhaW5kYSBuw6NvIGFwYXJlY2Ugbm8gcmFua2luZy48L2I+IEFjZXNzZSBzdWEgw6FyZWEgZSBjb21wYXJ0aWxoZSBzZXUgbGluayBjb20gYSB0dXJtYS48L2Rpdj4nCiAgICAgICAgOiAnJyk7CiAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0icmVmYm9hcmQtbGlzdCI+Jytyb3dzKyc8L2Rpdj4nK215TGluZTsKfQoKLyogTWluaS1yYW5raW5nIHDDumJsaWNvIGRlIGluZGljYcOnw7VlczogVG9wIDEwICsgZGVzdGFxdWUgZG8gYWx1bm8gbG9nYWRvLgogICBSb2RhIHPDsyBuYSDDoXJlYSBkbyBhbHVubyAoI3JlZmJvYXJkKS4gUlBDIGdldF9yZWZlcnJhbF9sZWFkZXJib2FyZF9wdWJsaWMKICAgw6kgc2VjdXJpdHktZGVmaW5lciwgcmV0b3JuYSBwb3Mvbm9tZS9jb25jdXJzby92YWxpZGFzL2VoX21lIChzZW0gUElJKS4gKi8KYXN5bmMgZnVuY3Rpb24gcmVuZGVyUmVmZXJyYWxMZWFkZXJib2FyZCgpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmYm9hcmQnKTtpZighYm94KXJldHVybjsKICBsZXQgZGF0YT1udWxsOwogIHRyeXtjb25zdCByPWF3YWl0IHN1cGEucnBjKCdnZXRfcmVmZXJyYWxfbGVhZGVyYm9hcmRfcHVibGljJyx7bGltOjEwfSk7aWYoIXIuZXJyb3IpZGF0YT1yLmRhdGE7ZWxzZSBfZGJndygncmVmIGxlYWRlcmJvYXJkIGVycicsci5lcnJvcik7fQogIGNhdGNoKGUpe19kYmd3KCdyZWYgbGVhZGVyYm9hcmQnLGUpO30KICBpZighQXJyYXkuaXNBcnJheShkYXRhKXx8IWRhdGEubGVuZ3RoKXsKICAgIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InJlZmJvYXJkLWVtcHR5Ij5OaW5ndcOpbSBhaW5kYSB0ZW0gaW5kaWNhw6fDo28gdsOhbGlkYS4gU2VqYSBvIHByaW1laXJvIGEgaW5kaWNhciBlIGRpc3BhcmEgbmEgY29ycmlkYSBwZWxhIGNhbWlzYSBkbyBCcmFzaWwg8J+Hp\/Cfh7c8L2Rpdj4nOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBtZVJvdz1kYXRhLmZpbmQocj0+ci5laF9tZSk7CiAgY29uc3QgdG9wM0N1dD1kYXRhLmxlbmd0aD49Mz9kYXRhWzJdLmluZGljYWNvZXNfdmFsaWRhczowOwogIGxldCBteUluZm89Jyc7CiAgaWYoIW1lUm93KXsKICAgIGNvbnN0IG15VmFsPXBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZjb3VudCcpPy50ZXh0Q29udGVudCwxMCk7CiAgICBpZighaXNOYU4obXlWYWwpJiZteVZhbD4wKXsKICAgICAgY29uc3QgZ2FwPU1hdGgubWF4KDAsdG9wM0N1dC1teVZhbCsxKTsKICAgICAgbXlJbmZvPWA8ZGl2IGNsYXNzPSJyZWZib2FyZC15b3Utb3V0Ij5Wb2PDqiBlc3TDoSBmb3JhIGRvIFRvcCAxMCBjb20gPGI+JHtteVZhbH08L2I+IGluZGljYcOnw6NvJHtteVZhbD09PTE\/Jyc6J8O1ZXMnfS4gRmFsdGFtIDxiPiR7Z2FwfTwvYj4gcGFyYSBjaGVnYXIgbm8gVG9wIDMgZSBsZXZhciB1bWEgY2FtaXNhLjwvZGl2PmA7CiAgICB9IGVsc2UgewogICAgICBteUluZm89YDxkaXYgY2xhc3M9InJlZmJvYXJkLXlvdS1vdXQiPlZvY8OqIGFpbmRhIG7Do28gYXBhcmVjZSBubyByYW5raW5nLiBDb21wYXJ0aWxoZSBzZXUgbGluayBhY2ltYSBlIG9zIDMgYWx1bm9zIHF1ZSBtYWlzIGluZGljYXJlbSBnYW5oYW0gY2FtaXNhIG9maWNpYWwgZG8gQnJhc2lsLjwvZGl2PmA7CiAgICB9CiAgfSBlbHNlIGlmKG1lUm93LnBvcz4zKXsKICAgIGNvbnN0IGdhcD1NYXRoLm1heCgwLHRvcDNDdXQtbWVSb3cuaW5kaWNhY29lc192YWxpZGFzKzEpOwogICAgbXlJbmZvPWA8ZGl2IGNsYXNzPSJyZWZib2FyZC15b3UtaW4iPlZvY8OqIGVzdMOhIGVtIDxiPiMke21lUm93LnBvc308L2I+LiBGYWx0YW0gPGI+JHtnYXB9PC9iPiBpbmRpY2HDp8OjbyR7Z2FwPT09MT8nJzonw7Vlcyd9IHBhcmEgZW50cmFyIG5vIFRvcCAzIGUgbGV2YXIgdW1hIGNhbWlzYS48L2Rpdj5gOwogIH0gZWxzZSB7CiAgICBteUluZm89YDxkaXYgY2xhc3M9InJlZmJvYXJkLXlvdS10b3AiPvCfj4YgVm9jw6ogZXN0w6EgZW0gPGI+IyR7bWVSb3cucG9zfTwvYj46IGRlbnRybyBkbyBUb3AgMyBxdWUgbGV2YSBjYW1pc2Egb2ZpY2lhbCBkbyBCcmFzaWwuIENvbnRpbnVlIGluZGljYW5kbyBwYXJhIGdhcmFudGlyIGEgcG9zacOnw6NvLjwvZGl2PmA7CiAgfQogIGNvbnN0IHJvd3M9ZGF0YS5tYXAocj0+ewogICAgY29uc3QgbWVkYWw9ci5wb3M9PT0xPyfwn6WHJzpyLnBvcz09PTI\/J\/CfpYgnOnIucG9zPT09Mz8n8J+liSc6Jyc7CiAgICBjb25zdCBjbHM9J3JlZnJvdycrKHIuZWhfbWU\/JyBtZSc6JycpKyhyLnBvczw9Mz8nIHBvZGl1bSc6JycpOwogICAgY29uc3Qgbm9tZT1lc2Moci5ub21lfHwnQWx1bm8nKTsKICAgIGNvbnN0IGNvbmM9ZXNjKHIuY29uY3Vyc298fCdzZW0gY29uY3Vyc28nKTsKICAgIHJldHVybiBgPGRpdiBjbGFzcz0iJHtjbHN9Ij48c3BhbiBjbGFzcz0icnBvcyI+JHttZWRhbHx8JyMnK3IucG9zfTwvc3Bhbj48ZGl2IGNsYXNzPSJyd2hvIj48Yj4ke25vbWV9JHtyLmVoX21lPycgwrcgPHNwYW4gY2xhc3M9Im1leW91Ij5Wb2PDqjwvc3Bhbj4nOicnfTwvYj48c21hbGw+JHtjb25jfTwvc21hbGw+PC9kaXY+PHNwYW4gY2xhc3M9InJ2YWwiPjxiPiR7ci5pbmRpY2Fjb2VzX3ZhbGlkYXN9PC9iPjxzbWFsbD4ke3IuaW5kaWNhY29lc192YWxpZGFzPT09MT8nYW1pZ28nOidhbWlnb3MnfTwvc21hbGw+PC9zcGFuPjwvZGl2PmA7CiAgfSkuam9pbignJyk7CiAgYm94LmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVmYm9hcmQtaGVhZCI+PHNwYW4gY2xhc3M9InJiLWV5ZWJyb3ciPlJhbmtpbmcgZGUgaW5kaWNhw6fDtWVzPC9zcGFuPjxzcGFuIGNsYXNzPSJyYi1zdWIiPlRvcCAzIGdhbmhhIGNhbWlzYSBvZmljaWFsIGRvIEJyYXNpbDwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJyZWZib2FyZC1saXN0Ij4ke3Jvd3N9PC9kaXY+JHtteUluZm99YDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIMOBUkVBIERPIEFMVU5PIOKAlCBkYXNoYm9hcmQgcGVzc29hbCwgbWF0ZXJpYWlzIGUgaGlzdMOzcmljby4KICAgUm9kYSBzw7MgcXVhbmRvIF9pc0FsdW5vUGFnZSgpIMOpIHRydWUgKERPTS1ndWFyZGVkIG1lc21vIGFzc2ltKS4KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmFzeW5jIGZ1bmN0aW9uIHJlbmRlckRhc2hib2FyZCgpewogIGlmKCFtZURhdGEpcmV0dXJuOwogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlwYW5lbCcpO2lmKCFib3gpcmV0dXJuOwoKICBsZXQgbXlQdHM9MCxteVBvcz1udWxsLG15Q3JhdmFkYXM9MCx0b3RhbD0wOwogIHRyeXsKICAgIGNvbnN0IHtkYXRhOm15fT1hd2FpdCBzdXBhLnJwYygnZ2V0X215X3JhbmsnKTsKICAgIGlmKG15KXtteVBvcz1teS5wb3NpY2FvfHxudWxsO215UHRzPW15LnB0c3x8MDtteUNyYXZhZGFzPW15LmNyYXZhZGFzfHwwO3RvdGFsPW15LnRvdGFsfHwwO30KICAgIGNvbnN0IHtkYXRhOnN0fT1hd2FpdCBzdXBhLnJwYygnZ2V0X3N0YXRzJyk7CiAgICBpZihzdCYmc3RbMF0mJnN0WzBdLnBhcnRpY2lwYW50ZXMhPW51bGwpdG90YWw9c3RbMF0ucGFydGljaXBhbnRlczsKICB9Y2F0Y2goZSl7X2RiZ3coJ2Rhc2hib2FyZCByYW5raW5nL3N0YXRzJyxlKTt9CgogIGxldCBteVNjaG9vbFBvcz1udWxsOwogIHRyeXsKICAgIGNvbnN0IHtkYXRhfT1hd2FpdCBzdXBhLnJwYygnZ2V0X3NjaG9vbF9yYW5raW5nJyk7CiAgICBpZihkYXRhKXtjb25zdCBpZHg9ZGF0YS5maW5kSW5kZXgocz0+cy5jb25jdXJzbz09PShtZURhdGEuY29uY3x8JycpKTtpZihpZHg+PTApbXlTY2hvb2xQb3M9aWR4KzE7fQogIH1jYXRjaChlKXtfZGJndygnZGFzaGJvYXJkIHNjaG9vbCByYW5raW5nJyxlKTt9CgogIC8vIFBvc2nDp8OjbyArIHRvdGFsIGRlIGluZGljYWRvcmVzIHZpYSBSUEMgZGVkaWNhZGEgKDAwMTgpLiBGYWxsYmFjayBwLyBnZXRfcmVmZXJyYWxfY291bnQgYW50aWdvLgogIGxldCByZWZzPTAsIHJlZlBvcz1udWxsLCByZWZUb3RhbD0wOwogIHRyeXsKICAgIGNvbnN0IHtkYXRhLCBlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2dldF9teV9yZWZlcnJhbF9wb3NpdGlvbicpOwogICAgaWYoIWVycm9yICYmIGRhdGEpewogICAgICBjb25zdCByb3cgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YVswXSA6IGRhdGE7CiAgICAgIGlmKHJvdyl7CiAgICAgICAgcmVmcyAgICAgPSBOdW1iZXIocm93LnZhbGlkYXMpfHwwOwogICAgICAgIHJlZlBvcyAgID0gKHJvdy5wb3M9PW51bGwpID8gbnVsbCA6IE51bWJlcihyb3cucG9zKTsKICAgICAgICByZWZUb3RhbCA9IE51bWJlcihyb3cudG90YWxfaW5kaWNhZG9yZXMpfHwwOwogICAgICB9CiAgICB9IGVsc2UgaWYoZXJyb3IpIF9kYmd3KCdkYXNoYm9hcmQgcmVmIHBvc2l0aW9uIGVycicsZXJyb3IpOwogIH1jYXRjaChlKXtfZGJndygnZGFzaGJvYXJkIHJlZiBwb3NpdGlvbicsZSk7fQogIC8vIEZhbGxiYWNrIHNlIDAwMTggYWluZGEgbsOjbyBhcGxpY2FkYTogcGVnYSBzw7MgbyBjb3VudAogIGlmKCFyZWZzICYmIG1lRGF0YS5yZWZDb2RlKXsKICAgIHRyeXtjb25zdCB7ZGF0YX09YXdhaXQgc3VwYS5ycGMoJ2dldF9yZWZlcnJhbF9jb3VudCcse2NvZGU6bWVEYXRhLnJlZkNvZGV9KTsKICAgICAgaWYodHlwZW9mIGRhdGE9PT0nbnVtYmVyJylyZWZzPWRhdGE7CiAgICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShkYXRhKSYmZGF0YVswXSlyZWZzPU51bWJlcihPYmplY3QudmFsdWVzKGRhdGFbMF0pWzBdKXx8MDsKICAgICAgZWxzZSBpZihkYXRhIT1udWxsKXJlZnM9TnVtYmVyKGRhdGEpfHwwOwogICAgfWNhdGNoKGUpe19kYmd3KCdkYXNoYm9hcmQgcmVmZXJyYWwgY291bnQgZmFsbGJhY2snLGUpO30KICB9CgogIGNvbnN0IHBhbHBpdGVzRmVpdG9zPU9iamVjdC5rZXlzKG1lRGF0YS5wcmVkaWN0aW9uc3x8e30pLmxlbmd0aDsKICBjb25zdCBlbGlnaXZlbD1teVB0cz49Y2ZnLnJhZmZsZU1pbjsKICAvLyBTdWItbGFiZWwgZG8gY2FyZCBkZSBpbmRpY2HDp8O1ZXM6IHByaW9yaXphIHBvc2nDp8OjbyBxdWFuZG8gaMOhIHJhbmtpbmcgcmVhbC4KICBsZXQgcmVmU3ViOwogIGlmKHJlZnM9PT0wKXsKICAgIHJlZlN1Yj0nY29tcGFydGlsaGUgc2V1IGxpbmsgcC8gZW50cmFyIG5vIHJhbmtpbmcnOwogIH0gZWxzZSBpZihyZWZQb3MhPW51bGwgJiYgcmVmVG90YWw+MCl7CiAgICBjb25zdCBtZWRhbCA9IHJlZlBvcz09PTEgPyAn8J+lhycgOiByZWZQb3M9PT0yID8gJ\/CfpYgnIDogcmVmUG9zPT09MyA\/ICfwn6WJJyA6ICcnOwogICAgY29uc3QgaW5Ub3AzID0gcmVmUG9zPD0zID8gJyDCtyA8YiBzdHlsZT0iY29sb3I6dmFyKC0tdGVhbC1kKSI+Y2FtaXNhIGRvIEJyYXNpbCDwn4en8J+HtzwvYj4nIDogJyc7CiAgICByZWZTdWIgPSBgJHttZWRhbD9tZWRhbCsnICc6Jyd9PGI+IyR7cmVmUG9zfTwvYj4gZGUgJHtyZWZUb3RhbH0gaW5kaWNhZG9yZXMke2luVG9wM31gOwogIH0gZWxzZSB7CiAgICByZWZTdWIgPSBgYW1pZ28ke3JlZnM9PT0xPycnOidzJ30gcXVlIGrDoSBwYWxwaXQke3JlZnM9PT0xPydvdSc6J2FyYW0nfWA7CiAgfQoKICAvLyAyMDI2LTA2LTA2OiBzZW0gcG9udG8gcHJhIG5pbmd1w6ltIGFpbmRhPyBNb3N0cmEgIuKAlCIgbm8gcmFuay9lc2NvbGEgcHJhCiAgLy8gbsOjbyBleGliaXIgcG9zacOnw6NvIGFsZmFiw6l0aWNhIGNvbW8gc2UgZm9zc2UgY29tcGV0aXRpdmEuCiAgY29uc3QgcmFua0NvcGFTdGFydCA9IG15UHRzID4gMDsKICBjb25zdCByYW5rRGlzcCA9IHJhbmtDb3BhU3RhcnQgJiYgbXlQb3MgPyAnIycrbXlQb3MgOiAn4oCUJzsKICBjb25zdCByYW5rU3ViICA9IHJhbmtDb3BhU3RhcnQKICAgID8gYGRlICR7dG90YWx8fCfigKYnfSBwYXJ0aWNpcGFudGVzYAogICAgOiBgQWd1YXJkYW5kbyAxwrogam9nbyBkYSBDb3BhICgke3RvdGFsfHwn4oCmJ30gaW5zY3JpdG9zKWA7CiAgY29uc3Qgc2Nob29sRGlzcCA9IHJhbmtDb3BhU3RhcnQgJiYgbXlTY2hvb2xQb3MgPyAnIycrbXlTY2hvb2xQb3MgOiAn4oCUJzsKICBjb25zdCBzY2hvb2xTdWIgID0gcmFua0NvcGFTdGFydAogICAgPyBlc2MobWVEYXRhLmNvbmN8fCdTZW0gY29uY3Vyc28nKQogICAgOiBgJHtlc2MobWVEYXRhLmNvbmN8fCdTZW0gY29uY3Vyc28nKX0gwrcgY29tZcOnYSBjb20gYSBDb3BhYDsKCiAgYm94LmlubmVySFRNTD1gCiAgICA8ZGl2IGNsYXNzPSJkYXNoZ3JpZCI+CiAgICAgIDxkaXYgY2xhc3M9ImRhc2ggaGwiPjxzcGFuIGNsYXNzPSJkbCI+TWV1cyBwb250b3M8L3NwYW4+PHNwYW4gY2xhc3M9ImR2Ij4ke215UHRzfTwvc3Bhbj48c3BhbiBjbGFzcz0iZHMiPiR7bXlDcmF2YWRhc30gcGxhY2FyJHtteUNyYXZhZGFzPT09MT8nJzonZXMnfSBjcmF2YWRvJHtteUNyYXZhZGFzPT09MT8nJzoncyd9JHtlbGlnaXZlbD8nIMK3IDxiIHN0eWxlPSJjb2xvcjp2YXIoLS1nb2xkKSI+4piFIG5vIHNvcnRlaW88L2I+JzonJ308L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRhc2giPjxzcGFuIGNsYXNzPSJkbCI+UmFua2luZyBnZXJhbDwvc3Bhbj48c3BhbiBjbGFzcz0iZHYiPiR7cmFua0Rpc3B9PC9zcGFuPjxzcGFuIGNsYXNzPSJkcyI+JHtyYW5rU3VifTwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGFzaCI+PHNwYW4gY2xhc3M9ImRsIj5OYSBtaW5oYSBlc2NvbGE8L3NwYW4+PHNwYW4gY2xhc3M9ImR2Ij4ke3NjaG9vbERpc3B9PC9zcGFuPjxzcGFuIGNsYXNzPSJkcyI+JHtzY2hvb2xTdWJ9PC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkYXNoIj48c3BhbiBjbGFzcz0iZGwiPlBhbHBpdGVzIGVudmlhZG9zPC9zcGFuPjxzcGFuIGNsYXNzPSJkdiI+JHtwYWxwaXRlc0ZlaXRvc30vMTI8L3NwYW4+PHNwYW4gY2xhc3M9ImRzIj5kb3Mgam9nb3MgZG8gYm9sw6NvPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkYXNoIj48c3BhbiBjbGFzcz0iZGwiPkluZGljYcOnw7VlcyB2w6FsaWRhczwvc3Bhbj48c3BhbiBjbGFzcz0iZHYiPiR7cmVmc308L3NwYW4+PHNwYW4gY2xhc3M9ImRzIj4ke3JlZlN1Yn08L3NwYW4+PC9kaXY+CiAgICA8L2Rpdj5gOwp9CgpmdW5jdGlvbiByZW5kZXJTdHVkeU1hdGVyaWFscygpewogIGlmKCFtZURhdGEpcmV0dXJuOwogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3R1ZHlib3gnKTtpZighYm94KXJldHVybjsKCiAgY29uc3QgcGFscGl0ZXNGZWl0b3M9T2JqZWN0LmtleXMobWVEYXRhLnByZWRpY3Rpb25zfHx7fSkubGVuZ3RoOwogIGNvbnN0IGhhc1BhbHBpdGU9cGFscGl0ZXNGZWl0b3M+MDsKICBjb25zdCBwYWxwaXRlc1Jlc3RhbnRlcz1NYXRoLm1heCgwLDEyLXBhbHBpdGVzRmVpdG9zKTsKCiAgLy8gNCBtYXRlcmlhaXMsIGVzdHJ1dHVyYWRvcyBjb21vICJ0cm9waHkgY29sbGVjdGlvbiIg4oCUIGhlcm8gKGJhbmNvKSArIHNlY29uZGFyeSAoc3ByaW50cy9lYm9vaykKICBjb25zdCB2ZXJ0aWNhaXM9WwogICAge3NsdWc6J2VtJyxsYWJlbDonRXN0cmF0w6lnaWEgTWlsaXRhcmVzJyxraWNrZXI6J0NhcnJlaXJhIG1pbGl0YXInLGNhcmRzOlsKICAgICAge3NsdWc6J2JhbmNvX3F1ZXN0b2VzJyxpYzon8J+OrycsdGl0bGU6J0JhbmNvIGRlIFF1ZXN0w7VlcycsCiAgICAgICBzdWI6J1F1ZXN0w7VlcyBjb21lbnRhZGFzIGRhcyBwcmluY2lwYWlzIGJhbmNhcyBtaWxpdGFyZXM6IEVzUENFeCwgQUZBLCBFRk9NTSwgRUFHUyBlIG1haXMuJywKICAgICAgIGhlcm86dHJ1ZSwKICAgICAgIHN0YXRzOlt7bjonKzExMG1pbCcsbDoncXVlc3TDtWVzJ30se246JysxNScsbDonZXNjb2xhcyd9LHtuOicyNC83JyxsOidhY2Vzc28nfV0sCiAgICAgICBjdGE6J1RyZWluYXIgYWdvcmEg4oaSJ30sCiAgICAgIHtzbHVnOidzcHJpbnRzJyxpYzon4pqhJyx0aXRsZTonU3ByaW50cyBkZSBRdWVzdMO1ZXMnLAogICAgICAgc3ViOidNYXJhdG9uYXMgdGVtw6F0aWNhcyBkb3MgY29udGXDumRvcyBxdWUgbWFpcyBjYWVtLiBGb2NvIG5vIHF1ZSBpbXBvcnRhLicsCiAgICAgICBzdGF0czpbe246JzEwJyxsOidzcHJpbnRzJ30se246J01pbGhhcmVzJyxsOidkZSBxdWVzdMO1ZXMnfV0sCiAgICAgICBjdGE6J0NvbWXDp2FyIHNwcmludCDihpInfQogICAgXX0sCiAgICB7c2x1ZzonZXYnLGxhYmVsOidFc3RyYXTDqWdpYSBWZXN0aWJ1bGFyZXMnLGtpY2tlcjonRU5FTSBlIHZlc3RpYnVsYXJlcycsY2FyZHM6WwogICAgICB7c2x1ZzonYmFuY29fcXVlc3RvZXMnLGljOifwn46vJyx0aXRsZTonQmFuY28gZGUgUXVlc3TDtWVzJywKICAgICAgIHN1YjonUXVlc3TDtWVzIGRvIEVORU0sIEZVVkVTVCwgVU5JQ0FNUCBlIHByaW5jaXBhaXMgdmVzdGlidWxhcmVzLCBjb21lbnRhZGFzIHBvciBwcm9mZXNzb3Jlcy4nLAogICAgICAgaGVybzp0cnVlLAogICAgICAgc3RhdHM6W3tuOicrMzAwbWlsJyxsOidxdWVzdMO1ZXMnfSx7bjonMzArJyxsOid2ZXN0aWJ1bGFyZXMnfSx7bjonMjQvNycsbDonYWNlc3NvJ31dLAogICAgICAgY3RhOidUcmVpbmFyIGFnb3JhIOKGkid9LAogICAgICB7c2x1ZzonZ3VpYV9lbmVtJyxpYzon8J+TmCcsdGl0bGU6J0Vib29rIEd1aWEgRU5FTScsCiAgICAgICBzdWI6J1BERiBncmF0dWl0bzogZXN0cmF0w6lnaWEgZGUgcHJvdmEsIHJlZGHDp8OjbyAxMDAwIGUgZ2VzdMOjbyBkbyB0ZW1wbyBubyBkaWEuJywKICAgICAgIHN0YXRzOlt7bjonMTgwcCcsbDonUERGJ30se246JzQgw6FyZWFzJyxsOidkbyBFTkVNJ31dLAogICAgICAgY3RhOidCYWl4YXIgUERGIOKGkid9CiAgICBdfQogIF07CgogIC8vIEZhbGxiYWNrIGRlIGxpbmtzOiBzdHVkeUxpbmtzW3ZlcnQrJ18nK2NhcmRdIC0+IHN0dWR5TGlua3NbdmVydF0gLT4gc3R1ZHlMaW5rcy5hbGwKICBjb25zdCBzPXN0dWR5TGlua3N8fHt9OwogIGNvbnN0IGxpbmtGb3I9KHZlcnQsY2FyZCk9PnsKICAgIGlmKHNbdmVydCsnXycrY2FyZF0pcmV0dXJuIHNbdmVydCsnXycrY2FyZF07CiAgICBjb25zdCB2PXNbdmVydF07CiAgICBpZih0eXBlb2Ygdj09PSdzdHJpbmcnJiZ2KXJldHVybiB2OwogICAgaWYodiYmdHlwZW9mIHY9PT0nb2JqZWN0JylyZXR1cm4gdltjYXJkXXx8di5hbGx8fG51bGw7CiAgICByZXR1cm4gcy5hbGx8fG51bGw7CiAgfTsKCiAgLy8gUEFDSyBOT1RJQ0Ug4oCUIGVzdGFkbyBkZSBkZXNibG9xdWVpbwogIGNvbnN0IHBhY2sgPSBoYXNQYWxwaXRlCiAgICA\/IGA8ZGl2IGNsYXNzPSJzdHVkeXBhY2siPgogICAgICAgIDxzcGFuIGNsYXNzPSJwYWNrLWljb24iPvCfj4Y8L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0icGFjay1jb3B5Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhY2stZXllYnJvdyI+UGFjayBkZXNibG9xdWVhZG88L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhY2stdGl0bGUiPlZvY8OqIHRlbSA0IG1hdGVyaWFpcyBncsOhdGlzIGF0w6kgbyBmaW0gZGEgQ29wYTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icGFjay1zdWIiPkLDtG51cyBwb3IgZXN0YXIgbm8gQm9sw6NvIGRhIENvcnVqYS4gVXNlIMOgIHZvbnRhZGUuIFR1ZG8gZG8gRXN0cmF0w6lnaWEgTWlsaXRhcmVzIGUgVmVzdGlidWxhcmVzLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InBhY2stc3RhdHMiPgogICAgICAgICAgPGRpdiBjbGFzcz0icGFjay1zdGF0Ij48c3BhbiBjbGFzcz0icGFjay1zdGF0LW4iPis0MTBrPC9zcGFuPjxzcGFuIGNsYXNzPSJwYWNrLXN0YXQtbCI+cXVlc3TDtWVzPC9zcGFuPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icGFjay1zdGF0Ij48c3BhbiBjbGFzcz0icGFjay1zdGF0LW4iPjEwPC9zcGFuPjxzcGFuIGNsYXNzPSJwYWNrLXN0YXQtbCI+c3ByaW50czwvc3Bhbj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhY2stc3RhdCI+PHNwYW4gY2xhc3M9InBhY2stc3RhdC1uIj5QREY8L3NwYW4+PHNwYW4gY2xhc3M9InBhY2stc3RhdC1sIj5ndWlhIEVORU08L3NwYW4+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PmAKICAgIDogYDxkaXYgY2xhc3M9InN0dWR5cGFjayBsb2NrZWQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJwYWNrLWljb24iPvCflJM8L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0icGFjay1jb3B5Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhY2stZXllYnJvdyI+UGFjayBibG9xdWVhZG88L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhY2stdGl0bGUiPkZhbHRhIDEgcGFscGl0ZSBwcmEgbGliZXJhciA0IG1hdGVyaWFpcyBncsOhdGlzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWNrLXN1YiI+Q3JhdmUgcXVhbHF1ZXIgcGxhY2FyIGRvcyAxMiBqb2dvcyBkbyBib2zDo28gcHJhIGRlc2Jsb3F1ZWFyLiDDiSA1IHNlZ3VuZG9zLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxhIGhyZWY9IiNtYXRjaGVzIiBjbGFzcz0iYnRuIGdvbGQgcGFjay1jdGEtZ28iIGlkPSJzdHVkeUdvdG9NYXRjaGVzIj5QYWxwaXRhciBhZ29yYSDihpE8L2E+CiAgICAgIDwvZGl2PmA7CgogIC8vIENBUkQgcmVuZGVyZXIg4oCUIGhlcm8gKGNvbSBjb3ZlciBjb2xvcmlkYSkgdnMgc2Vjb25kYXJ5IChjb21wYWN0bykKICBjb25zdCByZW5kZXJDYXJkID0gKHYsYyk9PnsKICAgIGNvbnN0IHUgPSBoYXNQYWxwaXRlID8gbGlua0Zvcih2LnNsdWcsYy5zbHVnKSA6IG51bGw7CiAgICBjb25zdCBidG5UeHQgPSAhaGFzUGFscGl0ZSA\/ICfwn5SSIEZhbHRhIDEgcGFscGl0ZScgOiAodSA\/IGMuY3RhIDogJ0VtIGJyZXZlJyk7CiAgICBjb25zdCBidG5DbHMgPSAoIWhhc1BhbHBpdGUgfHwgIXUpID8gJ2J0biBnaG9zdCBzYy1idG4nIDogJ2J0biBnb2xkIHNjLWJ0bic7CiAgICBjb25zdCBidG5UYWcgPSB1ID8gJ2EnIDogJ2J1dHRvbic7CiAgICBjb25zdCBidG5BdHRyID0gdSA\/IGBocmVmPSIke2VzYyh1KX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyImAgOiAnZGlzYWJsZWQnOwogICAgY29uc3QgbG9ja0JhZGdlID0gaGFzUGFscGl0ZSA\/ICcnIDogJzxkaXYgY2xhc3M9InNjLWxvY2tiYWRnZSI+RGVzYmxvcXVlaWU8L2Rpdj4nOwogICAgY29uc3Qgc3RhdHNIdG1sID0gKGMuc3RhdHN8fFtdKS5tYXAoc3QgPT4KICAgICAgYDxkaXYgY2xhc3M9InNjLXN0YXQiPjxzcGFuIGNsYXNzPSJzYy1zdGF0LW4iPiR7ZXNjKHN0Lm4pfTwvc3Bhbj48c3BhbiBjbGFzcz0ic2Mtc3RhdC1sIj4ke2VzYyhzdC5sKX08L3NwYW4+PC9kaXY+YAogICAgKS5qb2luKCcnKTsKCiAgICBpZihjLmhlcm8pewogICAgICByZXR1cm4gYDxkaXYgY2xhc3M9InN0dWR5Y2FyZCBmZWF0IHN2LSR7di5zbHVnfSR7aGFzUGFscGl0ZT8nJzonIGxvY2tlZCd9Ij4KICAgICAgICAke2xvY2tCYWRnZX0KICAgICAgICA8ZGl2IGNsYXNzPSJzYy1jb3ZlciI+PHNwYW4gY2xhc3M9InNjLWNvdmVyLWljIj4ke2MuaWN9PC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNjLWJvZHkiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2MtdGl0bGUiPiR7ZXNjKGMudGl0bGUpfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2Mtc3ViIj4ke2VzYyhjLnN1Yil9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzYy1zdGF0cyI+JHtzdGF0c0h0bWx9PC9kaXY+CiAgICAgICAgICA8JHtidG5UYWd9IGNsYXNzPSIke2J0bkNsc30iICR7YnRuQXR0cn0+JHtidG5UeHR9PC8ke2J0blRhZ30+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PmA7CiAgICB9CiAgICByZXR1cm4gYDxkaXYgY2xhc3M9InN0dWR5Y2FyZCBzZWNvbmRhcnkgc3YtJHt2LnNsdWd9JHtoYXNQYWxwaXRlPycnOicgbG9ja2VkJ30iPgogICAgICAke2xvY2tCYWRnZX0KICAgICAgPGRpdiBjbGFzcz0ic2Mtc3RyaXAiPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzYy1pbm5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2MtaGVhZCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic2MtaWMiPiR7Yy5pY308L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic2MtdGl0bGUiPiR7ZXNjKGMudGl0bGUpfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzYy1zdWIiPiR7ZXNjKGMuc3ViKX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzYy1zdGF0cyI+JHtzdGF0c0h0bWx9PC9kaXY+CiAgICAgICAgPCR7YnRuVGFnfSBjbGFzcz0iJHtidG5DbHN9IiAke2J0bkF0dHJ9PiR7YnRuVHh0fTwvJHtidG5UYWd9PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PmA7CiAgfTsKCiAgY29uc3QgcmVuZGVyVmVydCA9ICh2KSA9PiB7CiAgICBjb25zdCBjYXJkcyA9IHYuY2FyZHMubWFwKGMgPT4gcmVuZGVyQ2FyZCh2LGMpKS5qb2luKCcnKTsKICAgIHJldHVybiBgPGRpdiBjbGFzcz0ic3R1ZHl2ZXJ0IHN2LSR7di5zbHVnfSI+CiAgICAgIDxkaXYgY2xhc3M9InN2LWhlYWQiPgogICAgICAgIDxkaXYgY2xhc3M9InN2LWJhZGdlIHN2LSR7di5zbHVnfSI+JHt2LmxhYmVsfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN2LWtpY2tlciI+JHt2LmtpY2tlcn08L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InN0dWR5Z3JpZCI+JHtjYXJkc308L2Rpdj4KICAgIDwvZGl2PmA7CiAgfTsKCiAgLy8gQ3Jvc3MtcHJvbW86IHZvbHRhIHByb3MgcGFscGl0ZXMgc2UgYWluZGEgZmFsdGEgY3JhdmFyIGpvZ29zCiAgY29uc3QgZm9vdGVyID0gKGhhc1BhbHBpdGUgJiYgcGFscGl0ZXNSZXN0YW50ZXMgPiAwKQogICAgPyBgPGRpdiBjbGFzcz0ic3R1ZHlmb290ZXIiPkFpbmRhIGZhbHRhIGNyYXZhciA8Yj4ke3BhbHBpdGVzUmVzdGFudGVzfSBqb2dvJHtwYWxwaXRlc1Jlc3RhbnRlcz09PTE\/Jyc6J3MnfTwvYj4gZG9zIDEyIGRvIGJvbMOjby4gPGEgaHJlZj0iI21hdGNoZXMiIGlkPSJzdHVkeUJhY2tNYXRjaGVzIj5Wb2x0YXIgcHJvcyBwYWxwaXRlcyDihpE8L2E+PC9kaXY+YAogICAgOiAnJzsKCiAgYm94LmlubmVySFRNTCA9IHBhY2sgKyBgPGRpdiBjbGFzcz0ic3R1ZHl2ZXJ0aWNhbHMiPiR7dmVydGljYWlzLm1hcChyZW5kZXJWZXJ0KS5qb2luKCcnKX08L2Rpdj5gICsgZm9vdGVyOwoKICAvLyBXaXJlIHNtb290aC1zY3JvbGwgZG9zIENUQXMgaW50ZXJub3MKICBjb25zdCBnb3RvTWF0Y2hlcyA9IChlKSA9PiB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hlcycpPy5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J3N0YXJ0J30pOwogIH07CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0dWR5R290b01hdGNoZXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnb3RvTWF0Y2hlcyk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0dWR5QmFja01hdGNoZXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnb3RvTWF0Y2hlcyk7Cn0KCmZ1bmN0aW9uIHJlbmRlckhpc3RvcnkoKXsKICBpZighbWVEYXRhKXJldHVybjsKICBjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcnknKTtpZighYm94KXJldHVybjsKCiAgY29uc3QgY2xvc2VkPWNmZy5tYXRjaGVzLmZpbHRlcihtPT5pc0Nsb3NlZChtKSk7CiAgaWYoIWNsb3NlZC5sZW5ndGgpewogICAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkEgQ29wYSBhaW5kYSBuw6NvIGNvbWXDp291LiBRdWFuZG8gb3Mgam9nb3Mgcm9sYXJlbSwgc2V1IGRlc2VtcGVuaG8gYXBhcmVjZSBhcXVpIGpvZ28gYSBqb2dvLjwvZGl2Pic7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IGl0ZW1zPWNsb3NlZC5tYXAobT0+ewogICAgY29uc3QgcmVzPWNmZy5yZXN1bHRzW20uaWRdLHByZWQ9bWVEYXRhLnByZWRpY3Rpb25zW20uaWRdOwogICAgY29uc3QgaGFzUmVzPXJlcyYmcmVzLmghPW51bGwmJnJlcy5hIT1udWxsOwogICAgY29uc3Qgc2M9aGFzUmVzP3BvaW50c0ZvcihwcmVkLHJlcyxtLmZyKTpudWxsOwogICAgY29uc3QgaW5mbz1yZXN1bHRJbmZvKHNjLG0uZnIpOwogICAgY29uc3QgY2xzPWluZm8\/aW5mby5jbHM6J25vcmVzdWx0JzsKICAgIGNvbnN0IHB0c0Jsb2NrPWhhc1Jlcz9gPHNwYW4gY2xhc3M9ImhwIj4rJHtzYy5wdHN9PHNtYWxsPnB0czwvc21hbGw+PC9zcGFuPmA6JzxzcGFuIGNsYXNzPSJocCBwZW5kaW5nIj5BZ3VhcmRhbmRvIHJlc3VsdGFkbzwvc3Bhbj4nOwogICAgY29uc3QgcGFscGl0ZT1wcmVkP2A8Yj4ke3ByZWQuaH3DlyR7cHJlZC5hfTwvYj5gOic8c3BhbiBjbGFzcz0ibXV0ZWQiPlNlbSBwYWxwaXRlPC9zcGFuPic7CiAgICBjb25zdCBvZmljaWFsPWhhc1Jlcz9gPGI+JHtyZXMuaH3DlyR7cmVzLmF9PC9iPmA6JzxzcGFuIGNsYXNzPSJtdXRlZCI+4oCUPC9zcGFuPic7CiAgICByZXR1cm4gYDxkaXYgY2xhc3M9Imhpc3QgJHtjbHN9Ij4KICAgICAgPGRpdiBjbGFzcz0iaGQiPjxzcGFuIGNsYXNzPSJobSI+JHtlc2MobS5oWzBdKX0gw5cgJHtlc2MobS5hWzBdKX08L3NwYW4+PHNwYW4gY2xhc3M9ImhzIj4ke2VzYyhtLnNlbCl9IMK3ICR7Zm10RGF0ZShtLmspfSR7bS5mcj8nIMK3IDxiPjLDlzwvYj4nOicnfTwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaHIiPjxzcGFuPk9maWNpYWw6ICR7b2ZpY2lhbH08L3NwYW4+PHNwYW4+U2V1IHBhbHBpdGU6ICR7cGFscGl0ZX08L3NwYW4+JHtwdHNCbG9ja308L2Rpdj4KICAgICAgJHtpbmZvP2A8ZGl2IGNsYXNzPSJoaSI+JHtpbmZvLmljfSAke2luZm8ubGFiZWx9PC9kaXY+YDonJ30KICAgIDwvZGl2PmA7CiAgfSkuam9pbignJyk7CiAgYm94LmlubmVySFRNTD1pdGVtczsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEFETUlOIFBBTkVMIOKAlCBww6FnaW5hIC9hZG1pbi8gZGVkaWNhZGEKICAgUm90ZWFtZW50byB2aWEgaGFzaDsgY2FkYSBzZcOnw6NvIGNhcnJlZ2EgbGF6eS4KICAgRjE6IGJhY2tlbmQgKFJQQ3MgasOhIGFwbGljYWRhcykKICAgRjI6IGxheW91dCArIGF1dGggZ2F0ZSArIHJvdGVhbWVudG8KICAgRjM6IFZpc8OjbyBnZXJhbCAvIEtQSXMKICAgRjQ6IEFsdW5vcyAobWFzdGVyICsgZHJpbGwtZG93biArIGVkaXQgY29uY3Vyc28pCiAgIEY1LUY5OiByYW5raW5nLCBlc2NvbGFzLCBqb2dvcywgc29ydGVpb3MsIGluZGljYcOnw7VlcywgY29uZmlnCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpmdW5jdGlvbiBfYWRtaW5HYXRlU3RlcChtc2cpewogIF9kYmcoJ1thZG1pbl0nLG1zZyk7CiAgY29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluR2F0ZU1zZycpOwogIGlmKGVsKWVsLnRleHRDb250ZW50PW1zZzsKfQpmdW5jdGlvbiBfYWRtaW5HYXRlRmFpbChtc2csb3B0cyl7CiAgX2RiZ3coJ1thZG1pbiBnYXRlIGZhaWxdJyxtc2cpOwogIGNvbnN0IGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbkdhdGVNc2cnKTsKICBjb25zdCBhdXRvPW9wdHMmJm9wdHMuYXV0b1JlZGlyZWN0IT09ZmFsc2U7CiAgaWYoZWwpewogICAgZWwuZGF0YXNldC5yZXNvbHZlZD0nMSc7CiAgICBsZXQgaHRtbD1lc2MobXNnKTsKICAgIGh0bWwrPSc8YnI+PGJyPjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwIj4nOwogICAgaHRtbCs9JzxhIGhyZWY9IicrKHdpbmRvdy5fX0JPTEFPX0FDRVNTQVJfVVJMfHwnIycpKyciIHN0eWxlPSJiYWNrZ3JvdW5kOiNlM2E1MWY7Y29sb3I6IzVhNDIwOTtwYWRkaW5nOjlweCAxNnB4O2JvcmRlci1yYWRpdXM6OXB4O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OjgwMDtmb250LXNpemU6MTNweCI+SXIgcGFyYSBBY2Vzc2FyPC9hPic7CiAgICBodG1sKz0nPGEgaHJlZj0iamF2YXNjcmlwdDpsb2NhdGlvbi5yZWxvYWQoKSIgc3R5bGU9ImJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpO2NvbG9yOiNmZmY7cGFkZGluZzo5cHggMTZweDtib3JkZXItcmFkaXVzOjlweDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjEzcHg7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKSI+UmVjYXJyZWdhcjwvYT4nOwogICAgaWYoc3VwYSl7CiAgICAgIGh0bWwrPSc8YSBocmVmPSJqYXZhc2NyaXB0Oihhc3luYygpPT57YXdhaXQgd2luZG93LnN1cGFiYXNlJiZ3aW5kb3cuc3VwYWJhc2UuYXV0aCYmd2luZG93LnN1cGFiYXNlLmF1dGguc2lnbk91dCgpO2xvY2F0aW9uLmhyZWY9d2luZG93Ll9fQk9MQU9fQUNFU1NBUl9VUkx8fFwnXCd9KSgpIiBzdHlsZT0iYmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMik7Y29sb3I6I2ZmZjtwYWRkaW5nOjlweCAxNnB4O2JvcmRlci1yYWRpdXM6OXB4O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTNweDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpIj5Mb2dvdXQgKyB0ZW50YXIgZGUgbm92bzwvYT4nOwogICAgfQogICAgaHRtbCs9JzwvZGl2Pic7CiAgICBlbC5pbm5lckhUTUw9aHRtbDsKICB9CiAgaWYoYXV0bylzZXRUaW1lb3V0KCgpPT5fZ290b0FjZXNzYXIoKSw0MDAwKTsKfQoKY29uc3QgQURNSU5fU0VDVElPTlM9ewogIGtwaXM6ICAgICAgIHt0aXRsZTonVmlzw6NvIGdlcmFsJ30sCiAgcmFua2luZzogICAge3RpdGxlOidSYW5raW5nIGdlcmFsJ30sCiAgYWx1bm9zOiAgICAge3RpdGxlOidBbHVub3MnfSwKICBlc2NvbGFzOiAgICB7dGl0bGU6J0VzY29sYXMgLyBDb25jdXJzb3MnfSwKICBqb2dvczogICAgICB7dGl0bGU6J0pvZ29zICYgUmVzdWx0YWRvcyd9LAogIHNvcnRlaW9zOiAgIHt0aXRsZTonU29ydGVpb3MnfSwKICBpbmRpY2Fjb2VzOiB7dGl0bGU6J0luZGljYcOnw7Vlcyd9LAogIGNvbmZpZzogICAgIHt0aXRsZTonQ29uZmlndXJhw6fDtWVzJ30KfTsKCmFzeW5jIGZ1bmN0aW9uIGVudGVyQWRtaW4oKXsKICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2dhdGVkJyk7CiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdhZG1pbi1sb2FkZWQnKTsKICBjb25zdCB3aG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluV2hvJyk7CiAgaWYod2hvJiZtZURhdGEpd2hvLnRleHRDb250ZW50PShtZURhdGEubm9tZXx8JycpLnNwbGl0KCcgJykuc2xpY2UoMCwyKS5qb2luKCcgJyk7CiAgY29uc3QgbG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ291dGJ0bicpOwogIGlmKGxvKWxvLm9uY2xpY2s9YXN5bmMoKT0+e2lmKHN1cGEpYXdhaXQgc3VwYS5hdXRoLnNpZ25PdXQoKTtfcmVzZXRBZG1pbkNhY2hlKCk7X2dvdG9Ib21lKCk7fTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsKCk9PnN3aXRjaEFkbWluU2VjdGlvbigpKTsKICBzd2l0Y2hBZG1pblNlY3Rpb24oKTsKfQoKZnVuY3Rpb24gc3dpdGNoQWRtaW5TZWN0aW9uKCl7CiAgY29uc3QgaGFzaD0obG9jYXRpb24uaGFzaHx8JyNrcGlzJykucmVwbGFjZSgnIycsJycpOwogIGNvbnN0IGtleT1BRE1JTl9TRUNUSU9OU1toYXNoXT9oYXNoOidrcGlzJzsKICBjb25zdCBkZWY9QURNSU5fU0VDVElPTlNba2V5XTsKCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkbWluLXNlY3Rpb24nKS5mb3JFYWNoKHM9PnMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpOwogIGNvbnN0IHNlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLScra2V5KTtpZihzZWMpc2VjLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhc05hdiBhJykuZm9yRWFjaChhPT5hLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYS5kYXRhc2V0LnNlY3Rpb249PT1rZXkpKTsKICBjb25zdCB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvblRpdGxlJyk7aWYodGl0bGUpdGl0bGUudGV4dENvbnRlbnQ9ZGVmLnRpdGxlOwoKICBjb25zdCBmbj17CiAgICBrcGlzOiAgICAgICByZW5kZXJBZG1pbktwaXMsCiAgICByYW5raW5nOiAgICByZW5kZXJBZG1pblJhbmtpbmcsCiAgICBhbHVub3M6ICAgICByZW5kZXJBZG1pbkFsdW5vcywKICAgIGVzY29sYXM6ICAgIHJlbmRlckFkbWluRXNjb2xhcywKICAgIGpvZ29zOiAgICAgIHJlbmRlckFkbWluSm9nb3MsCiAgICBzb3J0ZWlvczogICByZW5kZXJBZG1pblNvcnRlaW9zLAogICAgaW5kaWNhY29lczogcmVuZGVyQWRtaW5JbmRpY2Fjb2VzLAogICAgY29uZmlnOiAgICAgcmVuZGVyQWRtaW5Db25maWcKICB9W2tleV07CiAgaWYodHlwZW9mIGZuPT09J2Z1bmN0aW9uJylmbigpLmNhdGNoKGU9PmNvbnNvbGUuZXJyb3IoJ2FkbWluIHJlbmRlcicsa2V5LGUpKTsKICB3aW5kb3cuc2Nyb2xsVG8oMCwwKTsKfQoKLyogLS0tLS0tLS0tLSBGMzogVmlzw6NvIGdlcmFsIC8gS1BJcyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIF9rcGlDYXJkKGxhYmVsLHZhbHVlLGRldGFpbCxobCl7CiAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJrcGkke2hsPycgaGwnOicnfSI+PHNwYW4gY2xhc3M9ImtsIj4ke2VzYyhsYWJlbCl9PC9zcGFuPjxzcGFuIGNsYXNzPSJrdiI+JHt2YWx1ZX08L3NwYW4+PHNwYW4gY2xhc3M9ImtkIj4ke2RldGFpbHx8Jyd9PC9zcGFuPjwvZGl2PmA7Cn0KZnVuY3Rpb24gX2ZtdE4obil7cmV0dXJuIE51bWJlcihufHwwKS50b0xvY2FsZVN0cmluZygncHQtQlInKTt9CmZ1bmN0aW9uIF9mbXRUaW1lVW50aWwoc2Vjcyl7CiAgaWYoc2Vjcz09bnVsbHx8c2Vjczw9MClyZXR1cm4gJ+KAlCc7CiAgY29uc3QgZD1NYXRoLmZsb29yKHNlY3MvODY0MDApLGg9TWF0aC5mbG9vcihzZWNzJTg2NDAwLzM2MDApLG09TWF0aC5mbG9vcihzZWNzJTM2MDAvNjApOwogIGlmKGQ+MClyZXR1cm4gZCsnZCAnK2grJ2gnOwogIGlmKGg+MClyZXR1cm4gaCsnaCAnK20rJ21pbic7CiAgcmV0dXJuIG0rJ21pbic7Cn0KLy8gMjAyNi0wNi0wOCAocmV2KTogamFuZWxhIGF1dG8tYWp1c3TDoXZlbCAoZG8gMcK6IGNhZGFzdHJvIGF0w6kgaG9qZSwgY2FwIDYwIGRpYXMpICsKLy8gZml4IHRpbWV6b25lIChCUlQgPSBVVEMtMyDihpIgU1VCVFJBSVIgM2ggYW50ZXMgZGUgcGVnYXIgbyBkaWEgVVRDKS4gQnVnIGFudGVyaW9yCi8vIGFkaWNpb25hdmEgM2gsIGpvZ2FuZG8gY2FkYXN0cm9zIHDDs3MtMjFoIEJSVCBwcmEgZGlhIHNlZ3VpbnRlIChlIGZvcmEgZGEgamFuZWxhKS4KZnVuY3Rpb24gX3NpZ251cHNCeURheShwbGF5ZXJzKXsKICBmdW5jdGlvbiBkYXlLZXlCUihkKXsKICAgIC8vIGQgw6kgRGF0ZS4gQlJUID0gVVRDLTMuIFN1YnRyYWkgM2ggcHJhIGFsaW5oYXIgZSBsw6ogbyBkaWEgZW0gVVRDLgogICAgcmV0dXJuIG5ldyBEYXRlKGQuZ2V0VGltZSgpIC0gMyozNjAwKjEwMDApLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCk7CiAgfQogIC8vIERlc2NvYnJlIHByaW1laXJvIGRpYSAoQlJUKSBkbyBjb25qdW50byBwcmEgZGltZW5zaW9uYXIgYSBqYW5lbGEKICBjb25zdCByb3dzID0gKHBsYXllcnN8fFtdKS5maWx0ZXIocD0+cC5jcmVhdGVkQXQpOwogIGlmKCFyb3dzLmxlbmd0aCkgcmV0dXJuIFtdOwogIGxldCBtaW5NcyA9IEluZmluaXR5OwogIHJvd3MuZm9yRWFjaChwPT57IGNvbnN0IHQ9bmV3IERhdGUocC5jcmVhdGVkQXQpLmdldFRpbWUoKTsgaWYodDxtaW5NcykgbWluTXM9dDsgfSk7CiAgY29uc3Qgc3RhcnREYXkgPSBkYXlLZXlCUihuZXcgRGF0ZShtaW5NcykpOwogIGNvbnN0IHRvZGF5S2V5ID0gZGF5S2V5QlIobmV3IERhdGUoKSk7CiAgLy8gR2VyYSBidWNrZXRzIGRvIHN0YXJ0RGF5IGF0w6kgaG9qZSAoZW0gVVRDIHN0ZXBzIGRlIDEgZGlhKSDigJQgY2FwIDYwIGRpYXMKICBjb25zdCBidWNrZXRzID0ge307CiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShzdGFydERheSArICdUMDM6MDA6MDBaJyk7IC8vIDAwOjAwIEJSVCA9IDAzOjAwIFVUQwogIGNvbnN0IGVuZCAgID0gbmV3IERhdGUodG9kYXlLZXkgKyAnVDAzOjAwOjAwWicpOwogIGxldCBjdXIgPSBuZXcgRGF0ZShzdGFydCk7CiAgbGV0IHNhZmV0eSA9IDA7CiAgd2hpbGUoY3VyIDw9IGVuZCAmJiBzYWZldHkgPCA2MCl7CiAgICBjb25zdCBrID0gZGF5S2V5QlIoY3VyKTsKICAgIGJ1Y2tldHNba10gPSB7ZGlhOmssIG1pbDowLCBldjowLCB0b3RhbDowfTsKICAgIGN1ciA9IG5ldyBEYXRlKGN1ci5nZXRUaW1lKCkgKyAyNCozNjAwKjEwMDApOwogICAgc2FmZXR5Kys7CiAgfQogIHJvd3MuZm9yRWFjaChwPT57CiAgICBjb25zdCBrID0gZGF5S2V5QlIobmV3IERhdGUocC5jcmVhdGVkQXQpKTsKICAgIGlmKCFidWNrZXRzW2tdKSBidWNrZXRzW2tdID0ge2RpYTprLCBtaWw6MCwgZXY6MCwgdG90YWw6MH07ICAvLyBzYWZldHk6IGZvcmEgZGEgamFuZWxhIHZpcmEgYnVja2V0IHByw7NwcmlvCiAgICBpZihwLnZlcnRpY2FsID09PSAndmVzdGlidWxhcmVzJykgYnVja2V0c1trXS5ldisrOwogICAgZWxzZSBidWNrZXRzW2tdLm1pbCsrOwogICAgYnVja2V0c1trXS50b3RhbCsrOwogIH0pOwogIHJldHVybiBPYmplY3QudmFsdWVzKGJ1Y2tldHMpLnNvcnQoKGEsYik9PmEuZGlhLmxvY2FsZUNvbXBhcmUoYi5kaWEpKTsKfQoKZnVuY3Rpb24gX3JlbmRlclNpZ251cHNDaGFydChwbGF5ZXJzKXsKICBjb25zdCBzZXJpZXMgPSBfc2lnbnVwc0J5RGF5KHBsYXllcnMpOwogIGlmKCFzZXJpZXMubGVuZ3RoKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGRpdiBjbGFzcz0iZW1wdHkiPlNlbSBjYWRhc3Ryb3MgYWluZGEuPC9kaXY+PC9kaXY+JzsKICB9CiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMSwgLi4uc2VyaWVzLm1hcChkID0+IGQudG90YWwpKTsKICBjb25zdCBXID0gNzYwLCBIID0gMjIwLCBQQURfTCA9IDM2LCBQQURfUiA9IDEyLCBQQURfVCA9IDE2LCBQQURfQiA9IDMyOwogIGNvbnN0IGNoYXJ0VyA9IFcgLSBQQURfTCAtIFBBRF9SLCBjaGFydEggPSBIIC0gUEFEX1QgLSBQQURfQjsKICBjb25zdCBiYXJXID0gY2hhcnRXIC8gc2VyaWVzLmxlbmd0aCAqIDAuNzI7CiAgY29uc3QgZ2FwICA9IGNoYXJ0VyAvIHNlcmllcy5sZW5ndGggKiAwLjI4OwogIGNvbnN0IHhGb3IgPSBpID0+IFBBRF9MICsgaSooYmFyVytnYXApICsgZ2FwLzI7CiAgY29uc3QgeUZvciA9IHYgPT4gUEFEX1QgKyBjaGFydEggLSAodi9tYXgpKmNoYXJ0SDsKCiAgLy8gZ3JpZCBob3Jpem9udGFsICg0IGxpbmhhcykKICBsZXQgZ3JpZCA9ICcnOwogIGZvcihsZXQgaT0wO2k8PTQ7aSsrKXsKICAgIGNvbnN0IHkgPSBQQURfVCArIChjaGFydEgvNCkqaTsKICAgIGNvbnN0IHYgPSBNYXRoLnJvdW5kKG1heCooMSAtIGkvNCkpOwogICAgZ3JpZCArPSBgPGxpbmUgeDE9IiR7UEFEX0x9IiB5MT0iJHt5fSIgeDI9IiR7Vy1QQURfUn0iIHkyPSIke3l9IiBzdHJva2U9IiNlM2VkZTkiIHN0cm9rZS13aWR0aD0iMSIvPmA7CiAgICBncmlkICs9IGA8dGV4dCB4PSIke1BBRF9MLTZ9IiB5PSIke3krM30iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM4ODk5OGYiIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWkiPiR7dn08L3RleHQ+YDsKICB9CgogIC8vIGJhcnJhcyBzdGFja2VkOiBtaWxpdGFyZXMgKHZlcmRlKSBlbWJhaXhvLCB2ZXN0aWJ1bGFyZXMgKGxhcmFuamEpIGVtIGNpbWEKICBjb25zdCBiYXJzID0gc2VyaWVzLm1hcCgoZCxpKT0+ewogICAgY29uc3QgeCA9IHhGb3IoaSk7CiAgICBjb25zdCB5TWlsID0geUZvcihkLm1pbCk7CiAgICBjb25zdCBoTWlsID0gKGQubWlsL21heCkqY2hhcnRIOwogICAgY29uc3QgeUV2ID0geUZvcihkLm1pbCArIGQuZXYpOwogICAgY29uc3QgaEV2ID0gKGQuZXYvbWF4KSpjaGFydEg7CiAgICBjb25zdCBkTGFiZWwgPSBkLmRpYS5zbGljZSg1KS5zcGxpdCgnLScpLnJldmVyc2UoKS5qb2luKCcvJyk7ICAvLyBERC9NTQogICAgcmV0dXJuIGAKICAgICAgPGc+CiAgICAgICAgPHJlY3QgeD0iJHt4fSIgeT0iJHt5TWlsfSIgd2lkdGg9IiR7YmFyV30iIGhlaWdodD0iJHtoTWlsfSIgZmlsbD0iIzBlOGU3MCIgcng9IjIiPgogICAgICAgICAgPHRpdGxlPiR7ZExhYmVsfSDCtyBNSUw6ICR7ZC5taWx9PC90aXRsZT4KICAgICAgICA8L3JlY3Q+CiAgICAgICAgPHJlY3QgeD0iJHt4fSIgeT0iJHt5RXZ9IiB3aWR0aD0iJHtiYXJXfSIgaGVpZ2h0PSIke2hFdn0iIGZpbGw9IiNlNDZjMDAiIHJ4PSIyIj4KICAgICAgICAgIDx0aXRsZT4ke2RMYWJlbH0gwrcgRVY6ICR7ZC5ldn08L3RpdGxlPgogICAgICAgIDwvcmVjdD4KICAgICAgICAke2QudG90YWw+MD9gPHRleHQgeD0iJHt4K2JhclcvMn0iIHk9IiR7eUV2LTR9IiBmb250LXNpemU9IjEwIiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMDYzNTJhIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0ic3lzdGVtLXVpIj4ke2QudG90YWx9PC90ZXh0PmA6Jyd9CiAgICAgICAgPHRleHQgeD0iJHt4K2JhclcvMn0iIHk9IiR7SC1QQURfQisxNH0iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM1Yzc1NmIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWkiPiR7ZExhYmVsfTwvdGV4dD4KICAgICAgPC9nPmA7CiAgfSkuam9pbignJyk7CgogIGNvbnN0IHRvdE1pbCA9IHNlcmllcy5yZWR1Y2UoKHMsZCk9PnMrZC5taWwsMCk7CiAgY29uc3QgdG90RXYgID0gc2VyaWVzLnJlZHVjZSgocyxkKT0+cytkLmV2LDApOwogIGNvbnN0IHRvdENoYXJ0ID0gdG90TWlsICsgdG90RXY7CiAgY29uc3QgYXZnRGF5ID0gKHRvdENoYXJ0L3Nlcmllcy5sZW5ndGgpLnRvRml4ZWQoMSk7CiAgY29uc3QgdG90UGxheWVycyA9IChwbGF5ZXJzfHxbXSkubGVuZ3RoOwogIGNvbnN0IGRpZmZXYXJuID0gdG90UGxheWVycyAhPT0gdG90Q2hhcnQKICAgID8gYCA8c3BhbiBzdHlsZT0iY29sb3I6I2Q2NDUzZjtmb250LXdlaWdodDo3MDAiPuKaoCAke19mbXROKE1hdGguYWJzKHRvdFBsYXllcnMtdG90Q2hhcnQpKX0gZm9yYSBkYSBqYW5lbGE8L3NwYW4+YAogICAgOiAnIDxzcGFuIHN0eWxlPSJjb2xvcjojMWY5ZDYzO2ZvbnQtd2VpZ2h0OjcwMCI+4pyTIGJhdGUgY29tIG8gS1BJPC9zcGFuPic7CgogIHJldHVybiBgPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+CiAgICA8aDM+Q2FkYXN0cm9zIHBvciBkaWEgwrcgJHtzZXJpZXNbMF0uZGlhLnNsaWNlKDgsMTApfS8ke3Nlcmllc1swXS5kaWEuc2xpY2UoNSw3KX0g4oaSICR7c2VyaWVzW3Nlcmllcy5sZW5ndGgtMV0uZGlhLnNsaWNlKDgsMTApfS8ke3Nlcmllc1tzZXJpZXMubGVuZ3RoLTFdLmRpYS5zbGljZSg1LDcpfSDCtyAke19mbXROKHRvdENoYXJ0KX0gbm8gcGVyw61vZG8ke2RpZmZXYXJufTwvaDM+CiAgICA8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDEycHgiPgogICAgICBUb3RhbCBubyBiYW5jbzogPGI+JHtfZm10Tih0b3RQbGF5ZXJzKX08L2I+IMK3IE3DqWRpYSBkacOhcmlhOiA8Yj4ke2F2Z0RheX08L2I+IMK3CiAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMHB4O2hlaWdodDoxMHB4O2JhY2tncm91bmQ6IzBlOGU3MDtib3JkZXItcmFkaXVzOjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiPjwvc3Bhbj4gTWlsaXRhcmVzOiA8Yj4ke19mbXROKHRvdE1pbCl9PC9iPiDCtwogICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtiYWNrZ3JvdW5kOiNlNDZjMDA7Ym9yZGVyLXJhZGl1czoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlIj48L3NwYW4+IFZlc3RpYnVsYXJlczogPGI+JHtfZm10Tih0b3RFdil9PC9iPgogICAgPC9wPgogICAgPGRpdiBzdHlsZT0id2lkdGg6MTAwJTtvdmVyZmxvdy14OmF1dG8iPjxzdmcgdmlld0JveD0iMCAwICR7V30gJHtIfSIgc3R5bGU9IndpZHRoOjEwMCU7bWF4LXdpZHRoOiR7V31weDtoZWlnaHQ6YXV0bztkaXNwbGF5OmJsb2NrIj4KICAgICAgJHtncmlkfSR7YmFyc30KICAgIDwvc3ZnPjwvZGl2PgogIDwvZGl2PmA7Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlbmRlckFkbWluS3BpcygpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3Bpc0JveCcpO2lmKCFib3gpcmV0dXJuOwogIGxldCBkYXRhPW51bGw7CiAgdHJ5e2NvbnN0IHI9YXdhaXQgc3VwYS5ycGMoJ2dldF9hZG1pbl9vdmVydmlldycpO2lmKCFyLmVycm9yKWRhdGE9ci5kYXRhO30KICBjYXRjaChlKXtjb25zb2xlLmVycm9yKGUpO30KICBpZighZGF0YSl7Ym94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPk7Do28gZm9pIHBvc3PDrXZlbCBjYXJyZWdhci48L2Rpdj4nO3JldHVybjt9CgogIGNvbnN0IG54PWRhdGEucHJveGltb19qb2dvOwogIGNvbnN0IG54TGFiZWw9bng\/KG54LmhvbWUrJyDDlyAnK254LmF3YXkpOifigJQnOwogIGNvbnN0IG54RGV0YWlsPW54PygnZmVjaGEgZW0gJytfZm10VGltZVVudGlsKG54LnNlY29uZHNfdW50aWwpKTondG9kb3Mgb3Mgam9nb3MgZmVjaGFkb3MnOwoKICBib3guaW5uZXJIVE1MPQogICAgJzxkaXYgY2xhc3M9ImtwaS1ncmlkIj4nKwogICAgICBfa3BpQ2FyZCgnSW5zY3JpdG9zJyxfZm10TihkYXRhLmluc2NyaXRvc190b3RhbCksCiAgICAgICAgJzxzcGFuIGNsYXNzPSJ1cCI+KycrX2ZtdE4oZGF0YS5pbnNjcml0b3NfMjRoKSsnIG5hcyDDumx0aW1hcyAyNGg8L3NwYW4+IMK3ICsnK19mbXROKGRhdGEuaW5zY3JpdG9zXzdkKSsnIGVtIDdkJykrCiAgICAgIF9rcGlDYXJkKCdQYWxwaXRlcyBlbnZpYWRvcycsX2ZtdE4oZGF0YS5wYWxwaXRlc190b3RhbCksCiAgICAgICAgJzxzcGFuIGNsYXNzPSJ1cCI+KycrX2ZtdE4oZGF0YS5wYWxwaXRlc18yNGgpKyc8L3NwYW4+IG5hcyDDumx0aW1hcyAyNGgnKSsKICAgICAgX2twaUNhcmQoJ0NyYXZhZGFzIG5vIGJhbmNvJyxfZm10TihkYXRhLmNyYXZhZGFzX3RvdGFsKSwKICAgICAgICBkYXRhLmNyYXZhZGFzX3RvdGFsPjA\/J3BsYWNhcmVzIGV4YXRvcyBjb250YWJpbGl6YWRvcyc6J2FndWFyZGFuZG8gMcK6IHBsYWNhciBvZmljaWFsJywKICAgICAgICBkYXRhLmNyYXZhZGFzX3RvdGFsPjApKwogICAgICBfa3BpQ2FyZCgnRXNjb2xhcyBubyBib2zDo28nLF9mbXROKGRhdGEuZXNjb2xhc190b3RhbCksCiAgICAgICAgJ2NvbmN1cnNvcyBjb20gcGVsbyBtZW5vcyAxIGluc2NyaXRvJykrCiAgICAgIF9rcGlDYXJkKCdFbGVnw612ZWlzIGFvIHNvcnRlaW8nLF9mbXROKGRhdGEuZWxlZ2l2ZWlzX3NvcnRlaW8pLAogICAgICAgICfiiaUgJytkYXRhLnJhZmZsZV9taW4rJyBwb250b3MnKSsKICAgICAgX2twaUNhcmQoJ0NvbnZlcnPDo28nLGRhdGEudGF4YV9jb252ZXJzYW9fcGN0KyclJywKICAgICAgICAnaW5zY3JpdG9zIHF1ZSBlbnZpYXJhbSDiiaUgMSBwYWxwaXRlJykrCiAgICAgIF9rcGlDYXJkKCdQcsOzeGltbyBqb2dvJyxueExhYmVsLG54RGV0YWlsKSsKICAgICAgX2twaUNhcmQoJ1NvcnRlaW9zIHJlYWxpemFkb3MnLF9mbXROKGRhdGEuc29ydGVpb3NfcmVhbGl6YWRvcyksCiAgICAgICAgJ3JlZ2lzdHJhZG9zIGVtIHJhZmZsZXMnKSsKICAgICc8L2Rpdj4nKwogICAgJzxkaXYgaWQ9ImtwaXNDaGFydCI+PGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG8gZ3LDoWZpY28gZGUgY2FkYXN0cm9z4oCmPC9kaXY+PC9kaXY+PC9kaXY+JysKICAgICc8ZGl2IGNsYXNzPSJhZG1pbi1jYXJkIj48aDM+QXRhbGhvczwvaDM+PGRpdiBjbGFzcz0iYWRtaW4tYWN0aW9ucyI+JysKICAgICAgJzxhIGNsYXNzPSJidG4gcHJpbWFyeSIgaHJlZj0iI2FsdW5vcyIgc3R5bGU9InBhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxM3B4Ij7wn46TIFZlciBhbHVub3M8L2E+JysKICAgICAgJzxhIGNsYXNzPSJidG4gcHJpbWFyeSIgaHJlZj0iI3JhbmtpbmciIHN0eWxlPSJwYWRkaW5nOjEwcHggMTZweDtmb250LXNpemU6MTNweCI+8J+PhiBSYW5raW5nPC9hPicrCiAgICAgICc8YSBjbGFzcz0iYnRuIHByaW1hcnkiIGhyZWY9IiNqb2dvcyIgc3R5bGU9InBhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxM3B4Ij7imr0gTGFuw6dhciByZXN1bHRhZG9zPC9hPicrCiAgICAgICc8YSBjbGFzcz0iYnRuIGdvbGQiIGhyZWY9IiNzb3J0ZWlvcyIgc3R5bGU9InBhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxM3B4Ij7wn46BIFNvcnRlaW9zPC9hPicrCiAgICAnPC9kaXY+PC9kaXY+JzsKCiAgLy8gQ2FycmVnYSBvIGNhY2hlIGRlIHBsYXllcnMgKG1lc21vIGNhY2hlIGRlIHJhbmtpbmcvZXNjb2xhcykgZSByZW5kZXJpemEgbyBjaGFydC4KICAvLyBCZXN0LWVmZm9ydDogc2UgZmFsaGFyLCBvIGNhcmQgdmlyYSBtZW5zYWdlbSBkZSBlcnJvIHNlbSBkZXJydWJhciBhIHDDoWdpbmEuCiAgKGFzeW5jKCk9PnsKICAgIHRyeXsKICAgICAgbGV0IHBsYXllcnMgPSBfYWRtUmFua1N0YXRlLmRhdGE7CiAgICAgIGlmKCFwbGF5ZXJzIHx8IChEYXRlLm5vdygpIC0gX2FkbVJhbmtTdGF0ZS5sb2FkZWRBdCkgPiAzMDAwMCl7CiAgICAgICAgcGxheWVycyA9IGF3YWl0IGxvYWRBbGxQbGF5ZXJzQWRtaW4oKTsKICAgICAgICBfYWRtUmFua1N0YXRlLmRhdGEgPSBwbGF5ZXJzOwogICAgICAgIF9hZG1SYW5rU3RhdGUubG9hZGVkQXQgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IG1vdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2twaXNDaGFydCcpOwogICAgICBpZihtb3VudCkgbW91bnQuaW5uZXJIVE1MID0gX3JlbmRlclNpZ251cHNDaGFydChwbGF5ZXJzKTsKICAgIH1jYXRjaChlKXsKICAgICAgY29uc29sZS5lcnJvcignW2twaXMgY2hhcnRdJywgZSk7CiAgICAgIGNvbnN0IG1vdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2twaXNDaGFydCcpOwogICAgICBpZihtb3VudCkgbW91bnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxkaXYgY2xhc3M9ImVtcHR5Ij5Ow6NvIGZvaSBwb3Nzw612ZWwgY2FycmVnYXIgbyBncsOhZmljby48L2Rpdj48L2Rpdj4nOwogICAgfQogIH0pKCk7Cn0KCi8qIC0tLS0tLS0tLS0gRjQ6IEFsdW5vcyAtLS0tLS0tLS0tICovCmNvbnN0IEFETUlOX1BBR0VfU0laRT0yMDsKbGV0IF9hZG1BbHVub3NTdGF0ZT17cGFnZToxLHE6JycsY29uY3Vyc286JycsdmVydGljYWw6JycscGVyZmlsOicnLGhhc19wcmVkOicnLG1hcmtldGluZzonJyxzb3J0OidyZWNlbnQnLGRhdGE6bnVsbCx0b3RhbDowfTsKCi8vIExhYmVscyBhbWlnw6F2ZWlzIHByb3MgZW51bXMgdmVydGljYWwvcGVyZmlsIChzaW5jcm9uaXphZG9zIGNvbSBjb25zdHJhaW50IGRvIGJhbmNvKS4KY29uc3QgVkVSVElDQUxfTEFCRUxTPXttaWxpdGFyZXM6J\/CfqpYgTWlsaXRhcicsdmVzdGlidWxhcmVzOifwn46TIFZlc3RpYnVsYXInfTsKY29uc3QgVkVSVElDQUxfQkFER0U9e21pbGl0YXJlczon8J+qlicsdmVzdGlidWxhcmVzOifwn46TJ307CmNvbnN0IFBFUkZJTF9MQUJFTFM9e2FsdW5vOifwn46vIEFsdW5vL0VzdHVkYW50ZScscmVzcG9uc2F2ZWw6J\/CfkajigI3wn5Gp4oCN8J+RpyBSZXNwb25zw6F2ZWwnLG91dHJvOifwn5GkIE91dHJvJ307CgpmdW5jdGlvbiBfbWFza0NwZkRpc3AoY3BmKXsKICAvLyBDUEYgdmVtIGZvcm1hdGFkbyAiMTIzLjQ1Ni43ODktMDAiIOKGkiBtYXNjYXJhIG1laW86ICIxMjMuKioqLjc4OS0wMCIKICBpZighY3BmKXJldHVybiAn4oCUJzsKICByZXR1cm4gY3BmLnJlcGxhY2UoL14oXGR7M30pXC5cZHszfVwuKFxkezN9KS0oXGR7Mn0pJC8sICckMS4qKiouJDItJDMnKTsKfQpmdW5jdGlvbiBfbWFza0VtYWlsKGVtYWlsKXsKICBpZighZW1haWwpcmV0dXJuICfigJQnOwogIGNvbnN0IG09ZW1haWwuc3BsaXQoJ0AnKTsKICBpZihtLmxlbmd0aCE9PTIpcmV0dXJuIGVtYWlsOwogIGNvbnN0IHU9bVswXTsKICBpZih1Lmxlbmd0aDw9MylyZXR1cm4gdVswXSsnKioqQCcrbVsxXTsKICByZXR1cm4gdS5zbGljZSgwLDIpKycqKionK3Uuc2xpY2UoLTEpKydAJyttWzFdOwp9CmZ1bmN0aW9uIF9tYXNrUGhvbmUodGVsKXsKICBpZighdGVsKXJldHVybiAn4oCUJzsKICBjb25zdCBkPXRlbC5yZXBsYWNlKC9cRC9nLCcnKTsKICBpZihkLmxlbmd0aDwxMClyZXR1cm4gdGVsOwogIHJldHVybiB0ZWwucmVwbGFjZSgvKFxkezIsM30pXHM\/XGR7NCw1fS8sICckMSAqKioqJyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIF9hZG1GZXRjaEFsdW5vcygpewogIC8vIEzDqiBwbGF5ZXJzICsgYWdyZWdhIHB0cy9wYWxwaXRlcyB2aWEgc3Vic2VsZWN0IG1hbnVhbC4KICAvLyBSTFMgZGUgaXNfYWRtaW4gbGliZXJhIGxlaXR1cmEgY29tcGxldGEuIFByYSBlc2NhbGEgPjVrLCBtb3ZlciBwcmEgUlBDIHBhZ2luYWRhLgogIGNvbnN0IHM9X2FkbUFsdW5vc1N0YXRlOwogIGxldCBxdWVyeT1zdXBhLmZyb20oJ3BsYXllcnMnKS5zZWxlY3QoJ2lkLG5vbWUsY3BmLGVtYWlsLHRlbGVmb25lLGNvbmN1cnNvLHZlcnRpY2FsLHBlcmZpbCxtYXJrZXRpbmdfY29uc2VudCxyZWZfY29kZSxyZWZlcnJlZF9ieSxjcmVhdGVkX2F0LHN5bmNlZF90b19zZm1jJyx7Y291bnQ6J2V4YWN0J30pOwogIGlmKHMucSl7Y29uc3QgcT0nJScrcy5xKyclJztxdWVyeT1xdWVyeS5vcignbm9tZS5pbGlrZS4nK3ErJyxlbWFpbC5pbGlrZS4nK3ErJyxjcGYuaWxpa2UuJytxKTt9CiAgaWYocy5jb25jdXJzbylxdWVyeT1xdWVyeS5lcSgnY29uY3Vyc28nLHMuY29uY3Vyc28pOwogIGlmKHMudmVydGljYWwpcXVlcnk9cXVlcnkuZXEoJ3ZlcnRpY2FsJyxzLnZlcnRpY2FsKTsKICBpZihzLnBlcmZpbClxdWVyeT1xdWVyeS5lcSgncGVyZmlsJyxzLnBlcmZpbCk7CiAgaWYocy5tYXJrZXRpbmc9PT0nMScpcXVlcnk9cXVlcnkuZXEoJ21hcmtldGluZ19jb25zZW50Jyx0cnVlKTsKICBlbHNlIGlmKHMubWFya2V0aW5nPT09JzAnKXF1ZXJ5PXF1ZXJ5LmVxKCdtYXJrZXRpbmdfY29uc2VudCcsZmFsc2UpOwogIHF1ZXJ5PXF1ZXJ5Lm9yZGVyKCdjcmVhdGVkX2F0Jyx7YXNjZW5kaW5nOmZhbHNlfSk7CiAgY29uc3QgZnJvbT0ocy5wYWdlLTEpKkFETUlOX1BBR0VfU0laRSx0bz1mcm9tK0FETUlOX1BBR0VfU0laRS0xOwogIHF1ZXJ5PXF1ZXJ5LnJhbmdlKGZyb20sdG8pOwogIGNvbnN0IHtkYXRhLGVycm9yLGNvdW50fT1hd2FpdCBxdWVyeTsKICBpZihlcnJvcil7Y29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJuIHtyb3dzOltdLGNvdW50OjB9O30KCiAgLy8gQW5leGEgcG9udHVhw6fDo28gZSBwYWxwaXRlcyB2aWEgMiBxdWVyaWVzIGF1eGlsaWFyZXMgcHJvcyBJRHMgdmlzw612ZWlzCiAgY29uc3QgaWRzPShkYXRhfHxbXSkubWFwKHA9PnAuaWQpOwogIGxldCBwcmVkc01hcD17fTsKICBpZihpZHMubGVuZ3RoKXsKICAgIGNvbnN0IHtkYXRhOnByZWRzfT1hd2FpdCBzdXBhLmZyb20oJ3ByZWRpY3Rpb25zJykuc2VsZWN0KCdwbGF5ZXJfaWQsbWF0Y2hfaWQsaG9tZV9nb2Fscyxhd2F5X2dvYWxzJykuaW4oJ3BsYXllcl9pZCcsaWRzKTsKICAgIChwcmVkc3x8W10pLmZvckVhY2gocD0+eyhwcmVkc01hcFtwLnBsYXllcl9pZF09cHJlZHNNYXBbcC5wbGF5ZXJfaWRdfHxbXSkucHVzaChwKTt9KTsKICB9CiAgLy8gY2ZnLm1hdGNoZXMgKyBjZmcucmVzdWx0cyBwYXJhIGNhbGN1bGFyIHB0cyBjbGllbnQtc2lkZSAobWVzbWEgZsOzcm11bGEgZG8gc2NvcmVBbGwpCiAgY29uc3QgZW5yaWNoZWQ9KGRhdGF8fFtdKS5tYXAocGw9PnsKICAgIGxldCBwdHM9MCxjcmE9MDsKICAgIChwcmVkc01hcFtwbC5pZF18fFtdKS5mb3JFYWNoKHByPT57CiAgICAgIGNvbnN0IG09Y2ZnLm1hdGNoZXMuZmluZCh4PT54LmlkPT09cHIubWF0Y2hfaWQpO2lmKCFtKXJldHVybjsKICAgICAgY29uc3Qgcj1jZmcucmVzdWx0c1ttLmlkXTtpZighcilyZXR1cm47CiAgICAgIGNvbnN0IHNjPXBvaW50c0Zvcih7aDpwci5ob21lX2dvYWxzLGE6cHIuYXdheV9nb2Fsc30scixtLmZyKTsKICAgICAgaWYoc2Mpe3B0cys9c2MucHRzO2lmKHNjLmV4YWN0KWNyYSsrO30KICAgIH0pOwogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30scGwse3B0cyxjcmF2YWRhczpjcmEscGFscGl0ZXM6KHByZWRzTWFwW3BsLmlkXXx8W10pLmxlbmd0aH0pOwogIH0pOwoKICAvLyBBcGxpY2EgZmlsdHJvIGhhc19wcmVkIGUgc29ydCBubyBjbGllbnQgKGrDoSB0ZW1vcyBhIHDDoWdpbmEpCiAgbGV0IHJvd3M9ZW5yaWNoZWQ7CiAgaWYocy5oYXNfcHJlZD09PScxJylyb3dzPXJvd3MuZmlsdGVyKHI9PnIucGFscGl0ZXM+MCk7CiAgZWxzZSBpZihzLmhhc19wcmVkPT09JzAnKXJvd3M9cm93cy5maWx0ZXIocj0+ci5wYWxwaXRlcz09PTApOwogIGlmKHMuc29ydD09PSdwdHNfZGVzYycpcm93cy5zb3J0KChhLGIpPT5iLnB0cy1hLnB0cyk7CiAgZWxzZSBpZihzLnNvcnQ9PT0nbm9tZV9hc2MnKXJvd3Muc29ydCgoYSxiKT0+YS5ub21lLmxvY2FsZUNvbXBhcmUoYi5ub21lKSk7CiAgZWxzZSBpZihzLnNvcnQ9PT0ncmVjZW50Jylyb3dzLnNvcnQoKGEsYik9Pm5ldyBEYXRlKGIuY3JlYXRlZF9hdCktbmV3IERhdGUoYS5jcmVhdGVkX2F0KSk7CgogIHJldHVybiB7cm93cyxjb3VudDpjb3VudHx8cm93cy5sZW5ndGh9Owp9CgpmdW5jdGlvbiBfYWRtQ29uY3Vyc29PcHRpb25zKHNlbGVjdGVkKXsKICBjb25zdCBta09wdHM9YXJyPT5hcnIubWFwKGM9PmA8b3B0aW9uIHZhbHVlPSIke2VzYyhjKX0iICR7Yz09PXNlbGVjdGVkPydzZWxlY3RlZCc6Jyd9PiR7ZXNjKGMpfTwvb3B0aW9uPmApLmpvaW4oJycpOwogIHJldHVybiAnPG9wdGlvbiB2YWx1ZT0iIj5Ub2Rvczwvb3B0aW9uPicrCiAgICAnPG9wdGdyb3VwIGxhYmVsPSLwn6qWIE1pbGl0YXJlcyI+Jytta09wdHMoU0NIT09MU19NSUwpKyc8L29wdGdyb3VwPicrCiAgICAnPG9wdGdyb3VwIGxhYmVsPSLwn46TIFZlc3RpYnVsYXJlcyI+Jytta09wdHMoU0NIT09MU19FVikrJzwvb3B0Z3JvdXA+JzsKfQoKYXN5bmMgZnVuY3Rpb24gcmVuZGVyQWRtaW5BbHVub3MoKXsKICBjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsdW5vc0JveCcpOwogIGNvbnN0IGZpbHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsdW5vc0ZpbHRlcnMnKTsKICBpZighYm94fHwhZmlsdClyZXR1cm47CiAgY29uc3Qgcz1fYWRtQWx1bm9zU3RhdGU7CgogIGZpbHQuaW5uZXJIVE1MPQogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYXEiPkJ1c2NhciAobm9tZSAvIGVtYWlsIC8gQ1BGKTwvbGFiZWw+PGlucHV0IGlkPSJhcSIgcGxhY2Vob2xkZXI9ImV4LjogTWFyaWEsIEBnbWFpbCwgMTIzIiB2YWx1ZT0iJytlc2Mocy5xKSsnIj48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYXYiPlZlcnRpY2FsPC9sYWJlbD48c2VsZWN0IGlkPSJhdiI+JysKICAgICAgJzxvcHRpb24gdmFsdWU9IiI+VG9kYXM8L29wdGlvbj4nKwogICAgICAnPG9wdGlvbiB2YWx1ZT0ibWlsaXRhcmVzIiAnKyhzLnZlcnRpY2FsPT09J21pbGl0YXJlcyc\/J3NlbGVjdGVkJzonJykrJz7wn6qWIE1pbGl0YXJlczwvb3B0aW9uPicrCiAgICAgICc8b3B0aW9uIHZhbHVlPSJ2ZXN0aWJ1bGFyZXMiICcrKHMudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8nc2VsZWN0ZWQnOicnKSsnPvCfjpMgVmVzdGlidWxhcmVzPC9vcHRpb24+JysKICAgICc8L3NlbGVjdD48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYXBmIj5QZXJmaWw8L2xhYmVsPjxzZWxlY3QgaWQ9ImFwZiI+JysKICAgICAgJzxvcHRpb24gdmFsdWU9IiI+VG9kb3M8L29wdGlvbj4nKwogICAgICAnPG9wdGlvbiB2YWx1ZT0iYWx1bm8iICcrKHMucGVyZmlsPT09J2FsdW5vJz8nc2VsZWN0ZWQnOicnKSsnPvCfjq8gQWx1bm8vRXN0dWRhbnRlPC9vcHRpb24+JysKICAgICAgJzxvcHRpb24gdmFsdWU9InJlc3BvbnNhdmVsIiAnKyhzLnBlcmZpbD09PSdyZXNwb25zYXZlbCc\/J3NlbGVjdGVkJzonJykrJz7wn5Go4oCN8J+RqeKAjfCfkacgUmVzcG9uc8OhdmVsPC9vcHRpb24+JysKICAgICAgJzxvcHRpb24gdmFsdWU9Im91dHJvIiAnKyhzLnBlcmZpbD09PSdvdXRybyc\/J3NlbGVjdGVkJzonJykrJz7wn5GkIE91dHJvPC9vcHRpb24+JysKICAgICc8L3NlbGVjdD48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYWMiPkNvbmN1cnNvL0N1cnNvPC9sYWJlbD48c2VsZWN0IGlkPSJhYyI+JytfYWRtQ29uY3Vyc29PcHRpb25zKHMuY29uY3Vyc28pKyc8L3NlbGVjdD48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYWgiPlBhbHBpdG91PzwvbGFiZWw+PHNlbGVjdCBpZD0iYWgiPjxvcHRpb24gdmFsdWU9IiI+VG9kb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIxIiAnKyhzLmhhc19wcmVkPT09JzEnPydzZWxlY3RlZCc6JycpKyc+U2ltPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMCIgJysocy5oYXNfcHJlZD09PScwJz8nc2VsZWN0ZWQnOicnKSsnPk7Do288L29wdGlvbj48L3NlbGVjdD48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImZsZCI+PGxhYmVsIGZvcj0iYW0iPk1hcmtldGluZzwvbGFiZWw+PHNlbGVjdCBpZD0iYW0iPjxvcHRpb24gdmFsdWU9IiI+VG9kb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIxIiAnKyhzLm1hcmtldGluZz09PScxJz8nc2VsZWN0ZWQnOicnKSsnPkFjZWl0b3U8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIwIiAnKyhzLm1hcmtldGluZz09PScwJz8nc2VsZWN0ZWQnOicnKSsnPk5lZ291PC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+JysKICAgICc8ZGl2IGNsYXNzPSJmbGQiPjxsYWJlbCBmb3I9ImFzbyI+T3JkZW5hcjwvbGFiZWw+PHNlbGVjdCBpZD0iYXNvIj48b3B0aW9uIHZhbHVlPSJwdHNfZGVzYyIgJysocy5zb3J0PT09J3B0c19kZXNjJz8nc2VsZWN0ZWQnOicnKSsnPk1haXMgcG9udG9zPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icmVjZW50IiAnKyhzLnNvcnQ9PT0ncmVjZW50Jz8nc2VsZWN0ZWQnOicnKSsnPk1haXMgcmVjZW50ZXM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJub21lX2FzYyIgJysocy5zb3J0PT09J25vbWVfYXNjJz8nc2VsZWN0ZWQnOicnKSsnPk5vbWUgQS1aPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+JysKICAgICc8ZGl2IGNsYXNzPSJhZG1pbi1hY3Rpb25zIiBzdHlsZT0iYWxpZ24tc2VsZjpmbGV4LWVuZDtkaXNwbGF5OmZsZXg7Z2FwOjhweCI+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBpZD0iYWNsciIgc3R5bGU9InBhZGRpbmc6OXB4IDE0cHg7Zm9udC1zaXplOjEyLjVweCIgdGl0bGU9IkxpbXBhciBmaWx0cm9zIj7ihrogTGltcGFyPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBpZD0iYWV4cDEiIHN0eWxlPSJwYWRkaW5nOjlweCAxNHB4O2ZvbnQtc2l6ZToxMi41cHgiPuKshyBFeHBvcnRhciBFeGNlbDwvYnV0dG9uPjwvZGl2Pic7CgogIC8vIEJpbmQgZmlsdHJvcwogIFsnYXEnLCdhdicsJ2FwZicsJ2FjJywnYWgnLCdhbScsJ2FzbyddLmZvckVhY2goaWQ9PnsKICAgIGNvbnN0IGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtpZighZWwpcmV0dXJuOwogICAgY29uc3QgZXY9KGlkPT09J2FxJyk\/J2lucHV0JzonY2hhbmdlJzsKICAgIGxldCB0bzsKICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXYsZT0+ewogICAgICBjbGVhclRpbWVvdXQodG8pOwogICAgICB0bz1zZXRUaW1lb3V0KCgpPT57CiAgICAgICAgX2FkbUFsdW5vc1N0YXRlLnE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FxJykudmFsdWUudHJpbSgpOwogICAgICAgIF9hZG1BbHVub3NTdGF0ZS52ZXJ0aWNhbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXYnKS52YWx1ZTsKICAgICAgICBfYWRtQWx1bm9zU3RhdGUucGVyZmlsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGYnKS52YWx1ZTsKICAgICAgICBfYWRtQWx1bm9zU3RhdGUuY29uY3Vyc289ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjJykudmFsdWU7CiAgICAgICAgX2FkbUFsdW5vc1N0YXRlLmhhc19wcmVkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaCcpLnZhbHVlOwogICAgICAgIF9hZG1BbHVub3NTdGF0ZS5tYXJrZXRpbmc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FtJykudmFsdWU7CiAgICAgICAgX2FkbUFsdW5vc1N0YXRlLnNvcnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FzbycpLnZhbHVlOwogICAgICAgIF9hZG1BbHVub3NTdGF0ZS5wYWdlPTE7CiAgICAgICAgcmVuZGVyQWRtaW5BbHVub3NUYWJsZSgpOwogICAgICB9LGV2PT09J2lucHV0Jz8yODA6MCk7CiAgICB9KTsKICB9KTsKICBjb25zdCBjbHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjbHInKTsKICBpZihjbHIpY2xyLm9uY2xpY2s9KCk9PnsKICAgIE9iamVjdC5hc3NpZ24oX2FkbUFsdW5vc1N0YXRlLHtwYWdlOjEscTonJyx2ZXJ0aWNhbDonJyxwZXJmaWw6JycsY29uY3Vyc286JycsaGFzX3ByZWQ6JycsbWFya2V0aW5nOicnLHNvcnQ6J3JlY2VudCd9KTsKICAgIHJlbmRlckFkbWluQWx1bm9zKCk7CiAgfTsKICBjb25zdCBleHA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FleHAxJyk7CiAgaWYoZXhwKWV4cC5vbmNsaWNrPSgpPT5fYWRtRXhwb3J0QWx1bm9zQ3N2KCk7CgogIGF3YWl0IHJlbmRlckFkbWluQWx1bm9zVGFibGUoKTsKfQoKYXN5bmMgZnVuY3Rpb24gcmVuZGVyQWRtaW5BbHVub3NUYWJsZSgpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWx1bm9zQm94Jyk7aWYoIWJveClyZXR1cm47CiAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG\/igKY8L2Rpdj4nOwogIGNvbnN0IHtyb3dzLGNvdW50fT1hd2FpdCBfYWRtRmV0Y2hBbHVub3MoKTsKICBjb25zdCBzPV9hZG1BbHVub3NTdGF0ZTsKICBpZighcm93cy5sZW5ndGgpe2JveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5OZW5odW0gYWx1bm8gZW5jb250cmFkby48L2Rpdj4nO3JldHVybjt9CgogIGNvbnN0IHRycz1yb3dzLm1hcChwPT57CiAgICBjb25zdCB2QmFkZ2U9VkVSVElDQUxfQkFER0VbcC52ZXJ0aWNhbF18fCcnOwogICAgY29uc3QgdkxhYmVsPVZFUlRJQ0FMX0xBQkVMU1twLnZlcnRpY2FsXXx8KHAudmVydGljYWx8fCfigJQnKTsKICAgIGNvbnN0IHBlcmZpbExhYmVsPVBFUkZJTF9MQUJFTFNbcC5wZXJmaWxdfHwocC5wZXJmaWx8fCfigJQnKTsKICAgIHJldHVybiBgPHRyPgogICAgICA8dGQ+PGI+JHt2QmFkZ2U\/dkJhZGdlKycgJzonJ30ke2VzYyhwLm5vbWV8fCfigJQnKX08L2I+PGJyPjxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpIj4ke2VzYyhwLmNvbmN1cnNvfHwnc2VtIGNvbmN1cnNvJyl9PC9zbWFsbD48L3RkPgogICAgICA8dGQ+PHNtYWxsPiR7ZXNjKHZMYWJlbCl9PC9zbWFsbD48YnI+PHNtYWxsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMikiPiR7ZXNjKHBlcmZpbExhYmVsKX08L3NtYWxsPjwvdGQ+CiAgICAgIDx0ZD48c3BhbiB0aXRsZT0iJHtlc2MocC5jcGZ8fCcnKX0iPiR7X21hc2tDcGZEaXNwKHAuY3BmKX08L3NwYW4+PC90ZD4KICAgICAgPHRkPiR7ZXNjKF9tYXNrRW1haWwocC5lbWFpbCkpfTwvdGQ+CiAgICAgIDx0ZD4ke2VzYyhfbWFza1Bob25lKHAudGVsZWZvbmUpKX08L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSI+JHtwLnB0c308L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSI+JHtwLnBhbHBpdGVzfS8xMjwvdGQ+CiAgICAgIDx0ZD4ke3AubWFya2V0aW5nX2NvbnNlbnQ\/JzxzcGFuIGNsYXNzPSJwaWxsIG9rIj5TaW08L3NwYW4+JzonPHNwYW4gY2xhc3M9InBpbGwiPuKAlDwvc3Bhbj4nfTwvdGQ+CiAgICAgIDx0ZD4ke2VzYyhmbXRCZXQocC5jcmVhdGVkX2F0KSl9PC90ZD4KICAgICAgPHRkPjxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBkYXRhLWRldGFpbD0iJHtwLmlkfSIgc3R5bGU9InBhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjEycHgiPlZlcjwvYnV0dG9uPjwvdGQ+CiAgICA8L3RyPmA7CiAgfSkuam9pbignJyk7CgogIGNvbnN0IGFueUZpbHRlcj1zLnF8fHMudmVydGljYWx8fHMucGVyZmlsfHxzLmNvbmN1cnNvfHxzLmhhc19wcmVkfHxzLm1hcmtldGluZzsKICBjb25zdCB0b3RhbFBhZ2VzPU1hdGgubWF4KDEsTWF0aC5jZWlsKChjb3VudHx8cm93cy5sZW5ndGgpL0FETUlOX1BBR0VfU0laRSkpOwogIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPicrCiAgICAnPGgzPicrX2ZtdE4oY291bnQpKycgYWx1bm8nKyhjb3VudD09PTE\/Jyc6J3MnKSsoYW55RmlsdGVyPycgKGZpbHRyYWRvKSc6JycpKyc8L2gzPicrCiAgICAnPGRpdiBzdHlsZT0ib3ZlcmZsb3cteDphdXRvIj48dGFibGUgY2xhc3M9ImFkbWluLXRhYmxlIj4nKwogICAgICAnPHRoZWFkPjx0cj48dGg+Tm9tZSAvIENvbmN1cnNvPC90aD48dGg+VmVydGljYWwgLyBQZXJmaWw8L3RoPjx0aD5DUEY8L3RoPjx0aD5FbWFpbDwvdGg+PHRoPlRlbDwvdGg+PHRoIGNsYXNzPSJudW0iPlB0czwvdGg+PHRoIGNsYXNzPSJudW0iPlBhbHBpdGVzPC90aD48dGg+TWt0PC90aD48dGg+SW5zY3Jpw6fDo288L3RoPjx0aD48L3RoPjwvdHI+PC90aGVhZD4nKwogICAgICAnPHRib2R5PicrdHJzKyc8L3Rib2R5PicrCiAgICAnPC90YWJsZT48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImFkbWluLXBhZ2luYXRpb24iPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QiIGlkPSJhcHBfcHJldiIgJysocy5wYWdlPT09MT8nZGlzYWJsZWQnOicnKSsnPuKGkCBBbnRlcmlvcjwvYnV0dG9uPicrCiAgICAgICc8c3Bhbj5Qw6FnaW5hICcrcy5wYWdlKycgZGUgJyt0b3RhbFBhZ2VzKyc8L3NwYW4+JysKICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgaWQ9ImFwcF9uZXh0IiAnKyhzLnBhZ2U+PXRvdGFsUGFnZXM\/J2Rpc2FibGVkJzonJykrJz5QcsOzeGltYSDihpI8L2J1dHRvbj4nKwogICAgJzwvZGl2PicrCiAgJzwvZGl2Pic7CgogIGNvbnN0IHB2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBfcHJldicpLG54PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHBfbmV4dCcpOwogIGlmKHB2KXB2Lm9uY2xpY2s9KCk9PntpZihzLnBhZ2U+MSl7cy5wYWdlLS07cmVuZGVyQWRtaW5BbHVub3NUYWJsZSgpO319OwogIGlmKG54KW54Lm9uY2xpY2s9KCk9PntzLnBhZ2UrKztyZW5kZXJBZG1pbkFsdW5vc1RhYmxlKCk7fTsKCiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRldGFpbF0nKS5mb3JFYWNoKGJ0bj0+ewogICAgYnRuLm9uY2xpY2s9KCk9Pm9wZW5BZG1pblBsYXllckRldGFpbChidG4uZGF0YXNldC5kZXRhaWwpOwogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBvcGVuQWRtaW5QbGF5ZXJEZXRhaWwocGxheWVySWQpewogIGNvbnN0IG1vZGFsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbk1vZGFsJyk7CiAgY29uc3QgYm9keT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW5Nb2RhbEJvZHknKTsKICBpZighbW9kYWx8fCFib2R5KXJldHVybjsKICBib2R5LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiIHN0eWxlPSJwYWRkaW5nOjQwcHggMCI+Q2FycmVnYW5kbyBwZXJmaWzigKY8L2Rpdj4nOwogIG1vZGFsLmhpZGRlbj1mYWxzZTsKICBsZXQgZGF0YT1udWxsOwogIHRyeXtjb25zdCByPWF3YWl0IHN1cGEucnBjKCdnZXRfYWRtaW5fcGxheWVyX2RldGFpbCcse3BfaWQ6cGxheWVySWR9KTtpZighci5lcnJvcilkYXRhPXIuZGF0YTt9CiAgY2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKTt9CiAgaWYoIWRhdGF8fCFkYXRhLnBsYXllcil7Ym9keS5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5Ow6NvIGZvaSBwb3Nzw612ZWwgY2FycmVnYXIgbyBwZXJmaWwuPC9kaXY+JztyZXR1cm47fQogIGNvbnN0IHA9ZGF0YS5wbGF5ZXI7CiAgY29uc3QgcHJlZHM9ZGF0YS5wYWxwaXRlc3x8W107CiAgY29uc3QgYWN0cz1kYXRhLmFkbWluX2FjdGlvbnN8fFtdOwoKICBjb25zdCBjb25jT3B0cz1bLi4uU0NIT09MU19NSUwsIC4uLlNDSE9PTFNfRVZdOwogIGlmKHAuY29uY3Vyc28mJiFjb25jT3B0cy5pbmNsdWRlcyhwLmNvbmN1cnNvKSljb25jT3B0cy51bnNoaWZ0KHAuY29uY3Vyc28pOwoKICBjb25zdCBwcmVkVHJzPXByZWRzLm1hcChwcj0+ewogICAgY29uc3Qgc2M9cHIucG9pbnRzOwogICAgY29uc3Qgb2ZpYz0ocHIucmVzdWx0X2hvbWUhPW51bGwmJnByLnJlc3VsdF9hd2F5IT1udWxsKT8ocHIucmVzdWx0X2hvbWUrJ8OXJytwci5yZXN1bHRfYXdheSk6J+KAlCc7CiAgICByZXR1cm4gYDx0cj48dGQ+PGI+JHtlc2MocHIuaG9tZSl9IMOXICR7ZXNjKHByLmF3YXkpfTwvYj48YnI+PHNtYWxsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMikiPiR7ZXNjKHByLnNlbCl9IMK3ICR7Zm10RGF0ZShwci5raWNrb2ZmKX0ke3ByLmlzX2ZpbmFsX3JvdW5kPycgwrcgMsOXJzonJ308L3NtYWxsPjwvdGQ+YCsKICAgICAgYDx0ZCBjbGFzcz0ibnVtIj48Yj4ke3ByLmhvbWVfZ29hbHN9w5cke3ByLmF3YXlfZ29hbHN9PC9iPjwvdGQ+PHRkIGNsYXNzPSJudW0iPiR7b2ZpY308L3RkPmArCiAgICAgIGA8dGQgY2xhc3M9Im51bSI+JHtzYyE9bnVsbD8nKycrc2M6J+KAlCd9PC90ZD48L3RyPmA7CiAgfSkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp2YXIoLS1tdXQpIj5OZW5odW0gcGFscGl0ZSBlbnZpYWRvLjwvdGQ+PC90cj4nOwoKICAvLyBJbmRpY2Fkb3MgcG9yIGVzdGUgYWx1bm8gKGxpbmthZG9zIHZpYSByZWZfY29kZSkuIE1pZ3JhdGlvbiAwMDE5IGFkaWNpb25hIGRhdGEuaW5kaWNhZG9zLgogIGNvbnN0IGluZGljYWRvcz1BcnJheS5pc0FycmF5KGRhdGEuaW5kaWNhZG9zKT9kYXRhLmluZGljYWRvczpbXTsKICBjb25zdCBpbmRpY2Fkb3NUcnM9aW5kaWNhZG9zLm1hcChyPT57CiAgICBjb25zdCB2VGFnPXIudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8n8J+Okyc6KHIudmVydGljYWw9PT0nbWlsaXRhcmVzJz8n8J+qlic6JycpOwogICAgY29uc3Qgc3RhdHVzUGlsbD1yLnBhbHBpdG91CiAgICAgID8nPHNwYW4gY2xhc3M9InBpbGwiIHN0eWxlPSJiYWNrZ3JvdW5kOiNlN2Y2ZWU7Y29sb3I6IzBhNWIzZjtib3JkZXI6MXB4IHNvbGlkICNiZmU2ZDA7cGFkZGluZzozcHggOXB4O2JvcmRlci1yYWRpdXM6OTlweDtmb250LXNpemU6MTEuNXB4O2ZvbnQtd2VpZ2h0OjcwMCI+4pyTIHbDoWxpZGE8L3NwYW4+JwogICAgICA6JzxzcGFuIGNsYXNzPSJwaWxsIiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1zb2Z0KTtjb2xvcjp2YXIoLS1tdXQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7cGFkZGluZzozcHggOXB4O2JvcmRlci1yYWRpdXM6OTlweDtmb250LXNpemU6MTEuNXB4O2ZvbnQtd2VpZ2h0OjcwMCI+YWd1YXJkYW5kbyBwYWxwaXRlPC9zcGFuPic7CiAgICBjb25zdCB1c2VybmFtZT1yLnVzZXJuYW1lPygnIMK3IEAnK2VzYyhyLnVzZXJuYW1lKSk6Jyc7CiAgICByZXR1cm4gYDx0cj4KICAgICAgPHRkPjxiPiR7dlRhZ30gJHtlc2Moci5ub21lKX08L2I+JHt1c2VybmFtZX08YnI+PHNtYWxsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMikiPiR7ZXNjKHIuY29uY3Vyc298fCdzZW0gY29uY3Vyc28nKX08L3NtYWxsPjwvdGQ+CiAgICAgIDx0ZD48c21hbGw+JHtlc2Moci5lbWFpbHx8JycpfTwvc21hbGw+JHtyLnRlbGVmb25lPygnPGJyPjxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpIj4nK2VzYyhyLnRlbGVmb25lKSsnPC9zbWFsbD4nKTonJ308L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSI+PHNtYWxsPiR7ZXNjKGZtdEJldChyLmNyZWF0ZWRfYXQpKX08L3NtYWxsPjwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibnVtIj4ke3IucGFscGl0ZXN8fDB9LzEyPC90ZD4KICAgICAgPHRkIGNsYXNzPSJudW0iPjxiPiR7ci5wdHN8fDB9PC9iPjwvdGQ+CiAgICAgIDx0ZD4ke3N0YXR1c1BpbGx9PC90ZD4KICAgICAgPHRkPjxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgZGF0YS1kZXRhaWw9IiR7ZXNjKHIuaWQpfSIgc3R5bGU9InBhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjExLjVweCI+QWJyaXI8L2J1dHRvbj48L3RkPgogICAgPC90cj5gOwogIH0pLmpvaW4oJycpOwogIGNvbnN0IHZhbGlkYXM9aW5kaWNhZG9zLmZpbHRlcihyPT5yLnBhbHBpdG91KS5sZW5ndGg7CgogIC8vIEJyZWFrZG93biBwb3IgZXNjb2xhL2N1cnNvIGEgcGFydGlyIGRlIGRhdGEuaW5kaWNhZG9zIChjw6FsY3VsbyBjbGllbnQtc2lkZSwgc2VtIFJQQyBub3ZhKQogIC8vIFJldXNhYmxlOiBhY2VpdGEgdW0gZmlsdHJvIGRlIHZlcnRpY2FsICgiYWxsIiB8ICJtaWxpdGFyZXMiIHwgInZlc3RpYnVsYXJlcyIpIGUgcmUtcmVuZGVyLgogIGNvbnN0IF9jb21wdXRlQnJlYWtkb3duPShmaWx0ZXIpPT57CiAgICBjb25zdCBzcmM9KGZpbHRlcj09PSdhbGwnKT9pbmRpY2Fkb3M6aW5kaWNhZG9zLmZpbHRlcihyPT5yLnZlcnRpY2FsPT09ZmlsdGVyKTsKICAgIGNvbnN0IG1hcD17fTsKICAgIHNyYy5mb3JFYWNoKHI9PnsKICAgICAgY29uc3Qga2V5PShyLnZlcnRpY2FsfHwnLScpKyd8fCcrKHIuY29uY3Vyc298fCdTZW0gY29uY3Vyc28nKTsKICAgICAgaWYoIW1hcFtrZXldKW1hcFtrZXldPXt2ZXJ0aWNhbDpyLnZlcnRpY2FsfHwnLScsY29uY3Vyc286ci5jb25jdXJzb3x8J1NlbSBjb25jdXJzbycsdG90YWw6MCx2YWxpZGE6MH07CiAgICAgIG1hcFtrZXldLnRvdGFsKys7CiAgICAgIGlmKHIucGFscGl0b3UpbWFwW2tleV0udmFsaWRhKys7CiAgICB9KTsKICAgIGNvbnN0IHJvd3M9T2JqZWN0LnZhbHVlcyhtYXApLnNvcnQoKGEsYik9PmIudG90YWwtYS50b3RhbHx8YS5jb25jdXJzby5sb2NhbGVDb21wYXJlKGIuY29uY3Vyc28pKTsKICAgIHJldHVybiB7cm93cyx0b3RhbDpzcmMubGVuZ3RofTsKICB9OwogIGNvbnN0IF9yZW5kZXJCcmVha2Rvd25JbnRvPShmaWx0ZXIpPT57CiAgICBjb25zdCBpbm5lcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJlYWtkb3duX2lubmVyJyk7CiAgICBjb25zdCBlbXB0eT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJlYWtkb3duX2VtcHR5Jyk7CiAgICBjb25zdCBzdWI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JyZWFrZG93bl9zdWInKTsKICAgIGlmKCFpbm5lcnx8IXN1YilyZXR1cm47CiAgICBjb25zdCB7cm93cyx0b3RhbH09X2NvbXB1dGVCcmVha2Rvd24oZmlsdGVyKTsKICAgIGlmKHJvd3MubGVuZ3RoPDEpewogICAgICBpbm5lci5pbm5lckhUTUw9Jyc7CiAgICAgIGlmKGVtcHR5KWVtcHR5LnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgc3ViLmlubmVySFRNTD0nTmVuaHVtIGluZGljYWRvIG5lc3NhIHZlcnRpY2FsLic7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKGVtcHR5KWVtcHR5LnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgY29uc3QgbWF4PXJvd3NbMF0udG90YWw7CiAgICBjb25zdCBsYmw9KGZpbHRlcj09PSdhbGwnKT8nYW1pZ29zIHF1ZSBlc3RlIGFsdW5vIHRyb3V4ZSc6KGZpbHRlcj09PSdtaWxpdGFyZXMnPydhbWlnb3MgcnVtbyBhIGNvbmN1cnNvcyBtaWxpdGFyZXMnOidhbWlnb3MgcnVtbyBhbyBFTkVNL3Zlc3RpYnVsYXJlcycpOwogICAgc3ViLmlubmVySFRNTD0nUHJhIG9uZGUgZm9yYW0gb3MgPGI+Jyt0b3RhbCsnPC9iPiAnK2xibCsnLiBPcmRlbmFkbyBwb3Igdm9sdW1lLic7CiAgICBpbm5lci5pbm5lckhUTUw9cm93cy5tYXAoYj0+ewogICAgICBjb25zdCB2VGFnPWIudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8n8J+Okyc6KGIudmVydGljYWw9PT0nbWlsaXRhcmVzJz8n8J+qlic6J+KAoicpOwogICAgICBjb25zdCB2Q29sb3I9Yi52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPycjZTNhNTFmJzooYi52ZXJ0aWNhbD09PSdtaWxpdGFyZXMnPycjMDYzNTJhJzonIzk5OScpOwogICAgICBjb25zdCB2Q29sb3IyPWIudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJz8nI2Y1Yzc0Zic6KGIudmVydGljYWw9PT0nbWlsaXRhcmVzJz8nIzBkN2Q1Nic6JyNiYmInKTsKICAgICAgY29uc3QgcGN0PXRvdGFsPjA\/KChiLnRvdGFsL3RvdGFsKSoxMDApLnRvRml4ZWQoMCk6JzAnOwogICAgICBjb25zdCBmaWxsUGN0PW1heD4wP01hdGgucm91bmQoKGIudG90YWwvbWF4KSoxMDApOjA7CiAgICAgIGNvbnN0IGNvbnZQY3Q9Yi50b3RhbD4wP01hdGgucm91bmQoKGIudmFsaWRhL2IudG90YWwpKjEwMCk6MDsKICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjEuNGZyIDJmciBhdXRvO2dhcDoxNHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOnZhcigtLWJnLXNvZnQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czoxMnB4Ij4KICAgICAgICA8ZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxMy41cHg7Y29sb3I6dmFyKC0taW5rKSI+JHt2VGFnfSAke2VzYyhiLmNvbmN1cnNvKX08L2Rpdj4KICAgICAgICAgIDxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpO2ZvbnQtc2l6ZToxMS41cHgiPiR7Yi52YWxpZGF9IHbDoWxpZGEke2IudmFsaWRhPT09MT8nJzoncyd9IGRlICR7Yi50b3RhbH0gwrcgJHtjb252UGN0fSUgcGFscGl0YXJhbTwvc21hbGw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1tdXRlKTtib3JkZXItcmFkaXVzOjk5cHg7aGVpZ2h0OjEwcHg7b3ZlcmZsb3c6aGlkZGVuIj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCR7dkNvbG9yfSwke3ZDb2xvcjJ9KTtoZWlnaHQ6MTAwJTt3aWR0aDoke2ZpbGxQY3R9JTtib3JkZXItcmFkaXVzOjk5cHg7dHJhbnNpdGlvbjp3aWR0aCAuM3MgZWFzZSI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDttaW4td2lkdGg6NzRweCI+CiAgICAgICAgICA8YiBzdHlsZT0iY29sb3I6JHt2Q29sb3J9O2ZvbnQtZmFtaWx5OidCcmljb2xhZ2UgR3JvdGVzcXVlJztmb250LXdlaWdodDo4MDA7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MSI+JHtiLnRvdGFsfTwvYj4KICAgICAgICAgIDxzbWFsbCBzdHlsZT0iZGlzcGxheTpibG9jaztjb2xvcjp2YXIoLS1tdXQtMik7Zm9udC1zaXplOjExcHg7bWFyZ2luLXRvcDoxcHgiPiR7cGN0fSUgJHtmaWx0ZXI9PT0nYWxsJz8nZG8gdG90YWwnOidkYSB2ZXJ0aWNhbCd9PC9zbWFsbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+YDsKICAgIH0pLmpvaW4oJycpOwogIH07CiAgLy8gQ29udGEgcG9yIHZlcnRpY2FsIChiYWRnZSBkb3MgYm90w7VlcyDigJQgcmV1c2FkYSBub3MgMiBncnVwb3MgZGUgcGlsbHMpCiAgY29uc3QgX3F0ZE1pbD1pbmRpY2Fkb3MuZmlsdGVyKHI9PnIudmVydGljYWw9PT0nbWlsaXRhcmVzJykubGVuZ3RoOwogIGNvbnN0IF9xdGRFdj1pbmRpY2Fkb3MuZmlsdGVyKHI9PnIudmVydGljYWw9PT0ndmVzdGlidWxhcmVzJykubGVuZ3RoOwogIC8vIEhlbHBlcjogZ2VyYSBvIG1lc21vIGdydXBvIGRlIDMgcGlsbHMgY29tIHVtIGRhdGEtdmZpbHRlci1ncm91cCBwcmEgaWRlbnRpZmljYcOnw6NvCiAgY29uc3QgX3JlbmRlckZpbHRlclBpbGxzPShncm91cElkKT0+KAogICAgJzxkaXYgY2xhc3M9InZmaWx0ZXIiIGRhdGEtdmZpbHRlci1ncm91cD0iJytncm91cElkKyciIHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDttYXJnaW46MCAwIDEycHgiPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QgdmZpbHRlci1idG4gYWN0aXZlIiBkYXRhLXZmaWx0ZXI9ImFsbCIgc3R5bGU9InBhZGRpbmc6N3B4IDE0cHg7Zm9udC1zaXplOjEyLjVweCI+VG9kb3MgPGI+JytpbmRpY2Fkb3MubGVuZ3RoKyc8L2I+PC9idXR0b24+JysKICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCB2ZmlsdGVyLWJ0biIgZGF0YS12ZmlsdGVyPSJtaWxpdGFyZXMiIHN0eWxlPSJwYWRkaW5nOjdweCAxNHB4O2ZvbnQtc2l6ZToxMi41cHgiPvCfqpYgTWlsaXRhcmVzIDxiPicrX3F0ZE1pbCsnPC9iPjwvYnV0dG9uPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QgdmZpbHRlci1idG4iIGRhdGEtdmZpbHRlcj0idmVzdGlidWxhcmVzIiBzdHlsZT0icGFkZGluZzo3cHggMTRweDtmb250LXNpemU6MTIuNXB4Ij7wn46TIFZlc3RpYnVsYXJlcyA8Yj4nK19xdGRFdisnPC9iPjwvYnV0dG9uPicrCiAgICAnPC9kaXY+JwogICk7CiAgY29uc3QgX2ZpbHRlckJ0bnM9X3JlbmRlckZpbHRlclBpbGxzKCd0YWJsZScpOwoKICAvLyBFc3F1ZWxldG8gaW5pY2lhbCBkbyBicmVha2Rvd24g4oCUIHZhemlvLCBwcmVlbmNoaWRvIHBvciBfcmVuZGVyQnJlYWtkb3duSW50byBhcMOzcyBib2R5LmlubmVySFRNTC4KICAvLyBQaWxscyBkdXBsaWNhZG9zIGFxdWkgcHJhIGZpY2FyIHZpc8OtdmVsIGVtIGNpbWEgZG8gY2FyZCB0YW1iw6ltIChzaW5jcm9uaXphZG8gY29tIG9zIGRlIGJhaXhvKS4KICBjb25zdCBfYmRJbml0aWFsQWxsPV9jb21wdXRlQnJlYWtkb3duKCdhbGwnKTsKICBjb25zdCBicmVha2Rvd25CbG9jaz0oX2JkSW5pdGlhbEFsbC5yb3dzLmxlbmd0aDwyKT8nJzooCiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGgzPvCfk4ogSW5kaWNhZG9zIHBvciBlc2NvbGEvY3Vyc288L2gzPicrCiAgICBfcmVuZGVyRmlsdGVyUGlsbHMoJ2JyZWFrZG93bicpKwogICAgJzxwIGlkPSJicmVha2Rvd25fc3ViIiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDE0cHgiPjwvcD4nKwogICAgJzxkaXYgaWQ9ImJyZWFrZG93bl9lbXB0eSIgc3R5bGU9ImRpc3BsYXk6bm9uZTtmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS1tdXQpO3BhZGRpbmc6MTRweCAwIj5OZW5odW0gaW5kaWNhZG8gbmVzc2EgdmVydGljYWwuPC9kaXY+JysKICAgICc8ZGl2IGlkPSJicmVha2Rvd25faW5uZXIiIHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxMHB4Ij48L2Rpdj4nKwogICAgJzwvZGl2PicKICApOwoKICBjb25zdCBpbmRpY2Fkb3NCbG9jaz0KICAgICc8ZGl2IGNsYXNzPSJhZG1pbi1jYXJkIj48aDM+8J+ToyBJbmRpY2Fkb3MgcG9yIGVzdGUgYWx1bm8gKCcraW5kaWNhZG9zLmxlbmd0aCsnKTwvaDM+JysKICAgIChpbmRpY2Fkb3MubGVuZ3RoCiAgICAgID8gKCc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDEycHgiPicKICAgICAgICAgICsnPGI+Jyt2YWxpZGFzKyc8L2I+IGluZGljYcOnw6NvJysodmFsaWRhcz09PTE\/Jyc6J8O1ZXMnKSsnIHbDoWxpZGEnKyh2YWxpZGFzPT09MT8nJzoncycpKycgwrcgJwogICAgICAgICAgKyc8Yj4nKyhpbmRpY2Fkb3MubGVuZ3RoLXZhbGlkYXMpKyc8L2I+IGFpbmRhIHNlbSBwYWxwaXRlLiAnCiAgICAgICAgICArJzxzbWFsbD5DbGlxdWUgZW0gIkFicmlyIiBwcmEgdmVyIG8gcGVyZmlsIGNvbXBsZXRvIGRvIGluZGljYWRvLjwvc21hbGw+PC9wPicKICAgICAgICAgICtfZmlsdGVyQnRucwogICAgICAgICAgKyc8ZGl2IGlkPSJpbmRpY2Fkb3NfY291bnQiIHN0eWxlPSJmb250LXNpemU6MTIuNXB4O2NvbG9yOnZhcigtLW11dC0yKTttYXJnaW46MCAwIDhweCI+PC9kaXY+JwogICAgICAgICAgKyc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iPjx0YWJsZSBjbGFzcz0iYWRtaW4tdGFibGUiPicKICAgICAgICAgICsnPHRoZWFkPjx0cj48dGg+SW5kaWNhZG88L3RoPjx0aD5Db250YXRvPC90aD48dGggY2xhc3M9Im51bSI+Q2FkYXN0cm88L3RoPjx0aCBjbGFzcz0ibnVtIj5QYWxwaXRlczwvdGg+PHRoIGNsYXNzPSJudW0iPlB0czwvdGg+PHRoPlN0YXR1czwvdGg+PHRoPjwvdGg+PC90cj48L3RoZWFkPicKICAgICAgICAgICsnPHRib2R5IGlkPSJpbmRpY2Fkb3NfdGJvZHkiPicraW5kaWNhZG9zVHJzKyc8L3Rib2R5PjwvdGFibGU+PC9kaXY+JykKICAgICAgOiAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxNHB4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luOjAiPk5pbmd1w6ltIHNlIGNhZGFzdHJvdSBhaW5kYSB1c2FuZG8gbyBsaW5rIGRlIGluZGljYcOnw6NvIGRlc3RlIGFsdW5vICg8Y29kZT4nK2VzYyhwLnJlZl9jb2RlfHwnJykrJzwvY29kZT4pLjwvcD4nKQogICAgKyc8L2Rpdj4nOwoKICBjb25zdCBhY3RzVHJzPWFjdHMubGVuZ3RoP2FjdHMubWFwKGE9PmA8dHI+PHRkPiR7ZXNjKGEuYWN0aW9uKX08L3RkPjx0ZD48c21hbGw+JHtlc2MoSlNPTi5zdHJpbmdpZnkoYS5iZWZvcmVfdmFsdWUpfHwnJyl9PC9zbWFsbD48L3RkPjx0ZD48c21hbGw+JHtlc2MoSlNPTi5zdHJpbmdpZnkoYS5hZnRlcl92YWx1ZSl8fCcnKX08L3NtYWxsPjwvdGQ+PHRkPiR7ZXNjKGEucmVhc29ufHwnJyl9PC90ZD48dGQ+JHtlc2MoZm10QmV0KGEuY3JlYXRlZF9hdCkpfTwvdGQ+PC90cj5gKS5qb2luKCcnKTonJzsKCiAgYm9keS5pbm5lckhUTUw9CiAgICAnPGgyIHN0eWxlPSJmb250LWZhbWlseTpCcmljb2xhZ2UgR3JvdGVzcXVlO2ZvbnQtd2VpZ2h0OjgwMDtmb250LXNpemU6MjRweDttYXJnaW46MCAwIDRweDtjb2xvcjp2YXIoLS1pbmspIj4nK2VzYyhwLm5vbWUpKyc8L2gyPicrCiAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dC0yKTttYXJnaW46MCAwIDIycHgiPkluc2NyaXRvIGVtICcrZXNjKGZtdEJldChwLmNyZWF0ZWRfYXQpKSsnIMK3IHJlZiBjb2RlIDxiPicrZXNjKHAucmVmX2NvZGV8fCcnKSsnPC9iPicrKHAucmVmZXJyZWRfYnk\/KCcgwrcgaW5kaWNhZG8gcG9yICcrZXNjKHAucmVmZXJyZWRfYnkpKTonJykrJzwvcD4nKwoKICAgICc8ZGl2IGNsYXNzPSJrcGktZ3JpZCIgc3R5bGU9ImdyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE0MHB4LDFmcikpO21hcmdpbi1ib3R0b206MjJweCI+JysKICAgICAgX2twaUNhcmQoJ1BvbnRvcycscC5wdHN8fDAsJycsdHJ1ZSkrCiAgICAgIF9rcGlDYXJkKCdQYWxwaXRlcycscC5wYWxwaXRlc19jb3VudCsnLzEyJywnJykrCiAgICAgIF9rcGlDYXJkKCdDcmF2YWRhcycscC5jcmF2YWRhcywncGxhY2FyZXMgZXhhdG9zJykrCiAgICAgIF9rcGlDYXJkKCdJbmRpY2HDp8O1ZXMnLGRhdGEuaW5kaWNhY29lc192YWxpZGFzKycvJytkYXRhLmluZGljYWNvZXNfdG90YWlzLCd2w6FsaWRhcyAvIHRvdGFpcycpKwogICAgJzwvZGl2PicrCgogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxoMz5EYWRvcyBwZXNzb2FpcyAoUElJIGNvbXBsZXRhKTwvaDM+JysKICAgICAgJzx0YWJsZSBjbGFzcz0iYWRtaW4tdGFibGUiPicrCiAgICAgICAgJzx0cj48dGQ+PGI+Tm9tZTwvYj48L3RkPjx0ZD4nK2VzYyhwLm5vbWUpKyc8L3RkPjwvdHI+JysKICAgICAgICAnPHRyPjx0ZD48Yj5DUEY8L2I+PC90ZD48dGQ+Jytlc2MocC5jcGYpKyc8L3RkPjwvdHI+JysKICAgICAgICAnPHRyPjx0ZD48Yj5FbWFpbDwvYj48L3RkPjx0ZD4nK2VzYyhwLmVtYWlsKSsnPC90ZD48L3RyPicrCiAgICAgICAgJzx0cj48dGQ+PGI+VGVsZWZvbmU8L2I+PC90ZD48dGQ+Jytlc2MocC50ZWxlZm9uZXx8J+KAlCcpKyc8L3RkPjwvdHI+JysKICAgICAgICAnPHRyPjx0ZD48Yj5WZXJ0aWNhbDwvYj48L3RkPjx0ZD4nK2VzYyhWRVJUSUNBTF9MQUJFTFNbcC52ZXJ0aWNhbF18fHAudmVydGljYWx8fCfigJQnKSsnPC90ZD48L3RyPicrCiAgICAgICAgJzx0cj48dGQ+PGI+UGVyZmlsPC9iPjwvdGQ+PHRkPicrZXNjKFBFUkZJTF9MQUJFTFNbcC5wZXJmaWxdfHxwLnBlcmZpbHx8J+KAlCcpKyc8L3RkPjwvdHI+JysKICAgICAgICAnPHRyPjx0ZD48Yj5Db25jdXJzby9DdXJzbzwvYj48L3RkPjx0ZD4nK2VzYyhwLmNvbmN1cnNvfHwn4oCUJykrJzwvdGQ+PC90cj4nKwogICAgICAgICc8dHI+PHRkPjxiPk1hcmtldGluZzwvYj48L3RkPjx0ZD4nKyhwLm1hcmtldGluZ19jb25zZW50PydTaW0nOidOw6NvJykrJzwvdGQ+PC90cj4nKwogICAgICAgICc8dHI+PHRkPjxiPlNGTUMgc3luYzwvYj48L3RkPjx0ZD4nKyhwLnN5bmNlZF90b19zZm1jPyfinJMnOifigJQnKSsnPC90ZD48L3RyPicrCiAgICAgICc8L3RhYmxlPicrCiAgICAnPC9kaXY+JysKCiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGgzPkFsdGVyYXIgY29uY3Vyc288L2gzPicrCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDEycHgiPkNvcnJpZ2UgY2FkYXN0cm8gZXJyYWRvLiBBIG11ZGFuw6dhIGZpY2EgcmVnaXN0cmFkYSBlbSA8Y29kZT5hZG1pbl9hY3Rpb25zPC9jb2RlPi48L3A+JysKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTBweDthbGlnbi1pdGVtczpmbGV4LWVuZDtmbGV4LXdyYXA6d3JhcCI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZmxkIiBzdHlsZT0iZmxleDoxO21pbi13aWR0aDoyMjBweCI+PGxhYmVsIGZvcj0ibmV3Q29uYyI+Tm92byBjb25jdXJzbzwvbGFiZWw+PHNlbGVjdCBpZD0ibmV3Q29uYyI+JysKICAgICAgICAgIGNvbmNPcHRzLm1hcChjPT5gPG9wdGlvbiB2YWx1ZT0iJHtlc2MoYyl9IiAke2M9PT1wLmNvbmN1cnNvPydzZWxlY3RlZCc6Jyd9PiR7ZXNjKGMpfTwvb3B0aW9uPmApLmpvaW4oJycpKwogICAgICAgICc8L3NlbGVjdD48L2Rpdj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJmbGQiIHN0eWxlPSJmbGV4OjI7bWluLXdpZHRoOjI0MHB4Ij48bGFiZWwgZm9yPSJjb25jUmVhc29uIj5Nb3Rpdm8gKHJlZ2lzdHJhZG8gbm8gbG9nKTwvbGFiZWw+PGlucHV0IGlkPSJjb25jUmVhc29uIiBwbGFjZWhvbGRlcj0iZXguOiBhbHVubyBpbmZvcm1vdSB2aWEgV2hhdHNBcHAiPjwvZGl2PicrCiAgICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBpZD0ic2F2ZUNvbmMiIHN0eWxlPSJwYWRkaW5nOjEwcHggMThweDtmb250LXNpemU6MTNweCI+U2FsdmFyPC9idXR0b24+JysKICAgICAgJzwvZGl2PicrCiAgICAnPC9kaXY+JysKCiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGgzPlBhbHBpdGVzIGpvZ28gYSBqb2dvPC9oMz4nKwogICAgICAnPHRhYmxlIGNsYXNzPSJhZG1pbi10YWJsZSI+PHRoZWFkPjx0cj48dGg+Sm9nbzwvdGg+PHRoIGNsYXNzPSJudW0iPlBhbHBpdGU8L3RoPjx0aCBjbGFzcz0ibnVtIj5PZmljaWFsPC90aD48dGggY2xhc3M9Im51bSI+UHRzPC90aD48L3RyPjwvdGhlYWQ+JysKICAgICAgJzx0Ym9keT4nK3ByZWRUcnMrJzwvdGJvZHk+PC90YWJsZT4nKwogICAgJzwvZGl2PicrCgogICAgYnJlYWtkb3duQmxvY2srCgogICAgaW5kaWNhZG9zQmxvY2srCgogICAgKGFjdHNUcnM\/KCc8ZGl2IGNsYXNzPSJhZG1pbi1jYXJkIj48aDM+SGlzdMOzcmljbyBkZSBhbHRlcmHDp8O1ZXM8L2gzPicrCiAgICAgICc8dGFibGUgY2xhc3M9ImFkbWluLXRhYmxlIj48dGhlYWQ+PHRyPjx0aD5Bw6fDo288L3RoPjx0aD5BbnRlczwvdGg+PHRoPkRlcG9pczwvdGg+PHRoPk1vdGl2bzwvdGg+PHRoPlF1YW5kbzwvdGg+PC90cj48L3RoZWFkPicrCiAgICAgICc8dGJvZHk+JythY3RzVHJzKyc8L3Rib2R5PjwvdGFibGU+PC9kaXY+Jyk6JycpOwoKICAvLyBMaWdhIG9zIGJvdMO1ZXMgIkFicmlyIiBkYSBsaXN0YSBkZSBpbmRpY2Fkb3Mg4oCUIGRyaWxsLWRvd24gcmVjdXJzaXZvIG5vIG1lc21vIG1vZGFsLgogIGJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGV0YWlsXScpLmZvckVhY2goYnRuPT57CiAgICBidG4ub25jbGljaz0oKT0+b3BlbkFkbWluUGxheWVyRGV0YWlsKGJ0bi5kYXRhc2V0LmRldGFpbCk7CiAgfSk7CgogIC8vIEZpbHRyb3MgVE9ET1MgLyBNSUxJVEFSRVMgLyBWRVNUSUJVTEFSRVMgbmEgdGFiZWxhIGRlIGluZGljYWRvcwogIGNvbnN0IF92ZmlsdGVyQnRucz1ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJy52ZmlsdGVyLWJ0bicpOwogIGNvbnN0IF90Ym9keT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5kaWNhZG9zX3Rib2R5Jyk7CiAgY29uc3QgX2NvdW50TGFiZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZGljYWRvc19jb3VudCcpOwogIGNvbnN0IF9yZW5kZXJJbmRpY2Fkb3NGaWx0ZXJlZD0oZmlsdGVyKT0+ewogICAgaWYoIV90Ym9keSlyZXR1cm47CiAgICBjb25zdCBmaWx0ZXJlZD0oZmlsdGVyPT09J2FsbCcpP2luZGljYWRvczppbmRpY2Fkb3MuZmlsdGVyKHI9PnIudmVydGljYWw9PT1maWx0ZXIpOwogICAgY29uc3QgdHJzPWZpbHRlcmVkLm1hcChyPT57CiAgICAgIGNvbnN0IHZUYWc9ci52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPyfwn46TJzooci52ZXJ0aWNhbD09PSdtaWxpdGFyZXMnPyfwn6qWJzonJyk7CiAgICAgIGNvbnN0IHN0YXR1c1BpbGw9ci5wYWxwaXRvdQogICAgICAgID8nPHNwYW4gY2xhc3M9InBpbGwiIHN0eWxlPSJiYWNrZ3JvdW5kOiNlN2Y2ZWU7Y29sb3I6IzBhNWIzZjtib3JkZXI6MXB4IHNvbGlkICNiZmU2ZDA7cGFkZGluZzozcHggOXB4O2JvcmRlci1yYWRpdXM6OTlweDtmb250LXNpemU6MTEuNXB4O2ZvbnQtd2VpZ2h0OjcwMCI+4pyTIHbDoWxpZGE8L3NwYW4+JwogICAgICAgIDonPHNwYW4gY2xhc3M9InBpbGwiIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLXNvZnQpO2NvbG9yOnZhcigtLW11dCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtwYWRkaW5nOjNweCA5cHg7Ym9yZGVyLXJhZGl1czo5OXB4O2ZvbnQtc2l6ZToxMS41cHg7Zm9udC13ZWlnaHQ6NzAwIj5hZ3VhcmRhbmRvIHBhbHBpdGU8L3NwYW4+JzsKICAgICAgY29uc3QgdXNlcm5hbWU9ci51c2VybmFtZT8oJyDCtyBAJytlc2Moci51c2VybmFtZSkpOicnOwogICAgICByZXR1cm4gYDx0cj4KICAgICAgICA8dGQ+PGI+JHt2VGFnfSAke2VzYyhyLm5vbWUpfTwvYj4ke3VzZXJuYW1lfTxicj48c21hbGwgc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKSI+JHtlc2Moci5jb25jdXJzb3x8J3NlbSBjb25jdXJzbycpfTwvc21hbGw+PC90ZD4KICAgICAgICA8dGQ+PHNtYWxsPiR7ZXNjKHIuZW1haWx8fCcnKX08L3NtYWxsPiR7ci50ZWxlZm9uZT8oJzxicj48c21hbGwgc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKSI+Jytlc2Moci50ZWxlZm9uZSkrJzwvc21hbGw+Jyk6Jyd9PC90ZD4KICAgICAgICA8dGQgY2xhc3M9Im51bSI+PHNtYWxsPiR7ZXNjKGZtdEJldChyLmNyZWF0ZWRfYXQpKX08L3NtYWxsPjwvdGQ+CiAgICAgICAgPHRkIGNsYXNzPSJudW0iPiR7ci5wYWxwaXRlc3x8MH0vMTI8L3RkPgogICAgICAgIDx0ZCBjbGFzcz0ibnVtIj48Yj4ke3IucHRzfHwwfTwvYj48L3RkPgogICAgICAgIDx0ZD4ke3N0YXR1c1BpbGx9PC90ZD4KICAgICAgICA8dGQ+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBkYXRhLWRldGFpbD0iJHtlc2Moci5pZCl9IiBzdHlsZT0icGFkZGluZzo1cHggMTBweDtmb250LXNpemU6MTEuNXB4Ij5BYnJpcjwvYnV0dG9uPjwvdGQ+CiAgICAgIDwvdHI+YDsKICAgIH0pLmpvaW4oJycpfHwnPHRyPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6dmFyKC0tbXV0KTtwYWRkaW5nOjE4cHggMCI+TmVuaHVtIGluZGljYWRvIG5lc3NhIHZlcnRpY2FsLjwvdGQ+PC90cj4nOwogICAgX3Rib2R5LmlubmVySFRNTD10cnM7CiAgICBpZihfY291bnRMYWJlbCl7CiAgICAgIF9jb3VudExhYmVsLnRleHRDb250ZW50ID0gKGZpbHRlcj09PSdhbGwnKQogICAgICAgID8gYE1vc3RyYW5kbyB0b2RvcyBvcyAke2luZGljYWRvcy5sZW5ndGh9IGluZGljYWRvcy5gCiAgICAgICAgOiBgTW9zdHJhbmRvICR7ZmlsdGVyZWQubGVuZ3RofSBkZSAke2luZGljYWRvcy5sZW5ndGh9IGluZGljYWRvcyAoZmlsdHJvOiAke2ZpbHRlcj09PSdtaWxpdGFyZXMnPydNaWxpdGFyZXMnOidWZXN0aWJ1bGFyZXMnfSkuYDsKICAgIH0KICAgIC8vIFJlLWJpbmQgZHJpbGwtZG93biBidXR0b25zIG5vIG5vdm8gdGJvZHkKICAgIF90Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kZXRhaWxdJykuZm9yRWFjaChidG49PnsKICAgICAgYnRuLm9uY2xpY2s9KCk9Pm9wZW5BZG1pblBsYXllckRldGFpbChidG4uZGF0YXNldC5kZXRhaWwpOwogICAgfSk7CiAgfTsKICBfdmZpbHRlckJ0bnMuZm9yRWFjaChiPT57CiAgICBiLm9uY2xpY2s9KCk9PnsKICAgICAgY29uc3QgZmlsdGVyPWIuZGF0YXNldC52ZmlsdGVyOwogICAgICAvLyBTaW5jcm9uaXphIGFjdGl2ZSBlbSBBTUJPUyBvcyBncnVwb3MgZGUgcGlsbHMgKGJyZWFrZG93biArIHRhYmxlKQogICAgICBfdmZpbHRlckJ0bnMuZm9yRWFjaCh4PT57CiAgICAgICAgeC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCB4LmRhdGFzZXQudmZpbHRlcj09PWZpbHRlcik7CiAgICAgIH0pOwogICAgICBfcmVuZGVySW5kaWNhZG9zRmlsdGVyZWQoZmlsdGVyKTsKICAgICAgX3JlbmRlckJyZWFrZG93bkludG8oZmlsdGVyKTsKICAgIH07CiAgfSk7CiAgLy8gUmVuZGVyIGluaWNpYWwgZG8gYnJlYWtkb3duIChmaWx0cm89ImFsbCIpCiAgX3JlbmRlckJyZWFrZG93bkludG8oJ2FsbCcpOwoKICBjb25zdCBzdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZUNvbmMnKTsKICBpZihzdilzdi5vbmNsaWNrPWFzeW5jKCk9PnsKICAgIGNvbnN0IG5ld0NvbmM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ld0NvbmMnKS52YWx1ZTsKICAgIGNvbnN0IHJlYXNvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uY1JlYXNvbicpLnZhbHVlLnRyaW0oKTsKICAgIGlmKCFuZXdDb25jKXt0b2FzdCgnU2VsZWNpb25lIHVtIGNvbmN1cnNvLicpO3JldHVybjt9CiAgICBzdi5kaXNhYmxlZD10cnVlO3N2LnRleHRDb250ZW50PSdTYWx2YW5kb+KApic7CiAgICBjb25zdCB7ZGF0YTpyZXMsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdhZG1pbl91cGRhdGVfY29uY3Vyc28nLHtwX2lkOnBsYXllcklkLG5ld19jb25jdXJzbzpuZXdDb25jLHJlYXNvbjpyZWFzb258fG51bGx9KTsKICAgIHN2LmRpc2FibGVkPWZhbHNlO3N2LnRleHRDb250ZW50PSdTYWx2YXInOwogICAgaWYoZXJyb3Ipe3RvYXN0KCdFcnJvOiAnK2Vycm9yLm1lc3NhZ2UpO3JldHVybjt9CiAgICBpZihyZXMmJnJlcy51bmNoYW5nZWQpe3RvYXN0KCdDb25jdXJzbyBqw6EgZXJhIGVzc2UuJyk7cmV0dXJuO30KICAgIHRvYXN0KCdDb25jdXJzbyBhdHVhbGl6YWRvIOKckycpOwogICAgb3BlbkFkbWluUGxheWVyRGV0YWlsKHBsYXllcklkKTsgIC8vIHJlYWJyZSBjLyBkYWRvcyBhdHVhbGl6YWRvcwogICAgcmVuZGVyQWRtaW5BbHVub3NUYWJsZSgpOwogIH07Cn0KCmZ1bmN0aW9uIF9hZG1FeHBvcnRBbHVub3NDc3YoKXsKICAvLyBSZXVzYSBsb2FkQWxsUGxheWVyc0FkbWluIGV4aXN0ZW50ZQogIGxvYWRBbGxQbGF5ZXJzQWRtaW4oKS50aGVuKHBzPT57CiAgICBwcz1zY29yZUFsbChwcyk7CiAgICBjb25zdCByb3dzPVtbJ05vbWUnLCdDUEYnLCdFbWFpbCcsJ1RlbGVmb25lJywnVmVydGljYWwnLCdQZXJmaWwnLCdDb25jdXJzbycsJ0luc2NyaWNhbycsJ0FjZWl0b3VNYXJrZXRpbmcnLCdQb250b3MnLCdQbGFjYXJlc0NyYXZhZG9zJywnUGFscGl0ZXMnXV07CiAgICBwcy5mb3JFYWNoKHA9PnJvd3MucHVzaChbcC5ub21lLHAuY3BmfHwnJyxwLmVtYWlsLHAudGVsLHAudmVydGljYWx8fCcnLHAucGVyZmlsfHwnJyxwLmNvbmMsZm10VHMocC5jcmVhdGVkQXQpLHAubWFya2V0aW5nPydTaW0nOidOYW8nLHAuX3B0cyxwLl9leCxPYmplY3Qua2V5cyhwLnByZWRpY3Rpb25zfHx7fSkubGVuZ3RoXSkpOwogICAgZGwoJ2JvbGFvX2FsdW5vc19hZG1pbi5jc3YnLHJvd3MpOwogICAgdG9hc3QoJ0FycXVpdm8gZ2VyYWRvJyk7CiAgfSk7Cn0KCi8qIC0tLS0tLS0tLS0gRjU6IFJhbmtpbmcgZ2VyYWwgLS0tLS0tLS0tLSAqLwpjb25zdCBBRE1JTl9SQU5LX1BBR0VfU0laRT0yMDsKbGV0IF9hZG1SYW5rU3RhdGU9e3E6JycsY29uY3Vyc286JycsbWluUHRzOicnLG9ubHlTY29yaW5nOmZhbHNlLGRhdGE6bnVsbCx0b3AzUmVmOltdLGxvYWRlZEF0OjAscGFnZToxfTsKCmFzeW5jIGZ1bmN0aW9uIHJlbmRlckFkbWluUmFua2luZygpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFua2luZ0JveCcpO2lmKCFib3gpcmV0dXJuOwogIGNvbnN0IHM9X2FkbVJhbmtTdGF0ZTsKICAvLyBDYWNoZSBkZSAzMHMgcHJhIGV2aXRhciByZWNvbXB1dGFyIGEgY2FkYSBuYXZlZ2HDp8OjbwogIGNvbnN0IHN0YWxlPShEYXRlLm5vdygpLXMubG9hZGVkQXQpPjMwMDAwOwogIGlmKCFzLmRhdGF8fHN0YWxlKXsKICAgIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5DYWxjdWxhbmRvIHJhbmtpbmfigKYgKCcrKHMuZGF0YT8nYXR1YWxpemFuZG8nOidwb2RlIGxldmFyIDEtMnMnKSsnKTwvZGl2Pic7CiAgICB0cnl7CiAgICAgIGxldCBwbGF5ZXJzPWF3YWl0IGxvYWRBbGxQbGF5ZXJzQWRtaW4oKTsKICAgICAgcGxheWVycz1zY29yZUFsbChwbGF5ZXJzKTsKICAgICAgcy5kYXRhPXBsYXllcnM7CiAgICAgIGxldCB0b3AzPVtdOwogICAgICB0cnl7Y29uc3Qgcj1hd2FpdCBzdXBhLnJwYygnZ2V0X3JlZmVycmFsX2xlYWRlcmJvYXJkJyx7bGltOjN9KTtpZighci5lcnJvciYmci5kYXRhKXRvcDM9ci5kYXRhLm1hcCh4PT54LnBsYXllcl9pZCk7fWNhdGNoKGUpe19kYmd3KCd0b3AzIHJlZiBsZWFkZXJib2FyZCcsZSk7fQogICAgICBzLnRvcDNSZWY9dG9wMzsKICAgICAgcy5sb2FkZWRBdD1EYXRlLm5vdygpOwogICAgfWNhdGNoKGUpewogICAgICBjb25zb2xlLmVycm9yKCdyYW5rIGxvYWQnLGUpOwogICAgICBib3guaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJlbXB0eSI+RXJybyBhbyBjYXJyZWdhciByYW5raW5nLiBUZW50ZSByZWNhcnJlZ2FyIGEgcMOhZ2luYS48L2Rpdj4nOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIHJlbmRlckFkbWluUmFua2luZ1RhYmxlKCk7Cn0KCmZ1bmN0aW9uIHJlbmRlckFkbWluUmFua2luZ1RhYmxlKCl7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYW5raW5nQm94Jyk7aWYoIWJveClyZXR1cm47CiAgY29uc3Qgcz1fYWRtUmFua1N0YXRlOwogIGlmKCFzLmRhdGEpcmV0dXJuOwoKICAvLyBQw7NkaW8gZ2xvYmFsICh0b3AgMyBnbG9iYWlzLCBuw6NvIGRhIHZpZXcgZmlsdHJhZGEpCiAgY29uc3QgcG9kaXVtQnlJZD1uZXcgTWFwKCk7CiAgbGV0IHA9MDsKICBmb3IoY29uc3QgcGwgb2Ygcy5kYXRhKXtpZihwbC5fcHRzPD0wKWJyZWFrO3BvZGl1bUJ5SWQuc2V0KHBsLmlkLCsrcCk7aWYocD49MylicmVhazt9CiAgY29uc3QgdG9wM1NldD1uZXcgU2V0KHMudG9wM1JlZik7CiAgY29uc3QgcmFmZmxlTWluPWNmZy5yYWZmbGVNaW58fDMwOwoKICAvLyBGaWx0cmEKICBsZXQgcm93cz1zLmRhdGEuZmlsdGVyKHBsPT57CiAgICBpZihzLm9ubHlTY29yaW5nJiZwbC5fcHRzPD0wKXJldHVybiBmYWxzZTsKICAgIGlmKHMucSl7Y29uc3QgcT1zLnEudG9Mb3dlckNhc2UoKTtpZighKHBsLm5vbWV8fCcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpJiYhKHBsLmNwZnx8JycpLmluY2x1ZGVzKHEpJiYhKHBsLmVtYWlsfHwnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSlyZXR1cm4gZmFsc2U7fQogICAgaWYocy5jb25jdXJzbyYmcGwuY29uYyE9PXMuY29uY3Vyc28pcmV0dXJuIGZhbHNlOwogICAgaWYocy5taW5QdHMhPT0nJyYmcGwuX3B0czwrcy5taW5QdHMpcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfSk7CgogIC8vIDIwMjYtMDYtMDc6IGVucXVhbnRvIG5pbmd1w6ltIHBvbnR1b3UsIHNjb3JlQWxsIG9yZGVuYSBwb3IgY3JlYXRlZEF0IGFzYyAoaW5zY3Jpw6fDo28KICAvLyBtYWlzIGFudGlnYSBwcmltZWlybykg4oCUIGNvbmZ1c28gcHJvIGFkbWluLiBSZS1vcmRlbmEgYWxmYWJldGljYW1lbnRlLCBjb25zaXN0ZW50ZQogIC8vIGNvbSBvIGJhbm5lciAib3JkZW0gYWxmYWLDqXRpY2EiIG1vc3RyYWRvIGFiYWl4by4gUXVhbmRvIGFsZ3XDqW0gcG9udHVhciwgbyBzb3J0CiAgLy8gb3JpZ2luYWwgZG8gc2NvcmVBbGwgKHB0cyBkZXNjIOKGkiBjcmF2YWRhcyDihpIgYWNlcnRvcyDihpIgY3JlYXRlZEF0KSB2b2x0YSBhIHZhbGVyLgogIGNvbnN0IGFsbFplcm8gPSAhcy5kYXRhLmxlbmd0aCB8fCAocy5kYXRhWzBdPy5fcHRzfHwwKSA9PT0gMDsKICBpZihhbGxaZXJvKXsKICAgIHJvd3Muc29ydCgoYSxiKT0+KGEubm9tZXx8JycpLmxvY2FsZUNvbXBhcmUoYi5ub21lfHwnJywncHQtQlInLHtzZW5zaXRpdml0eTonYmFzZSd9KSk7CiAgfQoKICAvLyBQYWdpbmHDp8OjbyAyMC9ww6FnaW5hCiAgY29uc3QgdG90YWxSb3dzID0gcm93cy5sZW5ndGg7CiAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbFJvd3MvQURNSU5fUkFOS19QQUdFX1NJWkUpKTsKICBpZihzLnBhZ2UgPiB0b3RhbFBhZ2VzKSBzLnBhZ2UgPSB0b3RhbFBhZ2VzOwogIGlmKHMucGFnZSA8IDEpIHMucGFnZSA9IDE7CiAgY29uc3QgcGFnZVN0YXJ0ID0gKHMucGFnZS0xKSAqIEFETUlOX1JBTktfUEFHRV9TSVpFOwogIGNvbnN0IHBhZ2VSb3dzID0gcm93cy5zbGljZShwYWdlU3RhcnQsIHBhZ2VTdGFydCArIEFETUlOX1JBTktfUEFHRV9TSVpFKTsKICBjb25zdCB0cnM9cGFnZVJvd3MubWFwKHBsPT57CiAgICBjb25zdCBnbG9iYWxQb3M9cy5kYXRhLmluZGV4T2YocGwpKzE7CiAgICBjb25zdCBwb2RQb3M9cG9kaXVtQnlJZC5nZXQocGwuaWQpOwogICAgY29uc3QgcG9kTWVkYWw9cG9kUG9zP1sn8J+lhycsJ\/CfpYgnLCfwn6WJJ11bcG9kUG9zLTFdOm51bGw7CiAgICBjb25zdCB0b3BSZWY9dG9wM1NldC5oYXMocGwuaWQpOwogICAgY29uc3QgZWxpZz1wbC5fcHRzPj1yYWZmbGVNaW47CiAgICBjb25zdCB0YWdzPVtdOwogICAgaWYocG9kTWVkYWwpdGFncy5wdXNoKGA8c3BhbiBjbGFzcz0icGlsbCBnb2xkIj4ke3BvZE1lZGFsfSBQw7NkaW88L3NwYW4+YCk7CiAgICBpZihlbGlnKXRhZ3MucHVzaCgnPHNwYW4gY2xhc3M9InBpbGwgb2siPuKtkCBTb3J0ZWlvPC9zcGFuPicpOwogICAgaWYodG9wUmVmKXRhZ3MucHVzaCgnPHNwYW4gY2xhc3M9InBpbGwgZ29sZCI+8J+ToyBUb3AgMyBpbmRpYy48L3NwYW4+Jyk7CiAgICBjb25zdCBwb3NDZWxsID0gKGFsbFplcm8gJiYgcGwuX3B0cz09PTApCiAgICAgID8gJzx0ZCBjbGFzcz0ibnVtIiBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpO2ZvbnQtd2VpZ2h0OjQwMCI+wrc8L3RkPicKICAgICAgOiBgPHRkIGNsYXNzPSJudW0iPjxiPiR7Z2xvYmFsUG9zfcK6PC9iPjwvdGQ+YDsKICAgIHJldHVybiBgPHRyPgogICAgICAke3Bvc0NlbGx9CiAgICAgIDx0ZD48Yj4ke2VzYyhwbC5ub21lfHwn4oCUJyl9PC9iPjxicj48c21hbGwgc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKSI+JHtlc2MocGwuY29uY3x8J3NlbSBjb25jdXJzbycpfTwvc21hbGw+PC90ZD4KICAgICAgPHRkIGNsYXNzPSJudW0iPiR7cGwuX2V4fTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibnVtIj4ke3BsLl9yb308L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSIgc3R5bGU9ImNvbG9yOnZhcigtLXRlYWwpO2ZvbnQtd2VpZ2h0OjgwMCI+JHtwbC5fcHRzfTwvdGQ+CiAgICAgIDx0ZD4ke3RhZ3Muam9pbignICcpfHwnPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKSI+4oCUPC9zcGFuPid9PC90ZD4KICAgICAgPHRkPjxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBkYXRhLWRldGFpbD0iJHtwbC5pZH0iIHN0eWxlPSJwYWRkaW5nOjZweCAxMnB4O2ZvbnQtc2l6ZToxMnB4Ij5WZXI8L2J1dHRvbj48L3RkPgogICAgPC90cj5gOwogIH0pLmpvaW4oJycpOwoKICBjb25zdCBmaWx0ZXJzPQogICAgJzxkaXYgY2xhc3M9ImFkbWluLWZpbHRlcnMiPicrCiAgICAgICc8ZGl2IGNsYXNzPSJmbGQiPjxsYWJlbCBmb3I9InJxIj5CdXNjYXIgKG5vbWUgLyBDUEYgLyBlbWFpbCk8L2xhYmVsPjxpbnB1dCBpZD0icnEiIHBsYWNlaG9sZGVyPSJleC46IE1hcmlhIiB2YWx1ZT0iJytlc2Mocy5xKSsnIj48L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZmxkIj48bGFiZWwgZm9yPSJyYyI+Q29uY3Vyc288L2xhYmVsPjxzZWxlY3QgaWQ9InJjIj4nK19hZG1Db25jdXJzb09wdGlvbnMocy5jb25jdXJzbykrJzwvc2VsZWN0PjwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJmbGQiPjxsYWJlbCBmb3I9InJtaW4iPlBvbnRvcyBtw61uaW1vczwvbGFiZWw+PGlucHV0IGlkPSJybWluIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgcGxhY2Vob2xkZXI9IjAiIHZhbHVlPSInK2VzYyhzLm1pblB0cykrJyI+PC9kaXY+JysKICAgICAgJzxkaXYgY2xhc3M9ImZsZCIgc3R5bGU9ImZsZXg6MCAwIGF1dG87bWluLXdpZHRoOjE2MHB4Ij48bGFiZWwgZm9yPSJyb3MiPkFwZW5hcyBwb250dWFuZG8\/PC9sYWJlbD48c2VsZWN0IGlkPSJyb3MiPjxvcHRpb24gdmFsdWU9IiI+VG9kb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIxIiAnKyhzLm9ubHlTY29yaW5nPydzZWxlY3RlZCc6JycpKyc+U2ltPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+JysKICAgICc8L2Rpdj4nOwoKICBjb25zdCB0b3RhbD1zLmRhdGEubGVuZ3RoOwogIGNvbnN0IHRvdGFsU2NvcmluZz1zLmRhdGEuZmlsdGVyKHg9PnguX3B0cz4wKS5sZW5ndGg7CiAgY29uc3QgcHJlZ2FtZU5vdGUgPSBhbGxaZXJvCiAgICA\/ICc8cCBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtjb2xvcjojN2E1YjEyO2JhY2tncm91bmQ6I2ZmZjhlNztib3JkZXI6MXB4IHNvbGlkICNlM2M4N2E7cGFkZGluZzo5cHggMTJweDtib3JkZXItcmFkaXVzOjhweDttYXJnaW46MCAwIDE0cHg7bGluZS1oZWlnaHQ6MS40NSI+8J+PgSA8Yj5Db3BhIGFpbmRhIG7Do28gY29tZcOnb3UuPC9iPiBPcmRlbSBsaXN0YWRhIGFiYWl4byDDqSBhbGZhYsOpdGljYSAobsOjbyDDqSByYW5raW5nIHJlYWwpLiBQb3Npw6fDtWVzIHbDo28gYXBhcmVjZXIgcXVhbmRvIG8gMcK6IHBsYWNhciBmb3IgbGFuw6dhZG8uPC9wPicKICAgIDogJyc7CiAgY29uc3QgcGFnaW5hdGlvbiA9IHRvdGFsUm93cyA+IEFETUlOX1JBTktfUEFHRV9TSVpFCiAgICA\/ICc8ZGl2IGNsYXNzPSJhZG1pbi1wYWdpbmF0aW9uIiBzdHlsZT0ibWFyZ2luLXRvcDoxNHB4Ij4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QiIGlkPSJya3BfcHJldiInKyhzLnBhZ2U8PTE\/JyBkaXNhYmxlZCc6JycpKyc+4oaQIEFudGVyaW9yPC9idXR0b24+JysKICAgICAgICAnPHNwYW4+UMOhZ2luYSAnK3MucGFnZSsnIGRlICcrdG90YWxQYWdlcysnIMK3IG1vc3RyYW5kbyAnK19mbXROKHBhZ2VTdGFydCsxKSsnIGEgJytfZm10TihNYXRoLm1pbihwYWdlU3RhcnQrQURNSU5fUkFOS19QQUdFX1NJWkUsdG90YWxSb3dzKSkrJyBkZSAnK19mbXROKHRvdGFsUm93cykrJzwvc3Bhbj4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QiIGlkPSJya3BfbmV4dCInKyhzLnBhZ2U+PXRvdGFsUGFnZXM\/JyBkaXNhYmxlZCc6JycpKyc+UHLDs3hpbWEg4oaSPC9idXR0b24+JysKICAgICAgJzwvZGl2PicKICAgIDogJyc7CiAgYm94LmlubmVySFRNTD1maWx0ZXJzKwogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPicrCiAgICAgICc8aDM+JytfZm10Tih0b3RhbFJvd3MpKyh0b3RhbFJvd3M9PT0xPycgYWx1bm8nOicgYWx1bm9zJykrJyDCtyAnK19mbXROKHRvdGFsU2NvcmluZykrJyBwb250dWFuZG8gZGUgJytfZm10Tih0b3RhbCkrJyBpbnNjcml0b3M8L2gzPicrCiAgICAgIHByZWdhbWVOb3RlKwogICAgICAnPGRpdiBzdHlsZT0ib3ZlcmZsb3cteDphdXRvIj48dGFibGUgY2xhc3M9ImFkbWluLXRhYmxlIj4nKwogICAgICAgICc8dGhlYWQ+PHRyPjx0aCBjbGFzcz0ibnVtIj4jPC90aD48dGg+Tm9tZSAvIENvbmN1cnNvPC90aD48dGggY2xhc3M9Im51bSI+Q3JhdmFkYXM8L3RoPjx0aCBjbGFzcz0ibnVtIj5BY2VydG9zPC90aD48dGggY2xhc3M9Im51bSI+UHRzPC90aD48dGg+U3RhdHVzPC90aD48dGg+PC90aD48L3RyPjwvdGhlYWQ+JysKICAgICAgICAnPHRib2R5PicrKHRyc3x8Jzx0cj48dGQgY29sc3Bhbj0iNyIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweDtjb2xvcjp2YXIoLS1tdXQpIj5OZW5odW0gYWx1bm8gZW5jb250cmFkbyBjb20gZXNzZXMgZmlsdHJvcy48L3RkPjwvdHI+JykrJzwvdGJvZHk+JysKICAgICAgJzwvdGFibGU+PC9kaXY+JysKICAgICAgcGFnaW5hdGlvbisKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS1tdXQtMik7bWFyZ2luLXRvcDoxNHB4Ij5DYWNoZSBkZSAzMHMuIFNhaSBkbyBtZW51IGUgdm9sdGEgcHJhIHJlY2FsY3VsYXIuPC9wPicrCiAgICAnPC9kaXY+JzsKCiAgY29uc3QgcHY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JrcF9wcmV2Jyksbng9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JrcF9uZXh0Jyk7CiAgaWYocHYpcHYub25jbGljaz0oKT0+e2lmKHMucGFnZT4xKXtzLnBhZ2UtLTtyZW5kZXJBZG1pblJhbmtpbmdUYWJsZSgpO3dpbmRvdy5zY3JvbGxUbyh7dG9wOjAsYmVoYXZpb3I6J3Ntb290aCd9KTt9fTsKICBpZihueClueC5vbmNsaWNrPSgpPT57aWYocy5wYWdlPHRvdGFsUGFnZXMpe3MucGFnZSsrO3JlbmRlckFkbWluUmFua2luZ1RhYmxlKCk7d2luZG93LnNjcm9sbFRvKHt0b3A6MCxiZWhhdmlvcjonc21vb3RoJ30pO319OwoKICBsZXQgdG87CiAgWydycScsJ3JtaW4nXS5mb3JFYWNoKGlkPT57CiAgICBjb25zdCBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYoIWVsKXJldHVybjsKICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e2NsZWFyVGltZW91dCh0byk7dG89c2V0VGltZW91dCgoKT0+ewogICAgICBzLnE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JxJykudmFsdWUudHJpbSgpOwogICAgICBzLm1pblB0cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm1pbicpLnZhbHVlOwogICAgICBzLnBhZ2U9MTsKICAgICAgcmVuZGVyQWRtaW5SYW5raW5nVGFibGUoKTsKICAgIH0sMjgwKTt9KTsKICB9KTsKICBjb25zdCByYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmMnKTtpZihyYylyYy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT57cy5jb25jdXJzbz1yYy52YWx1ZTtzLnBhZ2U9MTtyZW5kZXJBZG1pblJhbmtpbmdUYWJsZSgpO30pOwogIGNvbnN0IHJvcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9zJyk7aWYocm9zKXJvcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT57cy5vbmx5U2NvcmluZz1yb3MudmFsdWU9PT0nMSc7cy5wYWdlPTE7cmVuZGVyQWRtaW5SYW5raW5nVGFibGUoKTt9KTsKCiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRldGFpbF0nKS5mb3JFYWNoKGJ0bj0+ewogICAgYnRuLm9uY2xpY2s9KCk9Pm9wZW5BZG1pblBsYXllckRldGFpbChidG4uZGF0YXNldC5kZXRhaWwpOwogIH0pOwp9Ci8qIC0tLS0tLS0tLS0gRjY6IEVzY29sYXMgLyBDb25jdXJzb3MgLS0tLS0tLS0tLSAqLwpsZXQgX2FkbUVzY29sYXNTdGF0ZT17cTonJyxzY2hvb2xzOm51bGwsbG9hZGVkQXQ6MH07Cgphc3luYyBmdW5jdGlvbiByZW5kZXJBZG1pbkVzY29sYXMoKXsKICBjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VzY29sYXNCb3gnKTtpZighYm94KXJldHVybjsKICBjb25zdCBzdGFsZT0oRGF0ZS5ub3coKS1fYWRtRXNjb2xhc1N0YXRlLmxvYWRlZEF0KT4zMDAwMDsKICBjb25zdCBzPV9hZG1Fc2NvbGFzU3RhdGU7CiAgaWYoIXMuc2Nob29sc3x8c3RhbGUpewogICAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG8gZXNjb2xhc+KApjwvZGl2Pic7CiAgICBsZXQgcGxheWVycz1fYWRtUmFua1N0YXRlLmRhdGE7CiAgICBpZighcGxheWVyc3x8KERhdGUubm93KCktX2FkbVJhbmtTdGF0ZS5sb2FkZWRBdCk+MzAwMDApewogICAgICB0cnl7CiAgICAgICAgcGxheWVycz1zY29yZUFsbChhd2FpdCBsb2FkQWxsUGxheWVyc0FkbWluKCkpOwogICAgICAgIF9hZG1SYW5rU3RhdGUuZGF0YT1wbGF5ZXJzOwogICAgICAgIF9hZG1SYW5rU3RhdGUubG9hZGVkQXQ9RGF0ZS5ub3coKTsKICAgICAgfWNhdGNoKGUpewogICAgICAgIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5FcnJvIGFvIGNhcnJlZ2FyIGVzY29sYXMuIFJlY2FycmVndWUgYSBww6FnaW5hLjwvZGl2Pic7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBzLnNjaG9vbHM9X2NvbXB1dGVTY2hvb2xTdGF0cyhwbGF5ZXJzKTsKICAgIHMubG9hZGVkQXQ9RGF0ZS5ub3coKTsKICB9CiAgX3JlbmRlckFkbWluRXNjb2xhc1RhYmxlKCk7Cn0KCmZ1bmN0aW9uIF9jb21wdXRlU2Nob29sU3RhdHMocGxheWVycyl7CiAgY29uc3QgZ3JvdXBzPXt9OwogIChwbGF5ZXJzfHxbXSkuZm9yRWFjaChwPT57CiAgICBjb25zdCBjPSgocC5jb25jfHwnJykudHJpbSgpKXx8J1NlbSBjb25jdXJzbyc7CiAgICAoZ3JvdXBzW2NdPWdyb3Vwc1tjXXx8W10pLnB1c2gocCk7CiAgfSk7CiAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykubWFwKG5hbWU9PnsKICAgIGNvbnN0IGFycj1ncm91cHNbbmFtZV0uc2xpY2UoKS5zb3J0KChhLGIpPT5iLl9wdHMtYS5fcHRzKTsKICAgIGNvbnN0IHRvcE49YXJyLnNsaWNlKDAsRVNDT0xBX1RPUE4pOwogICAgY29uc3QgY291bnRlZD10b3BOLmxlbmd0aDsKICAgIGNvbnN0IHN1bT10b3BOLnJlZHVjZSgocyxwKT0+cytwLl9wdHMsMCk7CiAgICBjb25zdCBhdmdUb3A9Y291bnRlZD9zdW0vY291bnRlZDowOwogICAgY29uc3QgcG9udHVhbmRvPWFyci5maWx0ZXIocD0+cC5fcHRzPjApLmxlbmd0aDsKICAgIHJldHVybiB7bmFtZSx0b3RhbDphcnIubGVuZ3RoLHBvbnR1YW5kbyxhdmdUb3AsbGlkZXI6YXJyWzBdfHxudWxsLGFsbDphcnJ9OwogIH0pLnNvcnQoKGEsYik9PmIuYXZnVG9wLWEuYXZnVG9wfHxiLnRvdGFsLWEudG90YWx8fGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpOwp9CgpmdW5jdGlvbiBfcmVuZGVyQWRtaW5Fc2NvbGFzVGFibGUoKXsKICBjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VzY29sYXNCb3gnKTtpZighYm94KXJldHVybjsKICBjb25zdCBzPV9hZG1Fc2NvbGFzU3RhdGU7CiAgaWYoIXMuc2Nob29scylyZXR1cm47CgogIGNvbnN0IHJvd3M9cy5xP3Muc2Nob29scy5maWx0ZXIoZT0+ZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocy5xLnRvTG93ZXJDYXNlKCkpKTpzLnNjaG9vbHM7CiAgY29uc3QgY2hhbXBpb249cy5zY2hvb2xzLmZpbmQoZT0+ZS5hdmdUb3A+MCk7CgogIGNvbnN0IHRycz1yb3dzLm1hcCgoZSk9PnsKICAgIGNvbnN0IGdsb2JhbFBvcz1zLnNjaG9vbHMuaW5kZXhPZihlKSsxOwogICAgY29uc3QgaXNDaGFtcD1jaGFtcGlvbiYmZS5uYW1lPT09Y2hhbXBpb24ubmFtZTsKICAgIHJldHVybiBgPHRyJHtpc0NoYW1wPycgc3R5bGU9ImJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjI3LDE2NSwzMSwuMDcpLHRyYW5zcGFyZW50KSInOicnfT4KICAgICAgPHRkIGNsYXNzPSJudW0iPjxiPiR7Z2xvYmFsUG9zfcK6PC9iPiR7aXNDaGFtcD8nIPCfj4YnOicnfTwvdGQ+CiAgICAgIDx0ZD48Yj4ke2VzYyhlLm5hbWUpfTwvYj48L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSI+JHtlLnRvdGFsfTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibnVtIj4ke2UucG9udHVhbmRvfTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibnVtIiBzdHlsZT0iY29sb3I6dmFyKC0tdGVhbCk7Zm9udC13ZWlnaHQ6ODAwIj4ke2UuYXZnVG9wLnRvRml4ZWQoMSl9PC90ZD4KICAgICAgPHRkPiR7ZS5saWRlcj8oZXNjKGUubGlkZXIubm9tZSkrJyA8c21hbGwgc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKSI+KCcrZS5saWRlci5fcHRzKycgcHRzKTwvc21hbGw+Jyk6JzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMikiPuKAlDwvc3Bhbj4nfTwvdGQ+CiAgICAgIDx0ZD48YnV0dG9uIGNsYXNzPSJidG4gcHJpbWFyeSIgZGF0YS1zY2hvb2w9IiR7ZXNjKGUubmFtZSl9IiBzdHlsZT0icGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTJweCI+VG9wICR7RVNDT0xBX1BSRU1JT19UT1BOfTwvYnV0dG9uPjwvdGQ+CiAgICA8L3RyPmA7CiAgfSkuam9pbignJyk7CgogIGNvbnN0IGZpbHRlcnM9JzxkaXYgY2xhc3M9ImFkbWluLWZpbHRlcnMiPicrCiAgICAnPGRpdiBjbGFzcz0iZmxkIj48bGFiZWwgZm9yPSJlcSI+QnVzY2FyIGVzY29sYTwvbGFiZWw+PGlucHV0IGlkPSJlcSIgcGxhY2Vob2xkZXI9ImV4LjogRVNBLCBJTUUiIHZhbHVlPSInK2VzYyhzLnEpKyciPjwvZGl2PicrCiAgICAnPC9kaXY+JzsKCiAgYm94LmlubmVySFRNTD1maWx0ZXJzKwogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPicrCiAgICAgICc8aDM+JytfZm10Tihyb3dzLmxlbmd0aCkrKHJvd3MubGVuZ3RoPT09MT8nIGVzY29sYSc6JyBlc2NvbGFzJykrCiAgICAgICAgKGNoYW1waW9uPygnIMK3IGNhbXBlw6MgdmlydHVhbDogPGI+Jytlc2MoY2hhbXBpb24ubmFtZSkrJzwvYj4gKG3DqWRpYSBUb3AgJytFU0NPTEFfVE9QTisnID0gJytjaGFtcGlvbi5hdmdUb3AudG9GaXhlZCgxKSsnKScpOicnKSsKICAgICAgJzwvaDM+JysKICAgICAgJzxkaXYgc3R5bGU9Im92ZXJmbG93LXg6YXV0byI+PHRhYmxlIGNsYXNzPSJhZG1pbi10YWJsZSI+JysKICAgICAgICAnPHRoZWFkPjx0cj48dGggY2xhc3M9Im51bSI+IzwvdGg+PHRoPkVzY29sYSAvIENvbmN1cnNvPC90aD48dGggY2xhc3M9Im51bSI+SW5zY3JpdG9zPC90aD48dGggY2xhc3M9Im51bSI+UG9udHVhbmRvPC90aD48dGggY2xhc3M9Im51bSI+TcOpZGlhIFRvcCAnK0VTQ09MQV9UT1BOKyc8L3RoPjx0aD5Mw61kZXIgbG9jYWw8L3RoPjx0aD48L3RoPjwvdHI+PC90aGVhZD4nKwogICAgICAgICc8dGJvZHk+JysodHJzfHwnPHRyPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoyNHB4O2NvbG9yOnZhcigtLW11dCkiPk5lbmh1bWEgZXNjb2xhIGVuY29udHJhZGEuPC90ZD48L3RyPicpKyc8L3Rib2R5PicrCiAgICAgICc8L3RhYmxlPjwvZGl2PicrCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbXV0LTIpO21hcmdpbi10b3A6MTRweCI+QSBlc2NvbGEgY2FtcGXDoyB0ZW0gMiBzb3J0ZWlvcyBlbnRyZSBzZXVzICcrRVNDT0xBX1BSRU1JT19UT1BOKycgbWVsaG9yZXMgY29sb2NhZG9zOiAxIGNhbWlzYSBkbyBCcmFzaWwgKyAxIEFwcGxlIFdhdGNoLjwvcD4nKwogICAgJzwvZGl2Pic7CgogIGxldCB0bzsKICBjb25zdCBlcT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXEnKTsKICBpZihlcSllcS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsKCk9PntjbGVhclRpbWVvdXQodG8pO3RvPXNldFRpbWVvdXQoKCk9PntzLnE9ZXEudmFsdWUudHJpbSgpO19yZW5kZXJBZG1pbkVzY29sYXNUYWJsZSgpO30sMjIwKTt9KTsKCiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNjaG9vbF0nKS5mb3JFYWNoKGJ0bj0+ewogICAgYnRuLm9uY2xpY2s9KCk9Pm9wZW5BZG1pblNjaG9vbERldGFpbChidG4uZGF0YXNldC5zY2hvb2wpOwogIH0pOwp9CgpmdW5jdGlvbiBvcGVuQWRtaW5TY2hvb2xEZXRhaWwobmFtZSl7CiAgY29uc3Qgc2Nob29sPShfYWRtRXNjb2xhc1N0YXRlLnNjaG9vbHN8fFtdKS5maW5kKGU9PmUubmFtZT09PW5hbWUpOwogIGlmKCFzY2hvb2wpcmV0dXJuOwogIGNvbnN0IG1vZGFsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbk1vZGFsJyk7CiAgY29uc3QgYm9keT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW5Nb2RhbEJvZHknKTsKICBpZighbW9kYWx8fCFib2R5KXJldHVybjsKCiAgY29uc3QgdG9wPXNjaG9vbC5hbGwuc2xpY2UoMCxFU0NPTEFfUFJFTUlPX1RPUE4pOwogIGNvbnN0IHRycz10b3AubWFwKChwLGkpPT5gPHRyPgogICAgPHRkIGNsYXNzPSJudW0iPjxiPiR7aSsxfcK6PC9iPjwvdGQ+CiAgICA8dGQ+PGI+JHtlc2MocC5ub21lKX08L2I+PGJyPjxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpIj4ke2VzYyhfbWFza0VtYWlsKHAuZW1haWwpKX08L3NtYWxsPjwvdGQ+CiAgICA8dGQgY2xhc3M9Im51bSIgc3R5bGU9ImNvbG9yOnZhcigtLXRlYWwpO2ZvbnQtd2VpZ2h0OjgwMCI+JHtwLl9wdHN9PC90ZD4KICAgIDx0ZCBjbGFzcz0ibnVtIj4ke3AuX2V4fTwvdGQ+CiAgICA8dGQgY2xhc3M9Im51bSI+JHtwLl9yb308L3RkPgogICAgPHRkPjxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBkYXRhLWRldGFpbD0iJHtwLmlkfSIgc3R5bGU9InBhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjExLjVweCI+VmVyPC9idXR0b24+PC90ZD4KICA8L3RyPmApLmpvaW4oJycpOwoKICBjb25zdCBwb250dWFuZG9Ub3A9dG9wLmZpbHRlcihwPT5wLl9wdHM+MCkubGVuZ3RoOwogIGJvZHkuaW5uZXJIVE1MPQogICAgJzxoMiBzdHlsZT0iZm9udC1mYW1pbHk6QnJpY29sYWdlIEdyb3Rlc3F1ZTtmb250LXdlaWdodDo4MDA7Zm9udC1zaXplOjI0cHg7bWFyZ2luOjAgMCA0cHg7Y29sb3I6dmFyKC0taW5rKSI+Jytlc2Moc2Nob29sLm5hbWUpKyc8L2gyPicrCiAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxMy41cHg7Y29sb3I6dmFyKC0tbXV0LTIpO21hcmdpbjowIDAgMThweCI+JytfZm10TihzY2hvb2wudG90YWwpKycgaW5zY3JpdG9zIMK3ICcrX2ZtdE4oc2Nob29sLnBvbnR1YW5kbykrJyBwb250dWFuZG8gwrcgbcOpZGlhIFRvcCAnK0VTQ09MQV9UT1BOKycgPSAnK3NjaG9vbC5hdmdUb3AudG9GaXhlZCgxKSsnPC9wPicrCgogICAgJzxkaXYgY2xhc3M9ImtwaS1ncmlkIiBzdHlsZT0iZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMTQwcHgsMWZyKSk7bWFyZ2luLWJvdHRvbToyMnB4Ij4nKwogICAgICBfa3BpQ2FyZCgnSW5zY3JpdG9zJyxfZm10TihzY2hvb2wudG90YWwpLCduYSBlc2NvbGEnKSsKICAgICAgX2twaUNhcmQoJ1BvbnR1YW5kbycsX2ZtdE4oc2Nob29sLnBvbnR1YW5kbyksJ2NvbSBwdHMgPiAwJykrCiAgICAgIF9rcGlDYXJkKCdNw6lkaWEgVG9wICcrRVNDT0xBX1RPUE4sc2Nob29sLmF2Z1RvcC50b0ZpeGVkKDEpLCdwb250b3MgcG9yIGFsdW5vJyx0cnVlKSsKICAgICAgX2twaUNhcmQoJ1Bvb2wgc29ydGVpbycscG9udHVhbmRvVG9wKycvJytFU0NPTEFfUFJFTUlPX1RPUE4sJ3RvcCAnK0VTQ09MQV9QUkVNSU9fVE9QTisnIGNvbSBwdHM+MCcpKwogICAgJzwvZGl2PicrCgogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxoMz5Ub3AgJytFU0NPTEFfUFJFTUlPX1RPUE4rJyBjb2xvY2Fkb3MgZGVzdGEgZXNjb2xhPC9oMz4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luOjAgMCAxMnB4Ij5Qb29sIGVsZWfDrXZlbCBhbyBzb3J0ZWlvIGRlIDIgcHLDqm1pb3MgY29sZXRpdm9zIChjYW1pc2EgKyBBcHBsZSBXYXRjaCkgc2UgZXN0YSBlc2NvbGEgZm9yIGNhbXBlw6MuPC9wPicrCiAgICAgICc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG87bWF4LWhlaWdodDo1NXZoIj48dGFibGUgY2xhc3M9ImFkbWluLXRhYmxlIj4nKwogICAgICAgICc8dGhlYWQ+PHRyPjx0aCBjbGFzcz0ibnVtIj4jPC90aD48dGg+Tm9tZSAvIEVtYWlsPC90aD48dGggY2xhc3M9Im51bSI+UHRzPC90aD48dGggY2xhc3M9Im51bSI+Q3JhdmFkYXM8L3RoPjx0aCBjbGFzcz0ibnVtIj5BY2VydG9zPC90aD48dGg+PC90aD48L3RyPjwvdGhlYWQ+JysKICAgICAgICAnPHRib2R5PicrKHRyc3x8Jzx0cj48dGQgY29sc3Bhbj0iNiIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MThweDtjb2xvcjp2YXIoLS1tdXQpIj5OZW5odW0gYWx1bm8gbmVzdGEgZXNjb2xhIGFpbmRhLjwvdGQ+PC90cj4nKSsnPC90Ym9keT4nKwogICAgICAnPC90YWJsZT48L2Rpdj4nKwogICAgJzwvZGl2Pic7CgogIG1vZGFsLmhpZGRlbj1mYWxzZTsKCiAgYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kZXRhaWxdJykuZm9yRWFjaChidG49PnsKICAgIGJ0bi5vbmNsaWNrPSgpPT5vcGVuQWRtaW5QbGF5ZXJEZXRhaWwoYnRuLmRhdGFzZXQuZGV0YWlsKTsKICB9KTsKfQovKiAtLS0tLS0tLS0tIEY3OiBKb2dvcyAmIFJlc3VsdGFkb3MgKyBTb3J0ZWlvcyAtLS0tLS0tLS0tICovCgphc3luYyBmdW5jdGlvbiByZW5kZXJBZG1pbkpvZ29zKCl7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2dvc0JveCcpO2lmKCFib3gpcmV0dXJuOwogIGxldCBwbGF5ZXJzPV9hZG1SYW5rU3RhdGUuZGF0YTsKICBpZighcGxheWVyc3x8KERhdGUubm93KCktX2FkbVJhbmtTdGF0ZS5sb2FkZWRBdCk+MzAwMDApewogICAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG8gam9nb3PigKY8L2Rpdj4nOwogICAgdHJ5ewogICAgICBwbGF5ZXJzPXNjb3JlQWxsKGF3YWl0IGxvYWRBbGxQbGF5ZXJzQWRtaW4oKSk7CiAgICAgIF9hZG1SYW5rU3RhdGUuZGF0YT1wbGF5ZXJzO19hZG1SYW5rU3RhdGUubG9hZGVkQXQ9RGF0ZS5ub3coKTsKICAgIH1jYXRjaChlKXsKICAgICAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkVycm8gYW8gY2FycmVnYXIuIFJlY2FycmVndWUgYSBww6FnaW5hLjwvZGl2Pic7CiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIC8vIFN0YXRzIHBvciBqb2dvIChwYWxwaXRlcywgY3JhdmFkYXMsIHRvcCBwbGFjYXJlcyBtYWlzIGNvbXVucykKICBjb25zdCBtYXRjaFN0YXRzPXt9OwogIGNmZy5tYXRjaGVzLmZvckVhY2gobT0+ewogICAgY29uc3QgcGFscD1bXTsKICAgIHBsYXllcnMuZm9yRWFjaChwbD0+e2NvbnN0IHByPXBsLnByZWRpY3Rpb25zW20uaWRdO2lmKHByKXBhbHAucHVzaChwcik7fSk7CiAgICBjb25zdCByZXM9Y2ZnLnJlc3VsdHNbbS5pZF07CiAgICBsZXQgY3JhdmFkYXM9MDtjb25zdCBkaXN0PXt9OwogICAgcGFscC5mb3JFYWNoKHA9PnsKICAgICAgY29uc3Qgaz1wLmgrJ8OXJytwLmE7ZGlzdFtrXT0oZGlzdFtrXXx8MCkrMTsKICAgICAgaWYocmVzJiZwLmg9PT1yZXMuaCYmcC5hPT09cmVzLmEpY3JhdmFkYXMrKzsKICAgIH0pOwogICAgbWF0Y2hTdGF0c1ttLmlkXT17dG90YWw6cGFscC5sZW5ndGgsY3JhdmFkYXMsZGlzdH07CiAgfSk7CgogIGNvbnN0IG1hdGNoQ2FyZHM9Y2ZnLm1hdGNoZXMubWFwKG09PnsKICAgIGNvbnN0IGNsb3NlZD1pc0Nsb3NlZChtKTsKICAgIGNvbnN0IHJlcz1jZmcucmVzdWx0c1ttLmlkXXx8e307CiAgICBjb25zdCBsb2NrZWRNYW51YWw9ISFjZmcubG9ja2VkW20uaWRdOwogICAgY29uc3Qgc3RhdHM9bWF0Y2hTdGF0c1ttLmlkXTsKICAgIGNvbnN0IHRvcERpc3Q9T2JqZWN0LmVudHJpZXMoc3RhdHMuZGlzdCkuc29ydCgoYSxiKT0+YlsxXS1hWzFdKS5zbGljZSgwLDQpOwogICAgY29uc3QgZGlzdEh0bWw9dG9wRGlzdC5sZW5ndGg\/dG9wRGlzdC5tYXAoKFtrLHZdKT0+YDxzcGFuIGNsYXNzPSJwaWxsIiB0aXRsZT0iJHt2fSBwYWxwaXRlJHt2PT09MT8nJzoncyd9Ij4ke2t9IDxiIHN0eWxlPSJjb2xvcjp2YXIoLS10ZWFsLWQpIj4ke3Z9PC9iPjwvc3Bhbj5gKS5qb2luKCcgJyk6JzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQtMik7Zm9udC1zaXplOjEycHgiPnNlbSBwYWxwaXRlcyBhaW5kYTwvc3Bhbj4nOwogICAgY29uc3QgY3JhdmFkYXNQY3Q9c3RhdHMudG90YWw+MD8oKHN0YXRzLmNyYXZhZGFzL3N0YXRzLnRvdGFsKSoxMDApLnRvRml4ZWQoMCk6JzAnOwogICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJhZC1tYXRjaCI+CiAgICAgIDxkaXYgY2xhc3M9ImFkbS1oZWFkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJhZG0tdGl0bGUiPiR7RlttLmhbMV1dfHwn4pq9J30gPGI+JHtlc2MobS5oWzBdKX08L2I+IMOXIDxiPiR7ZXNjKG0uYVswXSl9PC9iPiAke0ZbbS5hWzFdXXx8J+KavSd9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYWRtLW1ldGEiPiR7ZXNjKG0uc2VsKX0gwrcgJHtmbXREYXRlKG0uayl9JHttLmZyPycgwrcgPHNwYW4gY2xhc3M9InBpbGwgZ29sZCI+MsOXIEZpbmFsPC9zcGFuPic6Jyd9IMK3IDxzcGFuIGNsYXNzPSJwaWxsICR7Y2xvc2VkPydlcnInOidvayd9Ij4ke2Nsb3NlZD8nRmVjaGFkbyc6J0FiZXJ0byd9PC9zcGFuPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYWRtLXJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iYWRtLXNjb3JlLXJvdyI+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1pbmkiIHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9Ijk5IiBpbnB1dG1vZGU9Im51bWVyaWMiIGFyaWEtbGFiZWw9IkdvbHMgJHtlc2MobS5oWzBdKX0iIGRhdGEtcm09IiR7bS5pZH0iIGRhdGEtcz0iaCIgdmFsdWU9IiR7cmVzLmghPW51bGw\/cmVzLmg6Jyd9Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ4Ij7Dlzwvc3Bhbj4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibWluaSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iOTkiIGlucHV0bW9kZT0ibnVtZXJpYyIgYXJpYS1sYWJlbD0iR29scyAke2VzYyhtLmFbMF0pfSIgZGF0YS1ybT0iJHttLmlkfSIgZGF0YS1zPSJhIiB2YWx1ZT0iJHtyZXMuYSE9bnVsbD9yZXMuYTonJ30iPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBkYXRhLWxvY2s9IiR7bS5pZH0iIHN0eWxlPSJwYWRkaW5nOjZweCAxMnB4O2ZvbnQtc2l6ZToxMS41cHg7bWFyZ2luLWxlZnQ6NnB4IiBhcmlhLWxhYmVsPSIke2xvY2tlZE1hbnVhbD8nRGVzdHJhdmFyJzonVHJhdmFyJ30gcGFscGl0ZXMgZGVzdGUgam9nbyI+JHtsb2NrZWRNYW51YWw\/J\/CflJIgVHJhdmFkbyc6J\/CflJMgRWRpdMOhdmVsJ308L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJhZG0tc3RhdHMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYWRtLXN0YXQiPjxiPiR7c3RhdHMudG90YWx9PC9iPjxzcGFuPnBhbHBpdGVzPC9zcGFuPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYWRtLXN0YXQiPjxiPiR7c3RhdHMuY3JhdmFkYXN9PC9iPjxzcGFuPmNyYXZhZGFzICgke2NyYXZhZGFzUGN0fSUpPC9zcGFuPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYWRtLWRpc3QiPiR7ZGlzdEh0bWx9PC9kaXY+CiAgICA8L2Rpdj5gOwogIH0pLmpvaW4oJycpOwoKICBib3guaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJhZG1pbi1jYXJkIj4nKwogICAgJzxoMz5SZXN1bHRhZG9zIGRvcyBqb2dvczwvaDM+JysKICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDE0cHgiPkxhbmNlIG8gcGxhY2FyIGZpbmFsIGRlIGNhZGEgam9nby4gTyByYW5raW5nIHJlY2FsY3VsYSBhdXRvbWF0aWNhbWVudGUgYXDDs3Mgc2FsdmFyLjwvcD4nKwogICAgJzxkaXYgY2xhc3M9ImFkLW1hdGNoZXMiPicrbWF0Y2hDYXJkcysnPC9kaXY+JysKICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLXRvcDoxOHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZCI+JysKICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBnaG9zdCIgaWQ9ImFkbV9yZXNldF9qb2dvcyIgc3R5bGU9InBhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXJlZCk7Ym9yZGVyLWNvbG9yOiNmMmNmY2Q7YmFja2dyb3VuZDojZmJlYWVhIj7wn5SEIFplcmFyIHJlc3VsdGFkb3M8L2J1dHRvbj4nKwogICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkiIGlkPSJhZG1fc2F2ZV9qb2dvcyIgc3R5bGU9InBhZGRpbmc6MTBweCAxOHB4O2ZvbnQtc2l6ZToxMy41cHgiPvCfkr4gU2FsdmFyIHJlc3VsdGFkb3MgZSByZWNhbGN1bGFyPC9idXR0b24+JysKICAgICc8L2Rpdj4nKwogICc8L2Rpdj4nOwoKICAvLyBMb2NrIHRvZ2dsZSBwb3Igam9nbwogIC8vIDIwMjYtMDYtMDYgZml4IEJVRy0wODogcHJlc2VydmEgcGxhY2FyIGRpZ2l0YWRvIChuw6NvIHNhbHZvKSBhbyB0b2dnbGUgbG9jayDigJQKICAvLyBhbnRlcywgbyByZW5kZXJBZG1pbkpvZ29zKCkgcmVidWlsZGF2YSB0dWRvIGRlIGNmZyBlIGFwYWdhdmEgaW5wdXRzLgogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1sb2NrXScpLmZvckVhY2goYj0+ewogICAgYi5vbmNsaWNrPWFzeW5jKCk9PnsKICAgICAgY29uc3QgaWQ9Yi5kYXRhc2V0LmxvY2ssbnY9IWNmZy5sb2NrZWRbaWRdOwogICAgICAvLyBzbmFwc2hvdCBkb3MgdmFsdWVzIGRpZ2l0YWRvcyBBTlRFUyBkZSBxdWFscXVlciByZS1yZW5kZXIKICAgICAgY29uc3QgcGVuZGluZz17fTsKICAgICAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJtXScpLmZvckVhY2goaW5wPT57CiAgICAgICAgY29uc3QgbWlkPWlucC5kYXRhc2V0LnJtLHNrPWlucC5kYXRhc2V0LnMsdj1pbnAudmFsdWU7CiAgICAgICAgaWYodiE9PScnKShwZW5kaW5nW21pZF09cGVuZGluZ1ttaWRdfHx7fSlbc2tdPXY7CiAgICAgIH0pOwogICAgICBjb25zdCB7ZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdhZG1pbl9sb2NrX21hdGNoJyx7cF9pZDppZCxwX2xvY2tlZDpudn0pOwogICAgICBpZihlcnJvcil7dG9hc3QoJ0Vycm8gYW8gdHJhdmFyIChzZXNzw6NvIGFkbWluPyknKTtyZXR1cm47fQogICAgICBjZmcubG9ja2VkW2lkXT1udjtfYWRtUmFua1N0YXRlLmxvYWRlZEF0PTA7X2FkbUVzY29sYXNTdGF0ZS5sb2FkZWRBdD0wOwogICAgICByZW5kZXJBZG1pbkpvZ29zKCk7CiAgICAgIC8vIHJlc3RhdXJhIHZhbHVlcyBkaWdpdGFkb3Mgbm9zIGlucHV0cyBkbyBub3ZvIERPTQogICAgICBjb25zdCBuZXdCb3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvZ29zQm94Jyl8fGRvY3VtZW50OwogICAgICBPYmplY3Qua2V5cyhwZW5kaW5nKS5mb3JFYWNoKG1pZD0+ewogICAgICAgIFsnaCcsJ2EnXS5mb3JFYWNoKHNrPT57CiAgICAgICAgICBpZihwZW5kaW5nW21pZF1bc2tdPT1udWxsKXJldHVybjsKICAgICAgICAgIGNvbnN0IGlucD1uZXdCb3gucXVlcnlTZWxlY3RvcignW2RhdGEtcm09IicrbWlkKyciXVtkYXRhLXM9Iicrc2srJyJdJyk7CiAgICAgICAgICBpZihpbnApaW5wLnZhbHVlPXBlbmRpbmdbbWlkXVtza107CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICB9KTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbV9zYXZlX2pvZ29zJykub25jbGljaz1hc3luYygpPT57CiAgICBjb25zdCB1cGRhdGVzPXt9OwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcm1dJykuZm9yRWFjaChpbnA9PnsKICAgICAgY29uc3QgaWQ9aW5wLmRhdGFzZXQucm0sc2s9aW5wLmRhdGFzZXQucyx2PWlucC52YWx1ZTsKICAgICAgdXBkYXRlc1tpZF09dXBkYXRlc1tpZF18fHt9OwogICAgICB1cGRhdGVzW2lkXVtza109KHY9PT0nJz9udWxsOk1hdGgubWF4KDAscGFyc2VJbnQodil8fDApKTsKICAgIH0pOwogICAgbGV0IGZhaWxlZD1mYWxzZTsKICAgIGZvcihjb25zdCBpZCBpbiB1cGRhdGVzKXsKICAgICAgLy8gMDAxNSBIMjogUlBDIGF1ZGl0YWRhCiAgICAgIGNvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX3NldF9tYXRjaF9yZXN1bHQnLHtwX2lkOmlkLHBfaG9tZTp1cGRhdGVzW2lkXS5oLHBfYXdheTp1cGRhdGVzW2lkXS5hfSk7CiAgICAgIGlmKGVycm9yKWZhaWxlZD10cnVlOwogICAgfQogICAgYXdhaXQgbG9hZENmZygpOwogICAgX2FkbVJhbmtTdGF0ZS5sb2FkZWRBdD0wO19hZG1Fc2NvbGFzU3RhdGUubG9hZGVkQXQ9MDsKICAgIHRvYXN0KGZhaWxlZD8nRXJybyBhbyBzYWx2YXIgKHNlc3PDo28gYWRtaW4\/KSc6J1Jlc3VsdGFkb3Mgc2Fsdm9zIOKckycpOwogICAgcmVuZGVyQWRtaW5Kb2dvcygpOwogIH07CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1fcmVzZXRfam9nb3MnKS5vbmNsaWNrPWFzeW5jKCk9PnsKICAgIGlmKCFjb25maXJtKCdaZXJhciBUT0RPUyBvcyByZXN1bHRhZG9zIGUgdHJhdmFzPyBPcyBpbnNjcml0b3MgZSBwYWxwaXRlcyBOw4NPIHPDo28gYXBhZ2Fkb3MuJykpcmV0dXJuOwogICAgY29uc3QgaWRzPWNmZy5tYXRjaGVzLm1hcChtPT5tLmlkKTsKICAgIC8vIDAwMTUgSDI6IFJQQyBhdWRpdGFkYQogICAgY29uc3Qge2Vycm9yfT1hd2FpdCBzdXBhLnJwYygnYWRtaW5fcmVzZXRfbWF0Y2hlcycse3BfaWRzOmlkc30pOwogICAgaWYoZXJyb3Ipe3RvYXN0KCdFcnJvIGFvIHplcmFyJyk7cmV0dXJuO30KICAgIGF3YWl0IGxvYWRDZmcoKTtpZih0eXBlb2YgX2NvbmZEb25lIT09J3VuZGVmaW5lZCcpX2NvbmZEb25lLmNsZWFyKCk7CiAgICBfYWRtUmFua1N0YXRlLmxvYWRlZEF0PTA7X2FkbUVzY29sYXNTdGF0ZS5sb2FkZWRBdD0wOwogICAgdG9hc3QoJ1Jlc3VsdGFkb3MgemVyYWRvcycpOwogICAgcmVuZGVyQWRtaW5Kb2dvcygpOwogIH07Cn0KCmFzeW5jIGZ1bmN0aW9uIF9hZG1Mb2FkUmFmZmxlSGlzdG9yeSgpewogIHRyeXsKICAgIGNvbnN0IHtkYXRhOnJhZmZsZXN9PWF3YWl0IHN1cGEuZnJvbSgncmFmZmxlcycpLnNlbGVjdCgnaWQsa2luZCxwbGF5ZXJfaWQscHJpemUsY3JlYXRlZF9hdCcpLm9yZGVyKCdjcmVhdGVkX2F0Jyx7YXNjZW5kaW5nOmZhbHNlfSk7CiAgICBjb25zdCBpZHM9QXJyYXkuZnJvbShuZXcgU2V0KChyYWZmbGVzfHxbXSkuZmlsdGVyKHI9PnIucGxheWVyX2lkKS5tYXAocj0+ci5wbGF5ZXJfaWQpKSk7CiAgICBsZXQgcG1hcD17fTsKICAgIGlmKGlkcy5sZW5ndGgpewogICAgICBjb25zdCB7ZGF0YTpwbGF5ZXJzfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5zZWxlY3QoJ2lkLG5vbWUsZW1haWwsY29uY3Vyc28nKS5pbignaWQnLGlkcyk7CiAgICAgIChwbGF5ZXJzfHxbXSkuZm9yRWFjaChwPT57cG1hcFtwLmlkXT1wO30pOwogICAgfQogICAgcmV0dXJuIChyYWZmbGVzfHxbXSkubWFwKHI9Pk9iamVjdC5hc3NpZ24oe30scix7cGxheWVyOnIucGxheWVyX2lkP3BtYXBbci5wbGF5ZXJfaWRdOm51bGx9KSk7CiAgfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoJ3JhZmZsZSBoaXN0b3J5JyxlKTtyZXR1cm4gW107fQp9Cgphc3luYyBmdW5jdGlvbiByZW5kZXJBZG1pblNvcnRlaW9zKCl7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0ZWlvc0JveCcpO2lmKCFib3gpcmV0dXJuOwogIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5DYXJyZWdhbmRvIHNvcnRlaW9z4oCmPC9kaXY+JzsKCiAgbGV0IHBsYXllcnM9X2FkbVJhbmtTdGF0ZS5kYXRhOwogIGlmKCFwbGF5ZXJzfHwoRGF0ZS5ub3coKS1fYWRtUmFua1N0YXRlLmxvYWRlZEF0KT4zMDAwMCl7CiAgICB0cnl7CiAgICAgIHBsYXllcnM9c2NvcmVBbGwoYXdhaXQgbG9hZEFsbFBsYXllcnNBZG1pbigpKTsKICAgICAgX2FkbVJhbmtTdGF0ZS5kYXRhPXBsYXllcnM7X2FkbVJhbmtTdGF0ZS5sb2FkZWRBdD1EYXRlLm5vdygpOwogICAgfWNhdGNoKGUpe2JveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5FcnJvIGFvIGNhcnJlZ2FyLjwvZGl2Pic7cmV0dXJuO30KICB9CiAgY29uc3QgaGlzdG9yeT1hd2FpdCBfYWRtTG9hZFJhZmZsZUhpc3RvcnkoKTsKICBjb25zdCBoQ2FtaXNhcz1oaXN0b3J5LmZpbHRlcihoPT5oLmtpbmQ9PT0nY2FtaXNhcycpOwogIGNvbnN0IGhFc2NvbGE9aGlzdG9yeS5maWx0ZXIoaD0+aC5raW5kPT09J2VzY29sYV9jYW1wZWEnKTsKCiAgY29uc3QgcmFmZmxlTWluPWNmZy5yYWZmbGVNaW58fDMwOwogIGNvbnN0IGVsaWc9cGxheWVycy5maWx0ZXIocD0+cC5fcHRzPj1yYWZmbGVNaW4pOwogIGNvbnN0IGNoYW1waW9uPShfYWRtRXNjb2xhc1N0YXRlLnNjaG9vbHMmJl9hZG1Fc2NvbGFzU3RhdGUuc2Nob29sc1swXSl8fF9jb21wdXRlU2Nob29sU3RhdHMocGxheWVycylbMF07CgogIGZ1bmN0aW9uIHJvd0h0bWwocil7CiAgICBjb25zdCBub21lPXIucGxheWVyP3IucGxheWVyLm5vbWU6JyhyZW1vdmlkbyknOwogICAgY29uc3QgY29uYz1yLnBsYXllciYmci5wbGF5ZXIuY29uY3Vyc28\/ci5wbGF5ZXIuY29uY3Vyc286J+KAlCc7CiAgICByZXR1cm4gYDx0cj48dGQ+PGI+JHtlc2Mobm9tZSl9PC9iPjwvdGQ+PHRkPiR7ZXNjKGNvbmMpfTwvdGQ+PHRkPiR7ZXNjKHIucHJpemV8fCfigJQnKX08L3RkPjx0ZD4ke2VzYyhmbXRUcyhyLmNyZWF0ZWRfYXQpKX08L3RkPjwvdHI+YDsKICB9CgogIGJveC5pbm5lckhUTUw9CiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+JysKICAgICAgJzxoMz7wn46BIFNvcnRlaW8gZGFzIDUgY2FtaXNhczwvaDM+JysKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS1tdXQpO21hcmdpbjowIDAgMTRweCI+U29ydGVpYSA1IGdhbmhhZG9yZXMgZW50cmUgcXVlbSBwYXNzb3UgZGUgPGI+JytyYWZmbGVNaW4rJzwvYj4gcG9udG9zLiA8Yj5FeGNsdWk8L2I+IGF1dG9tYXRpY2FtZW50ZSBvIHDDs2RpbyAoVG9wIDMgZ2xvYmFpcykgZSBvcyBUb3AgMyBpbmRpY2HDp8O1ZXMuPC9wPicrCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjEycHg7YWxpZ24taXRlbXM6ZmxleC1lbmQ7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToxNHB4Ij4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJmbGQiIHN0eWxlPSJtaW4td2lkdGg6MTYwcHg7ZmxleDoxIj48bGFiZWwgZm9yPSJhZG1fcmFmZmxlX21pbiI+UG9udHVhw6fDo28gbcOtbmltYTwvbGFiZWw+PGlucHV0IGlkPSJhZG1fcmFmZmxlX21pbiIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHZhbHVlPSInK3JhZmZsZU1pbisnIj48L2Rpdj4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ2hvc3QiIGlkPSJhZG1fc2F2ZV9yYWZmbGVfbWluIiBzdHlsZT0icGFkZGluZzo5cHggMTRweDtmb250LXNpemU6MTNweCI+U2FsdmFyIG1ldGE8L2J1dHRvbj4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ29sZCIgaWQ9ImFkbV9kcmF3X2NhbWlzYXMiIHN0eWxlPSJwYWRkaW5nOjlweCAxNnB4O2ZvbnQtc2l6ZToxMy41cHgiPvCfjoEgU29ydGVhciA1IGdhbmhhZG9yZXM8L2J1dHRvbj4nKwogICAgICAnPC9kaXY+JysKICAgICAgJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luLWJvdHRvbTo4cHgiPkVsZWfDrXZlaXMgYWdvcmE6IDxiPicrZWxpZy5sZW5ndGgrJzwvYj4gYWx1bm8nKyhlbGlnLmxlbmd0aD09PTE\/Jyc6J3MnKSsoZWxpZy5sZW5ndGg9PT0wPygnIChwcmVjaXNhIHBhc3NhciBkZSAnK3JhZmZsZU1pbisnIHB0cyknKTonJykrJzwvZGl2PicrCiAgICAgICc8ZGl2IGlkPSJhZG1fZHJhd19jYW1pc2FzX3Jlc3VsdCIgc3R5bGU9Im1hcmdpbi10b3A6MTRweCI+PC9kaXY+JysKICAgICAgKGhDYW1pc2FzLmxlbmd0aD8oCiAgICAgICAgJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tdG9wOjE4cHgiPjxzdW1tYXJ5IHN0eWxlPSJjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjEzLjVweDtjb2xvcjp2YXIoLS10ZWFsLWQpIj5IaXN0w7NyaWNvICgnK2hDYW1pc2FzLmxlbmd0aCsnIHJlZ2lzdHJvcyk8L3N1bW1hcnk+JysKICAgICAgICAnPGRpdiBzdHlsZT0ib3ZlcmZsb3cteDphdXRvO21hcmdpbi10b3A6MTBweCI+PHRhYmxlIGNsYXNzPSJhZG1pbi10YWJsZSI+PHRoZWFkPjx0cj48dGg+R2FuaGFkb3I8L3RoPjx0aD5Db25jdXJzbzwvdGg+PHRoPlByw6ptaW88L3RoPjx0aD5RdWFuZG88L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JytoQ2FtaXNhcy5tYXAocm93SHRtbCkuam9pbignJykrJzwvdGJvZHk+PC90YWJsZT48L2Rpdj4nKwogICAgICAgICc8L2RldGFpbHM+JwogICAgICApOic8cCBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtjb2xvcjp2YXIoLS1tdXQtMik7bWFyZ2luOjE0cHggMCAwIj5OZW5odW0gc29ydGVpbyByZWFsaXphZG8gYWluZGEuPC9wPicpKwogICAgJzwvZGl2PicrCgogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPicrCiAgICAgICc8aDM+8J+PqyBTb3J0ZWlvIGRhIGVzY29sYSBjYW1wZcOjPC9oMz4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luOjAgMCAxMnB4Ij5JZGVudGlmaWNhIGEgZXNjb2xhIGNvbSBtYWlvciBtw6lkaWEgVG9wICcrRVNDT0xBX1RPUE4rJyBlIHNvcnRlaWEgPGI+MiBwcsOqbWlvczwvYj4gKGNhbWlzYSArIEFwcGxlIFdhdGNoKSBlbnRyZSBzZXVzIFRvcCAnK0VTQ09MQV9QUkVNSU9fVE9QTisnLjwvcD4nKwogICAgICAoY2hhbXBpb24mJmNoYW1waW9uLmF2Z1RvcD4wPygKICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcscmdiYSgyMjcsMTY1LDMxLC4xMiksdHJhbnNwYXJlbnQpO3BhZGRpbmc6MTJweCAxNHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MXB4IHNvbGlkICNlM2M4N2E7bWFyZ2luLWJvdHRvbToxNHB4Ij4nKwogICAgICAgICAgJ\/Cfj4YgTMOtZGVyIGF0dWFsOiA8Yj4nK2VzYyhjaGFtcGlvbi5uYW1lKSsnPC9iPiDCtyBtw6lkaWEgVG9wICcrRVNDT0xBX1RPUE4rJyA9IDxiPicrY2hhbXBpb24uYXZnVG9wLnRvRml4ZWQoMSkrJzwvYj4gwrcgcG9vbCBzb3J0ZWlvOiA8Yj4nK01hdGgubWluKEVTQ09MQV9QUkVNSU9fVE9QTixjaGFtcGlvbi5hbGwuZmlsdGVyKHA9PnAuX3B0cz4wKS5sZW5ndGgpKyc8L2I+IGFsdW5vcycrCiAgICAgICAgJzwvZGl2PicKICAgICAgKTonPHAgc3R5bGU9ImZvbnQtc2l6ZToxMy41cHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDEycHgiPkFpbmRhIG7Do28gaMOhIGVzY29sYSBjb20gcG9udHVhw6fDo28gc3VmaWNpZW50ZS48L3A+JykrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gZ29sZCIgaWQ9ImFkbV9kcmF3X2VzY29sYSIgc3R5bGU9InBhZGRpbmc6OXB4IDE2cHg7Zm9udC1zaXplOjEzLjVweCI+8J+PqyBTb3J0ZWFyIHByw6ptaW9zIGRhIGVzY29sYSBjYW1wZcOjPC9idXR0b24+JysKICAgICAgJzxkaXYgaWQ9ImFkbV9kcmF3X2VzY29sYV9yZXN1bHQiIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHgiPjwvZGl2PicrCiAgICAgIChoRXNjb2xhLmxlbmd0aD8oCiAgICAgICAgJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tdG9wOjE4cHgiPjxzdW1tYXJ5IHN0eWxlPSJjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjEzLjVweDtjb2xvcjp2YXIoLS10ZWFsLWQpIj5IaXN0w7NyaWNvICgnK2hFc2NvbGEubGVuZ3RoKycgcmVnaXN0cm9zKTwvc3VtbWFyeT4nKwogICAgICAgICc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG87bWFyZ2luLXRvcDoxMHB4Ij48dGFibGUgY2xhc3M9ImFkbWluLXRhYmxlIj48dGhlYWQ+PHRyPjx0aD5HYW5oYWRvcjwvdGg+PHRoPkVzY29sYTwvdGg+PHRoPlByw6ptaW88L3RoPjx0aD5RdWFuZG88L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JytoRXNjb2xhLm1hcChyb3dIdG1sKS5qb2luKCcnKSsnPC90Ym9keT48L3RhYmxlPjwvZGl2PicrCiAgICAgICAgJzwvZGV0YWlscz4nCiAgICAgICk6JycpKwogICAgJzwvZGl2Pic7CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1fc2F2ZV9yYWZmbGVfbWluJykub25jbGljaz1hc3luYygpPT57CiAgICBjb25zdCBuPU1hdGgubWF4KDAscGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbV9yYWZmbGVfbWluJykudmFsdWUpfHwwKTsKICAgIC8vIDAwMTUgSDI6IFJQQyBhZG1pbl9zZXRfY29uZmlnICh3aGl0ZWxpc3QgKyBhdWRpdCkKICAgIGNvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX3NldF9jb25maWcnLHtwX2tleToncmFmZmxlX21pbicscF92YWx1ZTpufSk7CiAgICBpZihlcnJvcil7dG9hc3QoJ0Vycm8gYW8gc2FsdmFyIG1ldGEnKTtyZXR1cm47fQogICAgY2ZnLnJhZmZsZU1pbj1uOwogICAgY29uc3QgdGhyPW4rJyBwb250b3MnO1sndGhydHh0JywndGhydHh0MicsJ3RocnR4dDMnXS5mb3JFYWNoKGlkPT57Y29uc3QgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYoZSllLnRleHRDb250ZW50PXRocjt9KTsKICAgIHRvYXN0KCdNZXRhIHNhbHZhOiAnK24rJyBwdHMnKTsKICAgIHJlbmRlckFkbWluU29ydGVpb3MoKTsKICB9OwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtX2RyYXdfY2FtaXNhcycpLm9uY2xpY2s9YXN5bmMoKT0+ewogICAgaWYoIWNvbmZpcm0oJ1NvcnRlYXIgNSBjYW1pc2FzIGFnb3JhPyBPIHNlcnZpZG9yIHNvcnRlaWEgY29tIGFudGktYWPDum11bG8gKyBhdWRpdCBsb2cuJykpcmV0dXJuOwogICAgY29uc3QgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1fZHJhd19jYW1pc2FzJyk7YnRuLmRpc2FibGVkPXRydWU7CiAgICBjb25zdCByZXN1bHRCb3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbV9kcmF3X2NhbWlzYXNfcmVzdWx0Jyk7CiAgICBjb25zdCB7ZGF0YSxlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2RvX3JhZmZsZScse3Bfa2luZDonY2FtaXNhcyd9KTsKICAgIGJ0bi5kaXNhYmxlZD1mYWxzZTsKICAgIGlmKGVycm9yKXtyZXN1bHRCb3guaW5uZXJIVE1MPSc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmYmVhZWE7Ym9yZGVyOjFweCBzb2xpZCAjZjBjNGMyO2NvbG9yOiNhMDE3MTc7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MTJweCAxNHB4O2ZvbnQtc2l6ZToxMy41cHgiPuKdjCAnK2VzYyhlcnJvci5tZXNzYWdlfHwnZXJybyBubyBzb3J0ZWlvJykrJzwvZGl2Pic7cmV0dXJuO30KICAgIGNvbnN0IHdpbnM9KGRhdGEmJmRhdGEud2lubmVycyl8fFtdOwogICAgaWYoIXdpbnMubGVuZ3RoKXsKICAgICAgcmVzdWx0Qm94LmlubmVySFRNTD0nPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZmZmOGU3O2JvcmRlcjoxcHggc29saWQgI2UzYzg3YTtjb2xvcjojN2E1YjEyO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjEycHggMTRweDtmb250LXNpemU6MTMuNXB4Ij7imqDvuI8gTmluZ3XDqW0gZWxlZ8OtdmVsLiBQcmVjaXNhIOKJpScrY2ZnLnJhZmZsZU1pbisnIHB0cyBlIG7Do28gZXN0YXIgZW0gcMOzZGlvL1RvcCAzIGluZGljYcOnw7Vlcy9zb3J0ZWlvcyBhbnRlcmlvcmVzLjwvZGl2Pic7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJlc3VsdEJveC5pbm5lckhUTUw9JzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2U3ZjZlZTtib3JkZXI6MXB4IHNvbGlkICNiZmU2ZDA7Y29sb3I6IzBhNWIzZjtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxNHB4IDE2cHgiPjxiPvCfjokgR2FuaGFkb3JlcyAoc2VydmVyLXNpZGUsIGdyYXZhZG8gZW0gcmFmZmxlcyArIGFkbWluX2FjdGlvbnMpOjwvYj48YnI+Jyt3aW5zLm1hcCh3PT4n4oCiIEAnK2VzYyh3LnVzZXJuYW1lfHwnPycpKycgwrcgJytlc2Mody5ub21lKSsnIMK3ICcrZXNjKHcuZW1haWwpKycgKCcrdy5wdHMrJyBwdHMpJykuam9pbignPGJyPicpKyc8YnI+PHNtYWxsIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXQpIj5FeGNsdcOtZG9zOiAnKyhkYXRhLmV4Y2x1ZGVkX2NvdW50fHwwKSsnICDCtyAgUG9vbCBlbGVnw612ZWw6ICcrKGRhdGEuZWxpZ2libGVfY291bnR8fDApKyc8L3NtYWxsPjwvZGl2Pic7CiAgICB0b2FzdCgnU29ydGVpbyBncmF2YWRvIOKckycpO3JlbmRlckFkbWluU29ydGVpb3MoKTsKICB9OwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtX2RyYXdfZXNjb2xhJykub25jbGljaz1hc3luYygpPT57CiAgICBpZighY29uZmlybSgnU29ydGVhciBwcsOqbWlvcyBkYSBlc2NvbGEgY2FtcGXDoz8gU2VydmVyIHNvcnRlaWEgY29tIGFudGktYWPDum11bG8gKyBhdWRpdCBsb2cuJykpcmV0dXJuOwogICAgY29uc3QgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1fZHJhd19lc2NvbGEnKTtidG4uZGlzYWJsZWQ9dHJ1ZTsKICAgIGNvbnN0IGJveDI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbV9kcmF3X2VzY29sYV9yZXN1bHQnKTsKICAgIGNvbnN0IHtkYXRhLGVycm9yfT1hd2FpdCBzdXBhLnJwYygnZG9fcmFmZmxlJyx7cF9raW5kOidlc2NvbGEnfSk7CiAgICBidG4uZGlzYWJsZWQ9ZmFsc2U7CiAgICBpZihlcnJvcil7CiAgICAgIGlmKC9wb250dWHDp8Ojby9pLnRlc3QoZXJyb3IubWVzc2FnZXx8JycpKXtib3gyLmlubmVySFRNTD0nPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZmZmOGU3O2JvcmRlcjoxcHggc29saWQgI2UzYzg3YTtjb2xvcjojN2E1YjEyO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjEycHggMTRweDtmb250LXNpemU6MTMuNXB4Ij7imqDvuI8gQWluZGEgbsOjbyBow6EgZXNjb2xhIGNvbSBwb250dWHDp8OjbyBzdWZpY2llbnRlLjwvZGl2Pic7cmV0dXJuO30KICAgICAgYm94Mi5pbm5lckhUTUw9JzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2ZiZWFlYTtib3JkZXI6MXB4IHNvbGlkICNmMGM0YzI7Y29sb3I6I2EwMTcxNztib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxMnB4IDE0cHgiPuKdjCAnK2VzYyhlcnJvci5tZXNzYWdlfHwnJykrJzwvZGl2Pic7cmV0dXJuOwogICAgfQogICAgY29uc3Qgd2lucz0oZGF0YSYmZGF0YS53aW5uZXJzKXx8W107CiAgICBpZighd2lucy5sZW5ndGgpe2JveDIuaW5uZXJIVE1MPSc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmZmY4ZTc7Ym9yZGVyOjFweCBzb2xpZCAjZTNjODdhO2NvbG9yOiM3YTViMTI7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MTJweCAxNHB4O2ZvbnQtc2l6ZToxMy41cHgiPuKaoO+4jyBQb29sIGRhIGVzY29sYSBsw61kZXIgZXN0w6EgdmF6aW8gKHRvZG9zIHBvZGVtIGrDoSB0ZXIgZ2FuaG8gZW0gb3V0cm8gc29ydGVpbykuPC9kaXY+JztyZXR1cm47fQogICAgY29uc3QgdGFnID0gZGF0YS52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPyfwn46TJzon8J+qlic7CiAgICBib3gyLmlubmVySFRNTD0nPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZTdmNmVlO2JvcmRlcjoxcHggc29saWQgI2JmZTZkMDtjb2xvcjojMGE1YjNmO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjE0cHggMTZweCI+PGI+Jyt0YWcrJyBFc2NvbGEgY2FtcGXDozogJytlc2MoZGF0YS5zY2hvb2wpKyc8L2I+IChtw6lkaWEgVG9wICcrRVNDT0xBX1RPUE4rJyA9ICcrZGF0YS5zY2hvb2xfYXZnKycsIHBvb2wgJytkYXRhLnBvb2xfc2l6ZSsnKTo8YnI+Jyt3aW5zLm1hcCh3PT4n4oCiIDxiPicrZXNjKHcucHJpemUpKyc8L2I+OiBAJytlc2Mody51c2VybmFtZXx8Jz8nKSsnIMK3ICcrZXNjKHcubm9tZSkrJyDCtyAnK2VzYyh3LmVtYWlsKSsnICgnK3cucHRzKycgcHRzKScpLmpvaW4oJzxicj4nKSsnPGJyPjxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0KSI+RXhjbHXDrWRvczogJysoZGF0YS5leGNsdWRlZF9jb3VudHx8MCkrJzwvc21hbGw+PC9kaXY+JzsKICAgIHRvYXN0KCdTb3J0ZWlvIGdyYXZhZG8g4pyTJyk7cmVuZGVyQWRtaW5Tb3J0ZWlvcygpOwogIH07Cn0KLyogLS0tLS0tLS0tLSBGODogSW5kaWNhw6fDtWVzIC0tLS0tLS0tLS0gKi8KY29uc3QgQURNSU5fSU5EX1BBR0VfU0laRT0xMDsKbGV0IF9hZG1JbmRTdGF0ZT17cGFnZToxLCBkYXRhOm51bGx9OwoKYXN5bmMgZnVuY3Rpb24gcmVuZGVyQWRtaW5JbmRpY2Fjb2VzKCl7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmRpY2Fjb2VzQm94Jyk7aWYoIWJveClyZXR1cm47CiAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG8gaW5kaWNhw6fDtWVz4oCmPC9kaXY+JzsKICB0cnl7CiAgICBjb25zdCByPWF3YWl0IHN1cGEucnBjKCdnZXRfcmVmZXJyYWxfbGVhZGVyYm9hcmQnLHtsaW06NTAwfSk7CiAgICBpZighci5lcnJvcilfYWRtSW5kU3RhdGUuZGF0YT1yLmRhdGF8fFtdOwogICAgZWxzZSB7IGNvbnNvbGUuZXJyb3Ioci5lcnJvcik7IF9hZG1JbmRTdGF0ZS5kYXRhPVtdOyB9CiAgfWNhdGNoKGUpeyBjb25zb2xlLmVycm9yKGUpOyBfYWRtSW5kU3RhdGUuZGF0YT1bXTsgfQogIF9hZG1JbmRTdGF0ZS5wYWdlPTE7CiAgX3JlbmRlckFkbWluSW5kaWNhY29lc1RhYmxlKCk7Cn0KCmZ1bmN0aW9uIF9yZW5kZXJBZG1pbkluZGljYWNvZXNUYWJsZSgpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5kaWNhY29lc0JveCcpO2lmKCFib3gpcmV0dXJuOwogIGNvbnN0IHM9X2FkbUluZFN0YXRlOwogIGNvbnN0IGRhdGE9cy5kYXRhfHxbXTsKCiAgaWYoIWRhdGEubGVuZ3RoKXsKICAgIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxoMz7wn5OjIEluZGljYcOnw7VlczwvaDM+JysKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTRweDtjb2xvcjp2YXIoLS1tdXQpO21hcmdpbjowIj5OaW5ndcOpbSByZWNlYmV1IGluZGljYcOnw6NvIHbDoWxpZGEgYWluZGEuIENvbmZvcm1lIGFsdW5vcyBjb21wYXJ0aWxoYW0gbyBsaW5rIGUgYW1pZ29zIHNlIGNhZGFzdHJhbSArIHBhbHBpdGFtLCBvIHJhbmtpbmcgYXBhcmVjZSBhcXVpLjwvcD4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dC0yKTttYXJnaW4tdG9wOjEwcHgiPjxiPkxlbWJyZXRlOjwvYj4gb3MgMyBhbHVub3MgY29tIG1haXMgaW5kaWNhw6fDtWVzIHbDoWxpZGFzIGdhbmhhbSB1bWEgY2FtaXNhIG9maWNpYWwgZG8gQnJhc2lsIGNhZGEuPC9wPicrCiAgICAnPC9kaXY+JzsKICAgIHJldHVybjsKICB9CgogIC8vIEtQSXMgKHNlbXByZSBiYXNlYWRvcyBubyBkYXRhc2V0IGNvbXBsZXRvLCBuw6NvIG5hIHDDoWdpbmEpCiAgY29uc3QgdG90YWxWYWxpZGFzPWRhdGEucmVkdWNlKChzdW0scik9PnN1bStyLmluZGljYWNvZXNfdmFsaWRhcywwKTsKICBjb25zdCB0b3RhbFRvdGFpcz1kYXRhLnJlZHVjZSgoc3VtLHIpPT5zdW0rci5pbmRpY2Fjb2VzX3RvdGFpcywwKTsKICBjb25zdCB0YXhhR2VyYWw9dG90YWxUb3RhaXM+MD8oKHRvdGFsVmFsaWRhcy90b3RhbFRvdGFpcykqMTAwKS50b0ZpeGVkKDApOicwJzsKCiAgLy8gUGFnaW5hw6fDo28gMjAvcMOhZ2luYSDigJQgbWFudMOpbSBvcmRlbSBvcmlnaW5hbCAoasOhIHZlbSBvcmRlbmFkbyBwb3IgdsOhbGlkYXMgZGVzYyBkYSBSUEMpCiAgY29uc3QgdG90YWxQYWdlcz1NYXRoLm1heCgxLE1hdGguY2VpbChkYXRhLmxlbmd0aC9BRE1JTl9JTkRfUEFHRV9TSVpFKSk7CiAgaWYocy5wYWdlPnRvdGFsUGFnZXMpIHMucGFnZT10b3RhbFBhZ2VzOwogIGlmKHMucGFnZTwxKSBzLnBhZ2U9MTsKICBjb25zdCBwYWdlU3RhcnQ9KHMucGFnZS0xKSpBRE1JTl9JTkRfUEFHRV9TSVpFOwogIGNvbnN0IHBhZ2VSb3dzPWRhdGEuc2xpY2UocGFnZVN0YXJ0LCBwYWdlU3RhcnQrQURNSU5fSU5EX1BBR0VfU0laRSk7CgogIGNvbnN0IHRycz1wYWdlUm93cy5tYXAoKHIsaSk9PnsKICAgIGNvbnN0IGdsb2JhbElkeD1wYWdlU3RhcnQraTsgLy8gcG9zacOnw6NvIHJlYWwgbm8gbGVhZGVyYm9hcmQKICAgIGNvbnN0IGNvbnY9ci5pbmRpY2Fjb2VzX3RvdGFpcz4wPygoci5pbmRpY2Fjb2VzX3ZhbGlkYXMvci5pbmRpY2Fjb2VzX3RvdGFpcykqMTAwKS50b0ZpeGVkKDApOicwJzsKICAgIGNvbnN0IHRvcDM9Z2xvYmFsSWR4PDM\/JzxzcGFuIGNsYXNzPSJwaWxsIGdvbGQiPvCfk6MgVG9wIDMgwrcgZ2FuaGEgY2FtaXNhPC9zcGFuPic6Jyc7CiAgICBjb25zdCBmaWxsUGN0PU1hdGgubWluKDEwMCxNYXRoLnJvdW5kKChyLmluZGljYWNvZXNfdmFsaWRhcy8oZGF0YVswXS5pbmRpY2Fjb2VzX3ZhbGlkYXN8fDEpKSoxMDApKTsKICAgIHJldHVybiBgPHRyPgogICAgICA8dGQgY2xhc3M9Im51bSI+PGI+JHtnbG9iYWxJZHgrMX3CujwvYj48L3RkPgogICAgICA8dGQ+CiAgICAgICAgPGI+JHtlc2Moci5ub21lKX08L2I+PGJyPgogICAgICAgIDxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpIj4ke2VzYyhyLmNvbmN1cnNvfHwnc2VtIGNvbmN1cnNvJyl9IMK3IHJlZiBjb2RlIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLXNvZnQpO3BhZGRpbmc6MXB4IDVweDtib3JkZXItcmFkaXVzOjRweCI+JHtlc2Moci5yZWZfY29kZSl9PC9jb2RlPjwvc21hbGw+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibnVtIj48YiBzdHlsZT0iY29sb3I6dmFyKC0tdGVhbC1kKTtmb250LXNpemU6MTVweCI+JHtyLmluZGljYWNvZXNfdmFsaWRhc308L2I+PC90ZD4KICAgICAgPHRkIGNsYXNzPSJudW0iPiR7ci5pbmRpY2Fjb2VzX3RvdGFpc308L3RkPgogICAgICA8dGQgY2xhc3M9Im51bSI+JHtjb252fSU8L3RkPgogICAgICA8dGQgc3R5bGU9Im1pbi13aWR0aDoxNDBweCI+PGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1tdXRlKTtib3JkZXItcmFkaXVzOjk5cHg7aGVpZ2h0OjhweDtvdmVyZmxvdzpoaWRkZW4iPjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHZhcigtLXRlYWwteCksdmFyKC0tdGVhbC1kKSk7aGVpZ2h0OjEwMCU7d2lkdGg6JHtmaWxsUGN0fSU7Ym9yZGVyLXJhZGl1czo5OXB4Ij48L2Rpdj48L2Rpdj48L3RkPgogICAgICA8dGQ+JHt0b3AzfTwvdGQ+CiAgICAgIDx0ZD48YnV0dG9uIGNsYXNzPSJidG4gcHJpbWFyeSIgZGF0YS1kZXRhaWw9IiR7ci5wbGF5ZXJfaWR9IiBzdHlsZT0icGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTJweCI+VmVyPC9idXR0b24+PC90ZD4KICAgIDwvdHI+YDsKICB9KS5qb2luKCcnKTsKCiAgY29uc3QgcGFnaW5hdGlvbiA9IGRhdGEubGVuZ3RoID4gQURNSU5fSU5EX1BBR0VfU0laRQogICAgPyAnPGRpdiBjbGFzcz0iYWRtaW4tcGFnaW5hdGlvbiIgc3R5bGU9Im1hcmdpbi10b3A6MTRweCI+JysKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBpZD0iaW5kX3ByZXYiJysocy5wYWdlPD0xPycgZGlzYWJsZWQnOicnKSsnPuKGkCBBbnRlcmlvcjwvYnV0dG9uPicrCiAgICAgICAgJzxzcGFuPlDDoWdpbmEgJytzLnBhZ2UrJyBkZSAnK3RvdGFsUGFnZXMrJyDCtyBtb3N0cmFuZG8gJytfZm10TihwYWdlU3RhcnQrMSkrJyBhICcrX2ZtdE4oTWF0aC5taW4ocGFnZVN0YXJ0K0FETUlOX0lORF9QQUdFX1NJWkUsZGF0YS5sZW5ndGgpKSsnIGRlICcrX2ZtdE4oZGF0YS5sZW5ndGgpKyc8L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBpZD0iaW5kX25leHQiJysocy5wYWdlPj10b3RhbFBhZ2VzPycgZGlzYWJsZWQnOicnKSsnPlByw7N4aW1hIOKGkjwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nCiAgICA6ICcnOwoKICBib3guaW5uZXJIVE1MPQogICAgJzxkaXYgY2xhc3M9ImtwaS1ncmlkIiBzdHlsZT0iZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMTgwcHgsMWZyKSk7bWFyZ2luLWJvdHRvbToxOHB4Ij4nKwogICAgICBfa3BpQ2FyZCgnQWx1bm9zIGluZGljYW5kbycsX2ZtdE4oZGF0YS5sZW5ndGgpLCdjb20gcGVsbyBtZW5vcyAxIGluZGljYcOnw6NvJykrCiAgICAgIF9rcGlDYXJkKCdJbmRpY2HDp8O1ZXMgdsOhbGlkYXMnLF9mbXROKHRvdGFsVmFsaWRhcyksJ2FtaWdvcyBxdWUgc2UgY2FkYXN0cmFyYW0gKyBwYWxwaXRhcmFtJyx0cnVlKSsKICAgICAgX2twaUNhcmQoJ0luZGljYcOnw7VlcyB0b3RhaXMnLF9mbXROKHRvdGFsVG90YWlzKSwnYW1pZ29zIGNhZGFzdHJhZG9zJykrCiAgICAgIF9rcGlDYXJkKCdUYXhhIGNvbnZlcnPDo28nLHRheGFHZXJhbCsnJScsJ2luZGljYWRvcyBxdWUgcGFscGl0YXJhbScpKwogICAgJzwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+JysKICAgICAgJzxoMz4nK19mbXROKGRhdGEubGVuZ3RoKSsnIGFsdW5vJysoZGF0YS5sZW5ndGg9PT0xPycnOidzJykrJyBjb20gaW5kaWNhw6fDtWVzPC9oMz4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luOjAgMCAxMnB4Ij48Yj5JbmRpY2HDp8OjbyB2w6FsaWRhPC9iPiA9IGFtaWdvIHNlIGNhZGFzdHJvdSBwZWxvIGxpbmsgZSBlbnZpb3UgcGVsbyBtZW5vcyAxIHBhbHBpdGUuIE9zIDMgcHJpbWVpcm9zIGdhbmhhbSBjYW1pc2Egb2ZpY2lhbCBkbyBCcmFzaWwuPC9wPicrCiAgICAgICc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iPjx0YWJsZSBjbGFzcz0iYWRtaW4tdGFibGUiPicrCiAgICAgICAgJzx0aGVhZD48dHI+PHRoIGNsYXNzPSJudW0iPiM8L3RoPjx0aD5BbHVubyAvIENvbmN1cnNvIC8gUmVmIENvZGU8L3RoPjx0aCBjbGFzcz0ibnVtIj5Ww6FsaWRhczwvdGg+PHRoIGNsYXNzPSJudW0iPlRvdGFpczwvdGg+PHRoIGNsYXNzPSJudW0iPkNvbnYuPC90aD48dGg+UmVsYXRpdm8gYW8gMcK6PC90aD48dGg+U3RhdHVzPC90aD48dGg+PC90aD48L3RyPjwvdGhlYWQ+JysKICAgICAgICAnPHRib2R5PicrdHJzKyc8L3Rib2R5PicrCiAgICAgICc8L3RhYmxlPjwvZGl2PicrCiAgICAgIHBhZ2luYXRpb24rCiAgICAnPC9kaXY+JzsKCiAgY29uc3QgcHY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZF9wcmV2Jyksbng9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZF9uZXh0Jyk7CiAgaWYocHYpcHYub25jbGljaz0oKT0+e2lmKHMucGFnZT4xKXtzLnBhZ2UtLTtfcmVuZGVyQWRtaW5JbmRpY2Fjb2VzVGFibGUoKTt3aW5kb3cuc2Nyb2xsVG8oe3RvcDowLGJlaGF2aW9yOidzbW9vdGgnfSk7fX07CiAgaWYobngpbngub25jbGljaz0oKT0+e2lmKHMucGFnZTx0b3RhbFBhZ2VzKXtzLnBhZ2UrKztfcmVuZGVyQWRtaW5JbmRpY2Fjb2VzVGFibGUoKTt3aW5kb3cuc2Nyb2xsVG8oe3RvcDowLGJlaGF2aW9yOidzbW9vdGgnfSk7fX07CgogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kZXRhaWxdJykuZm9yRWFjaChidG49PnsKICAgIGJ0bi5vbmNsaWNrPSgpPT5vcGVuQWRtaW5QbGF5ZXJEZXRhaWwoYnRuLmRhdGFzZXQuZGV0YWlsKTsKICB9KTsKfQovKiAtLS0tLS0tLS0tIEY5OiBDb25maWcgLS0tLS0tLS0tLSAqLwphc3luYyBmdW5jdGlvbiByZW5kZXJBZG1pbkNvbmZpZygpewogIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlnQm94Jyk7aWYoIWJveClyZXR1cm47CiAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG8gY29uZmln4oCmPC9kaXY+JzsKCiAgbGV0IGNmZ1Jvd3M9W107CiAgdHJ5e2NvbnN0IHI9YXdhaXQgc3VwYS5mcm9tKCdjb25maWcnKS5zZWxlY3QoJyonKTtpZighci5lcnJvciljZmdSb3dzPXIuZGF0YXx8W107fQogIGNhdGNoKGUpe2JveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5FcnJvIGFvIGNhcnJlZ2FyIGNvbmZpZy48L2Rpdj4nO3JldHVybjt9CgogIGNvbnN0IGNtYXA9e307KGNmZ1Jvd3N8fFtdKS5mb3JFYWNoKGM9PntjbWFwW2Mua2V5XT1jLnZhbHVlO30pOwogIGNvbnN0IHJhZmZsZU1pbj1jbWFwLnJhZmZsZV9taW4hPW51bGw\/TnVtYmVyKGNtYXAucmFmZmxlX21pbik6MzA7CiAgY29uc3QgZXNjb2xhVG9wbj1jbWFwLmVzY29sYV90b3BuIT1udWxsP051bWJlcihjbWFwLmVzY29sYV90b3BuKToxMDsKICBjb25zdCBlc2NvbGFQcmVtaW9Ub3BuPWNtYXAuZXNjb2xhX3ByZW1pb190b3BuIT1udWxsP051bWJlcihjbWFwLmVzY29sYV9wcmVtaW9fdG9wbik6MTAwOwogIGxldCBzdHVkeUxpbmtzPWNtYXAuc3R1ZHlfbGlua3N8fHt9OwogIGNvbnN0IFNUVURZX1ZFUlRTPVsKICAgIHt2ZXJ0OidlbScsbGFiZWw6J0VzdHJhdMOpZ2lhIE1pbGl0YXJlcycsYmFkZ2U6J3N2LWVtJyxjYXJkczpbCiAgICAgIHtzbHVnOidiYW5jb19xdWVzdG9lcycsaWM6J\/Cfk5onLHRpdGxlOidCYW5jbyBkZSBRdWVzdMO1ZXMnfSwKICAgICAge3NsdWc6J3NwcmludHMnLGljOifimqEnLHRpdGxlOidTcHJpbnRzIGRlIFF1ZXN0w7Vlcyd9CiAgICBdfSwKICAgIHt2ZXJ0OidldicsbGFiZWw6J0VzdHJhdMOpZ2lhIFZlc3RpYnVsYXJlcycsYmFkZ2U6J3N2LWV2JyxjYXJkczpbCiAgICAgIHtzbHVnOidiYW5jb19xdWVzdG9lcycsaWM6J\/Cfk5onLHRpdGxlOidCYW5jbyBkZSBRdWVzdMO1ZXMnfSwKICAgICAge3NsdWc6J2d1aWFfZW5lbScsaWM6J\/Cfk5gnLHRpdGxlOidFYm9vayBHdWlhIEVORU0nfQogICAgXX0KICBdOwogIGNvbnN0IHN0dWR5VmFsPSh2LGMpPT5zdHVkeUxpbmtzW3YrJ18nK2NdfHwnJzsKICBjb25zdCBoYXNBbnlTdHVkeT1TVFVEWV9WRVJUUy5zb21lKHY9PnYuY2FyZHMuc29tZShjPT5zdHVkeVZhbCh2LnZlcnQsYy5zbHVnKSkpOwoKICBsZXQgc3R1ZHlIdG1sPSc8ZGl2IGNsYXNzPSJhZG1pbi1jYXJkIj48aDM+8J+TmiBVUkxzIGRvcyBtYXRlcmlhaXMgZ3JhdHVpdG9zPC9oMz4nKwogICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS1tdXQpO21hcmdpbjowIDAgMTRweCI+Q29uZmlndXJlIHVtYSBVUkwgcGFyYSBjYWRhIG1hdGVyaWFsLiBDYWRhIGxpbmsgYXBhcmVjZSBubyBjYXJkIGNvcnJlc3BvbmRlbnRlIGRhIDxjb2RlPi9taW5oYS1hcmVhLzwvY29kZT4gZG9zIGFsdW5vcyBxdWUgasOhIGJhdGVyYW0gcGVsbyBtZW5vcyA8Yj4xIHBhbHBpdGU8L2I+LiBDYW1wb3MgdmF6aW9zIGZhemVtIG8gY2FyZCBtb3N0cmFyICJFbSBicmV2ZSIuIDxiPkF0dWFsaXphIGVtIHRlbXBvIHJlYWwgdmlhIFJlYWx0aW1lPC9iPjogbsOjbyBwcmVjaXNhIHJlcHVibGljYXIgYSBww6FnaW5hLjwvcD4nOwogIFNUVURZX1ZFUlRTLmZvckVhY2godj0+ewogICAgc3R1ZHlIdG1sKz0nPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxOHB4Ij48ZGl2IGNsYXNzPSJzdi1iYWRnZSAnK3YuYmFkZ2UrJyIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTJweCI+Jyt2LmxhYmVsKyc8L2Rpdj4nOwogICAgdi5jYXJkcy5mb3JFYWNoKGM9PnsKICAgICAgY29uc3QgaWQ9J2NmZ19zdHVkeV8nK3YudmVydCsnXycrYy5zbHVnOwogICAgICBjb25zdCB2YWw9c3R1ZHlWYWwodi52ZXJ0LGMuc2x1Zyk7CiAgICAgIHN0dWR5SHRtbCs9JzxkaXYgY2xhc3M9ImZsZCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweCI+JysKICAgICAgICAnPGxhYmVsIGZvcj0iJytpZCsnIj4nK2MuaWMrJyAnK2MudGl0bGUrJyA8c3BhbiBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTEuNXB4Ij48Y29kZT5zdHVkeV9saW5rcy4nK3YudmVydCsnXycrYy5zbHVnKyc8L2NvZGU+PC9zcGFuPjwvbGFiZWw+JysKICAgICAgICAnPGlucHV0IGlkPSInK2lkKyciIGRhdGEtdmVydD0iJyt2LnZlcnQrJyIgZGF0YS1zbHVnPSInK2Muc2x1ZysnIiB0eXBlPSJ1cmwiIHBsYWNlaG9sZGVyPSJodHRwczovLy4uLiIgdmFsdWU9IicrZXNjKHZhbCkrJyIgc3R5bGU9IndpZHRoOjEwMCUiPicrCiAgICAgICc8L2Rpdj4nOwogICAgfSk7CiAgICBzdHVkeUh0bWwrPSc8L2Rpdj4nOwogIH0pOwogIHN0dWR5SHRtbCs9JzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTBweDttYXJnaW4tdG9wOjE0cHgiPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gcHJpbWFyeSIgaWQ9ImNmZ19zYXZlX3N0dWR5IiBzdHlsZT0icGFkZGluZzo5cHggMThweDtmb250LXNpemU6MTMuNXB4Ij5TYWx2YXIgVVJMczwvYnV0dG9uPicrCiAgICAgIChoYXNBbnlTdHVkeT8nPGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBpZD0iY2ZnX2NsZWFyX3N0dWR5IiBzdHlsZT0icGFkZGluZzo5cHggMTRweDtmb250LXNpemU6MTMuNXB4O2NvbG9yOnZhcigtLXJlZCk7Ym9yZGVyLWNvbG9yOiNmMmNmY2QiPkxpbXBhciB0dWRvICh2b2x0YSBhICJFbSBicmV2ZSIpPC9idXR0b24+JzonJykrCiAgICAnPC9kaXY+JysKICAnPC9kaXY+JzsKCiAgYm94LmlubmVySFRNTD1zdHVkeUh0bWwrCgogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxoMz7wn46BIE1ldGEgZGUgcG9udG9zIHBhcmEgbyBzb3J0ZWlvIGRlIGNhbWlzYXM8L2gzPicrCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0KTttYXJnaW46MCAwIDE0cHgiPlBvbnR1YcOnw6NvIG3DrW5pbWEgcGFyYSB1bSBhbHVubyBlbnRyYXIgbm8gc29ydGVpbyBkYXMgNSBjYW1pc2FzLiBBcGFyZWNlIGNvbW8gPGI+4q2QPC9iPiBubyByYW5raW5nIGUgbmEgaG9tZSBjb21vICJRdWVtIHBhc3NhIGRlIFggcG9udG9zIGNvbmNvcnJlIi48L3A+JysKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTJweDthbGlnbi1pdGVtczpmbGV4LWVuZDtmbGV4LXdyYXA6d3JhcCI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZmxkIiBzdHlsZT0ibWluLXdpZHRoOjE2MHB4Ij48bGFiZWwgZm9yPSJjZmdfcmFmZmxlX21pbiI+UG9udG9zIG3DrW5pbW9zPC9sYWJlbD48aW5wdXQgaWQ9ImNmZ19yYWZmbGVfbWluIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgdmFsdWU9IicrcmFmZmxlTWluKyciPjwvZGl2PicrCiAgICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBpZD0iY2ZnX3NhdmVfcmFmZmxlIiBzdHlsZT0icGFkZGluZzo5cHggMThweDtmb250LXNpemU6MTMuNXB4Ij5TYWx2YXIgbWV0YTwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxMS41cHg7Y29sb3I6dmFyKC0tbXV0LTIpO21hcmdpbi10b3A6MTJweCI+QXR1YWw6IDxiPicrcmFmZmxlTWluKyc8L2I+IHB0czwvcD4nKwogICAgJzwvZGl2PicrCgogICAgJzxkaXYgY2xhc3M9ImFkbWluLWNhcmQiPjxoMz7wn4+rIEPDoWxjdWxvIGRhcyBlc2NvbGFzPC9oMz4nKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLW11dCk7bWFyZ2luOjAgMCAxNHB4Ij5Db21vIGEgbcOpZGlhIGRlIGNhZGEgZXNjb2xhIMOpIGNhbGN1bGFkYSBlIHF1YWwgbyBwb29sIGRvIHNvcnRlaW8gY29sZXRpdm8gZGEgY2FtcGXDoy48L3A+JysKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTRweDtmbGV4LXdyYXA6d3JhcCI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZmxkIiBzdHlsZT0iZmxleDoxO21pbi13aWR0aDoyMjBweCI+JysKICAgICAgICAgICc8bGFiZWwgZm9yPSJjZmdfZXNjb2xhX3RvcG4iPlRvcCBOIGRhIG3DqWRpYSAoZXNjb2xhX3RvcG4pPC9sYWJlbD4nKwogICAgICAgICAgJzxpbnB1dCBpZD0iY2ZnX2VzY29sYV90b3BuIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgdmFsdWU9IicrZXNjb2xhVG9wbisnIj4nKwogICAgICAgICAgJzxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpO2ZvbnQtc2l6ZToxMS41cHg7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweCI+TcOpZGlhID0gbcOpZGlhIGRvcyA8Yj4nK2VzY29sYVRvcG4rJzwvYj4gbWVsaG9yZXMgZGUgY2FkYSBjb25jdXJzbzwvc21hbGw+JysKICAgICAgICAnPC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZmxkIiBzdHlsZT0iZmxleDoxO21pbi13aWR0aDoyMjBweCI+JysKICAgICAgICAgICc8bGFiZWwgZm9yPSJjZmdfZXNjb2xhX3ByZW1pb190b3BuIj5Qb29sIGRvIHNvcnRlaW8gY29sZXRpdm8gKGVzY29sYV9wcmVtaW9fdG9wbik8L2xhYmVsPicrCiAgICAgICAgICAnPGlucHV0IGlkPSJjZmdfZXNjb2xhX3ByZW1pb190b3BuIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgdmFsdWU9IicrZXNjb2xhUHJlbWlvVG9wbisnIj4nKwogICAgICAgICAgJzxzbWFsbCBzdHlsZT0iY29sb3I6dmFyKC0tbXV0LTIpO2ZvbnQtc2l6ZToxMS41cHg7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjRweCI+RXNjb2xhIGNhbXBlw6Mgc29ydGVpYSBlbnRyZSBzZXVzIDxiPicrZXNjb2xhUHJlbWlvVG9wbisnPC9iPiBtZWxob3Jlczwvc21hbGw+JysKICAgICAgICAnPC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gcHJpbWFyeSIgaWQ9ImNmZ19zYXZlX2VzY29sYSIgc3R5bGU9Im1hcmdpbi10b3A6MTRweDtwYWRkaW5nOjlweCAxOHB4O2ZvbnQtc2l6ZToxMy41cHgiPlNhbHZhciBwYXLDom1ldHJvczwvYnV0dG9uPicrCiAgICAnPC9kaXY+JysKCiAgICAnPGRpdiBjbGFzcz0iYWRtaW4tY2FyZCI+PGgzPvCfk5wgQXVkaXQgbG9nICjDumx0aW1hcyAyMCBhw6fDtWVzKTwvaDM+JysKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS1tdXQpO21hcmdpbjowIDAgMTJweCI+VHVkbyBxdWUgcGFzc2EgcG9yIDxjb2RlPmFkbWluX2FjdGlvbnM8L2NvZGU+IGFwYXJlY2UgYXF1aTogZWRpw6fDo28gZGUgY29uY3Vyc28sIHNvcnRlaW9zIGZ1dHVyb3MsIGV0Yy48L3A+JysKICAgICAgJzxkaXYgaWQ9ImNmZ19hdWRpdCI+PGRpdiBjbGFzcz0iZW1wdHkiPkNhcnJlZ2FuZG\/igKY8L2Rpdj48L2Rpdj4nKwogICAgJzwvZGl2Pic7CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfc2F2ZV9zdHVkeScpLm9uY2xpY2s9YXN5bmMoKT0+ewogICAgY29uc3QgaW5wdXRzPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbmZpZ0JveCBpbnB1dFtkYXRhLXZlcnRdW2RhdGEtc2x1Z10nKSk7CiAgICBjb25zdCB1cGRhdGVzPXt9OwogICAgZm9yKGNvbnN0IGlucCBvZiBpbnB1dHMpewogICAgICBjb25zdCB1cmw9aW5wLnZhbHVlLnRyaW0oKTsKICAgICAgaWYodXJsJiYhL15odHRwcz86XC9cLy9pLnRlc3QodXJsKSl7CiAgICAgICAgdG9hc3QoJ1VSTCBwcmVjaXNhIGNvbWXDp2FyIGNvbSBodHRwOi8vIG91IGh0dHBzOi8vJyk7CiAgICAgICAgaW5wLmZvY3VzKCk7cmV0dXJuOwogICAgICB9CiAgICAgIHVwZGF0ZXNbaW5wLmRhdGFzZXQudmVydCsnXycraW5wLmRhdGFzZXQuc2x1Z109dXJsfHxudWxsOwogICAgfQogICAgY29uc3QgbmV3VmFsPU9iamVjdC5hc3NpZ24oe30sc3R1ZHlMaW5rcyx1cGRhdGVzKTsKICAgIC8vIDAwMTUgSDI6IFJQQyBhZG1pbl9zZXRfY29uZmlnICh3aGl0ZWxpc3QgKyBhdWRpdCkKICAgIGNvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX3NldF9jb25maWcnLHtwX2tleTonc3R1ZHlfbGlua3MnLHBfdmFsdWU6bmV3VmFsfSk7CiAgICBpZihlcnJvcil7dG9hc3QoJ0Vycm86ICcrZXJyb3IubWVzc2FnZSk7cmV0dXJuO30KICAgIHN0dWR5TGlua3M9bmV3VmFsOwogICAgdG9hc3QoJ1VSTHMgc2FsdmFzIOKckyDCtyBmcm9udCBhbHVubyBhdHVhbGl6YSB2aWEgUmVhbHRpbWUnKTsKICAgIHJlbmRlckFkbWluQ29uZmlnKCk7CiAgfTsKCiAgY29uc3QgY2xlYXJCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmZ19jbGVhcl9zdHVkeScpOwogIGlmKGNsZWFyQnRuKWNsZWFyQnRuLm9uY2xpY2s9YXN5bmMoKT0+ewogICAgaWYoIWNvbmZpcm0oJ0xpbXBhciBhcyBVUkxzIGRvcyA0IG1hdGVyaWFpcz8gT3MgY2FyZHMgdm9sdGFtIGEgbW9zdHJhciAiRW0gYnJldmUiLicpKXJldHVybjsKICAgIGNvbnN0IHVwZGF0ZXM9e2VtX2JhbmNvX3F1ZXN0b2VzOm51bGwsZW1fc3ByaW50czpudWxsLGV2X2JhbmNvX3F1ZXN0b2VzOm51bGwsZXZfZ3VpYV9lbmVtOm51bGwsZW06bnVsbCxldjpudWxsLGFsbDpudWxsfTsKICAgIGNvbnN0IG5ld1ZhbD1PYmplY3QuYXNzaWduKHt9LHN0dWR5TGlua3MsdXBkYXRlcyk7CiAgICAvLyAwMDE1IEgyCiAgICBjb25zdCB7ZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdhZG1pbl9zZXRfY29uZmlnJyx7cF9rZXk6J3N0dWR5X2xpbmtzJyxwX3ZhbHVlOm5ld1ZhbH0pOwogICAgaWYoZXJyb3Ipe3RvYXN0KCdFcnJvOiAnK2Vycm9yLm1lc3NhZ2UpO3JldHVybjt9CiAgICB0b2FzdCgnVVJMcyByZW1vdmlkYXMuJyk7cmVuZGVyQWRtaW5Db25maWcoKTsKICB9OwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX3NhdmVfcmFmZmxlJykub25jbGljaz1hc3luYygpPT57CiAgICBjb25zdCBuPU1hdGgubWF4KDAscGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmZ19yYWZmbGVfbWluJykudmFsdWUpfHwwKTsKICAgIC8vIDAwMTUgSDIKICAgIGNvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX3NldF9jb25maWcnLHtwX2tleToncmFmZmxlX21pbicscF92YWx1ZTpufSk7CiAgICBpZihlcnJvcil7dG9hc3QoJ0Vycm86ICcrZXJyb3IubWVzc2FnZSk7cmV0dXJuO30KICAgIGNmZy5yYWZmbGVNaW49bjsKICAgIGNvbnN0IHRocj1uKycgcG9udG9zJztbJ3RocnR4dCcsJ3RocnR4dDInLCd0aHJ0eHQzJ10uZm9yRWFjaChpZD0+e2NvbnN0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKGUpZS50ZXh0Q29udGVudD10aHI7fSk7CiAgICB0b2FzdCgnTWV0YSBkZSAnK24rJyBwdHMgc2FsdmEg4pyTJyk7CiAgICByZW5kZXJBZG1pbkNvbmZpZygpOwogIH07CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfc2F2ZV9lc2NvbGEnKS5vbmNsaWNrPWFzeW5jKCk9PnsKICAgIGNvbnN0IHRvcG49TWF0aC5tYXgoMSxwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2VzY29sYV90b3BuJykudmFsdWUpfHwxMCk7CiAgICBjb25zdCBwcmVtaW9Ub3BuPU1hdGgubWF4KDEscGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmZ19lc2NvbGFfcHJlbWlvX3RvcG4nKS52YWx1ZSl8fDEwMCk7CiAgICAvLyAwMDE1IEgyOiAyIFJQQ3MgYXVkaXRhZGFzCiAgICBjb25zdCByMT1hd2FpdCBzdXBhLnJwYygnYWRtaW5fc2V0X2NvbmZpZycse3Bfa2V5Oidlc2NvbGFfdG9wbicscF92YWx1ZTp0b3BufSk7CiAgICBjb25zdCByMj1hd2FpdCBzdXBhLnJwYygnYWRtaW5fc2V0X2NvbmZpZycse3Bfa2V5Oidlc2NvbGFfcHJlbWlvX3RvcG4nLHBfdmFsdWU6cHJlbWlvVG9wbn0pOwogICAgaWYocjEuZXJyb3J8fHIyLmVycm9yKXt0b2FzdCgnRXJybyBhbyBzYWx2YXInKTtyZXR1cm47fQogICAgRVNDT0xBX1RPUE49dG9wbjtFU0NPTEFfUFJFTUlPX1RPUE49cHJlbWlvVG9wbjsKICAgIF9hZG1Fc2NvbGFzU3RhdGUubG9hZGVkQXQ9MDsKICAgIHRvYXN0KCdQYXLDom1ldHJvcyBkYXMgZXNjb2xhcyBzYWx2b3Mg4pyTJyk7CiAgICByZW5kZXJBZG1pbkNvbmZpZygpOwogIH07CgogIC8vIEF1ZGl0IGxvZwogIHRyeXsKICAgIGNvbnN0IHtkYXRhOmxvZ3N9PWF3YWl0IHN1cGEuZnJvbSgnYWRtaW5fYWN0aW9ucycpLnNlbGVjdCgnaWQsYWN0aW9uLHRhcmdldF9wbGF5ZXJfaWQsYmVmb3JlX3ZhbHVlLGFmdGVyX3ZhbHVlLHJlYXNvbixjcmVhdGVkX2F0LGFkbWluX2lkJykub3JkZXIoJ2NyZWF0ZWRfYXQnLHthc2NlbmRpbmc6ZmFsc2V9KS5saW1pdCgyMCk7CiAgICBjb25zdCBhdWRpdEJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2F1ZGl0Jyk7aWYoIWF1ZGl0Qm94KXJldHVybjsKICAgIGlmKCFsb2dzfHwhbG9ncy5sZW5ndGgpe2F1ZGl0Qm94LmlubmVySFRNTD0nPHAgc3R5bGU9ImNvbG9yOnZhcigtLW11dC0yKTtmb250LXNpemU6MTNweDttYXJnaW46MCI+TmVuaHVtYSBhw6fDo28gcmVnaXN0cmFkYSBhaW5kYS48L3A+JztyZXR1cm47fQogICAgY29uc3QgcGxheWVySWRzPUFycmF5LmZyb20obmV3IFNldChsb2dzLmZpbHRlcihsPT5sLnRhcmdldF9wbGF5ZXJfaWQpLm1hcChsPT5sLnRhcmdldF9wbGF5ZXJfaWQpKSk7CiAgICBsZXQgcG1hcD17fTsKICAgIGlmKHBsYXllcklkcy5sZW5ndGgpewogICAgICBjb25zdCB7ZGF0YTpwbGF5ZXJzfT1hd2FpdCBzdXBhLmZyb20oJ3BsYXllcnMnKS5zZWxlY3QoJ2lkLG5vbWUnKS5pbignaWQnLHBsYXllcklkcyk7CiAgICAgIChwbGF5ZXJzfHxbXSkuZm9yRWFjaChwPT57cG1hcFtwLmlkXT1wLm5vbWU7fSk7CiAgICB9CiAgICBjb25zdCB0cnM9bG9ncy5tYXAobD0+ewogICAgICBjb25zdCB0YXJnZXQ9bC50YXJnZXRfcGxheWVyX2lkPyhwbWFwW2wudGFyZ2V0X3BsYXllcl9pZF18fGwudGFyZ2V0X3BsYXllcl9pZC5zbGljZSgwLDgpKTon4oCUJzsKICAgICAgY29uc3QgYmVmb3JlPWwuYmVmb3JlX3ZhbHVlP0pTT04uc3RyaW5naWZ5KGwuYmVmb3JlX3ZhbHVlKTonJzsKICAgICAgY29uc3QgYWZ0ZXI9bC5hZnRlcl92YWx1ZT9KU09OLnN0cmluZ2lmeShsLmFmdGVyX3ZhbHVlKTonJzsKICAgICAgcmV0dXJuIGA8dHI+CiAgICAgICAgPHRkPiR7ZXNjKGZtdFRzKGwuY3JlYXRlZF9hdCkpfTwvdGQ+CiAgICAgICAgPHRkPjxiPiR7ZXNjKGwuYWN0aW9uKX08L2I+PC90ZD4KICAgICAgICA8dGQ+JHtlc2ModGFyZ2V0KX08L3RkPgogICAgICAgIDx0ZD48c21hbGwgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTFweCI+JHtlc2MoYmVmb3JlKX08L3NtYWxsPjwvdGQ+CiAgICAgICAgPHRkPjxzbWFsbCBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMXB4Ij4ke2VzYyhhZnRlcil9PC9zbWFsbD48L3RkPgogICAgICAgIDx0ZD4ke2VzYyhsLnJlYXNvbnx8JycpfTwvdGQ+CiAgICAgIDwvdHI+YDsKICAgIH0pLmpvaW4oJycpOwogICAgYXVkaXRCb3guaW5uZXJIVE1MPSc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iPjx0YWJsZSBjbGFzcz0iYWRtaW4tdGFibGUiPicrCiAgICAgICc8dGhlYWQ+PHRyPjx0aD5RdWFuZG88L3RoPjx0aD5Bw6fDo288L3RoPjx0aD5BbHZvPC90aD48dGg+QW50ZXM8L3RoPjx0aD5EZXBvaXM8L3RoPjx0aD5Nb3Rpdm88L3RoPjwvdHI+PC90aGVhZD4nKwogICAgICAnPHRib2R5PicrdHJzKyc8L3Rib2R5PicrCiAgICAnPC90YWJsZT48L2Rpdj4nOwogIH1jYXRjaChlKXtjb25zb2xlLmVycm9yKCdhdWRpdCcsZSk7fQp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgQURNSU4gKGdhdGVkIHBvciBhcHBfbWV0YWRhdGEuaXNfYWRtaW47IFJMUyBwcm90ZWdlIG8gcmVzdG8pCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpmdW5jdGlvbiBzY29yZUFsbChwcyl7cHMuZm9yRWFjaChwPT57bGV0IHB0cz0wLGV4PTAscm89MDtjZmcubWF0Y2hlcy5mb3JFYWNoKG09Pntjb25zdCBzYz1wb2ludHNGb3IocC5wcmVkaWN0aW9ucyYmcC5wcmVkaWN0aW9uc1ttLmlkXSxjZmcucmVzdWx0c1ttLmlkXSxtLmZyKTtpZihzYyl7cHRzKz1zYy5wdHM7aWYoc2MuZXhhY3QpZXgrKztpZihzYy5yZXNPaylybysrO319KTtwLl9wdHM9cHRzO3AuX2V4PWV4O3AuX3JvPXJvO30pOwogIHBzLnNvcnQoKGEsYik9PmIuX3B0cy1hLl9wdHN8fGIuX2V4LWEuX2V4fHxiLl9yby1hLl9yb3x8KG5ldyBEYXRlKGEuY3JlYXRlZEF0fHwwKSktKG5ldyBEYXRlKGIuY3JlYXRlZEF0fHwwKSkpO3JldHVybiBwczt9Ci8vIDIwMjYtMDYtMDg6IHBhZ2luYcOnw6NvIG1hbnVhbCBvYnJpZ2F0w7NyaWEuIFN1cGFiYXNlIFJFU1QgdGVtIGRlZmF1bHQgbGltaXQgMTAwMC4KLy8gU2VtIC5yYW5nZSgpLCBwZXJkZW1vcyBkYWRvcyBhIHBhcnRpciBkbyAxMDAxwrogY2FkYXN0cm86IGFkbWluIG1vc3RyYXZhIEVzUENFeD0xODEKLy8gZSBob21lIChtYXR2aWV3KSBtb3N0cmF2YSAzMzcuIEFmZXRhIHRhYmVsYSBkZSBlc2NvbGFzLCByYW5raW5nIGFkbWluLCBDU1YgZXhwb3J0Lgphc3luYyBmdW5jdGlvbiBfYWRtaW5QYWdpbmF0ZWRTZWxlY3QodGFibGUsIGNvbHVtbnMpewogIGNvbnN0IFBBR0UgPSAxMDAwOwogIGNvbnN0IGFsbCA9IFtdOwogIGxldCBmcm9tID0gMDsKICB3aGlsZSh0cnVlKXsKICAgIGNvbnN0IHtkYXRhLCBlcnJvcn0gPSBhd2FpdCBzdXBhLmZyb20odGFibGUpLnNlbGVjdChjb2x1bW5zKQogICAgICAub3JkZXIoJ2NyZWF0ZWRfYXQnLHthc2NlbmRpbmc6dHJ1ZX0pCiAgICAgIC5yYW5nZShmcm9tLCBmcm9tICsgUEFHRSAtIDEpOwogICAgaWYoZXJyb3IpeyBjb25zb2xlLmVycm9yKCdbYWRtaW5dIHBhZ2luYXRlZCBzZWxlY3QgZXJyb3InLCB0YWJsZSwgZnJvbSwgZXJyb3IpOyBicmVhazsgfQogICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSBicmVhazsKICAgIGFsbC5wdXNoKC4uLmRhdGEpOwogICAgaWYoZGF0YS5sZW5ndGggPCBQQUdFKSBicmVhazsKICAgIGZyb20gKz0gUEFHRTsKICB9CiAgcmV0dXJuIGFsbDsKfQphc3luYyBmdW5jdGlvbiBfYWRtaW5QYWdpbmF0ZWRTZWxlY3ROb09yZGVyKHRhYmxlLCBjb2x1bW5zKXsKICAvLyBwcmVkaWN0aW9ucyBuw6NvIHRlbSBjb2x1bmEgY3JlYXRlZF9hdCDigJQgcGFnaW5hciBwb3Igb3JkZXIoJ3VwZGF0ZWRfYXQnKQogIGNvbnN0IFBBR0UgPSAxMDAwOwogIGNvbnN0IGFsbCA9IFtdOwogIGxldCBmcm9tID0gMDsKICB3aGlsZSh0cnVlKXsKICAgIGNvbnN0IHtkYXRhLCBlcnJvcn0gPSBhd2FpdCBzdXBhLmZyb20odGFibGUpLnNlbGVjdChjb2x1bW5zKQogICAgICAub3JkZXIoJ3VwZGF0ZWRfYXQnLHthc2NlbmRpbmc6dHJ1ZX0pCiAgICAgIC5yYW5nZShmcm9tLCBmcm9tICsgUEFHRSAtIDEpOwogICAgaWYoZXJyb3IpeyBjb25zb2xlLmVycm9yKCdbYWRtaW5dIHBhZ2luYXRlZCBzZWxlY3QgZXJyb3InLCB0YWJsZSwgZnJvbSwgZXJyb3IpOyBicmVhazsgfQogICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSBicmVhazsKICAgIGFsbC5wdXNoKC4uLmRhdGEpOwogICAgaWYoZGF0YS5sZW5ndGggPCBQQUdFKSBicmVhazsKICAgIGZyb20gKz0gUEFHRTsKICB9CiAgcmV0dXJuIGFsbDsKfQphc3luYyBmdW5jdGlvbiBsb2FkQWxsUGxheWVyc0FkbWluKCl7CiAgY29uc3QgW3BsYXllcnMsIHByZWRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgIF9hZG1pblBhZ2luYXRlZFNlbGVjdCgncGxheWVycycsJ2lkLG5vbWUsY3BmLGVtYWlsLHRlbGVmb25lLGNvbmN1cnNvLHZlcnRpY2FsLHBlcmZpbCxtYXJrZXRpbmdfY29uc2VudCxyZWZfY29kZSxyZWZlcnJlZF9ieSxjcmVhdGVkX2F0JyksCiAgICBfYWRtaW5QYWdpbmF0ZWRTZWxlY3ROb09yZGVyKCdwcmVkaWN0aW9ucycsJ3BsYXllcl9pZCxtYXRjaF9pZCxob21lX2dvYWxzLGF3YXlfZ29hbHMsdXBkYXRlZF9hdCcpCiAgXSk7CiAgY29uc3QgYnlJZD17fTsocGxheWVyc3x8W10pLmZvckVhY2gocD0+e2J5SWRbcC5pZF09e2lkOnAuaWQsbm9tZTpwLm5vbWUsZW1haWw6cC5lbWFpbCxjcGY6cC5jcGYsdGVsOnAudGVsZWZvbmUsY29uYzpwLmNvbmN1cnNvLHZlcnRpY2FsOnAudmVydGljYWwscGVyZmlsOnAucGVyZmlsLG1hcmtldGluZzpwLm1hcmtldGluZ19jb25zZW50LHJlZkNvZGU6cC5yZWZfY29kZSxyZWZlcnJlZEJ5OnAucmVmZXJyZWRfYnksY3JlYXRlZEF0OnAuY3JlYXRlZF9hdCxlbWFpbFZlcmlmaWVkOnRydWUscHJlZGljdGlvbnM6e319O30pOwogIChwcmVkc3x8W10pLmZvckVhY2gocj0+e2NvbnN0IG89YnlJZFtyLnBsYXllcl9pZF07aWYobylvLnByZWRpY3Rpb25zW3IubWF0Y2hfaWRdPXtoOnIuaG9tZV9nb2FscyxhOnIuYXdheV9nb2Fscyx0czpyLnVwZGF0ZWRfYXR9O30pOwogIHJldHVybiBPYmplY3QudmFsdWVzKGJ5SWQpOwp9CmZ1bmN0aW9uIG9wZW5BZG1pbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbicpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4nKS5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCd9KTt9CmNvbnN0IG5hdlRvZ2dsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2VG9nZ2xlJyk7CmlmKG5hdlRvZ2dsZSl7Y29uc3QgbmF2RWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2Jyk7bmF2VG9nZ2xlLm9uY2xpY2s9KCk9Pntjb25zdCBvcGVuPW5hdkVsLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTtuYXZUb2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyxvcGVuPyd0cnVlJzonZmFsc2UnKTt9OwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNuYXZMaW5rcyBhJykuZm9yRWFjaChhPT5hLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e25hdkVsLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTtuYXZUb2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywnZmFsc2UnKTt9KSk7fQppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VhckJ0bicpKWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZWFyQnRuJykub25jbGljaz1lPT57ZS5wcmV2ZW50RGVmYXVsdCgpO29wZW5BZG1pbigpO307CmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9mTGluaycpKWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9mTGluaycpLm9uY2xpY2s9ZT0+e2UucHJldmVudERlZmF1bHQoKTtvcGVuQWRtaW4oKTt9OwoKaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkYnRuJykpCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGJ0bicpLm9uY2xpY2s9YXN5bmMoKT0+ewogIGNvbnN0IHVzZXI9YXdhaXQgY3VycmVudFVzZXIoKTsKICBpZighdXNlcil7dG9hc3QoJ0VudHJlIGNvbSBzdWEgY29udGEgZGUgYWRtaW5pc3RyYWRvciBuYSBzZcOnw6NvIFBhcnRpY2lwZS4nKTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFydGljaXBhcicpLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjonc21vb3RoJ30pO3JldHVybjt9CiAgaWYoIShhd2FpdCBpc0FkbWluVXNlcih1c2VyKSkpe3RvYXN0KCdFc3RhIGNvbnRhIG7Do28gdGVtIHBlcm1pc3PDo28gZGUgYWRtaW5pc3RyYWRvci4nKTtyZXR1cm47fQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGxvZ2luJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkcGFuZWwnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RocmlucHV0JykudmFsdWU9Y2ZnLnJhZmZsZU1pbjtyZW5kZXJBZG1pbk1hdGNoZXMoKTtyZW5kZXJHZXN0YW8oKTsKfTsKCmZ1bmN0aW9uIHJlbmRlckFkbWluTWF0Y2hlcygpe2NvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW5tYXRjaGVzJyk7Ym94LmlubmVySFRNTD0nJztjZmcubWF0Y2hlcy5mb3JFYWNoKG09Pntjb25zdCByZXM9Y2ZnLnJlc3VsdHNbbS5pZF18fHt9O2NvbnN0IGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2VsLmNsYXNzTmFtZT0nYWRyb3cnOwogIGVsLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ibm0iPiR7RlttLmhbMV1dfHwn4pq9J30gJHttLmhbMF19IMOXICR7bS5hWzBdfSAke0ZbbS5hWzFdXXx8J+KavSd9PHNtYWxsPiR7bS5zZWx9IOKAoiAke2ZtdERhdGUobS5rKX08L3NtYWxsPjwvZGl2PjxkaXYgY2xhc3M9InNjIj48aW5wdXQgY2xhc3M9Im1pbmkiIHR5cGU9Im51bWJlciIgbWluPSIwIiBhcmlhLWxhYmVsPSJHb2xzICR7ZXNjKG0uaFswXSl9IiBkYXRhLXI9IiR7bS5pZH0iIGRhdGEtcz0iaCIgdmFsdWU9IiR7cmVzLmghPW51bGw\/cmVzLmg6Jyd9Ij48c3BhbiBjbGFzcz0ieCI+w5c8L3NwYW4+PGlucHV0IGNsYXNzPSJtaW5pIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgYXJpYS1sYWJlbD0iR29scyAke2VzYyhtLmFbMF0pfSIgZGF0YS1yPSIke20uaWR9IiBkYXRhLXM9ImEiIHZhbHVlPSIke3Jlcy5hIT1udWxsP3Jlcy5hOicnfSI+PC9kaXY+PGJ1dHRvbiBjbGFzcz0iYnRuIGdob3N0IiBzdHlsZT0icGFkZGluZzo4cHggMTFweDtmb250LXNpemU6MTJweCIgYXJpYS1sYWJlbD0iJHtjZmcubG9ja2VkW20uaWRdPydEZXN0cmF2YXInOidUcmF2YXInfSBwYWxwaXRlcyBkZXN0ZSBqb2dvIiBkYXRhLWxvY2s9IiR7bS5pZH0iPiR7Y2ZnLmxvY2tlZFttLmlkXT8n8J+Ukic6J\/CflJMnfTwvYnV0dG9uPmA7Ym94LmFwcGVuZENoaWxkKGVsKTt9KTsKICBib3gucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbG9ja10nKS5mb3JFYWNoKGI9PmIub25jbGljaz1hc3luYygpPT57Y29uc3QgaWQ9Yi5kYXRhc2V0LmxvY2ssbnY9IWNmZy5sb2NrZWRbaWRdO2NvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX2xvY2tfbWF0Y2gnLHtwX2lkOmlkLHBfbG9ja2VkOm52fSk7aWYoZXJyb3Ipe3RvYXN0KCdFcnJvIGFvIHRyYXZhciAoc2Vzc8OjbyBhZG1pbj8pJyk7cmV0dXJuO31jZmcubG9ja2VkW2lkXT1udjtyZW5kZXJBZG1pbk1hdGNoZXMoKTtpZihtZURhdGEpcmVuZGVyTWF0Y2hlcygpO3JlbmRlckNvdW50ZG93bigpO30pO30KCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZHNhdmUnKSkKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fkc2F2ZScpLm9uY2xpY2s9YXN5bmMoKT0+e2NvbnN0IHVwZGF0ZXM9e307CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FkbWlubWF0Y2hlcyBpbnB1dFt0eXBlPW51bWJlcl0nKS5mb3JFYWNoKGlucD0+e2NvbnN0IGlkPWlucC5kYXRhc2V0LnIscz1pbnAuZGF0YXNldC5zLHY9aW5wLnZhbHVlO3VwZGF0ZXNbaWRdPXVwZGF0ZXNbaWRdfHx7fTt1cGRhdGVzW2lkXVtzXT12PT09Jyc\/bnVsbDpNYXRoLm1heCgwLHBhcnNlSW50KHYpfHwwKTt9KTsKICBsZXQgZmFpbGVkPWZhbHNlOwogIGZvcihjb25zdCBpZCBpbiB1cGRhdGVzKXtjb25zdCB7ZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdhZG1pbl9zZXRfbWF0Y2hfcmVzdWx0Jyx7cF9pZDppZCxwX2hvbWU6dXBkYXRlc1tpZF0uaCxwX2F3YXk6dXBkYXRlc1tpZF0uYX0pO2lmKGVycm9yKWZhaWxlZD10cnVlO30KICBhd2FpdCBsb2FkQ2ZnKCk7dG9hc3QoZmFpbGVkPydFcnJvIGFvIHNhbHZhciAoc2Vzc8OjbyBhZG1pbj8pJzonUmVzdWx0YWRvcyBzYWx2b3Mg4pyFJyk7CiAgcmVuZGVyUmFua2luZygpO3JlbmRlclNjaG9vbHMoKTtyZW5kZXJSZWZSYW5raW5nSG9tZSgpO3JlbmRlckdlc3RhbygpO2lmKG1lRGF0YSlyZW5kZXJNYXRjaGVzKCk7fTsKCmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZldGhyJykpCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZldGhyJykub25jbGljaz1hc3luYygpPT57Y29uc3Qgbj1NYXRoLm1heCgwLHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aHJpbnB1dCcpLnZhbHVlKXx8MCk7CiAgY29uc3Qge2Vycm9yfT1hd2FpdCBzdXBhLnJwYygnYWRtaW5fc2V0X2NvbmZpZycse3Bfa2V5OidyYWZmbGVfbWluJyxwX3ZhbHVlOm59KTsKICBpZihlcnJvcil7dG9hc3QoJ0Vycm8gYW8gc2FsdmFyIG1ldGEgKHNlc3PDo28gYWRtaW4\/KScpO3JldHVybjt9CiAgY2ZnLnJhZmZsZU1pbj1uO2NvbnN0IHRocj1uKycgcG9udG9zJztbJ3RocnR4dCcsJ3RocnR4dDInLCd0aHJ0eHQzJ10uZm9yRWFjaChpZD0+e2NvbnN0IGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKGUpZS50ZXh0Q29udGVudD10aHI7fSk7CiAgdG9hc3QoJ01ldGEgc2FsdmEnKTtyZW5kZXJSYW5raW5nKCk7fTsKCi8qIFAwLTE6IHNvcnRlaW9zIHNlcnZlci1zaWRlIHZpYSBSUEMgZG9fcmFmZmxlIChhbnRpLWN1bXVsYXRpdm8pLgogICBTdWJzdGl0dWkgbyBNYXRoLnJhbmRvbSgpIGNsaWVudC1zaWRlLiBTZXJ2ZXIgZXhjbHVpIHDDs2RpbyArCiAgIFRvcCAzIGluZGljYcOnw7VlcyArIGdhbmhhZG9yZXMgYW50ZXJpb3JlcyBlbSByYWZmbGVzLiAqLwppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2J0bicpKQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2J0bicpLm9uY2xpY2s9YXN5bmMoKT0+ewogIGlmKCFjb25maXJtKCdTb3J0ZWFyIDUgY2FtaXNhcyBhZ29yYT8gTyBzZXJ2aWRvciBkZWNpZGUgcXVlbSBnYW5oYSwgY29tIGEgcmVncmEgYW50aS1hY8O6bXVsbyBhcGxpY2FkYS4nKSlyZXR1cm47CiAgY29uc3QgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3YnRuJyk7YnRuLmRpc2FibGVkPXRydWU7CiAgY29uc3Qge2RhdGEsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdkb19yYWZmbGUnLHtwX2tpbmQ6J2NhbWlzYXMnfSk7CiAgYnRuLmRpc2FibGVkPWZhbHNlOwogIGlmKGVycm9yKXt0b2FzdCgnRXJybyBubyBzb3J0ZWlvOiAnKyhlcnJvci5tZXNzYWdlfHwnc2Vzc8OjbyBhZG1pbj8nKSk7cmV0dXJuO30KICBjb25zdCB3aW5zPShkYXRhJiZkYXRhLndpbm5lcnMpfHxbXTsKICBjb25zdCBvdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYXdyZXN1bHQnKTsKICBpZighd2lucy5sZW5ndGgpewogICAgb3V0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPk5pbmd1w6ltIGVsZWfDrXZlbCBhaW5kYS4gUHJlY2lzYSDiiaUnK2NmZy5yYWZmbGVNaW4rJyBwdHMgZSBuw6NvIGVzdGFyIG5vIHDDs2RpbywgVG9wIDMgaW5kaWNhw6fDtWVzIG91IHRlciBnYW5oYWRvIGVtIHNvcnRlaW8gYW50ZXJpb3IuPC9kaXY+JzsKICAgIHJldHVybjsKICB9CiAgb3V0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9ImJpZ2ljbyI+8J+OiTwvc3Bhbj48ZGl2PjxiPkdhbmhhZG9yZXMgKDUgY2FtaXNhcyksIGdyYXZhZG8gZW0gcmFmZmxlcyArIGFkbWluX2FjdGlvbnM6PC9iPjxicj4nK3dpbnMubWFwKHc9PmBAJHtlc2Mody51c2VybmFtZXx8Jz8nKX0gwrcgJHtlc2Mody5ub21lKX0gwrcgJHtlc2Mody5lbWFpbCl9ICgke3cucHRzfSBwdHMpYCkuam9pbignPGJyPicpKyc8YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi41cHg7Y29sb3I6dmFyKC0tbXV0KSI+RXhjbHXDrWRvczogcMOzZGlvICsgVG9wIDMgaW5kaWNhw6fDtWVzICsgJysoZGF0YS5leGNsdWRlZF9jb3VudHx8MCkrJyBnYW5oYWRvcmVzIGFudGVyaW9yZXMuPC9zcGFuPjwvZGl2PjwvZGl2Pic7Cn07CgppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nob29sZHJhd2J0bicpKQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nob29sZHJhd2J0bicpLm9uY2xpY2s9YXN5bmMoKT0+ewogIGlmKCFjb25maXJtKCdTb3J0ZWFyIHByw6ptaW9zIGRhIGVzY29sYSBjYW1wZcOjPyBPIHNlcnZpZG9yIGRlY2lkZS4nKSlyZXR1cm47CiAgY29uc3QgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hvb2xkcmF3YnRuJyk7YnRuLmRpc2FibGVkPXRydWU7CiAgY29uc3Qge2RhdGEsZXJyb3J9PWF3YWl0IHN1cGEucnBjKCdkb19yYWZmbGUnLHtwX2tpbmQ6J2VzY29sYSd9KTsKICBidG4uZGlzYWJsZWQ9ZmFsc2U7CiAgY29uc3QgYm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hvb2xkcmF3cmVzdWx0Jyk7CiAgaWYoZXJyb3IpewogICAgaWYoL2VzY29sYS4qcG9udHVhw6fDo28vaS50ZXN0KGVycm9yLm1lc3NhZ2V8fCcnKSl7Ym94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZW1wdHkiPkFpbmRhIG7Do28gaMOhIGVzY29sYSBjb20gcG9udHVhw6fDo28gc3VmaWNpZW50ZS48L2Rpdj4nO3JldHVybjt9CiAgICB0b2FzdCgnRXJybyBubyBzb3J0ZWlvOiAnKyhlcnJvci5tZXNzYWdlfHwnJykpO3JldHVybjsKICB9CiAgY29uc3Qgd2lucz0oZGF0YSYmZGF0YS53aW5uZXJzKXx8W107CiAgaWYoIXdpbnMubGVuZ3RoKXtib3guaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJlbXB0eSI+U2VtIGdhbmhhZG9yZXMgZWxlZ8OtdmVpcyBuYSBlc2NvbGEgbMOtZGVyICh0b2RvcyBwb2RlbSBqw6EgdGVyIGdhbmhvIGVtIG91dHJvIHNvcnRlaW8pLjwvZGl2Pic7cmV0dXJuO30KICBjb25zdCB0YWdWID0gZGF0YS52ZXJ0aWNhbD09PSd2ZXN0aWJ1bGFyZXMnPyfwn46TJzon8J+qlic7CiAgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9ImJpZ2ljbyI+8J+Pqzwvc3Bhbj48ZGl2PjxiPicrdGFnVisnIEVzY29sYSBjYW1wZcOjOiAnK2VzYyhkYXRhLnNjaG9vbCkrJzwvYj4gwrcgbcOpZGlhIFRvcCAnK0VTQ09MQV9UT1BOKyc6ICcrZGF0YS5zY2hvb2xfYXZnKyc8YnI+UG9vbDogJytkYXRhLnBvb2xfc2l6ZSsnIGVsZWfDrXZlaXMgKGV4Y2x1w61kb3M6ICcrKGRhdGEuZXhjbHVkZWRfY291bnR8fDApKycpOjxicj4nK3dpbnMubWFwKHc9PmAke2VzYyh3LnByaXplKX06IEAke2VzYyh3LnVzZXJuYW1lfHwnPycpfSDCtyAke2VzYyh3Lm5vbWUpfSDCtyAke2VzYyh3LmVtYWlsKX0gKCR7dy5wdHN9IHB0cylgKS5qb2luKCc8YnI+JykrJzwvZGl2PjwvZGl2Pic7Cn07CgpmdW5jdGlvbiByZW5kZXJHZXN0YW8oKXtsb2FkQWxsUGxheWVyc0FkbWluKCkudGhlbihwcz0+e3BzPXNjb3JlQWxsKHBzKTtjb25zdCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlc3RhbycpO2lmKCFwcy5sZW5ndGgpe2JveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImVtcHR5Ij5OZW5odW0gaW5zY3JpdG8gYWluZGEuPC9kaXY+JztyZXR1cm47fQogIGxldCB0PSc8dGFibGUgY2xhc3M9Imd0YmwiPjx0aGVhZD48dHI+PHRoPiM8L3RoPjx0aD5Ob21lPC90aD48dGg+Q1BGPC90aD48dGg+RW1haWw8L3RoPjx0aD5UZWxlZm9uZTwvdGg+PHRoPkNvbmN1cnNvPC90aD48dGg+SW5zY3Jpw6fDo288L3RoPjx0aD5Na3Q8L3RoPjx0aD5QdHM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JzsKICBwcy5mb3JFYWNoKChwLGkpPT57dCs9YDx0cj48dGQ+JHtpKzF9PC90ZD48dGQ+JHtlc2MocC5ub21lKX08L3RkPjx0ZD4ke2VzYyhwLmNwZnx8Jy0nKX08L3RkPjx0ZD4ke2VzYyhwLmVtYWlsKX08L3RkPjx0ZD4ke2VzYyhwLnRlbCl9PC90ZD48dGQ+JHtlc2MocC5jb25jKX08L3RkPjx0ZD4ke2ZtdFRzKHAuY3JlYXRlZEF0KX08L3RkPjx0ZD4ke3AubWFya2V0aW5nPydTaW0nOictJ308L3RkPjx0ZD4ke3AuX3B0c308L3RkPjwvdHI+YDt9KTtib3guaW5uZXJIVE1MPXQrJzwvdGJvZHk+PC90YWJsZT4nO30pO30KZnVuY3Rpb24gZGwobmFtZSxyb3dzKXtjb25zdCBjc3Y9cm93cy5tYXAocj0+ci5tYXAoYz0+e2NvbnN0IHM9Yz09bnVsbD8nJzpTdHJpbmcoYyk7cmV0dXJuIC9bIiw7XG5dLy50ZXN0KHMpPyciJytzLnJlcGxhY2UoLyIvZywnIiInKSsnIic6czt9KS5qb2luKCc7JykpLmpvaW4oJ1xyXG4nKTtjb25zdCBiPW5ldyBCbG9iKFsn77u\/Jytjc3ZdLHt0eXBlOid0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04Oyd9KTtjb25zdCB1PVVSTC5jcmVhdGVPYmplY3RVUkwoYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXU7YS5kb3dubG9hZD1uYW1lO2EuY2xpY2soKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKHUpLDE1MDApO30KaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cDEnKSkKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cDEnKS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCBwcz1zY29yZUFsbChhd2FpdCBsb2FkQWxsUGxheWVyc0FkbWluKCkpO2NvbnN0IHJvd3M9W1snTm9tZScsJ0NQRicsJ0VtYWlsJywnVGVsZWZvbmUnLCdDb25jdXJzbycsJ0luc2NyaWNhbycsJ0FjZWl0b3VNYXJrZXRpbmcnLCdQb250b3MnLCdQbGFjYXJlc0NyYXZhZG9zJ11dO3BzLmZvckVhY2gocD0+cm93cy5wdXNoKFtwLm5vbWUscC5jcGZ8fCcnLHAuZW1haWwscC50ZWwscC5jb25jLGZtdFRzKHAuY3JlYXRlZEF0KSxwLm1hcmtldGluZz8nU2ltJzonTmFvJyxwLl9wdHMscC5fZXhdKSk7ZGwoJ2JvbGFvX2luc2NyaXRvcy5jc3YnLHJvd3MpO3RvYXN0KCdBcnF1aXZvIGdlcmFkbycpO307CmlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAyJykpCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHAyJykub25jbGljaz1hc3luYygpPT57Y29uc3QgcHM9YXdhaXQgbG9hZEFsbFBsYXllcnNBZG1pbigpO2NvbnN0IHJvd3M9W1snTm9tZScsJ0VtYWlsJywnSm9nbycsJ1BhbHBpdGUnLCdIb3JhcmlvRG9QYWxwaXRlJ11dO3BzLmZvckVhY2gocD0+Y2ZnLm1hdGNoZXMuZm9yRWFjaChtPT57Y29uc3QgcHI9cC5wcmVkaWN0aW9ucyYmcC5wcmVkaWN0aW9uc1ttLmlkXTtpZihwciYmcHIuaCE9bnVsbClyb3dzLnB1c2goW3Aubm9tZSxwLmVtYWlsLGAke20uaFswXX0geCAke20uYVswXX1gLGAke3ByLmh9eCR7cHIuYX1gLGZtdFRzKHByLnRzKV0pO30pKTtkbCgnYm9sYW9fcGFscGl0ZXMuY3N2Jyxyb3dzKTt0b2FzdCgnQXJxdWl2byBnZXJhZG8nKTt9OwppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRyZXNldCcpKQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRyZXNldCcpLm9uY2xpY2s9YXN5bmMoKT0+e2lmKCFjb25maXJtKCdaZXJhciBUT0RPUyBvcyByZXN1bHRhZG9zIGUgdHJhdmFzIGRvcyBqb2dvcz8gT3MgaW5zY3JpdG9zIGUgcGFscGl0ZXMgTsODTyBzw6NvIGFwYWdhZG9zLicpKXJldHVybjsKICBjb25zdCBpZHM9Y2ZnLm1hdGNoZXMubWFwKG09Pm0uaWQpO2NvbnN0IHtlcnJvcn09YXdhaXQgc3VwYS5ycGMoJ2FkbWluX3Jlc2V0X21hdGNoZXMnLHtwX2lkczppZHN9KTsKICBpZihlcnJvcil7dG9hc3QoJ0Vycm8gYW8gemVyYXIgKHNlc3PDo28gYWRtaW4\/KScpO3JldHVybjt9CiAgYXdhaXQgbG9hZENmZygpO19jb25mRG9uZS5jbGVhcigpO3RvYXN0KCdSZXN1bHRhZG9zIGUgdHJhdmFzIHplcmFkb3MnKTtyZW5kZXJBZG1pbk1hdGNoZXMoKTtyZW5kZXJHZXN0YW8oKTtyZW5kZXJSYW5raW5nKCk7cmVuZGVyU2Nob29scygpO3JlbmRlclJlZlJhbmtpbmdIb21lKCk7aWYobWVEYXRhKXJlbmRlck1hdGNoZXMoKTtyZW5kZXJDb3VudGRvd24oKTt9OwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFJFQUxUSU1FICsgUE9MTElORyBsZXZlCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwphc3luYyBmdW5jdGlvbiB0aWNrKCl7aWYoIXN1cGEpcmV0dXJuOwogIGlmKF9pc0NhZGFzdHJvUGFnZSgpfHxfaXNBY2Vzc2FyUGFnZSgpKXJldHVybjsgIC8vIGZvcm11bGFyaW9zIG7Do28gcHJlY2lzYW0gZGUgdGljawogIGF3YWl0IGxvYWRDZmcoKTtyZW5kZXJDb3VudGRvd24oKTsKICBpZihfaXNIb21lUGFnZSgpKXtyZW5kZXJSYW5raW5nKCk7cmVuZGVyU2Nob29scygpO3JlbmRlclJlZlJhbmtpbmdIb21lKCk7fQogIGVsc2UgaWYobWVEYXRhKXsKICAgIGNvbnN0IGFlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICBjb25zdCBmb2N1c0luTWF0Y2hlcz1hZSYmYWUuY2xvc2VzdCYmYWUuY2xvc2VzdCgnI21hdGNoZXMnKTsKICAgIC8vIE7Do28gcmVjb25zdHLDs2kgb3MgY2FyZHMgc2UgbyBmb2NvIGVzdMOhIG5vcyBwbGFjYXJlcyBPVSBzZSBow6EgcGxhY2FyIGRpZ2l0YWRvCiAgICAvLyBlIGFpbmRhIG7Do28gc2Fsdm8uIFNlbSBpc3NvLCB1bSB0aWNrIChwb2xsIDYwcyAvIHJlYWx0aW1lIGRlIHByZWRpY3Rpb25zIGEKICAgIC8vIGNhZGEgNXMgZHVyYW50ZSBvcyBqb2dvcykgYXBhZ2F2YSBvIHF1ZSBvIGFsdW5vIGRpZ2l0b3UgZSBuw6NvIHNhbHZvdS4KICAgIGlmKCFmb2N1c0luTWF0Y2hlcyYmIV9oYXNVbnNhdmVkUHJlZElucHV0cygpKXJlbmRlck1hdGNoZXMoKTsKICAgIHJlbmRlckRhc2hib2FyZCgpO3JlbmRlckhpc3RvcnkoKTsKICB9Cn0KLy8gdHJ1ZSBzZSBhbGd1bSBpbnB1dCBkZSBwbGFjYXIgZW0gI21hdGNoZXMgdGVtIHZhbG9yIGRpZmVyZW50ZSBkbyBwYWxwaXRlIHNhbHZvCmZ1bmN0aW9uIF9oYXNVbnNhdmVkUHJlZElucHV0cygpewogIGNvbnN0IGlucHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI21hdGNoZXMgaW5wdXRbZGF0YS1tXScpOwogIGZvcihsZXQgaT0wO2k8aW5wcy5sZW5ndGg7aSsrKXsKICAgIGNvbnN0IGlucD1pbnBzW2ldLG1pZD1pbnAuZ2V0QXR0cmlidXRlKCdkYXRhLW0nKSxzaWRlPWlucC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcycpOwogICAgY29uc3QgcHJlZD1tZURhdGEmJm1lRGF0YS5wcmVkaWN0aW9ucz9tZURhdGEucHJlZGljdGlvbnNbbWlkXTpudWxsOwogICAgY29uc3Qgc2F2ZWQ9cHJlZD9TdHJpbmcoc2lkZT09PSdoJz9wcmVkLmg6cHJlZC5hKTonJzsKICAgIGlmKChpbnAudmFsdWV8fCcnKSE9PXNhdmVkKXJldHVybiB0cnVlOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KLyogUDEtMTogcmVhbHRpbWUgcmFua2luZyDigJQgZXNjdXRhIHByZWRpY3Rpb25zICsgcGxheWVycyBhbMOpbSBkZSBtYXRjaGVzL2NvbmZpZy4KICAgVGhyb3R0bGUgNXMgZXZpdGEgcmVyZW5kZXIgZW0gcmFqYWRhcyAoZXg6IDUwIGFsdW5vcyBwYWxwaXRhbSBhbyBtZXNtbyB0ZW1wbykuCiAgIFAzOiBwb2xsaW5nIGZhbGxiYWNrIDYwcyBjYXNvIG8gd2Vic29ja2V0IGNhaWEgc2lsZW5jaW9zYW1lbnRlLiAqLwpsZXQgX2xpdmVUaWNrUGVuZGluZz1mYWxzZTsKbGV0IF9sYXN0VGlja0F0PTA7CmZ1bmN0aW9uIF9zY2hlZHVsZUxpdmVUaWNrKCl7CiAgaWYoX2xpdmVUaWNrUGVuZGluZylyZXR1cm47CiAgX2xpdmVUaWNrUGVuZGluZz10cnVlOwogIHNldFRpbWVvdXQoKCk9PntfbGl2ZVRpY2tQZW5kaW5nPWZhbHNlO19sYXN0VGlja0F0PURhdGUubm93KCk7dGljaygpO30sNTAwMCk7Cn0KZnVuY3Rpb24gX21hcmtUaWNrZWQoKXtfbGFzdFRpY2tBdD1EYXRlLm5vdygpO30KZnVuY3Rpb24gc2V0dXBSZWFsdGltZSgpe2lmKCFzdXBhKXJldHVybjt0cnl7CiAgc3VwYS5jaGFubmVsKCdib2xhby1saXZlJykKICAgIC5vbigncG9zdGdyZXNfY2hhbmdlcycse2V2ZW50OicqJyxzY2hlbWE6J3B1YmxpYycsdGFibGU6J21hdGNoZXMnfSwoKT0+e19tYXJrVGlja2VkKCk7dGljaygpO30pCiAgICAub24oJ3Bvc3RncmVzX2NoYW5nZXMnLHtldmVudDonKicsc2NoZW1hOidwdWJsaWMnLHRhYmxlOidjb25maWcnfSwoKT0+e19tYXJrVGlja2VkKCk7dGljaygpO30pCiAgICAub24oJ3Bvc3RncmVzX2NoYW5nZXMnLHtldmVudDonKicsc2NoZW1hOidwdWJsaWMnLHRhYmxlOidwcmVkaWN0aW9ucyd9LCgpPT5fc2NoZWR1bGVMaXZlVGljaygpKQogICAgLm9uKCdwb3N0Z3Jlc19jaGFuZ2VzJyx7ZXZlbnQ6J0lOU0VSVCcsc2NoZW1hOidwdWJsaWMnLHRhYmxlOidwbGF5ZXJzJ30sKCk9Pl9zY2hlZHVsZUxpdmVUaWNrKCkpCiAgICAuc3Vic2NyaWJlKChzdGF0dXMpPT57X2RiZygnW3JlYWx0aW1lIHN0YXR1c10nLHN0YXR1cyk7fSk7CiAgLy8gUDM6IGZhbGxiYWNrIHBvbGxpbmcg4oCUIHPDsyBhdHVhbGl6YSBzZSBuw6NvIGhvdXZlIHRpY2sgZW0gNjBzCiAgc2V0SW50ZXJ2YWwoKCk9PnsKICAgIGlmKF9pc0hvbWVQYWdlKCkgJiYgRGF0ZS5ub3coKS1fbGFzdFRpY2tBdD42MDAwMCl7CiAgICAgIF9kYmd3KCdbcG9sbGluZyBmYWxsYmFja10gbGFzdCB0aWNrID4gNjBzLCByZWZldGNoaW5nJyk7CiAgICAgIHRpY2soKTsKICAgICAgX2xhc3RUaWNrQXQ9RGF0ZS5ub3coKTsKICAgIH0KICB9LDYwMDAwKTsKfWNhdGNoKGUpe19kYmd3KCdbcmVhbHRpbWUgc2V0dXAgZmFpbGVkXScsZSk7fX0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBJTklUCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwphc3luYyBmdW5jdGlvbiBpbml0KCl7CiAgLy8gU2FmZXR5IG5ldCBwcmEgcMOhZ2luYSAvYWRtaW4vOiBzZSBhbGdvIHRyYXZhciBvIGdhdGUgcG9yIDEwcywgbGliZXJhIG1lbnNhZ2VtCiAgLy8gZGUgZXJybyBhY2lvbsOhdmVsIGFvIGludsOpcyBkZSBkZWl4YXIgbyB1c3XDoXJpbyBudW0gb3ZlcmxheSBpbmZpbml0by4KICBpZihfaXNBZG1pblBhZ2UoKSl7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgIGlmKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ2dhdGVkJykpewogICAgICAgIHZhciBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW5HYXRlTXNnJyk7CiAgICAgICAgaWYoZWwgJiYgZWwuZGF0YXNldC5yZXNvbHZlZCE9PScxJyl7CiAgICAgICAgICB2YXIgYmFjaz13aW5kb3cuX19CT0xBT19BQ0VTU0FSX1VSTHx8JyMnOwogICAgICAgICAgZWwuaW5uZXJIVE1MPSdOw6NvIGNvbnNlZ3VpbW9zIHZhbGlkYXIgbyBhY2Vzc28uIDxhIGhyZWY9ImphdmFzY3JpcHQ6bG9jYXRpb24ucmVsb2FkKCkiIHN0eWxlPSJjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC13ZWlnaHQ6NzAwIj5SZWNhcnJlZ2FyPC9hPiBvdSA8YSBocmVmPSInK2JhY2srJyIgc3R5bGU9ImNvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXdlaWdodDo3MDAiPnZvbHRhciBhbyBBY2Vzc2FyPC9hPi4nOwogICAgICAgIH0KICAgICAgfQogICAgfSwxMDAwMCk7CiAgfQogIHRyeXsKICBpZihfaXNBZG1pblBhZ2UoKSlfYWRtaW5HYXRlU3RlcCgnQ29uZWN0YW5kbyBhbyBTdXBhYmFzZeKApicpOwogIGlmKCFzdXBhKXt0b2FzdCgnTsOjbyBmb2kgcG9zc8OtdmVsIGNvbmVjdGFyIGFvIHNlcnZpZG9yLiBWZXJpZmlxdWUgYSBjb25maWd1cmHDp8Ojby4nKTt9CiAgLy8gMjAyNi0wNi0wOCBmaXggZG9icmFzIHZhemlhczogcmV2ZWxhIG8gY29udGXDumRvIGVzdMOhdGljbyBBTlRFUyBkbyBhd2FpdCBsb2FkQ2ZnKCkuCiAgLy8gQW50ZXMsIHNlIG8gU3VwYWJhc2UgZXN0aXZlc3NlIGxlbnRvIChjb2xkIHN0YXJ0IG91IHBnX25ldCBjb25nZXN0aW9uYWRvKSwgdG9kYXMgYXMKICAvLyBzZcOnw7VlcyAucmV2ZWFsIGZpY2F2YW0gb3BhY2l0eTowIGF0w6kgbG9hZENmZyByZXNwb25kZXIuIEFnb3JhIGVsYXMgYXBhcmVjZW0gbmEgaG9yYTsKICAvLyBzw7Mgb3MgYmxvY29zIGRhdGEtZHJpdmVuIChyYW5raW5nLCBjb250YWRvciwgZXRjLikgbW9zdHJhbSAiQ2FycmVnYW5kb+KApiIgZW5xdWFudG8KICAvLyBvIGNmZyBuw6NvIGNoZWdhLiBGdW7Dp8O1ZXMgcXVlIGRlcGVuZGVtIGRlIGNmZy9tYXRjaGVzIGrDoSB0w6ptIGd1YXJkcyBpbnRlcm5vcy4KICBvYnNSZXZlYWwoKTsKICBpZihfaXNBZG1pblBhZ2UoKSlfYWRtaW5HYXRlU3RlcCgnQ2FycmVnYW5kbyBjb25maWd1cmHDp8OjbyBkbyBib2zDo2\/igKYnKTsKICBhd2FpdCBsb2FkQ2ZnKCk7CiAgaWYoX2lzSG9tZVBhZ2UoKSlyZW5kZXJOYXQoKTsKICB0cnl7cGVuZGluZ1JlZj1uZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCkuZ2V0KCdyZWYnKTt9Y2F0Y2goZSl7cGVuZGluZ1JlZj1udWxsO30KICBpZihwZW5kaW5nUmVmJiZfaXNIb21lUGFnZSgpKXtwZW5kaW5nUmVmPXBlbmRpbmdSZWYudG9VcHBlckNhc2UoKS5zbGljZSgwLDgpO3RvYXN0KCdWb2PDqiBjaGVnb3UgcG9yIHVtIGNvbnZpdGUhIEluc2NyZXZhLXNlIHBhcmEgdmFsaWRhciBhIGluZGljYcOnw6NvIPCfpoknKTt9CgogIGlmKHN1cGEpewogICAgaWYoX2lzQWRtaW5QYWdlKCkpX2FkbWluR2F0ZVN0ZXAoJ1ZlcmlmaWNhbmRvIHN1YSBzZXNzw6Nv4oCmJyk7CiAgICBjb25zdCB7ZGF0YTp7c2Vzc2lvbn19PWF3YWl0IHN1cGEuYXV0aC5nZXRTZXNzaW9uKCk7CiAgICBjb25zdCBsb2dnZWQ9ISEoc2Vzc2lvbiYmc2Vzc2lvbi51c2VyKTsKCiAgICBpZihfaXNBZG1pblBhZ2UoKSl7CiAgICAgIC8vIEFkbWluIGV4aWdlIHNlc3PDo28gRSBpc19hZG1pbiBubyBKV1QuIFNlbSBpc3NvLCByZWRpcmVjaW9uYSBwLyBBY2Vzc2FyLgogICAgICBpZighbG9nZ2VkKXtfYWRtaW5HYXRlRmFpbCgnVm9jw6ogbsOjbyBlc3TDoSBsb2dhZG8uIEZhw6dhIGxvZ2luIGNvbSBzZXUgQ1BGIG5hIHRlbGEgZGUgQWNlc3Nhci4nLHthdXRvUmVkaXJlY3Q6ZmFsc2V9KTtyZXR1cm47fQogICAgICBfYWRtaW5HYXRlU3RlcCgnU2Vzc8OjbyBlbmNvbnRyYWRhLiBWYWxpZGFuZG8gcGVybWlzc8OjbyBkZSBhZG1pbuKApicpOwogICAgICBhd2FpdCBsb2FkTWUoc2Vzc2lvbi51c2VyKTsKICAgICAgY29uc3QgaXNBZG09YXdhaXQgaXNBZG1pblVzZXIoc2Vzc2lvbi51c2VyKTsKICAgICAgX2RiZygnW2FkbWluXSBpc19hZG1pbj8nLGlzQWRtKTsgIC8vIFAyLTE6IHJlbW92ZWQgZW1haWwgKyBhcHBfbWV0YWRhdGEgbGVhawogICAgICBpZighaXNBZG0pewogICAgICAgIF9hZG1pbkdhdGVGYWlsKCdTdWEgY29udGEgbsOjbyBlc3TDoSBhdXRvcml6YWRhIGNvbW8gYWRtaW4uIEF2aXNlIG8gdGltZSBzZSBpc3NvIGZvciB1bSBlbmdhbm8uJyx7YXV0b1JlZGlyZWN0OmZhbHNlfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9hZG1pbkdhdGVTdGVwKCdBY2Vzc28gbGliZXJhZG8uIENhcnJlZ2FuZG8gcGFpbmVs4oCmJyk7CiAgICAgIGVudGVyQWRtaW4oKTsKICAgIH0gZWxzZSBpZihfaXNBbHVub1BhZ2UoKSl7CiAgICAgIC8vIMOBcmVhIGRvIGFsdW5vIGV4aWdlIHNlc3PDo28uIFNlbSBzZXNzw6NvLCBtYW5kYSBwcmEgL2FjZXNzYXIvLgogICAgICBpZighbG9nZ2VkKXtfZ290b0FjZXNzYXIoKTtyZXR1cm47fQogICAgICBhd2FpdCBsb2FkTWUoc2Vzc2lvbi51c2VyKTsKICAgICAgaWYoIW1lRGF0YSl7X2dvdG9BY2Vzc2FyKCk7cmV0dXJuO30KICAgICAgZW50ZXJBbHVubygpOwogICAgfSBlbHNlIGlmKF9pc0NhZGFzdHJvUGFnZSgpfHxfaXNBY2Vzc2FyUGFnZSgpKXsKICAgICAgLy8gUMOhZ2luYXMgZGUgZm9ybS4gU2UgasOhIGVzdMOhIGxvZ2FkbywgcmVkaXJlY2lvbmEgcHJhIMOhcmVhLgogICAgICBpZihsb2dnZWQpewogICAgICAgIGF3YWl0IGxvYWRNZShzZXNzaW9uLnVzZXIpOwogICAgICAgIGlmKG1lRGF0YSl7X2dvdG9BbHVubygpO3JldHVybjt9CiAgICAgIH0KICAgICAgLy8gU2Vuw6NvLCBkZWl4YSBvIGZvcm0gdmlzw612ZWwgKGrDoSDDqSBvIGRlZmF1bHQgbm8gSFRNTCkuCiAgICB9IGVsc2UgaWYoX2lzSG9tZVBhZ2UoKSYmbG9nZ2VkKXsKICAgICAgLy8gSG9tZTogbG9nYWRvIHZhaSBkaXJldG8gcHJhIMOhcmVhLCBFWENFVE8gc2UgY2hlZ291IHZpYSBoYXNoIGV4cGzDrWNpdG8uCiAgICAgIC8vIEhhc2hlcyBxdWUgcHVsYW0gbyByZWRpcmVjdDoKICAgICAgLy8gICAjaG9tZSAgICAgICAgICAgICAgIC0+IHNlbnRpbmVsYSB1c2FkYSBwZWxvcyBMT0dPUyBkYSBuYXYvZm9vdGVyIGRhcyBvdXRyYXMgcGFnZXMKICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIChBbHVuby9BZG1pbi9DYWRhc3Ryby9BY2Vzc2FyKS4gU2VtIGVsYSwgY2xpY2FyIG5vIGxvZ28KICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRlIHZvbHRhIMOgIGhvbWUgY3JpYSBsb29wOiBob21lIC0+IGF1dG8tcmVkaXJlY3QgLT4gbWluaGEtYXJlYS4KICAgICAgLy8gICAjcmFua2luZyAvICNyZWdyYXMgIC0+IGRlZXAgbGlua3MgZGUgc2XDp8OjbyBww7pibGljYSAoZm9vdGVyLCAiVmVyIHJhbmtpbmcgcMO6YmxpY28iKS4KICAgICAgLy8gICAjcHJlbWlvcyAgICAgICAgICAgIC0+IGlkZW0uCiAgICAgIC8vIE1hbnTDqW0gJyN0b3BvJyBjb21vIHJlZGlyZWN0IChjaGVnb3UgdmlhIHNjcm9sbC10by10b3AgZ2Vuw6lyaWNvLCBwcmVzdW1lICJxdWVyaWEgYSDDoXJlYSIpLgogICAgICBhd2FpdCBsb2FkTWUoc2Vzc2lvbi51c2VyKTsKICAgICAgaWYobWVEYXRhKXsKICAgICAgICBjb25zdCBoYXNoPWxvY2F0aW9uLmhhc2h8fCcnOwogICAgICAgIGNvbnN0IHdhbnRzU2VjdGlvbj1oYXNoJiZoYXNoIT09JyN0b3BvJzsKICAgICAgICBpZih3aW5kb3cuX19CT0xBT19BTFVOT19VUkwmJiF3YW50c1NlY3Rpb24pe19nb3RvQWx1bm8oKTtyZXR1cm47fQogICAgICAgIC8vIExvZ2FkbyB2ZW5kbyBzZcOnw6NvIHDDumJsaWNhOiBzZW0gbmFkYSBhIGZhemVyIChyZWdjYXJkL2FjZXNzY2FyZCBuw6NvIGV4aXN0ZW0gbWFpcyBuYSBob21lKS4KICAgICAgfQogICAgfQoKICAgIHN1cGEuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgoZXZlbnQpPT57CiAgICAgIGlmKGV2ZW50PT09J1NJR05FRF9PVVQnKXsKICAgICAgICBtZT1udWxsO21lRGF0YT1udWxsOwogICAgICAgIGlmKF9pc0FsdW5vUGFnZSgpKV9nb3RvSG9tZSgpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmKF9pc0hvbWVQYWdlKCkpe3JlbmRlclJhbmtpbmcoKTtyZW5kZXJTY2hvb2xzKCk7cmVuZGVyUmVmUmFua2luZ0hvbWUoKTt9CiAgfWNhdGNoKGUpewogICAgY29uc29sZS5lcnJvcignW2luaXRdJyxlKTsKICAgIGlmKF9pc0FkbWluUGFnZSgpKXsKICAgICAgdmFyIGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbkdhdGVNc2cnKTsKICAgICAgaWYoZWwpewogICAgICAgIGVsLmlubmVySFRNTD0nRXJybzogJytlc2MoZSYmZS5tZXNzYWdlfHxTdHJpbmcoZSkpKycuIDxhIGhyZWY9ImphdmFzY3JpcHQ6bG9jYXRpb24ucmVsb2FkKCkiIHN0eWxlPSJjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUiPlJlY2FycmVnYXI8L2E+JzsKICAgICAgfQogICAgfQogIH1maW5hbGx5ewogICAgLy8gR2FyYW50ZSBxdWUgY29udGFkb3IsIHJlYWx0aW1lIGUgcG9sbGluZyBzZW1wcmUgbGlndWVtLCBtZXNtbyBzZSBhbGdvIGFjaW1hCiAgICAvLyBsYW7Dp291LiBTZW0gaXNzbywgdW1hIGV4Y2XDp8OjbyBubyBtZWlvIGRvIGluaXQgZGVpeGF2YSBhIHDDoWdpbmEgZXN0w6F0aWNhIGF0w6kKICAgIC8vIHJlbG9hZCAocmVpbmNpZMOqbmNpYSBkbyBpbmNpZGVudGUgZGEgcMOhZ2luYSBlbSBicmFuY28gZGUgMjAyNi0wNi0wOCkuCiAgICB0cnl7cmVuZGVyQ291bnRkb3duKCk7fWNhdGNoKF8pe30KICAgIHRyeXtzZXR1cFJlYWx0aW1lKCk7fWNhdGNoKF8pe30KICAgIHRyeXtzZXRJbnRlcnZhbCh0aWNrLDYwMDAwKTt9Y2F0Y2goXyl7fQogICAgdHJ5e2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCgpPT57aWYoIWRvY3VtZW50LmhpZGRlbil0aWNrKCk7fSk7fWNhdGNoKF8pe30KICB9Cn0KaW5pdCgpOwo=';\n  function inject(){\n    var bin = atob(SRC);\n    var bytes = Uint8Array.from(bin, function(c){return c.charCodeAt(0);});\n    var code = new TextDecoder('utf-8').decode(bytes);\n    var s = document.createElement('script');\n    s.id = 'bolao-js'; s.text = code;\n    document.body.appendChild(s);\n  }\n  function tryInject(){\n    if(window.supabase){ inject(); }\n    else { setTimeout(tryInject, 40); }\n  }\n  if(document.readyState==='loading'){\n    document.addEventListener('DOMContentLoaded', tryInject);\n  } else { tryInject(); }\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":78,"featured_media":382669,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[],"tags":[],"class_list":["post-382675","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/pages\/382675","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/comments?post=382675"}],"version-history":[{"count":86,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/pages\/382675\/revisions"}],"predecessor-version":[{"id":383053,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/pages\/382675\/revisions\/383053"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/media\/382669"}],"wp:attachment":[{"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/media?parent=382675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/categories?post=382675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mkt.estrategia.com\/militares\/wp-json\/wp\/v2\/tags?post=382675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}