Files
dashcaddy/status/dist/core.js
T
Hermes 89968f5485
CI / Test & Lint (push) Canceled after 0s
CI / Security audit (push) Canceled after 0s
fix: stop aggressive API polling and SSE reconnect when auth lost
When unauthenticated (TOTP gate active), the dashboard was polling
/api/v1/services/status every few seconds and reconnecting SSE every
2-8s indefinitely. Now: 401/403 sets _dcAuthLost flag to skip the
polling interval, and SSE stops after 5 consecutive failures.
2026-08-13 14:40:56 -07:00

850 lines
716 KiB
JavaScript

(function(l){"use strict";class o{constructor(){this.errors=[],this.maxErrors=50}logError(b,f,v={}){const g={timestamp:new Date().toISOString(),context:b,message:f instanceof Error?f.message:f,stack:f instanceof Error?f.stack:null,metadata:v};this.errors.push(g),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${b}:`,f,v)}recoverFromError(b,f){switch(this.classifyError(b)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",b,{currentStep:f}),{action:"SKIP_STEP",nextStep:f+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",b),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",b),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",b,{currentStep:f}),{action:"SKIP_STEP",nextStep:f+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",b),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",b,{currentStep:f}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(b){const f=b.message||b.toString();return f.includes("element")&&f.includes("not found")?"ELEMENT_NOT_FOUND":f.includes("storage")||f.includes("quota")?"STORAGE_UNAVAILABLE":f.includes("driver")||f.includes("undefined")?"DRIVER_NOT_LOADED":f.includes("invalid")||f.includes("validation")?"INVALID_TOOLTIP":f.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const b={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(f=>{b.byContext[f.context]=(b.byContext[f.context]||0)+1;const v=this.classifyError({message:f.message});b.byType[v]=(b.byType[v]||0)+1}),b}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const b=document.createElement("div");return b.id="onboarding-fallback",b.style.cssText=`
position: fixed;
bottom: 20px;
right: 20px;
background: var(--card-base, #2a2a2a);
color: var(--fg, #ffffff);
padding: 15px 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
z-index: 9999;
max-width: 300px;
font-size: 14px;
`,b.innerHTML=`
<strong>Welcome to DashCaddy!</strong><br>
<p style="margin: 10px 0 0 0; font-size: 12px;">
The interactive tour is unavailable, but you can explore the dashboard freely.
Check the documentation for help getting started.
</p>
`,document.body.appendChild(b),setTimeout(()=>{b.parentNode&&b.parentNode.removeChild(b)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const b={data:{},getItem(f){return this.data[f]||null},setItem(f,v){this.data[f]=v},removeItem(f){delete this.data[f]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),b}sendToErrorTracking(b){}}l.ErrorHandler=o,console.log("[ErrorHandler] Module loaded")})(window),(function(){try{var o=typeof localStorage<"u"&&localStorage.getItem("dashcaddy-health-settings")||null;if(o){var m=JSON.parse(o);m.statsPollingInterval&&m.statsPollingInterval>=5&&m.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=m.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,HEALTH:1e3,DEPLOY_SSL:5e3},DELAYS:{BTN_RESET:2e3,RELOAD:5e3,MODAL_CLOSE:500,PORT_CHECK:500,DEPLOY_INIT:3e3},DEFAULTS:{DNS_PORT:"5380",SERVICE_PORT:"8080",TTL:300,CADDYFILE:"C:\\caddy\\Caddyfile"}},errorHandler=new ErrorHandler,_cachedCfg=JSON.parse(localStorage.getItem("dashcaddy_site_config")||"null"),SITE={tld:_cachedCfg&&_cachedCfg.tld||".home",dnsIp:"",dnsPort:DC.DEFAULTS.DNS_PORT,dnsServers:{},configurationType:_cachedCfg&&_cachedCfg.configurationType||"homelab",domain:_cachedCfg&&_cachedCfg.domain||"",defaults:_cachedCfg&&_cachedCfg.defaults||{},routingMode:_cachedCfg&&_cachedCfg.routingMode||"subdomain",onboardingCompleted:!1};window.__dashcaddySiteConfigLoaded=(async function(){try{const b=await fetch("/api/v1/config");if(b.ok){const f=await b.json();if(f.tld&&(SITE.tld=f.tld.startsWith(".")?f.tld:"."+f.tld),f.dns&&(SITE.dnsIp=f.dns.ip||"",SITE.dnsPort=f.dns.port||DC.DEFAULTS.DNS_PORT),f.dnsServers&&typeof f.dnsServers=="object")for(const[g,r]of Object.entries(f.dnsServers))g!=="__proto__"&&g!=="constructor"&&g!=="prototype"&&(SITE.dnsServers[g]=r);f.configurationType&&(SITE.configurationType=f.configurationType),f.domain&&(SITE.domain=f.domain),f.defaults&&(SITE.defaults=f.defaults),f.routingMode&&(SITE.routingMode=f.routingMode),SITE.onboardingCompleted=f.onboardingCompleted===!0,localStorage.setItem("dashcaddy_site_config",JSON.stringify({tld:SITE.tld,configurationType:SITE.configurationType,domain:SITE.domain,routingMode:SITE.routingMode})),renderDnsCards();const v=document.getElementById("manage-tokens");v&&(v.style.display=Object.keys(SITE.dnsServers).length?"":"none")}}catch{}document.querySelectorAll("[data-tld]").forEach(b=>b.textContent=SITE.tld);const o=document.getElementById("edit-tld-suffix");o&&(o.textContent=SITE.tld);const m=document.getElementById("external-proxy-ip");m&&SITE.dnsIp&&(m.value=SITE.dnsIp,m.placeholder=SITE.dnsIp)})();function buildDomain(l){return l+SITE.tld}function buildServiceUrl(l){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+l:SITE.configurationType==="public"&&SITE.domain?"https://"+l+"."+SITE.domain:"https://"+buildDomain(l)}function getDnsServerAddr(l){const o=SITE.dnsServers[l];return o?`${o.ip}:${o.port}`:buildDomain(l)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[l,o]of Object.entries(SITE.dnsServers))if(o.ip===SITE.dnsIp)return l;return null}function renderDnsCards(){const l=document.querySelector(".top");if(!l)return;const o=Object.keys(SITE.dnsServers);if(!o.length)return;const m='<svg viewBox="0 0 24 24" class="service-icon"><rect x="3" y="4" width="18" height="16" rx="2" fill="#34495e"/><rect x="5" y="6" width="14" height="2" rx="1" fill="#3498db"/><rect x="5" y="9" width="10" height="1" fill="#ecf0f1"/><rect x="5" y="11" width="12" height="1" fill="#ecf0f1"/><rect x="5" y="13" width="8" height="1" fill="#ecf0f1"/><rect x="5" y="15" width="14" height="1" fill="#ecf0f1"/><circle cx="17" cy="11" r="2" fill="#e74c3c"/><path d="M17 9v4M15 11h4" stroke="white" stroke-width="1"/></svg>',b=l.firstElementChild;o.forEach(f=>{const v=escapeHtml(f),g=escapeHtml((SITE.dnsServers[f].name||f).toUpperCase()),r=document.createElement("div");r.className="card",r.setAttribute("data-app",f),r.setAttribute("data-status","off"),r.innerHTML=`<span id="${v}-dot" class="dot bad at-bl"></span><div class="row"><div class="logo-wrap">${m}</div><span class="name">${g}</span><span class="spacer"></span><span id="${v}-pill" class="badge off">OFF</span></div><div class="response-row"><span id="${v}-time" class="response-time">--</span></div><div class="health-row" id="health-${v}"><span id="uptime-${v}" class="uptime-chip">--</span><div class="uptime-mini-bar"><div class="fill" id="uptime-bar-${v}" style="width: 0%"></div></div></div><div class="btn-row"><button id="${v}-restart" class="restart-btn">Restart</button><button id="${v}-update" class="update-btn" title="Update DNS server">\u2B06\uFE0F</button><button id="${v}-open">Open</button><button id="${v}-logs" class="logs-btn">Logs</button><button id="${v}-settings" class="settings-btn">\u2699\uFE0F</button></div>`,l.insertBefore(r,b)})}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const l=await fetch("/api/v1/csrf-token");if(!l.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await l.json()).token,csrfToken}catch(l){throw errorHandler.logError("[CSRF] Get Token",l,{function:"getCSRFToken"}),l}}async function secureFetch(l,o={}){const m=(o.method||"GET").toUpperCase(),b=!["GET","HEAD","OPTIONS"].includes(m);if(b)try{const v=await getCSRFToken();o.headers={...o.headers,"X-CSRF-Token":v}}catch(v){errorHandler.logError("[CSRF] Add to Request",v,{function:"secureFetch"})}o.signal||(o={...o,signal:AbortSignal.timeout(15e3)}),o.credentials=o.credentials||"same-origin";const f=await fetch(l,o);if(b&&f.status===403)try{const v=await f.clone().json();if(v.error&&(v.error.includes("DC-100")||v.error.includes("DC-101"))){csrfToken=null;const g=await getCSRFToken();return o.headers={...o.headers,"X-CSRF-Token":g},o.signal=AbortSignal.timeout(15e3),fetch(l,o)}}catch{}return f}async function postJSON(l,o){const m=await secureFetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),b=await m.json();if(!m.ok||b.success===!1)throw new Error(b.error||`Request failed (${m.status})`);return b}async function getJSON(l){const o=await secureFetch(l);if(!o.ok){let m=`Request failed (${o.status})`;try{m=(await o.json()).error||m}catch{}throw new Error(m)}return o.json()}async function deleteAPI(l){const o=await secureFetch(l,{method:"DELETE"}),m=await o.json();if(!o.ok||m.success===!1)throw new Error(m.error||`Delete failed (${o.status})`);return m}async function withButton(l,o,m,b={}){const f=l.innerHTML,{successText:v="\u2705",resetDelay:g=DC.DELAYS.BTN_RESET}=b;l.disabled=!0,l.innerHTML=o;try{const r=await m();return l.innerHTML=v,setTimeout(()=>{l.innerHTML=f,l.disabled=!1},g),r}catch(r){throw l.innerHTML=f,l.disabled=!1,r}}function openModal(l){document.getElementById(l)?.classList.add("show")}function closeModal(l){document.getElementById(l)?.classList.remove("show")}function wireModal(l,...o){l&&(l.addEventListener("click",m=>{m.target===l&&l.classList.remove("show")}),o.forEach(m=>{m&&typeof m.addEventListener=="function"&&m.addEventListener("click",()=>l.classList.remove("show"))}))}function showNotification(l,o="info",m=3e3){const b=document.querySelector(".deploy-notification");b&&b.remove();const f={info:{bg:"#2196F3",fg:"#fff"},success:{bg:"var(--ok-bg)",fg:"var(--ok-fg)"},error:{bg:"#f44336",fg:"#fff"},warning:{bg:"#ff9800",fg:"#fff"}},v=f[o]||f.info,g=document.createElement("div");g.className="deploy-notification",g.textContent=l,g.style.cssText=`
position: fixed; top: 20px; right: 20px;
background: ${v.bg}; color: ${v.fg};
padding: 16px 24px; border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,.3);
z-index: 10000; animation: slideIn 0.3s ease-out;
max-width: 400px; white-space: pre-line; font-size: 14px;
`,document.body.appendChild(g),m>0&&setTimeout(()=>g.remove(),m)}function timeAgo(l){const o=Date.now()-new Date(l).getTime();return o<6e4?"just now":o<36e5?Math.floor(o/6e4)+"m ago":o<864e5?Math.floor(o/36e5)+"h ago":Math.floor(o/864e5)+"d ago"}function safeGet(l,o=null){try{const m=localStorage.getItem(l);return m!==null?m:o}catch{return o}}function safeSet(l,o){try{localStorage.setItem(l,o)}catch{}}function safeRemove(l){try{localStorage.removeItem(l)}catch{}}function safeSessionGet(l,o=null){try{const m=sessionStorage.getItem(l);return m!==null?m:o}catch{return o}}function safeSessionSet(l,o){try{sessionStorage.setItem(l,o)}catch{}}function safeGetJSON(l,o=null){try{const m=localStorage.getItem(l);return m?JSON.parse(m):o}catch{return o}}function escapeHtml(l){return String(l??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function injectModal(l,o){document.getElementById(l)||document.body.insertAdjacentHTML("beforeend",o)}const DC_BUS={_handlers:{},on(l,o){var m;((m=this._handlers)[l]||(m[l]=[])).push(o)},off(l,o){this._handlers[l]=this._handlers[l]?.filter(m=>m!==o)},emit(l,o){this._handlers[l]?.forEach(m=>m(o))}},AppState={_apps:[],getApps(){return this._apps},setApps(l){this._apps=l,window.APPS=l,DC_BUS.emit("apps:changed",l)},findApp(l){return this._apps.find(o=>o.id===l)},addApp(l){this._apps.push(l),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(l){const o=this._apps.findIndex(m=>m.id===l);return o>-1&&(this._apps.splice(o,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),o>-1},updateApp(l,o){const m=this._apps.find(b=>b.id===l);if(m){for(const[b,f]of Object.entries(o))b!=="__proto__"&&b!=="constructor"&&b!=="prototype"&&(m[b]=f);DC_BUS.emit("apps:changed",this._apps)}return m}};(function(){function l(){const b=document.createElement("div");return b.className="skeleton-card",b.innerHTML='<div style="display:flex;align-items:center;gap:12px;margin-bottom:12px"><div class="skeleton-bar" style="width:48px;height:48px;border-radius:8px;flex-shrink:0"></div><div style="flex:1"><div class="skeleton-bar" style="width:60%;height:14px;margin-bottom:6px"></div><div class="skeleton-bar" style="width:35%;height:10px"></div></div><div class="skeleton-bar" style="width:42px;height:22px;border-radius:11px"></div></div><div class="skeleton-bar" style="width:45%;height:12px;margin-bottom:10px"></div><div style="display:flex;gap:8px;margin-top:auto"><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div></div>',b}function o(b){const f=document.getElementById("cards");if(!(!f||f.querySelector(".card"))){b=b||6;for(let v=0;v<b;v++){const g=l();f.appendChild(g),setTimeout(function(){g.classList.add("loaded")},v*60)}}}function m(){const b=document.getElementById("cards");if(b){var f=b.querySelectorAll(".skeleton-card");f.length&&(f.forEach(function(v,g){setTimeout(function(){v.style.opacity="0",v.style.transform="translateY(-10px)"},g*25)}),setTimeout(function(){f.forEach(function(v){v.parentNode&&v.remove()})},f.length*25+300))}}window.SkeletonLoader={show:o,hide:m}})(),(function(){var l="theme",o="user-themes",m="custom-theme",b=["dark","light","blue","black","nord","dracula","solarized-dark","solarized-light","taxi","ocean"],f=b.slice(),v=["bg","fg","muted","fg-muted","card-base","card-bg","border","hover","card-hover","base","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","success","error","warning","accent","accent-strong"],g=["bg","fg","muted","card-base","card-bg","border","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","accent","accent-strong"],r=["fg-muted","hover","card-hover","base","success","error","warning"],h={dark:{bg:"#0b0f1a",fg:"#e8ecf5",muted:"#9aa6bf","fg-muted":"#6b7a94","card-base":"#121826","card-bg":"#121826",border:"#263552",hover:"#1a2235","card-hover":"#161e2e",base:"#151c2b","ok-bg":"#0c2430","ok-fg":"#7ef2ff","bad-bg":"#2a121a","bad-fg":"#ff9aa3","dot-ok":"#35d1ff","dot-bad":"#ff5f7a",uptime:"#35d1ff",success:"#4caf50",error:"#e74c3c",warning:"#f39c12",accent:"#8FD6FF","accent-strong":"#1F7BFF"},light:{bg:"#f6f7fb",fg:"#0f1115",muted:"#5f6b7a","fg-muted":"#8993a4","card-base":"#ffffff","card-bg":"#ffffff",border:"#e2e7ef",hover:"#eef1f6","card-hover":"#f5f6fa",base:"#ebeef3","ok-bg":"#eafff1","ok-fg":"#0a7c3a","bad-bg":"#ffefef","bad-fg":"#b00020","dot-ok":"#0fb15a","dot-bad":"#d93b3b",uptime:"#0fb15a",success:"#0a7c3a",error:"#b00020",warning:"#d68a00",accent:"#4a90d9","accent-strong":"#2563eb",lightBg:!0},blue:{bg:"#1908AC",fg:"#e8f1ff",muted:"#d6e2ff","fg-muted":"#9eafdb","card-base":"#0d1533","card-bg":"#0d1533",border:"#1c2d6a",hover:"#141f4a","card-hover":"#111a3e",base:"#0f1840","ok-bg":"#162040","ok-fg":"#edffff","bad-bg":"#0a0e24","bad-fg":"#ffb3c0","dot-ok":"#c7e5ff","dot-bad":"#ffd6dc",uptime:"#7ec8ff",success:"#7ec8ff",error:"#ffb3c0",warning:"#ffd080",accent:"#9cd4ff","accent-strong":"#6fb2ff"},black:{bg:"#0e0e0e",fg:"#f5f5f5",muted:"#999999","fg-muted":"#666666","card-base":"#1a1a1a","card-bg":"#1a1a1a",border:"#2e2e2e",hover:"#242424","card-hover":"#202020",base:"#161616","ok-bg":"#0f2a12","ok-fg":"#66ff7a","bad-bg":"#2a0f0f","bad-fg":"#ff6b6b","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#e0e0e0",success:"#4caf50",error:"#ff4444",warning:"#ff9800",accent:"#E63946","accent-strong":"#C62828"},nord:{bg:"#2e3440",fg:"#eceff4",muted:"#81a1c1","fg-muted":"#6882a0","card-base":"#3b4252","card-bg":"#3b4252",border:"#4c566a",hover:"#434c5e","card-hover":"#3f4858",base:"#353c4a","ok-bg":"#2d4f3e","ok-fg":"#a3be8c","bad-bg":"#4a2c2a","bad-fg":"#bf616a","dot-ok":"#a3be8c","dot-bad":"#bf616a",uptime:"#a3be8c",success:"#a3be8c",error:"#bf616a",warning:"#ebcb8b",accent:"#88c0d0","accent-strong":"#5e81ac"},dracula:{bg:"#282a36",fg:"#f8f8f2",muted:"#6272a4","fg-muted":"#515d85","card-base":"#44475a","card-bg":"#44475a",border:"#6272a4",hover:"#4e5170","card-hover":"#494c63",base:"#363848","ok-bg":"#1e3a2e","ok-fg":"#50fa7b","bad-bg":"#3d1a1a","bad-fg":"#ff5555","dot-ok":"#50fa7b","dot-bad":"#ff5555",uptime:"#50fa7b",success:"#50fa7b",error:"#ff5555",warning:"#f1fa8c",accent:"#bd93f9","accent-strong":"#8be9fd"},"solarized-dark":{bg:"#002b36",fg:"#839496",muted:"#586e75","fg-muted":"#4a5f65","card-base":"#073642","card-bg":"#073642",border:"#586e75",hover:"#0d4050","card-hover":"#0a3a48",base:"#053340","ok-bg":"#0d3d2c","ok-fg":"#859900","bad-bg":"#3d1a1a","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#b5bd68",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198"},"solarized-light":{bg:"#fdf6e3",fg:"#657b83",muted:"#93a1a1","fg-muted":"#adb8b8","card-base":"#eee8d5","card-bg":"#eee8d5",border:"#93a1a1",hover:"#e6dfcb","card-hover":"#eae3cf",base:"#e8e1cd","ok-bg":"#e8f5e8","ok-fg":"#859900","bad-bg":"#fdf2f2","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#859900",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198",lightBg:!0},taxi:{bg:"#f3d321",fg:"#0e0e00",muted:"#4a4a10","fg-muted":"#6b6b30","card-base":"#ffd700","card-bg":"#ffd700",border:"#b8a840",hover:"#ffe84d","card-hover":"#ffe033",base:"#f0d000","ok-bg":"#d4ffd9","ok-fg":"#0f2a0f","bad-bg":"#ffd4d4","bad-fg":"#2a0f0f","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#0e0e00",success:"#2e7d32",error:"#c62828",warning:"#e65100",accent:"#7a4a00","accent-strong":"#5c3800",lightBg:!0},ocean:{bg:"#2060b0",fg:"#faf5eb",muted:"#dcd2c0","fg-muted":"#b0a890","card-base":"#7a94ed","card-bg":"#7a94ed",border:"#deb67a",hover:"#8aa0f0","card-hover":"#8298e8",base:"#6888e0","ok-bg":"#4f5bb0","ok-fg":"#c7d7eb","bad-bg":"#f41a3a","bad-fg":"#6a1818","dot-ok":"#30a050","dot-bad":"#d04040",uptime:"#2d32f2",success:"#30a050",error:"#d04040",warning:"#e6a030",accent:"#1860a0","accent-strong":"#104080"}};function d(C){return!C||typeof C!="string"?{r:0,g:0,b:0}:(C=C.replace("#",""),C.length===3&&(C=C[0]+C[0]+C[1]+C[1]+C[2]+C[2]),{r:parseInt(C.substr(0,2),16)||0,g:parseInt(C.substr(2,2),16)||0,b:parseInt(C.substr(4,2),16)||0})}function a(C,B,$){return"#"+[C,B,$].map(function(k){var x=Math.max(0,Math.min(255,Math.round(k))).toString(16);return x.length===1?"0"+x:x}).join("")}function p(C,B,$){var k=d(C),x=d(B);return a(k.r+(x.r-k.r)*$,k.g+(x.g-k.g)*$,k.b+(x.b-k.b)*$)}function s(C){C=C.replace("#",""),C.length===3&&(C=C[0]+C[0]+C[1]+C[1]+C[2]+C[2]);var B=parseInt(C.substr(0,2),16)/255,$=parseInt(C.substr(2,2),16)/255,k=parseInt(C.substr(4,2),16)/255;return B=B<=.03928?B/12.92:Math.pow((B+.055)/1.055,2.4),$=$<=.03928?$/12.92:Math.pow(($+.055)/1.055,2.4),k=k<=.03928?k/12.92:Math.pow((k+.055)/1.055,2.4),.2126*B+.7152*$+.0722*k}function e(C){var B=C.bg||"#0b0f1a",$=C.fg||"#e8ecf5",k=C.muted||"#9aa6bf",x=C["card-base"]||C.bg||"#121826",I=C["dot-ok"]||"#4caf50",E=C["dot-bad"]||"#e74c3c",S=C.lightBg||B&&s(B)>.4,A={};return A.hover=S?p(x,B,.35):p(x,$,.08),A["card-hover"]=p(x,A.hover,.5),A.base=p(B,x,.6),A["fg-muted"]=p(k,B,.35),A.success=I,A.error=E,A.warning=S?"#d68a00":"#f39c12",A}function n(C,B){var $=B.lightBg||B.bg&&s(B.bg)>.4,k=B.accent||B["accent-strong"]||"#888888",x=d(k);return $?":root."+C+` body {
background:
radial-gradient(1200px 800px at 10% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .08), transparent 60%),
radial-gradient(1000px 700px at 110% 10%, rgba(`+x.r+","+x.g+","+x.b+`, .05), transparent 55%),
var(--bg);
}
`:":root."+C+` body {
background:
radial-gradient(1200px 900px at 8% -12%, rgba(`+x.r+","+x.g+","+x.b+`, .10), transparent 60%),
radial-gradient(1000px 700px at 110% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .07), transparent 55%),
var(--bg);
}
`}function c(C,B){var $=B.lightBg||B.bg&&s(B.bg)>.4;return $?":root."+C+` button:hover {
background: color-mix(in srgb, var(--accent-strong) 12%, white 88%);
border-color: rgba(0, 0, 0, .15);
box-shadow: 0 1px 6px rgba(0, 0, 0, .08), inset 0 1px 0 rgba(255, 255, 255, .8);
}
`:":root."+C+` button:hover {
background: color-mix(in srgb, var(--accent) 18%, transparent);
border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
}
`}function t(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function i(){v.forEach(function(C){document.documentElement.style.removeProperty("--"+C)})}function y(C,B){var $=C.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");$||($="custom"),b.indexOf($)!==-1&&($=$+"-custom");for(var k=safeGetJSON(o,{}),x=$,I=2;k[$]&&$!==B;)$=x+"-"+I++;return $}function u(C){var B=document.getElementById("user-theme-styles");B&&B.remove(),f.length=b.length,Object.keys(h).forEach(function(E){b.indexOf(E)===-1&&delete h[E]});var $=C||safeGetJSON(o,{}),k=Object.keys($);if(k=k.filter(function(E){return b.indexOf(E)===-1}),!!k.length){var x="";k.forEach(function(E){var S=$[E];f.indexOf(E)===-1&&f.push(E);var A={};v.forEach(function(O){S[O]&&(A[O]=S[O])}),A["card-bg"]=S["card-base"]||S.bg,S.lightBg&&(A.lightBg=!0);var D=e(A);r.forEach(function(O){!A[O]&&D[O]&&(A[O]=D[O])}),h[E]=A,x+=":root."+E+` {
`,v.forEach(function(O){A[O]&&(x+=" --"+O+": "+A[O]+`;
`)}),x+=`}
`,x+=n(E,A),x+=c(E,A)});var I=document.createElement("style");I.id="user-theme-styles",I.textContent=x,document.head.appendChild(I)}}function w(){secureFetch("/api/v1/themes").then(function(C){return C.json()}).then(function(C){if(!(!C.success||!C.themes)){var B=C.themes,$=safeGetJSON(o,{});if(JSON.stringify(B)!==JSON.stringify($)){safeSet(o,JSON.stringify(B)),u(B);var k=safeGet(l);k&&f.indexOf(k)!==-1&&L(k)}}}).catch(function(){})}function T(){var C=safeGetJSON(m);if(C){var B=C.name||"Custom",$=y(B),k={name:B};v.forEach(function(E){C[E]&&(k[E]=C[E])});var x=safeGetJSON(o,{});x[$]=k,safeSet(o,JSON.stringify(x)),safeGet(l)==="custom"&&safeSet(l,$),safeRemove(m);var I={};v.forEach(function(E){k[E]&&(I[E]=k[E])}),fetch("/api/v1/themes/"+$,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:B,colors:I})}).catch(function(){})}}function L(C){document.documentElement.classList.add("theme-transitioning"),f.forEach(function(x){x!=="dark"&&document.documentElement.classList.remove(x)}),i(),C!=="dark"&&document.documentElement.classList.add(C),safeSet(l,C);var B=h[C],$=document.querySelector('meta[name="theme-color"]');$&&B&&$.setAttribute("content",B.bg);var k=B&&B.lightBg;!k&&B&&B.bg&&(k=s(B.bg)>.4),k?document.documentElement.classList.add("light-bg"):document.documentElement.classList.remove("light-bg"),setTimeout(function(){document.documentElement.classList.remove("theme-transitioning")},300)}T(),u();var P=safeGet(l);P==="red"&&(P="black",safeSet(l,"black")),P&&P!=="dark"&&f.indexOf(P)===-1&&(P=null),L(P||t()),w(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(C){safeGet(l)||L(C.matches?"dark":"light")}),window.THEMES=f,window.BUILTIN_THEMES=b,window.THEME_COLORS=h,window.THEME_PROPS=v,window.BASE_PROPS=g,window.DERIVED_PROPS=r,window.USER_THEMES_KEY=o,window.applyTheme=L,window.clearCustomProperties=i,window.injectUserThemeStyles=u,window.syncThemesFromServer=w,window.slugifyThemeName=y,window.getActiveTheme=function(){return safeGet(l)||t()},window.deriveExtendedColors=e,window.hexToRgb=d,window.rgbToHex=a,window.blendColors=p})(),(function(){let l=null;async function o(){if(l)return l;try{const d=await fetch("/api/v1/auth/login/methods",{cache:"no-store"});if(!d.ok)throw new Error(`methods HTTP ${d.status}`);const a=await d.json();return l=Array.isArray(a.providers)?a.providers:[],l}catch(d){return console.warn("[auth-gate] methods fetch failed; falling back to TOTP-only",d),[]}}function m(d){const a=document.getElementById("totp-overlay");if(!a)return;const p=a.querySelector(".totp-card");if(!p)return;const s=p.innerHTML;p.dataset.originalBody||(p.dataset.originalBody=s);const e=d.map(n=>{const c=n.config&&(n.config.label||n.name)||n.name;return`<button class="provider-btn" data-provider="${n.name}"
style="margin: 6px 4px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem;">
Sign in with ${c}
</button>`}).join(`
`);p.innerHTML=`
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy" onerror="this.style.display='none'">
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy" onerror="this.style.display='none'">
<p class="subtitle">Choose how to sign in</p>
<div id="auth-gate-providers" style="margin: 14px 0 10px;">${e}</div>
<div id="auth-gate-message" style="margin-top: 8px; color: var(--muted); font-size: 0.8rem;"></div>
`,a.classList.add("show"),p.querySelectorAll(".provider-btn").forEach(n=>{n.addEventListener("click",()=>{const c=n.dataset.provider,t=d.find(i=>i.name===c);f(t)})})}function b(){const d=document.getElementById("totp-overlay");if(!d)return;const a=d.querySelector(".totp-card");!a||!a.dataset.originalBody||(a.innerHTML=a.dataset.originalBody,window.location.reload())}function f(d){const a=document.getElementById("totp-overlay");if(!a)return;const p=a.querySelector(".totp-card");if(p){if(d.name==="totp"){window.location.reload();return}if(d.name==="email"){p.innerHTML=`
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy" onerror="this.style.display='none'">
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy" onerror="this.style.display='none'">
<p class="subtitle">Sign in with email</p>
<p style="margin: 6px 0 14px; font-size: 0.85rem; color: var(--muted);">
We'll email you a one-time sign-in link.
</p>
<input id="auth-gate-email-input" type="email" inputmode="email" autocomplete="email"
placeholder="you@example.com"
style="width: 100%; padding: 10px 12px; font-size: 1rem; background: var(--input-bg); color: var(--text); border: 1px solid var(--border); border-radius: 6px; box-sizing: border-box;">
<button id="auth-gate-email-submit" class="provider-btn"
style="margin-top: 14px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem; width: 100%;">
Send sign-in link
</button>
<div id="auth-gate-email-status" style="margin-top: 12px; font-size: 0.85rem; line-height: 1.4;"></div>
<div style="margin-top: 16px;">
<a href="#" id="auth-gate-back" style="color: var(--muted); font-size: 0.8rem;">\u2190 Back</a>
</div>
`,a.classList.add("show");const s=p.querySelector("#auth-gate-email-input"),e=p.querySelector("#auth-gate-email-submit"),n=p.querySelector("#auth-gate-email-status"),c=p.querySelector("#auth-gate-back");e.addEventListener("click",async()=>{const t=(s.value||"").trim();if(!t||!t.includes("@")){n.textContent="Enter a valid email address.",n.style.color="var(--error, #d33)";return}e.disabled=!0,n.textContent="Sending\u2026",n.style.color="";try{const y=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t})})).json();if(y.success){const u=y.deliveredVia||"email",w=y.maskedEmail||t;u==="dev-console"?n.innerHTML=`
Check the server logs for your one-time link.
(Dev mode: no SMTP configured. In production this would email <strong>${w}</strong>.)`:n.innerHTML=`Sign-in link sent to <strong>${w}</strong>.
Check your inbox (and spam folder).`,n.style.color="var(--success, #2a7)"}else n.textContent=y.error||"Could not send link.",n.style.color="var(--error, #d33)",e.disabled=!1}catch{n.textContent="Connection error. Try again.",n.style.color="var(--error, #d33)",e.disabled=!1}}),s.addEventListener("keydown",t=>{t.key==="Enter"&&e.click()}),c.addEventListener("click",t=>{t.preventDefault(),m(providers)});return}console.warn("[auth-gate] unknown provider",d.name),window.location.reload()}}async function v(){if(!document.getElementById("totp-overlay"))return;const a=await o();if(a.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(a.length===1&&a[0].name==="totp"){g(a[0]);return}m(a)}function g(d){const a=l&&l.find(n=>n.name==="email");if(!a){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const p=document.getElementById("totp-overlay"),s=p.querySelector(".totp-card");if(!s)return;if(s.dataset.originalBody||(s.dataset.originalBody=s.innerHTML),!s.querySelector("#auth-gate-email-alt")){const n=document.createElement("div");n.id="auth-gate-email-alt",n.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",n.innerHTML=`<a href="#" id="auth-gate-email-alt-link"
style="color: var(--accent); text-decoration: none;">
Or sign in with email instead \u2192
</a>`,s.appendChild(n),n.querySelector("#auth-gate-email-alt-link").addEventListener("click",c=>{c.preventDefault(),f(a)})}p.classList.add("show")}window.__dc_049_handled=!0;function r(d){try{const a=new URL(d,window.location.origin);if(!["http:","https:"].includes(a.protocol))return!1;if(a.origin===window.location.origin)return!0;if(a.protocol!=="https:")return!1;const p=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return a.hostname===p.slice(1)||a.hostname.endsWith(p)}catch{return!1}}const h=new URLSearchParams(window.location.search);if(h.get("auth")==="required"){const d=h.get("return");if(d&&r(d))try{sessionStorage.setItem("totp_redirect",d)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(v,0)}window._showAuthGate=v,window._authGateMethods=o})(),(function(){function l(){const r=document.querySelector(".totp-card");if(!r)return;const d=getComputedStyle(r).backgroundColor.match(/\d+/g);if(!d)return;const a=(.299*+d[0]+.587*+d[1]+.114*+d[2])/255,p=r.querySelector(".totp-logo-dark"),s=r.querySelector(".totp-logo-light");p&&(p.style.display=a>.5?"none":""),s&&(s.style.display=a>.5?"":"none")}function o(){const r=document.getElementById("totp-overlay");if(r){r.classList.add("show"),setTimeout(l,50);const h=r.querySelector(".totp-digits input");h&&setTimeout(()=>h.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function m(){const r=document.getElementById("totp-overlay");r&&r.classList.remove("show")}function b(r,h){const d=new URL(r,window.location.origin);if(d.origin===window.location.origin)return d.toString();const a=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,p=d.hostname===a.slice(1)||d.hostname.endsWith(a);if(d.protocol!=="https:"||!p)return null;if(!h)return d.toString();const s=`${d.pathname}${d.search}${d.hash}`;return d.pathname="/dashcaddy-sso",d.search="",d.hash="",d.searchParams.set("token",h),d.searchParams.set("return",s),d.toString()}const f=document.getElementById("totp-digits");if(f){const r=f.querySelectorAll("input");r.forEach((h,d)=>{h.addEventListener("input",a=>{const p=a.target.value.replace(/\D/g,"");a.target.value=p.slice(0,1),p&&d<r.length-1&&r[d+1].focus();const s=Array.from(r).map(e=>e.value).join("");s.length===6&&v(s)}),h.addEventListener("keydown",a=>{a.key==="Backspace"&&!a.target.value&&d>0&&(r[d-1].focus(),r[d-1].value="")}),h.addEventListener("paste",a=>{a.preventDefault();const p=(a.clipboardData.getData("text")||"").replace(/\D/g,"");p.length>=6&&(r.forEach((s,e)=>{s.value=p[e]||""}),r[5].focus(),v(p.slice(0,6)))})})}async function v(r){const h=document.getElementById("totp-error");h.textContent="Verifying...",h.className="totp-error verifying";try{const a=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r})})).json();if(a.success){h.textContent="",a.csrfToken&&(csrfToken=a.csrfToken),m();const p=safeSessionGet("totp_redirect");if(p){try{sessionStorage.removeItem("totp_redirect")}catch{}const s=b(p,a.ssoToken);if(!s)return;window.location.href=s;return}typeof window.initializeDashboard=="function"&&window.initializeDashboard()}else{h.textContent=a.error||"Invalid code",h.className="totp-error";const p=document.querySelectorAll("#totp-digits input");p.forEach(s=>{s.value=""}),p[0]?.focus()}}catch{h.textContent="Connection error",h.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const r=urlParams.get("return");if(r)try{const h=new URL(r,window.location.origin),d=h.hostname,a=h.origin===window.location.origin,p=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,s=d.endsWith(p)||d===p.substring(1);(a||s)&&safeSessionSet("totp_redirect",r)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=o})(),(function(){"use strict";async function l(){try{return await(await fetch("/api/v1/totp/recovery-info",{cache:"no-store"})).json()}catch{return{success:!1,status:"unknown",hint:"Could not contact server"}}}function o(g){const r=document.getElementById("totp-recovery-link");r&&(r.style.display=g?"":"none")}function m(){const g=document.getElementById("totp-recovery-panel");g&&(g.style.display="");const r=document.getElementById("totp-recovery-status"),h=document.getElementById("totp-recovery-import"),d=document.getElementById("totp-recovery-verify");h&&(h.style.display=""),d&&(d.style.display="none"),document.getElementById("totp-recovery-error").textContent="",document.getElementById("totp-recovery-confirm-error").textContent="",document.getElementById("totp-recovery-secret").value="",document.getElementById("totp-recovery-code").value="",l().then(a=>{r.textContent=a.hint||"",a.status==="healthy"?r.style.borderColor="var(--ok-fg, #7ef2ff)":a.status==="unreadable"?(r.style.borderColor="var(--bad-fg, #ff9aa3)",r.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):a.status==="not_configured"?r.style.borderColor="var(--muted)":r.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function b(){const g=document.getElementById("totp-recovery-panel");g&&(g.style.display="none")}async function f(){const g=document.getElementById("totp-recovery-secret").value.trim(),r=document.getElementById("totp-recovery-error");if(r.textContent="",!g){r.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(g)){r.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const h=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:g})}),d=await h.json();if(!h.ok||!d.success){r.textContent=d.error||d.message||"Restore failed";return}document.getElementById("totp-recovery-import").style.display="none",document.getElementById("totp-recovery-verify").style.display="",setTimeout(()=>document.getElementById("totp-recovery-code")?.focus(),100)}catch{r.textContent="Network error \u2014 try again"}}async function v(){const g=document.getElementById("totp-recovery-code").value.trim(),r=document.getElementById("totp-recovery-confirm-error");if(r.textContent="",!/^\d{6}$/.test(g)){r.textContent="Enter a 6-digit code";return}try{const h=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:g})}),d=await h.json();if(!h.ok||!d.success){r.textContent=d.error||d.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}b();const a=document.getElementById("totp-overlay");a&&a.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{r.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",g=>{g.preventDefault(),m()}),document.getElementById("totp-recovery-close")?.addEventListener("click",b),document.getElementById("totp-recovery-submit")?.addEventListener("click",f),document.getElementById("totp-recovery-confirm")?.addEventListener("click",v),document.getElementById("totp-recovery-secret")?.addEventListener("keydown",g=>{g.key==="Enter"&&(g.preventDefault(),f())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",g=>{g.key==="Enter"&&(g.preventDefault(),v())}),window._refreshRecoveryLink=async function(){const g=await l();return g&&g.success&&g.status&&g.status!=="healthy"?o(!0):o(!1),g}})(),(function(){const l=new ErrorHandler;injectModal("folder-browser-modal",`<div id="folder-browser-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 700px; max-height: 80vh;">
<h3>\u{1F4C2} Browse for Media Folders</h3>
<div id="folder-browser-path" style="padding: 10px; background: var(--card-bg); border-radius: 6px; margin-bottom: 12px; font-family: monospace; font-size: 0.9rem; word-break: break-all;">
/
</div>
<div id="folder-browser-list" style="max-height: 400px; overflow-y: auto; border: 1px solid var(--border); border-radius: 6px;">
<div style="padding: 20px; text-align: center; color: var(--muted);">Loading...</div>
</div>
<div id="folder-browser-selected" style="margin-top: 12px; padding: 10px; background: color-mix(in srgb, var(--success) 10%, transparent); border: 1px solid var(--success); border-radius: 6px; display: none;">
<div style="font-size: 0.85rem; color: var(--success); margin-bottom: 6px;">Selected folders:</div>
<div id="folder-browser-selected-list" style="display: flex; flex-wrap: wrap; gap: 6px;"></div>
</div>
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: space-between;">
<button id="folder-browser-select-current" class="btn-accent">
+ Add Current Folder
</button>
<div class="flex-row-gap">
<button id="folder-browser-cancel">Cancel</button>
<button id="folder-browser-done" style="background: color-mix(in srgb, var(--success) 20%, transparent); border-color: var(--success); color: var(--success);">Done</button>
</div>
</div>
</div>
</div>`),injectModal("service-creds-modal",`<div id="service-creds-modal">
<div class="service-creds-content">
<h3 id="svc-creds-title" style="margin: 0 0 4px; font-size: 1.05rem;">Service Credentials</h3>
<p id="svc-creds-desc" style="font-size: 0.75rem; color: var(--muted); margin: 0 0 14px;">Credentials are injected automatically when accessing this service.</p>
<!-- Status indicator -->
<div style="display: flex; align-items: center; gap: 6px; margin-bottom: 12px;">
<span id="svc-creds-dot" class="status-dot"></span>
<span id="svc-creds-status" class="text-muted-sm">No credentials stored</span>
</div>
<!-- Seedhost credentials (shown for external services) -->
<div id="svc-creds-seedhost" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Seedhost Login</label>
<p class="hint-micro">Username shared across all services. Password is per-service.</p>
<input type="text" id="svc-seedhost-user" placeholder="Username (shared)" autocomplete="username"
style="width: 100%; padding: 8px 10px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
<input type="password" id="svc-seedhost-pass" placeholder="Password" autocomplete="current-password"
class="input-creds" />
</div>
<!-- API Key (shown for arr services or services with API key support) -->
<div id="svc-creds-apikey" style="display: none; margin-bottom: 14px;">
<label class="label-bold">API Key</label>
<p class="hint-micro">Bypasses the app's own login screen</p>
<input type="text" id="svc-apikey-input" placeholder="API key"
style="width: 100%; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; font-family: monospace; box-sizing: border-box;" />
</div>
<!-- Quality Profile (shown for radarr/sonarr only) -->
<div id="svc-creds-quality" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Quality Profile</label>
<p class="hint-micro">Used when requesting via Seerr</p>
<div style="display: flex; gap: 8px; align-items: center;">
<select id="svc-quality-select"
style="flex: 1; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;">
<option value="">-- Enter API key first --</option>
</select>
<button id="svc-quality-fetch" type="button"
style="padding: 8px 12px; font-size: 0.75rem; cursor: pointer; white-space: nowrap;">
Fetch
</button>
</div>
<div id="svc-quality-status" style="font-size: 0.75rem; margin-top: 4px; min-height: 1em;"></div>
</div>
<!-- Per-service Basic Auth (shown for non-external services) -->
<div id="svc-creds-basic" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Service Login</label>
<input type="text" id="svc-basic-user" placeholder="Username" autocomplete="username"
style="width: 100%; padding: 8px 10px; margin-top: 6px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
<input type="password" id="svc-basic-pass" placeholder="Password" autocomplete="current-password"
class="input-creds" />
</div>
<!-- Error message -->
<div id="svc-creds-error" style="display: none; padding: 8px 10px; margin-bottom: 10px; background: color-mix(in srgb, var(--error, #c62828) 12%, transparent); border: 1px solid var(--error, #c62828); border-radius: 6px; font-size: 0.8rem; color: var(--error, #c62828);"></div>
<!-- Buttons -->
<div style="display: flex; gap: 8px; margin-top: 14px;">
<button id="svc-creds-save" class="btn-accent-solid" style="flex: 1; padding: 9px; border: none; border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem;">
Save
</button>
<button id="svc-creds-clear" style="padding: 9px 14px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 6px; cursor: pointer; font-size: 0.85rem; display: none;">
Clear
</button>
<button id="svc-creds-close" style="padding: 9px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 0.85rem;">
Cancel
</button>
</div>
</div>
</div>`);const o=document.getElementById("service-creds-modal");let m=null;const b=["sonarr","radarr","prowlarr","overseerr"],f=["sonarr","radarr"];function v(a){return a.externalUrl||a.url||""}function g(a){const p=document.getElementById("svc-creds-error");p.textContent=a,p.style.display=""}function r(){const a=document.getElementById("svc-creds-error");a.textContent="",a.style.display="none"}window.openServiceCredsModal=async function(a){m=a,r();const p=document.getElementById("svc-creds-title"),s=document.getElementById("svc-creds-desc"),e=document.getElementById("svc-creds-seedhost"),n=document.getElementById("svc-creds-apikey"),c=document.getElementById("svc-creds-basic"),t=document.getElementById("svc-creds-quality");p.textContent=a.name+" Credentials";const i=!!a.isExternal,y=b.includes(a.id)||b.includes(a.appTemplate),u=f.includes(a.id)||f.includes(a.appTemplate);e.style.display=i?"":"none",n.style.display=y?"":"none",t.style.display=u?"":"none",c.style.display=i?"none":"";const w=document.getElementById("svc-quality-select");w.innerHTML='<option value="">-- Enter API key first --</option>',document.getElementById("svc-quality-status").textContent="",i?(s.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${a.name}`):y?s.textContent="API key bypasses the app login screen automatically.":s.textContent="Credentials are injected automatically when accessing this service.",await h(a),o.classList.add("show")};async function h(a){const p=document.getElementById("svc-creds-dot"),s=document.getElementById("svc-creds-status"),e=document.getElementById("svc-creds-clear");let n=!1;if(a.isExternal){try{const i=await(await fetch(`/api/v1/seedhost-creds?serviceId=${a.id}`)).json();i.success?(document.getElementById("svc-seedhost-user").value=i.username||"",i.hasCredentials&&(n=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const i=await(await fetch(`/api/v1/services/${a.id}/credentials`)).json();i.success&&(i.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",n=!0):document.getElementById("svc-apikey-input").value="",i.hasBasicAuth&&!a.isExternal?(document.getElementById("svc-basic-user").value=i.username||"",n=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const c=a.id||a.appTemplate;if(f.includes(c)&&await d(a),n){p.style.background="var(--ok-fg, #74dfc4)",s.style.color="var(--ok-fg, #74dfc4)",s.textContent="Credentials stored",e.style.display="";const t=document.getElementById(`creds-btn-${a.id}`);t&&t.classList.add("has-creds")}else p.style.background="var(--muted)",s.style.color="var(--muted)",s.textContent="No credentials stored",e.style.display="none"}async function d(a){const p=document.getElementById("svc-quality-select"),s=document.getElementById("svc-quality-status"),e=a.id||a.appTemplate,n=v(a);if(!n){p.innerHTML='<option value="">-- No service URL --</option>';return}p.innerHTML='<option value="">Loading...</option>',s.textContent="";try{const c=new URLSearchParams({service:e,url:n}),i=await(await fetch(`/api/v1/arr/quality-profiles?${c}`)).json();if(!i.success||!i.profiles?.length){p.innerHTML='<option value="">-- No profiles found (enter API key and click Fetch) --</option>';return}p.innerHTML="";for(const y of i.profiles){const u=document.createElement("option");u.value=y.id,u.textContent=y.name,p.appendChild(u)}if(i.storedProfileId&&(p.value=String(i.storedProfileId)),!p.value){const y=i.profiles.find(u=>/720/i.test(u.name));y&&(p.value=String(y.id))}!p.value&&i.profiles.length&&(p.value=String(i.profiles[0].id)),s.innerHTML=`<span style="color: var(--ok-fg);">${i.profiles.length} profiles loaded</span>`}catch(c){p.innerHTML='<option value="">-- Failed to load --</option>',s.innerHTML=`<span style="color: var(--error, #c62828);">Error: ${c.message}</span>`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!m)return;const a=m.id||m.appTemplate,p=v(m),e=document.getElementById("svc-apikey-input")?.value.trim(),n=document.getElementById("svc-quality-select"),c=document.getElementById("svc-quality-status");if(!p){c.innerHTML='<span style="color: var(--error, #c62828);">No service URL available</span>';return}if(!e||e==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){c.innerHTML='<span style="color: var(--error, #c62828);">Enter an API key first</span>';return}n.innerHTML='<option value="">Fetching...</option>',c.textContent="";try{const t=new URLSearchParams({service:a,url:p,apiKey:e}),y=await(await fetch(`/api/v1/arr/quality-profiles?${t}`)).json();if(!y.success){n.innerHTML='<option value="">-- Error --</option>',c.innerHTML=`<span style="color: var(--error, #c62828);">${y.error||"Failed to fetch profiles"}</span>`;return}if(!y.profiles?.length){n.innerHTML='<option value="">-- No profiles found --</option>';return}n.innerHTML="";for(const w of y.profiles){const T=document.createElement("option");T.value=w.id,T.textContent=w.name,n.appendChild(T)}const u=y.profiles.find(w=>/720/i.test(w.name));u?n.value=String(u.id):y.profiles.length&&(n.value=String(y.profiles[0].id)),c.innerHTML=`<span style="color: var(--ok-fg);">${y.profiles.length} profiles loaded</span>`}catch(t){n.innerHTML='<option value="">-- Error --</option>',c.innerHTML=`<span style="color: var(--error, #c62828);">${t.message}</span>`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!m)return;const a=document.getElementById("svc-creds-save");a.textContent="Saving...",a.disabled=!0,r();try{const p=b.includes(m.id)||b.includes(m.appTemplate),s=m.id||m.appTemplate;if(m.isExternal){const c=document.getElementById("svc-seedhost-user").value.trim(),t=document.getElementById("svc-seedhost-pass").value;c&&await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:c,password:t||void 0,serviceId:m.id})})}const n=document.getElementById("svc-apikey-input")?.value.trim();if(n&&n!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(p){const c=v(m),t=document.getElementById("svc-quality-select"),i=t?.value?parseInt(t.value):void 0,y=t?.selectedOptions?.[0]?.textContent||void 0,w=await(await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:s,apiKey:n,url:c||void 0,qualityProfileId:i||void 0,qualityProfileName:y||void 0})})).json();if(!w.success){g(w.error||"Failed to save API key"),a.textContent="Save",a.disabled=!1;return}w.connectionTest&&!w.connectionTest.success&&g(`API key saved but connection test failed: ${w.connectionTest.error}`)}else await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:n})});else if(p&&f.includes(s)){const c=document.getElementById("svc-quality-select"),t=c?.value?parseInt(c.value):void 0,i=c?.selectedOptions?.[0]?.textContent||void 0;t&&await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:s,qualityProfileId:t,qualityProfileName:i})})}if(!m.isExternal){const c=document.getElementById("svc-basic-user").value.trim(),t=document.getElementById("svc-basic-pass").value;c&&t&&await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:c,password:t})})}await h(m)}catch(p){l.logError("[ServiceCredentials] Save",p,{function:"saveCredentials"}),g("Failed to save: "+(p.message||"Unknown error"))}a.textContent="Save",a.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(m&&confirm(`Remove stored credentials for ${m.name}?`)){r();try{const a=m.id||m.appTemplate,p=b.includes(a);m.isExternal&&await secureFetch(`/api/v1/seedhost-creds?serviceId=${m.id}`,{method:"DELETE"}),await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"DELETE"}),p&&await secureFetch(`/api/v1/arr/credentials/${a}`,{method:"DELETE"});const s=document.getElementById(`creds-btn-${m.id}`);s&&s.classList.remove("has-creds"),await h(m)}catch(a){l.logError("[ServiceCredentials] Clear",a,{function:"clearCredentials"}),g("Failed to clear: "+(a.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{o.classList.remove("show"),m=null}),o?.addEventListener("click",a=>{a.target===o&&(o.classList.remove("show"),m=null)}),window.refreshCredsButtons=async function(){try{for(const a of window.APPS||[]){if(!a.isExternal&&!a.appTemplate&&!a.url)continue;let p=!1;if(a.isExternal)try{const n=await(await fetch(`/api/v1/seedhost-creds?serviceId=${a.id}`)).json();n.success&&n.hasCredentials&&(p=!0)}catch{}try{const n=await(await fetch(`/api/v1/services/${a.id}/credentials`)).json();n.success&&(n.hasApiKey||n.hasBasicAuth)&&(p=!0)}catch{}const s=document.getElementById(`creds-btn-${a.id}`);s&&s.classList.toggle("has-creds",p)}}catch{}}})(),(function(){const l=new ErrorHandler;injectModal("totp-settings-modal",`<div id="totp-settings-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3 style="margin: 0 0 16px; font-size: 1.1rem;">Authentication Settings</h3>
<!-- Status Banner -->
<div id="totp-status-banner" style="margin-bottom: 16px; padding: 12px 16px; border-radius: 8px; border: 1px solid var(--border); display: flex; align-items: center; gap: 8px;">
<span id="totp-status-dot" class="status-dot"></span>
<span id="totp-status-text" style="font-size: 0.9rem;">TOTP is not configured</span>
</div>
<!-- Setup Button (not configured state) -->
<div id="totp-setup-section">
<button id="totp-setup-btn" class="btn-accent-solid" style="width: 100%; padding: 12px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 0.95rem;">
Generate New Secret
</button>
<div style="display: flex; align-items: center; gap: 8px; margin: 10px 0 0;">
<div class="divider-line"></div>
<span class="text-tiny-muted">or</span>
<div class="divider-line"></div>
</div>
<div style="margin-top: 10px;">
<label class="text-hint">Import an existing secret key:</label>
<div style="display: flex; gap: 8px; margin-top: 6px;">
<input type="text" id="totp-import-key" placeholder="Paste your Base32 key" autocomplete="off" spellcheck="false"
style="flex: 1; padding: 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.9rem; font-family: monospace; letter-spacing: 1px; text-transform: uppercase;" />
<button id="totp-import-btn" style="padding: 10px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
Import
</button>
</div>
<div id="totp-import-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
</div>
</div>
<!-- Secret Display (setup flow) -->
<div id="totp-qr-section" style="display: none;">
<!-- Manual Key (primary - for WinAuth/desktop authenticators) -->
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 8px;">Copy this key into your authenticator app:</p>
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<code id="totp-manual-key" style="flex: 1; display: block; padding: 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px; font-size: 1rem; font-family: 'Sami Grotesk', monospace; letter-spacing: 2px; word-break: break-all; user-select: all; color: var(--fg);"></code>
<button id="totp-copy-key" style="padding: 10px 14px; background: var(--card-base); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 1rem; white-space: nowrap; color: var(--fg);" title="Copy to clipboard">\u{1F4CB}</button>
</div>
<!-- Download backup file (recovery aid) -->
<div style="margin-bottom: 16px; padding: 10px 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="font-size: 0.8rem; color: var(--muted); flex: 1;">
<strong style="color: var(--fg);">Save a backup file</strong> \u2014 if you ever lose your authenticator,
this is the only way to recover without SSH access to the server.
</span>
<button id="totp-download-backup" type="button"
style="padding: 8px 14px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
\u2B07 Download
</button>
</div>
</div>
<!-- QR Code (secondary - for mobile apps) -->
<details class="mb-16">
<summary style="cursor: pointer; color: var(--muted); font-size: 0.8rem;">Show QR code (for mobile authenticator apps)</summary>
<div style="text-align: center; margin-top: 8px;">
<img id="totp-qr-image" style="width: 180px; height: 180px; border-radius: 8px;" />
</div>
</details>
<!-- Verify First Code -->
<div style="border-top: 1px solid var(--border); padding-top: 16px;">
<label class="font-bold-sm">Enter code to confirm setup:</label>
<div style="display: flex; gap: 8px; margin-top: 8px;">
<input type="text" id="totp-setup-code" maxlength="6" inputmode="numeric" pattern="[0-9]{6}" placeholder="000000"
style="flex: 1; text-align: center; font-size: 1.3rem; padding: 10px; font-family: 'Sami Grotesk', monospace; letter-spacing: 4px; background: var(--bg); color: var(--fg); border: 2px solid var(--border); border-radius: 8px; outline: none;" />
<button id="totp-confirm-setup" class="btn-accent-solid" style="padding: 10px 20px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600;">
Confirm
</button>
</div>
<div id="totp-setup-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
</div>
</div>
<!-- Session Duration (active state) -->
<div id="totp-duration-section" style="display: none; margin-top: 12px;">
<label class="font-bold-sm">Session Duration:</label>
<select id="totp-duration-select" style="width: 100%; padding: 10px; margin-top: 6px; background: var(--bg, #0b0f1a); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; font-size: 0.9rem; cursor: pointer;">
<option value="15m">15 minutes</option>
<option value="30m">30 minutes</option>
<option value="1h">1 hour</option>
<option value="2h">2 hours</option>
<option value="4h">4 hours</option>
<option value="8h">8 hours</option>
<option value="12h">12 hours</option>
<option value="24h">24 hours</option>
<option value="never">Never (disable TOTP)</option>
</select>
<p style="font-size: 0.75rem; color: var(--muted); margin: 4px 0 0;">How long before you need to re-enter your code</p>
</div>
<!-- Disable Button (active state) -->
<div id="totp-disable-section" style="display: none; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border);">
<button id="totp-disable-btn" style="width: 100%; padding: 10px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 8px; cursor: pointer; font-size: 0.9rem;">
Disable TOTP
</button>
</div>
<!-- Close -->
<div style="margin-top: 16px; text-align: right;">
<button id="totp-modal-close" style="padding: 8px 20px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; cursor: pointer;">
Close
</button>
</div>
</div>
</div>`);async function o(){try{const v=await(await fetch("/api/v1/totp/config")).json();if(!v.success)return;const{enabled:g,sessionDuration:r,isSetUp:h}=v.config,d=document.getElementById("totp-status-dot"),a=document.getElementById("totp-status-text"),p=document.getElementById("totp-status-banner"),s=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),n=document.getElementById("totp-duration-section"),c=document.getElementById("totp-disable-section");if(g&&h){d.style.background="var(--ok-fg, #7ef2ff)",p.style.borderColor="var(--ok-fg, #7ef2ff)",p.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",a.textContent="TOTP is active",a.style.color="var(--ok-fg, #7ef2ff)",s.style.display="block";const t=document.getElementById("totp-setup-btn");t&&(t.textContent="Generate New Secret"),e.style.display="none",n.style.display="block",c.style.display="block",document.getElementById("totp-duration-select").value=r}else d.style.background="var(--muted)",p.style.borderColor="var(--border)",p.style.background="transparent",a.textContent="TOTP is not configured",a.style.color="var(--muted)",s.style.display="block",e.style.display="none",n.style.display="none",c.style.display="none";b(g&&h,r)}catch(f){console.warn("Failed to load TOTP settings:",f)}}const m={"15m":"15 min","30m":"30 min","1h":"1 hour","2h":"2 hours","4h":"4 hours","8h":"8 hours","12h":"12 hours","24h":"24 hours",never:"Disabled"};function b(f,v){const g=document.getElementById("auth-card"),r=document.getElementById("auth-pill"),h=document.getElementById("auth-dot"),d=document.getElementById("auth-status-text");g&&(f?(g.setAttribute("data-status","on"),r.className="badge on",r.textContent="YES",h.className="dot ok at-bl",d.textContent="Session: "+(m[v]||v)):(g.setAttribute("data-status","off"),r.className="badge off",r.textContent="NO",h.className="dot bad at-bl",d.textContent="Not configured"))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const v=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();v.success&&(document.getElementById("totp-qr-image").src=v.qrCode,document.getElementById("totp-manual-key").textContent=v.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus())}catch(f){l.logError("[TOTP] Setup Failed",f,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const f=document.getElementById("totp-import-key").value.trim(),v=document.getElementById("totp-import-error");if(v.textContent="",!f){v.textContent="Paste a Base32 secret key first";return}try{const r=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:f})})).json();r.success?(v.textContent="",document.getElementById("totp-qr-image").src=r.qrCode,document.getElementById("totp-manual-key").textContent=r.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus()):v.textContent=r.error||r.message||"Import failed"}catch{v.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const f=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(f).then(()=>{const v=document.getElementById("totp-copy-key");v.textContent="\u2705",setTimeout(()=>{v.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const f=document.getElementById("totp-manual-key").textContent.trim();if(!f)return;const v={service:"DashCaddy",type:"totp-secret",secret:f,issuer:"DashCaddy",algorithm:"SHA1",digits:6,period:30,issued:new Date().toISOString(),recovery_url:`${window.location.origin}/ (login screen \u2192 "Lost access?")`,note:'Keep this file somewhere safe. Anyone with this secret can generate your login codes. Use it ONLY to recover TOTP access via the "Lost access?" link on the DashCaddy login screen.'},g=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),r=URL.createObjectURL(g),h=document.createElement("a");h.href=r,h.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(h),h.click(),document.body.removeChild(h),URL.revokeObjectURL(r);const d=document.getElementById("totp-download-backup");d.textContent="\u2705 Saved",setTimeout(()=>{d.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const f=document.getElementById("totp-setup-code").value,v=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(f)){v.textContent="Enter a 6-digit code";return}try{const r=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:f})})).json();r.success?(v.textContent="",o()):v.textContent=r.error||"Invalid code"}catch{v.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",f=>{f.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async f=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:f.target.value})}),o()}catch(v){l.logError("[TOTP] Update Session Duration",v,{function:"updateSessionDuration"})}}),document.getElementById("totp-disable-btn")?.addEventListener("click",async()=>{if(confirm("Disable TOTP authentication? All services will be accessible without a code."))try{(await(await secureFetch("/api/v1/totp/disable",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"})).json()).success&&o()}catch(f){l.logError("[TOTP] Disable Failed",f,{function:"disableTOTP"})}}),document.getElementById("auth-settings-btn")?.addEventListener("click",()=>{o(),openModal("totp-settings-modal")}),document.getElementById("totp-modal-close")?.addEventListener("click",()=>{closeModal("totp-settings-modal")}),document.getElementById("totp-settings-modal")?.addEventListener("click",f=>{f.target.id==="totp-settings-modal"&&closeModal("totp-settings-modal")}),window._updateAuthCard=b,(async()=>{try{const v=await(await fetch("/api/v1/totp/config")).json();if(v.success){const g=v.config.enabled&&v.config.isSetUp;b(g,v.config.sessionDuration)}}catch(f){l.logError("[TOTP] AuthCard Update",f,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const l={me:"/api/v1/auth/me",users:"/api/v1/auth/admin/users",allowlist:"/api/v1/auth/admin/allowlist",invites:"/api/v1/auth/admin/invites"};function o(s,e,...n){const c=document.createElement(s);if(e)for(const t of Object.keys(e)){const i=e[t];i==null||i===!1||(t==="class"?c.className=i:t==="text"?c.textContent=i:t==="html"?c.innerHTML=i:t.startsWith("on")&&typeof i=="function"?c.addEventListener(t.slice(2).toLowerCase(),i):c.setAttribute(t,i))}for(const t of n)t==null||t===!1||(typeof t=="string"?c.appendChild(document.createTextNode(t)):c.appendChild(t));return c}async function m(s,e){const n=window.SITE&&window.SITE.csrfToken||"";e=e||{},e.headers=Object.assign({"Content-Type":"application/json"},e.headers||{},n?{"X-CSRF-Token":n}:{}),e.body&&typeof e.body!="string"&&(e.body=JSON.stringify(e.body));const c=await fetch(s,e),t=await c.json().catch(()=>({}));if(!c.ok){const i=t&&(t.message||t.error)||"HTTP "+c.status,y=new Error(i);throw y.status=c.status,y}return t}function b(s){const e={admin:"background:#7c3aed;color:#fff",operator:"background:#2563eb;color:#fff",viewer:"background:#6b7280;color:#fff"};return o("span",{class:"role-badge",style:"display:inline-block;padding:2px 8px;border-radius:4px;font-size:0.75rem;font-weight:600;text-transform:uppercase;"+(e[s]||e.viewer),text:s})}function f(s,e,n){if(s.innerHTML="",!e||e.length===0){s.appendChild(o("p",{style:"color:var(--muted)",text:"No users yet."}));return}const c=o("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});c.appendChild(o("thead",null,o("tr",{style:"border-bottom:1px solid var(--border)"},o("th",{style:"text-align:left;padding:8px",text:"Email"}),o("th",{style:"text-align:left;padding:8px",text:"Role"}),o("th",{style:"text-align:left;padding:8px",text:"Created"}),o("th",{style:"text-align:left;padding:8px",text:"Last login"}),o("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const t=o("tbody");for(const i of e){const y=o("tr",{style:"border-bottom:1px solid var(--border)"}),u=o("td",{style:"padding:8px"});u.appendChild(o("span",{text:i.email||"(no email)"})),i.displayName&&i.displayName!==(i.email||"").split("@")[0]&&(u.appendChild(o("br")),u.appendChild(o("small",{style:"color:var(--muted)",text:i.displayName}))),y.appendChild(u);const w=o("td",{style:"padding:8px"});w.appendChild(b(i.role)),y.appendChild(w),y.appendChild(o("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.createdAt?new Date(i.createdAt).toLocaleDateString():"\u2014"})),y.appendChild(o("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.lastLoginAt?new Date(i.lastLoginAt).toLocaleString():"\u2014"}));const T=o("td",{style:"padding:8px;text-align:right"}),L=o("select",{style:"padding:2px 6px;margin-right:6px",onchange:async C=>{try{await m(l.users+"/"+encodeURIComponent(i.id),{method:"PATCH",body:{role:C.target.value}}),n&&n()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),C.target.value=i.role}}});for(const C of["admin","operator","viewer"]){const B=o("option",{value:C,text:C});C===i.role&&(B.selected=!0),L.appendChild(B)}T.appendChild(L);const P=o("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(i.email||i.id)+"? This cannot be undone."))try{await m(l.users+"/"+encodeURIComponent(i.id),{method:"DELETE"}),n&&n()}catch(C){window.errorHandler&&window.errorHandler.show("Delete failed: "+C.message)}}});T.appendChild(P),y.appendChild(T),t.appendChild(y)}c.appendChild(t),s.appendChild(c)}function v(s,e){const n=o("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async t=>{t.preventDefault();const i=new FormData(t.target),y={email:i.get("email"),role:i.get("role"),ttlHours:parseInt(i.get("ttlHours"),10)||24,sendEmail:i.get("sendEmail")==="on"};try{const u=await m(l.invites,{method:"POST",body:y});t.target.reset(),e&&e(u)}catch(u){window.errorHandler&&window.errorHandler.show("Invite failed: "+u.message)}}});n.appendChild(o("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},o("span",{text:"Email"}),o("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})));const c=o("select",{name:"role",style:"padding:6px"});for(const t of["operator","viewer","admin"])c.appendChild(o("option",{value:t,text:t}));n.appendChild(o("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},o("span",{text:"Role"}),c)),n.appendChild(o("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},o("span",{text:"TTL (hours)"}),o("input",{name:"ttlHours",type:"number",min:"1",max:"168",value:"24",style:"padding:6px;width:80px"}))),n.appendChild(o("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},o("input",{name:"sendEmail",type:"checkbox",checked:!0}),o("span",{text:"Send email"}))),n.appendChild(o("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),s.appendChild(n)}function g(s,e,n){if(s.innerHTML="",!e||e.length===0){s.appendChild(o("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const c=o("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});c.appendChild(o("thead",null,o("tr",{style:"border-bottom:1px solid var(--border)"},o("th",{style:"text-align:left;padding:8px",text:"Email"}),o("th",{style:"text-align:left;padding:8px",text:"Role"}),o("th",{style:"text-align:left;padding:8px",text:"Invited by"}),o("th",{style:"text-align:left;padding:8px",text:"Expires"}),o("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const t=o("tbody");for(const i of e){const y=o("tr",{style:"border-bottom:1px solid var(--border)"});y.appendChild(o("td",{style:"padding:8px",text:i.email})),y.appendChild(o("td",{style:"padding:8px"},b(i.role))),y.appendChild(o("td",{style:"padding:8px;color:var(--muted)",text:i.invitedBy||"\u2014"})),y.appendChild(o("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.expiresAt?new Date(i.expiresAt).toLocaleString():"\u2014"}));const u=o("td",{style:"padding:8px;text-align:right"});u.appendChild(o("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+i.email+"?"))try{await m(l.invites+"/"+encodeURIComponent(i.id),{method:"DELETE"}),n&&n()}catch(w){window.errorHandler&&window.errorHandler.show("Revoke failed: "+w.message)}}})),y.appendChild(u),t.appendChild(y)}c.appendChild(t),s.appendChild(c)}function r(s,e){const n=o("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});n.appendChild(o("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),n.appendChild(o("br")),n.appendChild(o("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:s.acceptUrl}));const c=o("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(s.acceptUrl),c.textContent="Copied!",setTimeout(()=>{c.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});n.appendChild(c),s.deliveredVia==="dev-console"?n.appendChild(o("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):s.deliveredVia==="email"&&n.appendChild(o("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+s.email+"."})),e.appendChild(n)}async function h(s){s.innerHTML="",s.appendChild(o("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const e=await m(l.me).catch(()=>({}));if(!e||!e.user||e.user.role!=="admin"){s.appendChild(o("p",{style:"color:var(--muted)",text:"Admin role required to view this panel. If multi-user mode is enabled and you should have access, check /api/v1/auth/me."}));return}const n=o("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>h(s)});s.appendChild(n);const c=o("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});s.appendChild(c);const t=o("div",{id:"admin-users-list"});s.appendChild(t);const i=await m(l.users).catch(()=>({users:[]}));f(t,i.users,()=>h(s)),s.appendChild(o("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const y=o("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async L=>{L.preventDefault();const P=L.target.email.value.trim();if(P)try{await m(l.users,{method:"POST",body:{email:P}}),L.target.reset(),h(s)}catch(C){window.errorHandler&&window.errorHandler.show("Add failed: "+C.message)}}});y.appendChild(o("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),y.appendChild(o("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),s.appendChild(y),s.appendChild(o("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const u=o("div");s.appendChild(u);const w=o("div",{id:"admin-invites-list",style:"margin-top:16px"});s.appendChild(w);const T=await m(l.invites).catch(()=>({invites:[]}));g(w,T.invites,()=>h(s)),v(u,L=>{r(L,u),h(s)})}async function d(){if(document.getElementById("admin-panel-root"))return;const e=o("div",{id:"admin-panel-root",style:"position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;",onclick:t=>{t.target===e&&a()}}),n=o("div",{style:"background:var(--card-base,#1f2937);color:var(--text,#f3f4f6);border-radius:8px;padding:24px;max-width:900px;width:90%;max-height:85vh;overflow:auto;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.3)"});n.appendChild(o("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:a}));const c=o("div",{id:"admin-panel-body"});n.appendChild(c),e.appendChild(n),document.body.appendChild(e);try{await h(c)}catch(t){c.innerHTML='<p style="color:#f87171">Failed to load admin panel: '+(t.message||t)+"</p>"}}function a(){const s=document.getElementById("admin-panel-root");s&&s.remove()}async function p(s){async function e(){const n=await m(l.me).catch(()=>({})),c=document.getElementById("admin-trigger-btn");if(n&&n.user&&n.user.role==="admin"){if(c)return;const t=o("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:d});s?s.appendChild(t):document.body&&document.body.appendChild(t)}else c&&c.remove()}await e(),setInterval(e,6e4)}window.AdminPanel={open:d,close:a,attachTrigger:p}})(),(function(){injectModal("token-management-modal",`
<div id="token-management-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
<h3>\u{1F511} DNS Credentials</h3>
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
Enter Technitium DNS login credentials. Read-only accounts are used for logs; admin accounts for restarts, records, and updates.
</p>
<div id="dns-cred-sections"></div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="token-clear-all" style="margin-right: auto; background: color-mix(in srgb, var(--bad-fg) 15%, transparent); border-color: var(--bad-fg); color: var(--bad-fg);">Clear All</button>
<button id="token-cancel">Cancel</button>
<button id="token-save" class="btn-accent">Save</button>
</div>
</div>
</div>
`);function l(){return Object.keys(SITE.dnsServers||{})}function o(t){return(SITE.dnsServers||{})[t]?.name||t.toUpperCase()}function m(){const t=document.getElementById("dns-cred-sections");if(!t)return;t.innerHTML="";const i=l();if(i.length===0){t.innerHTML='<p style="color: var(--muted); text-align: center; padding: 20px;">No DNS servers configured.</p>';return}for(const y of i)t.insertAdjacentHTML("beforeend",`
<div class="token-section">
<h4 class="token-section-title">${o(y)}</h4>
<div class="token-grid">
<div class="token-field">
<label for="${y}-readonly-username">\u{1F4D6} Read-Only (Logs):</label>
<input type="text" id="${y}-readonly-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
<div class="token-input-row">
<input type="password" id="${y}-readonly-token" placeholder="Password" autocomplete="off" />
<button type="button" class="token-toggle" data-target="${y}-readonly-token">\u{1F441}</button>
</div>
</div>
<div class="token-field">
<label for="${y}-admin-username">\u{1F527} Admin:</label>
<input type="text" id="${y}-admin-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
<div class="token-input-row">
<input type="password" id="${y}-admin-token" placeholder="Password" autocomplete="off" />
<button type="button" class="token-toggle" data-target="${y}-admin-token">\u{1F441}</button>
</div>
</div>
</div>
<div class="token-status" id="${y}-token-status"></div>
</div>
`)}function b(){let t=safeSessionGet("dashcaddy-encryption-key");if(t)return t;const i=safeGet("dashcaddy-encryption-key");if(i)return safeSessionSet("dashcaddy-encryption-key",i),safeRemove("dashcaddy-encryption-key"),i;const y=new Uint8Array(32);return crypto.getRandomValues(y),t=Array.from(y,u=>u.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",t),t}const f=b();function v(t,i){if(!t)return"";const y=crypto.getRandomValues(new Uint8Array(8)),u=Array.from(y,L=>L.toString(16).padStart(2,"0")).join(""),w=new TextEncoder().encode(i+u);let T="";for(let L=0;L<t.length;L++){const P=t.charCodeAt(L)^w[L%w.length]^y[L%y.length]^L*31+17&255;T+=String.fromCharCode(P)}return u+":"+btoa(T)}function g(t,i){if(!t)return"";try{if(t.indexOf(":")===16){const T=t.substring(0,16),L=new Uint8Array(T.match(/.{2}/g).map($=>parseInt($,16))),P=atob(t.substring(17)),C=new TextEncoder().encode(i+T);let B="";for(let $=0;$<P.length;$++){const k=P.charCodeAt($)^C[$%C.length]^L[$%L.length]^$*31+17&255;B+=String.fromCharCode(k)}return B}const u=atob(t);let w="";for(let T=0;T<u.length;T++){const L=u.charCodeAt(T)^i.charCodeAt(T%i.length);w+=String.fromCharCode(L)}return w}catch{return""}}function r(t,i,y){const u=safeGet(`${t}-${i}-${y}-enc`);return g(u,f)}function h(t,i,y,u){const w=`${t}-${i}-${y}-enc`;u?safeSet(w,v(u,f)):safeRemove(w)}function d(t,i){return r(t,i,"token")}function a(t,i){return r(t,i,"username")}function p(t,i,y){h(t,i,"token",y)}function s(t,i,y){h(t,i,"username",y)}function e(){const t={};for(const i of l())t[i]={readonly:{username:a(i,"readonly"),token:d(i,"readonly")},admin:{username:a(i,"admin"),token:d(i,"admin")}};return t}function n(){l().forEach(t=>{["readonly","admin"].forEach(i=>{["token","username"].forEach(y=>{safeRemove(`${t}-${i}-${y}-enc`)})}),safeRemove(`${t}-token-enc`),safeRemove(`${t}-username-enc`)})}function c(t){const i=d(t,"readonly"),y=a(t,"readonly"),u=d(t,"admin"),w=a(t,"admin"),T=g(safeGet(`${t}-token-enc`),f),L=g(safeGet(`${t}-username-enc`),f);return{username:w||y||L,token:u||i||T,readonlyToken:i||T,readonlyUsername:y||L,adminToken:u||T,adminUsername:w||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{m();const t=document.getElementById("token-management-modal"),i=e();l().forEach(y=>{const u=i[y];document.getElementById(`${y}-readonly-username`).value=u.readonly.username,document.getElementById(`${y}-readonly-token`).value=u.readonly.token,document.getElementById(`${y}-admin-username`).value=u.admin.username,document.getElementById(`${y}-admin-token`).value=u.admin.token,document.getElementById(`${y}-token-status`).textContent=""}),t.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",t=>{const i=t.target.closest(".token-toggle");if(i){const y=i.dataset.target,u=document.getElementById(y);u.type==="password"?(u.type="text",i.textContent="\u{1F648}"):(u.type="password",i.textContent="\u{1F441}");return}t.target.id==="token-management-modal"&&t.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const t=l();t.forEach(u=>{s(u,"readonly",document.getElementById(`${u}-readonly-username`).value.trim()),p(u,"readonly",document.getElementById(`${u}-readonly-token`).value.trim()),s(u,"admin",document.getElementById(`${u}-admin-username`).value.trim()),p(u,"admin",document.getElementById(`${u}-admin-token`).value.trim())});const i={};let y=!1;if(t.forEach(u=>{const w={},T=document.getElementById(`${u}-readonly-username`).value.trim(),L=document.getElementById(`${u}-readonly-token`).value.trim(),P=document.getElementById(`${u}-admin-username`).value.trim(),C=document.getElementById(`${u}-admin-token`).value.trim();T&&L&&(w.readonly={username:T,password:L},y=!0),P&&C&&(w.admin={username:P,password:C},y=!0),Object.keys(w).length>0&&(i[u]=w)}),y){t.forEach(u=>{i[u]&&(document.getElementById(`${u}-token-status`).textContent="Verifying...",document.getElementById(`${u}-token-status`).className="token-status")});try{const w=await(await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:i})})).json();w.results?t.forEach(T=>{const L=document.getElementById(`${T}-token-status`);if(!i[T]){L.textContent="";return}const P=w.results[T];P?.success?(L.textContent="\u2713 Verified & saved",L.className="token-status success"):P?.partial?(L.textContent="\u2713 "+P.partial,L.className="token-status success"):(L.textContent="\u2717 "+(P?.error||"Login failed"),L.className="token-status error")}):w.success?t.forEach(T=>{i[T]&&(document.getElementById(`${T}-token-status`).textContent="\u2713 Saved",document.getElementById(`${T}-token-status`).className="token-status success")}):t.forEach(T=>{i[T]&&(document.getElementById(`${T}-token-status`).textContent="\u2717 "+(w.error||"Failed"),document.getElementById(`${T}-token-status`).className="token-status error")})}catch(u){console.error("Failed to sync DNS credentials to backend:",u),t.forEach(w=>{i[w]&&(document.getElementById(`${w}-token-status`).textContent="\u2713 Saved locally (sync failed)",document.getElementById(`${w}-token-status`).className="token-status")})}}else t.forEach(u=>{document.getElementById(`${u}-token-status`).textContent=""});setTimeout(()=>{t.every(w=>{const T=document.getElementById(`${w}-token-status`)?.textContent;return!T||T.includes("\u2713")})&&closeModal("token-management-modal")},1500)}),document.getElementById("token-cancel")?.addEventListener("click",()=>{closeModal("token-management-modal")}),document.getElementById("token-clear-all")?.addEventListener("click",async()=>{if(confirm("Clear all stored DNS credentials? This cannot be undone.")){n(),l().forEach(t=>{document.getElementById(`${t}-readonly-username`).value="",document.getElementById(`${t}-readonly-token`).value="",document.getElementById(`${t}-admin-username`).value="",document.getElementById(`${t}-admin-token`).value="",document.getElementById(`${t}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${t}-token-status`).className="token-status success"});try{await secureFetch("/api/v1/dns/credentials",{method:"DELETE"})}catch{}}}),window.getToken=d,window.getUsername=a,window.setToken=p,window.setUsername=s,window.getAllCredentials=e,window.getCredential=r,window.setCredential=h,window.getEncryptionKey=b,window.getDnsIds=l,window.getDnsDisplayName=o})(),(function(){function l(p,s,e=null){const n=document.getElementById(p+"-dot"),c=document.getElementById(p+"-pill"),t=document.getElementById(p+"-time"),i=document.querySelector(`[data-app="${p}"]`);n&&(n.classList.toggle("ok",s),n.classList.toggle("bad",!s)),c&&(c.textContent=s?"ON":"OFF",c.classList.toggle("on",s),c.classList.toggle("off",!s)),t&&e!==null&&(t.textContent=s?`${e}ms`:"timeout",t.className=`response-time ${o(e,s)}`),i&&i.setAttribute("data-status",s?"on":"off")}function o(p,s){return s?p<200?"excellent":p<500?"good":p<1e3?"fair":"slow":"timeout"}async function m(p){const s=performance.now();try{const e=await fetch("/probe/"+p,{cache:"no-store"}),n=performance.now(),c=Math.round(n-s);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:c}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-s)}}}window.APPS=[];let b=null,f=!1;async function v(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const p=await fetch("/api/v1/services",{cache:"no-store"});if(p.ok){const s=await p.json();window.APPS=s.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",p.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(p){console.error("Failed to load services:",p),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function g(p){const s=window.APPS?.find(n=>n.id===p);if(s?.url)return s.url.startsWith("http")?s.url:"https://"+s.url;if(s?.isExternal&&s.externalUrl)return s.externalUrl;const e=SITE.dnsServers?.[p];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(p)}function r(p,s,e){const n=document.createElement(p);return s&&(n.className=s),e&&(n.textContent=e),n}function h(){const p=document.getElementById("cards");p.innerHTML="";for(let s=0;s<window.APPS.length;s++){const e=window.APPS[s];if(e.id==="ca")continue;const n=r("div","card");n.setAttribute("data-app",e.id),n.setAttribute("data-status","off"),e.containerId&&n.setAttribute("data-container-id",e.containerId),e.category&&n.setAttribute("data-category",e.category),e.recipeId&&n.setAttribute("data-recipe-id",e.recipeId);const c=r("span","dot bad at-bl");c.id="dot-"+e.id+"-grid",n.appendChild(c);const t=r("div","row"),i=r("div","logo-wrap"),y=document.createElement("img");y.src=e.logo,y.alt=e.name,y.className="logo-img",y.onerror=function(){let E=e.id||e.appTemplate;if(!E&&e.name&&(E=e.name.toLowerCase().replace(/\s+/g,"-")),E){const S=[`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E.toLowerCase()}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E.replace(/-/g,"")}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${e.name.toLowerCase().replace(/\s+/g,"-")}.png`],A=[...new Set(S)],O=A.indexOf(this.src)+1;O<A.length?this.src=A[O]:this.style.display="none"}else this.style.display="none"},i.appendChild(y),t.appendChild(i);const u=r("span","name",e.name);if(t.appendChild(u),e.tailscaleOnly){const E=r("span","ts-badge","\u{1F510}");E.title="Tailscale-only access",E.style.cssText="margin-left: 6px; font-size: 0.75rem; opacity: 0.8;",u.appendChild(E)}if(e.category){const S=(typeof DC<"u"&&DC.CATEGORIES||window.DC_CATEGORIES||{})[e.category]||{},A=r("span","cat-badge",`${S.icon||""} ${e.category}`.trim());A.title=`Category: ${e.category}`,A.style.cssText=`margin-left: 6px; font-size: 0.65rem; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, ${S.color||"#7f8c8d"} 25%, transparent); color: ${S.color||"#7f8c8d"}; border: 1px solid color-mix(in srgb, ${S.color||"#7f8c8d"} 50%, transparent); white-space: nowrap; font-weight: 500;`,u.appendChild(A)}t.appendChild(r("span","spacer"));const w=r("span","badge off","OFF");w.id="badge-"+e.id,t.appendChild(w);const T=r("span","update-available-badge","UPDATE");T.id="update-badge-"+e.id,T.title="Update available",t.appendChild(T),n.appendChild(t);const L=r("div","response-row"),P=r("span","response-time","--");P.id="time-"+e.id,L.appendChild(P),n.appendChild(L);const C=r("div","health-row");C.id="health-"+e.id;const B=r("span","uptime-chip","--");B.id="uptime-"+e.id,C.appendChild(B);const $=document.createElement("div");$.className="uptime-mini-bar";const k=document.createElement("div");k.className="fill",k.id="uptime-bar-"+e.id,k.style.width="0%",$.appendChild(k),C.appendChild($),n.appendChild(C);const x=r("div","btn-row");if(e.containerId){const E=r("button","logs-btn","\u{1F4CB}");E.title="View container logs",E.onclick=D=>{D.stopPropagation(),window.openContainerLogsModal(e.containerId,e.name)},x.appendChild(E);const S=r("button","update-btn","\u2B06\uFE0F");S.title="Update container to latest version",S.id=`update-btn-${e.id}`,S.onclick=D=>{D.stopPropagation(),window.updateContainer(e.containerId,e.name,e.id)},x.appendChild(S);const A=r("button","exec-btn",">_");A.title="Open terminal",A.onclick=D=>{D.stopPropagation(),window.openExecModal&&window.openExecModal(e.containerId,e.name)},x.appendChild(A)}if(e.logPath&&!e.containerId){const E=r("button","logs-btn","\u{1F4CB}");E.title="View application logs",E.onclick=S=>{S.stopPropagation(),window.openFileLogsModal(e.logPath,e.name)},x.appendChild(E)}if(e.isExternal||e.appTemplate||e.url){const E=r("button","creds-btn","\u{1F511}");E.title="Auto-login credentials",E.id=`creds-btn-${e.id}`,E.onclick=S=>{S.stopPropagation(),window.openServiceCredsModal(e)},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","options-btn","\u2699\uFE0F");E.title="Edit service settings",E.onclick=S=>{S.stopPropagation(),window.openServiceEditModal(e)},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","share-btn","\u{1F517}");E.title="Share this service (Pro)",E.onclick=S=>{S.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(e):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","delete-btn","\u{1F5D1}\uFE0F");E.title="Delete this service",E.onclick=S=>{S.stopPropagation(),window.deleteService(e.id,e.name)},x.appendChild(E)}const I=r("button",null,"Open");I.onclick=()=>window.open(g(e.id),"_blank","noopener"),x.appendChild(I),n.appendChild(x),n.style.transitionDelay=`${Math.min(s*45,270)}ms`,p.appendChild(n)}requestAnimationFrame(()=>{p.querySelectorAll(".card").forEach(s=>s.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function d(p,s,e=null){const n=document.getElementById("dot-"+p+"-grid"),c=document.getElementById("badge-"+p),t=document.getElementById("time-"+p),i=document.querySelector(`[data-app="${p}"]`);n&&(n.classList.toggle("ok",s),n.classList.toggle("bad",!s)),c&&(c.textContent=s?"ON":"OFF",c.classList.toggle("on",s),c.classList.toggle("off",!s)),t&&e!==null&&(t.textContent=s?`${e}ms`:"timeout",t.className=`response-time ${o(e,s)}`),i&&i.setAttribute("data-status",s?"on":"off")}async function a(){if(b)return f=!0,b;function p(n,c=new Date){const t=document.getElementById("stamp");t&&(t.textContent=`${n}: ${new Date(c).toLocaleTimeString()}`)}function s(n){Object.keys(SITE.dnsServers).forEach(t=>{const i=n[t];i&&l(t,i.isUp,i.responseTime)}),n.internet&&l("internet",n.internet.isUp,n.internet.responseTime),window.APPS.forEach(t=>{const i=n[t.id];i&&d(t.id,i.isUp,i.responseTime)})}async function e(){const n=Object.keys(SITE.dnsServers),c=n.map(u=>m(u));c.push(m("internet"));const t=await Promise.all(c);n.forEach((u,w)=>l(u,t[w].isUp,t[w].responseTime));const i=t[t.length-1];l("internet",i.isUp,i.responseTime),(await Promise.all(window.APPS.map(async u=>{const w=await m(u.id);return{id:u.id,...w}}))).forEach(u=>{d(u.id,u.isUp,u.responseTime)})}return b=(async()=>{try{const n=await fetch("/api/v1/services/status",{cache:"no-store"});if(n.status===401||n.status===403)throw window._dcAuthLost=!0,new Error(`Authentication required (${n.status})`);if(!n.ok)throw new Error(`Status refresh failed (${n.status})`);window._dcAuthLost=!1;const c=await n.json();s(c.statuses||{}),p("last check",c.checkedAt||new Date)}catch(n){console.warn("Batched status refresh failed, falling back to direct probes:",n);try{await e(),p("last check")}catch(c){console.error("Dashboard refresh failed:",c),p("last failed")}}finally{b=null,f&&(f=!1,setTimeout(()=>{window.refreshAll()},0))}})(),b}document.querySelector(".top")?.addEventListener("click",p=>{const s=p.target.closest('[id$="-open"]');if(!s)return;const e=s.id.replace("-open","");SITE.dnsServers[e]&&window.open(g(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(g("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",p=>{p.stopPropagation();const s=window.APPS.find(e=>e.id==="ca");s&&window.openServiceCredsModal&&window.openServiceCredsModal(s)}),document.getElementById("options-btn-ca")?.addEventListener("click",p=>{p.stopPropagation();const s=window.APPS.find(e=>e.id==="ca");s&&window.openServiceEditModal&&window.openServiceEditModal(s)}),document.getElementById("delete-btn-ca")?.addEventListener("click",p=>{p.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=v,window.buildGrid=h,window.refreshAll=a,window.setQuick=l,window.setBadge=d,window.getResponseTimeClass=o,window.checkServiceWithTiming=m,window.serviceUrl=g,window.el=r})(),(function(){async function l(r){const d=await(await secureFetch(`/api/v1/dns/restart/${r}`,{method:"POST"})).json();if(!d.success)throw new Error(d.error||"Restart failed");return d}document.querySelector(".top")?.addEventListener("click",async r=>{const h=r.target.closest('[id$="-restart"]');if(!h)return;const d=h.id.replace("-restart","");if(SITE.dnsServers[d]&&confirm(`Restart ${d.toUpperCase()} service?`))try{await withButton(h,"...",()=>l(d)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(a){showNotification("Restart failed: "+a.message,"error")}});async function o(r,h){const d=document.getElementById(`${r}-update`),a=d?.textContent||"\u2B06\uFE0F";try{d.textContent="\u{1F50D}",d.disabled=!0,d.title="Checking for updates...";const s=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(h)}`)).json();if(!s.success)throw new Error(s.error||"Failed to check for updates");if(!s.updateAvailable){d.textContent="\u2705",d.title=`Already on latest version (${s.currentVersion})`,showNotification(`${r.toUpperCase()} is already up to date! Current version: ${s.currentVersion}`,"info"),setTimeout(()=>{d.textContent=a,d.disabled=!1,d.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${r.toUpperCase()}!
Current: ${s.currentVersion}
New: ${s.updateVersion}
`+(s.updateTitle?`${s.updateTitle}
`:"")+`The DNS server will restart during the update.
Proceed?`)){d.textContent=a,d.disabled=!1,d.title="Update DNS server";return}d.textContent="\u{1F504}",d.title="Updating...";const c=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(h)}`,{method:"POST"})).json();if(!c.success)throw new Error(c.error||"Update failed");if(c.manualUpdateRequired){d.textContent="\u2B06\uFE0F",d.title=`Update available: ${c.newVersion}`;const t=c.downloadLink?`
Download: ${c.downloadLink}`:"",i=c.instructionsLink?`
Instructions: ${c.instructionsLink}`:"";showNotification(`${r.toUpperCase()} update requires manual installation. Current: ${c.previousVersion} \u2192 ${c.newVersion}. Please update manually on the host machine.`,"warning",8e3),d.disabled=!1;return}d.textContent="\u2705",d.title="Updated successfully!",showNotification(`${r.toUpperCase()} updated successfully! ${c.previousVersion} \u2192 ${c.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{d.textContent=a,d.disabled=!1,d.title="Update DNS server",window.refreshAll()},1e4)}catch(p){console.error("DNS update error:",p),d.textContent="\u274C",d.title="Update failed",showNotification(`Failed to update ${r.toUpperCase()}: ${p.message}`,"error"),setTimeout(()=>{d.textContent=a,d.disabled=!1,d.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",r=>{const h=r.target.closest('[id$="-update"]');if(!h)return;const d=h.id.replace("-update","");SITE.dnsServers[d]&&o(d,SITE.dnsServers[d]?.ip)}),injectModal("dns-settings-modal",`
<div id="dns-settings-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3 id="dns-settings-title">DNS Settings</h3>
<div style="display: grid; gap: 16px; margin-top: 16px;">
<div>
<label for="dns-edit-ip" class="form-label-accent-sm">Server IP</label>
<input type="text" id="dns-edit-ip" class="form-input-md" placeholder="192.168.1.1" />
</div>
<div>
<label for="dns-edit-port" class="form-label-accent-sm">Port</label>
<input type="number" id="dns-edit-port" class="form-input-md" placeholder="5380" />
</div>
<div>
<label for="dns-edit-name" class="form-label-accent-sm">Display Name (optional)</label>
<input type="text" id="dns-edit-name" class="form-input-md" placeholder="e.g. Primary DNS" />
</div>
<div class="form-hint-sm">Manage credentials via Tokens in the toolbar</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 24px;">
<button id="dns-settings-cancel">Cancel</button>
<button id="dns-settings-delete" style="background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">Remove</button>
<button id="dns-settings-save" class="btn-accent">Save</button>
</div>
</div>
</div>`);let m=null;function b(r){m=r;const h=SITE.dnsServers[r]||{},d=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(h.name||r).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=h.ip||"",document.getElementById("dns-edit-port").value=h.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=h.name||"",d.classList.add("show")}async function f(){if(!m)return;const r=document.getElementById("dns-edit-ip").value.trim(),h=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,d=document.getElementById("dns-edit-name").value.trim();if(!r){showNotification("Server IP is required","warning");return}const a={dnsServers:{}};a.dnsServers[m]={ip:r,port:String(h)},d&&(a.dnsServers[m].name=d);try{const s=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})).json();s.success?(SITE.dnsServers[m]=a.dnsServers[m],showNotification(`${m.toUpperCase()} settings saved`,"success"),g(),window.refreshAll()):showNotification(s.error||"Failed to save settings","error")}catch(p){showNotification("Failed to save: "+p.message,"error")}}async function v(){if(m&&confirm(`Remove ${m.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const h=await(await secureFetch("/api/v1/config")).json();h.dnsServers&&delete h.dnsServers[m];const a=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:h.dnsServers||{}})})).json();if(a.success){delete SITE.dnsServers[m];const p=document.querySelector(`.top [data-app="${m}"]`);p&&p.remove(),showNotification(`${m.toUpperCase()} removed from dashboard`,"success"),g()}else showNotification(a.error||"Failed to remove","error")}catch(r){showNotification("Failed to remove: "+r.message,"error")}}function g(){closeModal("dns-settings-modal"),m=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",g),document.getElementById("dns-settings-save")?.addEventListener("click",f),document.getElementById("dns-settings-delete")?.addEventListener("click",v),document.getElementById("dns-settings-modal")?.addEventListener("click",r=>{r.target.id==="dns-settings-modal"&&g()}),document.querySelector(".top")?.addEventListener("click",r=>{const h=r.target.closest('[id$="-settings"]');if(!h)return;const d=h.id.replace("-settings","");SITE.dnsServers[d]&&(r.stopPropagation(),b(d))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",`
<div id="logs-modal" class="logs-modal">
<div class="logs-modal-content" style="min-width: 800px; max-width: 1000px;">
<div class="logs-header">
<h3 id="logs-title">DNS Logs</h3>
<div class="logs-controls">
<label for="log-lines">Show:</label>
<select id="log-lines">
<option value="25" selected>25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="200">200</option>
</select>
<button id="logs-stream" class="stream-btn" title="Enable real-time streaming">\u{1F4E1} Live</button>
<button id="logs-pause" class="pause-btn">\u23F8\uFE0F Pause</button>
<button id="logs-close" class="close-btn">\u2715</button>
</div>
</div>
<div class="logs-container scroll-container">
<div id="logs-content" class="logs-content">
<div class="logs-loading">Loading logs...</div>
</div>
</div>
</div>
</div>`);let l=null,o=null,m=!1,b=null,f=null,v=!1,g=null,r=null,h=!1,d=null,a=!1;async function p(k,x=25){try{const I=getDnsServerAddr(k),E=await fetch(`/api/v1/dns/logs?server=${I}&limit=${x}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,server:S.server}:{error:S.error||"Failed to fetch logs"}}else return E.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${E.status}`}}catch(I){return console.error("DNS logs fetch failed:",I),{error:I.message}}}function s(k){return{NoError:"var(--ok-fg)",NOERROR:"var(--ok-fg)",NxDomain:"var(--muted)",NXDOMAIN:"var(--muted)",Refused:"var(--bad-fg)",REFUSED:"var(--bad-fg)",ServerFailure:"#f39c12",SERVFAIL:"#f39c12"}[k]||"var(--fg)"}function e(k){const x=document.createElement("div");if(x.className="log-entry",x.style.cssText="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: center;",k.parsed===!1)return x.style.gridTemplateColumns="1fr",x.innerHTML=`<span style="color: var(--muted); font-family: monospace; font-size: 0.75rem;">${escapeHtml(k.raw)}</span>`,x;const I=s(k.rcode),E=k.rcode==="Refused"||k.rcode==="REFUSED";return x.innerHTML=`
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(k.timestamp)}</span>
<span style="color: var(--accent); font-size: 0.75rem;" title="${escapeHtml(k.client)}">${escapeHtml(k.client)}</span>
<span style="font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; ${E?"text-decoration: line-through; opacity: 0.6;":""}" title="${escapeHtml(k.domain)}">${escapeHtml(k.domain)}</span>
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(k.type)}</span>
<span style="color: ${I}; font-weight: 500; font-size: 0.75rem;">${escapeHtml(k.rcode)}</span>
`,x}async function n(){if(h){await B();return}if(v){await T();return}if(m||!l)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await p(l,k);if(I.error){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(I.error)}</div>
</div>`;return}x.innerHTML=`
<div style="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span>Time</span>
<span>Client</span>
<span>Domain</span>
<span>Type</span>
<span>Status</span>
</div>`,I.logs&&I.logs.length>0?I.logs.forEach(E=>{const S=e(E);x.appendChild(S)}):x.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No DNS queries logged yet
</div>`}catch(I){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(I.message)}
</div>`}}function c(k){l=k,m=!1,v=!1;const x=document.getElementById("logs-modal"),I=document.getElementById("logs-title"),E=document.getElementById("logs-pause"),S=document.getElementById("logs-stream");I.textContent=`${k.toUpperCase()} DNS Logs`,E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),S&&(S.style.display="none"),x.classList.add("show"),n(),o=setInterval(n,DC.POLL.LOGS)}function t(){document.getElementById("logs-modal").classList.remove("show"),o&&(clearInterval(o),o=null),y(),l=null,v=!1,b=null,f=null,h=!1,g=null,r=null,m=!1}function i(k){d&&y();const x=document.getElementById("logs-stream"),I=document.getElementById("logs-pause"),E=document.getElementById("logs-content");o&&(clearInterval(o),o=null);try{d=new EventSource(`/api/v1/logs/stream/${k}`),a=!0,x.classList.add("active"),x.textContent="\u{1F534} Live",x.title="Streaming - click to stop",I.style.display="none";const S=document.getElementById("logs-title");S.textContent.includes("\u{1F534}")||(S.innerHTML=S.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),d.onmessage=A=>{try{const D=JSON.parse(A.data);if(D.error){console.error("Stream error:",D.error),y();return}const O=document.createElement("div");O.className="log-entry",O.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const R=(D.stream||"stdout")==="stderr",N=R?"var(--bad-fg)":"var(--fg)",M=`<span style="background: ${R?"var(--bad-bg)":"var(--ok-bg)"}; color: ${N}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${R?"STDERR":"STDOUT"}</span>`;for(O.innerHTML=`
<div style="flex-shrink: 0;">${M}</div>
<div style="flex: 1; color: ${N}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(D.text)}</div>
`,E.appendChild(O),E.scrollTop=E.scrollHeight;E.children.length>500;)E.removeChild(E.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},d.onerror=A=>{console.error("EventSource error:",A),y()}}catch(S){console.error("Failed to start streaming:",S),y()}}function y(){d&&(d.close(),d=null),a=!1;const k=document.getElementById("logs-stream"),x=document.getElementById("logs-pause"),I=document.getElementById("logs-title");k&&(k.classList.remove("active"),k.textContent="\u{1F4E1} Live",k.title="Enable real-time streaming"),x&&(x.style.display=""),I&&(I.textContent=I.textContent.replace(" \u{1F534}","")),v&&b&&!o&&(o=setInterval(T,DC.POLL.LOGS))}async function u(k,x=100){try{const I=`/api/v1/logs/container/${k}?tail=${x}&timestamps=true`,E=await fetch(I,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,containerName:S.containerName,containerId:S.containerId}:{error:S.error||"Failed to fetch container logs"}}else return{error:`HTTP ${E.status}: ${E.statusText}`}}catch(I){return console.error("Container logs fetch failed:",I),{error:I.message}}}function w(k){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const I=k.stream==="stderr"?"var(--bad-fg)":"var(--fg)",E=k.stream==="stderr"?'<span style="background: var(--bad-bg); color: var(--bad-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDERR</span>':'<span style="background: var(--ok-bg); color: var(--ok-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDOUT</span>';return x.innerHTML=`
<div style="flex-shrink: 0;">${E}</div>
<div style="flex: 1; color: ${I}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(k.text)}</div>
`,x}async function T(){if(m||!b||!v)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await u(b,k);if(I.error){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(I.error)}</div>
</div>`;return}x.innerHTML=`
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span style="flex-shrink: 0; width: 80px;">Stream</span>
<span style="flex: 1;">Log Output</span>
</div>`,I.logs&&I.logs.length>0?(I.logs.forEach(E=>{const S=w(E);x.appendChild(S)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No logs available for this container
</div>`}catch(I){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(I.message)}
</div>`}}function L(k,x){b=k,f=x,v=!0,h=!1,m=!1,y();const I=document.getElementById("logs-modal"),E=document.getElementById("logs-title"),S=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");E.textContent=`\u{1F4CB} ${x} - Container Logs`,S.textContent="\u23F8\uFE0F Pause",S.classList.remove("paused"),A&&(A.style.display=""),I.classList.add("show"),T(),o=setInterval(T,DC.POLL.LOGS)}async function P(k,x=100){try{const I=`/api/v1/logs/file?path=${encodeURIComponent(k)}&tail=${x}`,E=await fetch(I,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,logPath:S.logPath,totalLines:S.totalLines}:{error:S.error||"Failed to fetch file logs"}}else return{error:(await E.json().catch(()=>({}))).error||`HTTP ${E.status}`}}catch(I){return console.error("File logs fetch failed:",I),{error:I.message}}}function C(k){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const I=k.text;let E="INFO",S="var(--fg)";I.match(/ERROR|FATAL|CRITICAL/i)?(E="ERROR",S="var(--bad-fg)"):I.match(/WARN|WARNING/i)?(E="WARN",S="#f39c12"):I.match(/DEBUG/i)&&(E="DEBUG",S="var(--muted)");const D=`<span style="background: ${S==="var(--bad-fg)"?"var(--bad-bg)":"var(--ok-bg)"}; color: ${S}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${E}</span>`;return x.innerHTML=`
<div style="flex-shrink: 0;">${D}</div>
<div style="flex: 1; color: ${S}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(I)}</div>
`,x}async function B(){if(m||!g||!h)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await P(g,k);if(I.error){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(I.error)}</div>
</div>`;return}x.innerHTML=`
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span style="flex: 1;">Log Output (${I.count} of ${I.totalLines} lines)</span>
</div>`,I.logs&&I.logs.length>0?(I.logs.forEach(E=>{const S=C(E);x.appendChild(S)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No logs available in this file
</div>`}catch(I){x.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(I.message)}
</div>`}}function $(k,x){g=k,r=x,h=!0,v=!1,m=!1;const I=document.getElementById("logs-modal"),E=document.getElementById("logs-title"),S=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");E.textContent=`\u{1F4CB} ${x} - Application Logs`,S.textContent="\u23F8\uFE0F Pause",S.classList.remove("paused"),A&&(A.style.display="none"),I.classList.add("show"),B(),o=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",k=>{const x=k.target.closest('[id$="-logs"]');if(!x)return;const I=x.id.replace("-logs","");SITE.dnsServers[I]&&c(I)}),document.getElementById("logs-close")?.addEventListener("click",t),document.getElementById("logs-pause")?.addEventListener("click",()=>{m=!m;const k=document.getElementById("logs-pause");m?(k.textContent="\u25B6\uFE0F Resume",k.classList.add("paused")):(k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),n())}),document.getElementById("log-lines")?.addEventListener("change",()=>{m||n()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!v||!b||(a?y():i(b))}),document.getElementById("logs-modal")?.addEventListener("click",k=>{k.target.id==="logs-modal"&&t()}),document.addEventListener("keydown",k=>{k.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&t()}),window.openContainerLogsModal=L,window.openFileLogsModal=$,window.openLogsModal=c})(),(function(){injectModal("service-edit-modal",`
<div id="service-edit-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
<h3 id="service-edit-title">Edit Service</h3>
<div style="display: grid; gap: 16px; margin-top: 16px;">
<!-- Service Info -->
<div style="display: flex; align-items: center; gap: 12px; padding: 12px; background: var(--card-bg); border-radius: 8px;">
<img id="edit-service-logo-preview" src="" alt="" style="width: 48px; height: 48px; border-radius: 8px; object-fit: contain; background: var(--bg);" />
<div style="flex: 1;">
<div id="edit-service-url-display" class="text-muted-sm"></div>
</div>
</div>
<!-- Display Name -->
<div>
<label for="edit-service-name" class="form-label-accent-sm">
Display Name
</label>
<input type="text" id="edit-service-name" class="form-input-md" placeholder="Service name shown on dashboard" />
</div>
<!-- Subdomain -->
<div>
<label for="edit-subdomain" class="form-label-accent-sm">
Subdomain
</label>
<div class="flex-row-gap-center">
<input type="text" id="edit-subdomain" class="input-flex" />
<span id="edit-tld-suffix" style="color: var(--muted);">.home</span>
</div>
</div>
<!-- Port -->
<div>
<label for="edit-port" class="form-label-accent-sm">
Port
</label>
<input type="number" id="edit-port" class="form-input-md" />
<div class="form-hint-sm">
The port Caddy will proxy to (container's exposed port)
</div>
</div>
<!-- IP Address -->
<div>
<label for="edit-ip" class="form-label-accent-sm">
IP Address
</label>
<input type="text" id="edit-ip" class="form-input-md" />
</div>
<!-- Tailscale Protection -->
<div>
<label style="display: flex; align-items: center; gap: 10px; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer;">
<input type="checkbox" id="edit-tailscale-only" style="width: 18px; height: 18px;" />
<div>
<div class="fw-500">Tailscale-Only Access</div>
<div class="text-hint">Restrict this service to Tailscale users only</div>
</div>
</label>
</div>
<!-- Logo -->
<div>
<label class="form-label-accent-sm">
Service Logo
</label>
<div class="flex-row-gap-center">
<input type="text" id="edit-logo-url" placeholder="/assets/service.png or https://..." class="input-flex" />
<label style="padding: 10px 16px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; white-space: nowrap;">
<input type="file" id="edit-logo-file" accept="image/*" style="display: none;" />
Upload
</label>
</div>
<div class="form-hint-sm">
Enter a URL or upload an image file (PNG, JPG, SVG)
</div>
</div>
<!-- Category -->
<div>
<label for="edit-service-category" class="form-label-accent-sm">
Category
</label>
<select id="edit-service-category" data-role="service-category" class="form-input-md">
<option value="">\u2014 No category \u2014</option>
</select>
</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 24px;">
<button id="service-edit-cancel">Cancel</button>
<button id="service-edit-save" class="btn-accent">
Save Changes
</button>
</div>
</div>
</div>`),injectModal("delete-service-modal",`
<div id="delete-service-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 400px; max-width: 500px;">
<h3 id="delete-modal-title" class="mb-16">Delete Service</h3>
<div id="delete-modal-message" style="margin-bottom: 20px; line-height: 1.5;">
<!-- Dynamic content -->
</div>
<div id="delete-modal-container-info" style="display: none; margin-bottom: 20px; padding: 12px; background: var(--card-bg); border-radius: 8px; border: 1px solid var(--border);">
<div style="font-weight: 500; margin-bottom: 8px;">Docker Container</div>
<div id="delete-modal-container-name" style="font-size: 0.9rem; color: var(--muted);"></div>
</div>
<div class="weather-modal-buttons" style="display: flex; gap: 8px; justify-content: flex-end;">
<button id="delete-modal-cancel" style="padding: 10px 20px;">Cancel</button>
<button id="delete-modal-remove" style="padding: 10px 20px; background: color-mix(in srgb, var(--accent) 20%, transparent); border-color: var(--accent); color: var(--accent);">
Remove
</button>
<button id="delete-modal-delete" style="display: none; padding: 10px 20px; background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">
Delete
</button>
</div>
<div id="delete-modal-help" style="display: none; margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--muted) 10%, transparent); border-radius: 8px; font-size: 0.85rem; color: var(--muted);">
<div><strong>Remove:</strong> Remove from dashboard only (container keeps running)</div>
<div style="margin-top: 6px;"><strong>Delete:</strong> Full removal - stops container, removes DNS & Caddy config</div>
</div>
</div>
</div>`),injectModal("add-service-modal",`
<div id="add-service-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3>Add Service</h3>
<!-- Service Type Tabs -->
<div style="display: flex; gap: 2px; margin-bottom: 16px; background: var(--card-bg); border-radius: 8px; padding: 3px; border: 1px solid var(--border);">
<label id="tab-local" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; background: var(--accent); color: var(--bg); transition: all 0.15s;">
<input type="radio" name="service-type" value="local" id="service-type-local" checked style="display: none;" />
Local
</label>
<label id="tab-external" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; color: var(--muted); transition: all 0.15s;">
<input type="radio" name="service-type" value="external" id="service-type-external" style="display: none;" />
External
</label>
</div>
<span id="service-type-description" style="display: none;"></span>
<!-- LOCAL SERVICE -->
<div id="local-service-config" style="display: grid; gap: 12px;">
<div>
<label for="service-name-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
<input type="text" id="service-name-input" placeholder="e.g., Jellyfin" style="font-size: 1rem;" />
<div id="subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
</div>
<div class="grid-2col">
<div>
<label for="service-port-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Port</label>
<input type="number" id="service-port-input" placeholder="e.g., 8096" style="font-size: 1rem;" />
</div>
<div>
<label for="service-ip-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">IP Address</label>
<input type="text" id="service-ip-input" placeholder="Auto-detected" style="font-size: 1rem;" />
<div class="quick-ip-buttons" style="display: flex; gap: 4px; margin-top: 4px; flex-wrap: wrap;">
<button type="button" class="quick-ip-btn" data-ip="127.0.0.1" title="Localhost" style="font-size: 0.7rem; padding: 2px 6px;">localhost</button>
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-lan" title="LAN IP" style="font-size: 0.7rem; padding: 2px 6px;">LAN</button>
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-tailscale" title="Tailscale IP" style="font-size: 0.7rem; padding: 2px 6px;">Tailscale</button>
</div>
</div>
</div>
<!-- Options (collapsed by default) -->
<details id="local-advanced-options">
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
<div class="grid-2col">
<div>
<label for="service-subdomain-input">Subdomain:</label>
<input type="text" id="service-subdomain-input" placeholder="auto-derived from name" />
</div>
<div>
<label for="service-logo-input">Logo URL:</label>
<input type="text" id="service-logo-input" placeholder="/assets/name.png" />
</div>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; align-items: start;">
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="create-dns-record" checked />
Create DNS Record
</label>
<div>
<label for="ssl-type-select">SSL:</label>
<select id="ssl-type-select" style="width: 100%;">
<option value="caddy-managed">Caddy Managed (Internal)</option>
<option value="letsencrypt">Let's Encrypt</option>
<option value="existing-ca">Existing CA</option>
<option value="custom-ca">Custom CA</option>
</select>
</div>
</div>
<div id="dns-config">
<div class="grid-2col">
<div>
<label for="dns-ttl-input">DNS TTL:</label>
<input type="number" id="dns-ttl-input" value="300" />
</div>
<div>
<label for="caddyfile-path-input">Caddyfile Path:</label>
<input type="text" id="caddyfile-path-input" value="C:\\caddy\\Caddyfile" />
</div>
</div>
</div>
<div id="existing-ca-config" style="display: none;">
<label for="existing-ca-select">Existing CA:</label>
<div class="flex-row-gap">
<select id="existing-ca-select" style="flex: 1;">
<option value="">Loading CAs...</option>
</select>
<button type="button" id="refresh-cas" style="padding: 4px 8px; font-size: 0.75rem;">\u{1F504}</button>
</div>
</div>
<div id="custom-ca-config" style="display: none;">
<label for="ca-name-input">CA Name:</label>
<input type="text" id="ca-name-input" placeholder="e.g., sami-ca" />
</div>
<div id="manual-tailscale-status" style="padding: 6px 10px; background: var(--card-bg); border-radius: 6px; font-size: 0.75rem;">
<span style="color: var(--muted);">Checking Tailscale...</span>
</div>
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
<input type="checkbox" id="manual-tailscale-only" />
Tailscale-Only Access
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="reload-caddy" checked />
Reload Caddy after adding
</label>
<!-- Category -->
<div>
<label for="service-category-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
<select id="service-category-input" data-role="service-category" style="width: 100%;">
<option value="">\u2014 No category \u2014</option>
</select>
<div style="font-size: 0.7rem; color: var(--muted); margin-top: 3px;">Group services on the dashboard by purpose (Media, Productivity, etc.)</div>
</div>
<hr style="border: none; border-top: 1px solid var(--border); margin: 4px 0;" />
<div class="grid-2col">
<div>
<label class="field-label-sm">
<input type="checkbox" id="enable-auth" />
Authentication
</label>
<label class="field-label-sm">
<input type="checkbox" id="enable-cors" />
CORS Headers
</label>
<label for="upstream-path-input">Upstream Path:</label>
<input type="text" id="upstream-path-input" value="/" />
</div>
<div>
<label for="health-check-input">Health Check:</label>
<input type="text" id="health-check-input" placeholder="/health" />
<label for="timeout-input">Timeout (s):</label>
<input type="number" id="timeout-input" value="30" />
<label for="custom-headers-input">Headers (JSON):</label>
<textarea id="custom-headers-input" placeholder='{"X-Custom": "value"}' rows="2" style="font-size: 0.7rem;"></textarea>
</div>
</div>
</div>
</details>
</div>
<!-- EXTERNAL SERVICE -->
<div id="external-service-config" style="display: none;">
<div style="display: grid; gap: 12px;">
<div>
<label for="external-service-name" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
<input type="text" id="external-service-name" placeholder="e.g., Radarr (Seedhost)" style="font-size: 1rem;" />
<div id="external-subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
</div>
<div>
<label for="external-service-url" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">External URL</label>
<input type="url" id="external-service-url" placeholder="https://username.seedhost.eu/radarr" style="font-size: 1rem;" />
</div>
<!-- Options (collapsed by default) -->
<details id="external-advanced-options">
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
<div class="grid-2col">
<div>
<label for="external-service-subdomain">Subdomain:</label>
<input type="text" id="external-service-subdomain" placeholder="auto-derived from name" />
<span id="external-domain-preview" style="font-size: 0.7rem; color: var(--accent);"></span>
</div>
<div>
<label for="external-service-logo">Logo URL:</label>
<input type="text" id="external-service-logo" placeholder="/assets/name.png" />
</div>
</div>
<div>
<label for="external-service-icon">Icon Emoji:</label>
<input type="text" id="external-service-icon" placeholder="\u{1F3AC}" maxlength="2" style="width: 60px;" />
</div>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-create-dns" checked />
Create DNS Record
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-create-caddy" checked />
Create Caddy Reverse Proxy
</label>
<div>
<label for="external-proxy-ip">Proxy Server IP:</label>
<input type="text" id="external-proxy-ip" placeholder="Auto-detected" />
</div>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-preserve-host" checked />
Preserve Host Header
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-follow-redirects" checked />
Follow Redirects
</label>
<!-- Category (external) -->
<div>
<label for="external-service-category" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
<select id="external-service-category" data-role="service-category" style="width: 100%;">
<option value="">\u2014 No category \u2014</option>
</select>
</div>
</div>
</details>
</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: flex-end;">
<button id="add-service-cancel">Cancel</button>
<button id="add-service-create" class="btn-accent">Create Service</button>
</div>
</div>
</div>`)})(),(function(){async function l(v){try{const g=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(v)}`);if(!g.ok)throw new Error(`Failed to load CAs: ${g.status}`);const r=await g.json();if(r.success){const h=document.getElementById("existing-ca-select");return h.innerHTML="",r.cas.length===0?h.innerHTML='<option value="">No CAs found in Caddyfile</option>':(h.innerHTML='<option value="">Select existing CA...</option>',r.cas.forEach(d=>{const a=document.createElement("option");typeof d=="object"?(a.value=d.id,a.textContent=d.displayName||d.name):(a.value=d,a.textContent=d),h.appendChild(a)})),r.data.cas}else throw new Error(r.message)}catch(g){console.error("Error loading CAs:",g);const r=document.getElementById("existing-ca-select");return r.innerHTML='<option value="">Error loading CAs</option>',[]}}function o(v){const{subdomain:g,port:r,ip:h,sslType:d,caName:a,existingCa:p,enableAuth:s,enableCors:e,customHeaders:n,upstreamPath:c,healthCheck:t,timeout:i,tailscaleOnly:y}=v;let u=`${buildDomain(g)} {
`;switch(y&&(u+=` @blocked not remote_ip 100.64.0.0/10
`,u+=` respond @blocked "Access denied. Tailscale connection required." 403
`),d){case"letsencrypt":break;case"caddy-managed":u+=` tls internal
`;break;case"existing-ca":p&&(u+=` tls {
ca ${p}
}
`);break;case"custom-ca":a&&(u+=` tls {
ca ${a}
}
`);break}if(s&&(u+=` basicauth {
admin $2a$14$hashed_password_here
}
`),e&&(u+=` header {
`,u+=` Access-Control-Allow-Origin "*"
`,u+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
`,u+=` Access-Control-Allow-Headers "Content-Type, Authorization"
`,u+=` }
`),n)try{const w=JSON.parse(n);u+=` header {
`,Object.entries(w).forEach(([T,L])=>{u+=` ${T} "${L}"
`}),u+=` }
`}catch{console.warn("Invalid JSON in custom headers")}return t&&(u+=` health_uri ${t}
`),u+=` reverse_proxy ${h}:${r} {
`,c&&c!=="/"&&(u+=` rewrite ${c}
`),i&&i!==30&&(u+=` transport http {
`,u+=` dial_timeout ${i}s
`,u+=` response_header_timeout ${i}s
`,u+=` }
`),u+=` }
`,u+=`}
`,u}async function m(v,g,r=DC.DEFAULTS.TTL){const h=window.getToken(getPrimaryDnsId(),"admin");if(!h)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const d=buildDomain(v),a=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:d,ip:g,ttl:r,token:h,server:SITE.dnsIp})});if(!a.ok){const s=await a.text();throw new Error(`DNS API Error: ${a.status} - ${s}`)}const p=await a.json();if(!p.success)throw new Error(`DNS Error: ${p.error||"Unknown error"}`);return p}async function b(v){const g={id:v.subdomain,name:v.name,logo:v.logo||`/assets/${v.subdomain}.png`};v.category&&(g.category=v.category),v.containerId&&(g.containerId=v.containerId);try{const r=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)});if(!r.ok){const h=await r.json();throw new Error(h.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),g}catch(r){throw console.error("Failed to add service to config:",r),r}}async function f(v){const g=document.getElementById("service-subdomain-input").value.trim(),r=document.getElementById("service-ip-input").value.trim()||"localhost",h=document.getElementById("service-port-input").value.trim()||"80",d=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(g),upstream:`${r}:${h}`,config:v})}),a=await d.json();if(!d.ok||!a.success)throw new Error(a.error||`Caddy API Error: ${d.status}`);return a}window.loadExistingCAs=l,window.generateCaddyConfig=o,window.createDnsRecord=m,window.addServiceToConfig=b,window.addToCaddyfile=f})(),(function(){let l=null;function o(r){l=r;const h=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${r.name}`,document.getElementById("edit-service-name").value=r.name,document.getElementById("edit-service-url-display").textContent=r.url||buildServiceUrl(r.id);const d=document.getElementById("edit-service-logo-preview"),a=r.logo||`/assets/${r.id}.png`;d.src=a,d.onerror=function(){this.style.display="none"},d.onload=function(){this.style.display=""},d.style.display="",document.getElementById("edit-subdomain").value=r.id,document.getElementById("edit-port").value=r.port||"",document.getElementById("edit-ip").value=r.ip||"localhost",document.getElementById("edit-tailscale-only").checked=r.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=r.logo||"";const p=document.getElementById("edit-service-category");p&&(p.dataset.current=r.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),h.classList.add("show")}function m(){closeModal("service-edit-modal"),l=null}async function b(){if(!l)return;const r=document.getElementById("edit-subdomain").value.trim().toLowerCase(),h=document.getElementById("edit-service-name").value.trim(),d=document.getElementById("edit-port").value.trim(),a=document.getElementById("edit-ip").value.trim()||"localhost",p=document.getElementById("edit-tailscale-only").checked,s=document.getElementById("edit-logo-url").value.trim(),e=document.getElementById("edit-service-category")?.value||"";if(!r){showNotification("Subdomain is required","warning");return}const n=l.id,c=[];if(r!==n&&c.push("subdomain"),h&&h!==l.name&&c.push("name"),d&&d!==String(l.port)&&c.push("port"),a!==l.ip&&c.push("ip"),p!==(l.tailscaleOnly||!1)&&c.push("tailscale"),s&&s!==l.logo&&c.push("logo"),e!==(l.category||"")&&c.push("category"),c.length===0){m();return}const t=document.getElementById("service-edit-save");t.textContent="Saving...",t.disabled=!0;try{const y=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:n,newSubdomain:r,name:h||l.name,port:d||l.port,ip:a,tailscaleOnly:p,logo:s||void 0,category:e})})).json();if(!y.success)throw new Error(y.error||"Failed to update service");const u=window.APPS.findIndex(w=>w.id===n);u!==-1&&(window.APPS[u]={...window.APPS[u],id:r,name:h||window.APPS[u].name,port:d||window.APPS[u].port,ip:a,tailscaleOnly:p,logo:s||window.APPS[u].logo,category:e||void 0}),m(),window.buildGrid(),window.refreshAll()}catch(i){console.error("Error saving service changes:",i),showNotification(`Error saving changes: ${i.message}`,"error")}finally{t.textContent="Save Changes",t.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async r=>{const h=r.target.files[0];if(!h)return;if(!h.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const d=new FileReader;d.onload=async a=>{const p=a.target.result;if(document.getElementById("edit-service-logo-preview").src=p,document.getElementById("edit-logo-url").value=p,l)try{const e=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${l.id}.png`,data:p})})).json();e.success&&e.path&&(document.getElementById("edit-logo-url").value=e.path)}catch{}},d.readAsDataURL(h)}),document.getElementById("service-edit-cancel")?.addEventListener("click",m),document.getElementById("service-edit-save")?.addEventListener("click",b),document.getElementById("service-edit-modal")?.addEventListener("click",r=>{r.target.id==="service-edit-modal"&&m()});function f(r,h,d){return new Promise(a=>{const p=document.getElementById("delete-service-modal"),s=document.getElementById("delete-modal-title"),e=document.getElementById("delete-modal-message"),n=document.getElementById("delete-modal-container-info"),c=document.getElementById("delete-modal-container-name"),t=document.getElementById("delete-modal-help"),i=document.getElementById("delete-modal-cancel"),y=document.getElementById("delete-modal-remove"),u=document.getElementById("delete-modal-delete");s.textContent=`Delete "${r}"`,h?(e.innerHTML="This service has an associated Docker container.<br>Choose how to proceed:",n.style.display="block",c.textContent=`Container ID: ${d?.slice(0,12)||"Unknown"}`,t.style.display="block",u.style.display="block"):(e.textContent="Remove this service from the dashboard?",n.style.display="none",t.style.display="none",u.style.display="none");const w=()=>{p.classList.remove("show"),i.removeEventListener("click",T),y.removeEventListener("click",L),u.removeEventListener("click",P),p.removeEventListener("click",C)},T=()=>{w(),a(null)},L=()=>{w(),a(!1)},P=()=>{w(),a(!0)},C=B=>{B.target===p&&(w(),a(null))};i.addEventListener("click",T),y.addEventListener("click",L),u.addEventListener("click",P),p.addEventListener("click",C),p.classList.add("show")})}async function v(r,h,d){const a=document.getElementById(`update-btn-${d}`),p=a?.textContent;if(confirm(`Update ${h} to the latest version?
This will:
1. Pull the latest image
2. Stop the container
3. Recreate with same settings
The service will be briefly unavailable.`))try{a&&(a.textContent="\u{1F504}",a.disabled=!0,a.title="Updating...");const e=await(await secureFetch(`/api/v1/containers/${r}/update`,{method:"POST"})).json();if(e.success){const n=window.APPS.find(c=>c.id===d);n&&e.newContainerId&&(n.containerId=e.newContainerId),a&&(a.textContent="\u2705",a.title="Updated successfully!",setTimeout(()=>{a.textContent=p,a.disabled=!1,a.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${h} updated successfully!`,"success")}else throw new Error(e.error||"Update failed")}catch(s){console.error("Update error:",s),a&&(a.textContent="\u274C",a.title="Update failed",setTimeout(()=>{a.textContent=p,a.disabled=!1,a.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${h}: ${s.message}`,"error")}}async function g(r,h){const d=window.APPS.find(u=>u.id===r),a=d?buildDomain(d.id):null,p=d?.containerId,s=await f(h||r,p,d?.containerId);if(s===null)return;let e={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(s&&p)try{const u=new URLSearchParams({containerId:d.containerId,subdomain:d.id,ip:d.ip||"localhost",deleteContainer:"true"}),T=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(d.id)}?${u.toString()}`,{method:"DELETE"})).json();T.success?e={...e,...T.results,dashboard:!1}:console.error("App removal failed:",T.error)}catch(u){console.error("App removal error:",u)}else if(s&&a){try{const u=d?.ip||"localhost",T=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(a)}&type=A&ipAddress=${encodeURIComponent(u)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();e.dns=T.success?"deleted":T.error||"failed"}catch(u){e.dns=u.message}try{const w=await(await secureFetch(`/api/v1/site/${encodeURIComponent(a)}`,{method:"DELETE"})).json();e.caddy=w.success||w.error&&w.error.includes("not found")?"removed":w.error||"failed"}catch(u){e.caddy=u.message}}const n=window.APPS.findIndex(u=>u.id===r);n>-1&&(window.APPS.splice(n,1),e.dashboard=!0);try{const u=safeGetJSON("custom-apps",[]),w=u.findIndex(T=>T.id===r);w>-1&&(u.splice(w,1),safeSet("custom-apps",JSON.stringify(u)))}catch{}try{const w=await(await secureFetch(`/api/v1/services/${encodeURIComponent(r)}`,{method:"DELETE"})).json();e.service=w.success?"removed":w.error||"failed"}catch(u){e.service=u.message}window.buildGrid(),window.refreshAll();let c=!1,t=[];e.dashboard||(c=!0,t.push("\u2717 Failed to remove from dashboard"));const i=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],y=u=>!u||i.some(w=>u.toLowerCase().includes(w.toLowerCase()));e.container&&!y(e.container)&&(c=!0,t.push(`\u26A0 Container: ${e.container}`)),e.dns&&!y(e.dns)&&(c=!0,t.push(`\u26A0 DNS Record: ${e.dns}`)),e.caddy&&!y(e.caddy)&&(c=!0,t.push(`\u26A0 Caddy Config: ${e.caddy}`)),e.service&&!y(e.service)&&(c=!0,t.push(`\u26A0 Service File: ${e.service}`)),c&&showNotification(`Error deleting "${h||r}": ${t.join(", ")}`,"error",6e3)}window.openServiceEditModal=o,window.showDeleteModal=f,window.updateContainer=v,window.deleteService=g})(),(function(){function l(e){return e.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"")}function o(){return SITE.defaults?.sslType||(SITE.configurationType==="public"?"letsencrypt":"caddy-managed")}function m(){const e=document.getElementById("service-subdomain-input").value||"subdomain",n=document.getElementById("service-ip-input").value||b.lan||"localhost",c=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,t=document.getElementById("ssl-type-select").value,i=document.getElementById("ca-name-input").value||"sami-ca",y=document.getElementById("existing-ca-select").value,u=document.getElementById("enable-auth").checked,w=document.getElementById("enable-cors").checked,T=document.getElementById("custom-headers-input").value,L=document.getElementById("upstream-path-input").value||"/",P=document.getElementById("health-check-input").value,C=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(e)} \u2192 ${n}`);const $=document.getElementById("url-preview");$&&($.textContent=buildServiceUrl(e));const k={subdomain:e,port:c,ip:n,sslType:t,caName:i,existingCa:y,enableAuth:u,enableCors:w,customHeaders:T,upstreamPath:L,healthCheck:P,timeout:C},x=window.generateCaddyConfig(k),I=document.getElementById("caddy-config-preview");I&&(I.value=x)}const b={localhost:"127.0.0.1",lan:"",tailscale:""};async function f(){try{const t=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(t.ok){const i=await t.json();i.lan&&(b.lan=i.lan),i.tailscale&&(b.tailscale=i.tailscale)}}catch{}const e=document.getElementById("quick-ip-lan"),n=document.getElementById("quick-ip-tailscale");e&&(b.lan?(e.dataset.ip=b.lan,e.textContent=`LAN (${b.lan})`,e.title=`LAN IP: ${b.lan}`):e.style.display="none"),n&&(b.tailscale?(n.dataset.ip=b.tailscale,n.textContent=`Tailscale (${b.tailscale})`,n.title=`Tailscale IP: ${b.tailscale}`):n.style.display="none");const c=document.getElementById("service-ip-input");c&&!c.value&&b.lan&&(c.value=b.lan)}function v(){document.querySelectorAll(".quick-ip-btn").forEach(e=>{e.addEventListener("click",()=>{const n=e.dataset.ip;n&&(document.getElementById("service-ip-input").value=n,document.querySelectorAll(".quick-ip-btn").forEach(c=>c.classList.remove("active")),e.classList.add("active"),m())})}),document.getElementById("service-ip-input")?.addEventListener("input",e=>{const n=e.target.value;document.querySelectorAll(".quick-ip-btn").forEach(c=>{c.classList.toggle("active",c.dataset.ip===n)})})}async function g(){const e=document.getElementById("add-service-modal");e.classList.add("show");const n=e.querySelector(".weather-modal-content");n&&(n.scrollTop=0),document.body.style.overflow="hidden";const c=document.getElementById("ssl-type-select");c&&(c.value=o()),await f();const t=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(t);const i=document.getElementById("manual-tailscale-status"),y=document.getElementById("manual-tailscale-only");try{const w=await(await fetch("/api/v1/tailscale/status")).json();w.success&&w.installed&&w.connected?(i.innerHTML=`
<span style="color: #4caf50;">\u2713 Connected</span>
<span style="color: var(--muted); margin-left: 6px;">${w.self?.hostname} (${w.self?.ip})</span>
`,y.disabled=!1):w.installed?(i.innerHTML='<span style="color: #ff9800;">\u26A0 Not connected</span>',y.disabled=!0):(i.innerHTML='<span style="color: var(--muted);">Not available</span>',y.disabled=!0)}catch{i.innerHTML='<span style="color: var(--muted);">Could not check</span>',y.disabled=!0}y.checked=!1,m()}function r(){const e=document.getElementById("service-type-local"),n=document.getElementById("service-type-external"),c=document.getElementById("local-service-config"),t=document.getElementById("external-service-config"),i=document.getElementById("tab-local"),y=document.getElementById("tab-external");function u(){e.checked?(c.style.display="grid",t.style.display="none",i&&(i.style.background="var(--accent)",i.style.color="var(--bg)"),y&&(y.style.background="transparent",y.style.color="var(--muted)")):(c.style.display="none",t.style.display="block",y&&(y.style.background="var(--accent)",y.style.color="var(--bg)"),i&&(i.style.background="transparent",i.style.color="var(--muted)"))}e?.addEventListener("change",u),n?.addEventListener("change",u)}function h(){const e=document.getElementById("service-name-input"),n=document.getElementById("service-subdomain-input"),c=document.getElementById("subdomain-preview");let t=!1;e?.addEventListener("input",()=>{const L=l(e.value);!t&&n&&(n.value=L),c&&(c.textContent=L?`\u2192 ${buildDomain(L)}`:""),m()}),n?.addEventListener("input",()=>{t=n.value!==l(e?.value||"");const L=n.value.trim()||l(e?.value||"");c&&(c.textContent=L?`\u2192 ${buildDomain(L)}`:""),m()});const i=document.getElementById("external-service-name"),y=document.getElementById("external-service-subdomain"),u=document.getElementById("external-subdomain-preview"),w=document.getElementById("external-domain-preview");let T=!1;i?.addEventListener("input",()=>{const L=l(i.value);!T&&y&&(y.value=L);const P=y?.value||L;u&&(u.textContent=P?`\u2192 ${buildDomain(P)}`:""),w&&(w.textContent=P?buildDomain(P):"")}),y?.addEventListener("input",()=>{T=y.value!==l(i?.value||"");const L=y.value.trim()||l(i?.value||"");u&&(u.textContent=L?`\u2192 ${buildDomain(L)}`:""),w&&(w.textContent=L?buildDomain(L):"")})}async function d(){const e=document.getElementById("external-service-name").value.trim(),n=document.getElementById("external-service-url").value.trim(),c=(document.getElementById("external-service-subdomain").value.trim()||l(e)).toLowerCase(),t=document.getElementById("external-service-logo").value.trim(),i=document.getElementById("external-service-icon").value.trim(),y=document.getElementById("external-create-dns").checked,u=document.getElementById("external-create-caddy").checked,w=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",T=document.getElementById("external-preserve-host").checked,L=document.getElementById("external-follow-redirects").checked,P=document.getElementById("external-service-category")?.value||"";if(!e||!n){showNotification("Please fill in Name and External URL","warning");return}if(!c){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!n.startsWith("http://")&&!n.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const C=buildDomain(c);try{const B={dns:null,caddy:null,dashboard:!1};if(y)if(window.getToken(getPrimaryDnsId(),"admin"))try{const A=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:C,ip:w,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=A.success?"created":A.error||"failed"}catch(S){B.dns=S.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(u)try{const E={subdomain:c,externalUrl:n,preserveHost:T,followRedirects:L,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},A=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)})).json();B.caddy=A.success?"created":A.error||"failed"}catch(E){B.caddy=E.message}const $={id:c,name:e,url:`https://${C}`,externalUrl:n,logo:t||i||"\u{1F310}",isExternal:!0,isCustom:!0};P&&($.category=P),window.APPS.push($),B.dashboard=!0;const k=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],x=window.APPS.filter(E=>!k.includes(E.id));safeSet("custom-services",JSON.stringify(x));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch(E){console.warn("Failed to save to services.json:",E)}window.buildGrid(),window.refreshAll(),a();const I=[`External service "${e}" added!`];y&&I.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),u&&I.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),I.push(`Access at: https://${C}`),showNotification(I.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function a(){closeModal("add-service-modal"),document.body.style.overflow="",document.getElementById("service-name-input").value="",document.getElementById("service-subdomain-input").value="",document.getElementById("service-port-input").value="",document.getElementById("service-ip-input").value=b.lan||"",document.getElementById("service-logo-input").value="",document.getElementById("dns-ttl-input").value=DC.DEFAULTS.TTL,document.getElementById("ssl-type-select").value=o(),document.getElementById("ca-name-input").value="",document.getElementById("enable-auth").checked=!1,document.getElementById("enable-cors").checked=!1,document.getElementById("custom-headers-input").value="",document.getElementById("upstream-path-input").value="/",document.getElementById("health-check-input").value="",document.getElementById("timeout-input").value="30";const e=document.getElementById("subdomain-preview");e&&(e.textContent="");const n=document.getElementById("external-subdomain-preview");n&&(n.textContent="");const c=document.getElementById("external-service-name");c&&(c.value="");const t=document.getElementById("external-service-subdomain");t&&(t.value="");const i=document.getElementById("external-service-url");i&&(i.value="");const y=document.getElementById("external-service-logo");y&&(y.value="");const u=document.getElementById("external-service-icon");u&&(u.value="");const w=document.getElementById("local-advanced-options");w&&w.removeAttribute("open");const T=document.getElementById("external-advanced-options");T&&T.removeAttribute("open");const L=document.getElementById("service-type-local");L&&(L.checked=!0);const P=document.getElementById("local-service-config"),C=document.getElementById("external-service-config");P&&(P.style.display="grid"),C&&(C.style.display="none");const B=document.getElementById("tab-local"),$=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),$&&($.style.background="transparent",$.style.color="var(--muted)")}async function p(){const e=document.getElementById("service-name-input").value.trim(),n=(document.getElementById("service-subdomain-input").value.trim()||l(e)).toLowerCase(),c=document.getElementById("service-port-input").value.trim(),t=document.getElementById("service-ip-input").value.trim(),i=document.getElementById("service-logo-input").value.trim(),y=document.getElementById("create-dns-record").checked,u=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,w=document.getElementById("manual-tailscale-only")?.checked||!1,T=document.getElementById("ssl-type-select")?.value||"caddy-managed",L=document.getElementById("ca-name-input")?.value||"",P=document.getElementById("existing-ca-select")?.value||"",C=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,$=document.getElementById("custom-headers-input")?.value||"",k=document.getElementById("upstream-path-input")?.value||"/",x=document.getElementById("health-check-input")?.value||"",I=document.getElementById("timeout-input")?.value||30,S=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",A=window.getToken(getPrimaryDnsId(),"admin");if(!e||!c||!t){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!n){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(y&&!A){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(y)try{await window.createDnsRecord(n,t,u),D.dns="created"}catch(N){throw console.error("DNS creation failed:",N),D.dns=N.message,new Error(`DNS creation failed: ${N.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:n,port:c,ip:t,sslType:T,caName:L,existingCa:P,enableAuth:C,enableCors:B,customHeaders:$,upstreamPath:k,healthCheck:x,timeout:I,tailscaleOnly:w});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(n),upstream:`${t}:${c}`,config:O})})).json();if(U.success)D.caddy="added & reloaded";else throw console.error("Caddy configuration failed:",U.error),D.caddy=U.error||"failed",new Error(`Caddy configuration failed: ${U.error}`)}catch(N){throw console.error("Caddy API error:",N),D.caddy=N.message,new Error(`Caddy API error: ${N.message}`)}const _={name:e,subdomain:n,port:c,ip:t,logo:i||`/assets/${n}.png`,tailscaleOnly:w||!1};S&&(_.category=S),await window.addServiceToConfig(_),D.dashboard=!0;const R=[`DNS: ${D.dns==="created"?"\u2713":D.dns==="skipped"?"\u25CB":"\u2717"}`,`Caddy: ${D.caddy==="added & reloaded"?"\u2713":"\u2717"}`,`Dashboard: ${D.dashboard?"\u2713":"\u2717"}`];showNotification(`Service "${e}" created! ${R.join(" | ")} \u2014 ${buildServiceUrl(n)}${w?" (Tailscale)":""}`,"success",6e3),a(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${e}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",g),document.getElementById("add-service-cancel")?.addEventListener("click",a),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?d():p()}),r(),h(),v(),document.getElementById("ssl-type-select")?.addEventListener("change",e=>{const n=document.getElementById("existing-ca-config"),c=document.getElementById("custom-ca-config");n.style.display="none",c.style.display="none",e.target.value==="existing-ca"?n.style.display="block":e.target.value==="custom-ca"&&(c.style.display="block"),m()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const e=document.getElementById("refresh-cas"),n=e.textContent;e.textContent="\u231B Loading...",e.disabled=!0;try{const c=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(c),e.textContent="\u2705 Refreshed"}catch(c){e.textContent="\u274C Failed",console.error("Failed to refresh CAs:",c)}setTimeout(()=>{e.textContent=n,e.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",e=>{const n=document.getElementById("dns-config");n.style.display=e.target.checked?"block":"none"}),["service-subdomain-input","service-ip-input","service-port-input","ca-name-input","existing-ca-select","enable-auth","enable-cors","custom-headers-input","upstream-path-input","health-check-input","timeout-input"].forEach(e=>{const n=document.getElementById(e);n&&(n.addEventListener("input",m),n.addEventListener("change",m))});function s(){const e=safeGet("custom-services");if(e)try{JSON.parse(e).forEach(c=>{window.APPS.find(t=>t.id===c.id)||window.APPS.push(c)})}catch(n){console.warn("Failed to load custom services:",n)}}s(),window.openAddServiceModal=g,window.closeAddServiceModal=a})(),(function(){let l=null,o=1e3;const m=3e4;function b(){if(l)try{l.close()}catch{}l=new EventSource("/api/v1/events/stream"),l.addEventListener("connected",()=>{o=1e3,f=0,debug("[SSE] Connected to event stream")}),l.addEventListener("status-change",v=>{try{const g=JSON.parse(v.data);if(g.serviceId&&typeof window.setBadge=="function"){const r=g.status==="up"||g.status==="healthy";window.setBadge(g.serviceId,r,g.responseTime||null)}}catch{}}),l.addEventListener("resource-alert",v=>{try{const g=JSON.parse(v.data),r=`${g.containerName||g.containerId}: ${g.metric} at ${g.value}% (threshold: ${g.threshold}%)`;typeof showNotification=="function"&&showNotification(r,"warning")}catch{}}),l.addEventListener("auto-restart",v=>{try{const g=JSON.parse(v.data);typeof showNotification=="function"&&showNotification(`Container "${g.containerName}" was auto-restarted`,"info")}catch{}}),l.addEventListener("update-available",v=>{try{const g=JSON.parse(v.data),r=document.getElementById("updates-btn");if(r&&!r.querySelector(".sse-dot")){const h=document.createElement("span");h.className="sse-dot",h.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",r.appendChild(h)}typeof showNotification=="function"&&showNotification(`Update available for ${g.containerName||g.containerId}`,"info")}catch{}}),l.addEventListener("update-complete",v=>{try{const g=JSON.parse(v.data);typeof showNotification=="function"&&showNotification(`Update completed: ${g.containerName||g.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),l.addEventListener("update-failed",v=>{try{const g=JSON.parse(v.data);typeof showNotification=="function"&&showNotification(`Update failed: ${g.containerName||g.containerId} \u2014 ${g.error||"unknown error"}`,"error")}catch{}}),l.addEventListener("incident",v=>{try{const g=JSON.parse(v.data);typeof showNotification=="function"&&(g.type==="created"?showNotification(`Incident: ${g.message||g.serviceId}`,"error"):g.type==="resolved"&&showNotification(`Resolved: ${g.serviceId||"incident"}`,"success"))}catch{}}),l.onerror=()=>{if(l.close(),f=(f||0)+1,f>5){console.warn("[SSE] Max reconnect attempts reached \u2014 stopping (auth gate active or server unreachable)");return}console.warn(`[SSE] Disconnected, reconnecting in ${o/1e3}s...`),setTimeout(b,o),o=Math.min(o*2,m)}}let f=0;b(),window._sseReconnect=b})(),(function(){const l=document.getElementById("service-filter-search"),o=document.getElementById("service-filter-status"),m=document.getElementById("service-filter-category"),b=document.getElementById("service-filter-count");function f(){const h=new Set,d=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(s=>{const e=s.dataset.category.trim();e&&d.add(e)});const a=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(a).concat([...d].filter(s=>!a[s])).forEach(s=>h.add(s)),{list:[...h],apiCats:a}}function v(){if(!m)return;const{list:h,apiCats:d}=f(),a=m.value;m.innerHTML='<option value="all">All Categories</option>',h.sort().forEach(p=>{const s=d[p],e=document.createElement("option");e.value=p,e.textContent=s?`${s.icon||""} ${p}`.trim():p,m.appendChild(e)}),a&&[...m.options].some(p=>p.value===a)?m.value=a:m.value="all"}function g(){v();const h=l.value.toLowerCase().trim(),d=o.value,a=m?m.value:"all",p=document.querySelectorAll("#cards .card");let s=0;if(p.forEach(e=>{const n=e.querySelector(".name")?.textContent?.toLowerCase()||"",c=e.dataset.app?.toLowerCase()||"",t=e.dataset.status||"off",i=e.dataset.category||"";(!h||n.includes(h)||c.includes(h))&&(d==="all"||t===d)&&(a==="all"||i===a)?(e.style.display="",s++):e.style.display="none"}),b){const e=p.length;b.textContent=`${s} of ${e} services`}}function r(h,d){let a;return function(...p){clearTimeout(a),a=setTimeout(()=>h.apply(this,p),d)}}l?.addEventListener("input",r(g,200)),o?.addEventListener("change",g),m?.addEventListener("change",g),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(g,500)):setTimeout(g,500),window.refreshServiceFilter=g,window.refreshCategoryDropdown=v})(),(function(){const l=document.getElementById("batch-operations-btn"),o=document.getElementById("batch-action-bar"),m=document.getElementById("batch-selected-count"),b=document.getElementById("batch-start-btn"),f=document.getElementById("batch-stop-btn"),v=document.getElementById("batch-restart-btn"),g=document.getElementById("batch-cancel-btn");let r=!1,h=new Set;function d(){r=!0,h.clear(),o.style.display="",l.textContent="\u2713 Exit Batch Mode",p(),document.querySelectorAll("#cards .card[data-app]").forEach(n=>{const c=n.dataset.containerId;if(!c)return;const t=n.querySelector(".batch-checkbox");t&&t.remove();const i=document.createElement("input");i.type="checkbox",i.className="batch-checkbox",i.dataset.containerId=c,i.dataset.serviceName=n.querySelector(".name")?.textContent||c,i.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",i.addEventListener("change",y=>{y.stopPropagation(),i.checked?h.add(c):h.delete(c),p()}),n.style.position="relative",n.insertBefore(i,n.firstChild)})}function a(){r=!1,h.clear(),o.style.display="none",l.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(e=>e.remove())}function p(){const e=h.size;m.textContent=`${e} selected`,b.disabled=e===0,f.disabled=e===0,v.disabled=e===0}async function s(e){if(h.size===0)return;const n=Array.from(h),c={start:"Starting",stop:"Stopping",restart:"Restarting"}[e];if(!confirm(`${c} ${n.length} container(s)? This cannot be undone.`))return;const t=[b,f,v];t.forEach(w=>{w.disabled=!0,w.textContent="..."});let i=0,y=0;const u=[];for(const w of n)try{const T=await fetch(`/api/v1/containers/${encodeURIComponent(w)}/${e}`,{method:"POST"});if(T.ok)i++;else{y++;const L=await T.json().catch(()=>({}));u.push(`${w}: ${L.error||T.statusText}`)}}catch(T){y++,u.push(`${w}: ${T.message}`)}t[0].textContent="\u25B6 Start All",t[1].textContent="\u2B1B Stop All",t[2].textContent="\u{1F504} Restart All",p(),y===0?typeof showNotification=="function"&&showNotification(`${c} completed: ${i} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${c}: ${i} succeeded, ${y} failed`,"warning"),console.error("Batch operation errors:",u)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}l?.addEventListener("click",()=>{r?a():d()}),b?.addEventListener("click",()=>s("start")),f?.addEventListener("click",()=>s("stop")),v?.addEventListener("click",()=>s("restart")),g?.addEventListener("click",a)})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IGMudGxkIDogJy4nICsgYy50bGQ7XG4gICAgICBpZiAoYy5kbnMpIHtcbiAgICAgICAgU0lURS5kbnNJcCA9IGMuZG5zLmlwIHx8ICcnO1xuICAgICAgICBTSVRFLmRuc1BvcnQgPSBjLmRucy5wb3J0IHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgICAgfVxuICAgICAgaWYgKGMuZG5zU2VydmVycyAmJiB0eXBlb2YgYy5kbnNTZXJ2ZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjLmRuc1NlcnZlcnMpKSB7XG4gICAgICAgICAgaWYgKGsgIT09ICdfX3Byb3RvX18nICYmIGsgIT09ICdjb25zdHJ1Y3RvcicgJiYgayAhPT0gJ3Byb3RvdHlwZScpIFNJVEUuZG5zU2VydmVyc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLmNvbmZpZ3VyYXRpb25UeXBlKSBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID0gYy5jb25maWd1cmF0aW9uVHlwZTtcbiAgICAgIGlmIChjLmRvbWFpbikgU0lURS5kb21haW4gPSBjLmRvbWFpbjtcbiAgICAgIGlmIChjLmRlZmF1bHRzKSBTSVRFLmRlZmF1bHRzID0gYy5kZWZhdWx0cztcbiAgICAgIGlmIChjLnJvdXRpbmdNb2RlKSBTSVRFLnJvdXRpbmdNb2RlID0gYy5yb3V0aW5nTW9kZTtcbiAgICAgIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9IGMub25ib2FyZGluZ0NvbXBsZXRlZCA9PT0gdHJ1ZTtcbiAgICAgIC8vIENhY2hlIG9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IGNvbmZpZyAoVExELCBkb21haW4sIHJvdXRpbmcgbW9kZSlcbiAgICAgIC8vIEROUyBJUHMgYW5kIHNlcnZlciB0b3BvbG9neSBhcmUgTk9UIGNhY2hlZCBcdTIwMTQgZmV0Y2hlZCBmcm9tIEFQSSBlYWNoIGxvYWRcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRsZDogU0lURS50bGQsIGNvbmZpZ3VyYXRpb25UeXBlOiBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlLFxuICAgICAgICBkb21haW46IFNJVEUuZG9tYWluLCByb3V0aW5nTW9kZTogU0lURS5yb3V0aW5nTW9kZVxuICAgICAgfSkpO1xuICAgICAgLy8gUmVuZGVyIEROUyBjYXJkcyBkeW5hbWljYWxseSBiYXNlZCBvbiBjb25maWd1cmVkIHNlcnZlcnNcbiAgICAgIHJlbmRlckRuc0NhcmRzKCk7XG4gICAgICAvLyBIaWRlIFRva2VucyBidXR0b24gaWYgbm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG9rZW5zQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKTtcbiAgICAgIGlmICh0b2tlbnNCdG4pIHRva2Vuc0J0bi5zdHlsZS5kaXNwbGF5ID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKS5sZW5ndGggPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIC8vIFVwZGF0ZSBzdGF0aWMgSFRNTCBlbGVtZW50cyB3aXRoIGNvbmZpZ3VyZWQgVExEXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRsZF0nKS5mb3JFYWNoKGVsID0+IGVsLnRleHRDb250ZW50ID0gU0lURS50bGQpO1xuICBjb25zdCB0bGRTdWZmaXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10bGQtc3VmZml4Jyk7XG4gIGlmICh0bGRTdWZmaXgpIHRsZFN1ZmZpeC50ZXh0Q29udGVudCA9IFNJVEUudGxkO1xuICBjb25zdCBwcm94eUlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJveHktaXAnKTtcbiAgaWYgKHByb3h5SXBJbnB1dCAmJiBTSVRFLmRuc0lwKSB7IHByb3h5SXBJbnB1dC52YWx1ZSA9IFNJVEUuZG5zSXA7IHByb3h5SXBJbnB1dC5wbGFjZWhvbGRlciA9IFNJVEUuZG5zSXA7IH1cbn0pKCk7XG5mdW5jdGlvbiBidWlsZERvbWFpbihzdWIpIHsgcmV0dXJuIHN1YiArIFNJVEUudGxkOyB9XG5mdW5jdGlvbiBidWlsZFNlcnZpY2VVcmwoc3ViKSB7XG4gIGlmIChTSVRFLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyAmJiBTSVRFLmRvbWFpbikgcmV0dXJuICdodHRwczovLycgKyBTSVRFLmRvbWFpbiArICcvJyArIHN1YjtcbiAgaWYgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnICYmIFNJVEUuZG9tYWluKSByZXR1cm4gJ2h0dHBzOi8vJyArIHN1YiArICcuJyArIFNJVEUuZG9tYWluO1xuICByZXR1cm4gJ2h0dHBzOi8vJyArIGJ1aWxkRG9tYWluKHN1Yik7XG59XG5mdW5jdGlvbiBnZXREbnNTZXJ2ZXJBZGRyKGRuc0lkKSB7XG4gIGNvbnN0IHMgPSBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdO1xuICByZXR1cm4gcyA/IGAke3MuaXB9OiR7cy5wb3J0fWAgOiBidWlsZERvbWFpbihkbnNJZCk7XG59XG4vKiogR2V0IHRoZSBETlMgSUQgd2hvc2UgSVAgbWF0Y2hlcyB0aGUgcHJpbWFyeSBETlMgY29uZmlnIChkbnMuaXApICovXG5mdW5jdGlvbiBnZXRQcmltYXJ5RG5zSWQoKSB7XG4gIGlmICghU0lURS5kbnNJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhTSVRFLmRuc1NlcnZlcnMpKSB7XG4gICAgaWYgKGluZm8uaXAgPT09IFNJVEUuZG5zSXApIHJldHVybiBpZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gPT09PT0gRFlOQU1JQyBETlMgQ0FSRCBSRU5ERVJFUiA9PT09PVxuZnVuY3Rpb24gcmVuZGVyRG5zQ2FyZHMoKSB7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKTtcbiAgaWYgKCF0b3BSb3cpIHJldHVybjtcbiAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgaWYgKCFkbnNJZHMubGVuZ3RoKSByZXR1cm47IC8vIE5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQgXHUyMDE0IHNob3cgbm90aGluZ1xuXG4gIGNvbnN0IHN2Z0ljb24gPSAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj4nXG4gICAgKyAnPHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiIGZpbGw9XCIjMzQ0OTVlXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCI2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjJcIiByeD1cIjFcIiBmaWxsPVwiIzM0OThkYlwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiOVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjExXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTNcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjE1XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPGNpcmNsZSBjeD1cIjE3XCIgY3k9XCIxMVwiIHI9XCIyXCIgZmlsbD1cIiNlNzRjM2NcIi8+J1xuICAgICsgJzxwYXRoIGQ9XCJNMTcgOXY0TTE1IDExaDRcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjFcIi8+PC9zdmc+JztcblxuICBjb25zdCBmaXJzdENoaWxkID0gdG9wUm93LmZpcnN0RWxlbWVudENoaWxkO1xuICBkbnNJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3Qgc2FmZUlkID0gZXNjYXBlSHRtbChpZCk7XG4gICAgY29uc3QgbGFiZWwgPSBlc2NhcGVIdG1sKChTSVRFLmRuc1NlcnZlcnNbaWRdLm5hbWUgfHwgaWQpLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjYXJkLmNsYXNzTmFtZSA9ICdjYXJkJztcbiAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHAnLCBpZCk7XG4gICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgIGA8c3BhbiBpZD1cIiR7c2FmZUlkfS1kb3RcIiBjbGFzcz1cImRvdCBiYWQgYXQtYmxcIj48L3NwYW4+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cInJvd1wiPjxkaXYgY2xhc3M9XCJsb2dvLXdyYXBcIj4ke3N2Z0ljb259PC9kaXY+YFxuICAgICAgKyBgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtsYWJlbH08L3NwYW4+PHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+YFxuICAgICAgKyBgPHNwYW4gaWQ9XCIke3NhZmVJZH0tcGlsbFwiIGNsYXNzPVwiYmFkZ2Ugb2ZmXCI+T0ZGPC9zcGFuPjwvZGl2PmBcbiAgICAgICsgYDxkaXYgY2xhc3M9XCJyZXNwb25zZS1yb3dcIj48c3BhbiBpZD1cIiR7c2FmZUlkfS10aW1lXCIgY2xhc3M9XCJyZXNwb25zZS10aW1lXCI+LS08L3NwYW4+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImhlYWx0aC1yb3dcIiBpZD1cImhlYWx0aC0ke3NhZmVJZH1cIj48c3BhbiBpZD1cInVwdGltZS0ke3NhZmVJZH1cIiBjbGFzcz1cInVwdGltZS1jaGlwXCI+LS08L3NwYW4+PGRpdiBjbGFzcz1cInVwdGltZS1taW5pLWJhclwiPjxkaXYgY2xhc3M9XCJmaWxsXCIgaWQ9XCJ1cHRpbWUtYmFyLSR7c2FmZUlkfVwiIHN0eWxlPVwid2lkdGg6IDAlXCI+PC9kaXY+PC9kaXY+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImJ0bi1yb3dcIj5gXG4gICAgICArIGA8YnV0dG9uIGlkPVwiJHtzYWZlSWR9LXJlc3RhcnRcIiBjbGFzcz1cInJlc3RhcnQtYnRuXCI+UmVzdGFydDwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tdXBkYXRlXCIgY2xhc3M9XCJ1cGRhdGUtYnRuXCIgdGl0bGU9XCJVcGRhdGUgRE5TIHNlcnZlclwiPlx1MkIwNlx1RkUwRjwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tb3BlblwiPk9wZW48L2J1dHRvbj5gXG4gICAgICArIGA8YnV0dG9uIGlkPVwiJHtzYWZlSWR9LWxvZ3NcIiBjbGFzcz1cImxvZ3MtYnRuXCI+TG9nczwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tc2V0dGluZ3NcIiBjbGFzcz1cInNldHRpbmdzLWJ0blwiPlx1MjY5OVx1RkUwRjwvYnV0dG9uPmBcbiAgICAgICsgYDwvZGl2PmA7XG4gICAgdG9wUm93Lmluc2VydEJlZm9yZShjYXJkLCBmaXJzdENoaWxkKTtcbiAgfSk7XG59XG53aW5kb3cucmVuZGVyRG5zQ2FyZHMgPSByZW5kZXJEbnNDYXJkcztcblxuLy8gPT09PT0gQ1NSRiBQUk9URUNUSU9OID09PT09XG5sZXQgY3NyZlRva2VuID0gbnVsbDtcblxuLyoqXG4gKiBHZXQgQ1NSRiB0b2tlbiBmcm9tIHNlcnZlciAoY2FjaGVkKVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQ1NSRiB0b2tlblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDU1JGVG9rZW4oKSB7XG4gIGlmIChjc3JmVG9rZW4pIHJldHVybiBjc3JmVG9rZW47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NzcmYtdG9rZW4nKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBDU1JGIHRva2VuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgY3NyZlRva2VuID0gZGF0YS50b2tlbjtcbiAgICByZXR1cm4gY3NyZlRva2VuO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0NTUkZdIEdldCBUb2tlbicsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZ2V0Q1NSRlRva2VuJyB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFNlY3VyZSBmZXRjaCB3cmFwcGVyIHRoYXQgYXV0b21hdGljYWxseSBhZGRzIENTUkYgdG9rZW4gdG8gc3RhdGUtY2hhbmdpbmcgcmVxdWVzdHMuXG4gKiBJZiB0aGUgc2VydmVyIHJldHVybnMgYSBDU1JGIGVycm9yICg0MDMgd2l0aCBEQy0xMDAvREMtMTAxKSwgYXV0b21hdGljYWxseVxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiBhbmQgcmV0cmllcyBvbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCB0byBmZXRjaFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBGZXRjaCBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNwb25zZT59IEZldGNoIHJlc3BvbnNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlY3VyZUZldGNoKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG1ldGhvZCA9IChvcHRpb25zLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgY29uc3QgbmVlZHNDc3JmID0gIVsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUyddLmluY2x1ZGVzKG1ldGhvZCk7XG5cbiAgaWYgKG5lZWRzQ3NyZikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldENTUkZUb2tlbigpO1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICdYLUNTUkYtVG9rZW4nOiB0b2tlblxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQ1NSRl0gQWRkIHRvIFJlcXVlc3QnLCBlcnJvciwgeyBmdW5jdGlvbjogJ3NlY3VyZUZldGNoJyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBEZWZhdWx0IDE1cyB0aW1lb3V0IGlmIG5vIHNpZ25hbCBwcm92aWRlZCAocHJldmVudHMgaGFuZ2luZyByZXF1ZXN0cylcbiAgaWYgKCFvcHRpb25zLnNpZ25hbCkge1xuICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNTAwMCkgfTtcbiAgfVxuXG4gIG9wdGlvbnMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbic7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcblxuICAvLyBBdXRvLXJldHJ5IG9uY2Ugb24gQ1NSRiBmYWlsdXJlICh0b2tlbiBtYXkgaGF2ZSBiZWVuIHJvdGF0ZWQgYnkgVE9UUCByZS1hdXRoKVxuICBpZiAobmVlZHNDc3JmICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLmpzb24oKTtcbiAgICAgIGlmIChib2R5LmVycm9yICYmIChib2R5LmVycm9yLmluY2x1ZGVzKCdEQy0xMDAnKSB8fCBib2R5LmVycm9yLmluY2x1ZGVzKCdEQy0xMDEnKSkpIHtcbiAgICAgICAgY3NyZlRva2VuID0gbnVsbDsgLy8gQ2xlYXIgY2FjaGVkIHRva2VuXG4gICAgICAgIGNvbnN0IGZyZXNoVG9rZW4gPSBhd2FpdCBnZXRDU1JGVG9rZW4oKTtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0geyAuLi5vcHRpb25zLmhlYWRlcnMsICdYLUNTUkYtVG9rZW4nOiBmcmVzaFRva2VuIH07XG4gICAgICAgIC8vIE5ldyBzaWduYWwgZm9yIHJldHJ5IChvbGQgb25lIG1heSBoYXZlIGJlZW4gY29uc3VtZWQpXG4gICAgICAgIG9wdGlvbnMuc2lnbmFsID0gQWJvcnRTaWduYWwudGltZW91dCgxNTAwMCk7XG4gICAgICAgIHJldHVybiBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8vIElmIGNsb25lL2pzb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCByZXNwb25zZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuLy8gPT09PT0gQVBJIENBTEwgSEVMUEVSUyA9PT09PVxuXG4vKiogUE9TVCBKU09OIGFuZCByZXR1cm4gcGFyc2VkIHJlc3BvbnNlLiBUaHJvd3Mgb24gSFRUUCBvciBBUEkgZXJyb3IuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SlNPTih1cmwsIGRhdGEpIHtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKHVybCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gIGlmICghcmVzcC5vayB8fCByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBSZXF1ZXN0IGZhaWxlZCAoJHtyZXNwLnN0YXR1c30pYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEdFVCBKU09OIGFuZCByZXR1cm4gcGFyc2VkIHJlc3BvbnNlLiBUaHJvd3Mgb24gSFRUUCBlcnJvciB3aXRoIHNlcnZlciBtZXNzYWdlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKHVybCk7XG4gIGlmICghcmVzcC5vaykge1xuICAgIGxldCBtc2cgPSBgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcC5zdGF0dXN9KWA7XG4gICAgdHJ5IHsgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpOyBtc2cgPSBib2R5LmVycm9yIHx8IG1zZzsgfSBjYXRjaCAoXykge31cbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxuICByZXR1cm4gcmVzcC5qc29uKCk7XG59XG5cbi8qKiBERUxFVEUgcmVxdWVzdC4gUmV0dXJucyBwYXJzZWQgSlNPTiByZXNwb25zZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFQSSh1cmwpIHtcbiAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKHVybCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgaWYgKCFyZXNwLm9rIHx8IHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgYERlbGV0ZSBmYWlsZWQgKCR7cmVzcC5zdGF0dXN9KWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUnVuIGFuIGFzeW5jIG9wZXJhdGlvbiB3aXRoIGJ1dHRvbiBsb2FkaW5nIHN0YXRlLlxuICogRGlzYWJsZXMgdGhlIGJ1dHRvbiwgc2hvd3MgbG9hZGluZyB0ZXh0LCByZXN0b3JlcyBvbiBjb21wbGV0ZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJ0biAtIEJ1dHRvbiBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gbG9hZGluZ1RleHQgLSBUZXh0IHRvIHNob3cgd2hpbGUgbG9hZGluZyAoZS5nLiAnU2F2aW5nLi4uJylcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGFzeW5jRm4gLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnM6IHsgc3VjY2Vzc1RleHQsIHJlc2V0RGVsYXkgfVxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoQnV0dG9uKGJ0biwgbG9hZGluZ1RleHQsIGFzeW5jRm4sIG9wdHMgPSB7fSkge1xuICBjb25zdCBvcmlnaW5hbCA9IGJ0bi5pbm5lckhUTUw7XG4gIGNvbnN0IHsgc3VjY2Vzc1RleHQgPSAnXHUyNzA1JywgcmVzZXREZWxheSA9IERDLkRFTEFZUy5CVE5fUkVTRVQgfSA9IG9wdHM7XG4gIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gIGJ0bi5pbm5lckhUTUwgPSBsb2FkaW5nVGV4dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhc3luY0ZuKCk7XG4gICAgYnRuLmlubmVySFRNTCA9IHN1Y2Nlc3NUZXh0O1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4uaW5uZXJIVE1MID0gb3JpZ2luYWw7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9LCByZXNldERlbGF5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgYnRuLmlubmVySFRNTCA9IG9yaWdpbmFsO1xuICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqIFNob3cvaGlkZSBhIG1vZGFsIGJ5IElEICovXG5mdW5jdGlvbiBvcGVuTW9kYWwoaWQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG59XG5mdW5jdGlvbiBjbG9zZU1vZGFsKGlkKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xufVxuXG4vKiogV2lyZSBiYWNrZHJvcC1jbGljayBjbG9zZSArIG9wdGlvbmFsIGNsb3NlIGJ1dHRvbnMgZm9yIGEgbW9kYWwgZWxlbWVudCAqL1xuZnVuY3Rpb24gd2lyZU1vZGFsKG1vZGFsLCAuLi5jbG9zZUJ0bnMpIHtcbiAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsgfSk7XG4gIC8vIFNraXAgYW55dGhpbmcgdGhhdCBpc24ndCBhIHJlYWwgbGlzdGVuZXIgdGFyZ2V0LiBXaXRob3V0IHRoaXMgZ3VhcmQsIGFcbiAgLy8gc2luZ2xlIHR5cG8gKGUuZy4gcGFzc2luZyBhIGZ1bmN0aW9uIG9yIG51bGwgaW5zdGVhZCBvZiBhIGJ1dHRvbiBlbGVtZW50KVxuICAvLyB0aHJvd3MgYW5kIGFib3J0cyB0aGUgcmVzdCBvZiB0aGUgY2FsbGluZyBtb2R1bGUncyBpbml0IFx1MjAxNCB3aGljaCBjYW4gdGFrZVxuICAvLyBkb3duIGxpY2Vuc2UuanMgKEZSRUUgVElFUiBiYWRnZSksIFRPVFAgd2lyaW5nLCBldGMuXG4gIGNsb3NlQnRucy5mb3JFYWNoKGJ0biA9PiB7XG4gICAgaWYgKGJ0biAmJiB0eXBlb2YgYnRuLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIFRvYXN0LXN0eWxlIG5vdGlmaWNhdGlvbiAocmVwbGFjZXMgYWxsIGFsZXJ0KCkgdXNhZ2UpICovXG5mdW5jdGlvbiBzaG93Tm90aWZpY2F0aW9uKHRleHQsIHR5cGUgPSAnaW5mbycsIGR1cmF0aW9uID0gMzAwMCkge1xuICBjb25zdCBleGlzdGluZ05vdGlmID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRlcGxveS1ub3RpZmljYXRpb24nKTtcbiAgaWYgKGV4aXN0aW5nTm90aWYpIGV4aXN0aW5nTm90aWYucmVtb3ZlKCk7XG5cbiAgY29uc3QgY29sb3JzID0ge1xuICAgIGluZm86ICAgIHsgYmc6ICcjMjE5NkYzJywgICAgICAgZmc6ICcjZmZmJyB9LFxuICAgIHN1Y2Nlc3M6IHsgYmc6ICd2YXIoLS1vay1iZyknLCAgZmc6ICd2YXIoLS1vay1mZyknIH0sXG4gICAgZXJyb3I6ICAgeyBiZzogJyNmNDQzMzYnLCAgICAgICBmZzogJyNmZmYnIH0sXG4gICAgd2FybmluZzogeyBiZzogJyNmZjk4MDAnLCAgICAgICBmZzogJyNmZmYnIH1cbiAgfTtcblxuICBjb25zdCBjID0gY29sb3JzW3R5cGVdIHx8IGNvbG9ycy5pbmZvO1xuICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbXNnLmNsYXNzTmFtZSA9ICdkZXBsb3ktbm90aWZpY2F0aW9uJztcbiAgbXNnLnRleHRDb250ZW50ID0gdGV4dDtcbiAgbXNnLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgcG9zaXRpb246IGZpeGVkOyB0b3A6IDIwcHg7IHJpZ2h0OiAyMHB4O1xuICAgIGJhY2tncm91bmQ6ICR7Yy5iZ307IGNvbG9yOiAke2MuZmd9O1xuICAgIHBhZGRpbmc6IDE2cHggMjRweDsgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLDAsMCwuMyk7XG4gICAgei1pbmRleDogMTAwMDA7IGFuaW1hdGlvbjogc2xpZGVJbiAwLjNzIGVhc2Utb3V0O1xuICAgIG1heC13aWR0aDogNDAwcHg7IHdoaXRlLXNwYWNlOiBwcmUtbGluZTsgZm9udC1zaXplOiAxNHB4O1xuICBgO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1zZyk7XG4gIGlmIChkdXJhdGlvbiA+IDApIHNldFRpbWVvdXQoKCkgPT4gbXNnLnJlbW92ZSgpLCBkdXJhdGlvbik7XG59XG5cbi8qKiBSZWxhdGl2ZSB0aW1lIGRpc3BsYXkgKGUuZy4gXCI1bSBhZ29cIiwgXCIyaCBhZ29cIikgKi9cbmZ1bmN0aW9uIHRpbWVBZ28odHMpIHtcbiAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSBuZXcgRGF0ZSh0cykuZ2V0VGltZSgpO1xuICBpZiAoZGlmZiA8IDYwMDAwKSByZXR1cm4gJ2p1c3Qgbm93JztcbiAgaWYgKGRpZmYgPCAzNjAwMDAwKSByZXR1cm4gTWF0aC5mbG9vcihkaWZmIC8gNjAwMDApICsgJ20gYWdvJztcbiAgaWYgKGRpZmYgPCA4NjQwMDAwMCkgcmV0dXJuIE1hdGguZmxvb3IoZGlmZiAvIDM2MDAwMDApICsgJ2ggYWdvJztcbiAgcmV0dXJuIE1hdGguZmxvb3IoZGlmZiAvIDg2NDAwMDAwKSArICdkIGFnbyc7XG59XG5cbi8vID09PT09IFNBRkUgU1RPUkFHRSBXUkFQUEVSUyA9PT09PVxuLy8gUHJldmVudHMgY3Jhc2hlcyBpbiBTYWZhcmkgcHJpdmF0ZSBicm93c2luZywgcXVvdGEgZXhjZWVkZWQsIG9yIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnRzXG5mdW5jdGlvbiBzYWZlR2V0KGtleSwgZmFsbGJhY2sgPSBudWxsKSB7XG4gIHRyeSB7IGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOyByZXR1cm4gdiAhPT0gbnVsbCA/IHYgOiBmYWxsYmFjazsgfSBjYXRjaCAoXykgeyByZXR1cm4gZmFsbGJhY2s7IH1cbn1cbmZ1bmN0aW9uIHNhZmVTZXQoa2V5LCB2YWx1ZSkge1xuICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsgfSBjYXRjaCAoXykgeyAvKiBxdW90YSBleGNlZWRlZCBvciBwcml2YXRlIG1vZGUgKi8gfVxufVxuZnVuY3Rpb24gc2FmZVJlbW92ZShrZXkpIHtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsgfSBjYXRjaCAoXykge31cbn1cbmZ1bmN0aW9uIHNhZmVTZXNzaW9uR2V0KGtleSwgZmFsbGJhY2sgPSBudWxsKSB7XG4gIHRyeSB7IGNvbnN0IHYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7IHJldHVybiB2ICE9PSBudWxsID8gdiA6IGZhbGxiYWNrOyB9IGNhdGNoIChfKSB7IHJldHVybiBmYWxsYmFjazsgfVxufVxuZnVuY3Rpb24gc2FmZVNlc3Npb25TZXQoa2V5LCB2YWx1ZSkge1xuICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOyB9IGNhdGNoIChfKSB7fVxufVxuLyoqIFBhcnNlIEpTT04gZnJvbSBsb2NhbFN0b3JhZ2Ugd2l0aCBmYWxsYmFjayBcdTIwMTQgYXZvaWRzIHRyeS9jYXRjaCBhdCBldmVyeSBjYWxsIHNpdGUgKi9cbmZ1bmN0aW9uIHNhZmVHZXRKU09OKGtleSwgZmFsbGJhY2sgPSBudWxsKSB7XG4gIHRyeSB7IGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOyByZXR1cm4gdiA/IEpTT04ucGFyc2UodikgOiBmYWxsYmFjazsgfSBjYXRjaCAoXykgeyByZXR1cm4gZmFsbGJhY2s7IH1cbn1cblxuLyoqIEVzY2FwZSBIVE1MIGVudGl0aWVzIGZvciBzYWZlIGlubmVySFRNTCBpbnNlcnRpb24gKGhhbmRsZXMgYm90aCBjb250ZW50IGFuZCBhdHRyaWJ1dGVzKSAqL1xuZnVuY3Rpb24gZXNjYXBlSHRtbCh0ZXh0KSB7XG4gIHJldHVybiBTdHJpbmcodGV4dCA/PyAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKS5yZXBsYWNlKC8nL2csICcmIzM5OycpO1xufVxuXG4vKiogSW5qZWN0IG1vZGFsIEhUTUwgaW50byBET00gKGlkZW1wb3RlbnQgXHUyMDE0IHNraXBzIGlmIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMpICovXG5mdW5jdGlvbiBpbmplY3RNb2RhbChpZCwgaHRtbCkge1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSByZXR1cm47XG4gIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbn1cblxuLy8gPT09PT0gRVZFTlQgQlVTID09PT09XG4vLyBMaWdodHdlaWdodCBwdWIvc3ViIGZvciBjcm9zcy1tb2R1bGUgY29tbXVuaWNhdGlvbiB3aXRob3V0IHdpbmRvdyBnbG9iYWxzLlxuLy8gVXNhZ2U6IERDX0JVUy5vbignc2VydmljZXM6bG9hZGVkJywgaGFuZGxlcik7IERDX0JVUy5lbWl0KCdzZXJ2aWNlczpsb2FkZWQnLCBkYXRhKTtcbmNvbnN0IERDX0JVUyA9IHtcbiAgX2hhbmRsZXJzOiB7fSxcbiAgb24oZXZlbnQsIGZuKSB7ICh0aGlzLl9oYW5kbGVyc1tldmVudF0gfHw9IFtdKS5wdXNoKGZuKTsgfSxcbiAgb2ZmKGV2ZW50LCBmbikgeyB0aGlzLl9oYW5kbGVyc1tldmVudF0gPSB0aGlzLl9oYW5kbGVyc1tldmVudF0/LmZpbHRlcihoID0+IGggIT09IGZuKTsgfSxcbiAgZW1pdChldmVudCwgZGF0YSkgeyB0aGlzLl9oYW5kbGVyc1tldmVudF0/LmZvckVhY2goZm4gPT4gZm4oZGF0YSkpOyB9XG59O1xuXG4vLyA9PT09PSBDRU5UUkFMSVpFRCBBUFAgU1RBVEUgPT09PT1cbi8vIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBzZXJ2aWNlcyBhcnJheS4gTW9kdWxlcyBzaG91bGQgdXNlIEFwcFN0YXRlXG4vLyBpbnN0ZWFkIG9mIG11dGF0aW5nIHdpbmRvdy5BUFBTIGRpcmVjdGx5LiBFbWl0cyAnYXBwczpjaGFuZ2VkJyBvbiB1cGRhdGVzLlxuY29uc3QgQXBwU3RhdGUgPSB7XG4gIF9hcHBzOiBbXSxcbiAgZ2V0QXBwcygpIHsgcmV0dXJuIHRoaXMuX2FwcHM7IH0sXG4gIHNldEFwcHMoYXBwcykgeyB0aGlzLl9hcHBzID0gYXBwczsgd2luZG93LkFQUFMgPSBhcHBzOyBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgYXBwcyk7IH0sXG4gIGZpbmRBcHAoaWQpIHsgcmV0dXJuIHRoaXMuX2FwcHMuZmluZChhID0+IGEuaWQgPT09IGlkKTsgfSxcbiAgYWRkQXBwKGFwcCkgeyB0aGlzLl9hcHBzLnB1c2goYXBwKTsgd2luZG93LkFQUFMgPSB0aGlzLl9hcHBzOyBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgdGhpcy5fYXBwcyk7IH0sXG4gIHJlbW92ZUFwcChpZCkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2FwcHMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gaWQpO1xuICAgIGlmIChpZHggPiAtMSkgeyB0aGlzLl9hcHBzLnNwbGljZShpZHgsIDEpOyB3aW5kb3cuQVBQUyA9IHRoaXMuX2FwcHM7IERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCB0aGlzLl9hcHBzKTsgfVxuICAgIHJldHVybiBpZHggPiAtMTtcbiAgfSxcbiAgdXBkYXRlQXBwKGlkLCBjaGFuZ2VzKSB7XG4gICAgY29uc3QgYXBwID0gdGhpcy5fYXBwcy5maW5kKGEgPT4gYS5pZCA9PT0gaWQpO1xuICAgIGlmIChhcHApIHtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpKSB7XG4gICAgICAgIGlmIChrICE9PSAnX19wcm90b19fJyAmJiBrICE9PSAnY29uc3RydWN0b3InICYmIGsgIT09ICdwcm90b3R5cGUnKSBhcHBba10gPSB2O1xuICAgICAgfVxuICAgICAgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIHRoaXMuX2FwcHMpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwO1xuICB9XG59O1xuO1xuLy8gPT09PT09PT09PSBTS0VMRVRPTiBMT0FESU5HIFBMQUNFSE9MREVSUyA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNrZWxldG9uQ2FyZCgpIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2FyZC5jbGFzc05hbWUgPSAnc2tlbGV0b24tY2FyZCc7XG4gICAgY2FyZC5pbm5lckhUTUwgPVxuICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MTJweFwiPicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NDhweDtoZWlnaHQ6NDhweDtib3JkZXItcmFkaXVzOjhweDtmbGV4LXNocmluazowXCI+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZmxleDoxXCI+JyArXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjYwJTtoZWlnaHQ6MTRweDttYXJnaW4tYm90dG9tOjZweFwiPjwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDozNSU7aGVpZ2h0OjEwcHhcIj48L2Rpdj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NDJweDtoZWlnaHQ6MjJweDtib3JkZXItcmFkaXVzOjExcHhcIj48L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nICtcbiAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo0NSU7aGVpZ2h0OjEycHg7bWFyZ2luLWJvdHRvbToxMHB4XCI+PC9kaXY+JyArXG4gICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6YXV0b1wiPicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NjRweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjhweFwiPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NjRweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjhweFwiPjwvZGl2PicgK1xuICAgICAgJzwvZGl2Pic7XG4gICAgcmV0dXJuIGNhcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U2tlbGV0b25zKGNvdW50KSB7XG4gICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkcycpO1xuICAgIGlmICghZ3JpZCB8fCBncmlkLnF1ZXJ5U2VsZWN0b3IoJy5jYXJkJykpIHJldHVybjsgLy8gRG9uJ3Qgc2hvdyBpZiByZWFsIGNhcmRzIGV4aXN0XG4gICAgY291bnQgPSBjb3VudCB8fCA2O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBzayA9IGNyZWF0ZVNrZWxldG9uQ2FyZCgpO1xuICAgICAgZ3JpZC5hcHBlbmRDaGlsZChzayk7XG4gICAgICAvLyBTdGFnZ2VyIGZhZGUtaW5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBzay5jbGFzc0xpc3QuYWRkKCdsb2FkZWQnKTsgfSwgaSAqIDYwKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlU2tlbGV0b25zKCkge1xuICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHMnKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICB2YXIgc2tlbGV0b25zID0gZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcuc2tlbGV0b24tY2FyZCcpO1xuICAgIGlmICghc2tlbGV0b25zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgc2tlbGV0b25zLmZvckVhY2goZnVuY3Rpb24gKHNrLCBpKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2suc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgc2suc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTEwcHgpJztcbiAgICAgIH0sIGkgKiAyNSk7XG4gICAgfSk7XG4gICAgLy8gUmVtb3ZlIGFmdGVyIGFuaW1hdGlvblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2tlbGV0b25zLmZvckVhY2goZnVuY3Rpb24gKHNrKSB7IGlmIChzay5wYXJlbnROb2RlKSBzay5yZW1vdmUoKTsgfSk7XG4gICAgfSwgc2tlbGV0b25zLmxlbmd0aCAqIDI1ICsgMzAwKTtcbiAgfVxuXG4gIHdpbmRvdy5Ta2VsZXRvbkxvYWRlciA9IHsgc2hvdzogc2hvd1NrZWxldG9ucywgaGlkZTogaGlkZVNrZWxldG9ucyB9O1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVEhFTUUgQ09OVFJPTExFUiA9PT09PT09PT09XG4vLyBVc2VyLWNyZWF0ZWQgdGhlbWVzIGFyZSBzdG9yZWQgc2VydmVyLXNpZGUgYXMgaW5kaXZpZHVhbCBKU09OIGZpbGVzLlxuLy8gbG9jYWxTdG9yYWdlIGNhY2hlcyB0aGVtIGZvciBpbnN0YW50IGxvYWQ7IHNlcnZlciBpcyBzb3VyY2Ugb2YgdHJ1dGguXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgVEhFTUVfS0VZID0gJ3RoZW1lJztcbiAgdmFyIFVTRVJfVEhFTUVTX0tFWSA9ICd1c2VyLXRoZW1lcyc7XG4gIHZhciBMRUdBQ1lfQ1VTVE9NX0tFWSA9ICdjdXN0b20tdGhlbWUnO1xuXG4gIHZhciBCVUlMVElOX1RIRU1FUyA9IFsnZGFyaycsICdsaWdodCcsICdibHVlJywgJ2JsYWNrJywgJ25vcmQnLCAnZHJhY3VsYScsICdzb2xhcml6ZWQtZGFyaycsICdzb2xhcml6ZWQtbGlnaHQnLCAndGF4aScsICdvY2VhbiddO1xuICB2YXIgVEhFTUVTID0gQlVJTFRJTl9USEVNRVMuc2xpY2UoKTtcblxuICB2YXIgVEhFTUVfUFJPUFMgPSBbXG4gICAgJ2JnJywgJ2ZnJywgJ211dGVkJywgJ2ZnLW11dGVkJywgJ2NhcmQtYmFzZScsICdjYXJkLWJnJywgJ2JvcmRlcicsXG4gICAgJ2hvdmVyJywgJ2NhcmQtaG92ZXInLCAnYmFzZScsXG4gICAgJ29rLWJnJywgJ29rLWZnJywgJ2JhZC1iZycsICdiYWQtZmcnLCAnZG90LW9rJywgJ2RvdC1iYWQnLCAndXB0aW1lJyxcbiAgICAnc3VjY2VzcycsICdlcnJvcicsICd3YXJuaW5nJyxcbiAgICAnYWNjZW50JywgJ2FjY2VudC1zdHJvbmcnXG4gIF07XG5cbiAgLy8gQmFzZSBwcm9wcyB0aGUgdXNlciBwaWNrcyBpbiB0aGUgYnVpbGRlciAoc3Vic2V0IG9mIFRIRU1FX1BST1BTKVxuICB2YXIgQkFTRV9QUk9QUyA9IFtcbiAgICAnYmcnLCAnZmcnLCAnbXV0ZWQnLCAnY2FyZC1iYXNlJywgJ2NhcmQtYmcnLCAnYm9yZGVyJyxcbiAgICAnb2stYmcnLCAnb2stZmcnLCAnYmFkLWJnJywgJ2JhZC1mZycsICdkb3Qtb2snLCAnZG90LWJhZCcsICd1cHRpbWUnLFxuICAgICdhY2NlbnQnLCAnYWNjZW50LXN0cm9uZydcbiAgXTtcblxuICAvLyBQcm9wcyB0aGF0IGFyZSBhdXRvLWRlcml2ZWQgaWYgbm90IGV4cGxpY2l0bHkgc2V0XG4gIHZhciBERVJJVkVEX1BST1BTID0gWydmZy1tdXRlZCcsICdob3ZlcicsICdjYXJkLWhvdmVyJywgJ2Jhc2UnLCAnc3VjY2VzcycsICdlcnJvcicsICd3YXJuaW5nJ107XG5cbiAgdmFyIFRIRU1FX0NPTE9SUyA9IHtcbiAgICBkYXJrOiAgICAgICAgICAgICB7IGJnOiAnIzBiMGYxYScsIGZnOiAnI2U4ZWNmNScsIG11dGVkOiAnIzlhYTZiZicsICdmZy1tdXRlZCc6ICcjNmI3YTk0JywgJ2NhcmQtYmFzZSc6ICcjMTIxODI2JywgJ2NhcmQtYmcnOiAnIzEyMTgyNicsIGJvcmRlcjogJyMyNjM1NTInLCBob3ZlcjogJyMxYTIyMzUnLCAnY2FyZC1ob3Zlcic6ICcjMTYxZTJlJywgYmFzZTogJyMxNTFjMmInLCAnb2stYmcnOiAnIzBjMjQzMCcsICdvay1mZyc6ICcjN2VmMmZmJywgJ2JhZC1iZyc6ICcjMmExMjFhJywgJ2JhZC1mZyc6ICcjZmY5YWEzJywgJ2RvdC1vayc6ICcjMzVkMWZmJywgJ2RvdC1iYWQnOiAnI2ZmNWY3YScsIHVwdGltZTogJyMzNWQxZmYnLCBzdWNjZXNzOiAnIzRjYWY1MCcsIGVycm9yOiAnI2U3NGMzYycsIHdhcm5pbmc6ICcjZjM5YzEyJywgYWNjZW50OiAnIzhGRDZGRicsICdhY2NlbnQtc3Ryb25nJzogJyMxRjdCRkYnIH0sXG4gICAgbGlnaHQ6ICAgICAgICAgICAgeyBiZzogJyNmNmY3ZmInLCBmZzogJyMwZjExMTUnLCBtdXRlZDogJyM1ZjZiN2EnLCAnZmctbXV0ZWQnOiAnIzg5OTNhNCcsICdjYXJkLWJhc2UnOiAnI2ZmZmZmZicsICdjYXJkLWJnJzogJyNmZmZmZmYnLCBib3JkZXI6ICcjZTJlN2VmJywgaG92ZXI6ICcjZWVmMWY2JywgJ2NhcmQtaG92ZXInOiAnI2Y1ZjZmYScsIGJhc2U6ICcjZWJlZWYzJywgJ29rLWJnJzogJyNlYWZmZjEnLCAnb2stZmcnOiAnIzBhN2MzYScsICdiYWQtYmcnOiAnI2ZmZWZlZicsICdiYWQtZmcnOiAnI2IwMDAyMCcsICdkb3Qtb2snOiAnIzBmYjE1YScsICdkb3QtYmFkJzogJyNkOTNiM2InLCB1cHRpbWU6ICcjMGZiMTVhJywgc3VjY2VzczogJyMwYTdjM2EnLCBlcnJvcjogJyNiMDAwMjAnLCB3YXJuaW5nOiAnI2Q2OGEwMCcsIGFjY2VudDogJyM0YTkwZDknLCAnYWNjZW50LXN0cm9uZyc6ICcjMjU2M2ViJywgbGlnaHRCZzogdHJ1ZSB9LFxuICAgIGJsdWU6ICAgICAgICAgICAgIHsgYmc6ICcjMTkwOEFDJywgZmc6ICcjZThmMWZmJywgbXV0ZWQ6ICcjZDZlMmZmJywgJ2ZnLW11dGVkJzogJyM5ZWFmZGInLCAnY2FyZC1iYXNlJzogJyMwZDE1MzMnLCAnY2FyZC1iZyc6ICcjMGQxNTMzJywgYm9yZGVyOiAnIzFjMmQ2YScsIGhvdmVyOiAnIzE0MWY0YScsICdjYXJkLWhvdmVyJzogJyMxMTFhM2UnLCBiYXNlOiAnIzBmMTg0MCcsICdvay1iZyc6ICcjMTYyMDQwJywgJ29rLWZnJzogJyNlZGZmZmYnLCAnYmFkLWJnJzogJyMwYTBlMjQnLCAnYmFkLWZnJzogJyNmZmIzYzAnLCAnZG90LW9rJzogJyNjN2U1ZmYnLCAnZG90LWJhZCc6ICcjZmZkNmRjJywgdXB0aW1lOiAnIzdlYzhmZicsIHN1Y2Nlc3M6ICcjN2VjOGZmJywgZXJyb3I6ICcjZmZiM2MwJywgd2FybmluZzogJyNmZmQwODAnLCBhY2NlbnQ6ICcjOWNkNGZmJywgJ2FjY2VudC1zdHJvbmcnOiAnIzZmYjJmZicgfSxcbiAgICBibGFjazogICAgICAgICAgICB7IGJnOiAnIzBlMGUwZScsIGZnOiAnI2Y1ZjVmNScsIG11dGVkOiAnIzk5OTk5OScsICdmZy1tdXRlZCc6ICcjNjY2NjY2JywgJ2NhcmQtYmFzZSc6ICcjMWExYTFhJywgJ2NhcmQtYmcnOiAnIzFhMWExYScsIGJvcmRlcjogJyMyZTJlMmUnLCBob3ZlcjogJyMyNDI0MjQnLCAnY2FyZC1ob3Zlcic6ICcjMjAyMDIwJywgYmFzZTogJyMxNjE2MTYnLCAnb2stYmcnOiAnIzBmMmExMicsICdvay1mZyc6ICcjNjZmZjdhJywgJ2JhZC1iZyc6ICcjMmEwZjBmJywgJ2JhZC1mZyc6ICcjZmY2YjZiJywgJ2RvdC1vayc6ICcjNGNhZjUwJywgJ2RvdC1iYWQnOiAnI2ZmNDQ0NCcsIHVwdGltZTogJyNlMGUwZTAnLCBzdWNjZXNzOiAnIzRjYWY1MCcsIGVycm9yOiAnI2ZmNDQ0NCcsIHdhcm5pbmc6ICcjZmY5ODAwJywgYWNjZW50OiAnI0U2Mzk0NicsICdhY2NlbnQtc3Ryb25nJzogJyNDNjI4MjgnIH0sXG4gICAgbm9yZDogICAgICAgICAgICAgeyBiZzogJyMyZTM0NDAnLCBmZzogJyNlY2VmZjQnLCBtdXRlZDogJyM4MWExYzEnLCAnZmctbXV0ZWQnOiAnIzY4ODJhMCcsICdjYXJkLWJhc2UnOiAnIzNiNDI1MicsICdjYXJkLWJnJzogJyMzYjQyNTInLCBib3JkZXI6ICcjNGM1NjZhJywgaG92ZXI6ICcjNDM0YzVlJywgJ2NhcmQtaG92ZXInOiAnIzNmNDg1OCcsIGJhc2U6ICcjMzUzYzRhJywgJ29rLWJnJzogJyMyZDRmM2UnLCAnb2stZmcnOiAnI2EzYmU4YycsICdiYWQtYmcnOiAnIzRhMmMyYScsICdiYWQtZmcnOiAnI2JmNjE2YScsICdkb3Qtb2snOiAnI2EzYmU4YycsICdkb3QtYmFkJzogJyNiZjYxNmEnLCB1cHRpbWU6ICcjYTNiZThjJywgc3VjY2VzczogJyNhM2JlOGMnLCBlcnJvcjogJyNiZjYxNmEnLCB3YXJuaW5nOiAnI2ViY2I4YicsIGFjY2VudDogJyM4OGMwZDAnLCAnYWNjZW50LXN0cm9uZyc6ICcjNWU4MWFjJyB9LFxuICAgIGRyYWN1bGE6ICAgICAgICAgIHsgYmc6ICcjMjgyYTM2JywgZmc6ICcjZjhmOGYyJywgbXV0ZWQ6ICcjNjI3MmE0JywgJ2ZnLW11dGVkJzogJyM1MTVkODUnLCAnY2FyZC1iYXNlJzogJyM0NDQ3NWEnLCAnY2FyZC1iZyc6ICcjNDQ0NzVhJywgYm9yZGVyOiAnIzYyNzJhNCcsIGhvdmVyOiAnIzRlNTE3MCcsICdjYXJkLWhvdmVyJzogJyM0OTRjNjMnLCBiYXNlOiAnIzM2Mzg0OCcsICdvay1iZyc6ICcjMWUzYTJlJywgJ29rLWZnJzogJyM1MGZhN2InLCAnYmFkLWJnJzogJyMzZDFhMWEnLCAnYmFkLWZnJzogJyNmZjU1NTUnLCAnZG90LW9rJzogJyM1MGZhN2InLCAnZG90LWJhZCc6ICcjZmY1NTU1JywgdXB0aW1lOiAnIzUwZmE3YicsIHN1Y2Nlc3M6ICcjNTBmYTdiJywgZXJyb3I6ICcjZmY1NTU1Jywgd2FybmluZzogJyNmMWZhOGMnLCBhY2NlbnQ6ICcjYmQ5M2Y5JywgJ2FjY2VudC1zdHJvbmcnOiAnIzhiZTlmZCcgfSxcbiAgICAnc29sYXJpemVkLWRhcmsnOiB7IGJnOiAnIzAwMmIzNicsIGZnOiAnIzgzOTQ5NicsIG11dGVkOiAnIzU4NmU3NScsICdmZy1tdXRlZCc6ICcjNGE1ZjY1JywgJ2NhcmQtYmFzZSc6ICcjMDczNjQyJywgJ2NhcmQtYmcnOiAnIzA3MzY0MicsIGJvcmRlcjogJyM1ODZlNzUnLCBob3ZlcjogJyMwZDQwNTAnLCAnY2FyZC1ob3Zlcic6ICcjMGEzYTQ4JywgYmFzZTogJyMwNTMzNDAnLCAnb2stYmcnOiAnIzBkM2QyYycsICdvay1mZyc6ICcjODU5OTAwJywgJ2JhZC1iZyc6ICcjM2QxYTFhJywgJ2JhZC1mZyc6ICcjZGMzMjJmJywgJ2RvdC1vayc6ICcjODU5OTAwJywgJ2RvdC1iYWQnOiAnI2RjMzIyZicsIHVwdGltZTogJyNiNWJkNjgnLCBzdWNjZXNzOiAnIzg1OTkwMCcsIGVycm9yOiAnI2RjMzIyZicsIHdhcm5pbmc6ICcjYjU4OTAwJywgYWNjZW50OiAnIzI2OGJkMicsICdhY2NlbnQtc3Ryb25nJzogJyMyYWExOTgnIH0sXG4gICAgJ3NvbGFyaXplZC1saWdodCc6eyBiZzogJyNmZGY2ZTMnLCBmZzogJyM2NTdiODMnLCBtdXRlZDogJyM5M2ExYTEnLCAnZmctbXV0ZWQnOiAnI2FkYjhiOCcsICdjYXJkLWJhc2UnOiAnI2VlZThkNScsICdjYXJkLWJnJzogJyNlZWU4ZDUnLCBib3JkZXI6ICcjOTNhMWExJywgaG92ZXI6ICcjZTZkZmNiJywgJ2NhcmQtaG92ZXInOiAnI2VhZTNjZicsIGJhc2U6ICcjZThlMWNkJywgJ29rLWJnJzogJyNlOGY1ZTgnLCAnb2stZmcnOiAnIzg1OTkwMCcsICdiYWQtYmcnOiAnI2ZkZjJmMicsICdiYWQtZmcnOiAnI2RjMzIyZicsICdkb3Qtb2snOiAnIzg1OTkwMCcsICdkb3QtYmFkJzogJyNkYzMyMmYnLCB1cHRpbWU6ICcjODU5OTAwJywgc3VjY2VzczogJyM4NTk5MDAnLCBlcnJvcjogJyNkYzMyMmYnLCB3YXJuaW5nOiAnI2I1ODkwMCcsIGFjY2VudDogJyMyNjhiZDInLCAnYWNjZW50LXN0cm9uZyc6ICcjMmFhMTk4JywgbGlnaHRCZzogdHJ1ZSB9LFxuICAgIHRheGk6ICAgICAgICAgICAgIHsgYmc6ICcjZjNkMzIxJywgZmc6ICcjMGUwZTAwJywgbXV0ZWQ6ICcjNGE0YTEwJywgJ2ZnLW11dGVkJzogJyM2YjZiMzAnLCAnY2FyZC1iYXNlJzogJyNmZmQ3MDAnLCAnY2FyZC1iZyc6ICcjZmZkNzAwJywgYm9yZGVyOiAnI2I4YTg0MCcsIGhvdmVyOiAnI2ZmZTg0ZCcsICdjYXJkLWhvdmVyJzogJyNmZmUwMzMnLCBiYXNlOiAnI2YwZDAwMCcsICdvay1iZyc6ICcjZDRmZmQ5JywgJ29rLWZnJzogJyMwZjJhMGYnLCAnYmFkLWJnJzogJyNmZmQ0ZDQnLCAnYmFkLWZnJzogJyMyYTBmMGYnLCAnZG90LW9rJzogJyM0Y2FmNTAnLCAnZG90LWJhZCc6ICcjZmY0NDQ0JywgdXB0aW1lOiAnIzBlMGUwMCcsIHN1Y2Nlc3M6ICcjMmU3ZDMyJywgZXJyb3I6ICcjYzYyODI4Jywgd2FybmluZzogJyNlNjUxMDAnLCBhY2NlbnQ6ICcjN2E0YTAwJywgJ2FjY2VudC1zdHJvbmcnOiAnIzVjMzgwMCcsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICBvY2VhbjogICAgICAgICAgICB7IGJnOiAnIzIwNjBiMCcsIGZnOiAnI2ZhZjVlYicsIG11dGVkOiAnI2RjZDJjMCcsICdmZy1tdXRlZCc6ICcjYjBhODkwJywgJ2NhcmQtYmFzZSc6ICcjN2E5NGVkJywgJ2NhcmQtYmcnOiAnIzdhOTRlZCcsIGJvcmRlcjogJyNkZWI2N2EnLCBob3ZlcjogJyM4YWEwZjAnLCAnY2FyZC1ob3Zlcic6ICcjODI5OGU4JywgYmFzZTogJyM2ODg4ZTAnLCAnb2stYmcnOiAnIzRmNWJiMCcsICdvay1mZyc6ICcjYzdkN2ViJywgJ2JhZC1iZyc6ICcjZjQxYTNhJywgJ2JhZC1mZyc6ICcjNmExODE4JywgJ2RvdC1vayc6ICcjMzBhMDUwJywgJ2RvdC1iYWQnOiAnI2QwNDA0MCcsIHVwdGltZTogJyMyZDMyZjInLCBzdWNjZXNzOiAnIzMwYTA1MCcsIGVycm9yOiAnI2QwNDA0MCcsIHdhcm5pbmc6ICcjZTZhMDMwJywgYWNjZW50OiAnIzE4NjBhMCcsICdhY2NlbnQtc3Ryb25nJzogJyMxMDQwODAnIH0sXG4gIH07XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbG9yIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gaGV4VG9SZ2IoaGV4KSB7XG4gICAgaWYgKCFoZXggfHwgdHlwZW9mIGhleCAhPT0gJ3N0cmluZycpIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAgfTtcbiAgICBoZXggPSBoZXgucmVwbGFjZSgnIycsICcnKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykgaGV4ID0gaGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07XG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSB8fCAwLFxuICAgICAgZzogcGFyc2VJbnQoaGV4LnN1YnN0cigyLCAyKSwgMTYpIHx8IDAsXG4gICAgICBiOiBwYXJzZUludChoZXguc3Vic3RyKDQsIDIpLCAxNikgfHwgMFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZ2JUb0hleChyLCBnLCBiKSB7XG4gICAgcmV0dXJuICcjJyArIFtyLCBnLCBiXS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgIHZhciBoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHgpKSkudG9TdHJpbmcoMTYpO1xuICAgICAgcmV0dXJuIGgubGVuZ3RoID09PSAxID8gJzAnICsgaCA6IGg7XG4gICAgfSkuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiBibGVuZENvbG9ycyhoZXgxLCBoZXgyLCByYXRpbykge1xuICAgIHZhciBjMSA9IGhleFRvUmdiKGhleDEpO1xuICAgIHZhciBjMiA9IGhleFRvUmdiKGhleDIpO1xuICAgIHJldHVybiByZ2JUb0hleChcbiAgICAgIGMxLnIgKyAoYzIuciAtIGMxLnIpICogcmF0aW8sXG4gICAgICBjMS5nICsgKGMyLmcgLSBjMS5nKSAqIHJhdGlvLFxuICAgICAgYzEuYiArIChjMi5iIC0gYzEuYikgKiByYXRpb1xuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBoZXhMdW1pbmFuY2UoaGV4KSB7XG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIGhleCA9IGhleFswXStoZXhbMF0raGV4WzFdK2hleFsxXStoZXhbMl0raGV4WzJdO1xuICAgIHZhciByID0gcGFyc2VJbnQoaGV4LnN1YnN0cigwLCAyKSwgMTYpIC8gMjU1O1xuICAgIHZhciBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cigyLCAyKSwgMTYpIC8gMjU1O1xuICAgIHZhciBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cig0LCAyKSwgMTYpIC8gMjU1O1xuICAgIHIgPSByIDw9IDAuMDM5MjggPyByIC8gMTIuOTIgOiBNYXRoLnBvdygociArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGcgPSBnIDw9IDAuMDM5MjggPyBnIC8gMTIuOTIgOiBNYXRoLnBvdygoZyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGIgPSBiIDw9IDAuMDM5MjggPyBiIC8gMTIuOTIgOiBNYXRoLnBvdygoYiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIHJldHVybiAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQXV0by1kZXJpdmUgZXh0ZW5kZWQgY29sb3JzIGZyb20gYmFzZSBwYWxldHRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGRlcml2ZUV4dGVuZGVkQ29sb3JzKGNvbG9ycykge1xuICAgIHZhciBiZyA9IGNvbG9ycy5iZyB8fCAnIzBiMGYxYSc7XG4gICAgdmFyIGZnID0gY29sb3JzLmZnIHx8ICcjZThlY2Y1JztcbiAgICB2YXIgbXV0ZWQgPSBjb2xvcnMubXV0ZWQgfHwgJyM5YWE2YmYnO1xuICAgIHZhciBjYXJkQmFzZSA9IGNvbG9yc1snY2FyZC1iYXNlJ10gfHwgY29sb3JzLmJnIHx8ICcjMTIxODI2JztcbiAgICB2YXIgZG90T2sgPSBjb2xvcnNbJ2RvdC1vayddIHx8ICcjNGNhZjUwJztcbiAgICB2YXIgZG90QmFkID0gY29sb3JzWydkb3QtYmFkJ10gfHwgJyNlNzRjM2MnO1xuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzLmxpZ2h0QmcgfHwgKGJnICYmIGhleEx1bWluYW5jZShiZykgPiAwLjQpO1xuXG4gICAgdmFyIGRlcml2ZWQgPSB7fTtcblxuICAgIC8vIGhvdmVyOiBzdWJ0bGUgc2hpZnQgb2YgY2FyZC1iYXNlIHRvd2FyZCBmZyAoZGFyaykgb3IgdG93YXJkIGJnIChsaWdodClcbiAgICBkZXJpdmVkLmhvdmVyID0gaXNMaWdodFxuICAgICAgPyBibGVuZENvbG9ycyhjYXJkQmFzZSwgYmcsIDAuMzUpXG4gICAgICA6IGJsZW5kQ29sb3JzKGNhcmRCYXNlLCBmZywgMC4wOCk7XG5cbiAgICAvLyBjYXJkLWhvdmVyOiBtaWRwb2ludCBiZXR3ZWVuIGNhcmQtYmFzZSBhbmQgaG92ZXJcbiAgICBkZXJpdmVkWydjYXJkLWhvdmVyJ10gPSBibGVuZENvbG9ycyhjYXJkQmFzZSwgZGVyaXZlZC5ob3ZlciwgMC41KTtcblxuICAgIC8vIGJhc2U6IHN1YmR1ZWQgYmFja2dyb3VuZCBiZXR3ZWVuIGJnIGFuZCBjYXJkLWJhc2VcbiAgICBkZXJpdmVkLmJhc2UgPSBibGVuZENvbG9ycyhiZywgY2FyZEJhc2UsIDAuNik7XG5cbiAgICAvLyBmZy1tdXRlZDogZGltbWVyIHRoYW4gbXV0ZWQsIGJsZW5kIHRvd2FyZCBiZ1xuICAgIGRlcml2ZWRbJ2ZnLW11dGVkJ10gPSBibGVuZENvbG9ycyhtdXRlZCwgYmcsIDAuMzUpO1xuXG4gICAgLy8gc3VjY2VzczogcmV1c2UgZG90LW9rICh0aGUgZ3JlZW4gb2YgdGhpcyB0aGVtZSlcbiAgICBkZXJpdmVkLnN1Y2Nlc3MgPSBkb3RPaztcblxuICAgIC8vIGVycm9yOiByZXVzZSBkb3QtYmFkICh0aGUgcmVkIG9mIHRoaXMgdGhlbWUpXG4gICAgZGVyaXZlZC5lcnJvciA9IGRvdEJhZDtcblxuICAgIC8vIHdhcm5pbmc6IHdhcm0gYW1iZXIsIGFkanVzdGVkIGZvciBjb250cmFzdFxuICAgIGRlcml2ZWQud2FybmluZyA9IGlzTGlnaHQgPyAnI2Q2OGEwMCcgOiAnI2YzOWMxMic7XG5cbiAgICByZXR1cm4gZGVyaXZlZDtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBib2R5IGJhY2tncm91bmQgQ1NTIGZvciB1c2VyIHRoZW1lcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZW5lcmF0ZUJvZHlCYWNrZ3JvdW5kQ1NTKHNsdWcsIGNvbG9ycykge1xuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzLmxpZ2h0QmcgfHwgKGNvbG9ycy5iZyAmJiBoZXhMdW1pbmFuY2UoY29sb3JzLmJnKSA+IDAuNCk7XG4gICAgdmFyIGFjY2VudCA9IGNvbG9ycy5hY2NlbnQgfHwgY29sb3JzWydhY2NlbnQtc3Ryb25nJ10gfHwgJyM4ODg4ODgnO1xuICAgIHZhciBhY2NlbnRSZ2IgPSBoZXhUb1JnYihhY2NlbnQpO1xuXG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJvZHkge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOlxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMjAwcHggODAwcHggYXQgMTAlIC0xMCUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4wOCksIHRyYW5zcGFyZW50IDYwJSksXFxuJyArXG4gICAgICAgICcgICAgcmFkaWFsLWdyYWRpZW50KDEwMDBweCA3MDBweCBhdCAxMTAlIDEwJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjA1KSwgdHJhbnNwYXJlbnQgNTUlKSxcXG4nICtcbiAgICAgICAgJyAgICB2YXIoLS1iZyk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICc6cm9vdC4nICsgc2x1ZyArICcgYm9keSB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6XFxuJyArXG4gICAgICAgICcgICAgcmFkaWFsLWdyYWRpZW50KDEyMDBweCA5MDBweCBhdCA4JSAtMTIlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMTApLCB0cmFuc3BhcmVudCA2MCUpLFxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMDAwcHggNzAwcHggYXQgMTEwJSAtMTAlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMDcpLCB0cmFuc3BhcmVudCA1NSUpLFxcbicgK1xuICAgICAgICAnICAgIHZhcigtLWJnKTtcXG4nICtcbiAgICAgICAgJ31cXG4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZSBidXR0b24gaG92ZXIgQ1NTIGZvciB1c2VyIHRoZW1lcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZW5lcmF0ZUJ1dHRvbkhvdmVyQ1NTKHNsdWcsIGNvbG9ycykge1xuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzLmxpZ2h0QmcgfHwgKGNvbG9ycy5iZyAmJiBoZXhMdW1pbmFuY2UoY29sb3JzLmJnKSA+IDAuNCk7XG5cbiAgICBpZiAoaXNMaWdodCkge1xuICAgICAgcmV0dXJuICc6cm9vdC4nICsgc2x1ZyArICcgYnV0dG9uOmhvdmVyIHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudC1zdHJvbmcpIDEyJSwgd2hpdGUgODglKTtcXG4nICtcbiAgICAgICAgJyAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4xNSk7XFxuJyArXG4gICAgICAgICcgIGJveC1zaGFkb3c6IDAgMXB4IDZweCByZ2JhKDAsIDAsIDAsIC4wOCksIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAuOCk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICc6cm9vdC4nICsgc2x1ZyArICcgYnV0dG9uOmhvdmVyIHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7XFxuJyArXG4gICAgICAgICcgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgMzUlLCB2YXIoLS1ib3JkZXIpKTtcXG4nICtcbiAgICAgICAgJ31cXG4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb3JlIHRoZW1lIGZ1bmN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRTeXN0ZW1UaGVtZSgpIHtcbiAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQ3VzdG9tUHJvcGVydGllcygpIHtcbiAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tJyArIHByb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2x1Z2lmeShuYW1lLCBjdXJyZW50U2x1Zykge1xuICAgIHZhciBzbHVnID0gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgaWYgKCFzbHVnKSBzbHVnID0gJ2N1c3RvbSc7XG4gICAgaWYgKEJVSUxUSU5fVEhFTUVTLmluZGV4T2Yoc2x1ZykgIT09IC0xKSBzbHVnID0gc2x1ZyArICctY3VzdG9tJztcbiAgICB2YXIgY2FjaGVkID0gc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIGJhc2UgPSBzbHVnO1xuICAgIHZhciBjb3VudGVyID0gMjtcbiAgICB3aGlsZSAoY2FjaGVkW3NsdWddICYmIHNsdWcgIT09IGN1cnJlbnRTbHVnKSB7XG4gICAgICBzbHVnID0gYmFzZSArICctJyArIGNvdW50ZXIrKztcbiAgICB9XG4gICAgcmV0dXJuIHNsdWc7XG4gIH1cblxuICAvLyBJbmplY3QgdXNlciB0aGVtZXMgZnJvbSBhIHRoZW1lcyBvYmplY3QgaW50byBET00gKyBydW50aW1lXG4gIGZ1bmN0aW9uIGluamVjdFVzZXJUaGVtZVN0eWxlcyh0aGVtZXNEYXRhKSB7XG4gICAgdmFyIGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItdGhlbWUtc3R5bGVzJyk7XG4gICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcblxuICAgIFRIRU1FUy5sZW5ndGggPSBCVUlMVElOX1RIRU1FUy5sZW5ndGg7XG4gICAgT2JqZWN0LmtleXMoVEhFTUVfQ09MT1JTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBpZiAoQlVJTFRJTl9USEVNRVMuaW5kZXhPZihrKSA9PT0gLTEpIGRlbGV0ZSBUSEVNRV9DT0xPUlNba107XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgZGF0YSwgb3IgZmFsbCBiYWNrIHRvIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIHZhciB1c2VyVGhlbWVzID0gdGhlbWVzRGF0YSB8fCBzYWZlR2V0SlNPTihVU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1Z3MgPSBPYmplY3Qua2V5cyh1c2VyVGhlbWVzKTtcblxuICAgIC8vIEZpbHRlciBvdXQgYW55IHVzZXIgdGhlbWVzIHRoYXQgY29sbGlkZSB3aXRoIGJ1aWx0LWluIHNsdWdzXG4gICAgc2x1Z3MgPSBzbHVncy5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIEJVSUxUSU5fVEhFTUVTLmluZGV4T2YocykgPT09IC0xOyB9KTtcblxuICAgIGlmICghc2x1Z3MubGVuZ3RoKSByZXR1cm47XG5cbiAgICB2YXIgY3NzID0gJyc7XG4gICAgc2x1Z3MuZm9yRWFjaChmdW5jdGlvbiAoc2x1Zykge1xuICAgICAgdmFyIHRoZW1lID0gdXNlclRoZW1lc1tzbHVnXTtcbiAgICAgIGlmIChUSEVNRVMuaW5kZXhPZihzbHVnKSA9PT0gLTEpIFRIRU1FUy5wdXNoKHNsdWcpO1xuXG4gICAgICAvLyBCdWlsZCBjb2xvciBtYXAgZnJvbSBzYXZlZCBkYXRhXG4gICAgICB2YXIgY29sb3JNYXAgPSB7fTtcbiAgICAgIFRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKHRoZW1lW3BdKSBjb2xvck1hcFtwXSA9IHRoZW1lW3BdOyB9KTtcbiAgICAgIGNvbG9yTWFwWydjYXJkLWJnJ10gPSB0aGVtZVsnY2FyZC1iYXNlJ10gfHwgdGhlbWUuYmc7XG4gICAgICBpZiAodGhlbWUubGlnaHRCZykgY29sb3JNYXAubGlnaHRCZyA9IHRydWU7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFueSBtaXNzaW5nIGV4dGVuZGVkIGNvbG9yc1xuICAgICAgdmFyIGRlcml2ZWQgPSBkZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvck1hcCk7XG4gICAgICBERVJJVkVEX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKCFjb2xvck1hcFtwXSAmJiBkZXJpdmVkW3BdKSBjb2xvck1hcFtwXSA9IGRlcml2ZWRbcF07XG4gICAgICB9KTtcblxuICAgICAgVEhFTUVfQ09MT1JTW3NsdWddID0gY29sb3JNYXA7XG5cbiAgICAgIC8vIEVtaXQgbWFpbiB2YXJpYWJsZSBibG9ja1xuICAgICAgY3NzICs9ICc6cm9vdC4nICsgc2x1ZyArICcge1xcbic7XG4gICAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmIChjb2xvck1hcFtwXSkgY3NzICs9ICcgIC0tJyArIHAgKyAnOiAnICsgY29sb3JNYXBbcF0gKyAnO1xcbic7XG4gICAgICB9KTtcbiAgICAgIGNzcyArPSAnfVxcbic7XG5cbiAgICAgIC8vIEVtaXQgYm9keSBiYWNrZ3JvdW5kIGdyYWRpZW50XG4gICAgICBjc3MgKz0gZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyhzbHVnLCBjb2xvck1hcCk7XG5cbiAgICAgIC8vIEVtaXQgYnV0dG9uIGhvdmVyIG92ZXJyaWRlXG4gICAgICBjc3MgKz0gZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyhzbHVnLCBjb2xvck1hcCk7XG4gICAgfSk7XG5cbiAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gJ3VzZXItdGhlbWUtc3R5bGVzJztcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxuXG4gIC8vIEZldGNoIHRoZW1lcyBmcm9tIHNlcnZlciwgdXBkYXRlIGNhY2hlLCByZS1pbmplY3QgaWYgY2hhbmdlZFxuICBmdW5jdGlvbiBzeW5jVGhlbWVzRnJvbVNlcnZlcigpIHtcbiAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMnKS50aGVuKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLmpzb24oKTsgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEudGhlbWVzKSByZXR1cm47XG4gICAgICB2YXIgc2VydmVyVGhlbWVzID0gZGF0YS50aGVtZXM7XG4gICAgICB2YXIgY2FjaGVkID0gc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBkaWZmZXJlbnRcbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXJ2ZXJUaGVtZXMpICE9PSBKU09OLnN0cmluZ2lmeShjYWNoZWQpKSB7XG4gICAgICAgIHNhZmVTZXQoVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeShzZXJ2ZXJUaGVtZXMpKTtcbiAgICAgICAgaW5qZWN0VXNlclRoZW1lU3R5bGVzKHNlcnZlclRoZW1lcyk7XG4gICAgICAgIC8vIFJlLWFwcGx5IGN1cnJlbnQgdGhlbWUgaW4gY2FzZSBpdCB3YXMganVzdCBzeW5jZWRcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBzYWZlR2V0KFRIRU1FX0tFWSk7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIFRIRU1FUy5pbmRleE9mKGN1cnJlbnQpICE9PSAtMSkge1xuICAgICAgICAgIGFwcGx5VGhlbWUoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gIH1cblxuICAvLyBNaWdyYXRlIGxlZ2FjeSBjdXN0b20tdGhlbWUgdG8gc2VydmVyXG4gIGZ1bmN0aW9uIG1pZ3JhdGVMZWdhY3lDdXN0b21UaGVtZSgpIHtcbiAgICB2YXIgbGVnYWN5ID0gc2FmZUdldEpTT04oTEVHQUNZX0NVU1RPTV9LRVkpO1xuICAgIGlmICghbGVnYWN5KSByZXR1cm47XG5cbiAgICB2YXIgbmFtZSA9IGxlZ2FjeS5uYW1lIHx8ICdDdXN0b20nO1xuICAgIHZhciBzbHVnID0gc2x1Z2lmeShuYW1lKTtcblxuICAgIHZhciB0aGVtZURhdGEgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAobGVnYWN5W3BdKSB0aGVtZURhdGFbcF0gPSBsZWdhY3lbcF07XG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRvIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseVxuICAgIHZhciBjYWNoZWQgPSBzYWZlR2V0SlNPTihVU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICBjYWNoZWRbc2x1Z10gPSB0aGVtZURhdGE7XG4gICAgc2FmZVNldChVU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KGNhY2hlZCkpO1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2ZSB0aGVtZSByZWZlcmVuY2VcbiAgICBpZiAoc2FmZUdldChUSEVNRV9LRVkpID09PSAnY3VzdG9tJykge1xuICAgICAgc2FmZVNldChUSEVNRV9LRVksIHNsdWcpO1xuICAgIH1cblxuICAgIHNhZmVSZW1vdmUoTEVHQUNZX0NVU1RPTV9LRVkpO1xuXG4gICAgLy8gQWxzbyBwdXNoIHRvIHNlcnZlclxuICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmICh0aGVtZURhdGFbcF0pIGNvbG9yc1twXSA9IHRoZW1lRGF0YVtwXTsgfSk7XG4gICAgZmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBuYW1lLCBjb2xvcnM6IGNvbG9ycyB9KVxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5VGhlbWUobW9kZSkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGVtZS10cmFuc2l0aW9uaW5nJyk7XG5cbiAgICBUSEVNRVMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHQgIT09ICdkYXJrJykgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodCk7XG4gICAgfSk7XG5cbiAgICBjbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcblxuICAgIGlmIChtb2RlICE9PSAnZGFyaycpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKG1vZGUpO1xuICAgIH1cblxuICAgIHNhZmVTZXQoVEhFTUVfS0VZLCBtb2RlKTtcblxuICAgIHZhciBjb2xvcnMgPSBUSEVNRV9DT0xPUlNbbW9kZV07XG4gICAgdmFyIG1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJ0aGVtZS1jb2xvclwiXScpO1xuICAgIGlmIChtZXRhICYmIGNvbG9ycykgbWV0YS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCBjb2xvcnMuYmcpO1xuXG4gICAgLy8gVG9nZ2xlIGxpZ2h0LWJnIGNsYXNzOiBleHBsaWNpdCBmbGFnIGZpcnN0LCB0aGVuIGF1dG8tZGV0ZWN0IGZyb20gbHVtaW5hbmNlXG4gICAgdmFyIGlzTGlnaHQgPSBjb2xvcnMgJiYgY29sb3JzLmxpZ2h0Qmc7XG4gICAgaWYgKCFpc0xpZ2h0ICYmIGNvbG9ycyAmJiBjb2xvcnMuYmcpIGlzTGlnaHQgPSBoZXhMdW1pbmFuY2UoY29sb3JzLmJnKSA+IDAuNDtcbiAgICBpZiAoaXNMaWdodCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpZ2h0LWJnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWdodC1iZycpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RoZW1lLXRyYW5zaXRpb25pbmcnKTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLy8gLS0tIEluaXRpYWxpemF0aW9uIC0tLVxuICBtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUoKTtcbiAgLy8gSW5zdGFudCBsb2FkIGZyb20gY2FjaGVcbiAgaW5qZWN0VXNlclRoZW1lU3R5bGVzKCk7XG5cbiAgdmFyIHNhdmVkVGhlbWUgPSBzYWZlR2V0KFRIRU1FX0tFWSk7XG4gIGlmIChzYXZlZFRoZW1lID09PSAncmVkJykgeyBzYXZlZFRoZW1lID0gJ2JsYWNrJzsgc2FmZVNldChUSEVNRV9LRVksICdibGFjaycpOyB9XG4gIGlmIChzYXZlZFRoZW1lICYmIHNhdmVkVGhlbWUgIT09ICdkYXJrJyAmJiBUSEVNRVMuaW5kZXhPZihzYXZlZFRoZW1lKSA9PT0gLTEpIHtcbiAgICBzYXZlZFRoZW1lID0gbnVsbDtcbiAgfVxuICBhcHBseVRoZW1lKHNhdmVkVGhlbWUgfHwgZ2V0U3lzdGVtVGhlbWUoKSk7XG5cbiAgLy8gU3luYyBmcm9tIHNlcnZlciBpbiBiYWNrZ3JvdW5kICh1cGRhdGVzIGNhY2hlIGlmIHNlcnZlciBoYXMgbmV3ZXIgZGF0YSlcbiAgc3luY1RoZW1lc0Zyb21TZXJ2ZXIoKTtcblxuICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFzYWZlR2V0KFRIRU1FX0tFWSkpIHtcbiAgICAgIGFwcGx5VGhlbWUoZS5tYXRjaGVzID8gJ2RhcmsnIDogJ2xpZ2h0Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHBvc2UgQVBJXG4gIHdpbmRvdy5USEVNRVMgPSBUSEVNRVM7XG4gIHdpbmRvdy5CVUlMVElOX1RIRU1FUyA9IEJVSUxUSU5fVEhFTUVTO1xuICB3aW5kb3cuVEhFTUVfQ09MT1JTID0gVEhFTUVfQ09MT1JTO1xuICB3aW5kb3cuVEhFTUVfUFJPUFMgPSBUSEVNRV9QUk9QUztcbiAgd2luZG93LkJBU0VfUFJPUFMgPSBCQVNFX1BST1BTO1xuICB3aW5kb3cuREVSSVZFRF9QUk9QUyA9IERFUklWRURfUFJPUFM7XG4gIHdpbmRvdy5VU0VSX1RIRU1FU19LRVkgPSBVU0VSX1RIRU1FU19LRVk7XG4gIHdpbmRvdy5hcHBseVRoZW1lID0gYXBwbHlUaGVtZTtcbiAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcyA9IGNsZWFyQ3VzdG9tUHJvcGVydGllcztcbiAgd2luZG93LmluamVjdFVzZXJUaGVtZVN0eWxlcyA9IGluamVjdFVzZXJUaGVtZVN0eWxlcztcbiAgd2luZG93LnN5bmNUaGVtZXNGcm9tU2VydmVyID0gc3luY1RoZW1lc0Zyb21TZXJ2ZXI7XG4gIHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lID0gc2x1Z2lmeTtcbiAgd2luZG93LmdldEFjdGl2ZVRoZW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2FmZUdldChUSEVNRV9LRVkpIHx8IGdldFN5c3RlbVRoZW1lKCk7IH07XG4gIHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyA9IGRlcml2ZUV4dGVuZGVkQ29sb3JzO1xuICB3aW5kb3cuaGV4VG9SZ2IgPSBoZXhUb1JnYjtcbiAgd2luZG93LnJnYlRvSGV4ID0gcmdiVG9IZXg7XG4gIHdpbmRvdy5ibGVuZENvbG9ycyA9IGJsZW5kQ29sb3JzO1xufSkoKTtcbjtcbi8vID09PT09IFBMVUdHQUJMRSBBVVRIIEdBVEUgKERDLTA0OSkgPT09PT1cbi8vXG4vLyBPbiBDYWRkeSByZWRpcmVjdCB0byA/YXV0aD1yZXF1aXJlZCwgdGhpcyBtb2R1bGUgcXVlcmllc1xuLy8gR0VUIC9hcGkvdjEvYXV0aC9sb2dpbi9tZXRob2RzIHRvIGRpc2NvdmVyIHdoaWNoIEF1dGhQcm92aWRlcnMgYXJlIGVuYWJsZWQuXG4vLyBJZiBvbmx5IG9uZSBwcm92aWRlciBpcyBlbmFibGVkLCBqdW1wIHN0cmFpZ2h0IHRvIGl0cyBjaGFsbGVuZ2UgVUlcbi8vIChUT1RQLW9ubHkgaW5zdGFsbGF0aW9ucyB0b2RheSkuIElmIG11bHRpcGxlIHByb3ZpZGVycyBleGlzdCwgcmVuZGVyIGFcbi8vIHNlbGVjdG9yIGZpcnN0IHNvIHRoZSB1c2VyIHBpY2tzIGhvdyB0byBzaWduIGluLlxuLy9cbi8vIFRvZGF5OlxuLy8gICAtIHRvdHA6ICAgIGNoYWxsZW5nZSBpcyA2LWRpZ2l0IGNvZGUgdmlhIHRoZSBleGlzdGluZyBUT1RQIG92ZXJsYXlcbi8vICAgLSBlbWFpbDogICBjaGFsbGVuZ2UgaXMgZW1haWwgYWRkcmVzcyBcdTIxOTIgUE9TVCAvYXBpL3YxL2F1dGgvbG9naW4vZW1haWwvaW5pdGlhdGVcbi8vICAgICAgICAgICAgICBcdTIxOTIgc2VydmVyIGVtYWlscyBtYWdpYyBsaW5rIChvciBsb2dzIGl0IHRvIGNvbnNvbGUgaW4gZGV2KSBcdTIxOTJcbi8vICAgICAgICAgICAgICB3YWl0aW5nIGZvciB2ZXJpZmljYXRpb24gKG5vIGF1dG8tcHJvbW90aW9uOyB1c2VyIHJlbG9hZHMgdmlhXG4vLyAgICAgICAgICAgICAgZW1haWwgbGluaywgd2hpY2ggcm91dGVzIHRocm91Z2ggL2FwaS92MS9hdXRoL2xvZ2luL2VtYWlsL3ZlcmlmeSlcbi8vXG4vLyBUaGlzIG1vZHVsZSB3aXJlcyBpbnRvIHRoZSBleGlzdGluZyB0b3RwLWF1dGguanMgc3VibWl0VG90cENvZGUoKSBmbG93IHNvXG4vLyB0aGUgbGVnYWN5IFRPVFAgaGFwcHktcGF0aCBpcyB1bmNoYW5nZWQ6IHdoZW4gbWV0aG9kcyByZXR1cm5zIG9ubHlcbi8vIGB0b3RwYCwgdGhpcyBtb2R1bGUganVzdCBzaG93cyB0aGUgVE9UUCBvdmVybGF5IGFuZCBleGl0cy5cblxuKGZ1bmN0aW9uKCkge1xuICAvLyAtLS0tIERPTSByZWZzIChjcmVhdGVkIGxhemlseSBiZWxvdzsgZXhpc3RpbmcgVE9UUCBtYXJrdXAgc3VwcGxpZXMgdGhlbSkgLS0tLVxuICBsZXQgbWV0aG9kc0NhY2hlID0gbnVsbDtcblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaE1ldGhvZHMoKSB7XG4gICAgaWYgKG1ldGhvZHNDYWNoZSkgcmV0dXJuIG1ldGhvZHNDYWNoZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXV0aC9sb2dpbi9tZXRob2RzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYG1ldGhvZHMgSFRUUCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIG1ldGhvZHNDYWNoZSA9IEFycmF5LmlzQXJyYXkoZGF0YS5wcm92aWRlcnMpID8gZGF0YS5wcm92aWRlcnMgOiBbXTtcbiAgICAgIHJldHVybiBtZXRob2RzQ2FjaGU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUHVibGljIGVuZHBvaW50IFx1MjAxNCBpZiBpdCBmYWlscywgZmFsbCB0aHJvdWdoIHRvIGxlZ2FjeSBUT1RQIHBhdGguXG4gICAgICBjb25zb2xlLndhcm4oJ1thdXRoLWdhdGVdIG1ldGhvZHMgZmV0Y2ggZmFpbGVkOyBmYWxsaW5nIGJhY2sgdG8gVE9UUC1vbmx5JywgZSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1Byb3ZpZGVyU2VsZWN0b3IocHJvdmlkZXJzKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICAvLyBTYXZlIHRoZSBleGlzdGluZyBUT1RQLWNoYWxsZW5nZSBib2R5IHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNhbmNlbC5cbiAgICBjb25zdCBvcmlnaW5hbEJvZHkgPSBjYXJkLmlubmVySFRNTDtcbiAgICBpZiAoIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICBjb25zdCBwcm92aWRlckJ1dHRvbnMgPSBwcm92aWRlcnMubWFwKHAgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSAocC5jb25maWcgJiYgKHAuY29uZmlnLmxhYmVsIHx8IHAubmFtZSkpIHx8IHAubmFtZTtcbiAgICAgIGNvbnN0IGJ0biA9IGA8YnV0dG9uIGNsYXNzPVwicHJvdmlkZXItYnRuXCIgZGF0YS1wcm92aWRlcj1cIiR7cC5uYW1lfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luOiA2cHggNHB4OyBwYWRkaW5nOiAxMHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICBTaWduIGluIHdpdGggJHtsYWJlbH1cbiAgICAgIDwvYnV0dG9uPmA7XG4gICAgICByZXR1cm4gYnRuO1xuICAgIH0pLmpvaW4oJ1xcbicpO1xuXG4gICAgY2FyZC5pbm5lckhUTUwgPSBgXG4gICAgICA8aW1nIGNsYXNzPVwidG90cC1sb2dvIHRvdHAtbG9nby1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICA8aW1nIGNsYXNzPVwidG90cC1sb2dvIHRvdHAtbG9nby1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5DaG9vc2UgaG93IHRvIHNpZ24gaW48L3A+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLXByb3ZpZGVyc1wiIHN0eWxlPVwibWFyZ2luOiAxNHB4IDAgMTBweDtcIj4ke3Byb3ZpZGVyQnV0dG9uc308L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtbWVzc2FnZVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj48L2Rpdj5cbiAgICBgO1xuXG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBXaXJlIGVhY2ggYnV0dG9uXG4gICAgY2FyZC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvdmlkZXItYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gYnRuLmRhdGFzZXQucHJvdmlkZXI7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gcHJvdmlkZXJzLmZpbmQocCA9PiBwLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICByZW5kZXJQcm92aWRlckNoYWxsZW5nZShwcm92aWRlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVPcmlnaW5hbEJvZHkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkIHx8ICFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSByZXR1cm47XG4gICAgY2FyZC5pbm5lckhUTUwgPSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5O1xuICAgIC8vIFJlLWJpbmQgdGhlIG9yaWdpbmFsIGRpZ2l0IGlucHV0IGhhbmRsZXJzIGJ5IHJlLXJ1bm5pbmcgdGhlIHRvdHAtYXV0aFxuICAgIC8vIGJvb3RzdHJhcC4gVGhlIHNpbXBsZXN0IHBhdGg6IHJlbG9hZCB0aGUgcGFnZSwgd2hpY2ggcmUtcnVucyBhbGwgSUlGRXMuXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIGlmIChwcm92aWRlci5uYW1lID09PSAndG90cCcpIHtcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIFx1MjE5MiBleGlzdGluZyB0b3RwLWF1dGguanMgc3VibWl0VG90cENvZGVcbiAgICAgIC8vIHBhdGggaGFuZGxlcyB0aGUgcmVzdC4gKFJlbG9hZCBpcyB0aGUgY2xlYW5lc3QgcGF0aCBiZWNhdXNlXG4gICAgICAvLyB0b3RwLWF1dGguanMgd2lyZXMgaXRzIGlucHV0IGhhbmRsZXJzIGF0IHRvcC1sZXZlbCBJSUZFIHRpbWUuKVxuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm92aWRlci5uYW1lID09PSAnZW1haWwnKSB7XG4gICAgICBjYXJkLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgICA8aW1nIGNsYXNzPVwidG90cC1sb2dvIHRvdHAtbG9nby1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPlNpZ24gaW4gd2l0aCBlbWFpbDwvcD5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDZweCAwIDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICBXZSdsbCBlbWFpbCB5b3UgYSBvbmUtdGltZSBzaWduLWluIGxpbmsuXG4gICAgICAgIDwvcD5cbiAgICAgICAgPGlucHV0IGlkPVwiYXV0aC1nYXRlLWVtYWlsLWlucHV0XCIgdHlwZT1cImVtYWlsXCIgaW5wdXRtb2RlPVwiZW1haWxcIiBhdXRvY29tcGxldGU9XCJlbWFpbFwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInlvdUBleGFtcGxlLmNvbVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDEycHg7IGZvbnQtc2l6ZTogMXJlbTsgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtYmcpOyBjb2xvcjogdmFyKC0tdGV4dCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1zdWJtaXRcIiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNHB4OyBwYWRkaW5nOiAxMHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjk1cmVtOyB3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICBTZW5kIHNpZ24taW4gbGlua1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1zdGF0dXNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgbGluZS1oZWlnaHQ6IDEuNDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBpZD1cImF1dGgtZ2F0ZS1iYWNrXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdTIxOTAgQmFjazwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgICBjb25zdCBpbnB1dCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1pbnB1dCcpO1xuICAgICAgY29uc3Qgc3VibWl0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLXN1Ym1pdCcpO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLXN0YXR1cycpO1xuICAgICAgY29uc3QgYmFjayA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1iYWNrJyk7XG5cbiAgICAgIHN1Ym1pdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZW1haWwgPSAoaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFlbWFpbCB8fCAhZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuJztcbiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tZXJyb3IsICNkMzMpJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3VibWl0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1NlbmRpbmdcdTIwMjYnO1xuICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdXRoL2xvZ2luL2VtYWlsL2luaXRpYXRlJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW1haWwgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgdmlhID0gZGF0YS5kZWxpdmVyZWRWaWEgfHwgJ2VtYWlsJztcbiAgICAgICAgICAgIGNvbnN0IG1hc2tlZCA9IGRhdGEubWFza2VkRW1haWwgfHwgZW1haWw7XG4gICAgICAgICAgICBpZiAodmlhID09PSAnZGV2LWNvbnNvbGUnKSB7XG4gICAgICAgICAgICAgIHN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHNlcnZlciBsb2dzIGZvciB5b3VyIG9uZS10aW1lIGxpbmsuXG4gICAgICAgICAgICAgICAgKERldiBtb2RlOiBubyBTTVRQIGNvbmZpZ3VyZWQuIEluIHByb2R1Y3Rpb24gdGhpcyB3b3VsZCBlbWFpbCA8c3Ryb25nPiR7bWFza2VkfTwvc3Ryb25nPi4pYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXR1cy5pbm5lckhUTUwgPSBgU2lnbi1pbiBsaW5rIHNlbnQgdG8gPHN0cm9uZz4ke21hc2tlZH08L3N0cm9uZz4uXG4gICAgICAgICAgICAgICAgQ2hlY2sgeW91ciBpbmJveCAoYW5kIHNwYW0gZm9sZGVyKS5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLXN1Y2Nlc3MsICMyYTcpJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnQ291bGQgbm90IHNlbmQgbGluay4nO1xuICAgICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvci4gVHJ5IGFnYWluLic7XG4gICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgc3VibWl0LmNsaWNrKCk7XG4gICAgICB9KTtcblxuICAgICAgYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNob3dQcm92aWRlclNlbGVjdG9yKHByb3ZpZGVycyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHByb3ZpZGVyIFx1MjE5MiByZXN0b3JlIFRPVFAgcGF0aCBhcyBhIGxhc3QgcmVzb3J0XG4gICAgY29uc29sZS53YXJuKCdbYXV0aC1nYXRlXSB1bmtub3duIHByb3ZpZGVyJywgcHJvdmlkZXIubmFtZSk7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2hvdygpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmICghb3ZlcmxheSkgcmV0dXJuOyAvLyBUT1RQLW9ubHkgYnVpbGQgd2l0aG91dCBvdXIgb3ZlcmxheSBjaGFuZ2VzXG5cbiAgICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCBmZXRjaE1ldGhvZHMoKTtcbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRWl0aGVyIHRoZSBlbmRwb2ludCBpc24ndCByZWFjaGFibGUgT1Igbm8gcHJvdmlkZXIgcmVwb3J0cyBlbmFibGVkLlxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgVE9UUCBvdmVybGF5IFx1MjAxNCBleGlzdGluZyB0b3RwLWF1dGguanMgaGFuZGxlcyBpdC5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Ll9zaG93VG90cE92ZXJsYXkgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcm92aWRlcnMubGVuZ3RoID09PSAxICYmIHByb3ZpZGVyc1swXS5uYW1lID09PSAndG90cCcpIHtcbiAgICAgIC8vIFNpbmdsZSBUT1RQIHByb3ZpZGVyIFx1MjE5MiBzaG93IHRoZSBvcmlnaW5hbCBUT1RQIG92ZXJsYXkgdW5jaGFuZ2VkLFxuICAgICAgLy8gYnV0IHdpdGggYW4gXCJPciBzaWduIGluIHdpdGggZW1haWxcIiBsaW5rIGJlbG93IHNvIHRoZSBlbWFpbCBwYXRoXG4gICAgICAvLyBpcyByZWFjaGFibGUgYXMgdGhlIHJlY292ZXJ5IC8gcGhvbmUtZnJpZW5kbHkgYWx0ZXJuYXRpdmUuIE1vc3RcbiAgICAgIC8vIHVzZXJzIHN0aWxsIHdhbnQgdGhlaXIgcHJpbWFyeSBtZXRob2QgKFRPVFApIGZyb250LWFuZC1jZW50ZXIuXG4gICAgICBzaG93VG90cFdpdGhFbWFpbEZhbGxiYWNrKHByb3ZpZGVyc1swXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNob3dQcm92aWRlclNlbGVjdG9yKHByb3ZpZGVycyk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93VG90cFdpdGhFbWFpbEZhbGxiYWNrKHRvdHBQcm92aWRlcikge1xuICAgIGNvbnN0IGVtYWlsRW5hYmxlZCA9IG1ldGhvZHNDYWNoZSAmJiBtZXRob2RzQ2FjaGUuZmluZChwID0+IHAubmFtZSA9PT0gJ2VtYWlsJyk7XG4gICAgaWYgKCFlbWFpbEVuYWJsZWQpIHtcbiAgICAgIC8vIFRydWx5IHNpbmdsZS1wcm92aWRlciBwYXRoOiBsZWdhY3kgVE9UUCBvdmVybGF5LCBubyBhbHQgbGluay5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Ll9zaG93VG90cE92ZXJsYXkgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgVE9UUCBtYXJrdXAgc28gd2UgY2FuIHJlc3RvcmUgb24gYWx0LWxpbmsgY2xpY2sgb2ZmLlxuICAgIGlmICghY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSA9IGNhcmQuaW5uZXJIVE1MO1xuXG4gICAgLy8gQWRkIGEgc21hbGwgXCJvclwiIGxpbmsgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZXhpc3RpbmcgY2FyZCBXSVRIT1VUXG4gICAgLy8gdG91Y2hpbmcgdGhlIFRPVFAgaW5wdXQgbWFya3VwIFx1MjAxNCBrZWVwcyB0b3RwLWF1dGguanMncyBzdWJtaXRUb3RwQ29kZVxuICAgIC8vIGJpbmRpbmcgaW50YWN0LlxuICAgIGxldCBhbHQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtYWx0Jyk7XG4gICAgaWYgKCFhbHQpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LmlkID0gJ2F1dGgtZ2F0ZS1lbWFpbC1hbHQnO1xuICAgICAgZGl2LnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLXRvcDogMThweDsgcGFkZGluZy10b3A6IDE0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuODVyZW07JztcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBgPGEgaHJlZj1cIiNcIiBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1hbHQtbGlua1wiXG4gICAgICAgIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTtcIj5cbiAgICAgICAgT3Igc2lnbiBpbiB3aXRoIGVtYWlsIGluc3RlYWQgXHUyMTkyXG4gICAgICA8L2E+YDtcbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIGRpdi5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWFsdC1saW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZW5kZXJQcm92aWRlckNoYWxsZW5nZShlbWFpbEVuYWJsZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgLy8gLS0tLSBUcmlnZ2VyIHBvaW50cyAtLS0tXG4gIC8vIDEuIFNTTyByZWRpcmVjdCBmcm9tIENhZGR5OiA/YXV0aD1yZXF1aXJlZFxuICAvLyAgICBXZSBjbGFpbSBvd25lcnNoaXAgaGVyZSAoc2V0IHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkID0gdHJ1ZSlcbiAgLy8gICAgQkVGT1JFIHRvdHAtYXV0aC5qcydzIG93biA/YXV0aD1yZXF1aXJlZCBjaGVjayBydW5zLCBzbyB0aGUgbGVnYWN5XG4gIC8vICAgIFRPVFAtb25seSBvdmVybGF5IGRvZXNuJ3QgZmxpY2tlciBpbiBmb3IgbXVsdGktcHJvdmlkZXIgaW5zdGFsbHMuXG4gIC8vICAgIFNpbmdsZS1wcm92aWRlciBUT1RQLW9ubHkgaW5zdGFsbHMgd29yayBiZWNhdXNlIHdlIHN0aWxsIGRlbGVnYXRlXG4gIC8vICAgIGJhY2sgdG8gd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKSBpbiBgc2hvdygpYCBiZWxvdy5cbiAgd2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIGlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZXR1cm5VcmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdodHRwczonKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIGdsb2JhbHMuanMgaXMgY29uY2F0ZW5hdGVkIGJlZm9yZSB0aGlzIG1vZHVsZSBpbiBjb3JlLmpzLCBzbyBTSVRFIGlzXG4gICAgICAvLyBhdmFpbGFibGUgaGVyZS4gUGVybWl0IGV4YWN0IGhvc3RzIGFuZCBzdWJkb21haW5zIHVuZGVyIHRoZSBjb25maWd1cmVkXG4gICAgICAvLyBwcml2YXRlIFRMRCAoZm9yIGV4YW1wbGUgcGxleC5zYW1pKSwgd2hpbGUgcmVqZWN0aW5nIGxvb2thbGlrZXMgc3VjaCBhc1xuICAgICAgLy8gcGxleC5zYW1pLmV2aWwuZXhhbXBsZS5cbiAgICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgICByZXR1cm4gcGFyc2VkLmhvc3RuYW1lID09PSBzdWZmaXguc2xpY2UoMSkgfHwgcGFyc2VkLmhvc3RuYW1lLmVuZHNXaXRoKHN1ZmZpeCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIGlmICh1cmxQYXJhbXMuZ2V0KCdhdXRoJykgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAvLyBQcmVzZXJ2ZSB0aGUgZ2F0ZWQgc2VydmljZSBkZXN0aW5hdGlvbiBzbyBzdWJtaXRUb3RwQ29kZSgpIGNhbiBhcHBlbmRcbiAgICAvLyB0aGUgb25lLXRpbWUgU1NPIGhhbmRvZmYgdG9rZW4gYW5kIHJldHVybiB0aGUgYnJvd3NlciB0byB0aGF0IGhvc3QuXG4gICAgY29uc3QgcmV0dXJuVXJsID0gdXJsUGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblVybCAmJiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSkge1xuICAgICAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndG90cF9yZWRpcmVjdCcsIHJldHVyblVybCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICAgIC8vIENsZWFuIFVSTCBcdTIwMTQgaGFwcGVucyBhZnRlciB3ZSd2ZSBjYXB0dXJlZCB0aGUgcmVkaXJlY3RcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIC8vIFNob3cgb24gbmV4dCB0aWNrIHNvIHRoZSBET00gKHRoZSAudG90cC1jYXJkKSBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2hvdywgMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGhvdC10cmlnZ2VyIGZyb20gb3RoZXIgbW9kdWxlcyAoZS5nLiBsb2dvdXQpXG4gIHdpbmRvdy5fc2hvd0F1dGhHYXRlID0gc2hvdztcbiAgd2luZG93Ll9hdXRoR2F0ZU1ldGhvZHMgPSBmZXRjaE1ldGhvZHM7XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBBVVRIRU5USUNBVElPTiBHQVRFID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIHVwZGF0ZVRvdHBMb2dvKCkge1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG4gICAgY29uc3QgYmcgPSBnZXRDb21wdXRlZFN0eWxlKGNhcmQpLmJhY2tncm91bmRDb2xvcjtcbiAgICBjb25zdCBtID0gYmcubWF0Y2goL1xcZCsvZyk7XG4gICAgaWYgKCFtKSByZXR1cm47XG4gICAgY29uc3QgbHVtID0gKDAuMjk5ICogK21bMF0gKyAwLjU4NyAqICttWzFdICsgMC4xMTQgKiArbVsyXSkgLyAyNTU7XG4gICAgY29uc3QgZGFyayA9IGNhcmQucXVlcnlTZWxlY3RvcignLnRvdHAtbG9nby1kYXJrJyk7XG4gICAgY29uc3QgbGlnaHQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWxvZ28tbGlnaHQnKTtcbiAgICBpZiAoZGFyaykgZGFyay5zdHlsZS5kaXNwbGF5ID0gbHVtID4gMC41ID8gJ25vbmUnIDogJyc7XG4gICAgaWYgKGxpZ2h0KSBsaWdodC5zdHlsZS5kaXNwbGF5ID0gbHVtID4gMC41ID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93VG90cE92ZXJsYXkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgICBzZXRUaW1lb3V0KHVwZGF0ZVRvdHBMb2dvLCA1MCk7XG4gICAgICBjb25zdCBmaXJzdElucHV0ID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1kaWdpdHMgaW5wdXQnKTtcbiAgICAgIGlmIChmaXJzdElucHV0KSBzZXRUaW1lb3V0KCgpID0+IGZpcnN0SW5wdXQuZm9jdXMoKSwgMTAwKTtcbiAgICB9XG4gICAgLy8gUmVmcmVzaCB0aGUgXCJMb3N0IGFjY2Vzcz9cIiByZWNvdmVyeSBsaW5rIHZpc2liaWxpdHkgYmFzZWQgb24gc2VydmVyIHN0YXRlLlxuICAgIC8vIEhpZGVzIGl0c2VsZiBpZiBUT1RQIGlzIGhlYWx0aHk7IHNob3dzIGlmIHVucmVhZGFibGUvY29ycnVwdC4gVGhlIHVzZXJcbiAgICAvLyBjYW4gc3RpbGwgY2xpY2sgaXQgZXZlbiB3aGVuIGhlYWx0aHkgXHUyMDE0IGJ1dCB0aGUgcGFuZWwgd2lsbCBleHBsYWluIHRoZXJlJ3NcbiAgICAvLyBubyByZWNvdmVyeSBuZWVkZWQuIENoZWFwZXIgdGhhbiBnYXRpbmcgaXQuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluaygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVUb3RwT3ZlcmxheSgpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmIChvdmVybGF5KSBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3NvSGFuZG9mZlRhcmdldChyZWRpcmVjdCwgdG9rZW4pIHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJlZGlyZWN0LCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICBjb25zdCBpc1ByaXZhdGVIb3N0ID0gcGFyc2VkLmhvc3RuYW1lID09PSBzdWZmaXguc2xpY2UoMSkgfHwgcGFyc2VkLmhvc3RuYW1lLmVuZHNXaXRoKHN1ZmZpeCk7XG4gICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ2h0dHBzOicgfHwgIWlzUHJpdmF0ZUhvc3QpIHJldHVybiBudWxsO1xuICAgIGlmICghdG9rZW4pIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHJldHVyblBhdGggPSBgJHtwYXJzZWQucGF0aG5hbWV9JHtwYXJzZWQuc2VhcmNofSR7cGFyc2VkLmhhc2h9YDtcbiAgICBwYXJzZWQucGF0aG5hbWUgPSAnL2Rhc2hjYWRkeS1zc28nO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICBwYXJzZWQuaGFzaCA9ICcnO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHRva2VuKTtcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgncmV0dXJuJywgcmV0dXJuUGF0aCk7XG4gICAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuICB9XG5cbiAgLy8gU2V0dXAgZGlnaXQgaW5wdXQgVVhcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZGlnaXRzJyk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb25zdCBpbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBlLnRhcmdldC52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBlLnRhcmdldC52YWx1ZSA9IHZhbC5zbGljZSgwLCAxKTtcbiAgICAgICAgaWYgKHZhbCAmJiBpZHggPCBpbnB1dHMubGVuZ3RoIC0gMSkgaW5wdXRzW2lkeCArIDFdLmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBBcnJheS5mcm9tKGlucHV0cykubWFwKGkgPT4gaS52YWx1ZSkuam9pbignJyk7XG4gICAgICAgIGlmIChjb2RlLmxlbmd0aCA9PT0gNikgc3VibWl0VG90cENvZGUoY29kZSk7XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0JhY2tzcGFjZScgJiYgIWUudGFyZ2V0LnZhbHVlICYmIGlkeCA+IDApIHtcbiAgICAgICAgICBpbnB1dHNbaWR4IC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICBpbnB1dHNbaWR4IC0gMV0udmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBwYXN0ZWQgPSAoZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKSB8fCAnJykucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgaWYgKHBhc3RlZC5sZW5ndGggPj0gNikge1xuICAgICAgICAgIGlucHV0cy5mb3JFYWNoKChpbnAsIGkpID0+IHsgaW5wLnZhbHVlID0gcGFzdGVkW2ldIHx8ICcnOyB9KTtcbiAgICAgICAgICBpbnB1dHNbNV0uZm9jdXMoKTtcbiAgICAgICAgICBzdWJtaXRUb3RwQ29kZShwYXN0ZWQuc2xpY2UoMCwgNikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFRvdHBDb2RlKGNvZGUpIHtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ1ZlcmlmeWluZy4uLic7XG4gICAgZXJyb3JFbC5jbGFzc05hbWUgPSAndG90cC1lcnJvciB2ZXJpZnlpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIC8vIFVwZGF0ZSBjYWNoZWQgQ1NSRiB0b2tlbiBmcm9tIFRPVFAgcmVzcG9uc2UgKHNlcnZlciByb3RhdGVzIGl0IG9uIGxvZ2luKVxuICAgICAgICBpZiAoZGF0YS5jc3JmVG9rZW4pIHtcbiAgICAgICAgICBjc3JmVG9rZW4gPSBkYXRhLmNzcmZUb2tlbjtcbiAgICAgICAgfVxuICAgICAgICBoaWRlVG90cE92ZXJsYXkoKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVkaXJlY3RlZCBoZXJlIGZyb20gYW5vdGhlciBzZXJ2aWNlXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0ID0gc2FmZVNlc3Npb25HZXQoJ3RvdHBfcmVkaXJlY3QnKTtcbiAgICAgICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICAgICAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndG90cF9yZWRpcmVjdCcpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgICAgIC8vIC5zYW1pIGlzIGFuIHVucmVnaXN0ZXJlZCBUTEQsIHNvIGJyb3dzZXJzIHNpbGVudGx5IGRyb3AgdGhlXG4gICAgICAgICAgLy8gRG9tYWluPS5zYW1pIHNlc3Npb24gY29va2llIG9uIGFueSBPVEhFUiAqLnNhbWkgc3ViZG9tYWluICh0aGV5XG4gICAgICAgICAgLy8gdHJlYXQgXCJzYW1pXCIgYXMgdGhlIGVmZmVjdGl2ZSBwdWJsaWMgc3VmZml4LCBzYW1lIHByb3RlY3Rpb25cbiAgICAgICAgICAvLyB0aGF0IGJsb2NrcyBhIERvbWFpbj0uY29tIHN1cGVyY29va2llKS4gVGhlIHRhcmdldCBzZXJ2aWNlIGNhbid0XG4gICAgICAgICAgLy8gc2VlIG91ciBzZXNzaW9uIGNvb2tpZSBubyBtYXR0ZXIgaG93IGl0J3MgYnVpbHQsIHNvIGluc3RlYWQgd2VcbiAgICAgICAgICAvLyBoYW5kIGl0IGEgb25lLXRpbWUgdG9rZW4gaW4gdGhlIFVSTDsgaXRzIGxvZ2luIHBhZ2UgZXhjaGFuZ2VzXG4gICAgICAgICAgLy8gdGhhdCBmb3IgaXRzIG93biBob3N0LW9ubHkgY29va2llIHZpYSAvYXV0aC9zc28tZXhjaGFuZ2UuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJlZGlyZWN0LCBkYXRhLnNzb1Rva2VuKTtcbiAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGFyZ2V0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIGRhc2hib2FyZFxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3InO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdG90cC1kaWdpdHMgaW5wdXQnKTtcbiAgICAgICAgaW5wdXRzLmZvckVhY2goaSA9PiB7IGkudmFsdWUgPSAnJzsgfSk7XG4gICAgICAgIGlucHV0c1swXT8uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3InO1xuICAgICAgZXJyb3JFbC5jbGFzc05hbWUgPSAndG90cC1lcnJvcic7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlID9hdXRoPXJlcXVpcmVkIHJlZGlyZWN0IGZyb20gQ2FkZHkgU1NPLlxuICAvLyBEQy0wNDk6IGlmIHRoZSBhdXRoLWdhdGUgbW9kdWxlIHdpbGwgaGFuZGxlIHRoaXMgKG11bHRpLXByb3ZpZGVyXG4gIC8vIGluc3RhbGxzKSwgc2tpcCBvdXIgVE9UUC1vbmx5IGJyYW5jaCBlbnRpcmVseS4gU2luZ2xlLXByb3ZpZGVyXG4gIC8vIFRPVFAtb25seSBpbnN0YWxscyBjb250aW51ZSB0byB1c2UgdGhpcyBwYXRoIGJlY2F1c2UgYXV0aC1nYXRlLmpzXG4gIC8vIGRlbGVnYXRlcyBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkuXG4gIGNvbnN0IF9fZGNfMDQ5X3NraXAgPSAhISh3aW5kb3cuX19kY18wNDlfaGFuZGxlZCk7XG4gIGlmICghX19kY18wNDlfc2tpcCAmJiB1cmxQYXJhbXMuZ2V0KCdhdXRoJykgPT09ICdyZXF1aXJlZCcpIHtcbiAgICBjb25zdCByZXR1cm5VcmwgPSB1cmxQYXJhbXMuZ2V0KCdyZXR1cm4nKTtcbiAgICBpZiAocmV0dXJuVXJsKSB7XG4gICAgICAvLyBWYWxpZGF0ZSByZWRpcmVjdCBVUkw6IG11c3QgYmUgc2FtZS1vcmlnaW4gb3IgaG9zdG5hbWUgbXVzdCBlbmQgd2l0aCBvdXIgVExEXG4gICAgICAvLyAocHJldmVudHMgb3BlbiByZWRpcmVjdCB2aWEgaW5jbHVkZXMoKSBieXBhc3MgbGlrZSBldmlsLmNvbT9xPS5zYW1pKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZXR1cm5VcmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHBhcnNlZC5ob3N0bmFtZTtcbiAgICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gcGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgY29uc3QgdGxkU3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiAnLicgKyBTSVRFLnRsZDtcbiAgICAgICAgY29uc3QgaXNPdXJUbGQgPSBob3N0bmFtZS5lbmRzV2l0aCh0bGRTdWZmaXgpIHx8IGhvc3RuYW1lID09PSB0bGRTdWZmaXguc3Vic3RyaW5nKDEpO1xuICAgICAgICBpZiAoaXNTYW1lT3JpZ2luIHx8IGlzT3VyVGxkKSB7XG4gICAgICAgICAgc2FmZVNlc3Npb25TZXQoJ3RvdHBfcmVkaXJlY3QnLCByZXR1cm5VcmwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIEludmFsaWQgVVJMIFx1MjAxNCByZWplY3QgcmVkaXJlY3RcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYW4gVVJMXG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgfVxuXG4gIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID0gc2hvd1RvdHBPdmVybGF5O1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgUkVDT1ZFUlkgRkxPVyA9PT09PVxuLy8gUHVibGljLCB1bmF1dGhlbnRpY2F0ZWQgcmVjb3ZlcnkgcGF0aCBmb3IgdXNlcnMgd2hvIGNhbid0IGxvZyBpbi5cbi8vIERlc2lnbmVkIGZvciB0aGUgXCJlbmNyeXB0aW9uIGtleSByb3RhdGVkIGFuZCBsb3N0IG15IGF1dGhlbnRpY2F0b3JcIiBjYXNlLlxuLy8gVGhlIGZsb3cgaXM6XG4vL1xuLy8gIDEuIE9uIFRPVFAgb3ZlcmxheSBzaG93LCBjYWxsIC9hcGkvdjEvdG90cC9yZWNvdmVyeS1pbmZvIChwdWJsaWMpLlxuLy8gICAgIElmIHN0YXR1cyA9PT0gJ3VucmVhZGFibGUnLCBzaG93IHRoZSBcIkxvc3QgYWNjZXNzP1wiIGxpbmsgb24gdGhlIG92ZXJsYXkuXG4vLyAgMi4gVXNlciBjbGlja3MgbGluayBcdTIxOTIgb3BlbnMgcmVjb3ZlcnkgcGFuZWwuXG4vLyAgMy4gVXNlciBwYXN0ZXMgQmFzZTMyIHNlY3JldCBcdTIxOTIgUE9TVCAvYXBpL3YxL3RvdHAvc2V0dXAgd2l0aCB7c2VjcmV0OiAuLi59LlxuLy8gICAgIEJhY2tlbmQgc3RvcmVzIGFzIHRvdHAucGVuZGluZ19zZWNyZXQgKGVuY3J5cHRlZCB3aXRoIGN1cnJlbnQga2V5KS5cbi8vICA0LiBQYW5lbCBzd2l0Y2hlcyB0byBcInZlcmlmeVwiIG1vZGUuIFVzZXIgZW50ZXJzIGEgY29kZSBmcm9tIHRoZVxuLy8gICAgIG5ld2x5LWFkZGVkIGF1dGhlbnRpY2F0b3IgZW50cnkuIFBPU1QgL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cFxuLy8gICAgIHByb21vdGVzIHBlbmRpbmcgXHUyMTkyIGFjdGl2ZSBhbmQgc3RhcnRzIGEgc2Vzc2lvbi5cbi8vICA1LiBoaWRlVG90cE92ZXJsYXkoKSBhbmQgaW5pdGlhbGl6ZURhc2hib2FyZCgpIFx1MjAxNCBzYW1lIGFzIG5vcm1hbCBsb2dpbi5cbi8vXG4vLyBUaGUgcmVjb3ZlcnkgZmxvdyBuZXZlciByZXF1aXJlcyB0aGUgdXNlciB0byBiZSBsb2dnZWQgaW4uIEl0IGRvZXMgcmVxdWlyZVxuLy8gdGhlbSB0byBoYXZlIHRoZWlyIEJhc2UzMiBzZWNyZXQgc2F2ZWQgKGUuZy4gcGFzc3dvcmQgbWFuYWdlciwgc2NyZWVuc2hvdCxcbi8vIHRoZSBcIkRvd25sb2FkIGJhY2t1cCBmaWxlXCIgd2Ugb2ZmZXIgYXQgc2V0dXAgdGltZSBcdTIwMTQgc2VlIHRvdHAtc2V0dGluZ3MuanMpLlxuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBcdTI1MDBcdTI1MDAgSGVscGVycyBcdTI1MDBcdTI1MDBcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNvdmVyeUluZm8oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3JlY292ZXJ5LWluZm8nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHIuanNvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXM6ICd1bmtub3duJywgaGludDogJ0NvdWxkIG5vdCBjb250YWN0IHNlcnZlcicgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93UmVjb3ZlcnlMaW5rKHNob3cpIHtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktbGluaycpO1xuICAgIGlmIChsaW5rKSBsaW5rLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuUmVjb3ZlcnlQYW5lbCgpIHtcbiAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXBhbmVsJyk7XG4gICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zdGF0dXMnKTtcbiAgICBjb25zdCBpbXBvcnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWltcG9ydCcpO1xuICAgIGNvbnN0IHZlcmlmeUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktdmVyaWZ5Jyk7XG4gICAgaWYgKGltcG9ydEVsKSBpbXBvcnRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgaWYgKHZlcmlmeUVsKSB2ZXJpZnlFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0tZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlID0gJyc7XG4gICAgLy8gU2hvdyBjdXJyZW50IHN0YXR1c1xuICAgIGZldGNoUmVjb3ZlcnlJbmZvKCkudGhlbihpbmZvID0+IHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gaW5mby5oaW50IHx8ICcnO1xuICAgICAgLy8gQ29sb3ItY29kZSB0aGUgc3RhdHVzIGJhbm5lclxuICAgICAgaWYgKGluZm8uc3RhdHVzID09PSAnaGVhbHRoeScpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgIH0gZWxzZSBpZiAoaW5mby5zdGF0dXMgPT09ICd1bnJlYWRhYmxlJykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1iYWQtZmcsICNmZjlhYTMpJztcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSA2JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIH0gZWxzZSBpZiAoaW5mby5zdGF0dXMgPT09ICdub3RfY29uZmlndXJlZCcpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJvcmRlciknO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0Jyk/LmZvY3VzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlUmVjb3ZlcnlQYW5lbCgpIHtcbiAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXBhbmVsJyk7XG4gICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0UmVjb3ZlcnlTZWNyZXQoKSB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ1Bhc3RlIHlvdXIgQmFzZTMyIGtleSBmaXJzdCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghL15bQS1aYS16Mi03XFxzXSs9KiQvLnRlc3Qoc2VjcmV0KSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdJbnZhbGlkIEJhc2UzMiBmb3JtYXQgXHUyMDE0IHNob3VsZCBiZSBsZXR0ZXJzIEEtWiBhbmQgZGlnaXRzIDItNyBvbmx5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQT1NUIC9hcGkvdjEvdG90cC9zZXR1cCB3aXRoIHtzZWNyZXR9IFx1MjAxNCBiYWNrZW5kIHN0b3JlcyBhcyBwZW5kaW5nXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VjcmV0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIGlmICghci5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnUmVzdG9yZSBmYWlsZWQnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTd2l0Y2ggcGFuZWwgdG8gdmVyaWZ5IG1vZGVcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWltcG9ydCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS12ZXJpZnknKS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uZm9jdXMoKSwgMTAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHRyeSBhZ2Fpbic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0UmVjb3ZlcnlDb2RlKCkge1xuICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtLWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKCEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnRW50ZXIgYSA2LWRpZ2l0IGNvZGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBPU1QgL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCBcdTIwMTQgcHJvbW90ZXMgcGVuZGluZyBcdTIxOTIgYWN0aXZlICsgc3RhcnRzIHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoIXIub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmZvY3VzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFN1Y2Nlc3MgXHUyMDE0IGhpZGUgZXZlcnl0aGluZyBhbmQgaW5pdGlhbGl6ZSBkYXNoYm9hcmRcbiAgICAgIGNsb3NlUmVjb3ZlcnlQYW5lbCgpO1xuICAgICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICAgIGlmIChvdmVybGF5KSBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHRyeSBhZ2Fpbic7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFdpcmUgdXAgaGFuZGxlcnMgXHUyNTAwXHUyNTAwXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNob3ctcmVjb3ZlcnknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvcGVuUmVjb3ZlcnlQYW5lbCgpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVJlY292ZXJ5UGFuZWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zdWJtaXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZWNvdmVyeVNlY3JldCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZWNvdmVyeUNvZGUpO1xuXG4gIC8vIEVudGVyIGtleSBzdWJtaXRzIGluIHNlY3JldCBmaWVsZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0UmVjb3ZlcnlTZWNyZXQoKTsgfVxuICB9KTtcbiAgLy8gRW50ZXIga2V5IHN1Ym1pdHMgaW4gY29kZSBmaWVsZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdFJlY292ZXJ5Q29kZSgpOyB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBQdWJsaWMgQVBJIFx1MjUwMFx1MjUwMFxuICAvLyBDYWxsZWQgYnkgdG90cC1hdXRoLmpzIGFmdGVyIHNob3dpbmcgdGhlIG92ZXJsYXksIHNvIHdlIGNhbiBkZWNpZGUgd2hldGhlclxuICAvLyB0byBzaG93IHRoZSByZWNvdmVyeSBsaW5rLiBXZSBkbyB0aGlzIHdpdGggYSBwdWJsaWMgZW5kcG9pbnQgdGhhdCBkb2Vzbid0XG4gIC8vIHJlcXVpcmUgYXV0aCBcdTIwMTQgcGVyZmVjdCBmb3IgdGhlIGxvY2tlZC1vdXQgc3RhdGUuXG4gIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluayA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBmZXRjaFJlY292ZXJ5SW5mbygpO1xuICAgIC8vIFNob3cgdGhlIGxpbmsgaW4gYW55IG5vbi1oZWFsdGh5IHN0YXRlICh1bnJlYWRhYmxlIC8gY29ycnVwdCAvIHVua25vd24pLlxuICAgIC8vIFRoZSBoaW50IGluc2lkZSB0aGUgcGFuZWwgdGVsbHMgdGhlIHVzZXIgd2hhdCB0aGUgYWN0dWFsIGlzc3VlIGlzLlxuICAgIGlmIChpbmZvICYmIGluZm8uc3VjY2VzcyAmJiBpbmZvLnN0YXR1cyAmJiBpbmZvLnN0YXR1cyAhPT0gJ2hlYWx0aHknKSB7XG4gICAgICBzaG93UmVjb3ZlcnlMaW5rKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93UmVjb3ZlcnlMaW5rKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG59KSgpO1xuO1xuLy8gPT09PT0gU0VSVklDRSBDUkVERU5USUFMUyA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdmb2xkZXItYnJvd3Nlci1tb2RhbCcsIGA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDcwMHB4OyBtYXgtaGVpZ2h0OiA4MHZoO1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDMiBCcm93c2UgZm9yIE1lZGlhIEZvbGRlcnM8L2gzPlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItcGF0aFwiIHN0eWxlPVwicGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjlyZW07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcIj5cbiAgICAgICAgL1xuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bzsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7IGJvcmRlci1yYWRpdXM6IDZweDsgZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+U2VsZWN0ZWQgZm9sZGVyczo8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdGVkLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdC1jdXJyZW50XCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgKyBBZGQgQ3VycmVudCBGb2xkZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXBcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLWRvbmVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPkRvbmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ3NlcnZpY2UtY3JlZHMtbW9kYWwnLCBgPGRpdiBpZD1cInNlcnZpY2UtY3JlZHMtbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jcmVkcy1jb250ZW50XCI+XG4gICAgICA8aDMgaWQ9XCJzdmMtY3JlZHMtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogMCAwIDRweDsgZm9udC1zaXplOiAxLjA1cmVtO1wiPlNlcnZpY2UgQ3JlZGVudGlhbHM8L2gzPlxuICAgICAgPHAgaWQ9XCJzdmMtY3JlZHMtZGVzY1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNHB4O1wiPkNyZWRlbnRpYWxzIGFyZSBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzaW5nIHRoaXMgc2VydmljZS48L3A+XG5cbiAgICAgIDwhLS0gU3RhdHVzIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtZG90XCIgY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBpZD1cInN2Yy1jcmVkcy1zdGF0dXNcIiBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5ObyBjcmVkZW50aWFscyBzdG9yZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWVkaG9zdCBjcmVkZW50aWFscyAoc2hvd24gZm9yIGV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtc2VlZGhvc3RcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZWVkaG9zdCBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZXJuYW1lIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcnZpY2VzLiBQYXNzd29yZCBpcyBwZXItc2VydmljZS48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLXNlZWRob3N0LXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lIChzaGFyZWQpXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzdmMtc2VlZGhvc3QtcGFzc1wiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJjdXJyZW50LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtY3JlZHNcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVBJIEtleSAoc2hvd24gZm9yIGFyciBzZXJ2aWNlcyBvciBzZXJ2aWNlcyB3aXRoIEFQSSBrZXkgc3VwcG9ydCkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWFwaWtleVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPkFQSSBLZXk8L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5CeXBhc3NlcyB0aGUgYXBwJ3Mgb3duIGxvZ2luIHNjcmVlbjwvcD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYXBpa2V5LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJBUEkga2V5XCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBRdWFsaXR5IFByb2ZpbGUgKHNob3duIGZvciByYWRhcnIvc29uYXJyIG9ubHkpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1xdWFsaXR5XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+UXVhbGl0eSBQcm9maWxlPC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+VXNlZCB3aGVuIHJlcXVlc3RpbmcgdmlhIFNlZXJyPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN2Yy1xdWFsaXR5LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVudGVyIEFQSSBrZXkgZmlyc3QgLS08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLXF1YWxpdHktZmV0Y2hcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY3Vyc29yOiBwb2ludGVyOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgRmV0Y2hcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzdmMtcXVhbGl0eS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQZXItc2VydmljZSBCYXNpYyBBdXRoIChzaG93biBmb3Igbm9uLWV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtYmFzaWNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZXJ2aWNlIExvZ2luPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYmFzaWMtdXNlclwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJ1c2VybmFtZVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLXRvcDogNnB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLWJhc2ljLXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVycm9yIG1lc3NhZ2UgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWVycm9yLCAjYzYyODI4KSAxMiUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZXJyb3IsICNjNjI4MjgpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDE0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOXB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgU2F2ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1jcmVkcy1jbGVhclwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE0cHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICBDbGVhclxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1jcmVkcy1jbG9zZVwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtY3JlZHMtbW9kYWwnKTtcbiAgbGV0IGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgY29uc3QgYXJyU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInLCAncHJvd2xhcnInLCAnb3ZlcnNlZXJyJ107XG4gIGNvbnN0IHF1YWxpdHlQcm9maWxlU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInXTtcblxuICBmdW5jdGlvbiBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gc2VydmljZS5leHRlcm5hbFVybCB8fCBzZXJ2aWNlLnVybCB8fCAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZXJyb3InKTtcbiAgICBlbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlRXJyb3IoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbCA9IGFzeW5jIGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICBjdXJyZW50U2VydmljZSA9IHNlcnZpY2U7XG4gICAgaGlkZUVycm9yKCk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXRpdGxlJyk7XG4gICAgY29uc3QgZGVzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZGVzYycpO1xuICAgIGNvbnN0IHNlZWRob3N0U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2VlZGhvc3QnKTtcbiAgICBjb25zdCBhcGlrZXlTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1hcGlrZXknKTtcbiAgICBjb25zdCBiYXNpY1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWJhc2ljJyk7XG4gICAgY29uc3QgcXVhbGl0eVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXF1YWxpdHknKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gc2VydmljZS5uYW1lICsgJyBDcmVkZW50aWFscyc7XG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb25zIHRvIHNob3dcbiAgICBjb25zdCBpc0V4dCA9ICEhc2VydmljZS5pc0V4dGVybmFsO1xuICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgY29uc3QgaGFzUXVhbGl0eSA9IHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmFwcFRlbXBsYXRlKTtcblxuICAgIHNlZWRob3N0U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNFeHQgPyAnJyA6ICdub25lJztcbiAgICBhcGlrZXlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBpc0FyciA/ICcnIDogJ25vbmUnO1xuICAgIHF1YWxpdHlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBoYXNRdWFsaXR5ID8gJycgOiAnbm9uZSc7XG4gICAgYmFzaWNTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAhaXNFeHQgPyAnJyA6ICdub25lJztcblxuICAgIC8vIFJlc2V0IHF1YWxpdHkgZHJvcGRvd25cbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJykudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChpc0V4dCkge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdTZWVkaG9zdCBjcmVkZW50aWFscyBhdXRvLWxvZ2luIHBhc3QgdGhlIEhUVFAgcHJvbXB0LiBBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4uJztcbiAgICAgIC8vIFVwZGF0ZSBwYXNzd29yZCBwbGFjZWhvbGRlciB3aXRoIHNlcnZpY2UgbmFtZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykucGxhY2Vob2xkZXIgPSBgUGFzc3dvcmQgZm9yICR7c2VydmljZS5uYW1lfWA7XG4gICAgfSBlbHNlIGlmIChpc0Fycikge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4gc2NyZWVuIGF1dG9tYXRpY2FsbHkuJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdDcmVkZW50aWFscyBhcmUgaW5qZWN0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2luZyB0aGlzIHNlcnZpY2UuJztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNyZWRlbnRpYWxzXG4gICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1kb3QnKTtcbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXN0YXR1cycpO1xuICAgIGNvbnN0IGNsZWFyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbGVhcicpO1xuICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuXG4gICAgLy8gTG9hZCBzZWVkaG9zdCBjcmVkcyAoc2hhcmVkIHVzZXJuYW1lICsgcGVyLXNlcnZpY2UgcGFzc3dvcmQpXG4gICAgaWYgKHNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7c2VydmljZS5pZH1gKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9IGRhdGEudXNlcm5hbWUgfHwgJyc7XG4gICAgICAgICAgaWYgKGRhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIExvYWQgcGVyLXNlcnZpY2UgY3JlZHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtzZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2ApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGlmIChkYXRhLmhhc0FwaUtleSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0JykudmFsdWUgPSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJztcbiAgICAgICAgICBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmhhc0Jhc2ljQXV0aCAmJiAhc2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUgPSBkYXRhLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgICAgIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykudmFsdWUgPSAnJztcblxuICAgIC8vIExvYWQgcXVhbGl0eSBwcm9maWxlIGZvciBhcnIgc2VydmljZXNcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBpZiAocXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgIGF3YWl0IGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NyZWRzKSB7XG4gICAgICBkb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZywgIzc0ZGZjNCknO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjNzRkZmM0KSc7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQ3JlZGVudGlhbHMgc3RvcmVkJztcbiAgICAgIGNsZWFyQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY2FyZCBidXR0b25cbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHtzZXJ2aWNlLmlkfWApO1xuICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC5hZGQoJ2hhcy1jcmVkcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnTm8gY3JlZGVudGlhbHMgc3RvcmVkJztcbiAgICAgIGNsZWFyQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gRmV0Y2ggYW5kIHBvcHVsYXRlIHF1YWxpdHkgcHJvZmlsZXMgZHJvcGRvd25cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFF1YWxpdHlQcm9maWxlcyhzZXJ2aWNlKSB7XG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBjb25zdCBxdWFsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpO1xuICAgIGNvbnN0IHN2Y0lkID0gc2VydmljZS5pZCB8fCBzZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoc2VydmljZSk7XG5cbiAgICBpZiAoIXN2Y1VybCkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHNlcnZpY2UgVVJMIC0tPC9vcHRpb24+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+TG9hZGluZy4uLjwvb3B0aW9uPic7XG4gICAgcXVhbFN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBzZXJ2aWNlOiBzdmNJZCwgdXJsOiBzdmNVcmwgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5wcm9maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBwcm9maWxlcyBmb3VuZCAoZW50ZXIgQVBJIGtleSBhbmQgY2xpY2sgRmV0Y2gpIC0tPC9vcHRpb24+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBwIG9mIGRhdGEucHJvZmlsZXMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdC52YWx1ZSA9IHAuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHAubmFtZTtcbiAgICAgICAgcXVhbFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmUtc2VsZWN0IHN0b3JlZCBwcm9maWxlIG9yIGJlc3QgbWF0Y2ggZm9yIFwiNzIwXCJcbiAgICAgIGlmIChkYXRhLnN0b3JlZFByb2ZpbGVJZCkge1xuICAgICAgICBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEuc3RvcmVkUHJvZmlsZUlkKTtcbiAgICAgIH1cbiAgICAgIGlmICghcXVhbFNlbGVjdC52YWx1ZSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIDcyMHAtaXNoIHByb2ZpbGVcbiAgICAgICAgY29uc3QgbWF0Y2g3MjAgPSBkYXRhLnByb2ZpbGVzLmZpbmQocCA9PiAvNzIwL2kudGVzdChwLm5hbWUpKTtcbiAgICAgICAgaWYgKG1hdGNoNzIwKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKG1hdGNoNzIwLmlkKTtcbiAgICAgIH1cbiAgICAgIGlmICghcXVhbFNlbGVjdC52YWx1ZSAmJiBkYXRhLnByb2ZpbGVzLmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEucHJvZmlsZXNbMF0uaWQpO1xuICAgICAgfVxuXG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtkYXRhLnByb2ZpbGVzLmxlbmd0aH0gcHJvZmlsZXMgbG9hZGVkPC9zcGFuPmA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEZhaWxlZCB0byBsb2FkIC0tPC9vcHRpb24+JztcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5FcnJvcjogJHtlLm1lc3NhZ2V9PC9zcGFuPmA7XG4gICAgfVxuICB9XG5cbiAgLy8gRmV0Y2ggYnV0dG9uIGZvciBxdWFsaXR5IHByb2ZpbGVzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1mZXRjaCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICBjb25zdCBhcGlLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0Jyk7XG4gICAgY29uc3QgYXBpS2V5ID0gYXBpS2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIGNvbnN0IHF1YWxTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJyk7XG5cbiAgICBpZiAoIXN2Y1VybCkge1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPk5vIHNlcnZpY2UgVVJMIGF2YWlsYWJsZTwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFwaUtleSB8fCBhcGlLZXkgPT09ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInKSB7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+RW50ZXIgYW4gQVBJIGtleSBmaXJzdDwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5GZXRjaGluZy4uLjwvb3B0aW9uPic7XG4gICAgcXVhbFN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBzZXJ2aWNlOiBzdmNJZCwgdXJsOiBzdmNVcmwsIGFwaUtleSB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzPyR7cGFyYW1zfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFcnJvciAtLTwvb3B0aW9uPic7XG4gICAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj4ke2RhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBwcm9maWxlcyd9PC9zcGFuPmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLnByb2ZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHByb2ZpbGVzIGZvdW5kIC0tPC9vcHRpb24+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBwIG9mIGRhdGEucHJvZmlsZXMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdC52YWx1ZSA9IHAuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHAubmFtZTtcbiAgICAgICAgcXVhbFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmUtc2VsZWN0IDcyMHAgbWF0Y2hcbiAgICAgIGNvbnN0IG1hdGNoNzIwID0gZGF0YS5wcm9maWxlcy5maW5kKHAgPT4gLzcyMC9pLnRlc3QocC5uYW1lKSk7XG4gICAgICBpZiAobWF0Y2g3MjApIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcobWF0Y2g3MjAuaWQpO1xuICAgICAgZWxzZSBpZiAoZGF0YS5wcm9maWxlcy5sZW5ndGgpIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5wcm9maWxlc1swXS5pZCk7XG5cbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke2RhdGEucHJvZmlsZXMubGVuZ3RofSBwcm9maWxlcyBsb2FkZWQ8L3NwYW4+YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRXJyb3IgLS08L29wdGlvbj4nO1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPiR7ZS5tZXNzYWdlfTwvc3Bhbj5gO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2F2ZSBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zYXZlJyk7XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGhpZGVFcnJvcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoY3VycmVudFNlcnZpY2UuaWQpIHx8IGFyclNlcnZpY2VzLmluY2x1ZGVzKGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlKTtcbiAgICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG5cbiAgICAgIC8vIFNhdmUgc2VlZGhvc3QgY3JlZHMgKHNoYXJlZCB1c2VybmFtZSArIHBlci1zZXJ2aWNlIHBhc3N3b3JkKVxuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlZWRob3N0LWNyZWRzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWU6IHVzZXIsIHBhc3N3b3JkOiBwYXNzIHx8IHVuZGVmaW5lZCwgc2VydmljZUlkOiBjdXJyZW50U2VydmljZS5pZCB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgQVBJIGtleSBcdTIwMTQgZm9yIGFyciBzZXJ2aWNlcywgdXNlIHRoZSBhcnIgY3JlZGVudGlhbHMgZW5kcG9pbnQgKGNvcnJlY3QgbmFtZXNwYWNlKVxuICAgICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgICAgY29uc3QgYXBpS2V5ID0gYXBpS2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgYXBpS2V5ICE9PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAvLyBVc2UgYXJyIGNyZWRlbnRpYWxzIGVuZHBvaW50IFx1MjAxNCB2YWxpZGF0ZXMga2V5LCB0ZXN0cyBjb25uZWN0aW9uLCBzdG9yZXMgaW4gYXJyLiogbmFtZXNwYWNlXG4gICAgICAgICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgICAgICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZUlkID0gcXVhbFNlbGVjdD8udmFsdWUgPyBwYXJzZUludChxdWFsU2VsZWN0LnZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgc2VydmljZTogc3ZjSWQsXG4gICAgICAgICAgICAgIGFwaUtleSxcbiAgICAgICAgICAgICAgdXJsOiBzdmNVcmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBxdWFsaXR5UHJvZmlsZUlkOiBxdWFsaXR5UHJvZmlsZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcXVhbGl0eVByb2ZpbGVOYW1lOiBxdWFsaXR5UHJvZmlsZU5hbWUgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgQVBJIGtleScpO1xuICAgICAgICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICAgICAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEuY29ubmVjdGlvblRlc3QgJiYgIWRhdGEuY29ubmVjdGlvblRlc3Quc3VjY2Vzcykge1xuICAgICAgICAgICAgc2hvd0Vycm9yKGBBUEkga2V5IHNhdmVkIGJ1dCBjb25uZWN0aW9uIHRlc3QgZmFpbGVkOiAke2RhdGEuY29ubmVjdGlvblRlc3QuZXJyb3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vbi1hcnIgc2VydmljZXMgdXNlIHRoZSBnZW5lcmljIGVuZHBvaW50XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcGlLZXkgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0FyciAmJiBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHN2Y0lkKSkge1xuICAgICAgICAvLyBBUEkga2V5IHVuY2hhbmdlZCBidXQgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHF1YWxpdHkgcHJvZmlsZSBcdTIwMTQgc2F2ZSBwcm9maWxlIG9ubHlcbiAgICAgICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVJZCA9IHF1YWxTZWxlY3Q/LnZhbHVlID8gcGFyc2VJbnQocXVhbFNlbGVjdC52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlTmFtZSA9IHF1YWxTZWxlY3Q/LnNlbGVjdGVkT3B0aW9ucz8uWzBdPy50ZXh0Q29udGVudCB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChxdWFsaXR5UHJvZmlsZUlkKSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlOiBzdmNJZCwgcXVhbGl0eVByb2ZpbGVJZCwgcXVhbGl0eVByb2ZpbGVOYW1lIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBwZXItc2VydmljZSBiYXNpYyBhdXRoXG4gICAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZTogdXNlciwgcGFzc3dvcmQ6IHBhc3MgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXJ2aWNlQ3JlZGVudGlhbHNdIFNhdmUnLCBlLCB7IGZ1bmN0aW9uOiAnc2F2ZUNyZWRlbnRpYWxzJyB9KTtcbiAgICAgIHNob3dFcnJvcignRmFpbGVkIHRvIHNhdmU6ICcgKyAoZS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpO1xuICAgIH1cbiAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUnO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gQ2xlYXIgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xlYXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlIHN0b3JlZCBjcmVkZW50aWFscyBmb3IgJHtjdXJyZW50U2VydmljZS5uYW1lfT9gKSkgcmV0dXJuO1xuICAgIGhpZGVFcnJvcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCk7XG4gICAgICBpZiAoY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHtjdXJyZW50U2VydmljZS5pZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgZnJvbSBib3RoIG5hbWVzcGFjZXNcbiAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2Fyci9jcmVkZW50aWFscy8ke3N2Y0lkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHtjdXJyZW50U2VydmljZS5pZH1gKTtcbiAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtY3JlZHMnKTtcbiAgICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoY3VycmVudFNlcnZpY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1NlcnZpY2VDcmVkZW50aWFsc10gQ2xlYXInLCBlLCB7IGZ1bmN0aW9uOiAnY2xlYXJDcmVkZW50aWFscycgfSk7XG4gICAgICBzaG93RXJyb3IoJ0ZhaWxlZCB0byBjbGVhcjogJyArIChlLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBidXR0b24gLyBiYWNrZHJvcFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gIH0pO1xuICBtb2RhbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENoZWNrIGNyZWRlbnRpYWwgc3RhdHVzIGZvciBhbGwgc2VydmljZXMgb24gcGFnZSBsb2FkICh1cGRhdGUga2V5IGJ1dHRvbiBoaWdobGlnaHRzKVxuICB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGFwcCBvZiAod2luZG93LkFQUFMgfHwgW10pKSB7XG4gICAgICAgIGlmICghYXBwLmlzRXh0ZXJuYWwgJiYgIWFwcC5hcHBUZW1wbGF0ZSAmJiAhYXBwLnVybCkgY29udGludWU7XG4gICAgICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuICAgICAgICBpZiAoYXBwLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke2FwcC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IHNlZWREYXRhID0gYXdhaXQgc2VlZFJlcy5qc29uKCk7XG4gICAgICAgICAgICBpZiAoc2VlZERhdGEuc3VjY2VzcyAmJiBzZWVkRGF0YS5oYXNDcmVkZW50aWFscykgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2FwcC5pZH0vY3JlZGVudGlhbHNgKTtcbiAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgaWYgKGQuc3VjY2VzcyAmJiAoZC5oYXNBcGlLZXkgfHwgZC5oYXNCYXNpY0F1dGgpKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke2FwcC5pZH1gKTtcbiAgICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2hhcy1jcmVkcycsIGhhc0NyZWRzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gIH07XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBTRVRUSU5HUyA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJywgYDxkaXYgaWQ9XCJ0b3RwLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4xcmVtO1wiPkF1dGhlbnRpY2F0aW9uIFNldHRpbmdzPC9oMz5cblxuICAgICAgPCEtLSBTdGF0dXMgQmFubmVyIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtc3RhdHVzLWJhbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTJweCAxNnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICA8c3BhbiBpZD1cInRvdHAtc3RhdHVzLWRvdFwiIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0b3RwLXN0YXR1cy10ZXh0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTtcIj5UT1RQIGlzIG5vdCBjb25maWd1cmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2V0dXAgQnV0dG9uIChub3QgY29uZmlndXJlZCBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1zZXR1cC1zZWN0aW9uXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLXNldHVwLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICBHZW5lcmF0ZSBOZXcgU2VjcmV0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbjogMTBweCAwIDA7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItbGluZVwiPjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+b3I8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItbGluZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1oaW50XCI+SW1wb3J0IGFuIGV4aXN0aW5nIHNlY3JldCBrZXk6PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidG90cC1pbXBvcnQta2V5XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSB5b3VyIEJhc2UzMiBrZXlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMXB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1pbXBvcnQtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIEltcG9ydFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInRvdHAtaW1wb3J0LWVycm9yXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgZm9udC1zaXplOiAwLjhyZW07IG1pbi1oZWlnaHQ6IDEuMmVtOyBtYXJnaW4tdG9wOiA2cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VjcmV0IERpc3BsYXkgKHNldHVwIGZsb3cpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtcXItc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPCEtLSBNYW51YWwgS2V5IChwcmltYXJ5IC0gZm9yIFdpbkF1dGgvZGVza3RvcCBhdXRoZW50aWNhdG9ycykgLS0+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCA4cHg7XCI+Q29weSB0aGlzIGtleSBpbnRvIHlvdXIgYXV0aGVudGljYXRvciBhcHA6PC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8Y29kZSBpZD1cInRvdHAtbWFudWFsLWtleVwiIHN0eWxlPVwiZmxleDogMTsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDFyZW07IGZvbnQtZmFtaWx5OiAnU2FtaSBHcm90ZXNrJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMnB4OyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHVzZXItc2VsZWN0OiBhbGw7IGNvbG9yOiB2YXIoLS1mZyk7XCI+PC9jb2RlPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWNvcHkta2V5XCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDFyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7IGNvbG9yOiB2YXIoLS1mZyk7XCIgdGl0bGU9XCJDb3B5IHRvIGNsaXBib2FyZFwiPlx1RDgzRFx1RENDQjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERvd25sb2FkIGJhY2t1cCBmaWxlIChyZWNvdmVyeSBhaWQpIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmbGV4OiAxO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnKTtcIj5TYXZlIGEgYmFja3VwIGZpbGU8L3N0cm9uZz4gXHUyMDE0IGlmIHlvdSBldmVyIGxvc2UgeW91ciBhdXRoZW50aWNhdG9yLFxuICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byByZWNvdmVyIHdpdGhvdXQgU1NIIGFjY2VzcyB0byB0aGUgc2VydmVyLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtZG93bmxvYWQtYmFja3VwXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIFx1MkIwNyBEb3dubG9hZFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUVIgQ29kZSAoc2Vjb25kYXJ5IC0gZm9yIG1vYmlsZSBhcHBzKSAtLT5cbiAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5TaG93IFFSIGNvZGUgKGZvciBtb2JpbGUgYXV0aGVudGljYXRvciBhcHBzKTwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiA4cHg7XCI+XG4gICAgICAgICAgICA8aW1nIGlkPVwidG90cC1xci1pbWFnZVwiIHN0eWxlPVwid2lkdGg6IDE4MHB4OyBoZWlnaHQ6IDE4MHB4OyBib3JkZXItcmFkaXVzOiA4cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuXG4gICAgICAgIDwhLS0gVmVyaWZ5IEZpcnN0IENvZGUgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgcGFkZGluZy10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1ib2xkLXNtXCI+RW50ZXIgY29kZSB0byBjb25maXJtIHNldHVwOjwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA4cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvdHAtc2V0dXAtY29kZVwiIG1heGxlbmd0aD1cIjZcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgcGF0dGVybj1cIlswLTldezZ9XCIgcGxhY2Vob2xkZXI9XCIwMDAwMDBcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEuM3JlbTsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6ICdTYW1pIEdyb3Rlc2snLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBvdXRsaW5lOiBub25lO1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1jb25maXJtLXNldHVwXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+XG4gICAgICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJ0b3RwLXNldHVwLWVycm9yXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgZm9udC1zaXplOiAwLjhyZW07IG1pbi1oZWlnaHQ6IDEuMmVtOyBtYXJnaW4tdG9wOiA2cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2Vzc2lvbiBEdXJhdGlvbiAoYWN0aXZlIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLWR1cmF0aW9uLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtYm9sZC1zbVwiPlNlc3Npb24gRHVyYXRpb246PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cInRvdHAtZHVyYXRpb24tc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgbWFyZ2luLXRvcDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjlyZW07IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTVtXCI+MTUgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMG1cIj4zMCBtaW51dGVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFoXCI+MSBob3VyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJoXCI+MiBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0aFwiPjQgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiOGhcIj44IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEyaFwiPjEyIGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI0aFwiPjI0IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5ldmVyXCI+TmV2ZXIgKGRpc2FibGUgVE9UUCk8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDRweCAwIDA7XCI+SG93IGxvbmcgYmVmb3JlIHlvdSBuZWVkIHRvIHJlLWVudGVyIHlvdXIgY29kZTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERpc2FibGUgQnV0dG9uIChhY3RpdmUgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtZGlzYWJsZS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nLXRvcDogMTZweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWRpc2FibGUtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgICAgRGlzYWJsZSBUT1RQXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgQ2xvc2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFRvdHBTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBlbmFibGVkLCBzZXNzaW9uRHVyYXRpb24sIGlzU2V0VXAgfSA9IGRhdGEuY29uZmlnO1xuICAgICAgY29uc3Qgc3RhdHVzRG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLWRvdCcpO1xuICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy10ZXh0Jyk7XG4gICAgICBjb25zdCBzdGF0dXNCYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtYmFubmVyJyk7XG4gICAgICBjb25zdCBzZXR1cFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBxclNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBkdXJhdGlvblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBkaXNhYmxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpc2FibGUtc2VjdGlvbicpO1xuXG4gICAgICBpZiAoZW5hYmxlZCAmJiBpc1NldFVwKSB7XG4gICAgICAgIHN0YXR1c0RvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDglLCB0cmFuc3BhcmVudCknO1xuICAgICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1RPVFAgaXMgYWN0aXZlJztcbiAgICAgICAgc3RhdHVzVGV4dC5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICAvLyBLZWVwIHRoZSBzZXR1cCBzZWN0aW9uIHZpc2libGUgKGNvbGxhcHNlZCkgc28gdGhlIFwiSW1wb3J0IGV4aXN0aW5nXG4gICAgICAgIC8vIHNlY3JldFwiIG9wdGlvbiBpcyBhbHdheXMgcmVhY2hhYmxlIFx1MjAxNCB1c2VycyBtYXkgbmVlZCB0byByZS1lbnJvbGxcbiAgICAgICAgLy8gdGhlaXIgYXV0aGVudGljYXRvciB3aXRoIHRoZSBzYW1lIHNlY3JldCBmcm9tIGEgYmFja3VwIGZpbGUuXG4gICAgICAgIHNldHVwU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgY29uc3Qgc2V0dXBCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1idG4nKTtcbiAgICAgICAgaWYgKHNldHVwQnRuKSBzZXR1cEJ0bi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBOZXcgU2VjcmV0JztcbiAgICAgICAgLy8gSGlkZSB0aGUgUVIgc2VjdGlvbiBieSBkZWZhdWx0IGluIHRoZSBhY3RpdmUgc3RhdGUgXHUyMDE0IHNldHVwQnRuIGNsaWNrIHNob3dzIGl0XG4gICAgICAgIHFyU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkdXJhdGlvblNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRpc2FibGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWxlY3QnKS52YWx1ZSA9IHNlc3Npb25EdXJhdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c0RvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1RPVFAgaXMgbm90IGNvbmZpZ3VyZWQnO1xuICAgICAgICBzdGF0dXNUZXh0LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICAgIHNldHVwU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcXJTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGR1cmF0aW9uU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkaXNhYmxlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIEF1dGggY2FyZCBpbiB0aGUgdG9wIHJvd1xuICAgICAgdXBkYXRlQXV0aENhcmQoZW5hYmxlZCAmJiBpc1NldFVwLCBzZXNzaW9uRHVyYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgVE9UUCBzZXR0aW5nczonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyBEdXJhdGlvbiBsYWJlbCBoZWxwZXJcbiAgY29uc3QgRFVSQVRJT05fTEFCRUxTID0ge1xuICAgICcxNW0nOiAnMTUgbWluJywgJzMwbSc6ICczMCBtaW4nLCAnMWgnOiAnMSBob3VyJywgJzJoJzogJzIgaG91cnMnLFxuICAgICc0aCc6ICc0IGhvdXJzJywgJzhoJzogJzggaG91cnMnLCAnMTJoJzogJzEyIGhvdXJzJywgJzI0aCc6ICcyNCBob3VycycsICduZXZlcic6ICdEaXNhYmxlZCdcbiAgfTtcblxuICBmdW5jdGlvbiB1cGRhdGVBdXRoQ2FyZChhY3RpdmUsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWNhcmQnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtcGlsbCcpO1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWRvdCcpO1xuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zdGF0dXMtdGV4dCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29uJyk7XG4gICAgICBwaWxsLmNsYXNzTmFtZSA9ICdiYWRnZSBvbic7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gJ1lFUyc7XG4gICAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCBvayBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1Nlc3Npb246ICcgKyAoRFVSQVRJT05fTEFCRUxTW2R1cmF0aW9uXSB8fCBkdXJhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsICdvZmYnKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9mZic7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gJ05PJztcbiAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG90IGJhZCBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ05vdCBjb25maWd1cmVkJztcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBidXR0b24gKGdlbmVyYXRlIG5ldyBzZWNyZXQpXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItaW1hZ2UnKS5zcmMgPSBkYXRhLnFyQ29kZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50ID0gZGF0YS5tYW51YWxLZXk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIFNldHVwIEZhaWxlZCcsIGUsIHsgZnVuY3Rpb246ICdzZXR1cFRPVFAnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gSW1wb3J0IGV4aXN0aW5nIHNlY3JldCBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQta2V5JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQtZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnUGFzdGUgYSBCYXNlMzIgc2VjcmV0IGtleSBmaXJzdCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VjcmV0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLWltYWdlJykuc3JjID0gZGF0YS5xckNvZGU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudCA9IGRhdGEubWFudWFsS2V5O1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnSW1wb3J0IGZhaWxlZCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yIFx1MjAxNCB0cnkgcmVmcmVzaGluZyB0aGUgcGFnZSc7XG4gICAgfVxuICB9KTtcblxuICAvLyBDb3B5IGtleSBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29weS1rZXknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50O1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGtleSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb3B5LWtleScpO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDQic7IH0sIDIwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBEb3dubG9hZCBiYWNrdXAgZmlsZSBcdTIwMTQgcGxhaW4gSlNPTiBzbyBpdCByb3VuZC10cmlwcyB0aHJvdWdoIGFueSBwYXNzd29yZFxuICAvLyBtYW5hZ2VyLCBjbG91ZCBiYWNrdXAsIG9yIHByaW50ZWQgcGFwZXIuIFRoZSBzZWNyZXQgSVMgcmVjb3ZlcmFibGUgcGxhaW50ZXh0XG4gIC8vICh0aGF0J3MgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBiYWNrdXApLCBzbyB3YXJuIHRoZSB1c2VyIGFuZCByZWx5IG9uXG4gIC8vIHRoZW0gdG8ga2VlcCBpdCBzYWZlLlxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kb3dubG9hZC1iYWNrdXAnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBpZiAoIXNlY3JldCkgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBzZXJ2aWNlOiAnRGFzaENhZGR5JyxcbiAgICAgIHR5cGU6ICd0b3RwLXNlY3JldCcsXG4gICAgICBzZWNyZXQ6IHNlY3JldCxcbiAgICAgIGlzc3VlcjogJ0Rhc2hDYWRkeScsXG4gICAgICBhbGdvcml0aG06ICdTSEExJyxcbiAgICAgIGRpZ2l0czogNixcbiAgICAgIHBlcmlvZDogMzAsXG4gICAgICBpc3N1ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC8vIFJlY292ZXJ5IGluc3RydWN0aW9ucyBiYWtlZCBpbnRvIHRoZSBmaWxlIHNvIGEgeWVhciBmcm9tIG5vdyB0aGVcbiAgICAgIC8vIHVzZXIgKG9yIHRoZWlyIGZ1dHVyZSBzZWxmKSBrbm93cyB3aGF0IHRoaXMgZmlsZSBpcyBhbmQgaG93IHRvIHVzZSBpdC5cbiAgICAgIHJlY292ZXJ5X3VybDogYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vICAobG9naW4gc2NyZWVuIFx1MjE5MiBcIkxvc3QgYWNjZXNzP1wiKWAsXG4gICAgICBub3RlOiAnS2VlcCB0aGlzIGZpbGUgc29tZXdoZXJlIHNhZmUuIEFueW9uZSB3aXRoIHRoaXMgc2VjcmV0IGNhbiBnZW5lcmF0ZSB5b3VyIGxvZ2luIGNvZGVzLiBVc2UgaXQgT05MWSB0byByZWNvdmVyIFRPVFAgYWNjZXNzIHZpYSB0aGUgXCJMb3N0IGFjY2Vzcz9cIiBsaW5rIG9uIHRoZSBEYXNoQ2FkZHkgbG9naW4gc2NyZWVuLidcbiAgICB9O1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBgZGFzaGNhZGR5LXRvdHAtYmFja3VwLSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKX0uanNvbmA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZG93bmxvYWQtYmFja3VwJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBTYXZlZCc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDcgRG93bmxvYWQnOyB9LCAyMDAwKTtcbiAgfSk7XG5cbiAgLy8gQ29uZmlybSBzZXR1cFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb25maXJtLXNldHVwJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWU7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJyk7XG4gICAgaWYgKCEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnRW50ZXIgYSA2LWRpZ2l0IGNvZGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgbG9hZFRvdHBTZXR0aW5ncygpOyAvLyBVcGRhdGVzIGJvdGggbW9kYWwgYW5kIGNhcmRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvcic7XG4gICAgfVxuICB9KTtcblxuICAvLyBBbGxvdyBFbnRlciBrZXkgb24gc2V0dXAgY29kZSBpbnB1dFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29uZmlybS1zZXR1cCcpPy5jbGljaygpO1xuICB9KTtcblxuICAvLyBEdXJhdGlvbiBjaGFuZ2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2Vzc2lvbkR1cmF0aW9uOiBlLnRhcmdldC52YWx1ZSB9KVxuICAgICAgfSk7XG4gICAgICBsb2FkVG90cFNldHRpbmdzKCk7IC8vIFJlZnJlc2ggbW9kYWwgKyBjYXJkIChoYW5kbGVzIFwibmV2ZXJcIiBkaXNhYmxpbmcgVE9UUClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIFVwZGF0ZSBTZXNzaW9uIER1cmF0aW9uJywgZXJyLCB7IGZ1bmN0aW9uOiAndXBkYXRlU2Vzc2lvbkR1cmF0aW9uJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIERpc2FibGUgVE9UUFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaXNhYmxlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ0Rpc2FibGUgVE9UUCBhdXRoZW50aWNhdGlvbj8gQWxsIHNlcnZpY2VzIHdpbGwgYmUgYWNjZXNzaWJsZSB3aXRob3V0IGEgY29kZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL2Rpc2FibGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogJ3t9J1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIGxvYWRUb3RwU2V0dGluZ3MoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBEaXNhYmxlIEZhaWxlZCcsIGUsIHsgZnVuY3Rpb246ICdkaXNhYmxlVE9UUCcgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIHNldHRpbmdzIG1vZGFsIGZyb20gQXV0aCBjYXJkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXNldHRpbmdzLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2FkVG90cFNldHRpbmdzKCk7XG4gICAgb3Blbk1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gIH0pO1xuXG4gIC8vIENsb3NlIHNldHRpbmdzIG1vZGFsXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1vZGFsLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgfSk7XG5cbiAgLy8gQmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKSB7XG4gICAgICBjbG9zZU1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBVcGRhdGUgYXV0aCBjYXJkIG9uIHBhZ2UgbG9hZFxuICB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID0gdXBkYXRlQXV0aENhcmQ7XG4gIChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gZGF0YS5jb25maWcuZW5hYmxlZCAmJiBkYXRhLmNvbmZpZy5pc1NldFVwO1xuICAgICAgICB1cGRhdGVBdXRoQ2FyZChhY3RpdmUsIGRhdGEuY29uZmlnLnNlc3Npb25EdXJhdGlvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBBdXRoQ2FyZCBVcGRhdGUnLCBlLCB7IGZ1bmN0aW9uOiAnYXV0aENhcmRVcGRhdGUnIH0pOyB9XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIEFkbWluIHBhbmVsIFx1MjAxNCBEQy0wNDguXG4gKlxuICogTWluaW1hbCBhZG1pbiBVSSBmb3IgbWFuYWdpbmcgdXNlcnMgKyBpbnZpdGVzLiBSZW5kZXJlZCBhcyBhIG1vZGFsIG92ZXJsYXlcbiAqIHRyaWdnZXJlZCBieSBhbiBcIkFkbWluXCIgYnV0dG9uIGluIHRoZSB0b3AgYmFyIHRoYXQgb25seSBhcHBlYXJzIHdoZW5cbiAqIC9hcGkvdjEvYXV0aC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZS4gVGhlIHBhbmVsIHJlbmRlcnMgdGhyZWUgc2VjdGlvbnM6XG4gKlxuICogICAxLiBVc2VycyBcdTIwMTQgbGlzdCBvZiBhdXRob3JpemVkIHVzZXJzIHdpdGggcm9sZSBiYWRnZXMsIHJvbGUtZWRpdCxcbiAqICAgICAgZGVsZXRlIGFjdGlvbnMuXG4gKiAgIDIuIEludml0ZSBhIHVzZXIgXHUyMDE0IGZvcm0gdG8gaXNzdWUgYSBzaW5nbGUtdXNlIGludml0ZSAoZW1haWwsIHJvbGUsXG4gKiAgICAgIFRUTCkuIFRoZSBhY2NlcHQtbGluayBpcyBzaG93biBwb3N0LWlzc3VlIHNvIHRoZSBhZG1pbiBjYW4gY29weSBpdC5cbiAqICAgMy4gT3V0c3RhbmRpbmcgaW52aXRlcyBcdTIwMTQgbGlzdCBvZiBpc3N1ZWQtbm90LXlldC1hY2NlcHRlZCBpbnZpdGVzXG4gKiAgICAgIHdpdGggYSByZXZva2UgYnV0dG9uLlxuICpcbiAqIFRoZSBwYW5lbCBkb2VzIE5PVCBhZGQgYSB0YWIgdG8gdGhlIGRhc2hib2FyZCBuYXYgXHUyMDE0IGl0IGxpdmVzIGFzIGEgbW9kYWxcbiAqIHRvIGtlZXAgREMtMDQ4IHN1cmdpY2FsLiBGdXR1cmUgREMtMDQ5IHdvcmsgY2FuIHByb21vdGUgaXQgdG8gYSB0YWIuXG4gKlxuICogQmVoYXZpb3VyOlxuICogICAtIE9uIGxvYWQ6IEdFVCAvbWU7IGlmICFpc0FkbWluIFx1MjE5MiBzaG93IFwiYWRtaW4gb25seVwiIHBsYWNlaG9sZGVyXG4gKiAgIC0gVGhlbiBHRVQgL2FkbWluL3VzZXJzICsgL2FkbWluL2ludml0ZXMgaW4gcGFyYWxsZWxcbiAqICAgLSBGb3JtcyBQT1NUIHRvIHRoZSBhZG1pbiBlbmRwb2ludHMsIHJlZnJlc2ggbGlzdHMgb24gc3VjY2Vzc1xuICogICAtIFwiQ29weSBsaW5rXCIgYnV0dG9uIHdyaXRlcyB0aGUgYWNjZXB0VXJsIHRvIHRoZSBjbGlwYm9hcmRcbiAqXG4gKiBXaXJlcyBpbnRvIHRoZSBnbG9iYWwgZXJyb3ItaGFuZGxlciAod2luZG93LmVycm9ySGFuZGxlcikgZm9yIGZhaWx1cmVcbiAqIHN1cmZhY2VzLiBVc2VzIHdpbmRvdy5TSVRFIGZvciBhbnkgVUkgY29uc3RhbnRzIChub25lIGN1cnJlbnRseSkuXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IEFQSSA9IHtcbiAgICBtZTogJy9hcGkvdjEvYXV0aC9tZScsXG4gICAgdXNlcnM6ICcvYXBpL3YxL2F1dGgvYWRtaW4vdXNlcnMnLFxuICAgIGFsbG93bGlzdDogJy9hcGkvdjEvYXV0aC9hZG1pbi9hbGxvd2xpc3QnLFxuICAgIGludml0ZXM6ICcvYXBpL3YxL2F1dGgvYWRtaW4vaW52aXRlcycsXG4gIH07XG5cbiAgZnVuY3Rpb24gX2VsKHRhZywgYXR0cnMsIC4uLmNoaWxkcmVuKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAoYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhdHRycykpIHtcbiAgICAgICAgY29uc3QgdiA9IGF0dHJzW2tdO1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2O1xuICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2O1xuICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdjtcbiAgICAgICAgZWxzZSBpZiAoay5zdGFydHNXaXRoKCdvbicpICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTtcbiAgICAgICAgZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoYyA9PT0gbnVsbCB8fCBjID09PSB1bmRlZmluZWQgfHwgYyA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKSk7XG4gICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQoYyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gX2ZldGNoSlNPTih1cmwsIG9wdHMpIHtcbiAgICBjb25zdCBjc3JmID0gKHdpbmRvdy5TSVRFICYmIHdpbmRvdy5TSVRFLmNzcmZUb2tlbikgfHwgJyc7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgb3B0cy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgb3B0cy5oZWFkZXJzIHx8IHt9LFxuICAgICAgY3NyZiA/IHsgJ1gtQ1NSRi1Ub2tlbic6IGNzcmYgfSA6IHt9XG4gICAgKTtcbiAgICBpZiAob3B0cy5ib2R5ICYmIHR5cGVvZiBvcHRzLmJvZHkgIT09ICdzdHJpbmcnKSBvcHRzLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRzLmJvZHkpO1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdHMpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXIub2spIHtcbiAgICAgIGNvbnN0IG1zZyA9IChkYXRhICYmIChkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvcikpIHx8ICgnSFRUUCAnICsgci5zdGF0dXMpO1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gICAgICBlcnIuc3RhdHVzID0gci5zdGF0dXM7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckJhZGdlKHJvbGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICBhZG1pbjogJ2JhY2tncm91bmQ6IzdjM2FlZDtjb2xvcjojZmZmJyxcbiAgICAgIG9wZXJhdG9yOiAnYmFja2dyb3VuZDojMjU2M2ViO2NvbG9yOiNmZmYnLFxuICAgICAgdmlld2VyOiAnYmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmYnLFxuICAgIH07XG4gICAgcmV0dXJuIF9lbCgnc3BhbicsIHtcbiAgICAgIGNsYXNzOiAncm9sZS1iYWRnZScsXG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC43NXJlbTtmb250LXdlaWdodDo2MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOycgK1xuICAgICAgICAoY29sb3JzW3JvbGVdIHx8IGNvbG9ycy52aWV3ZXIpLFxuICAgICAgdGV4dDogcm9sZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJVc2Vyc0xpc3QoY29udGFpbmVyLCB1c2Vycywgb25DaGFuZ2UpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgaWYgKCF1c2VycyB8fCB1c2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7IHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogJ05vIHVzZXJzIHlldC4nIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSBfZWwoJ3RhYmxlJywge1xuICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45cmVtJyxcbiAgICB9KTtcbiAgICB0YWJsZS5hcHBlbmRDaGlsZChfZWwoJ3RoZWFkJywgbnVsbCxcbiAgICAgIF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdSb2xlJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQ3JlYXRlZCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0xhc3QgbG9naW4nIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQWN0aW9ucycgfSksXG4gICAgICApLFxuICAgICkpO1xuICAgIGNvbnN0IHRib2R5ID0gX2VsKCd0Ym9keScpO1xuICAgIGZvciAoY29uc3QgdSBvZiB1c2Vycykge1xuICAgICAgY29uc3Qgcm93ID0gX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9KTtcblxuICAgICAgY29uc3QgZW1haWxDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSk7XG4gICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdzcGFuJywgeyB0ZXh0OiB1LmVtYWlsIHx8ICcobm8gZW1haWwpJyB9KSk7XG4gICAgICBpZiAodS5kaXNwbGF5TmFtZSAmJiB1LmRpc3BsYXlOYW1lICE9PSAodS5lbWFpbCB8fCAnJykuc3BsaXQoJ0AnKVswXSkge1xuICAgICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdicicpKTtcbiAgICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnc21hbGwnLCB7XG4gICAgICAgICAgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiB1LmRpc3BsYXlOYW1lLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoZW1haWxDZWxsKTtcblxuICAgICAgY29uc3Qgcm9sZUNlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9KTtcbiAgICAgIHJvbGVDZWxsLmFwcGVuZENoaWxkKF9yZW5kZXJCYWRnZSh1LnJvbGUpKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChyb2xlQ2VsbCk7XG5cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IHUuY3JlYXRlZEF0ID8gbmV3IERhdGUodS5jcmVhdGVkQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiB1Lmxhc3RMb2dpbkF0ID8gbmV3IERhdGUodS5sYXN0TG9naW5BdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBhY3Rpb25zQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7dGV4dC1hbGlnbjpyaWdodCcgfSk7XG4gICAgICBjb25zdCByb2xlU2VsZWN0ID0gX2VsKCdzZWxlY3QnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzoycHggNnB4O21hcmdpbi1yaWdodDo2cHgnLFxuICAgICAgICBvbmNoYW5nZTogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHUuaWQpLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJywgYm9keTogeyByb2xlOiBldi50YXJnZXQudmFsdWUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnUm9sZSB1cGRhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIGV2LnRhcmdldC52YWx1ZSA9IHUucm9sZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgciBvZiBbJ2FkbWluJywgJ29wZXJhdG9yJywgJ3ZpZXdlciddKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IF9lbCgnb3B0aW9uJywgeyB2YWx1ZTogciwgdGV4dDogciB9KTtcbiAgICAgICAgaWYgKHIgPT09IHUucm9sZSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcm9sZVNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQocm9sZVNlbGVjdCk7XG5cbiAgICAgIGNvbnN0IGRlbEJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzoycHggOHB4JyxcbiAgICAgICAgdGV4dDogJ0RlbGV0ZScsXG4gICAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oJ0RlbGV0ZSB1c2VyICcgKyAodS5lbWFpbCB8fCB1LmlkKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChkZWxCdG4pO1xuICAgICAgcm93LmFwcGVuZENoaWxkKGFjdGlvbnNDZWxsKTtcblxuICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICB9XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySW52aXRlRm9ybShjb250YWluZXIsIG9uSXNzdWVkKSB7XG4gICAgY29uc3QgZm9ybSA9IF9lbCgnZm9ybScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6ZW5kJyxcbiAgICAgIG9uc3VibWl0OiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoZXYudGFyZ2V0KTtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICBlbWFpbDogZmQuZ2V0KCdlbWFpbCcpLFxuICAgICAgICAgIHJvbGU6IGZkLmdldCgncm9sZScpLFxuICAgICAgICAgIHR0bEhvdXJzOiBwYXJzZUludChmZC5nZXQoJ3R0bEhvdXJzJyksIDEwKSB8fCAyNCxcbiAgICAgICAgICBzZW5kRW1haWw6IGZkLmdldCgnc2VuZEVtYWlsJykgPT09ICdvbicsXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHkgfSk7XG4gICAgICAgICAgZXYudGFyZ2V0LnJlc2V0KCk7XG4gICAgICAgICAgb25Jc3N1ZWQgJiYgb25Jc3N1ZWQocik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnSW52aXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIHJlcXVpcmVkOiB0cnVlLCBwbGFjZWhvbGRlcjogJ3VzZXJAZXhhbXBsZS5jb20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KSxcbiAgICApKTtcbiAgICBjb25zdCByb2xlU2VsID0gX2VsKCdzZWxlY3QnLCB7IG5hbWU6ICdyb2xlJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSk7XG4gICAgZm9yIChjb25zdCByIG9mIFsnb3BlcmF0b3InLCAndmlld2VyJywgJ2FkbWluJ10pIHtcbiAgICAgIHJvbGVTZWwuYXBwZW5kQ2hpbGQoX2VsKCdvcHRpb24nLCB7IHZhbHVlOiByLCB0ZXh0OiByIH0pKTtcbiAgICB9XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1JvbGUnIH0pLCByb2xlU2VsLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdUVEwgKGhvdXJzKScgfSksXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAndHRsSG91cnMnLCB0eXBlOiAnbnVtYmVyJywgbWluOiAnMScsIG1heDogJzE2OCcsIHZhbHVlOiAnMjQnLCBzdHlsZTogJ3BhZGRpbmc6NnB4O3dpZHRoOjgwcHgnIH0pLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjRweDthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAnc2VuZEVtYWlsJywgdHlwZTogJ2NoZWNrYm94JywgY2hlY2tlZDogdHJ1ZSB9KSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1NlbmQgZW1haWwnIH0pLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7IHR5cGU6ICdzdWJtaXQnLCBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzo2cHggMTJweCcsIHRleHQ6ICdJc3N1ZSBpbnZpdGUnIH0pKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySW52aXRlc0xpc3QoY29udGFpbmVyLCBpbnZpdGVzLCBvbkNoYW5nZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIWludml0ZXMgfHwgaW52aXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7IHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogJ05vIG91dHN0YW5kaW5nIGludml0ZXMuJyB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gX2VsKCd0YWJsZScsIHtcbiAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOXJlbScsXG4gICAgfSk7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoX2VsKCd0aGVhZCcsIG51bGwsXG4gICAgICBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0sXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnUm9sZScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0ludml0ZWQgYnknIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFeHBpcmVzJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0FjdGlvbnMnIH0pLFxuICAgICAgKSxcbiAgICApKTtcbiAgICBjb25zdCB0Ym9keSA9IF9lbCgndGJvZHknKTtcbiAgICBmb3IgKGNvbnN0IGludiBvZiBpbnZpdGVzKSB7XG4gICAgICBjb25zdCByb3cgPSBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0pO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnLCB0ZXh0OiBpbnYuZW1haWwgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0sIF9yZW5kZXJCYWRnZShpbnYucm9sZSkpKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6IGludi5pbnZpdGVkQnkgfHwgJ1x1MjAxNCcgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogaW52LmV4cGlyZXNBdCA/IG5ldyBEYXRlKGludi5leHBpcmVzQXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDt0ZXh0LWFsaWduOnJpZ2h0JyB9KTtcbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywge1xuICAgICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzoycHggOHB4JyxcbiAgICAgICAgdGV4dDogJ1Jldm9rZScsXG4gICAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oJ1Jldm9rZSBpbnZpdGUgZm9yICcgKyBpbnYuZW1haWwgKyAnPycpKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoaW52LmlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnUmV2b2tlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKGFjdGlvbnNDZWxsKTtcbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgfVxuICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlcklzc3VlZEludml0ZUJhbm5lcihpbnZpdGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGJhbm5lciA9IF9lbCgnZGl2Jywge1xuICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjEycHg7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgIzE2YTM0YTtib3JkZXItcmFkaXVzOjZweDtiYWNrZ3JvdW5kOiMwNTJlMWE7Y29sb3I6I2JiZjdkMDtmb250LXNpemU6MC44NXJlbScsXG4gICAgfSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnc3Ryb25nJywgeyB0ZXh0OiAnSW52aXRlIGlzc3VlZCBcdTIwMTQgY29weSB0aGUgbGluayBiZWxvdy4gJyArXG4gICAgICAnSXQgd2lsbCBub3QgYmUgc2hvd24gYWdhaW4uJyB9KSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnYnInKSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnY29kZScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjhweDtwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOiMwMDA7Ym9yZGVyLXJhZGl1czo0cHg7d29yZC1icmVhazpicmVhay1hbGw7Y29sb3I6I2QxZmFlNScsXG4gICAgICB0ZXh0OiBpbnZpdGUuYWNjZXB0VXJsLFxuICAgIH0pKTtcbiAgICBjb25zdCBjb3B5QnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnQ29weSBsaW5rJyxcbiAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChpbnZpdGUuYWNjZXB0VXJsKTtcbiAgICAgICAgICBjb3B5QnRuLnRleHRDb250ZW50ID0gJ0NvcGllZCEnO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBjb3B5QnRuLnRleHRDb250ZW50ID0gJ0NvcHkgbGluayc7IH0sIDIwMDApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0NsaXBib2FyZCBibG9ja2VkOiBzZWxlY3QgdGhlIGxpbmsgbWFudWFsbHkuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKGNvcHlCdG4pO1xuICAgIGlmIChpbnZpdGUuZGVsaXZlcmVkVmlhID09PSAnZGV2LWNvbnNvbGUnKSB7XG4gICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ21hcmdpbi10b3A6OHB4O2NvbG9yOiNmYmJmMjQ7Zm9udC1zaXplOjAuOHJlbScsXG4gICAgICAgIHRleHQ6ICdTTVRQIG5vdCBjb25maWd1cmVkIFx1MjAxNCB0aGUgaW52aXRlIHdhcyBsb2dnZWQgdG8gdGhlIHNlcnZlciBjb25zb2xlIChzZWFyY2ggZm9yIFtEQy0wNDgtREVWLUlOVklURS1MSU5LXSkuJyxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdlbWFpbCcpIHtcbiAgICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7Y29sb3I6Izg2ZWZhYztmb250LXNpemU6MC44cmVtJyxcbiAgICAgICAgdGV4dDogJ0VtYWlsIHNlbnQgdG8gJyArIGludml0ZS5lbWFpbCArICcuJyxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGJhbm5lcik7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIGFkbWluIHBhbmVsLiBDYWxsZWQgYnkgdGhlIG9wZW4gdHJpZ2dlcjsgc2FmZSB0byBjYWxsIG11bHRpcGxlXG4gICAqIHRpbWVzIChyZS1yZW5kZXJzIGludG8gdGhlIHNhbWUgY29udGFpbmVyKS5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoMicsIHsgc3R5bGU6ICdtYXJnaW46MCAwIDE2cHgnLCB0ZXh0OiAnQWRtaW4gXHUwMEI3IFVzZXJzICYgSW52aXRlcycgfSkpO1xuXG4gICAgY29uc3QgbWVEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkubWUpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIGlmICghbWVEYXRhIHx8ICFtZURhdGEudXNlciB8fCBtZURhdGEudXNlci5yb2xlICE9PSAnYWRtaW4nKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsXG4gICAgICAgIHRleHQ6ICdBZG1pbiByb2xlIHJlcXVpcmVkIHRvIHZpZXcgdGhpcyBwYW5lbC4gSWYgbXVsdGktdXNlciBtb2RlIGlzIGVuYWJsZWQgYW5kIHlvdSBzaG91bGQgaGF2ZSBhY2Nlc3MsIGNoZWNrIC9hcGkvdjEvYXV0aC9tZS4nLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggYnV0dG9uXG4gICAgY29uc3QgcmVmcmVzaEJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ2Zsb2F0OnJpZ2h0O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ1JlZnJlc2gnLFxuICAgICAgb25jbGljazogKCkgPT4gbW91bnQoY29udGFpbmVyKSxcbiAgICB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocmVmcmVzaEJ0bik7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVXNlcnMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCB1c2Vyc0hlYWRlciA9IF9lbCgnaDMnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHg7Y2xlYXI6Ym90aCcsIHRleHQ6ICdVc2VycycgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJzSGVhZGVyKTtcblxuICAgIGNvbnN0IHVzZXJzTGlzdCA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLXVzZXJzLWxpc3QnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2Vyc0xpc3QpO1xuXG4gICAgY29uc3QgdXNlcnNEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMpLmNhdGNoKCgpID0+ICh7IHVzZXJzOiBbXSB9KSk7XG4gICAgX3JlbmRlclVzZXJzTGlzdCh1c2Vyc0xpc3QsIHVzZXJzRGF0YS51c2VycywgKCkgPT4gbW91bnQoY29udGFpbmVyKSk7XG5cbiAgICAvLyBBZGQgdXNlciBmb3JtIChwcmUtYXV0aG9yaXplIGFuIGVtYWlsIHdpdGhvdXQgaXNzdWluZyBhbiBpbnZpdGUpLlxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2g0JywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4O2ZvbnQtc2l6ZTowLjk1cmVtJywgdGV4dDogJ1ByZS1hdXRob3JpemUgZW1haWwnIH0pKTtcbiAgICBjb25zdCBhZGRVc2VyRm9ybSA9IF9lbCgnZm9ybScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6ZW5kJyxcbiAgICAgIG9uc3VibWl0OiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZW1haWwgPSBldi50YXJnZXQuZW1haWwudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIWVtYWlsKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHsgZW1haWwgfSB9KTtcbiAgICAgICAgICBldi50YXJnZXQucmVzZXQoKTtcbiAgICAgICAgICBtb3VudChjb250YWluZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0FkZCBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFkZFVzZXJGb3JtLmFwcGVuZENoaWxkKF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIHJlcXVpcmVkOiB0cnVlLCBwbGFjZWhvbGRlcjogJ3VzZXJAZXhhbXBsZS5jb20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KSk7XG4gICAgYWRkVXNlckZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7IHR5cGU6ICdzdWJtaXQnLCBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzo2cHggMTJweCcsIHRleHQ6ICdBZGQgdG8gYWxsb3dsaXN0JyB9KSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFkZFVzZXJGb3JtKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJbnZpdGVzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDMnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHgnLCB0ZXh0OiAnSXNzdWUgaW52aXRlJyB9KSk7XG4gICAgY29uc3QgaW52aXRlRm9ybUNvbnRhaW5lciA9IF9lbCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGludml0ZUZvcm1Db250YWluZXIpO1xuXG4gICAgY29uc3QgaW52aXRlc0xpc3QgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi1pbnZpdGVzLWxpc3QnLCBzdHlsZTogJ21hcmdpbi10b3A6MTZweCcgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGludml0ZXNMaXN0KTtcblxuICAgIGNvbnN0IGludml0ZXNEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcykuY2F0Y2goKCkgPT4gKHsgaW52aXRlczogW10gfSkpO1xuICAgIF9yZW5kZXJJbnZpdGVzTGlzdChpbnZpdGVzTGlzdCwgaW52aXRlc0RhdGEuaW52aXRlcywgKCkgPT4gbW91bnQoY29udGFpbmVyKSk7XG5cbiAgICBfcmVuZGVySW52aXRlRm9ybShpbnZpdGVGb3JtQ29udGFpbmVyLCAoaXNzdWVkKSA9PiB7XG4gICAgICBfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyKGlzc3VlZCwgaW52aXRlRm9ybUNvbnRhaW5lcik7XG4gICAgICBtb3VudChjb250YWluZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFB1YmxpYyBBUEkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGFkbWluIHBhbmVsIGFzIGEgbW9kYWwgb3ZlcmxheS4gQ2xvc2VzIG9uIGJhY2tkcm9wIGNsaWNrIG9yXG4gICAqIHRoZSBjbG9zZSBidXR0b24uIFJlbmRlcnMgaW50byBkb2N1bWVudC5ib2R5IHNvIGl0IGZsb2F0cyBhYm92ZSB0aGVcbiAgICogZGFzaGJvYXJkIGNocm9tZS5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgLy8gSWYgYWxyZWFkeSBvcGVuLCBqdXN0IGZvY3VzLlxuICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhbmVsLXJvb3QnKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IGJhY2tkcm9wID0gX2VsKCdkaXYnLCB7XG4gICAgICBpZDogJ2FkbWluLXBhbmVsLXJvb3QnLFxuICAgICAgc3R5bGU6ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JyxcbiAgICAgIG9uY2xpY2s6IChldikgPT4ge1xuICAgICAgICBpZiAoZXYudGFyZ2V0ID09PSBiYWNrZHJvcCkgY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYXJkID0gX2VsKCdkaXYnLCB7XG4gICAgICBzdHlsZTogJ2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iYXNlLCMxZjI5MzcpO2NvbG9yOnZhcigtLXRleHQsI2YzZjRmNik7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoyNHB4O21heC13aWR0aDo5MDBweDt3aWR0aDo5MCU7bWF4LWhlaWdodDo4NXZoO292ZXJmbG93OmF1dG87cG9zaXRpb246cmVsYXRpdmU7Ym94LXNoYWRvdzowIDEwcHggMzBweCByZ2JhKDAsMCwwLDAuMyknLFxuICAgIH0pO1xuICAgIGNhcmQuYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncG9zaXRpb246YWJzb2x1dGU7dG9wOjEycHg7cmlnaHQ6MTJweDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdDbG9zZScsIG9uY2xpY2s6IGNsb3NlLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGJvZHkgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi1wYW5lbC1ib2R5JyB9KTtcbiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpO1xuICAgIGJhY2tkcm9wLmFwcGVuZENoaWxkKGNhcmQpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1vdW50KGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6I2Y4NzE3MVwiPkZhaWxlZCB0byBsb2FkIGFkbWluIHBhbmVsOiAnICsgKGUubWVzc2FnZSB8fCBlKSArICc8L3A+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi1wYW5lbC1yb290Jyk7XG4gICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgYW4gXCJBZG1pblwiIGJ1dHRvbiBpbnRvIHRoZSB0b3AgYmFyLiBPbmx5IHJlbmRlcnMgd2hlbiB0aGVcbiAgICogY3VycmVudCAvbWUgcmVzcG9uc2Ugc2F5cyBpc0FkbWluPXRydWUuIFJlLWNoZWNrcyBwZXJpb2RpY2FsbHlcbiAgICogKGV2ZXJ5IDYwcykgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3Qgd2l0aG91dCBhIHJlbG9hZC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGF0dGFjaFRyaWdnZXIoYmFyQ29udGFpbmVyKSB7XG4gICAgYXN5bmMgZnVuY3Rpb24gX21heWJlU2hvdygpIHtcbiAgICAgIGNvbnN0IG1lID0gYXdhaXQgX2ZldGNoSlNPTihBUEkubWUpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tdHJpZ2dlci1idG4nKTtcbiAgICAgIGlmIChtZSAmJiBtZS51c2VyICYmIG1lLnVzZXIucm9sZSA9PT0gJ2FkbWluJykge1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgYnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICAgICAgaWQ6ICdhZG1pbi10cmlnZ2VyLWJ0bicsXG4gICAgICAgICAgY2xhc3M6ICdidG4tc20nLFxuICAgICAgICAgIHN0eWxlOiAnbWFyZ2luLWxlZnQ6OHB4O3BhZGRpbmc6NnB4IDEycHgnLFxuICAgICAgICAgIHRleHQ6ICdBZG1pbicsXG4gICAgICAgICAgb25jbGljazogb3BlbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChiYXJDb250YWluZXIpIGJhckNvbnRhaW5lci5hcHBlbmRDaGlsZChidG4pO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBfbWF5YmVTaG93KCk7XG4gICAgc2V0SW50ZXJ2YWwoX21heWJlU2hvdywgNjBfMDAwKTtcbiAgfVxuXG4gIHdpbmRvdy5BZG1pblBhbmVsID0geyBvcGVuLCBjbG9zZSwgYXR0YWNoVHJpZ2dlciB9O1xufSkoKTs7XG4vLyA9PT09PT09PT09IENSRURFTlRJQUwgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vIEluamVjdCBza2VsZXRvbiBtb2RhbCBcdTIwMTQgY3JlZGVudGlhbCBzZWN0aW9ucyBhcmUgYnVpbHQgZHluYW1pY2FsbHkgd2hlbiBvcGVuZWRcbiAgaW5qZWN0TW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJ0b2tlbi1tYW5hZ2VtZW50LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA2MDBweDtcIj5cbiAgICAgIDxoMz5cXHV7MUY1MTF9IEROUyBDcmVkZW50aWFsczwvaDM+XG5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBFbnRlciBUZWNobml0aXVtIEROUyBsb2dpbiBjcmVkZW50aWFscy4gUmVhZC1vbmx5IGFjY291bnRzIGFyZSB1c2VkIGZvciBsb2dzOyBhZG1pbiBhY2NvdW50cyBmb3IgcmVzdGFydHMsIHJlY29yZHMsIGFuZCB1cGRhdGVzLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGlkPVwiZG5zLWNyZWQtc2VjdGlvbnNcIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1jbGVhci1hbGxcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogYXV0bzsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+Q2xlYXIgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIGApO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBIZWxwZXJzIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldERuc0lkcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzIHx8IHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERuc0Rpc3BsYXlOYW1lKGRuc0lkKSB7XG4gICAgY29uc3Qgc2VydmVyID0gKFNJVEUuZG5zU2VydmVycyB8fCB7fSlbZG5zSWRdO1xuICAgIHJldHVybiBzZXJ2ZXI/Lm5hbWUgfHwgZG5zSWQudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBwZXItc2VydmVyIGNyZWRlbnRpYWwgZm9ybSBzZWN0aW9ucyBmcm9tIFNJVEUuZG5zU2VydmVycyAqL1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxTZWN0aW9ucygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWNyZWQtc2VjdGlvbnMnKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgIGNvbnN0IGRuc0lkcyA9IGdldERuc0lkcygpO1xuICAgIGlmIChkbnNJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQuPC9wPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBkbnNJZHMpIHtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1zZWN0aW9uXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cInRva2VuLXNlY3Rpb24tdGl0bGVcIj4ke2dldERuc0Rpc3BsYXlOYW1lKGlkKX08L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZ3JpZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIiR7aWR9LXJlYWRvbmx5LXVzZXJuYW1lXCI+XFx1ezFGNEQ2fSBSZWFkLU9ubHkgKExvZ3MpOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiR7aWR9LXJlYWRvbmx5LXVzZXJuYW1lXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4taW5wdXQtcm93XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiR7aWR9LXJlYWRvbmx5LXRva2VuXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9rZW4tdG9nZ2xlXCIgZGF0YS10YXJnZXQ9XCIke2lkfS1yZWFkb25seS10b2tlblwiPlxcdXsxRjQ0MX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIiR7aWR9LWFkbWluLXVzZXJuYW1lXCI+XFx1ezFGNTI3fSBBZG1pbjo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIke2lkfS1hZG1pbi11c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweDtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWlucHV0LXJvd1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCIke2lkfS1hZG1pbi10b2tlblwiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRva2VuLXRvZ2dsZVwiIGRhdGEtdGFyZ2V0PVwiJHtpZH0tYWRtaW4tdG9rZW5cIj5cXHV7MUY0NDF9PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1zdGF0dXNcIiBpZD1cIiR7aWR9LXRva2VuLXN0YXR1c1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBgKTtcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQ3JlZGVudGlhbCBlbmNyeXB0aW9uIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldEVuY3J5cHRpb25LZXkoKSB7XG4gICAgbGV0IGtleSA9IHNhZmVTZXNzaW9uR2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICBpZiAoa2V5KSByZXR1cm4ga2V5O1xuXG4gICAgY29uc3Qgb2xkS2V5ID0gc2FmZUdldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgaWYgKG9sZEtleSkge1xuICAgICAgc2FmZVNlc3Npb25TZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScsIG9sZEtleSk7XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICAgIHJldHVybiBvbGRLZXk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAga2V5ID0gQXJyYXkuZnJvbShhcnJheSwgYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBzYWZlU2Vzc2lvblNldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jywga2V5KTtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGNvbnN0IEVOQ1JZUFRJT05fS0VZID0gZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gIGZ1bmN0aW9uIGNyZWRlbnRpYWxFbmNyeXB0KHRleHQsIGtleSkge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSg4KSk7XG4gICAgY29uc3QgaXZIZXggPSBBcnJheS5mcm9tKGl2LCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIGNvbnN0IGtleUJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSArIGl2SGV4KTtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKVxuICAgICAgICBeIGtleUJ5dGVzW2kgJSBrZXlCeXRlcy5sZW5ndGhdXG4gICAgICAgIF4gaXZbaSAlIGl2Lmxlbmd0aF1cbiAgICAgICAgXiAoKGkgKiAzMSArIDE3KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gaXZIZXggKyAnOicgKyBidG9hKHJlc3VsdCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVkZW50aWFsRGVjcnlwdChlbmNyeXB0ZWRUZXh0LCBrZXkpIHtcbiAgICBpZiAoIWVuY3J5cHRlZFRleHQpIHJldHVybiAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29sb25JZHggPSBlbmNyeXB0ZWRUZXh0LmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChjb2xvbklkeCA9PT0gMTYpIHtcbiAgICAgICAgY29uc3QgaXZIZXggPSBlbmNyeXB0ZWRUZXh0LnN1YnN0cmluZygwLCAxNik7XG4gICAgICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkoaXZIZXgubWF0Y2goLy57Mn0vZykubWFwKGggPT4gcGFyc2VJbnQoaCwgMTYpKSk7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBhdG9iKGVuY3J5cHRlZFRleHQuc3Vic3RyaW5nKDE3KSk7XG4gICAgICAgIGNvbnN0IGtleUJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSArIGl2SGV4KTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGRlY29kZWQuY2hhckNvZGVBdChpKVxuICAgICAgICAgICAgXiBrZXlCeXRlc1tpICUga2V5Qnl0ZXMubGVuZ3RoXVxuICAgICAgICAgICAgXiBpdltpICUgaXYubGVuZ3RoXVxuICAgICAgICAgICAgXiAoKGkgKiAzMSArIDE3KSAmIDB4RkYpO1xuICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoZW5jcnlwdGVkVGV4dCk7XG4gICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBkZWNvZGVkLmNoYXJDb2RlQXQoaSkgXiBrZXkuY2hhckNvZGVBdChpICUga2V5Lmxlbmd0aCk7XG4gICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBDcmVkZW50aWFsIHN0b3JhZ2UgXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCBjcmVkVHlwZSkge1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IHNhZmVHZXQoYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgKTtcbiAgICByZXR1cm4gY3JlZGVudGlhbERlY3J5cHQoZW5jcnlwdGVkLCBFTkNSWVBUSU9OX0tFWSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsIGNyZWRUeXBlLCB2YWx1ZSkge1xuICAgIGNvbnN0IGtleSA9IGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYDtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNhZmVTZXQoa2V5LCBjcmVkZW50aWFsRW5jcnlwdCh2YWx1ZSwgRU5DUllQVElPTl9LRVkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FmZVJlbW92ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRva2VuKGRuc0lkLCB0b2tlblR5cGUpIHtcbiAgICByZXR1cm4gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndG9rZW4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFVzZXJuYW1lKGRuc0lkLCB0b2tlblR5cGUpIHtcbiAgICByZXR1cm4gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndXNlcm5hbWUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRva2VuKGRuc0lkLCB0b2tlblR5cGUsIHRva2VuKSB7XG4gICAgc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndG9rZW4nLCB0b2tlbik7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRVc2VybmFtZShkbnNJZCwgdG9rZW5UeXBlLCB1c2VybmFtZSkge1xuICAgIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3VzZXJuYW1lJywgdXNlcm5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QWxsQ3JlZGVudGlhbHMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBkbnNJZCBvZiBnZXREbnNJZHMoKSkge1xuICAgICAgcmVzdWx0W2Ruc0lkXSA9IHtcbiAgICAgICAgcmVhZG9ubHk6IHsgdXNlcm5hbWU6IGdldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknKSwgdG9rZW46IGdldFRva2VuKGRuc0lkLCAncmVhZG9ubHknKSB9LFxuICAgICAgICBhZG1pbjogeyB1c2VybmFtZTogZ2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicpLCB0b2tlbjogZ2V0VG9rZW4oZG5zSWQsICdhZG1pbicpIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckFsbENyZWRlbnRpYWxzKCkge1xuICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgWydyZWFkb25seScsICdhZG1pbiddLmZvckVhY2godG9rZW5UeXBlID0+IHtcbiAgICAgICAgWyd0b2tlbicsICd1c2VybmFtZSddLmZvckVhY2goY3JlZFR5cGUgPT4ge1xuICAgICAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LXRva2VuLWVuY2ApO1xuICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tdXNlcm5hbWUtZW5jYCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTdG9yZWRDcmVkZW50aWFscyhkbnNJZCkge1xuICAgIGNvbnN0IHJlYWRvbmx5VG9rZW4gPSBnZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5Jyk7XG4gICAgY29uc3QgcmVhZG9ubHlVc2VybmFtZSA9IGdldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknKTtcbiAgICBjb25zdCBhZG1pblRva2VuID0gZ2V0VG9rZW4oZG5zSWQsICdhZG1pbicpO1xuICAgIGNvbnN0IGFkbWluVXNlcm5hbWUgPSBnZXRVc2VybmFtZShkbnNJZCwgJ2FkbWluJyk7XG4gICAgY29uc3Qgb2xkVG9rZW4gPSBjcmVkZW50aWFsRGVjcnlwdChzYWZlR2V0KGAke2Ruc0lkfS10b2tlbi1lbmNgKSwgRU5DUllQVElPTl9LRVkpO1xuICAgIGNvbnN0IG9sZFVzZXJuYW1lID0gY3JlZGVudGlhbERlY3J5cHQoc2FmZUdldChgJHtkbnNJZH0tdXNlcm5hbWUtZW5jYCksIEVOQ1JZUFRJT05fS0VZKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogYWRtaW5Vc2VybmFtZSB8fCByZWFkb25seVVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lLFxuICAgICAgdG9rZW46IGFkbWluVG9rZW4gfHwgcmVhZG9ubHlUb2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIHJlYWRvbmx5VG9rZW46IHJlYWRvbmx5VG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICByZWFkb25seVVzZXJuYW1lOiByZWFkb25seVVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lLFxuICAgICAgYWRtaW5Ub2tlbjogYWRtaW5Ub2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIGFkbWluVXNlcm5hbWU6IGFkbWluVXNlcm5hbWUgfHwgb2xkVXNlcm5hbWVcbiAgICB9O1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIE1vZGFsIGhhbmRsZXJzIFx1MjUwMFx1MjUwMFxuXG4gIC8vIE9wZW4gbW9kYWwgXHUyMDE0IGJ1aWxkIHNlY3Rpb25zIGR5bmFtaWNhbGx5LCBwb3B1bGF0ZSBmcm9tIHN0b3JlZCBjcmVkc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZENyZWRlbnRpYWxTZWN0aW9ucygpO1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgICBjb25zdCBjcmVkcyA9IGdldEFsbENyZWRlbnRpYWxzKCk7XG5cbiAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIGNvbnN0IGMgPSBjcmVkc1tkbnNJZF07XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZSA9IGMucmVhZG9ubHkudXNlcm5hbWU7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZSA9IGMucmVhZG9ubHkudG9rZW47XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZSA9IGMuYWRtaW4udXNlcm5hbWU7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZSA9IGMuYWRtaW4udG9rZW47XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnJztcbiAgICB9KTtcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gVG9nZ2xlIHBhc3N3b3JkIHZpc2liaWxpdHkgKyBiYWNrZHJvcCBjbG9zZSAoZXZlbnQgZGVsZWdhdGlvbiBmb3IgZHluYW1pYyBlbGVtZW50cylcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy50b2tlbi10b2dnbGUnKTtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBjb25zdCB0YXJnZXRJZCA9IGJ0bi5kYXRhc2V0LnRhcmdldDtcbiAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpO1xuICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1xcdXsxRjY0OH0nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQudHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MUY0NDF9JztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpIHtcbiAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNhdmUgY3JlZGVudGlhbHNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZG5zSWRzID0gZ2V0RG5zSWRzKCk7XG5cbiAgICAvLyBTYXZlIGFsbCB0byBsb2NhbFN0b3JhZ2VcbiAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBzZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUudHJpbSgpKTtcbiAgICAgIHNldFRva2VuKGRuc0lkLCAncmVhZG9ubHknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZS50cmltKCkpO1xuICAgICAgc2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlLnRyaW0oKSk7XG4gICAgICBzZXRUb2tlbihkbnNJZCwgJ2FkbWluJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHBlci1zZXJ2ZXIgY3JlZGVudGlhbHMgcGF5bG9hZCBmb3IgYmFja2VuZCBzeW5jXG4gICAgY29uc3Qgc2VydmVycyA9IHt9O1xuICAgIGxldCBoYXNBbnlDcmVkcyA9IGZhbHNlO1xuXG4gICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7fTtcbiAgICAgIGNvbnN0IHJvVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IHJvUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlLnRyaW0oKTtcblxuICAgICAgaWYgKHJvVXNlciAmJiByb1Bhc3MpIHtcbiAgICAgICAgZW50cnkucmVhZG9ubHkgPSB7IHVzZXJuYW1lOiByb1VzZXIsIHBhc3N3b3JkOiByb1Bhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFkbWluVXNlciAmJiBhZG1pblBhc3MpIHtcbiAgICAgICAgZW50cnkuYWRtaW4gPSB7IHVzZXJuYW1lOiBhZG1pblVzZXIsIHBhc3N3b3JkOiBhZG1pblBhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5rZXlzKGVudHJ5KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlcnZlcnNbZG5zSWRdID0gZW50cnk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaGFzQW55Q3JlZHMpIHtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1ZlcmlmeWluZy4uLic7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmVycyB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cykge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApO1xuICAgICAgICAgICAgaWYgKCFzZXJ2ZXJzW2Ruc0lkXSkgeyBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyByZXR1cm47IH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRhdGEucmVzdWx0c1tkbnNJZF07XG4gICAgICAgICAgICBpZiAocmVzdWx0Py5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgVmVyaWZpZWQgJiBzYXZlZCc7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdD8ucGFydGlhbCkge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzEzICcgKyByZXN1bHQucGFydGlhbDtcbiAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1xcdTI3MTcgJyArIChyZXN1bHQ/LmVycm9yIHx8ICdMb2dpbiBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFNhdmVkJztcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzE3ICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkJyk7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIGVycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3luYyBETlMgY3JlZGVudGlhbHMgdG8gYmFja2VuZDonLCBlKTtcbiAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgU2F2ZWQgbG9jYWxseSAoc3luYyBmYWlsZWQpJztcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jbG9zZSBhZnRlciBkZWxheSBpZiBhbGwgc3VjY2VlZGVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBhbGxHb29kID0gZG5zSWRzLmV2ZXJ5KGRuc0lkID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApPy50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuICFzdGF0dXMgfHwgc3RhdHVzLmluY2x1ZGVzKCdcXHUyNzEzJyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxHb29kKSBjbG9zZU1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gICAgfSwgMTUwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2xvc2VNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tY2xlYXItYWxsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maXJtKCdDbGVhciBhbGwgc3RvcmVkIEROUyBjcmVkZW50aWFscz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSB7XG4gICAgICBjbGVhckFsbENyZWRlbnRpYWxzKCk7XG4gICAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgQ2xlYXJlZCc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvY3JlZGVudGlhbHMnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFdpbmRvdyBleHBvcnRzIFx1MjUwMFx1MjUwMFxuICB3aW5kb3cuZ2V0VG9rZW4gPSBnZXRUb2tlbjtcbiAgd2luZG93LmdldFVzZXJuYW1lID0gZ2V0VXNlcm5hbWU7XG4gIHdpbmRvdy5zZXRUb2tlbiA9IHNldFRva2VuO1xuICB3aW5kb3cuc2V0VXNlcm5hbWUgPSBzZXRVc2VybmFtZTtcbiAgd2luZG93LmdldEFsbENyZWRlbnRpYWxzID0gZ2V0QWxsQ3JlZGVudGlhbHM7XG4gIHdpbmRvdy5nZXRDcmVkZW50aWFsID0gZ2V0Q3JlZGVudGlhbDtcbiAgd2luZG93LnNldENyZWRlbnRpYWwgPSBzZXRDcmVkZW50aWFsO1xuICB3aW5kb3cuZ2V0RW5jcnlwdGlvbktleSA9IGdldEVuY3J5cHRpb25LZXk7XG4gIHdpbmRvdy5nZXREbnNJZHMgPSBnZXREbnNJZHM7XG4gIHdpbmRvdy5nZXREbnNEaXNwbGF5TmFtZSA9IGdldERuc0Rpc3BsYXlOYW1lO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBHUklEICYgU1RBVFVTIEhFTFBFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvKiBFbmhhbmNlZCBzdGF0dXMgaGVscGVycyB3aXRoIHJlc3BvbnNlIHRpbWUgdHJhY2tpbmcgKi9cbiAgZnVuY3Rpb24gc2V0UXVpY2soaWQsIHVwLCByZXNwb25zZVRpbWUgPSBudWxsKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLWRvdCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctcGlsbCcpO1xuICAgIGNvbnN0IHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy10aW1lJyk7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7aWR9XCJdYCk7XG5cbiAgICBpZiAoZG90KSB7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnb2snLCB1cCk7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnYmFkJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAocGlsbCkge1xuICAgICAgcGlsbC50ZXh0Q29udGVudCA9IHVwID8gJ09OJyA6ICdPRkYnO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHVwKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb2ZmJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAodGltZUVsICYmIHJlc3BvbnNlVGltZSAhPT0gbnVsbCkge1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gdXAgPyBgJHtyZXNwb25zZVRpbWV9bXNgIDogJ3RpbWVvdXQnO1xuICAgICAgdGltZUVsLmNsYXNzTmFtZSA9IGByZXNwb25zZS10aW1lICR7Z2V0UmVzcG9uc2VUaW1lQ2xhc3MocmVzcG9uc2VUaW1lLCB1cCl9YDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2FyZCBzdGF0dXMgZm9yIGljb24gY29sb3JpbmdcbiAgICBpZiAoY2FyZCkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgdXAgPyAnb24nIDogJ29mZicpO1xuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVzcG9uc2VUaW1lQ2xhc3ModGltZSwgaXNVcCkge1xuICAgIGlmICghaXNVcCkgcmV0dXJuICd0aW1lb3V0JztcbiAgICBpZiAodGltZSA8IDIwMCkgcmV0dXJuICdleGNlbGxlbnQnO1xuICAgIGlmICh0aW1lIDwgNTAwKSByZXR1cm4gJ2dvb2QnO1xuICAgIGlmICh0aW1lIDwgMTAwMCkgcmV0dXJuICdmYWlyJztcbiAgICByZXR1cm4gJ3Nsb3cnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyhpZCkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9wcm9iZS8nICsgaWQsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBjb25zdCBlbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xuICAgICAgY29uc3QgaXNVcCA9IChyLnN0YXR1cyA+PSAyMDAgJiYgci5zdGF0dXMgPCA0MDApIHx8IHIuc3RhdHVzID09PSA0MDEgfHwgci5zdGF0dXMgPT09IDQwMztcbiAgICAgIHJldHVybiB7IGlzVXAsIHJlc3BvbnNlVGltZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc3QgZW5kVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgY29uc3QgcmVzcG9uc2VUaW1lID0gTWF0aC5yb3VuZChlbmRUaW1lIC0gc3RhcnRUaW1lKTtcbiAgICAgIHJldHVybiB7IGlzVXA6IGZhbHNlLCByZXNwb25zZVRpbWUgfTtcbiAgICB9XG4gIH1cblxuICAvKiBBcHAgZ3JpZCAtIGxvYWRlZCBmcm9tIEFQSSAqL1xuICB3aW5kb3cuQVBQUyA9IFtdOyAvLyBVc2Ugd2luZG93LkFQUFMgYXMgdGhlIG1haW4gYXJyYXlcbiAgbGV0IHJlZnJlc2hJbkZsaWdodCA9IG51bGw7XG4gIGxldCByZWZyZXNoUXVldWVkID0gZmFsc2U7XG5cbiAgLy8gTG9hZCBzZXJ2aWNlcyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkU2VydmljZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5zaG93KDYpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAvLyBTdGFuZGFyZCBlbnZlbG9wZTogeyBzdWNjZXNzOiB0cnVlLCBzZXJ2aWNlczogWy4uLl0sIHBhZ2luYXRpb24/OiB7Li4ufSB9XG4gICAgICAgIHdpbmRvdy5BUFBTID0gcmVzdWx0LnNlcnZpY2VzIHx8IFtdO1xuICAgICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmljZXM6JywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmljZXM6JywgZXJyb3IpO1xuICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXJ2aWNlVXJsKGlkKSB7XG4gICAgY29uc3Qgc3ZjID0gd2luZG93LkFQUFM/LmZpbmQoYSA9PiBhLmlkID09PSBpZCk7XG4gICAgaWYgKHN2Yz8udXJsKSByZXR1cm4gc3ZjLnVybC5zdGFydHNXaXRoKCdodHRwJykgPyBzdmMudXJsIDogJ2h0dHBzOi8vJyArIHN2Yy51cmw7XG4gICAgaWYgKHN2Yz8uaXNFeHRlcm5hbCAmJiBzdmMuZXh0ZXJuYWxVcmwpIHJldHVybiBzdmMuZXh0ZXJuYWxVcmw7XG4gICAgY29uc3QgZG5zID0gU0lURS5kbnNTZXJ2ZXJzPy5baWRdO1xuICAgIGlmIChkbnMpIHJldHVybiAnaHR0cDovLycgKyBkbnMuaXAgKyAnOicgKyAoZG5zLnBvcnQgfHwgNTM4MCk7XG4gICAgcmV0dXJuIGJ1aWxkU2VydmljZVVybChpZCk7XG4gIH1cbiAgZnVuY3Rpb24gZWwodGFnLCBjbHMsIHR4dCkgeyBjb25zdCBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOyBpZiAoY2xzKSBuLmNsYXNzTmFtZSA9IGNsczsgaWYgKHR4dCkgbi50ZXh0Q29udGVudCA9IHR4dDsgcmV0dXJuIG47IH1cblxuICBmdW5jdGlvbiBidWlsZEdyaWQoKSB7XG4gICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkcycpOyByb290LmlubmVySFRNTCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2luZG93LkFQUFMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHMgPSB3aW5kb3cuQVBQU1tpXTtcbiAgICAgIGlmIChzLmlkID09PSAnY2EnKSBjb250aW51ZTsgLy8gRGFzaENBIGxpdmVzIGluIHRvcCBhbmNob3Igcm93XG4gICAgICBjb25zdCBjYXJkID0gZWwoJ2RpdicsICdjYXJkJyk7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHAnLCBzLmlkKTtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsICdvZmYnKTsgLy8gSW5pdGlhbCBzdGF0dXNcbiAgICAgIGlmIChzLmNvbnRhaW5lcklkKSBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1jb250YWluZXItaWQnLCBzLmNvbnRhaW5lcklkKTtcbiAgICAgIGlmIChzLmNhdGVnb3J5KSBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1jYXRlZ29yeScsIHMuY2F0ZWdvcnkpO1xuICAgICAgaWYgKHMucmVjaXBlSWQpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXJlY2lwZS1pZCcsIHMucmVjaXBlSWQpO1xuXG4gICAgICBjb25zdCBkb3QgPSBlbCgnc3BhbicsICdkb3QgYmFkIGF0LWJsJyk7IGRvdC5pZCA9ICdkb3QtJyArIHMuaWQgKyAnLWdyaWQnOyBjYXJkLmFwcGVuZENoaWxkKGRvdCk7XG5cbiAgICAgIGNvbnN0IHJvdyA9IGVsKCdkaXYnLCAncm93Jyk7XG4gICAgICBjb25zdCB3cmFwID0gZWwoJ2RpdicsICdsb2dvLXdyYXAnKTtcblxuICAgICAgLy8gVXNlIHJlbGlhYmxlIFBORyBpbWFnZXMgd2l0aCBhdXRvbWF0aWMgQ0ROIGZhbGxiYWNrXG4gICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5zcmMgPSBzLmxvZ287XG4gICAgICBpbWcuYWx0ID0gcy5uYW1lO1xuICAgICAgaW1nLmNsYXNzTmFtZSA9ICdsb2dvLWltZyc7XG4gICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBUcnkgQ0ROIGZhbGxiYWNrIHdpdGggbXVsdGlwbGUgbmFtaW5nIHN0cmF0ZWdpZXNcbiAgICAgICAgLy8gVXNlIGlkLCBhcHBUZW1wbGF0ZSwgb3IgZGVyaXZlIGZyb20gbmFtZVxuICAgICAgICBsZXQgYXBwSWQgPSBzLmlkIHx8IHMuYXBwVGVtcGxhdGU7XG4gICAgICAgIGlmICghYXBwSWQgJiYgcy5uYW1lKSB7XG4gICAgICAgICAgLy8gRGVyaXZlIElEIGZyb20gbmFtZSAobG93ZXJjYXNlLCByZW1vdmUgc3BhY2VzKVxuICAgICAgICAgIGFwcElkID0gcy5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwcElkKSB7XG4gICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBDRE4gVVJMIGZvcm1hdHNcbiAgICAgICAgICBjb25zdCBjZG5VcmxzID0gW1xuICAgICAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC93YWxreGNvZGUvZGFzaGJvYXJkLWljb25zL3BuZy8ke2FwcElkfS5wbmdgLFxuICAgICAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC93YWxreGNvZGUvZGFzaGJvYXJkLWljb25zL3BuZy8ke2FwcElkLnRvTG93ZXJDYXNlKCl9LnBuZ2AsXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWQucmVwbGFjZSgvLS9nLCAnJyl9LnBuZ2AsXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7cy5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpfS5wbmdgXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGVzXG4gICAgICAgICAgY29uc3QgdW5pcXVlVXJscyA9IFsuLi5uZXcgU2V0KGNkblVybHMpXTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgVVJMIHRvIHRyeVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHVuaXF1ZVVybHMuaW5kZXhPZih0aGlzLnNyYyk7XG4gICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcblxuICAgICAgICAgIGlmIChuZXh0SW5kZXggPCB1bmlxdWVVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zcmMgPSB1bmlxdWVVcmxzW25leHRJbmRleF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB3cmFwLmFwcGVuZENoaWxkKGltZyk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQod3JhcCk7XG5cbiAgICAgIGNvbnN0IG5hbWVTcGFuID0gZWwoJ3NwYW4nLCAnbmFtZScsIHMubmFtZSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQobmFtZVNwYW4pO1xuXG4gICAgICAvLyBBZGQgVGFpbHNjYWxlIGJhZGdlIGlmIHNlcnZpY2UgaXMgcHJvdGVjdGVkXG4gICAgICBpZiAocy50YWlsc2NhbGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IHRzQmFkZ2UgPSBlbCgnc3BhbicsICd0cy1iYWRnZScsICdcdUQ4M0RcdUREMTAnKTtcbiAgICAgICAgdHNCYWRnZS50aXRsZSA9ICdUYWlsc2NhbGUtb25seSBhY2Nlc3MnO1xuICAgICAgICB0c0JhZGdlLnN0eWxlLmNzc1RleHQgPSAnbWFyZ2luLWxlZnQ6IDZweDsgZm9udC1zaXplOiAwLjc1cmVtOyBvcGFjaXR5OiAwLjg7JztcbiAgICAgICAgbmFtZVNwYW4uYXBwZW5kQ2hpbGQodHNCYWRnZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBDYXRlZ29yeSBiYWRnZSBpZiBzZXJ2aWNlIGhhcyBvbmUgKGNvbG9yZWQgcGlsbCB3aXRoIGljb24pXG4gICAgICBpZiAocy5jYXRlZ29yeSkge1xuICAgICAgICBjb25zdCBjYXRzID0gKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUykgfHwgd2luZG93LkRDX0NBVEVHT1JJRVMgfHwge307XG4gICAgICAgIGNvbnN0IGNhdEluZm8gPSBjYXRzW3MuY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgICBjb25zdCBjYXRCYWRnZSA9IGVsKCdzcGFuJywgJ2NhdC1iYWRnZScsIGAke2NhdEluZm8uaWNvbiB8fCAnJ30gJHtzLmNhdGVnb3J5fWAudHJpbSgpKTtcbiAgICAgICAgY2F0QmFkZ2UudGl0bGUgPSBgQ2F0ZWdvcnk6ICR7cy5jYXRlZ29yeX1gO1xuICAgICAgICBjYXRCYWRnZS5zdHlsZS5jc3NUZXh0ID0gYG1hcmdpbi1sZWZ0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMXB4IDZweDsgYm9yZGVyLXJhZGl1czogOTk5cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAke2NhdEluZm8uY29sb3IgfHwgJyM3ZjhjOGQnfSAyNSUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICR7Y2F0SW5mby5jb2xvciB8fCAnIzdmOGM4ZCd9OyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgJHtjYXRJbmZvLmNvbG9yIHx8ICcjN2Y4YzhkJ30gNTAlLCB0cmFuc3BhcmVudCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGZvbnQtd2VpZ2h0OiA1MDA7YDtcbiAgICAgICAgbmFtZVNwYW4uYXBwZW5kQ2hpbGQoY2F0QmFkZ2UpO1xuICAgICAgfVxuXG4gICAgICByb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnc3BhY2VyJykpO1xuXG4gICAgICBjb25zdCBwaWxsID0gZWwoJ3NwYW4nLCAnYmFkZ2Ugb2ZmJywgJ09GRicpOyBwaWxsLmlkID0gJ2JhZGdlLScgKyBzLmlkOyByb3cuYXBwZW5kQ2hpbGQocGlsbCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdmFpbGFibGUgYmFkZ2UgKGhpZGRlbiBieSBkZWZhdWx0LCBzaG93biB3aGVuIHVwZGF0ZSBkZXRlY3RlZClcbiAgICAgIGNvbnN0IHVwZGF0ZUJhZGdlID0gZWwoJ3NwYW4nLCAndXBkYXRlLWF2YWlsYWJsZS1iYWRnZScsICdVUERBVEUnKTtcbiAgICAgIHVwZGF0ZUJhZGdlLmlkID0gJ3VwZGF0ZS1iYWRnZS0nICsgcy5pZDtcbiAgICAgIHVwZGF0ZUJhZGdlLnRpdGxlID0gJ1VwZGF0ZSBhdmFpbGFibGUnO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHVwZGF0ZUJhZGdlKTtcblxuICAgICAgY2FyZC5hcHBlbmRDaGlsZChyb3cpO1xuXG4gICAgICAvLyBBZGQgcmVzcG9uc2UgdGltZSByb3dcbiAgICAgIGNvbnN0IHJlc3BvbnNlUm93ID0gZWwoJ2RpdicsICdyZXNwb25zZS1yb3cnKTtcbiAgICAgIGNvbnN0IHRpbWVTcGFuID0gZWwoJ3NwYW4nLCAncmVzcG9uc2UtdGltZScsICctLScpOyB0aW1lU3Bhbi5pZCA9ICd0aW1lLScgKyBzLmlkO1xuICAgICAgcmVzcG9uc2VSb3cuYXBwZW5kQ2hpbGQodGltZVNwYW4pO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChyZXNwb25zZVJvdyk7XG5cbiAgICAgIC8vIEFkZCBoZWFsdGgvdXB0aW1lIHJvd1xuICAgICAgY29uc3QgaGVhbHRoUm93ID0gZWwoJ2RpdicsICdoZWFsdGgtcm93Jyk7XG4gICAgICBoZWFsdGhSb3cuaWQgPSAnaGVhbHRoLScgKyBzLmlkO1xuICAgICAgY29uc3QgdXB0aW1lQ2hpcCA9IGVsKCdzcGFuJywgJ3VwdGltZS1jaGlwJywgJy0tJyk7XG4gICAgICB1cHRpbWVDaGlwLmlkID0gJ3VwdGltZS0nICsgcy5pZDtcbiAgICAgIGhlYWx0aFJvdy5hcHBlbmRDaGlsZCh1cHRpbWVDaGlwKTtcbiAgICAgIGNvbnN0IHVwdGltZU1pbmlCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHVwdGltZU1pbmlCYXIuY2xhc3NOYW1lID0gJ3VwdGltZS1taW5pLWJhcic7XG4gICAgICBjb25zdCB1cHRpbWVGaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB1cHRpbWVGaWxsLmNsYXNzTmFtZSA9ICdmaWxsJztcbiAgICAgIHVwdGltZUZpbGwuaWQgPSAndXB0aW1lLWJhci0nICsgcy5pZDtcbiAgICAgIHVwdGltZUZpbGwuc3R5bGUud2lkdGggPSAnMCUnO1xuICAgICAgdXB0aW1lTWluaUJhci5hcHBlbmRDaGlsZCh1cHRpbWVGaWxsKTtcbiAgICAgIGhlYWx0aFJvdy5hcHBlbmRDaGlsZCh1cHRpbWVNaW5pQmFyKTtcbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoaGVhbHRoUm93KTtcblxuICAgICAgY29uc3QgYnRuUm93ID0gZWwoJ2RpdicsICdidG4tcm93Jyk7XG5cbiAgICAgIC8vIEFkZCBsb2dzIGJ1dHRvbiBmb3Igc2VydmljZXMgd2l0aCBjb250YWluZXJJZHNcbiAgICAgIGlmIChzLmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGNvbnN0IGxvZ3NCdG4gPSBlbCgnYnV0dG9uJywgJ2xvZ3MtYnRuJywgJ1x1RDgzRFx1RENDQicpO1xuICAgICAgICBsb2dzQnRuLnRpdGxlID0gJ1ZpZXcgY29udGFpbmVyIGxvZ3MnO1xuICAgICAgICBsb2dzQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5Db250YWluZXJMb2dzTW9kYWwocy5jb250YWluZXJJZCwgcy5uYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGxvZ3NCdG4pO1xuXG4gICAgICAgIC8vIEFkZCB1cGRhdGUgYnV0dG9uIGZvciBEb2NrZXIgY29udGFpbmVyc1xuICAgICAgICBjb25zdCB1cGRhdGVCdG4gPSBlbCgnYnV0dG9uJywgJ3VwZGF0ZS1idG4nLCAnXHUyQjA2XHVGRTBGJyk7XG4gICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGUgY29udGFpbmVyIHRvIGxhdGVzdCB2ZXJzaW9uJztcbiAgICAgICAgdXBkYXRlQnRuLmlkID0gYHVwZGF0ZS1idG4tJHtzLmlkfWA7XG4gICAgICAgIHVwZGF0ZUJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy51cGRhdGVDb250YWluZXIocy5jb250YWluZXJJZCwgcy5uYW1lLCBzLmlkKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKHVwZGF0ZUJ0bik7XG5cbiAgICAgICAgLy8gVGVybWluYWwgZXhlYyBidXR0b24gKHN1YnRsZSBcdTIwMTQgdmlzaWJsZSBvbiBob3ZlcilcbiAgICAgICAgY29uc3QgZXhlY0J0biA9IGVsKCdidXR0b24nLCAnZXhlYy1idG4nLCAnPl8nKTtcbiAgICAgICAgZXhlY0J0bi50aXRsZSA9ICdPcGVuIHRlcm1pbmFsJztcbiAgICAgICAgZXhlY0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh3aW5kb3cub3BlbkV4ZWNNb2RhbCkgd2luZG93Lm9wZW5FeGVjTW9kYWwocy5jb250YWluZXJJZCwgcy5uYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGV4ZWNCdG4pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgbG9ncyBidXR0b24gZm9yIHNlcnZpY2VzIHdpdGggbG9nUGF0aCAobmF0aXZlIGFwcHMpXG4gICAgICBpZiAocy5sb2dQYXRoICYmICFzLmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGNvbnN0IGxvZ3NCdG4gPSBlbCgnYnV0dG9uJywgJ2xvZ3MtYnRuJywgJ1x1RDgzRFx1RENDQicpO1xuICAgICAgICBsb2dzQnRuLnRpdGxlID0gJ1ZpZXcgYXBwbGljYXRpb24gbG9ncyc7XG4gICAgICAgIGxvZ3NCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlbkZpbGVMb2dzTW9kYWwocy5sb2dQYXRoLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQobG9nc0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjcmVkZW50aWFscyBidXR0b24gZm9yIHNlcnZpY2VzIHRoYXQgc3VwcG9ydCBhdXRvLWxvZ2luXG4gICAgICBpZiAocy5pc0V4dGVybmFsIHx8IHMuYXBwVGVtcGxhdGUgfHwgcy51cmwpIHtcbiAgICAgICAgY29uc3QgY3JlZHNCdG4gPSBlbCgnYnV0dG9uJywgJ2NyZWRzLWJ0bicsICdcdUQ4M0RcdUREMTEnKTtcbiAgICAgICAgY3JlZHNCdG4udGl0bGUgPSAnQXV0by1sb2dpbiBjcmVkZW50aWFscyc7XG4gICAgICAgIGNyZWRzQnRuLmlkID0gYGNyZWRzLWJ0bi0ke3MuaWR9YDtcbiAgICAgICAgY3JlZHNCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsKHMpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoY3JlZHNCdG4pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgb3B0aW9ucyBidXR0b24gZm9yIGFsbCBzZXJ2aWNlcyBleGNlcHQgJ2ludGVybmV0J1xuICAgICAgaWYgKHMuaWQgIT09ICdpbnRlcm5ldCcpIHtcbiAgICAgICAgY29uc3Qgb3B0QnRuID0gZWwoJ2J1dHRvbicsICdvcHRpb25zLWJ0bicsICdcdTI2OTlcdUZFMEYnKTtcbiAgICAgICAgb3B0QnRuLnRpdGxlID0gJ0VkaXQgc2VydmljZSBzZXR0aW5ncyc7XG4gICAgICAgIG9wdEJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbChzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKG9wdEJ0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBzaGFyZSBidXR0b24gZm9yIGFsbCBzZXJ2aWNlcyBleGNlcHQgJ2ludGVybmV0JyAoREMtMDU4KS5cbiAgICAgIC8vIENhbGxzIGludG8gdGhlIHNoYXJlLW1vZGFsIG1vZHVsZSByZWdpc3RlcmVkIG9uIHdpbmRvdy4gV2UgZG9uJ3RcbiAgICAgIC8vIGhhcmQtcmVxdWlyZSB0aGUgbW9kdWxlIFx1MjAxNCBpZiBzaGFyZS1tb2RhbC5qcyB3YXMgZXhjbHVkZWQgZnJvbSB0aGVcbiAgICAgIC8vIGJ1bmRsZSwgdGhlIGJ1dHRvbiBzdGlsbCByZW5kZXJzIGJ1dCBjbGlja2luZyBpdCBzdXJmYWNlcyBhIGNsZWFyXG4gICAgICAvLyBlcnJvciB0b2FzdCBpbnN0ZWFkIG9mIGEgc2lsZW50IG5vLW9wLlxuICAgICAgaWYgKHMuaWQgIT09ICdpbnRlcm5ldCcpIHtcbiAgICAgICAgY29uc3Qgc2hhcmVCdG4gPSBlbCgnYnV0dG9uJywgJ3NoYXJlLWJ0bicsICdcdUQ4M0RcdUREMTcnKTtcbiAgICAgICAgc2hhcmVCdG4udGl0bGUgPSAnU2hhcmUgdGhpcyBzZXJ2aWNlIChQcm8pJztcbiAgICAgICAgc2hhcmVCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5vcGVuU2hhcmVNb2RhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgd2luZG93Lm9wZW5TaGFyZU1vZGFsKHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdy5zaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2hvd05vdGlmaWNhdGlvbignU2hhcmUgbW9kYWwgbm90IGxvYWRlZC4gUmVmcmVzaCB0aGUgcGFnZS4nLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChzaGFyZUJ0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBkZWxldGUgYnV0dG9uIGZvciBhbGwgc2VydmljZXMgZXhjZXB0IEludGVybmV0XG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBkZWxCdG4gPSBlbCgnYnV0dG9uJywgJ2RlbGV0ZS1idG4nLCAnXHVEODNEXHVEREQxXHVGRTBGJyk7XG4gICAgICAgIGRlbEJ0bi50aXRsZSA9ICdEZWxldGUgdGhpcyBzZXJ2aWNlJztcbiAgICAgICAgZGVsQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93LmRlbGV0ZVNlcnZpY2Uocy5pZCwgcy5uYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGRlbEJ0bik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ0biA9IGVsKCdidXR0b24nLCBudWxsLCAnT3BlbicpO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB3aW5kb3cub3BlbihzZXJ2aWNlVXJsKHMuaWQpLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG4gICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoYnRuUm93KTtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaSAqIDQ1LCAyNzApfW1zYDtcblxuICAgICAgcm9vdC5hcHBlbmRDaGlsZChjYXJkKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZCcpLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcblxuICAgIC8vIEdyb3VwIHJlY2lwZSBjYXJkcyB2aXN1YWxseSBhZnRlciBncmlkIGlzIGJ1aWx0XG4gICAgaWYgKHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gd2luZG93Lmdyb3VwUmVjaXBlQ2FyZHMoKSk7XG5cbiAgICAvLyBSZWZyZXNoIHRoZSBzZXJ2aWNlIGZpbHRlciBzbyB0aGUgY2F0ZWdvcnkgZHJvcGRvd24gcmVmbGVjdHMgbmV3IHNlcnZpY2VzXG4gICAgaWYgKHdpbmRvdy5yZWZyZXNoU2VydmljZUZpbHRlcikgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRCYWRnZShpZCwgdXAsIHJlc3BvbnNlVGltZSA9IG51bGwpIHtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG90LScgKyBpZCArICctZ3JpZCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFkZ2UtJyArIGlkKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZS0nICsgaWQpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke2lkfVwiXWApO1xuXG4gICAgaWYgKGRvdCkge1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ29rJywgdXApO1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ2JhZCcsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHBpbGwpIHtcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSB1cCA/ICdPTicgOiAnT0ZGJztcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29mZicsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVFbCAmJiByZXNwb25zZVRpbWUgIT09IG51bGwpIHtcbiAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9IHVwID8gYCR7cmVzcG9uc2VUaW1lfW1zYCA6ICd0aW1lb3V0JztcbiAgICAgIHRpbWVFbC5jbGFzc05hbWUgPSBgcmVzcG9uc2UtdGltZSAke2dldFJlc3BvbnNlVGltZUNsYXNzKHJlc3BvbnNlVGltZSwgdXApfWA7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNhcmQgc3RhdHVzIGZvciBpY29uIGNvbG9yaW5nXG4gICAgaWYgKGNhcmQpIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsIHVwID8gJ29uJyA6ICdvZmYnKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQWxsKCkge1xuICAgIGlmIChyZWZyZXNoSW5GbGlnaHQpIHtcbiAgICAgIHJlZnJlc2hRdWV1ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlZnJlc2hJbkZsaWdodDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVTdGFtcChsYWJlbCwgY2hlY2tlZEF0ID0gbmV3IERhdGUoKSkge1xuICAgICAgY29uc3Qgc3RhbXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhbXAnKTtcbiAgICAgIGlmIChzdGFtcCkgc3RhbXAudGV4dENvbnRlbnQgPSBgJHtsYWJlbH06ICR7bmV3IERhdGUoY2hlY2tlZEF0KS50b0xvY2FsZVRpbWVTdHJpbmcoKX1gO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmF0Y2hSZXN1bHRzKHN0YXR1c2VzKSB7XG4gICAgICBjb25zdCBkbnNJZHMgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpO1xuICAgICAgZG5zSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXR1c2VzW2lkXTtcbiAgICAgICAgaWYgKHJlc3VsdCkgc2V0UXVpY2soaWQsIHJlc3VsdC5pc1VwLCByZXN1bHQucmVzcG9uc2VUaW1lKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc3RhdHVzZXMuaW50ZXJuZXQpIHtcbiAgICAgICAgc2V0UXVpY2soJ2ludGVybmV0Jywgc3RhdHVzZXMuaW50ZXJuZXQuaXNVcCwgc3RhdHVzZXMuaW50ZXJuZXQucmVzcG9uc2VUaW1lKTtcbiAgICAgIH1cblxuICAgICAgd2luZG93LkFQUFMuZm9yRWFjaCgoc2VydmljZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdGF0dXNlc1tzZXJ2aWNlLmlkXTtcbiAgICAgICAgaWYgKHJlc3VsdCkgc2V0QmFkZ2Uoc2VydmljZS5pZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEZhbGxiYWNrKCkge1xuICAgICAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgICAgIGNvbnN0IHRvcENoZWNrcyA9IGRuc0lkcy5tYXAoaWQgPT4gY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyhpZCkpO1xuICAgICAgdG9wQ2hlY2tzLnB1c2goY2hlY2tTZXJ2aWNlV2l0aFRpbWluZygnaW50ZXJuZXQnKSk7XG4gICAgICBjb25zdCB0b3BSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodG9wQ2hlY2tzKTtcblxuICAgICAgZG5zSWRzLmZvckVhY2goKGlkLCBpKSA9PiBzZXRRdWljayhpZCwgdG9wUmVzdWx0c1tpXS5pc1VwLCB0b3BSZXN1bHRzW2ldLnJlc3BvbnNlVGltZSkpO1xuICAgICAgY29uc3QgaW50ZXJuZXRSZXN1bHQgPSB0b3BSZXN1bHRzW3RvcFJlc3VsdHMubGVuZ3RoIC0gMV07XG4gICAgICBzZXRRdWljaygnaW50ZXJuZXQnLCBpbnRlcm5ldFJlc3VsdC5pc1VwLCBpbnRlcm5ldFJlc3VsdC5yZXNwb25zZVRpbWUpO1xuXG4gICAgICBjb25zdCBhcHBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdpbmRvdy5BUFBTLm1hcChhc3luYyBzID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja1NlcnZpY2VXaXRoVGltaW5nKHMuaWQpO1xuICAgICAgICAgIHJldHVybiB7IGlkOiBzLmlkLCAuLi5yZXN1bHQgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGFwcFJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICBzZXRCYWRnZShyZXN1bHQuaWQsIHJlc3VsdC5pc1VwLCByZXN1bHQucmVzcG9uc2VUaW1lKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZnJlc2hJbkZsaWdodCA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzL3N0YXR1cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgIC8vIEF1dGggbG9zdCBcdTIwMTQgc3RvcCB0aGUgcG9sbGluZyBsb29wIGZyb20gaGFtbWVyaW5nIGV2ZXJ5IGZldyBzZWNvbmRzXG4gICAgICAgICAgd2luZG93Ll9kY0F1dGhMb3N0ID0gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzIHJlZnJlc2ggZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93Ll9kY0F1dGhMb3N0ID0gZmFsc2U7IC8vIGF1dGggd29ya2luZyBhZ2FpblxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBhcHBseUJhdGNoUmVzdWx0cyhkYXRhLnN0YXR1c2VzIHx8IHt9KTtcbiAgICAgICAgdXBkYXRlU3RhbXAoJ2xhc3QgY2hlY2snLCBkYXRhLmNoZWNrZWRBdCB8fCBuZXcgRGF0ZSgpKTtcbiAgICAgIH0gY2F0Y2ggKGJhdGNoRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdCYXRjaGVkIHN0YXR1cyByZWZyZXNoIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGRpcmVjdCBwcm9iZXM6JywgYmF0Y2hFcnJvcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEZhbGxiYWNrKCk7XG4gICAgICAgICAgdXBkYXRlU3RhbXAoJ2xhc3QgY2hlY2snKTtcbiAgICAgICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rhc2hib2FyZCByZWZyZXNoIGZhaWxlZDonLCBmYWxsYmFja0Vycm9yKTtcbiAgICAgICAgICB1cGRhdGVTdGFtcCgnbGFzdCBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVmcmVzaEluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgaWYgKHJlZnJlc2hRdWV1ZWQpIHtcbiAgICAgICAgICByZWZyZXNoUXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHdpbmRvdy5yZWZyZXNoQWxsKCk7IH0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIHJldHVybiByZWZyZXNoSW5GbGlnaHQ7XG4gIH1cblxuICAvLyBETlMgb3BlbiBidXR0b25zIFx1MjAxNCB1c2UgZXZlbnQgZGVsZWdhdGlvbiBvbiAudG9wIGNvbnRhaW5lclxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCBvcGVuQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1vcGVuXCJdJyk7XG4gICAgaWYgKCFvcGVuQnRuKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSBvcGVuQnRuLmlkLnJlcGxhY2UoJy1vcGVuJywgJycpO1xuICAgIGlmIChTSVRFLmRuc1NlcnZlcnNbaWRdKSB3aW5kb3cub3BlbihzZXJ2aWNlVXJsKGlkKSwgJ19ibGFuaycsICdub29wZW5lcicpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW9wZW4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cub3BlbihzZXJ2aWNlVXJsKCdjYScpLCAnX2JsYW5rJywgJ25vb3BlbmVyJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlZHMtYnRuLWNhJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgcyA9IHdpbmRvdy5BUFBTLmZpbmQoYSA9PiBhLmlkID09PSAnY2EnKTsgaWYgKHMgJiYgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbCkgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbChzKTsgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb25zLWJ0bi1jYScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGNvbnN0IHMgPSB3aW5kb3cuQVBQUy5maW5kKGEgPT4gYS5pZCA9PT0gJ2NhJyk7IGlmIChzICYmIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbCkgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsKHMpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1idG4tY2EnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBpZiAod2luZG93LmRlbGV0ZVNlcnZpY2UpIHdpbmRvdy5kZWxldGVTZXJ2aWNlKCdjYScsICdEYXNoQ0EnKTsgfSk7XG5cbiAgLy8gV2luZG93IGV4cG9ydHNcbiAgd2luZG93LmxvYWRTZXJ2aWNlcyA9IGxvYWRTZXJ2aWNlcztcbiAgd2luZG93LmJ1aWxkR3JpZCA9IGJ1aWxkR3JpZDtcbiAgd2luZG93LnJlZnJlc2hBbGwgPSByZWZyZXNoQWxsO1xuICB3aW5kb3cuc2V0UXVpY2sgPSBzZXRRdWljaztcbiAgd2luZG93LnNldEJhZGdlID0gc2V0QmFkZ2U7XG4gIHdpbmRvdy5nZXRSZXNwb25zZVRpbWVDbGFzcyA9IGdldFJlc3BvbnNlVGltZUNsYXNzO1xuICB3aW5kb3cuY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyA9IGNoZWNrU2VydmljZVdpdGhUaW1pbmc7XG4gIHdpbmRvdy5zZXJ2aWNlVXJsID0gc2VydmljZVVybDtcbiAgd2luZG93LmVsID0gZWw7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEROUyBNQU5BR0VNRU5UID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG4gIC8vIFJlc3RhcnQgRE5TIHNlcnZpY2UgdmlhIGJhY2tlbmQgcHJveHkgKGJhY2tlbmQgaGFuZGxlcyBhdXRoIGF1dG9tYXRpY2FsbHkpXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnREbnNTZXJ2aWNlKGRuc0lkKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9kbnMvcmVzdGFydC8ke2Ruc0lkfWAsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1Jlc3RhcnQgZmFpbGVkJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBFdmVudCBkZWxlZ2F0aW9uIGZvciBETlMgcmVzdGFydCBidXR0b25zIChkeW5hbWljIGNhcmRzKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCByZXN0YXJ0QnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1yZXN0YXJ0XCJdJyk7XG4gICAgaWYgKCFyZXN0YXJ0QnRuKSByZXR1cm47XG4gICAgY29uc3QgZG5zSWQgPSByZXN0YXJ0QnRuLmlkLnJlcGxhY2UoJy1yZXN0YXJ0JywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVzdGFydCAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHNlcnZpY2U/YCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aEJ1dHRvbihyZXN0YXJ0QnRuLCAnLi4uJywgKCkgPT4gcmVzdGFydERuc1NlcnZpY2UoZG5zSWQpKTtcbiAgICAgIHNldFRpbWVvdXQod2luZG93LnJlZnJlc2hBbGwsIERDLkRFTEFZUy5SRUxPQUQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RhcnQgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEROUyBVcGRhdGUgYnV0dG9uc1xuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVEbnNTZXJ2ZXIoZG5zSWQsIHNlcnZlcklwKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXVwZGF0ZWApO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ0bj8udGV4dENvbnRlbnQgfHwgJ1x1MkIwNlx1RkUwRic7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIHVwZGF0ZXNcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQnO1xuICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIGJ0bi50aXRsZSA9ICdDaGVja2luZyBmb3IgdXBkYXRlcy4uLic7XG5cbiAgICAgIGNvbnN0IGNoZWNrUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9kbnMvY2hlY2stdXBkYXRlP3NlcnZlcj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2ZXJJcCl9YCk7XG4gICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IGF3YWl0IGNoZWNrUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoIWNoZWNrUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNoZWNrUmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjaGVja1Jlc3VsdC51cGRhdGVBdmFpbGFibGUpIHtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICAgIGJ0bi50aXRsZSA9IGBBbHJlYWR5IG9uIGxhdGVzdCB2ZXJzaW9uICgke2NoZWNrUmVzdWx0LmN1cnJlbnRWZXJzaW9ufSlgO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSEgQ3VycmVudCB2ZXJzaW9uOiAke2NoZWNrUmVzdWx0LmN1cnJlbnRWZXJzaW9ufWAsICdpbmZvJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICBidG4udGl0bGUgPSAnVXBkYXRlIEROUyBzZXJ2ZXInO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIC0gY29uZmlybSB3aXRoIHVzZXJcbiAgICAgIGNvbnN0IGNvbmZpcm1VcGRhdGUgPSBjb25maXJtKFxuICAgICAgICBgVXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSFcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnQ6ICR7Y2hlY2tSZXN1bHQuY3VycmVudFZlcnNpb259XFxuYCArXG4gICAgICAgIGBOZXc6ICR7Y2hlY2tSZXN1bHQudXBkYXRlVmVyc2lvbn1cXG5cXG5gICtcbiAgICAgICAgKGNoZWNrUmVzdWx0LnVwZGF0ZVRpdGxlID8gYCR7Y2hlY2tSZXN1bHQudXBkYXRlVGl0bGV9XFxuXFxuYCA6ICcnKSArXG4gICAgICAgIGBUaGUgRE5TIHNlcnZlciB3aWxsIHJlc3RhcnQgZHVyaW5nIHRoZSB1cGRhdGUuXFxuUHJvY2VlZD9gXG4gICAgICApO1xuXG4gICAgICBpZiAoIWNvbmZpcm1VcGRhdGUpIHtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQZXJmb3JtIHRoZSB1cGRhdGVcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMDQnO1xuICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0aW5nLi4uJztcblxuICAgICAgY29uc3QgdXBkYXRlUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9kbnMvdXBkYXRlP3NlcnZlcj0ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2ZXJJcCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgfSk7XG4gICAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSBhd2FpdCB1cGRhdGVSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghdXBkYXRlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVwZGF0ZVJlc3VsdC5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0Lm1hbnVhbFVwZGF0ZVJlcXVpcmVkKSB7XG4gICAgICAgIC8vIFRlY2huaXRpdW0gdjE0KyBkb2Vzbid0IHN1cHBvcnQgYXV0by1pbnN0YWxsIHZpYSBBUElcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNlx1RkUwRic7XG4gICAgICAgIGJ0bi50aXRsZSA9IGBVcGRhdGUgYXZhaWxhYmxlOiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufWA7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkSW5mbyA9IHVwZGF0ZVJlc3VsdC5kb3dubG9hZExpbmtcbiAgICAgICAgICA/IGBcXG5Eb3dubG9hZDogJHt1cGRhdGVSZXN1bHQuZG93bmxvYWRMaW5rfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnNJbmZvID0gdXBkYXRlUmVzdWx0Lmluc3RydWN0aW9uc0xpbmtcbiAgICAgICAgICA/IGBcXG5JbnN0cnVjdGlvbnM6ICR7dXBkYXRlUmVzdWx0Lmluc3RydWN0aW9uc0xpbmt9YFxuICAgICAgICAgIDogJyc7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7ZG5zSWQudG9VcHBlckNhc2UoKX0gdXBkYXRlIHJlcXVpcmVzIG1hbnVhbCBpbnN0YWxsYXRpb24uIEN1cnJlbnQ6ICR7dXBkYXRlUmVzdWx0LnByZXZpb3VzVmVyc2lvbn0gXHUyMTkyICR7dXBkYXRlUmVzdWx0Lm5ld1ZlcnNpb259LiBQbGVhc2UgdXBkYXRlIG1hbnVhbGx5IG9uIHRoZSBob3N0IG1hY2hpbmUuYCwgJ3dhcm5pbmcnLCA4MDAwKTtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICBidG4udGl0bGUgPSAnVXBkYXRlZCBzdWNjZXNzZnVsbHkhJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7ZG5zSWQudG9VcHBlckNhc2UoKX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkhICR7dXBkYXRlUmVzdWx0LnByZXZpb3VzVmVyc2lvbn0gXHUyMTkyICR7dXBkYXRlUmVzdWx0Lm5ld1ZlcnNpb259LiBTZXJ2ZXIgaXMgcmVzdGFydGluZy4uLmAsICdzdWNjZXNzJyk7XG5cbiAgICAgIC8vIFJlZnJlc2ggYWZ0ZXIgZGVsYXkgZm9yIHNlcnZlciByZXN0YXJ0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICAgIH0sIDEwMDAwKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdETlMgdXBkYXRlIGVycm9yOicsIGVycm9yKTtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMnO1xuICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBmYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHVwZGF0ZSAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgIH0sIDMwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZW50IGRlbGVnYXRpb24gZm9yIEROUyB1cGRhdGUgYnV0dG9ucyAoZHluYW1pYyBjYXJkcylcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi11cGRhdGVcIl0nKTtcbiAgICBpZiAoIXVwZGF0ZUJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gdXBkYXRlQnRuLmlkLnJlcGxhY2UoJy11cGRhdGUnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgdXBkYXRlRG5zU2VydmVyKGRuc0lkLCBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdPy5pcCk7XG4gIH0pO1xuXG4gIC8vID09PT09IEROUyBTRVRUSU5HUyBNT0RBTCA9PT09PVxuXG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdkbnMtc2V0dGluZ3MtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJkbnMtc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzIGlkPVwiZG5zLXNldHRpbmdzLXRpdGxlXCI+RE5TIFNldHRpbmdzPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTZweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLWVkaXQtaXBcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2VydmVyIElQPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRucy1lZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgcGxhY2Vob2xkZXI9XCIxOTIuMTY4LjEuMVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtZWRpdC1wb3J0XCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlBvcnQ8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkbnMtZWRpdC1wb3J0XCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgcGxhY2Vob2xkZXI9XCI1MzgwXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRucy1lZGl0LW5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+RGlzcGxheSBOYW1lIChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZG5zLWVkaXQtbmFtZVwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiZS5nLiBQcmltYXJ5IEROU1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+TWFuYWdlIGNyZWRlbnRpYWxzIHZpYSBUb2tlbnMgaW4gdGhlIHRvb2xiYXI8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZG5zLXNldHRpbmdzLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZG5zLXNldHRpbmdzLWRlbGV0ZVwiIHN0eWxlPVwiYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNlNzRjM2MgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogI2U3NGMzYzsgY29sb3I6ICNlNzRjM2M7XCI+UmVtb3ZlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkbnMtc2V0dGluZ3Mtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBsZXQgY3VycmVudERuc0lkID0gbnVsbDtcblxuICBmdW5jdGlvbiBvcGVuRG5zU2V0dGluZ3MoZG5zSWQpIHtcbiAgICBjdXJyZW50RG5zSWQgPSBkbnNJZDtcbiAgICBjb25zdCBzZXJ2ZXIgPSBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdIHx8IHt9O1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1tb2RhbCcpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy10aXRsZScpLnRleHRDb250ZW50ID0gYCR7KHNlcnZlci5uYW1lIHx8IGRuc0lkKS50b1VwcGVyQ2FzZSgpfSBTZXR0aW5nc2A7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LWlwJykudmFsdWUgPSBzZXJ2ZXIuaXAgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LXBvcnQnKS52YWx1ZSA9IHNlcnZlci5wb3J0IHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1uYW1lJykudmFsdWUgPSBzZXJ2ZXIubmFtZSB8fCAnJztcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVEbnNTZXR0aW5ncygpIHtcbiAgICBpZiAoIWN1cnJlbnREbnNJZCkgcmV0dXJuO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LWlwJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtcG9ydCcpLnZhbHVlLnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LW5hbWUnKS52YWx1ZS50cmltKCk7XG5cbiAgICBpZiAoIWlwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTZXJ2ZXIgSVAgaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZSA9IHsgZG5zU2VydmVyczoge30gfTtcbiAgICB1cGRhdGUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdID0geyBpcCwgcG9ydDogU3RyaW5nKHBvcnQpIH07XG4gICAgaWYgKG5hbWUpIHVwZGF0ZS5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF0ubmFtZSA9IG5hbWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkodXBkYXRlKVxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgU0lURS5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF0gPSB1cGRhdGUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2N1cnJlbnREbnNJZC50b1VwcGVyQ2FzZSgpfSBzZXR0aW5ncyBzYXZlZGAsICdzdWNjZXNzJyk7XG4gICAgICAgIGNsb3NlRG5zU2V0dGluZ3MoKTtcbiAgICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24ocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZXR0aW5ncycsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHNhdmU6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG5zU2VydmVyKCkge1xuICAgIGlmICghY3VycmVudERuc0lkKSByZXR1cm47XG4gICAgaWYgKCFjb25maXJtKGBSZW1vdmUgJHtjdXJyZW50RG5zSWQudG9VcHBlckNhc2UoKX0gZnJvbSBkYXNoYm9hcmQ/IFRoaXMgd29uJ3QgYWZmZWN0IHRoZSBhY3R1YWwgRE5TIHNlcnZlci5gKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIGJ5IHNldHRpbmcgdG8gbnVsbCBpbiBkbnNTZXJ2ZXJzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGNvbmZpZy5kbnNTZXJ2ZXJzKSB7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2F2ZVJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkbnNTZXJ2ZXJzOiBjb25maWcuZG5zU2VydmVycyB8fCB7fSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYXZlUmVzcC5qc29uKCk7XG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZGVsZXRlIFNJVEUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdO1xuICAgICAgICAvLyBSZW1vdmUgY2FyZCBmcm9tIERPTVxuICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRvcCBbZGF0YS1hcHA9XCIke2N1cnJlbnREbnNJZH1cIl1gKTtcbiAgICAgICAgaWYgKGNhcmQpIGNhcmQucmVtb3ZlKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7Y3VycmVudERuc0lkLnRvVXBwZXJDYXNlKCl9IHJlbW92ZWQgZnJvbSBkYXNoYm9hcmRgLCAnc3VjY2VzcycpO1xuICAgICAgICBjbG9zZURuc1NldHRpbmdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHJlbW92ZScsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHJlbW92ZTogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZURuc1NldHRpbmdzKCkge1xuICAgIGNsb3NlTW9kYWwoJ2Rucy1zZXR0aW5ncy1tb2RhbCcpO1xuICAgIGN1cnJlbnREbnNJZCA9IG51bGw7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnMgZm9yIG1vZGFsIGJ1dHRvbnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZURuc1NldHRpbmdzKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZURuc1NldHRpbmdzKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1kZWxldGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVEbnNTZXJ2ZXIpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdkbnMtc2V0dGluZ3MtbW9kYWwnKSBjbG9zZURuc1NldHRpbmdzKCk7XG4gIH0pO1xuICAvLyBFdmVudCBkZWxlZ2F0aW9uIGZvciBETlMgc2V0dGluZ3MgYnV0dG9ucyAoZHluYW1pYyBjYXJkcylcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3Qgc2V0dGluZ3NCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLXNldHRpbmdzXCJdJyk7XG4gICAgaWYgKCFzZXR0aW5nc0J0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gc2V0dGluZ3NCdG4uaWQucmVwbGFjZSgnLXNldHRpbmdzJywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgb3BlbkRuc1NldHRpbmdzKGRuc0lkKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB3aW5kb3cucmVmcmVzaEFsbCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBMT0cgVklFV0VSUyA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vIEluamVjdCBsb2dzLW1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2xvZ3MtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJsb2dzLW1vZGFsXCIgY2xhc3M9XCJsb2dzLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvZ3MtbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MDBweDsgbWF4LXdpZHRoOiAxMDAwcHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIj5cbiAgICAgICAgPGgzIGlkPVwibG9ncy10aXRsZVwiPkROUyBMb2dzPC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtY29udHJvbHNcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nLWxpbmVzXCI+U2hvdzo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJsb2ctbGluZXNcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyNVwiIHNlbGVjdGVkPjI1PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTBcIj41MDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiPjEwMDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwMFwiPjIwMDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJsb2dzLXN0cmVhbVwiIGNsYXNzPVwic3RyZWFtLWJ0blwiIHRpdGxlPVwiRW5hYmxlIHJlYWwtdGltZSBzdHJlYW1pbmdcIj5cdUQ4M0RcdURDRTEgTGl2ZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJsb2dzLXBhdXNlXCIgY2xhc3M9XCJwYXVzZS1idG5cIj5cdTIzRjhcdUZFMEYgUGF1c2U8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1jbG9zZVwiIGNsYXNzPVwiY2xvc2UtYnRuXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250YWluZXIgc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGlkPVwibG9ncy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCI+TG9hZGluZyBsb2dzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIC8vID09PT09IFN0YXRlID09PT09XG4gIGxldCBjdXJyZW50RG5zU2VydmljZSA9IG51bGw7XG4gIGxldCBsb2dzSW50ZXJ2YWwgPSBudWxsO1xuICBsZXQgbG9nc1BhdXNlZCA9IGZhbHNlO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudENvbnRhaW5lck5hbWUgPSBudWxsO1xuICBsZXQgY29udGFpbmVyTG9nc01vZGUgPSBmYWxzZTtcblxuICBsZXQgY3VycmVudExvZ1BhdGggPSBudWxsO1xuICBsZXQgY3VycmVudExvZ1NlcnZpY2VOYW1lID0gbnVsbDtcbiAgbGV0IGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuXG4gIGxldCBsb2dFdmVudFNvdXJjZSA9IG51bGw7XG4gIGxldCBpc1N0cmVhbWluZyA9IGZhbHNlO1xuXG4gIC8vID09PT09IEROUyBMT0dTID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEbnNMb2dzKGRuc0lkLCBsaW5lcyA9IDI1KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcnZlcklQID0gZ2V0RG5zU2VydmVyQWRkcihkbnNJZCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Rucy9sb2dzP3NlcnZlcj0ke3NlcnZlcklQfSZsaW1pdD0ke2xpbmVzfWAsIHtcbiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmxvZ3MpIHtcbiAgICAgICAgICByZXR1cm4geyBsb2dzOiByZXN1bHQubG9ncywgY291bnQ6IHJlc3VsdC5jb3VudCwgc2VydmVyOiByZXN1bHQuc2VydmVyIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIGxvZ3MnIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6ICdETlMgYXV0by1hdXRoIGZhaWxlZCAtIGNoZWNrIGNyZWRlbnRpYWxzIGluIHNldHRpbmdzJyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRE5TIGxvZ3MgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmNvZGVDb2xvcihyY29kZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgICdOb0Vycm9yJzogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAnTk9FUlJPUic6ICd2YXIoLS1vay1mZyknLFxuICAgICAgJ054RG9tYWluJzogJ3ZhcigtLW11dGVkKScsXG4gICAgICAnTlhET01BSU4nOiAndmFyKC0tbXV0ZWQpJyxcbiAgICAgICdSZWZ1c2VkJzogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgJ1JFRlVTRUQnOiAndmFyKC0tYmFkLWZnKScsXG4gICAgICAnU2VydmVyRmFpbHVyZSc6ICcjZjM5YzEyJyxcbiAgICAgICdTRVJWRkFJTCc6ICcjZjM5YzEyJ1xuICAgIH07XG4gICAgcmV0dXJuIGNvbG9yc1tyY29kZV0gfHwgJ3ZhcigtLWZnKSc7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJEbnNMb2dFbnRyeShsb2cpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NOYW1lID0gJ2xvZy1lbnRyeSc7XG4gICAgZGl2LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNDBweCAxMTBweCAxZnIgNzBweCA4MHB4OyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGNlbnRlcjsnO1xuXG4gICAgLy8gSWYgdW5wYXJzZWQgcmF3IGxvZ1xuICAgIGlmIChsb2cucGFyc2VkID09PSBmYWxzZSkge1xuICAgICAgZGl2LnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSAnMWZyJztcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy5yYXcpfTwvc3Bhbj5gO1xuICAgICAgcmV0dXJuIGRpdjtcbiAgICB9XG5cbiAgICBjb25zdCByY29kZUNvbG9yID0gZ2V0UmNvZGVDb2xvcihsb2cucmNvZGUpO1xuICAgIGNvbnN0IGlzQmxvY2tlZCA9IGxvZy5yY29kZSA9PT0gJ1JlZnVzZWQnIHx8IGxvZy5yY29kZSA9PT0gJ1JFRlVTRUQnO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cudGltZXN0YW1wKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBmb250LXNpemU6IDAuNzVyZW07XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLmNsaWVudCl9XCI+JHtlc2NhcGVIdG1sKGxvZy5jbGllbnQpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7ICR7aXNCbG9ja2VkID8gJ3RleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyBvcGFjaXR5OiAwLjY7JyA6ICcnfVwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGxvZy5kb21haW4pfVwiPiR7ZXNjYXBlSHRtbChsb2cuZG9tYWluKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnR5cGUpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICR7cmNvZGVDb2xvcn07IGZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnJjb2RlKX08L3NwYW4+XG4gICAgYDtcblxuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMb2dzRGlzcGxheSgpIHtcbiAgICAvLyBIYW5kbGUgZmlsZSBsb2dzIG1vZGVcbiAgICBpZiAoZmlsZUxvZ3NNb2RlKSB7XG4gICAgICBhd2FpdCB1cGRhdGVGaWxlTG9nc0Rpc3BsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY29udGFpbmVyIGxvZ3MgbW9kZVxuICAgIGlmIChjb250YWluZXJMb2dzTW9kZSkge1xuICAgICAgYXdhaXQgdXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRE5TIGxvZ3MgbW9kZVxuICAgIGlmIChsb2dzUGF1c2VkIHx8ICFjdXJyZW50RG5zU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRG5zTG9ncyhjdXJyZW50RG5zU2VydmljZSwgbGluZXMpO1xuXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMnJlbTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlx1MjZBMFx1RkUwRiBFcnJvcjwvZGl2PlxuICAgICAgICAgICAgPGRpdj4ke2VzY2FwZUh0bWwocmVzdWx0LmVycm9yKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBoZWFkZXIgcm93XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDE0MHB4IDExMHB4IDFmciA3MHB4IDgwcHg7IGdhcDogOHB4OyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwO1wiPlxuICAgICAgICAgIDxzcGFuPlRpbWU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+Q2xpZW50PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPkRvbWFpbjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5UeXBlPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgaWYgKHJlc3VsdC5sb2dzICYmIHJlc3VsdC5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmxvZ3MuZm9yRWFjaChsb2cgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ0VsZW1lbnQgPSByZW5kZXJEbnNMb2dFbnRyeShsb2cpO1xuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCArPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIE5vIEROUyBxdWVyaWVzIGxvZ2dlZCB5ZXRcbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBsb2dzOiAke2VzY2FwZUh0bWwoZXJyb3IubWVzc2FnZSl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkxvZ3NNb2RhbChkbnNJZCkge1xuICAgIGN1cnJlbnREbnNTZXJ2aWNlID0gZG5zSWQ7XG4gICAgbG9nc1BhdXNlZCA9IGZhbHNlO1xuICAgIGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG5cbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gYCR7ZG5zSWQudG9VcHBlckNhc2UoKX0gRE5TIExvZ3NgO1xuICAgIHBhdXNlQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOFx1RkUwRiBQYXVzZSc7XG4gICAgcGF1c2VCdG4uY2xhc3NMaXN0LnJlbW92ZSgncGF1c2VkJyk7XG5cbiAgICAvLyBIaWRlIHN0cmVhbSBidXR0b24gZm9yIEROUyBsb2dzIChvbmx5IGF2YWlsYWJsZSBmb3IgY29udGFpbmVyIGxvZ3MpXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gSW5pdGlhbCBsb2FkXG4gICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcblxuICAgIC8vIFN0YXJ0IGF1dG8tcmVmcmVzaCBldmVyeSAzIHNlY29uZHNcbiAgICBsb2dzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVMb2dzRGlzcGxheSwgREMuUE9MTC5MT0dTKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlTG9nc01vZGFsKCkge1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG5cbiAgICBpZiAobG9nc0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKGxvZ3NJbnRlcnZhbCk7XG4gICAgICBsb2dzSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFN0b3AgU1NFIHN0cmVhbWluZyBpZiBhY3RpdmVcbiAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG5cbiAgICAvLyBSZXNldCBhbGwgbG9nIG1vZGVzXG4gICAgY3VycmVudERuc1NlcnZpY2UgPSBudWxsO1xuICAgIGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjdXJyZW50Q29udGFpbmVyTmFtZSA9IG51bGw7XG4gICAgZmlsZUxvZ3NNb2RlID0gZmFsc2U7XG4gICAgY3VycmVudExvZ1BhdGggPSBudWxsO1xuICAgIGN1cnJlbnRMb2dTZXJ2aWNlTmFtZSA9IG51bGw7XG4gICAgbG9nc1BhdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gPT09PT0gU1NFIExPRyBTVFJFQU1JTkcgPT09PT1cblxuICBmdW5jdGlvbiBzdGFydExvZ1N0cmVhbWluZyhjb250YWluZXJJZCkge1xuICAgIGlmIChsb2dFdmVudFNvdXJjZSkge1xuICAgICAgc3RvcExvZ1N0cmVhbWluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIC8vIFN0b3AgaW50ZXJ2YWwtYmFzZWQgcmVmcmVzaFxuICAgIGlmIChsb2dzSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwobG9nc0ludGVydmFsKTtcbiAgICAgIGxvZ3NJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxvZ0V2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YCk7XG4gICAgICBpc1N0cmVhbWluZyA9IHRydWU7XG5cbiAgICAgIHN0cmVhbUJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQgTGl2ZSc7XG4gICAgICBzdHJlYW1CdG4udGl0bGUgPSAnU3RyZWFtaW5nIC0gY2xpY2sgdG8gc3RvcCc7XG4gICAgICBwYXVzZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAvLyBBZGQgc3RyZWFtaW5nIGluZGljYXRvciB0byBoZWFkZXJcbiAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICAgIGlmICghdGl0bGUudGV4dENvbnRlbnQuaW5jbHVkZXMoJ1x1RDgzRFx1REQzNCcpKSB7XG4gICAgICAgIHRpdGxlLmlubmVySFRNTCA9IHRpdGxlLnRleHRDb250ZW50LnJlcGxhY2UoJ1x1RDgzRFx1RENDQicsICdcdUQ4M0RcdURDQ0IgXHVEODNEXHVERDM0Jyk7XG4gICAgICB9XG5cbiAgICAgIGxvZ0V2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0cmVhbSBlcnJvcjonLCBkYXRhLmVycm9yKTtcbiAgICAgICAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBcHBlbmQgbmV3IGxvZyBlbnRyeVxuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgZW50cnkuY2xhc3NOYW1lID0gJ2xvZy1lbnRyeSc7XG4gICAgICAgICAgZW50cnkuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyc7XG5cbiAgICAgICAgICBjb25zdCBzdHJlYW1UeXBlID0gZGF0YS5zdHJlYW0gfHwgJ3N0ZG91dCc7XG4gICAgICAgICAgY29uc3QgaXNFcnJvciA9IHN0cmVhbVR5cGUgPT09ICdzdGRlcnInO1xuICAgICAgICAgIGNvbnN0IGxldmVsQ29sb3IgPSBpc0Vycm9yID8gJ3ZhcigtLWJhZC1mZyknIDogJ3ZhcigtLWZnKSc7XG4gICAgICAgICAgY29uc3QgYmdDb2xvciA9IGlzRXJyb3IgPyAndmFyKC0tYmFkLWJnKScgOiAndmFyKC0tb2stYmcpJztcbiAgICAgICAgICBjb25zdCBsZXZlbEJhZGdlID0gYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDogJHtiZ0NvbG9yfTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjdyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1pbi13aWR0aDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPiR7aXNFcnJvciA/ICdTVERFUlInIDogJ1NURE9VVCd9PC9zcGFuPmA7XG5cbiAgICAgICAgICBlbnRyeS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+JHtsZXZlbEJhZGdlfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGNvbG9yOiAke2xldmVsQ29sb3J9OyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwoZGF0YS50ZXh0KX08L2Rpdj5cbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQoZW50cnkpO1xuXG4gICAgICAgICAgLy8gQXV0by1zY3JvbGwgdG8gYm90dG9tXG4gICAgICAgICAgbG9nc0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nc0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgLy8gTGltaXQgZW50cmllcyB0byBwcmV2ZW50IG1lbW9yeSBpc3N1ZXMgKGtlZXAgbGFzdCA1MDApXG4gICAgICAgICAgd2hpbGUgKGxvZ3NDb250ZW50LmNoaWxkcmVuLmxlbmd0aCA+IDUwMCkge1xuICAgICAgICAgICAgbG9nc0NvbnRlbnQucmVtb3ZlQ2hpbGQobG9nc0NvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHN0cmVhbSBkYXRhOicsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGxvZ0V2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycik7XG4gICAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBzdHJlYW1pbmc6JywgZXJyKTtcbiAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wTG9nU3RyZWFtaW5nKCkge1xuICAgIGlmIChsb2dFdmVudFNvdXJjZSkge1xuICAgICAgbG9nRXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgIGxvZ0V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG5cbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0UxIExpdmUnO1xuICAgICAgc3RyZWFtQnRuLnRpdGxlID0gJ0VuYWJsZSByZWFsLXRpbWUgc3RyZWFtaW5nJztcbiAgICB9XG5cbiAgICBpZiAocGF1c2VCdG4pIHtcbiAgICAgIHBhdXNlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gdGl0bGUudGV4dENvbnRlbnQucmVwbGFjZSgnIFx1RDgzRFx1REQzNCcsICcnKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0YXJ0IGludGVydmFsLWJhc2VkIHJlZnJlc2ggaWYgY29udGFpbmVyIGxvZ3MgbW9kYWwgaXMgb3BlblxuICAgIGlmIChjb250YWluZXJMb2dzTW9kZSAmJiBjdXJyZW50Q29udGFpbmVySWQgJiYgIWxvZ3NJbnRlcnZhbCkge1xuICAgICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ09OVEFJTkVSIExPR1MgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaENvbnRhaW5lckxvZ3MoY29udGFpbmVySWQsIGxpbmVzID0gMTAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0/dGFpbD0ke2xpbmVzfSZ0aW1lc3RhbXBzPXRydWVgO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ3M6IHJlc3VsdC5sb2dzLFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHJlc3VsdC5jb250YWluZXJOYW1lLFxuICAgICAgICAgICAgY29udGFpbmVySWQ6IHJlc3VsdC5jb250YWluZXJJZFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIGNvbnRhaW5lciBsb2dzJyB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb250YWluZXIgbG9ncyBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJDb250YWluZXJMb2dFbnRyeShsb2cpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NOYW1lID0gJ2xvZy1lbnRyeSc7XG4gICAgZGl2LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuXG4gICAgY29uc3Qgc3RyZWFtQ29sb3IgPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgIGNvbnN0IHN0cmVhbUJhZGdlID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgP1xuICAgICAgJzxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjdyZW07IGZvbnQtd2VpZ2h0OiA2MDA7XCI+U1RERVJSPC9zcGFuPicgOlxuICAgICAgJzxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwO1wiPlNURE9VVDwvc3Bhbj4nO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj4ke3N0cmVhbUJhZGdlfTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGNvbG9yOiAke3N0cmVhbUNvbG9yfTsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+JHtlc2NhcGVIdG1sKGxvZy50ZXh0KX08L2Rpdj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCkge1xuICAgIGlmIChsb2dzUGF1c2VkIHx8ICFjdXJyZW50Q29udGFpbmVySWQgfHwgIWNvbnRhaW5lckxvZ3NNb2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBsaW5lcyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKS52YWx1ZSk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hDb250YWluZXJMb2dzKGN1cnJlbnRDb250YWluZXJJZCwgbGluZXMpO1xuXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMnJlbTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlx1MjZBMFx1RkUwRiBFcnJvcjwvZGl2PlxuICAgICAgICAgICAgPGRpdj4ke2VzY2FwZUh0bWwocmVzdWx0LmVycm9yKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBoZWFkZXIgcm93XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjc1cmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4LXNocmluazogMDsgd2lkdGg6IDgwcHg7XCI+U3RyZWFtPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5Mb2cgT3V0cHV0PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuXG4gICAgICBpZiAocmVzdWx0LmxvZ3MgJiYgcmVzdWx0LmxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQubG9ncy5mb3JFYWNoKGxvZyA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nRWxlbWVudCA9IHJlbmRlckNvbnRhaW5lckxvZ0VudHJ5KGxvZyk7XG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQobG9nRWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgICBsb2dzQ29udGVudC5zY3JvbGxUb3AgPSBsb2dzQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBsb2dzIGF2YWlsYWJsZSBmb3IgdGhpcyBjb250YWluZXJcbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBsb2dzOiAke2VzY2FwZUh0bWwoZXJyb3IubWVzc2FnZSl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkNvbnRhaW5lckxvZ3NNb2RhbChjb250YWluZXJJZCwgY29udGFpbmVyTmFtZSkge1xuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGN1cnJlbnRDb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IHRydWU7XG4gICAgZmlsZUxvZ3NNb2RlID0gZmFsc2U7XG4gICAgbG9nc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtaW5nXG4gICAgc3RvcExvZ1N0cmVhbWluZygpO1xuXG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0IgJHtjb250YWluZXJOYW1lfSAtIENvbnRhaW5lciBMb2dzYDtcbiAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuXG4gICAgLy8gU2hvdyBzdHJlYW0gYnV0dG9uIGZvciBjb250YWluZXIgbG9nc1xuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gSW5pdGlhbCBsb2FkXG4gICAgdXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXkoKTtcblxuICAgIC8vIFN0YXJ0IGF1dG8tcmVmcmVzaCBldmVyeSAzIHNlY29uZHNcbiAgICBsb2dzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSwgREMuUE9MTC5MT0dTKTtcbiAgfVxuXG4gIC8vID09PT09IEZJTEUtQkFTRUQgTE9HUyAoZm9yIG5hdGl2ZSBhcHBzKSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoRmlsZUxvZ3MobG9nUGF0aCwgbGluZXMgPSAxMDApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBgL2FwaS92MS9sb2dzL2ZpbGU/cGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudChsb2dQYXRoKX0mdGFpbD0ke2xpbmVzfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmxvZ3MpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9nczogcmVzdWx0LmxvZ3MsXG4gICAgICAgICAgICBjb3VudDogcmVzdWx0LmNvdW50LFxuICAgICAgICAgICAgbG9nUGF0aDogcmVzdWx0LmxvZ1BhdGgsXG4gICAgICAgICAgICB0b3RhbExpbmVzOiByZXN1bHQudG90YWxMaW5lc1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIGZpbGUgbG9ncycgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogcmVzdWx0LmVycm9yIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmlsZSBsb2dzIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBlcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckZpbGVMb2dFbnRyeShsb2cpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NOYW1lID0gJ2xvZy1lbnRyeSc7XG4gICAgZGl2LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuXG4gICAgY29uc3QgdGV4dCA9IGxvZy50ZXh0O1xuICAgIGxldCBsb2dMZXZlbCA9ICdJTkZPJztcbiAgICBsZXQgbGV2ZWxDb2xvciA9ICd2YXIoLS1mZyknO1xuXG4gICAgaWYgKHRleHQubWF0Y2goL0VSUk9SfEZBVEFMfENSSVRJQ0FML2kpKSB7XG4gICAgICBsb2dMZXZlbCA9ICdFUlJPUic7XG4gICAgICBsZXZlbENvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCgvV0FSTnxXQVJOSU5HL2kpKSB7XG4gICAgICBsb2dMZXZlbCA9ICdXQVJOJztcbiAgICAgIGxldmVsQ29sb3IgPSAnI2YzOWMxMic7XG4gICAgfSBlbHNlIGlmICh0ZXh0Lm1hdGNoKC9ERUJVRy9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnREVCVUcnO1xuICAgICAgbGV2ZWxDb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgIH1cblxuICAgIGNvbnN0IGJnQ29sb3IgPSBsZXZlbENvbG9yID09PSAndmFyKC0tYmFkLWZnKScgPyAndmFyKC0tYmFkLWJnKScgOiAndmFyKC0tb2stYmcpJztcbiAgICBjb25zdCBsZXZlbEJhZGdlID0gYDxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZDogJHtiZ0NvbG9yfTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjdyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1pbi13aWR0aDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPiR7bG9nTGV2ZWx9PC9zcGFuPmA7XG5cbiAgICBkaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPiR7bGV2ZWxCYWRnZX08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtsZXZlbENvbG9yfTsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+JHtlc2NhcGVIdG1sKHRleHQpfTwvZGl2PlxuICAgIGA7XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCkge1xuICAgIGlmIChsb2dzUGF1c2VkIHx8ICFjdXJyZW50TG9nUGF0aCB8fCAhZmlsZUxvZ3NNb2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBsaW5lcyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKS52YWx1ZSk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGaWxlTG9ncyhjdXJyZW50TG9nUGF0aCwgbGluZXMpO1xuXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMnJlbTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlx1MjZBMFx1RkUwRiBFcnJvcjwvZGl2PlxuICAgICAgICAgICAgPGRpdj4ke2VzY2FwZUh0bWwocmVzdWx0LmVycm9yKX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuNzVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+TG9nIE91dHB1dCAoJHtyZXN1bHQuY291bnR9IG9mICR7cmVzdWx0LnRvdGFsTGluZXN9IGxpbmVzKTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgaWYgKHJlc3VsdC5sb2dzICYmIHJlc3VsdC5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmxvZ3MuZm9yRWFjaChsb2cgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ0VsZW1lbnQgPSByZW5kZXJGaWxlTG9nRW50cnkobG9nKTtcbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ3NDb250ZW50LnNjcm9sbFRvcCA9IGxvZ3NDb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCArPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIE5vIGxvZ3MgYXZhaWxhYmxlIGluIHRoaXMgZmlsZVxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgRmFpbGVkIHRvIGZldGNoIGxvZ3M6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRmlsZUxvZ3NNb2RhbChsb2dQYXRoLCBzZXJ2aWNlTmFtZSkge1xuICAgIGN1cnJlbnRMb2dQYXRoID0gbG9nUGF0aDtcbiAgICBjdXJyZW50TG9nU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTtcbiAgICBmaWxlTG9nc01vZGUgPSB0cnVlO1xuICAgIGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG4gICAgbG9nc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBcdUQ4M0RcdURDQ0IgJHtzZXJ2aWNlTmFtZX0gLSBBcHBsaWNhdGlvbiBMb2dzYDtcbiAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuXG4gICAgLy8gSGlkZSBzdHJlYW0gYnV0dG9uIGZvciBmaWxlIGxvZ3MgKG9ubHkgYXZhaWxhYmxlIGZvciBjb250YWluZXIgbG9ncylcbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICB1cGRhdGVGaWxlTG9nc0Rpc3BsYXkoKTtcbiAgICBsb2dzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVGaWxlTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICAvLyA9PT09PSBFVkVOVCBMSVNURU5FUlMgPT09PT1cblxuICAvLyBETlMgbG9nIGJ1dHRvbnMgXHUyMDE0IGV2ZW50IGRlbGVnYXRpb24gZm9yIGR5bmFtaWMgY2FyZHNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgbG9nc0J0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItbG9nc1wiXScpO1xuICAgIGlmICghbG9nc0J0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gbG9nc0J0bi5pZC5yZXBsYWNlKCctbG9ncycsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBvcGVuTG9nc01vZGFsKGRuc0lkKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUxvZ3NNb2RhbCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9nc1BhdXNlZCA9ICFsb2dzUGF1c2VkO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcblxuICAgIGlmIChsb2dzUGF1c2VkKSB7XG4gICAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjZcdUZFMEYgUmVzdW1lJztcbiAgICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5hZGQoJ3BhdXNlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgICAgcGF1c2VCdG4uY2xhc3NMaXN0LnJlbW92ZSgncGF1c2VkJyk7XG4gICAgICB1cGRhdGVMb2dzRGlzcGxheSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKCFsb2dzUGF1c2VkKSB7XG4gICAgICB1cGRhdGVMb2dzRGlzcGxheSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU3RyZWFtIGJ1dHRvbiBmb3IgcmVhbC10aW1lIFNTRSBsb2dzIChvbmx5IHdvcmtzIHdpdGggY29udGFpbmVyIGxvZ3MpXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoIWNvbnRhaW5lckxvZ3NNb2RlIHx8ICFjdXJyZW50Q29udGFpbmVySWQpIHtcbiAgICAgIC8vIFN0cmVhbWluZyBvbmx5IGF2YWlsYWJsZSBmb3IgY29udGFpbmVyIGxvZ3NcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJlYW1pbmcpIHtcbiAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRMb2dTdHJlYW1pbmcoY3VycmVudENvbnRhaW5lcklkKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIG1vZGFsIG9uIG91dHNpZGUgY2xpY2tcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ2xvZ3MtbW9kYWwnKSB7XG4gICAgICBjbG9zZUxvZ3NNb2RhbCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbG9ncy1tb2RhbCBvbiBFc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpPy5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICBjbG9zZUxvZ3NNb2RhbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT0gRVhQT1JUUyA9PT09PVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IG9wZW5Db250YWluZXJMb2dzTW9kYWw7XG4gIHdpbmRvdy5vcGVuRmlsZUxvZ3NNb2RhbCA9IG9wZW5GaWxlTG9nc01vZGFsO1xuICB3aW5kb3cub3BlbkxvZ3NNb2RhbCA9IG9wZW5Mb2dzTW9kYWw7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFNFUlZJQ0UgTU9EQUwgVEVNUExBVEVTID09PT09PT09PT1cbi8vIEluamVjdHMgdGhlIEhUTUwgZm9yIHNlcnZpY2UgZWRpdCwgZGVsZXRlLCBhbmQgYWRkIG1vZGFscyBpbnRvIHRoZSBET00uXG4vLyBNdXN0IGxvYWQgYmVmb3JlIHNlcnZpY2UtY3J1ZC5qcyBhbmQgc2VydmljZS1jcmVhdGUuanMuXG4oZnVuY3Rpb24gKCkge1xuXG4gIGluamVjdE1vZGFsKCdzZXJ2aWNlLWVkaXQtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJzZXJ2aWNlLWVkaXQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDYwMHB4O1wiPlxuICAgICAgPGgzIGlkPVwic2VydmljZS1lZGl0LXRpdGxlXCI+RWRpdCBTZXJ2aWNlPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTZweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPCEtLSBTZXJ2aWNlIEluZm8gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImVkaXQtc2VydmljZS1sb2dvLXByZXZpZXdcIiBzcmM9XCJcIiBhbHQ9XCJcIiBzdHlsZT1cIndpZHRoOiA0OHB4OyBoZWlnaHQ6IDQ4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgb2JqZWN0LWZpdDogY29udGFpbjsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZWRpdC1zZXJ2aWNlLXVybC1kaXNwbGF5XCIgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRGlzcGxheSBOYW1lIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LXNlcnZpY2UtbmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LXNlcnZpY2UtbmFtZVwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiU2VydmljZSBuYW1lIHNob3duIG9uIGRhc2hib2FyZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU3ViZG9tYWluIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFN1YmRvbWFpblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1zdWJkb21haW5cIiBjbGFzcz1cImlucHV0LWZsZXhcIiAvPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJlZGl0LXRsZC1zdWZmaXhcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+LmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUG9ydCAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1wb3J0XCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgUG9ydFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPlxuICAgICAgICAgICAgVGhlIHBvcnQgQ2FkZHkgd2lsbCBwcm94eSB0byAoY29udGFpbmVyJ3MgZXhwb3NlZCBwb3J0KVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIElQIEFkZHJlc3MgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtaXBcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBJUCBBZGRyZXNzXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtaXBcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhaWxzY2FsZSBQcm90ZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZWRpdC10YWlsc2NhbGUtb25seVwiIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDtcIiAvPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlRhaWxzY2FsZS1Pbmx5IEFjY2VzczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+UmVzdHJpY3QgdGhpcyBzZXJ2aWNlIHRvIFRhaWxzY2FsZSB1c2VycyBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvZ28gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFNlcnZpY2UgTG9nb1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1sb2dvLXVybFwiIHBsYWNlaG9sZGVyPVwiL2Fzc2V0cy9zZXJ2aWNlLnBuZyBvciBodHRwczovLy4uLlwiIGNsYXNzPVwiaW5wdXQtZmxleFwiIC8+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJlZGl0LWxvZ28tZmlsZVwiIGFjY2VwdD1cImltYWdlLypcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgVXBsb2FkXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIEVudGVyIGEgVVJMIG9yIHVwbG9hZCBhbiBpbWFnZSBmaWxlIChQTkcsIEpQRywgU1ZHKVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENhdGVnb3J5IC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LXNlcnZpY2UtY2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBDYXRlZ29yeVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImVkaXQtc2VydmljZS1jYXRlZ29yeVwiIGRhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTm8gY2F0ZWdvcnkgXHUyMDE0PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZXJ2aWNlLWVkaXQtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZXJ2aWNlLWVkaXQtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlxuICAgICAgICAgIFNhdmUgQ2hhbmdlc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnZGVsZXRlLXNlcnZpY2UtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJkZWxldGUtc2VydmljZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJkZWxldGUtbW9kYWwtdGl0bGVcIiBjbGFzcz1cIm1iLTE2XCI+RGVsZXRlIFNlcnZpY2U8L2gzPlxuXG4gICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLW1lc3NhZ2VcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7IGxpbmUtaGVpZ2h0OiAxLjU7XCI+XG4gICAgICAgIDwhLS0gRHluYW1pYyBjb250ZW50IC0tPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDIwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+RG9ja2VyIENvbnRhaW5lcjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1uYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1tb2RhbC1jYW5jZWxcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMjBweDtcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1tb2RhbC1yZW1vdmVcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMjBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XG4gICAgICAgICAgUmVtb3ZlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLW1vZGFsLWRlbGV0ZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogMTBweCAyMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZTc0YzNjOyBjb2xvcjogI2U3NGMzYztcIj5cbiAgICAgICAgICBEZWxldGVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1oZWxwXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbXV0ZWQpIDEwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgPGRpdj48c3Ryb25nPlJlbW92ZTo8L3N0cm9uZz4gUmVtb3ZlIGZyb20gZGFzaGJvYXJkIG9ubHkgKGNvbnRhaW5lciBrZWVwcyBydW5uaW5nKTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4O1wiPjxzdHJvbmc+RGVsZXRlOjwvc3Ryb25nPiBGdWxsIHJlbW92YWwgLSBzdG9wcyBjb250YWluZXIsIHJlbW92ZXMgRE5TICYgQ2FkZHkgY29uZmlnPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ2FkZC1zZXJ2aWNlLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiYWRkLXNlcnZpY2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzPkFkZCBTZXJ2aWNlPC9oMz5cblxuICAgICAgPCEtLSBTZXJ2aWNlIFR5cGUgVGFicyAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDJweDsgbWFyZ2luLWJvdHRvbTogMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogM3B4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgaWQ9XCJ0YWItbG9jYWxcIiBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNTAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzZXJ2aWNlLXR5cGVcIiB2YWx1ZT1cImxvY2FsXCIgaWQ9XCJzZXJ2aWNlLXR5cGUtbG9jYWxcIiBjaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgIExvY2FsXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBpZD1cInRhYi1leHRlcm5hbFwiIHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRyYW5zaXRpb246IGFsbCAwLjE1cztcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNlcnZpY2UtdHlwZVwiIHZhbHVlPVwiZXh0ZXJuYWxcIiBpZD1cInNlcnZpY2UtdHlwZS1leHRlcm5hbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgIEV4dGVybmFsXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGlkPVwic2VydmljZS10eXBlLWRlc2NyaXB0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvc3Bhbj5cblxuICAgICAgPCEtLSBMT0NBTCBTRVJWSUNFIC0tPlxuICAgICAgPGRpdiBpZD1cImxvY2FsLXNlcnZpY2UtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtbmFtZS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+TmFtZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLW5hbWUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImUuZy4sIEplbGx5ZmluXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwic3ViZG9tYWluLXByZXZpZXdcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi10b3A6IDRweDsgbWluLWhlaWdodDogMWVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLXBvcnQtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPlBvcnQ8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInNlcnZpY2UtcG9ydC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiZS5nLiwgODA5NlwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLWlwLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5JUCBBZGRyZXNzPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1pcC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQXV0by1kZXRlY3RlZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2staXAtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrLWlwLWJ0blwiIGRhdGEtaXA9XCIxMjcuMC4wLjFcIiB0aXRsZT1cIkxvY2FsaG9zdFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IHBhZGRpbmc6IDJweCA2cHg7XCI+bG9jYWxob3N0PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicXVpY2staXAtYnRuXCIgZGF0YS1pcD1cIlwiIGlkPVwicXVpY2staXAtbGFuXCIgdGl0bGU9XCJMQU4gSVBcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBwYWRkaW5nOiAycHggNnB4O1wiPkxBTjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrLWlwLWJ0blwiIGRhdGEtaXA9XCJcIiBpZD1cInF1aWNrLWlwLXRhaWxzY2FsZVwiIHRpdGxlPVwiVGFpbHNjYWxlIElQXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgcGFkZGluZzogMnB4IDZweDtcIj5UYWlsc2NhbGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE9wdGlvbnMgKGNvbGxhcHNlZCBieSBkZWZhdWx0KSAtLT5cbiAgICAgICAgPGRldGFpbHMgaWQ9XCJsb2NhbC1hZHZhbmNlZC1vcHRpb25zXCI+XG4gICAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBmb250LXNpemU6IDAuOHJlbTsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+T3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dFwiPlN1YmRvbWFpbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1zdWJkb21haW4taW5wdXRcIiBwbGFjZWhvbGRlcj1cImF1dG8tZGVyaXZlZCBmcm9tIG5hbWVcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1sb2dvLWlucHV0XCI+TG9nbyBVUkw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2UtbG9nby1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiL2Fzc2V0cy9uYW1lLnBuZ1wiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogc3RhcnQ7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY3JlYXRlLWRucy1yZWNvcmRcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgQ3JlYXRlIEROUyBSZWNvcmRcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3NsLXR5cGUtc2VsZWN0XCI+U1NMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNzbC10eXBlLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2FkZHktbWFuYWdlZFwiPkNhZGR5IE1hbmFnZWQgKEludGVybmFsKTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImxldHNlbmNyeXB0XCI+TGV0J3MgRW5jcnlwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImV4aXN0aW5nLWNhXCI+RXhpc3RpbmcgQ0E8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjdXN0b20tY2FcIj5DdXN0b20gQ0E8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cImRucy1jb25maWdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLXR0bC1pbnB1dFwiPkROUyBUVEw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkbnMtdHRsLWlucHV0XCIgdmFsdWU9XCIzMDBcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2FkZHlmaWxlLXBhdGgtaW5wdXRcIj5DYWRkeWZpbGUgUGF0aDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYWRkeWZpbGUtcGF0aC1pbnB1dFwiIHZhbHVlPVwiQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cImV4aXN0aW5nLWNhLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4aXN0aW5nLWNhLXNlbGVjdFwiPkV4aXN0aW5nIENBOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXBcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXhpc3RpbmctY2Etc2VsZWN0XCIgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcgQ0FzLi4uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJyZWZyZXNoLWNhc1wiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPlxcdXsxRjUwNH08L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cImN1c3RvbS1jYS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYS1uYW1lLWlucHV0XCI+Q0EgTmFtZTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhLW5hbWUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImUuZy4sIHNhbWktY2FcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJtYW51YWwtdGFpbHNjYWxlLXN0YXR1c1wiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNoZWNraW5nIFRhaWxzY2FsZS4uLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibWFudWFsLXRhaWxzY2FsZS1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgVGFpbHNjYWxlLU9ubHkgQWNjZXNzXG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWxvYWQtY2FkZHlcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgIFJlbG9hZCBDYWRkeSBhZnRlciBhZGRpbmdcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcnkgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1jYXRlZ29yeS1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwic2VydmljZS1jYXRlZ29yeS1pbnB1dFwiIGRhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTm8gY2F0ZWdvcnkgXHUyMDE0PC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDNweDtcIj5Hcm91cCBzZXJ2aWNlcyBvbiB0aGUgZGFzaGJvYXJkIGJ5IHB1cnBvc2UgKE1lZGlhLCBQcm9kdWN0aXZpdHksIGV0Yy4pPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGhyIHN0eWxlPVwiYm9yZGVyOiBub25lOyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgbWFyZ2luOiA0cHggMDtcIiAvPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVuYWJsZS1hdXRoXCIgLz5cbiAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW5hYmxlLWNvcnNcIiAvPlxuICAgICAgICAgICAgICAgICAgQ09SUyBIZWFkZXJzXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidXBzdHJlYW0tcGF0aC1pbnB1dFwiPlVwc3RyZWFtIFBhdGg6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInVwc3RyZWFtLXBhdGgtaW5wdXRcIiB2YWx1ZT1cIi9cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaGVhbHRoLWNoZWNrLWlucHV0XCI+SGVhbHRoIENoZWNrOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtY2hlY2staW5wdXRcIiBwbGFjZWhvbGRlcj1cIi9oZWFsdGhcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0aW1lb3V0LWlucHV0XCI+VGltZW91dCAocyk6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwidGltZW91dC1pbnB1dFwiIHZhbHVlPVwiMzBcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjdXN0b20taGVhZGVycy1pbnB1dFwiPkhlYWRlcnMgKEpTT04pOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiY3VzdG9tLWhlYWRlcnMtaW5wdXRcIiBwbGFjZWhvbGRlcj0ne1wiWC1DdXN0b21cIjogXCJ2YWx1ZVwifScgcm93cz1cIjJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtO1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRVhURVJOQUwgU0VSVklDRSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtbmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+TmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtbmFtZVwiIHBsYWNlaG9sZGVyPVwiZS5nLiwgUmFkYXJyIChTZWVkaG9zdClcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgICAgPGRpdiBpZD1cImV4dGVybmFsLXN1YmRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tdG9wOiA0cHg7IG1pbi1oZWlnaHQ6IDFlbTtcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS11cmxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPkV4dGVybmFsIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS11cmxcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vdXNlcm5hbWUuc2VlZGhvc3QuZXUvcmFkYXJyXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gT3B0aW9ucyAoY29sbGFwc2VkIGJ5IGRlZmF1bHQpIC0tPlxuICAgICAgICAgIDxkZXRhaWxzIGlkPVwiZXh0ZXJuYWwtYWR2YW5jZWQtb3B0aW9uc1wiPlxuICAgICAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBmb250LXNpemU6IDAuOHJlbTsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+T3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4OyBkaXNwbGF5OiBncmlkOyBnYXA6IDEwcHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluXCI+U3ViZG9tYWluOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluXCIgcGxhY2Vob2xkZXI9XCJhdXRvLWRlcml2ZWQgZnJvbSBuYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwiZXh0ZXJuYWwtZG9tYWluLXByZXZpZXdcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLWxvZ29cIj5Mb2dvIFVSTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWxvZ29cIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvbmFtZS5wbmdcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLWljb25cIj5JY29uIEVtb2ppOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWljb25cIiBwbGFjZWhvbGRlcj1cIlxcdXsxRjNBQ31cIiBtYXhsZW5ndGg9XCIyXCIgc3R5bGU9XCJ3aWR0aDogNjBweDtcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLWNyZWF0ZS1kbnNcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgQ3JlYXRlIEROUyBSZWNvcmRcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1jcmVhdGUtY2FkZHlcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgQ3JlYXRlIENhZGR5IFJldmVyc2UgUHJveHlcbiAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1wcm94eS1pcFwiPlByb3h5IFNlcnZlciBJUDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtcHJveHktaXBcIiBwbGFjZWhvbGRlcj1cIkF1dG8tZGV0ZWN0ZWRcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1wcmVzZXJ2ZS1ob3N0XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIFByZXNlcnZlIEhvc3QgSGVhZGVyXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtZm9sbG93LXJlZGlyZWN0c1wiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBGb2xsb3cgUmVkaXJlY3RzXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgPCEtLSBDYXRlZ29yeSAoZXh0ZXJuYWwpIC0tPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5DYXRlZ29yeTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4dGVybmFsLXNlcnZpY2UtY2F0ZWdvcnlcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTm8gY2F0ZWdvcnkgXHUyMDE0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYWRkLXNlcnZpY2UtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhZGQtc2VydmljZS1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5DcmVhdGUgU2VydmljZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIElORlJBU1RSVUNUVVJFID09PT09PT09PT1cbi8vIENhZGR5IGNvbmZpZyBnZW5lcmF0aW9uLCBETlMgcmVjb3JkIGNyZWF0aW9uLCBhbmQgc2VydmljZSByZWdpc3RyYXRpb24uXG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vID09PT09IExPQUQgRVhJU1RJTkcgQ0FzID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEV4aXN0aW5nQ0FzKGNhZGR5ZmlsZVBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9jYWRkeS9jYXM/Y2FkZHlmaWxlUGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudChjYWRkeWZpbGVQYXRoKX1gKTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIENBczogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKTtcbiAgICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIGlmIChyZXN1bHQuY2FzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPk5vIENBcyBmb3VuZCBpbiBDYWRkeWZpbGU8L29wdGlvbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBleGlzdGluZyBDQS4uLjwvb3B0aW9uPic7XG4gICAgICAgICAgcmVzdWx0LmNhcy5mb3JFYWNoKGNhID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gY2EuaWQ7XG4gICAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGNhLmRpc3BsYXlOYW1lIHx8IGNhLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcHRpb24udmFsdWUgPSBjYTtcbiAgICAgICAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gY2E7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGEuY2FzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBDQXM6JywgZXJyb3IpO1xuICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpO1xuICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+RXJyb3IgbG9hZGluZyBDQXM8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IEdFTkVSQVRFIENBRERZIENPTkZJRyA9PT09PVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlQ2FkZHlDb25maWcoY29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3ViZG9tYWluLFxuICAgICAgcG9ydCxcbiAgICAgIGlwLFxuICAgICAgc3NsVHlwZSxcbiAgICAgIGNhTmFtZSxcbiAgICAgIGV4aXN0aW5nQ2EsXG4gICAgICBlbmFibGVBdXRoLFxuICAgICAgZW5hYmxlQ29ycyxcbiAgICAgIGN1c3RvbUhlYWRlcnMsXG4gICAgICB1cHN0cmVhbVBhdGgsXG4gICAgICBoZWFsdGhDaGVjayxcbiAgICAgIHRpbWVvdXQsXG4gICAgICB0YWlsc2NhbGVPbmx5XG4gICAgfSA9IGNvbmZpZztcblxuICAgIGxldCBjYWRkeUNvbmZpZyA9IGAke2J1aWxkRG9tYWluKHN1YmRvbWFpbil9IHtcXG5gO1xuXG4gICAgLy8gVGFpbHNjYWxlLW9ubHkgYWNjZXNzIHJlc3RyaWN0aW9uXG4gICAgaWYgKHRhaWxzY2FsZU9ubHkpIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIEBibG9ja2VkIG5vdCByZW1vdGVfaXAgMTAwLjY0LjAuMC8xMFxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICByZXNwb25kIEBibG9ja2VkIFwiQWNjZXNzIGRlbmllZC4gVGFpbHNjYWxlIGNvbm5lY3Rpb24gcmVxdWlyZWQuXCIgNDAzXFxuYDtcbiAgICB9XG5cbiAgICAvLyBTU0wgQ29uZmlndXJhdGlvblxuICAgIHN3aXRjaCAoc3NsVHlwZSkge1xuICAgICAgY2FzZSAnbGV0c2VuY3J5cHQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NhZGR5LW1hbmFnZWQnOlxuICAgICAgICBjYWRkeUNvbmZpZyArPSBgICB0bHMgaW50ZXJuYWxcXG5gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4aXN0aW5nLWNhJzpcbiAgICAgICAgaWYgKGV4aXN0aW5nQ2EpIHtcbiAgICAgICAgICBjYWRkeUNvbmZpZyArPSBgICB0bHMge1xcbiAgICBjYSAke2V4aXN0aW5nQ2F9XFxuICB9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2N1c3RvbS1jYSc6XG4gICAgICAgIGlmIChjYU5hbWUpIHtcbiAgICAgICAgICBjYWRkeUNvbmZpZyArPSBgICB0bHMge1xcbiAgICBjYSAke2NhTmFtZX1cXG4gIH1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGVuYWJsZUF1dGgpIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGJhc2ljYXV0aCB7XFxuICAgIGFkbWluICQyYSQxNCRoYXNoZWRfcGFzc3dvcmRfaGVyZVxcbiAgfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gQ09SUyBIZWFkZXJzXG4gICAgaWYgKGVuYWJsZUNvcnMpIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGhlYWRlciB7XFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luIFwiKlwiXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyBcIkdFVCwgUE9TVCwgUFVULCBERUxFVEUsIE9QVElPTlNcIlxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgXCJDb250ZW50LVR5cGUsIEF1dGhvcml6YXRpb25cIlxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICB9XFxuYDtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gSGVhZGVyc1xuICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gSlNPTi5wYXJzZShjdXN0b21IZWFkZXJzKTtcbiAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgaGVhZGVyIHtcXG5gO1xuICAgICAgICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjYWRkeUNvbmZpZyArPSBgICAgICR7a2V5fSBcIiR7dmFsdWV9XCJcXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgfVxcbmA7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBKU09OIGluIGN1c3RvbSBoZWFkZXJzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGVhbHRoIENoZWNrXG4gICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBoZWFsdGhfdXJpICR7aGVhbHRoQ2hlY2t9XFxuYDtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnNlIFByb3h5XG4gICAgY2FkZHlDb25maWcgKz0gYCAgcmV2ZXJzZV9wcm94eSAke2lwfToke3BvcnR9IHtcXG5gO1xuICAgIGlmICh1cHN0cmVhbVBhdGggJiYgdXBzdHJlYW1QYXRoICE9PSAnLycpIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgcmV3cml0ZSAke3Vwc3RyZWFtUGF0aH1cXG5gO1xuICAgIH1cbiAgICBpZiAodGltZW91dCAmJiB0aW1lb3V0ICE9PSAzMCkge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICB0cmFuc3BvcnQgaHR0cCB7XFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgICBkaWFsX3RpbWVvdXQgJHt0aW1lb3V0fXNcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICAgIHJlc3BvbnNlX2hlYWRlcl90aW1lb3V0ICR7dGltZW91dH1zXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgfVxcbmA7XG4gICAgfVxuICAgIGNhZGR5Q29uZmlnICs9IGAgIH1cXG5gO1xuXG4gICAgY2FkZHlDb25maWcgKz0gYH1cXG5gO1xuXG4gICAgcmV0dXJuIGNhZGR5Q29uZmlnO1xuICB9XG5cbiAgLy8gPT09PT0gQ1JFQVRFIEROUyBSRUNPUkQgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVEbnNSZWNvcmQoc3ViZG9tYWluLCBpcCwgdHRsID0gREMuREVGQVVMVFMuVFRMKSB7XG4gICAgY29uc3QgZG5zVG9rZW4gPSB3aW5kb3cuZ2V0VG9rZW4oZ2V0UHJpbWFyeURuc0lkKCksICdhZG1pbicpO1xuXG4gICAgaWYgKCFkbnNUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdETlMgYWRtaW4gdG9rZW4gbm90IGNvbmZpZ3VyZWQuIFBsZWFzZSBzZXQgaXQgaW4gdGhlIFRva2VucyBtZW51LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRvbWFpbiA9IGJ1aWxkRG9tYWluKHN1YmRvbWFpbik7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Rucy9yZWNvcmQnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkb21haW46IGRvbWFpbixcbiAgICAgICAgaXA6IGlwLFxuICAgICAgICB0dGw6IHR0bCxcbiAgICAgICAgdG9rZW46IGRuc1Rva2VuLFxuICAgICAgICBzZXJ2ZXI6IFNJVEUuZG5zSXBcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEROUyBBUEkgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7ZXJyb3JUZXh0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEROUyBFcnJvcjogJHtyZXN1bHQuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyA9PT09PSBBREQgU0VSVklDRSBUTyBDT05GSUcgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBhZGRTZXJ2aWNlVG9Db25maWcoc2VydmljZUNvbmZpZykge1xuICAgIGNvbnN0IG5ld1NlcnZpY2UgPSB7XG4gICAgICBpZDogc2VydmljZUNvbmZpZy5zdWJkb21haW4sXG4gICAgICBuYW1lOiBzZXJ2aWNlQ29uZmlnLm5hbWUsXG4gICAgICBsb2dvOiBzZXJ2aWNlQ29uZmlnLmxvZ28gfHwgYC9hc3NldHMvJHtzZXJ2aWNlQ29uZmlnLnN1YmRvbWFpbn0ucG5nYFxuICAgIH07XG4gICAgLy8gRm9yd2FyZCBvcHRpb25hbCBtZXRhZGF0YSBmaWVsZHMgaWYgcHJvdmlkZWRcbiAgICBpZiAoc2VydmljZUNvbmZpZy5jYXRlZ29yeSkgbmV3U2VydmljZS5jYXRlZ29yeSA9IHNlcnZpY2VDb25maWcuY2F0ZWdvcnk7XG4gICAgaWYgKHNlcnZpY2VDb25maWcuY29udGFpbmVySWQpIG5ld1NlcnZpY2UuY29udGFpbmVySWQgPSBzZXJ2aWNlQ29uZmlnLmNvbnRhaW5lcklkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobmV3U2VydmljZSlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNlcnZpY2UnKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuXG4gICAgICByZXR1cm4gbmV3U2VydmljZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGFkZCBzZXJ2aWNlIHRvIGNvbmZpZzonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBBREQgVE8gQ0FERFlGSUxFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWRkVG9DYWRkeWZpbGUoY29uZmlnKSB7XG4gICAgY29uc3Qgc3ViZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZS50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXBvcnQtaW5wdXQnKS52YWx1ZS50cmltKCkgfHwgJzgwJztcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2l0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRvbWFpbjogYnVpbGREb21haW4oc3ViZG9tYWluKSxcbiAgICAgICAgdXBzdHJlYW06IGAke2lwfToke3BvcnR9YCxcbiAgICAgICAgY29uZmlnOiBjb25maWdcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgYENhZGR5IEFQSSBFcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyA9PT09PSBXSU5ET1cgRVhQT1JUUyA9PT09PVxuXG4gIHdpbmRvdy5sb2FkRXhpc3RpbmdDQXMgPSBsb2FkRXhpc3RpbmdDQXM7XG4gIHdpbmRvdy5nZW5lcmF0ZUNhZGR5Q29uZmlnID0gZ2VuZXJhdGVDYWRkeUNvbmZpZztcbiAgd2luZG93LmNyZWF0ZURuc1JlY29yZCA9IGNyZWF0ZURuc1JlY29yZDtcbiAgd2luZG93LmFkZFNlcnZpY2VUb0NvbmZpZyA9IGFkZFNlcnZpY2VUb0NvbmZpZztcbiAgd2luZG93LmFkZFRvQ2FkZHlmaWxlID0gYWRkVG9DYWRkeWZpbGU7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFNFUlZJQ0UgQ1JVRCA9PT09PT09PT09XG4vLyBFZGl0LCBkZWxldGUsIGFuZCB1cGRhdGUgb3BlcmF0aW9ucyBmb3IgZXhpc3Rpbmcgc2VydmljZXMuXG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vID09PT09IFNFUlZJQ0UgRURJVCBNT0RBTCA9PT09PVxuICBsZXQgY3VycmVudEVkaXRTZXJ2aWNlID0gbnVsbDtcblxuICBmdW5jdGlvbiBvcGVuU2VydmljZUVkaXRNb2RhbChzZXJ2aWNlKSB7XG4gICAgY3VycmVudEVkaXRTZXJ2aWNlID0gc2VydmljZTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtbW9kYWwnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtdGl0bGUnKS50ZXh0Q29udGVudCA9IGBFZGl0ICR7c2VydmljZS5uYW1lfWA7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1uYW1lJykudmFsdWUgPSBzZXJ2aWNlLm5hbWU7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS11cmwtZGlzcGxheScpLnRleHRDb250ZW50ID0gc2VydmljZS51cmwgfHwgYnVpbGRTZXJ2aWNlVXJsKHNlcnZpY2UuaWQpO1xuICAgIGNvbnN0IGxvZ29QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1sb2dvLXByZXZpZXcnKTtcbiAgICBjb25zdCBsb2dvU3JjID0gc2VydmljZS5sb2dvIHx8IGAvYXNzZXRzLyR7c2VydmljZS5pZH0ucG5nYDtcbiAgICBsb2dvUHJldmlldy5zcmMgPSBsb2dvU3JjO1xuICAgIC8vIEhpZGUgYnJva2VuIGltYWdlcyBncmFjZWZ1bGx5IGluc3RlYWQgb2Ygc2hvd2luZyBhIGJyb2tlbiBpY29uXG4gICAgbG9nb1ByZXZpZXcub25lcnJvciA9IGZ1bmN0aW9uKCkgeyB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH07XG4gICAgbG9nb1ByZXZpZXcub25sb2FkID0gZnVuY3Rpb24oKSB7IHRoaXMuc3R5bGUuZGlzcGxheSA9ICcnOyB9O1xuICAgIGxvZ29QcmV2aWV3LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zdWJkb21haW4nKS52YWx1ZSA9IHNlcnZpY2UuaWQ7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtcG9ydCcpLnZhbHVlID0gc2VydmljZS5wb3J0IHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWlwJykudmFsdWUgPSBzZXJ2aWNlLmlwIHx8ICdsb2NhbGhvc3QnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXRhaWxzY2FsZS1vbmx5JykuY2hlY2tlZCA9IHNlcnZpY2UudGFpbHNjYWxlT25seSB8fCBmYWxzZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlID0gc2VydmljZS5sb2dvIHx8ICcnO1xuXG4gICAgLy8gUG9wdWxhdGUgdGhlIGNhdGVnb3J5IHNlbGVjdCBmb3IgdGhpcyBzZXJ2aWNlLCB0aGVuIHNldCB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAvLyBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpIHVzZXMgZGF0YS1jdXJyZW50IHNvIHdlIHNldCBpdCBmaXJzdCwgdGhlbiBjYWxsLlxuICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1jYXRlZ29yeScpO1xuICAgIGlmIChjYXRlZ29yeVNlbGVjdCkge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QuZGF0YXNldC5jdXJyZW50ID0gc2VydmljZS5jYXRlZ29yeSB8fCAnJztcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LnBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlU2VydmljZUVkaXRNb2RhbCgpIHtcbiAgICBjbG9zZU1vZGFsKCdzZXJ2aWNlLWVkaXQtbW9kYWwnKTtcbiAgICBjdXJyZW50RWRpdFNlcnZpY2UgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZVNlcnZpY2VDaGFuZ2VzKCkge1xuICAgIGlmICghY3VycmVudEVkaXRTZXJ2aWNlKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdTdWJkb21haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zdWJkb21haW4nKS52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBuZXdOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1uYW1lJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IG5ld1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1wb3J0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IG5ld0lwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtaXAnKS52YWx1ZS50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgdGFpbHNjYWxlT25seSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXRhaWxzY2FsZS1vbmx5JykuY2hlY2tlZDtcbiAgICBjb25zdCBuZXdMb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbmV3Q2F0ZWdvcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWNhdGVnb3J5Jyk/LnZhbHVlIHx8ICcnO1xuXG4gICAgaWYgKCFuZXdTdWJkb21haW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1N1YmRvbWFpbiBpcyByZXF1aXJlZCcsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU3ViZG9tYWluID0gY3VycmVudEVkaXRTZXJ2aWNlLmlkO1xuICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgIGlmIChuZXdTdWJkb21haW4gIT09IG9sZFN1YmRvbWFpbikgY2hhbmdlcy5wdXNoKCdzdWJkb21haW4nKTtcbiAgICBpZiAobmV3TmFtZSAmJiBuZXdOYW1lICE9PSBjdXJyZW50RWRpdFNlcnZpY2UubmFtZSkgY2hhbmdlcy5wdXNoKCduYW1lJyk7XG4gICAgaWYgKG5ld1BvcnQgJiYgbmV3UG9ydCAhPT0gU3RyaW5nKGN1cnJlbnRFZGl0U2VydmljZS5wb3J0KSkgY2hhbmdlcy5wdXNoKCdwb3J0Jyk7XG4gICAgaWYgKG5ld0lwICE9PSBjdXJyZW50RWRpdFNlcnZpY2UuaXApIGNoYW5nZXMucHVzaCgnaXAnKTtcbiAgICBpZiAodGFpbHNjYWxlT25seSAhPT0gKGN1cnJlbnRFZGl0U2VydmljZS50YWlsc2NhbGVPbmx5IHx8IGZhbHNlKSkgY2hhbmdlcy5wdXNoKCd0YWlsc2NhbGUnKTtcbiAgICBpZiAobmV3TG9nbyAmJiBuZXdMb2dvICE9PSBjdXJyZW50RWRpdFNlcnZpY2UubG9nbykgY2hhbmdlcy5wdXNoKCdsb2dvJyk7XG4gICAgaWYgKG5ld0NhdGVnb3J5ICE9PSAoY3VycmVudEVkaXRTZXJ2aWNlLmNhdGVnb3J5IHx8ICcnKSkgY2hhbmdlcy5wdXNoKCdjYXRlZ29yeScpO1xuXG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1zYXZlJyk7XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMvdXBkYXRlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvbGRTdWJkb21haW4sXG4gICAgICAgICAgbmV3U3ViZG9tYWluLFxuICAgICAgICAgIG5hbWU6IG5ld05hbWUgfHwgY3VycmVudEVkaXRTZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgcG9ydDogbmV3UG9ydCB8fCBjdXJyZW50RWRpdFNlcnZpY2UucG9ydCxcbiAgICAgICAgICBpcDogbmV3SXAsXG4gICAgICAgICAgdGFpbHNjYWxlT25seSxcbiAgICAgICAgICBsb2dvOiBuZXdMb2dvIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBjYXRlZ29yeTogbmV3Q2F0ZWdvcnlcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgc2VydmljZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgbG9jYWwgQVBQUyBhcnJheSB0byBtYXRjaFxuICAgICAgY29uc3QgYXBwSW5kZXggPSB3aW5kb3cuQVBQUy5maW5kSW5kZXgoYSA9PiBhLmlkID09PSBvbGRTdWJkb21haW4pO1xuICAgICAgaWYgKGFwcEluZGV4ICE9PSAtMSkge1xuICAgICAgICB3aW5kb3cuQVBQU1thcHBJbmRleF0gPSB7XG4gICAgICAgICAgLi4ud2luZG93LkFQUFNbYXBwSW5kZXhdLFxuICAgICAgICAgIGlkOiBuZXdTdWJkb21haW4sXG4gICAgICAgICAgbmFtZTogbmV3TmFtZSB8fCB3aW5kb3cuQVBQU1thcHBJbmRleF0ubmFtZSxcbiAgICAgICAgICBwb3J0OiBuZXdQb3J0IHx8IHdpbmRvdy5BUFBTW2FwcEluZGV4XS5wb3J0LFxuICAgICAgICAgIGlwOiBuZXdJcCxcbiAgICAgICAgICB0YWlsc2NhbGVPbmx5LFxuICAgICAgICAgIGxvZ286IG5ld0xvZ28gfHwgd2luZG93LkFQUFNbYXBwSW5kZXhdLmxvZ28sXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0NhdGVnb3J5IHx8IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKTtcbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIHNlcnZpY2UgY2hhbmdlczonLCBlcnJvcik7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvciBzYXZpbmcgY2hhbmdlczogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUgQ2hhbmdlcyc7XG4gICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9nbyBmaWxlIHVwbG9hZCBoYW5kbGVyXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tZmlsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcblxuICAgIGlmICghZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGFuIGltYWdlIGZpbGUnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVVybCA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbG9nby1wcmV2aWV3Jykuc3JjID0gZGF0YVVybDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUgPSBkYXRhVXJsO1xuXG4gICAgICBpZiAoY3VycmVudEVkaXRTZXJ2aWNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hc3NldHMvdXBsb2FkJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGAke2N1cnJlbnRFZGl0U2VydmljZS5pZH0ucG5nYCxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVVybFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5wYXRoKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlID0gcmVzdWx0LnBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBkYXRhIFVSTFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfSk7XG5cbiAgLy8gU2VydmljZSBlZGl0IG1vZGFsIGV2ZW50IGxpc3RlbmVyc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlU2VydmljZUVkaXRNb2RhbCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVTZXJ2aWNlQ2hhbmdlcyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ3NlcnZpY2UtZWRpdC1tb2RhbCcpIGNsb3NlU2VydmljZUVkaXRNb2RhbCgpO1xuICB9KTtcblxuICAvLyA9PT09PSBERUxFVEUgU0VSVklDRSBNT0RBTCA9PT09PVxuXG4gIGZ1bmN0aW9uIHNob3dEZWxldGVNb2RhbChzZXJ2aWNlTmFtZSwgaGFzQ29udGFpbmVyLCBjb250YWluZXJJZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLXNlcnZpY2UtbW9kYWwnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC10aXRsZScpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtbWVzc2FnZScpO1xuICAgICAgY29uc3QgY29udGFpbmVySW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtY29udGFpbmVyLWluZm8nKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1uYW1lJyk7XG4gICAgICBjb25zdCBoZWxwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1oZWxwJyk7XG4gICAgICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWNhbmNlbCcpO1xuICAgICAgY29uc3QgcmVtb3ZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1yZW1vdmUnKTtcbiAgICAgIGNvbnN0IGRlbGV0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtZGVsZXRlJyk7XG5cbiAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gYERlbGV0ZSBcIiR7c2VydmljZU5hbWV9XCJgO1xuXG4gICAgICBpZiAoaGFzQ29udGFpbmVyKSB7XG4gICAgICAgIG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1RoaXMgc2VydmljZSBoYXMgYW4gYXNzb2NpYXRlZCBEb2NrZXIgY29udGFpbmVyLjxicj5DaG9vc2UgaG93IHRvIHByb2NlZWQ6JztcbiAgICAgICAgY29udGFpbmVySW5mby5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgY29udGFpbmVyTmFtZS50ZXh0Q29udGVudCA9IGBDb250YWluZXIgSUQ6ICR7Y29udGFpbmVySWQ/LnNsaWNlKDAsIDEyKSB8fCAnVW5rbm93bid9YDtcbiAgICAgICAgaGVscC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGVsZXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZS50ZXh0Q29udGVudCA9ICdSZW1vdmUgdGhpcyBzZXJ2aWNlIGZyb20gdGhlIGRhc2hib2FyZD8nO1xuICAgICAgICBjb250YWluZXJJbmZvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGhlbHAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZGVsZXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgICAgY2FuY2VsQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2FuY2VsKTtcbiAgICAgICAgcmVtb3ZlQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVtb3ZlKTtcbiAgICAgICAgZGVsZXRlQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlRGVsZXRlKTtcbiAgICAgICAgbW9kYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVCYWNrZHJvcCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZShudWxsKTsgfTtcbiAgICAgIGNvbnN0IGhhbmRsZVJlbW92ZSA9ICgpID0+IHsgY2xlYW51cCgpOyByZXNvbHZlKGZhbHNlKTsgfTtcbiAgICAgIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHsgY2xlYW51cCgpOyByZXNvbHZlKHRydWUpOyB9O1xuICAgICAgY29uc3QgaGFuZGxlQmFja2Ryb3AgPSAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7IGNsZWFudXAoKTsgcmVzb2x2ZShudWxsKTsgfSB9O1xuXG4gICAgICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDYW5jZWwpO1xuICAgICAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUmVtb3ZlKTtcbiAgICAgIGRlbGV0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZURlbGV0ZSk7XG4gICAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUJhY2tkcm9wKTtcblxuICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT0gVVBEQVRFIENPTlRBSU5FUiA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihjb250YWluZXJJZCwgc2VydmljZU5hbWUsIHNlcnZpY2VJZCkge1xuICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB1cGRhdGUtYnRuLSR7c2VydmljZUlkfWApO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IHVwZGF0ZUJ0bj8udGV4dENvbnRlbnQ7XG5cbiAgICBpZiAoIWNvbmZpcm0oYFVwZGF0ZSAke3NlcnZpY2VOYW1lfSB0byB0aGUgbGF0ZXN0IHZlcnNpb24/XFxuXFxuVGhpcyB3aWxsOlxcbjEuIFB1bGwgdGhlIGxhdGVzdCBpbWFnZVxcbjIuIFN0b3AgdGhlIGNvbnRhaW5lclxcbjMuIFJlY3JlYXRlIHdpdGggc2FtZSBzZXR0aW5nc1xcblxcblRoZSBzZXJ2aWNlIHdpbGwgYmUgYnJpZWZseSB1bmF2YWlsYWJsZS5gKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MUY1MDR9JztcbiAgICAgICAgdXBkYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0aW5nLi4uJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9jb250YWluZXJzLyR7Y29udGFpbmVySWR9L3VwZGF0ZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gd2luZG93LkFQUFMuZmluZChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlSWQpO1xuICAgICAgICBpZiAoc2VydmljZSAmJiByZXN1bHQubmV3Q29udGFpbmVySWQpIHtcbiAgICAgICAgICBzZXJ2aWNlLmNvbnRhaW5lcklkID0gcmVzdWx0Lm5ld0NvbnRhaW5lcklkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MjcwNX0nO1xuICAgICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgICAgdXBkYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlIGNvbnRhaW5lciB0byBsYXRlc3QgdmVyc2lvbic7XG4gICAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHdpbmRvdy5yZWZyZXNoQWxsKCksIDIwMDApO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke3NlcnZpY2VOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFgLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVcGRhdGUgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcXHV7Mjc0Q30nO1xuICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlIGZhaWxlZCc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICB1cGRhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlIGNvbnRhaW5lciB0byBsYXRlc3QgdmVyc2lvbic7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgfVxuXG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBGYWlsZWQgdG8gdXBkYXRlICR7c2VydmljZU5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gREVMRVRFIFNFUlZJQ0UgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBkZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCwgc2VydmljZU5hbWUpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gd2luZG93LkFQUFMuZmluZChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlSWQpO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNlcnZpY2UgPyBidWlsZERvbWFpbihzZXJ2aWNlLmlkKSA6IG51bGw7XG4gICAgY29uc3QgaGFzQ29udGFpbmVyID0gc2VydmljZT8uY29udGFpbmVySWQ7XG5cbiAgICBjb25zdCBkZWxldGVDb250YWluZXIgPSBhd2FpdCBzaG93RGVsZXRlTW9kYWwoc2VydmljZU5hbWUgfHwgc2VydmljZUlkLCBoYXNDb250YWluZXIsIHNlcnZpY2U/LmNvbnRhaW5lcklkKTtcblxuICAgIGlmIChkZWxldGVDb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjsgLy8gVXNlciBjYW5jZWxsZWRcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0cyA9IHtcbiAgICAgIGRhc2hib2FyZDogZmFsc2UsXG4gICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICBkbnM6IG51bGwsXG4gICAgICBjYWRkeTogbnVsbCxcbiAgICAgIHNlcnZpY2U6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gRnVsbCByZW1vdmFsIHdpdGggY29udGFpbmVyXG4gICAgaWYgKGRlbGV0ZUNvbnRhaW5lciAmJiBoYXNDb250YWluZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgIGNvbnRhaW5lcklkOiBzZXJ2aWNlLmNvbnRhaW5lcklkLFxuICAgICAgICAgIHN1YmRvbWFpbjogc2VydmljZS5pZCxcbiAgICAgICAgICBpcDogc2VydmljZS5pcCB8fCAnbG9jYWxob3N0JyxcbiAgICAgICAgICBkZWxldGVDb250YWluZXI6ICd0cnVlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2FwcHMvJHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZS5pZCl9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzID0geyAuLi5yZXN1bHRzLCAuLi5yZXN1bHQucmVzdWx0cywgZGFzaGJvYXJkOiBmYWxzZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcCByZW1vdmFsIGZhaWxlZDonLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcHAgcmVtb3ZhbCBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkZWxldGVDb250YWluZXIgJiYgZG9tYWluKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgbWFudWFsbHkgYWRkZWQgc2VydmljZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VJUCA9IHNlcnZpY2U/LmlwIHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICBjb25zdCBkbnNSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2Rucy9yZWNvcmQ/ZG9tYWluPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRvbWFpbil9JnR5cGU9QSZpcEFkZHJlc3M9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZUlQKX0mc2VydmVyPSR7U0lURS5kbnNJcH1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZG5zUmVzdWx0ID0gYXdhaXQgZG5zUmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXN1bHRzLmRucyA9IGRuc1Jlc3VsdC5zdWNjZXNzID8gJ2RlbGV0ZWQnIDogKGRuc1Jlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3VsdHMuZG5zID0gZS5tZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWRkeVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2l0ZS8ke2VuY29kZVVSSUNvbXBvbmVudChkb21haW4pfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjYWRkeVJlc3VsdCA9IGF3YWl0IGNhZGR5UmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXN1bHRzLmNhZGR5ID0gKGNhZGR5UmVzdWx0LnN1Y2Nlc3MgfHwgKGNhZGR5UmVzdWx0LmVycm9yICYmIGNhZGR5UmVzdWx0LmVycm9yLmluY2x1ZGVzKCdub3QgZm91bmQnKSkpID8gJ3JlbW92ZWQnIDogKGNhZGR5UmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBBUFBTIGFycmF5XG4gICAgY29uc3QgaW5kZXggPSB3aW5kb3cuQVBQUy5maW5kSW5kZXgoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgd2luZG93LkFQUFMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJlc3VsdHMuZGFzaGJvYXJkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VzdG9tQXBwcyA9IHNhZmVHZXRKU09OKCdjdXN0b20tYXBwcycsIFtdKTtcbiAgICAgIGNvbnN0IGxvY2FsSW5kZXggPSBjdXN0b21BcHBzLmZpbmRJbmRleChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlSWQpO1xuICAgICAgaWYgKGxvY2FsSW5kZXggPiAtMSkge1xuICAgICAgICBjdXN0b21BcHBzLnNwbGljZShsb2NhbEluZGV4LCAxKTtcbiAgICAgICAgc2FmZVNldCgnY3VzdG9tLWFwcHMnLCBKU09OLnN0cmluZ2lmeShjdXN0b21BcHBzKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGxvY2FsU3RvcmFnZSBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBzZXJ2aWNlcy5qc29uIHZpYSBBUElcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VydmljZVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZUlkKX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2VydmljZVJlc3VsdCA9IGF3YWl0IHNlcnZpY2VSZXNwb25zZS5qc29uKCk7XG4gICAgICByZXN1bHRzLnNlcnZpY2UgPSBzZXJ2aWNlUmVzdWx0LnN1Y2Nlc3MgPyAncmVtb3ZlZCcgOiAoc2VydmljZVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0cy5zZXJ2aWNlID0gZS5tZXNzYWdlO1xuICAgIH1cblxuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgLy8gT25seSBzaG93IGFsZXJ0IGlmIHRoZXJlIGFyZSBhY3R1YWwgZXJyb3JzXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgIGxldCBlcnJvck1lc3NhZ2VzID0gW107XG5cbiAgICBpZiAoIXJlc3VsdHMuZGFzaGJvYXJkKSB7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKCdcXHV7MjcxN30gRmFpbGVkIHRvIHJlbW92ZSBmcm9tIGRhc2hib2FyZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Y2Nlc3NTdGF0ZXMgPSBbJ3JlbW92ZWQnLCAnYWxyZWFkeSByZW1vdmVkJywgJ25vdCBmb3VuZCcsICdkZWxldGVkJywgJ2tlcHQgKHVzZXIgY2hvaWNlKScsICdza2lwcGVkJywgJ25vIHN1Y2ggcmVjb3JkJywgJ2RvZXMgbm90IGV4aXN0J107XG4gICAgY29uc3QgaXNTdWNjZXNzID0gKHZhbCkgPT4gIXZhbCB8fCBzdWNjZXNzU3RhdGVzLnNvbWUocyA9PiB2YWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgIGlmIChyZXN1bHRzLmNvbnRhaW5lciAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuY29udGFpbmVyKSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IENvbnRhaW5lcjogJHtyZXN1bHRzLmNvbnRhaW5lcn1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuZG5zICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5kbnMpKSB7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGBcXHV7MjZBMH0gRE5TIFJlY29yZDogJHtyZXN1bHRzLmRuc31gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuY2FkZHkgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLmNhZGR5KSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IENhZGR5IENvbmZpZzogJHtyZXN1bHRzLmNhZGR5fWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0cy5zZXJ2aWNlICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5zZXJ2aWNlKSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IFNlcnZpY2UgRmlsZTogJHtyZXN1bHRzLnNlcnZpY2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0Vycm9ycykge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3IgZGVsZXRpbmcgXCIke3NlcnZpY2VOYW1lIHx8IHNlcnZpY2VJZH1cIjogJHtlcnJvck1lc3NhZ2VzLmpvaW4oJywgJyl9YCwgJ2Vycm9yJywgNjAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gV0lORE9XIEVYUE9SVFMgPT09PT1cblxuICB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwgPSBvcGVuU2VydmljZUVkaXRNb2RhbDtcbiAgd2luZG93LnNob3dEZWxldGVNb2RhbCA9IHNob3dEZWxldGVNb2RhbDtcbiAgd2luZG93LnVwZGF0ZUNvbnRhaW5lciA9IHVwZGF0ZUNvbnRhaW5lcjtcbiAgd2luZG93LmRlbGV0ZVNlcnZpY2UgPSBkZWxldGVTZXJ2aWNlO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIENSRUFUSU9OID09PT09PT09PT1cbi8vIEFkZCBzZXJ2aWNlIG1vZGFsLCBsb2NhbC9leHRlcm5hbCBzZXJ2aWNlIGNyZWF0aW9uIGZsb3dzLCBhbmQgZXZlbnQgd2lyaW5nLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBTVUJET01BSU4gQVVUTy1ERVJJVkUgPT09PT1cblxuICBmdW5jdGlvbiBkZXJpdmVTdWJkb21haW4obmFtZSkge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJycpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U21hcnRTc2xEZWZhdWx0KCkge1xuICAgIHJldHVybiBTSVRFLmRlZmF1bHRzPy5zc2xUeXBlIHx8IChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyA/ICdsZXRzZW5jcnlwdCcgOiAnY2FkZHktbWFuYWdlZCcpO1xuICB9XG5cbiAgLy8gPT09PT0gU0VSVklDRSBQUkVWSUVXID09PT09XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2VydmljZVByZXZpZXcoKSB7XG4gICAgY29uc3Qgc3ViZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlIHx8IFFVSUNLX0lQUy5sYW4gfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXBvcnQtaW5wdXQnKS52YWx1ZSB8fCBEQy5ERUZBVUxUUy5TRVJWSUNFX1BPUlQ7XG4gICAgY29uc3Qgc3NsVHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKS52YWx1ZTtcbiAgICBjb25zdCBjYU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2EtbmFtZS1pbnB1dCcpLnZhbHVlIHx8ICdzYW1pLWNhJztcbiAgICBjb25zdCBleGlzdGluZ0NhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpLnZhbHVlO1xuICAgIGNvbnN0IGVuYWJsZUF1dGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWF1dGgnKS5jaGVja2VkO1xuICAgIGNvbnN0IGVuYWJsZUNvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWNvcnMnKS5jaGVja2VkO1xuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWhlYWRlcnMtaW5wdXQnKS52YWx1ZTtcbiAgICBjb25zdCB1cHN0cmVhbVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBzdHJlYW0tcGF0aC1pbnB1dCcpLnZhbHVlIHx8ICcvJztcbiAgICBjb25zdCBoZWFsdGhDaGVjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW5wdXQnKS52YWx1ZTtcbiAgICBjb25zdCB0aW1lb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWVvdXQtaW5wdXQnKS52YWx1ZSB8fCAzMDtcblxuICAgIGNvbnN0IGRuc1ByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXByZXZpZXcnKTtcbiAgICBpZiAoZG5zUHJldmlldykgZG5zUHJldmlldy50ZXh0Q29udGVudCA9IGAke2J1aWxkRG9tYWluKHN1YmRvbWFpbil9IFxcdTIxOTIgJHtpcH1gO1xuXG4gICAgY29uc3QgdXJsUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtcHJldmlldycpO1xuICAgIGlmICh1cmxQcmV2aWV3KSB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gYnVpbGRTZXJ2aWNlVXJsKHN1YmRvbWFpbik7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBzdWJkb21haW4sIHBvcnQsIGlwLCBzc2xUeXBlLCBjYU5hbWUsIGV4aXN0aW5nQ2EsXG4gICAgICBlbmFibGVBdXRoLCBlbmFibGVDb3JzLCBjdXN0b21IZWFkZXJzLCB1cHN0cmVhbVBhdGgsIGhlYWx0aENoZWNrLCB0aW1lb3V0XG4gICAgfTtcblxuICAgIGNvbnN0IGNhZGR5Q29uZmlnID0gd2luZG93LmdlbmVyYXRlQ2FkZHlDb25maWcoY29uZmlnKTtcbiAgICBjb25zdCBjb25maWdQcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhZGR5LWNvbmZpZy1wcmV2aWV3Jyk7XG4gICAgaWYgKGNvbmZpZ1ByZXZpZXcpIGNvbmZpZ1ByZXZpZXcudmFsdWUgPSBjYWRkeUNvbmZpZztcbiAgfVxuXG4gIC8vID09PT09IFFVSUNLIElQIENPTkZJR1VSQVRJT04gPT09PT1cblxuICBjb25zdCBRVUlDS19JUFMgPSB7XG4gICAgbG9jYWxob3N0OiAnMTI3LjAuMC4xJyxcbiAgICBsYW46ICcnLFxuICAgIHRhaWxzY2FsZTogJydcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBkZXRlY3ROZXR3b3JrSVBzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25ldHdvcmsvaXBzJywge1xuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMjAwMClcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLmxhbikgUVVJQ0tfSVBTLmxhbiA9IGRhdGEubGFuO1xuICAgICAgICBpZiAoZGF0YS50YWlsc2NhbGUpIFFVSUNLX0lQUy50YWlsc2NhbGUgPSBkYXRhLnRhaWxzY2FsZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBUEkgbm90IGF2YWlsYWJsZVxuICAgIH1cblxuICAgIGNvbnN0IGxhbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1pcC1sYW4nKTtcbiAgICBjb25zdCB0c0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1pcC10YWlsc2NhbGUnKTtcbiAgICBpZiAobGFuQnRuKSB7XG4gICAgICBpZiAoUVVJQ0tfSVBTLmxhbikge1xuICAgICAgICBsYW5CdG4uZGF0YXNldC5pcCA9IFFVSUNLX0lQUy5sYW47XG4gICAgICAgIGxhbkJ0bi50ZXh0Q29udGVudCA9IGBMQU4gKCR7UVVJQ0tfSVBTLmxhbn0pYDtcbiAgICAgICAgbGFuQnRuLnRpdGxlID0gYExBTiBJUDogJHtRVUlDS19JUFMubGFufWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYW5CdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzQnRuKSB7XG4gICAgICBpZiAoUVVJQ0tfSVBTLnRhaWxzY2FsZSkge1xuICAgICAgICB0c0J0bi5kYXRhc2V0LmlwID0gUVVJQ0tfSVBTLnRhaWxzY2FsZTtcbiAgICAgICAgdHNCdG4udGV4dENvbnRlbnQgPSBgVGFpbHNjYWxlICgke1FVSUNLX0lQUy50YWlsc2NhbGV9KWA7XG4gICAgICAgIHRzQnRuLnRpdGxlID0gYFRhaWxzY2FsZSBJUDogJHtRVUlDS19JUFMudGFpbHNjYWxlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0c0J0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpcElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKTtcbiAgICBpZiAoaXBJbnB1dCAmJiAhaXBJbnB1dC52YWx1ZSAmJiBRVUlDS19JUFMubGFuKSBpcElucHV0LnZhbHVlID0gUVVJQ0tfSVBTLmxhbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRRdWlja0lQQnV0dG9ucygpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2staXAtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpcCA9IGJ0bi5kYXRhc2V0LmlwO1xuICAgICAgICBpZiAoaXApIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlID0gaXA7XG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWlwLWJ0bicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpPy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SVAgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1pcC1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBidG4uZGF0YXNldC5pcCA9PT0gY3VycmVudElQKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT0gQUREIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBvcGVuQWRkU2VydmljZU1vZGFsKCkge1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgY29uc3QgbW9kYWxDb250ZW50ID0gbW9kYWwucXVlcnlTZWxlY3RvcignLndlYXRoZXItbW9kYWwtY29udGVudCcpO1xuICAgIGlmIChtb2RhbENvbnRlbnQpIG1vZGFsQ29udGVudC5zY3JvbGxUb3AgPSAwO1xuXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gU2V0IHNtYXJ0IFNTTCBkZWZhdWx0XG4gICAgY29uc3Qgc3NsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzbC10eXBlLXNlbGVjdCcpO1xuICAgIGlmIChzc2xTZWxlY3QpIHNzbFNlbGVjdC52YWx1ZSA9IGdldFNtYXJ0U3NsRGVmYXVsdCgpO1xuXG4gICAgYXdhaXQgZGV0ZWN0TmV0d29ya0lQcygpO1xuXG4gICAgY29uc3QgY2FkZHlmaWxlUGF0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWRkeWZpbGUtcGF0aC1pbnB1dCcpLnZhbHVlIHx8IERDLkRFRkFVTFRTLkNBRERZRklMRTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZEV4aXN0aW5nQ0FzKGNhZGR5ZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgVGFpbHNjYWxlIHN0YXR1c1xuICAgIGNvbnN0IHRhaWxzY2FsZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLXN0YXR1cycpO1xuICAgIGNvbnN0IHRhaWxzY2FsZUNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbnVhbC10YWlsc2NhbGUtb25seScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RhaWxzY2FsZS9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuaW5zdGFsbGVkICYmIGRhdGEuY29ubmVjdGVkKSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5cXHUyNzEzIENvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA2cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaW5zdGFsbGVkKSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2ZmOTgwMDtcIj5cXHUyNkEwIE5vdCBjb25uZWN0ZWQ8L3NwYW4+YDtcbiAgICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrPC9zcGFuPmA7XG4gICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIHRhaWxzY2FsZUNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcblxuICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gIH1cblxuICAvLyA9PT09PSBTRVJWSUNFIFRZUEUgU1dJVENISU5HIChUQUIgU1RZTEUpID09PT09XG5cbiAgZnVuY3Rpb24gc2V0dXBTZXJ2aWNlVHlwZVN3aXRjaGluZygpIHtcbiAgICBjb25zdCBsb2NhbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1sb2NhbCcpO1xuICAgIGNvbnN0IGV4dGVybmFsUmFkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS10eXBlLWV4dGVybmFsJyk7XG4gICAgY29uc3QgbG9jYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9jYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNvbmZpZycpO1xuICAgIGNvbnN0IHRhYkxvY2FsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1sb2NhbCcpO1xuICAgIGNvbnN0IHRhYkV4dGVybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHRlcm5hbCcpO1xuXG4gICAgZnVuY3Rpb24gc3dpdGNoU2VydmljZVR5cGUoKSB7XG4gICAgICBpZiAobG9jYWxSYWRpby5jaGVja2VkKSB7XG4gICAgICAgIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgICAgIGV4dGVybmFsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGlmICh0YWJMb2NhbCkgeyB0YWJMb2NhbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOyB0YWJMb2NhbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iZyknOyB9XG4gICAgICAgIGlmICh0YWJFeHRlcm5hbCkgeyB0YWJFeHRlcm5hbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JzsgdGFiRXh0ZXJuYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJzsgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZXh0ZXJuYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGlmICh0YWJFeHRlcm5hbCkgeyB0YWJFeHRlcm5hbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOyB0YWJFeHRlcm5hbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iZyknOyB9XG4gICAgICAgIGlmICh0YWJMb2NhbCkgeyB0YWJMb2NhbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JzsgdGFiTG9jYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJzsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvY2FsUmFkaW8/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHN3aXRjaFNlcnZpY2VUeXBlKTtcbiAgICBleHRlcm5hbFJhZGlvPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzd2l0Y2hTZXJ2aWNlVHlwZSk7XG4gIH1cblxuICAvLyA9PT09PSBBVVRPLURFUklWRSBTVUJET01BSU4gRlJPTSBOQU1FID09PT09XG5cbiAgZnVuY3Rpb24gc2V0dXBBdXRvU3ViZG9tYWluKCkge1xuICAgIC8vIExvY2FsIHNlcnZpY2U6IG5hbWUgXHUyMTkyIHN1YmRvbWFpbiArIHByZXZpZXdcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1uYW1lLWlucHV0Jyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKTtcbiAgICBjb25zdCBzdWJkb21haW5QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YmRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgbGV0IHVzZXJFZGl0ZWRTdWJkb21haW4gPSBmYWxzZTtcblxuICAgIG5hbWVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkID0gZGVyaXZlU3ViZG9tYWluKG5hbWVJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoIXVzZXJFZGl0ZWRTdWJkb21haW4gJiYgc3ViZG9tYWluSW5wdXQpIHtcbiAgICAgICAgc3ViZG9tYWluSW5wdXQudmFsdWUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgc3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IGRlcml2ZWQgPyBgXFx1MjE5MiAke2J1aWxkRG9tYWluKGRlcml2ZWQpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gICAgfSk7XG5cbiAgICBzdWJkb21haW5JbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICB1c2VyRWRpdGVkU3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgIT09IGRlcml2ZVN1YmRvbWFpbihuYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGNvbnN0IHN1YiA9IHN1YmRvbWFpbklucHV0LnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4obmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBpZiAoc3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBzdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gICAgfSk7XG5cbiAgICAvLyBFeHRlcm5hbCBzZXJ2aWNlOiBuYW1lIFx1MjE5MiBzdWJkb21haW4gKyBwcmV2aWV3XG4gICAgY29uc3QgZXh0TmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbmFtZScpO1xuICAgIGNvbnN0IGV4dFN1YmRvbWFpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluJyk7XG4gICAgY29uc3QgZXh0U3ViZG9tYWluUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zdWJkb21haW4tcHJldmlldycpO1xuICAgIGNvbnN0IGV4dERvbWFpblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtZG9tYWluLXByZXZpZXcnKTtcbiAgICBsZXQgdXNlckVkaXRlZEV4dFN1YmRvbWFpbiA9IGZhbHNlO1xuXG4gICAgZXh0TmFtZUlucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBkZXJpdmVTdWJkb21haW4oZXh0TmFtZUlucHV0LnZhbHVlKTtcbiAgICAgIGlmICghdXNlckVkaXRlZEV4dFN1YmRvbWFpbiAmJiBleHRTdWJkb21haW5JbnB1dCkge1xuICAgICAgICBleHRTdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlcml2ZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzdWIgPSBleHRTdWJkb21haW5JbnB1dD8udmFsdWUgfHwgZGVyaXZlZDtcbiAgICAgIGlmIChleHRTdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dFN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBgXFx1MjE5MiAke2J1aWxkRG9tYWluKHN1Yil9YCA6ICcnO1xuICAgICAgfVxuICAgICAgaWYgKGV4dERvbWFpblByZXZpZXcpIHtcbiAgICAgICAgZXh0RG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGJ1aWxkRG9tYWluKHN1YikgOiAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4dFN1YmRvbWFpbklucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgIHVzZXJFZGl0ZWRFeHRTdWJkb21haW4gPSBleHRTdWJkb21haW5JbnB1dC52YWx1ZSAhPT0gZGVyaXZlU3ViZG9tYWluKGV4dE5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgY29uc3Qgc3ViID0gZXh0U3ViZG9tYWluSW5wdXQudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihleHROYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGlmIChleHRTdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dFN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBgXFx1MjE5MiAke2J1aWxkRG9tYWluKHN1Yil9YCA6ICcnO1xuICAgICAgfVxuICAgICAgaWYgKGV4dERvbWFpblByZXZpZXcpIHtcbiAgICAgICAgZXh0RG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGJ1aWxkRG9tYWluKHN1YikgOiAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IENSRUFURSBFWFRFUk5BTCBTRVJWSUNFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1uYW1lJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGV4dGVybmFsVXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1zdWJkb21haW4nKS52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWUpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1sb2dvJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1pY29uJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGNyZWF0ZURucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1jcmVhdGUtZG5zJykuY2hlY2tlZDtcbiAgICBjb25zdCBjcmVhdGVDYWRkeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1jcmVhdGUtY2FkZHknKS5jaGVja2VkO1xuICAgIGNvbnN0IHByb3h5SXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJveHktaXAnKS52YWx1ZS50cmltKCkgfHwgU0lURS5kbnNJcCB8fCAnbG9jYWxob3N0JztcbiAgICBjb25zdCBwcmVzZXJ2ZUhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJlc2VydmUtaG9zdCcpLmNoZWNrZWQ7XG4gICAgY29uc3QgZm9sbG93UmVkaXJlY3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWZvbGxvdy1yZWRpcmVjdHMnKS5jaGVja2VkO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtY2F0ZWdvcnknKT8udmFsdWUgfHwgJyc7XG5cbiAgICBpZiAoIW5hbWUgfHwgIWV4dGVybmFsVXJsKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZmlsbCBpbiBOYW1lIGFuZCBFeHRlcm5hbCBVUkwnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb3VsZCBub3QgZGVyaXZlIHN1YmRvbWFpbiBmcm9tIG5hbWUuIFBsZWFzZSBzZXQgb25lIGluIE9wdGlvbnMuJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWV4dGVybmFsVXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhZXh0ZXJuYWxVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXh0ZXJuYWwgVVJMIG11c3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb21haW4gPSBidWlsZERvbWFpbihzdWJkb21haW4pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSB7IGRuczogbnVsbCwgY2FkZHk6IG51bGwsIGRhc2hib2FyZDogZmFsc2UgfTtcblxuICAgICAgaWYgKGNyZWF0ZURucykge1xuICAgICAgICBjb25zdCBhZG1pblRva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcbiAgICAgICAgaWYgKGFkbWluVG9rZW4pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZG5zUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvcmVjb3JkJywge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBkb21haW46IGRvbWFpbixcbiAgICAgICAgICAgICAgICBpcDogcHJveHlJcCxcbiAgICAgICAgICAgICAgICB0dGw6IERDLkRFRkFVTFRTLlRUTCxcbiAgICAgICAgICAgICAgICBzZXJ2ZXI6IFNJVEUuZG5zSXBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZG5zUmVzdWx0ID0gYXdhaXQgZG5zUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgcmVzdWx0cy5kbnMgPSBkbnNSZXN1bHQuc3VjY2VzcyA/ICdjcmVhdGVkJyA6IChkbnNSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlc3VsdHMuZG5zID0gZS5tZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRzLmRucyA9ICdubyBhZG1pbiB0b2tlbiAoY29uZmlndXJlIGluIFxcdUQ4M0RcXHVERDExIFRva2VucyknO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjcmVhdGVDYWRkeSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNhZGR5Q29uZmlnID0ge1xuICAgICAgICAgICAgc3ViZG9tYWluOiBzdWJkb21haW4sXG4gICAgICAgICAgICBleHRlcm5hbFVybDogZXh0ZXJuYWxVcmwsXG4gICAgICAgICAgICBwcmVzZXJ2ZUhvc3Q6IHByZXNlcnZlSG9zdCxcbiAgICAgICAgICAgIGZvbGxvd1JlZGlyZWN0czogZm9sbG93UmVkaXJlY3RzLFxuICAgICAgICAgICAgc3NsVHlwZTogJ2NhZGR5LW1hbmFnZWQnLFxuICAgICAgICAgICAgY2FkZHlmaWxlUGF0aDogREMuREVGQVVMVFMuQ0FERFlGSUxFLFxuICAgICAgICAgICAgcmVsb2FkQ2FkZHk6IHRydWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY2FkZHlSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NpdGUvZXh0ZXJuYWwnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY2FkZHlDb25maWcpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBjYWRkeVJlc3VsdCA9IGF3YWl0IGNhZGR5UmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHJlc3VsdHMuY2FkZHkgPSBjYWRkeVJlc3VsdC5zdWNjZXNzID8gJ2NyZWF0ZWQnIDogKGNhZGR5UmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3U2VydmljZSA9IHtcbiAgICAgICAgaWQ6IHN1YmRvbWFpbixcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly8ke2RvbWFpbn1gLFxuICAgICAgICBleHRlcm5hbFVybDogZXh0ZXJuYWxVcmwsXG4gICAgICAgIGxvZ286IGxvZ28gfHwgaWNvbiB8fCAnXFx1RDgzQ1xcdURGMTAnLFxuICAgICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgICBpc0N1c3RvbTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIC8vIE9ubHkgYXR0YWNoIGNhdGVnb3J5IGlmIHVzZXIgYWN0dWFsbHkgcGlja2VkIG9uZVxuICAgICAgaWYgKGNhdGVnb3J5KSBuZXdTZXJ2aWNlLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG5cbiAgICAgIHdpbmRvdy5BUFBTLnB1c2gobmV3U2VydmljZSk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRTZXJ2aWNlcyA9IFsncGxleCcsICdyb3V0ZXInLCAnY2hhdCcsICdzeW5jJywgJ3RvcnJlbnQnLCAncmFkYXJyJywgJ3NvbmFycicsICdwcm93bGFycicsICdwb3J0YWluZXInLCAncmVxdWVzdHMnLCAnamVsbHlmaW4nLCAnZW1ieSddO1xuICAgICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSB3aW5kb3cuQVBQUy5maWx0ZXIoYXBwID0+ICFkZWZhdWx0U2VydmljZXMuaW5jbHVkZXMoYXBwLmlkKSk7XG4gICAgICBzYWZlU2V0KCdjdXN0b20tc2VydmljZXMnLCBKU09OLnN0cmluZ2lmeShjdXN0b21TZXJ2aWNlcykpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh3aW5kb3cuQVBQUylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdG8gc2VydmljZXMuanNvbjonLCBlKTtcbiAgICAgIH1cblxuICAgICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgICAgY2xvc2VBZGRTZXJ2aWNlTW9kYWwoKTtcblxuICAgICAgY29uc3QgcGFydHMgPSBbYEV4dGVybmFsIHNlcnZpY2UgXCIke25hbWV9XCIgYWRkZWQhYF07XG4gICAgICBpZiAoY3JlYXRlRG5zKSBwYXJ0cy5wdXNoKGBETlM6ICR7cmVzdWx0cy5kbnMgPT09ICdjcmVhdGVkJyA/ICdcXHUyNzEzJyA6ICdcXHUyNkEwICcgKyByZXN1bHRzLmRuc31gKTtcbiAgICAgIGlmIChjcmVhdGVDYWRkeSkgcGFydHMucHVzaChgQ2FkZHk6ICR7cmVzdWx0cy5jYWRkeSA9PT0gJ2NyZWF0ZWQnID8gJ1xcdTI3MTMnIDogJ1xcdTI2QTAgJyArIHJlc3VsdHMuY2FkZHl9YCk7XG4gICAgICBwYXJ0cy5wdXNoKGBBY2Nlc3MgYXQ6IGh0dHBzOi8vJHtkb21haW59YCk7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKHBhcnRzLmpvaW4oJyB8ICcpLCAnc3VjY2VzcycsIDYwMDApO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgZXh0ZXJuYWwgc2VydmljZTonLCBlcnJvcik7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBGYWlsZWQgdG8gY3JlYXRlIGV4dGVybmFsIHNlcnZpY2U6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBDTE9TRSBBREQgU0VSVklDRSBNT0RBTCA9PT09PVxuXG4gIGZ1bmN0aW9uIGNsb3NlQWRkU2VydmljZU1vZGFsKCkge1xuICAgIGNsb3NlTW9kYWwoJ2FkZC1zZXJ2aWNlLW1vZGFsJyk7XG5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1uYW1lLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXBvcnQtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUgPSBRVUlDS19JUFMubGFuIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWxvZ28taW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtdHRsLWlucHV0JykudmFsdWUgPSBEQy5ERUZBVUxUUy5UVEw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzbC10eXBlLXNlbGVjdCcpLnZhbHVlID0gZ2V0U21hcnRTc2xEZWZhdWx0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW5hbWUtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtYXV0aCcpLmNoZWNrZWQgPSBmYWxzZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWNvcnMnKS5jaGVja2VkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1oZWFkZXJzLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBzdHJlYW0tcGF0aC1pbnB1dCcpLnZhbHVlID0gJy8nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lb3V0LWlucHV0JykudmFsdWUgPSAnMzAnO1xuXG4gICAgLy8gQ2xlYXIgc3ViZG9tYWluIHByZXZpZXdzXG4gICAgY29uc3Qgc3ViUHJldiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJkb21haW4tcHJldmlldycpO1xuICAgIGlmIChzdWJQcmV2KSBzdWJQcmV2LnRleHRDb250ZW50ID0gJyc7XG4gICAgY29uc3QgZXh0U3ViUHJldiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zdWJkb21haW4tcHJldmlldycpO1xuICAgIGlmIChleHRTdWJQcmV2KSBleHRTdWJQcmV2LnRleHRDb250ZW50ID0gJyc7XG5cbiAgICAvLyBDbGVhciBleHRlcm5hbCBmaWVsZHNcbiAgICBjb25zdCBleHROYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbmFtZScpO1xuICAgIGlmIChleHROYW1lKSBleHROYW1lLnZhbHVlID0gJyc7XG4gICAgY29uc3QgZXh0U3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluJyk7XG4gICAgaWYgKGV4dFN1YikgZXh0U3ViLnZhbHVlID0gJyc7XG4gICAgY29uc3QgZXh0VXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtdXJsJyk7XG4gICAgaWYgKGV4dFVybCkgZXh0VXJsLnZhbHVlID0gJyc7XG4gICAgY29uc3QgZXh0TG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWxvZ28nKTtcbiAgICBpZiAoZXh0TG9nbykgZXh0TG9nby52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dEljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1pY29uJyk7XG4gICAgaWYgKGV4dEljb24pIGV4dEljb24udmFsdWUgPSAnJztcblxuICAgIC8vIENvbGxhcHNlIG9wdGlvbnNcbiAgICBjb25zdCBsb2NhbE9wdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9jYWwtYWR2YW5jZWQtb3B0aW9ucycpO1xuICAgIGlmIChsb2NhbE9wdHMpIGxvY2FsT3B0cy5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTtcbiAgICBjb25zdCBleHRPcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWFkdmFuY2VkLW9wdGlvbnMnKTtcbiAgICBpZiAoZXh0T3B0cykgZXh0T3B0cy5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTtcblxuICAgIC8vIFJlc2V0IHRvIGxvY2FsIHRhYlxuICAgIGNvbnN0IGxvY2FsUmFkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS10eXBlLWxvY2FsJyk7XG4gICAgaWYgKGxvY2FsUmFkaW8pIGxvY2FsUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgY29uc3QgbG9jYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9jYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNvbmZpZycpO1xuICAgIGlmIChsb2NhbENvbmZpZykgbG9jYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdncmlkJztcbiAgICBpZiAoZXh0ZXJuYWxDb25maWcpIGV4dGVybmFsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY29uc3QgdGFiTG9jYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWxvY2FsJyk7XG4gICAgY29uc3QgdGFiRXh0ZXJuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWV4dGVybmFsJyk7XG4gICAgaWYgKHRhYkxvY2FsKSB7IHRhYkxvY2FsLnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tYWNjZW50KSc7IHRhYkxvY2FsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJnKSc7IH1cbiAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkV4dGVybmFsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgfVxuXG4gIC8vID09PT09IENSRUFURSBORVcgU0VSVklDRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1NlcnZpY2UoKSB7XG4gICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLW5hbWUtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3Qgc3ViZG9tYWluID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4obmFtZSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXBvcnQtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbG9nby1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBjcmVhdGVEbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlLWRucy1yZWNvcmQnKS5jaGVja2VkO1xuICAgIGNvbnN0IHR0bCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtdHRsLWlucHV0JykudmFsdWUpIHx8IERDLkRFRkFVTFRTLlRUTDtcbiAgICBjb25zdCB0YWlsc2NhbGVPbmx5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbnVhbC10YWlsc2NhbGUtb25seScpPy5jaGVja2VkIHx8IGZhbHNlO1xuXG4gICAgY29uc3Qgc3NsVHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKT8udmFsdWUgfHwgJ2NhZGR5LW1hbmFnZWQnO1xuICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1uYW1lLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGV4aXN0aW5nQ2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGVuYWJsZUF1dGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWF1dGgnKT8uY2hlY2tlZCB8fCBmYWxzZTtcbiAgICBjb25zdCBlbmFibGVDb3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJyk/LmNoZWNrZWQgfHwgZmFsc2U7XG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20taGVhZGVycy1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCB1cHN0cmVhbVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBzdHJlYW0tcGF0aC1pbnB1dCcpPy52YWx1ZSB8fCAnLyc7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZW91dC1pbnB1dCcpPy52YWx1ZSB8fCAzMDtcblxuICAgIC8vIENhdGVnb3J5IGlzIG9wdGlvbmFsIFx1MjAxNCBwdWxsZWQgZnJvbSBlaXRoZXIgbG9jYWwgb3IgZXh0ZXJuYWwgc2VsZWN0IGJ5IHRoZVxuICAgIC8vIG9wZW5BZGRTZXJ2aWNlTW9kYWwgcmVzZXQuIElmIHVzZXIgZG9lc24ndCBjaG9vc2Ugb25lLCBpdCBzdGF5cyB1bmRlZmluZWRcbiAgICAvLyBhbmQgd2UgZG9uJ3Qgc2VuZCBpdCAoc28gdGhlIGJhY2tlbmQga2VlcHMgdGhlIGV4aXN0aW5nIGJlaGF2aW9yKS5cbiAgICBjb25zdCBjYXRlZ29yeUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtY2F0ZWdvcnktaW5wdXQnKVxuICAgICAgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtY2F0ZWdvcnknKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGNhdGVnb3J5RWw/LnZhbHVlIHx8ICcnO1xuXG4gICAgY29uc3QgZG5zVG9rZW4gPSB3aW5kb3cuZ2V0VG9rZW4oZ2V0UHJpbWFyeURuc0lkKCksICdhZG1pbicpO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFwb3J0IHx8ICFpcCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGZpbGwgaW4gTmFtZSwgUG9ydCwgYW5kIElQIEFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb3VsZCBub3QgZGVyaXZlIHN1YmRvbWFpbiBmcm9tIG5hbWUuIFBsZWFzZSBzZXQgb25lIGluIE9wdGlvbnMuJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3JlYXRlRG5zICYmICFkbnNUb2tlbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRE5TIEFkbWluIHRva2VuIHJlcXVpcmVkLiBDb25maWd1cmUgaXQgaW4gdGhlIFRva2VucyBtZW51IGZpcnN0LicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0cyA9IHsgZG5zOiBudWxsLCBjYWRkeTogbnVsbCwgZGFzaGJvYXJkOiBmYWxzZSB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjcmVhdGVEbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3aW5kb3cuY3JlYXRlRG5zUmVjb3JkKHN1YmRvbWFpbiwgaXAsIHR0bCk7XG4gICAgICAgICAgcmVzdWx0cy5kbnMgPSAnY3JlYXRlZCc7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRE5TIGNyZWF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgcmVzdWx0cy5kbnMgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRE5TIGNyZWF0aW9uIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzLmRucyA9ICdza2lwcGVkJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FkZHlDb25maWcgPSB3aW5kb3cuZ2VuZXJhdGVDYWRkeUNvbmZpZyh7XG4gICAgICAgIHN1YmRvbWFpbiwgcG9ydCwgaXAsIHNzbFR5cGUsIGNhTmFtZSwgZXhpc3RpbmdDYSxcbiAgICAgICAgZW5hYmxlQXV0aCwgZW5hYmxlQ29ycywgY3VzdG9tSGVhZGVycywgdXBzdHJlYW1QYXRoLCBoZWFsdGhDaGVjaywgdGltZW91dCwgdGFpbHNjYWxlT25seVxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhZGR5UmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zaXRlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGRvbWFpbjogYnVpbGREb21haW4oc3ViZG9tYWluKSxcbiAgICAgICAgICAgIHVwc3RyZWFtOiBgJHtpcH06JHtwb3J0fWAsXG4gICAgICAgICAgICBjb25maWc6IGNhZGR5Q29uZmlnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGNhZGR5UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gJ2FkZGVkICYgcmVsb2FkZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhZGR5IGNvbmZpZ3VyYXRpb24gZmFpbGVkOicsIGNhZGR5UmVzdWx0LmVycm9yKTtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gY2FkZHlSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCc7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYWRkeSBjb25maWd1cmF0aW9uIGZhaWxlZDogJHtjYWRkeVJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2FkZHkgQVBJIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FkZHkgQVBJIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VDb25maWcgPSB7XG4gICAgICAgIG5hbWUsIHN1YmRvbWFpbiwgcG9ydCwgaXAsXG4gICAgICAgIGxvZ286IGxvZ28gfHwgYC9hc3NldHMvJHtzdWJkb21haW59LnBuZ2AsXG4gICAgICAgIHRhaWxzY2FsZU9ubHk6IHRhaWxzY2FsZU9ubHkgfHwgZmFsc2VcbiAgICAgIH07XG4gICAgICAvLyBPbmx5IGluY2x1ZGUgY2F0ZWdvcnkgaWYgdXNlciBhY3R1YWxseSBwaWNrZWQgb25lXG4gICAgICBpZiAoY2F0ZWdvcnkpIHNlcnZpY2VDb25maWcuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcblxuICAgICAgYXdhaXQgd2luZG93LmFkZFNlcnZpY2VUb0NvbmZpZyhzZXJ2aWNlQ29uZmlnKTtcbiAgICAgIHJlc3VsdHMuZGFzaGJvYXJkID0gdHJ1ZTtcblxuICAgICAgY29uc3Qgc3RhdHVzUGFydHMgPSBbXG4gICAgICAgIGBETlM6ICR7cmVzdWx0cy5kbnMgPT09ICdjcmVhdGVkJyA/ICdcXHUyNzEzJyA6IHJlc3VsdHMuZG5zID09PSAnc2tpcHBlZCcgPyAnXFx1MjVDQicgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgYENhZGR5OiAke3Jlc3VsdHMuY2FkZHkgPT09ICdhZGRlZCAmIHJlbG9hZGVkJyA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICBgRGFzaGJvYXJkOiAke3Jlc3VsdHMuZGFzaGJvYXJkID8gJ1xcdTI3MTMnIDogJ1xcdTI3MTcnfWBcbiAgICAgIF07XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXJ2aWNlIFwiJHtuYW1lfVwiIGNyZWF0ZWQhICR7c3RhdHVzUGFydHMuam9pbignIHwgJyl9IFxcdTIwMTQgJHtidWlsZFNlcnZpY2VVcmwoc3ViZG9tYWluKX0ke3RhaWxzY2FsZU9ubHkgPyAnIChUYWlsc2NhbGUpJyA6ICcnfWAsICdzdWNjZXNzJywgNjAwMCk7XG5cbiAgICAgIGNsb3NlQWRkU2VydmljZU1vZGFsKCk7XG5cbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgc2VydmljZTonLCBlcnJvcik7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvciBjcmVhdGluZyBcIiR7bmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDYwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IEVWRU5UIExJU1RFTkVSUyA9PT09PVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5BZGRTZXJ2aWNlTW9kYWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VBZGRTZXJ2aWNlTW9kYWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UtY3JlYXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHNlcnZpY2VUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNlcnZpY2UtdHlwZVwiXTpjaGVja2VkJyk/LnZhbHVlO1xuICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgY3JlYXRlRXh0ZXJuYWxTZXJ2aWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWF0ZU5ld1NlcnZpY2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmcoKTtcbiAgc2V0dXBBdXRvU3ViZG9tYWluKCk7XG4gIGluaXRRdWlja0lQQnV0dG9ucygpO1xuXG4gIC8vIFNTTCB0eXBlIGNoYW5nZSBoYW5kbGVyXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBleGlzdGluZ0NhQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLWNvbmZpZycpO1xuICAgIGNvbnN0IGN1c3RvbUNhQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1jYS1jb25maWcnKTtcblxuICAgIGV4aXN0aW5nQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjdXN0b21DYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKGUudGFyZ2V0LnZhbHVlID09PSAnZXhpc3RpbmctY2EnKSB7XG4gICAgICBleGlzdGluZ0NhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gZWxzZSBpZiAoZS50YXJnZXQudmFsdWUgPT09ICdjdXN0b20tY2EnKSB7XG4gICAgICBjdXN0b21DYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICB9KTtcblxuICAvLyBSZWZyZXNoIENBcyBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gtY2FzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoLWNhcycpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudDtcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSAnXFx1MjMxQiBMb2FkaW5nLi4uJztcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhZGR5ZmlsZVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FkZHlmaWxlLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCBEQy5ERUZBVUxUUy5DQUREWUZJTEU7XG4gICAgICBhd2FpdCB3aW5kb3cubG9hZEV4aXN0aW5nQ0FzKGNhZGR5ZmlsZVBhdGgpO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUgUmVmcmVzaGVkJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1xcdTI3NEMgRmFpbGVkJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIENBczonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9LCAyMDAwKTtcbiAgfSk7XG5cbiAgLy8gRE5TIHJlY29yZCBjaGVja2JveCBoYW5kbGVyXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGUtZG5zLXJlY29yZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGRuc0NvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtY29uZmlnJyk7XG4gICAgZG5zQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSBlLnRhcmdldC5jaGVja2VkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfSk7XG5cbiAgLy8gUmVhbC10aW1lIHByZXZpZXcgdXBkYXRlc1xuICBbJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JywgJ3NlcnZpY2UtaXAtaW5wdXQnLCAnc2VydmljZS1wb3J0LWlucHV0JywgJ2NhLW5hbWUtaW5wdXQnLFxuICAgJ2V4aXN0aW5nLWNhLXNlbGVjdCcsICdlbmFibGUtYXV0aCcsICdlbmFibGUtY29ycycsICdjdXN0b20taGVhZGVycy1pbnB1dCcsICd1cHN0cmVhbS1wYXRoLWlucHV0JyxcbiAgICdoZWFsdGgtY2hlY2staW5wdXQnLCAndGltZW91dC1pbnB1dCddLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB1cGRhdGVTZXJ2aWNlUHJldmlldyk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IENVU1RPTSBTRVJWSUNFUyBGUk9NIExPQ0FMU1RPUkFHRSA9PT09PVxuXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21TZXJ2aWNlcygpIHtcbiAgICBjb25zdCBjdXN0b21TZXJ2aWNlcyA9IHNhZmVHZXQoJ2N1c3RvbS1zZXJ2aWNlcycpO1xuICAgIGlmIChjdXN0b21TZXJ2aWNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBKU09OLnBhcnNlKGN1c3RvbVNlcnZpY2VzKTtcbiAgICAgICAgc2VydmljZXMuZm9yRWFjaChzZXJ2aWNlID0+IHtcbiAgICAgICAgICBpZiAoIXdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZS5pZCkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5BUFBTLnB1c2goc2VydmljZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBjdXN0b20gc2VydmljZXM6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gPT09PT0gV0lORE9XIEVYUE9SVFMgPT09PT1cblxuICB3aW5kb3cub3BlbkFkZFNlcnZpY2VNb2RhbCA9IG9wZW5BZGRTZXJ2aWNlTW9kYWw7XG4gIHdpbmRvdy5jbG9zZUFkZFNlcnZpY2VNb2RhbCA9IGNsb3NlQWRkU2VydmljZU1vZGFsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBMSVZFIERBU0hCT0FSRCBFVkVOVFMgKFNTRSkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBsZXQgZXMgPSBudWxsO1xuICBsZXQgcmVjb25uZWN0RGVsYXkgPSAxMDAwO1xuICBjb25zdCBNQVhfUkVDT05ORUNUID0gMzAwMDA7XG5cbiAgZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICBpZiAoZXMpIHsgdHJ5IHsgZXMuY2xvc2UoKTsgfSBjYXRjaCAoXykge30gfVxuXG4gICAgZXMgPSBuZXcgRXZlbnRTb3VyY2UoJy9hcGkvdjEvZXZlbnRzL3N0cmVhbScpO1xuXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignY29ubmVjdGVkJywgKCkgPT4ge1xuICAgICAgcmVjb25uZWN0RGVsYXkgPSAxMDAwOyAvLyByZXNldCBiYWNrb2ZmXG4gICAgICBfc3NlRmFpbENvdW50ID0gMDsgLy8gcmVzZXQgZmFpbHVyZSBjb3VudGVyXG4gICAgICBkZWJ1ZygnW1NTRV0gQ29ubmVjdGVkIHRvIGV2ZW50IHN0cmVhbScpO1xuICAgIH0pO1xuXG4gICAgLy8gSGVhbHRoIHN0YXR1cyBjaGFuZ2VzIFx1MjE5MiB1cGRhdGUgY2FyZCBkb3RzL2JhZGdlcyBpbiByZWFsIHRpbWVcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdzdGF0dXMtY2hhbmdlJywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmIChkLnNlcnZpY2VJZCAmJiB0eXBlb2Ygd2luZG93LnNldEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgdXAgPSBkLnN0YXR1cyA9PT0gJ3VwJyB8fCBkLnN0YXR1cyA9PT0gJ2hlYWx0aHknO1xuICAgICAgICAgIHdpbmRvdy5zZXRCYWRnZShkLnNlcnZpY2VJZCwgdXAsIGQucmVzcG9uc2VUaW1lIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gUmVzb3VyY2UgYWxlcnRzIFx1MjE5MiB0b2FzdCBub3RpZmljYXRpb25cbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdyZXNvdXJjZS1hbGVydCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBjb25zdCBtc2cgPSBgJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH06ICR7ZC5tZXRyaWN9IGF0ICR7ZC52YWx1ZX0lICh0aHJlc2hvbGQ6ICR7ZC50aHJlc2hvbGR9JSlgO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKG1zZywgJ3dhcm5pbmcnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIENvbnRhaW5lciBhdXRvLXJlc3RhcnRcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdhdXRvLXJlc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgQ29udGFpbmVyIFwiJHtkLmNvbnRhaW5lck5hbWV9XCIgd2FzIGF1dG8tcmVzdGFydGVkYCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBhdmFpbGFibGUgXHUyMTkyIHNob3cgbm90aWZpY2F0aW9uIGRvdCBvbiBVcGRhdGVzIGJ1dHRvblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1hdmFpbGFibGUnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgY29uc3QgdXBkYXRlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWJ0bicpO1xuICAgICAgICBpZiAodXBkYXRlc0J0biAmJiAhdXBkYXRlc0J0bi5xdWVyeVNlbGVjdG9yKCcuc3NlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAnc3NlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpO21hcmdpbi1sZWZ0OjZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7JztcbiAgICAgICAgICB1cGRhdGVzQnRuLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH1gLCAnaW5mbycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHN0YXJ0L2NvbXBsZXRlL2ZhaWxlZFxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1jb21wbGV0ZScsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBVcGRhdGUgY29tcGxldGVkOiAke2QuY29udGFpbmVyTmFtZSB8fCBkLmNvbnRhaW5lcklkfWAsICdzdWNjZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBhIGRhc2hib2FyZCByZWZyZXNoXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcigndXBkYXRlLWZhaWxlZCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBVcGRhdGUgZmFpbGVkOiAke2QuY29udGFpbmVyTmFtZSB8fCBkLmNvbnRhaW5lcklkfSBcdTIwMTQgJHtkLmVycm9yIHx8ICd1bmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIEluY2lkZW50c1xuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ2luY2lkZW50JywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgSW5jaWRlbnQ6ICR7ZC5tZXNzYWdlIHx8IGQuc2VydmljZUlkfWAsICdlcnJvcicpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZXNvbHZlZDogJHtkLnNlcnZpY2VJZCB8fCAnaW5jaWRlbnQnfWAsICdzdWNjZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gUmVjb25uZWN0IG9uIGVycm9yXG4gICAgZXMub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGVzLmNsb3NlKCk7XG4gICAgICAvLyBTdG9wIHJlY29ubmVjdGluZyBlbnRpcmVseSBhZnRlciBtdWx0aXBsZSBjb25zZWN1dGl2ZSBmYWlsdXJlc1xuICAgICAgLy8gKGxpa2VseSBhdXRoLWdhdGUgLyBzZXNzaW9uIGV4cGlyZWQgXHUyMDE0IG5vIHBvaW50IGhhbW1lcmluZyBmb3JldmVyKVxuICAgICAgX3NzZUZhaWxDb3VudCA9IChfc3NlRmFpbENvdW50IHx8IDApICsgMTtcbiAgICAgIGlmIChfc3NlRmFpbENvdW50ID4gNSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTU0VdIE1heCByZWNvbm5lY3QgYXR0ZW1wdHMgcmVhY2hlZCBcdTIwMTQgc3RvcHBpbmcgKGF1dGggZ2F0ZSBhY3RpdmUgb3Igc2VydmVyIHVucmVhY2hhYmxlKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYFtTU0VdIERpc2Nvbm5lY3RlZCwgcmVjb25uZWN0aW5nIGluICR7cmVjb25uZWN0RGVsYXkgLyAxMDAwfXMuLi5gKTtcbiAgICAgIHNldFRpbWVvdXQoY29ubmVjdCwgcmVjb25uZWN0RGVsYXkpO1xuICAgICAgcmVjb25uZWN0RGVsYXkgPSBNYXRoLm1pbihyZWNvbm5lY3REZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1QpO1xuICAgIH07XG4gIH1cblxuICBsZXQgX3NzZUZhaWxDb3VudCA9IDA7XG5cbiAgLy8gU3RhcnQgb24gcGFnZSBsb2FkXG4gIGNvbm5lY3QoKTtcblxuICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZ1xuICB3aW5kb3cuX3NzZVJlY29ubmVjdCA9IGNvbm5lY3Q7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIEZJTFRFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLXNlYXJjaCcpO1xuICBjb25zdCBzdGF0dXNTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItc3RhdHVzJyk7XG4gIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWNhdGVnb3J5Jyk7XG4gIGNvbnN0IGNvdW50U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1jb3VudCcpO1xuXG4gIC8vIEJ1aWxkIGEgc2luZ2xlIGNhdGVnb3J5IGxpc3QgZnJvbSBib3RoIHRoZSBBUEkgY2F0ZWdvcmllcyBhbmQgYW55XG4gIC8vIGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgYWN0dWFsIHJlbmRlcmVkIGNhcmRzIChjb3ZlcnMgY3VzdG9tIHNlcnZpY2VzXG4gIC8vIHdob3NlIGNhdGVnb3J5IGlzbid0IGluIFRFTVBMQVRFX0NBVEVHT1JJRVMpLlxuICBmdW5jdGlvbiBnZXRDYXRlZ29yeUxpc3QoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBmcm9tQ2FyZHMgPSBuZXcgU2V0KCk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkW2RhdGEtY2F0ZWdvcnldJykuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IGNhdCA9IGMuZGF0YXNldC5jYXRlZ29yeS50cmltKCk7XG4gICAgICBpZiAoY2F0KSBmcm9tQ2FyZHMuYWRkKGNhdCk7XG4gICAgfSk7XG4gICAgY29uc3QgYXBpQ2F0cyA9ICh3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSkgfHwge307XG4gICAgY29uc3QgYWxsID0gT2JqZWN0LmtleXMoYXBpQ2F0cykuY29uY2F0KFsuLi5mcm9tQ2FyZHNdLmZpbHRlcihjID0+ICFhcGlDYXRzW2NdKSk7XG4gICAgYWxsLmZvckVhY2goYyA9PiBzZWVuLmFkZChjKSk7XG4gICAgcmV0dXJuIHsgbGlzdDogWy4uLnNlZW5dLCBhcGlDYXRzIH07XG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpIHtcbiAgICBpZiAoIWNhdGVnb3J5U2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgeyBsaXN0LCBhcGlDYXRzIH0gPSBnZXRDYXRlZ29yeUxpc3QoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0ZWdvcnlTZWxlY3QudmFsdWU7XG4gICAgY2F0ZWdvcnlTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgQ2F0ZWdvcmllczwvb3B0aW9uPic7XG4gICAgbGlzdC5zb3J0KCkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGluZm8gPSBhcGlDYXRzW25hbWVdO1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gaW5mbyA/IGAke2luZm8uaWNvbiB8fCAnJ30gJHtuYW1lfWAudHJpbSgpIDogbmFtZTtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzXG4gICAgaWYgKGN1cnJlbnQgJiYgWy4uLmNhdGVnb3J5U2VsZWN0Lm9wdGlvbnNdLnNvbWUobyA9PiBvLnZhbHVlID09PSBjdXJyZW50KSkge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QudmFsdWUgPSBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXRlZ29yeVNlbGVjdC52YWx1ZSA9ICdhbGwnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZpbHRlcigpIHtcbiAgICByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoSW5wdXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gc3RhdHVzU2VsZWN0LnZhbHVlOyAvLyAnYWxsJywgJ29uJywgb3IgJ29mZidcbiAgICBjb25zdCBjYXRlZ29yeUZpbHRlciA9IGNhdGVnb3J5U2VsZWN0ID8gY2F0ZWdvcnlTZWxlY3QudmFsdWUgOiAnYWxsJztcblxuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAnb2ZmJzsgLy8gJ29uJyBvciAnb2ZmJ1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBjYXJkLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG5cbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhcXVlcnkgfHwgbmFtZS5pbmNsdWRlcyhxdWVyeSkgfHwgYXBwLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgIGNvbnN0IG1hdGNoZXNTdGF0dXMgPSBzdGF0dXNGaWx0ZXIgPT09ICdhbGwnIHx8IHN0YXR1cyA9PT0gc3RhdHVzRmlsdGVyO1xuICAgICAgY29uc3QgbWF0Y2hlc0NhdGVnb3J5ID0gY2F0ZWdvcnlGaWx0ZXIgPT09ICdhbGwnIHx8IGNhdGVnb3J5ID09PSBjYXRlZ29yeUZpbHRlcjtcblxuICAgICAgaWYgKG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXR1cyAmJiBtYXRjaGVzQ2F0ZWdvcnkpIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHZpc2libGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50U3Bhbikge1xuICAgICAgY29uc3QgdG90YWwgPSBjYXJkcy5sZW5ndGg7XG4gICAgICBjb3VudFNwYW4udGV4dENvbnRlbnQgPSBgJHt2aXNpYmxlQ291bnR9IG9mICR7dG90YWx9IHNlcnZpY2VzYDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWJvdW5jZSBoZWxwZXJcbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIGRlbGF5KSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCBkZWxheSk7XG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaElucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKHVwZGF0ZUZpbHRlciwgMjAwKSk7XG4gIHN0YXR1c1NlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRmlsdGVyKTtcbiAgY2F0ZWdvcnlTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUZpbHRlcik7XG5cbiAgLy8gSW5pdGlhbCBjb3VudCBvbiBwYWdlIGxvYWRcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBzZXRUaW1lb3V0KHVwZGF0ZUZpbHRlciwgNTAwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCh1cGRhdGVGaWx0ZXIsIDUwMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGV4dGVybmFsIHRyaWdnZXJzIChjYWxsZWQgYWZ0ZXIgYnVpbGRHcmlkIHRvIHJlcG9wdWxhdGUgY2F0ZWdvcmllcylcbiAgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyID0gdXBkYXRlRmlsdGVyO1xuICB3aW5kb3cucmVmcmVzaENhdGVnb3J5RHJvcGRvd24gPSByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bjtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEJBVENIIENPTlRBSU5FUiBPUEVSQVRJT05TID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgYmF0Y2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtb3BlcmF0aW9ucy1idG4nKTtcbiAgY29uc3QgYmF0Y2hCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtYWN0aW9uLWJhcicpO1xuICBjb25zdCBiYXRjaENvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXNlbGVjdGVkLWNvdW50Jyk7XG4gIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0b3AtYnRuJyk7XG4gIGNvbnN0IHJlc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtcmVzdGFydC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLWNhbmNlbC1idG4nKTtcblxuICBsZXQgYmF0Y2hNb2RlID0gZmFsc2U7XG4gIGxldCBzZWxlY3RlZENvbnRhaW5lcnMgPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gZW50ZXJCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gdHJ1ZTtcbiAgICBzZWxlY3RlZENvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICBiYXRjaEJhci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYmF0Y2hCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIEV4aXQgQmF0Y2ggTW9kZSc7XG4gICAgdXBkYXRlU2VsZWN0ZWRDb3VudCgpO1xuICAgIFxuICAgIC8vIEFkZCBjaGVja2JveGVzIHRvIGFsbCBjYXJkcyB3aXRoIGNvbnRhaW5lcklkXG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmRbZGF0YS1hcHBdJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY2FyZC5kYXRhc2V0LmNvbnRhaW5lcklkO1xuICAgICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2hlY2tib3ggaWYgYW55XG4gICAgICBjb25zdCBleGlzdGluZyA9IGNhcmQucXVlcnlTZWxlY3RvcignLmJhdGNoLWNoZWNrYm94Jyk7XG4gICAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdiYXRjaC1jaGVja2JveCc7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LmNvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LnNlcnZpY2VOYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCBjb250YWluZXJJZDtcbiAgICAgIGNoZWNrYm94LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IDhweDsgbGVmdDogOHB4OyB6LWluZGV4OiAxMDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5hZGQoY29udGFpbmVySWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICAgIH0pO1xuICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICBjYXJkLmluc2VydEJlZm9yZShjaGVja2JveCwgY2FyZC5maXJzdENoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRDb250YWluZXJzLmNsZWFyKCk7XG4gICAgYmF0Y2hCYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXRjaEJ0bi50ZXh0Q29udGVudCA9ICdcdTI2MzAgQmF0Y2ggT3BlcmF0aW9ucyc7XG4gICAgXG4gICAgLy8gUmVtb3ZlIGFsbCBjaGVja2JveGVzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhdGNoLWNoZWNrYm94JykuZm9yRWFjaChjYiA9PiBjYi5yZW1vdmUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENvdW50KCkge1xuICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0ZWRDb250YWluZXJzLnNpemU7XG4gICAgYmF0Y2hDb3VudC50ZXh0Q29udGVudCA9IGAke2NvdW50fSBzZWxlY3RlZGA7XG4gICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcbiAgICBzdG9wQnRuLmRpc2FibGVkID0gY291bnQgPT09IDA7XG4gICAgcmVzdGFydEJ0bi5kaXNhYmxlZCA9IGNvdW50ID09PSAwO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGVkQ29udGFpbmVycy5zaXplID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVycyA9IEFycmF5LmZyb20oc2VsZWN0ZWRDb250YWluZXJzKTtcbiAgICBjb25zdCBhY3Rpb25MYWJlbCA9IHsgc3RhcnQ6ICdTdGFydGluZycsIHN0b3A6ICdTdG9wcGluZycsIHJlc3RhcnQ6ICdSZXN0YXJ0aW5nJyB9W2FjdGlvbl07XG4gICAgXG4gICAgaWYgKCFjb25maXJtKGAke2FjdGlvbkxhYmVsfSAke2NvbnRhaW5lcnMubGVuZ3RofSBjb250YWluZXIocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGJ0bnMgPSBbc3RhcnRCdG4sIHN0b3BCdG4sIHJlc3RhcnRCdG5dO1xuICAgIGJ0bnMuZm9yRWFjaChiID0+IHsgYi5kaXNhYmxlZCA9IHRydWU7IGIudGV4dENvbnRlbnQgPSAnLi4uJzsgfSk7XG4gICAgXG4gICAgbGV0IHN1Y2Nlc3MgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgY29udGFpbmVySWQgb2YgY29udGFpbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9LyR7YWN0aW9ufWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIHN1Y2Nlc3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgICBlcnJvcnMucHVzaChgJHtjb250YWluZXJJZH06ICR7ZGF0YS5lcnJvciB8fCByZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7Y29udGFpbmVySWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVzdG9yZSBidXR0b25zXG4gICAgYnRuc1swXS50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RhcnQgQWxsJztcbiAgICBidG5zWzFdLnRleHRDb250ZW50ID0gJ1x1MkIxQiBTdG9wIEFsbCc7XG4gICAgYnRuc1syXS50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMDQgUmVzdGFydCBBbGwnO1xuICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICBcbiAgICAvLyBTaG93IHJlc3VsdHNcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHthY3Rpb25MYWJlbH0gY29tcGxldGVkOiAke3N1Y2Nlc3N9IGNvbnRhaW5lcihzKWAsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2FjdGlvbkxhYmVsfTogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLCAnd2FybmluZycpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignQmF0Y2ggb3BlcmF0aW9uIGVycm9yczonLCBlcnJvcnMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWZyZXNoIGRhc2hib2FyZCBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHJlZnJlc2hBbGwoKTtcbiAgICB9LCAxNTAwKTtcbiAgfVxuXG4gIGJhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoYmF0Y2hNb2RlKSB7XG4gICAgICBleGl0QmF0Y2hNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyQmF0Y2hNb2RlKCk7XG4gICAgfVxuICB9KTtcblxuICBzdGFydEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBiYXRjaEFjdGlvbignc3RhcnQnKSk7XG4gIHN0b3BCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3N0b3AnKSk7XG4gIHJlc3RhcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3Jlc3RhcnQnKSk7XG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleGl0QmF0Y2hNb2RlKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FLQyxTQUFTQSxFQUFRLENBQ2hCLGFBRUEsTUFBTUMsQ0FBYSxDQUNqQixhQUFjLENBQ1osS0FBSyxPQUFTLENBQUMsRUFDZixLQUFLLFVBQVksRUFDbkIsQ0FRQSxTQUFTQyxFQUFTQyxFQUFPQyxFQUFXLENBQUMsRUFBRyxDQUN0QyxNQUFNQyxFQUFhLENBQ2pCLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUNsQyxRQUFBSCxFQUNBLFFBQVNDLGFBQWlCLE1BQVFBLEVBQU0sUUFBVUEsRUFDbEQsTUFBT0EsYUFBaUIsTUFBUUEsRUFBTSxNQUFRLEtBQzlDLFNBQUFDLENBQ0YsRUFHQSxLQUFLLE9BQU8sS0FBS0MsQ0FBVSxFQUd2QixLQUFLLE9BQU8sT0FBUyxLQUFLLFdBQzVCLEtBQUssT0FBTyxNQUFNLEVBSXBCLFFBQVEsTUFBTSxzQkFBc0JILENBQU8sSUFBS0MsRUFBT0MsQ0FBUSxDQUlqRSxDQVFBLGlCQUFpQkQsRUFBT0csRUFBYSxDQUduQyxPQUZrQixLQUFLLGNBQWNILENBQUssRUFFdkIsQ0FDakIsSUFBSyxvQkFDSCxZQUFLLFNBQVMsb0JBQXFCQSxFQUFPLENBQUUsWUFBQUcsQ0FBWSxDQUFDLEVBQ2xELENBQ0wsT0FBUSxZQUNSLFNBQVVBLEVBQWMsRUFDeEIsUUFBUyxpREFDWCxFQUVGLElBQUssc0JBQ0gsWUFBSyxTQUFTLHNCQUF1QkgsQ0FBSyxFQUNuQyxDQUNMLE9B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LFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGlCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGtCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxLQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxNQUFrQixD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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBa0czQixFQUVQLFlBQVksdUJBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQTZCN0IsRUFFUCxZQUFZLG9CQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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LEVBQUUsWUFBYyx3QkFDdEJSLEVBQW9CLEVBR2hCVSxJQUFXLEVBQ1QsT0FBTyxrQkFBcUIsWUFDOUIsaUJBQWlCLEdBQUdILENBQVcsZUFBZUUsQ0FBTyxnQkFBaUIsU0FBUyxHQUc3RSxPQUFPLGtCQUFxQixZQUM5QixpQkFBaUIsR0FBR0YsQ0FBVyxLQUFLRSxDQUFPLGVBQWVDLENBQU0sVUFBVyxTQUFTLEVBRXRGLFFBQVEsTUFBTSwwQkFBMkJDLENBQU0sR0FJakQsV0FBVyxJQUFNLENBQ1gsT0FBTyxZQUFlLFlBQVksV0FBVyxDQUNuRCxFQUFHLElBQUksQ0FDVCxDQUVBbkIsR0FBVSxpQkFBaUIsUUFBUyxJQUFNLENBQ3BDSyxFQUNGSyxFQUFjLEVBRWRILEVBQWUsQ0FFbkIsQ0FBQyxFQUVESixHQUFVLGlCQUFpQixRQUFTLElBQU1TLEVBQVksT0FBTyxDQUFDLEVBQzlEUixHQUFTLGlCQUFpQixRQUFTLElBQU1RLEVBQVksTUFBTSxDQUFDLEVBQzVEeFAsR0FBWSxpQkFBaUIsUUFBUyxJQUFNd1AsRUFBWSxTQUFTLENBQUMsRUFDbEVsSSxHQUFXLGlCQUFpQixRQUFTZ0ksQ0FBYSxDQUNwRCxHQUFHIiwKICAibmFtZXMiOiBbIndpbmRvdyIsICJFcnJvckhhbmRsZXIiLCAiY29udGV4dCIsICJlcnJvciIsICJtZXRhZGF0YSIsICJlcnJvckVudHJ5IiwgImN1cnJlbnRTdGVwIiwgIm1lc3NhZ2UiLCAic3RhdHMiLCAidHlwZSIsICJmYWxsYmFja01lc3NhZ2UiLCAibWVtb3J5U3RvcmFnZSIsICJrZXkiLCAidmFsdWUiLCAicmF3IiwgInMiLCAiciIsICJjIiwgImsiLCAidiIsICJ0b2tlbnNCdG4iLCAiZWwiLCAidGxkU3VmZml4IiwgInByb3h5SXBJbnB1dCIsICJzdWIiLCAiZG5zSWQiLCAiaWQiLCAiaW5mbyIsICJ0b3BSb3ciLCAiZG5zSWRzIiwgInN2Z0ljb24iLCAiZmlyc3RDaGlsZCIsICJzYWZlSWQiLCAibGFiZWwiLCAiY2FyZCIsICJyZXNwb25zZSIsICJ1cmwiLCAib3B0aW9ucyIsICJtZXRob2QiLCAibmVlZHNDc3JmIiwgInRva2VuIiwgImJvZHkiLCAiZnJlc2hUb2tlbiIsICJkYXRhIiwgInJlc3AiLCAicmVzdWx0IiwgIm1zZyIsICJidG4iLCAibG9hZGluZ1RleHQiLCAiYXN5bmNGbiIsICJvcHRzIiwgIm9yaWdpbmFsIiwgInN1Y2Nlc3NUZXh0IiwgInJlc2V0RGVsYXkiLCAiZSIsICJtb2RhbCIsICJjbG9zZUJ0bnMiLCAidGV4dCIsICJkdXJhdGlvbiIsICJleGlzdGluZ05vdGlmIiwgImNvbG9ycyIsICJ0cyIsICJkaWZmIiwgImZhbGxiYWNrIiwgImh0bWwiLCAiZXZlbnQiLCAiZm4iLCAiX2EiLCAiaCIsICJhcHBzIiwgImEiLCAiYXBwIiwgImlkeCIsICJjaGFuZ2VzIiwgImNyZWF0ZVNrZWxldG9uQ2FyZCIsICJzaG93U2tlbGV0b25zIiwgImNvdW50IiwgImdyaWQiLCAiaSIsICJzayIsICJoaWRlU2tlbGV0b25zIiwgInNrZWxldG9ucyIsICJUSEVNRV9LRVkiLCAiVVNFUl9USEVNRVNfS0VZIiwgIkxFR0FDWV9DVVNUT01fS0VZIiwgIkJVSUxUSU5fVEhFTUVTIiwgIlRIRU1FUyIsICJUSEVNRV9QUk9QUyIsICJCQVNFX1BST1BTIiwgIkRFUklWRURfUFJPUFMiLCAiVEhFTUVfQ09MT1JTIiwgImhleFRvUmdiIiwgImhleCIsICJyZ2JUb0hleCIsICJnIiwgImIiLCAieCIsICJibGVuZENvbG9ycyIsICJoZXgxIiwgImhleDIiLCAicmF0aW8iLCAiYzEiLCAiYzIiLCAiaGV4THVtaW5hbmNlIiwgImRlcml2ZUV4dGVuZGVkQ29sb3JzIiwgImJnIiwgImZnIiwgIm11dGVkIiwgImNhcmRCYXNlIiwgImRvdE9rIiwgImRvdEJhZCIsICJpc0xpZ2h0IiwgImRlcml2ZWQiLCAiZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyIsICJzbHVnIiwgImFjY2VudCIsICJhY2NlbnRSZ2IiLCAiZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyIsICJnZXRTeXN0ZW1UaGVtZSIsICJjbGVhckN1c3RvbVByb3BlcnRpZXMiLCAicHJvcCIsICJzbHVnaWZ5IiwgIm5hbWUiLCAiY3VycmVudFNsdWciLCAiY2FjaGVkIiwgImJhc2UiLCAiY291bnRlciIsICJpbmplY3RVc2VyVGhlbWVTdHlsZXMiLCAidGhlbWVzRGF0YSIsICJleGlzdGluZyIsICJ1c2VyVGhlbWVzIiwgInNsdWdzIiwgImNzcyIsICJ0aGVtZSIsICJjb2xvck1hcCIsICJwIiwgInN0eWxlIiwgInN5bmNUaGVtZXNGcm9tU2VydmVyIiwgInNlcnZlclRoZW1lcyIsICJjdXJyZW50IiwgImFwcGx5VGhlbWUiLCAibWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lIiwgImxlZ2FjeSIsICJ0aGVtZURhdGEiLCAibW9kZSIsICJ0IiwgIm1ldGEiLCAic2F2ZWRUaGVtZSIsICJtZXRob2RzQ2FjaGUiLCAiZmV0Y2hNZXRob2RzIiwgInJlcyIsICJzaG93UHJvdmlkZXJTZWxlY3RvciIsICJwcm92aWRlcnMiLCAib3ZlcmxheSIsICJvcmlnaW5hbEJvZHkiLCAicHJvdmlkZXJCdXR0b25zIiwgInByb3ZpZGVyIiwgInJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlIiwgInJlc3RvcmVPcmlnaW5hbEJvZHkiLCAiaW5wdXQiLCAic3VibWl0IiwgInN0YXR1cyIsICJiYWNrIiwgImVtYWlsIiwgInZpYSIsICJtYXNrZWQiLCAic2hvdyIsICJzaG93VG90cFdpdGhFbWFpbEZhbGxiYWNrIiwgInRvdHBQcm92aWRlciIsICJlbWFpbEVuYWJsZWQiLCAiZGl2IiwgImlzQWxsb3dlZFJldHVyblVybCIsICJyZXR1cm5VcmwiLCAicGFyc2VkIiwgInN1ZmZpeCIsICJ1cmxQYXJhbXMiLCAidXBkYXRlVG90cExvZ28iLCAibSIsICJsdW0iLCAiZGFyayIsICJsaWdodCIsICJzaG93VG90cE92ZXJsYXkiLCAiZmlyc3RJbnB1dCIsICJoaWRlVG90cE92ZXJsYXkiLCAiYnVpbGRTc29IYW5kb2ZmVGFyZ2V0IiwgInJlZGlyZWN0IiwgImlzUHJpdmF0ZUhvc3QiLCAicmV0dXJuUGF0aCIsICJjb250YWluZXIiLCAiaW5wdXRzIiwgInZhbCIsICJjb2RlIiwgInN1Ym1pdFRvdHBDb2RlIiwgInBhc3RlZCIsICJpbnAiLCAiZXJyb3JFbCIsICJ0YXJnZXQiLCAiaG9zdG5hbWUiLCAiaXNTYW1lT3JpZ2luIiwgImlzT3VyVGxkIiwgImZldGNoUmVjb3ZlcnlJbmZvIiwgInNob3dSZWNvdmVyeUxpbmsiLCAibGluayIsICJvcGVuUmVjb3ZlcnlQYW5lbCIsICJwYW5lbCIsICJzdGF0dXNFbCIsICJpbXBvcnRFbCIsICJ2ZXJpZnlFbCIsICJjbG9zZVJlY292ZXJ5UGFuZWwiLCAic3VibWl0UmVjb3ZlcnlTZWNyZXQiLCAic2VjcmV0IiwgInN1Ym1pdFJlY292ZXJ5Q29kZSIsICJlcnJvckhhbmRsZXIiLCAiY3VycmVudFNlcnZpY2UiLCAiYXJyU2VydmljZXMiLCAicXVhbGl0eVByb2ZpbGVTZXJ2aWNlcyIsICJnZXRTZXJ2aWNlVXJsIiwgInNlcnZpY2UiLCAic2hvd0Vycm9yIiwgImhpZGVFcnJvciIsICJ0aXRsZSIsICJkZXNjIiwgInNlZWRob3N0U2VjdGlvbiIsICJhcGlrZXlTZWN0aW9uIiwgImJhc2ljU2VjdGlvbiIsICJxdWFsaXR5U2VjdGlvbiIsICJpc0V4dCIsICJpc0FyciIsICJoYXNRdWFsaXR5IiwgInF1YWxTZWxlY3QiLCAibG9hZFNlcnZpY2VDcmVkcyIsICJkb3QiLCAiY2xlYXJCdG4iLCAiaGFzQ3JlZHMiLCAic3ZjSWQiLCAibG9hZFF1YWxpdHlQcm9maWxlcyIsICJxdWFsU3RhdHVzIiwgInN2Y1VybCIsICJwYXJhbXMiLCAib3B0IiwgIm1hdGNoNzIwIiwgImFwaUtleSIsICJzYXZlQnRuIiwgInVzZXIiLCAicGFzcyIsICJxdWFsaXR5UHJvZmlsZUlkIiwgInF1YWxpdHlQcm9maWxlTmFtZSIsICJzZWVkRGF0YSIsICJkIiwgImxvYWRUb3RwU2V0dGluZ3MiLCAiZW5hYmxlZCIsICJzZXNzaW9uRHVyYXRpb24iLCAiaXNTZXRVcCIsICJzdGF0dXNEb3QiLCAic3RhdHVzVGV4dCIsICJzdGF0dXNCYW5uZXIiLCAic2V0dXBTZWN0aW9uIiwgInFyU2VjdGlvbiIsICJkdXJhdGlvblNlY3Rpb24iLCAiZGlzYWJsZVNlY3Rpb24iLCAic2V0dXBCdG4iLCAidXBkYXRlQXV0aENhcmQiLCAiRFVSQVRJT05fTEFCRUxTIiwgImFjdGl2ZSIsICJwaWxsIiwgInBheWxvYWQiLCAiYmxvYiIsICJlcnIiLCAiQVBJIiwgIl9lbCIsICJ0YWciLCAiYXR0cnMiLCAiY2hpbGRyZW4iLCAibm9kZSIsICJfZmV0Y2hKU09OIiwgImNzcmYiLCAiX3JlbmRlckJhZGdlIiwgInJvbGUiLCAiX3JlbmRlclVzZXJzTGlzdCIsICJ1c2VycyIsICJvbkNoYW5nZSIsICJ0YWJsZSIsICJ0Ym9keSIsICJ1IiwgInJvdyIsICJlbWFpbENlbGwiLCAicm9sZUNlbGwiLCAiYWN0aW9uc0NlbGwiLCAicm9sZVNlbGVjdCIsICJldiIsICJkZWxCdG4iLCAiX3JlbmRlckludml0ZUZvcm0iLCAib25Jc3N1ZWQiLCAiZm9ybSIsICJmZCIsICJyb2xlU2VsIiwgIl9yZW5kZXJJbnZpdGVzTGlzdCIsICJpbnZpdGVzIiwgImludiIsICJfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyIiwgImludml0ZSIsICJwYXJlbnQiLCAiYmFubmVyIiwgImNvcHlCdG4iLCAibW91bnQiLCAibWVEYXRhIiwgInJlZnJlc2hCdG4iLCAidXNlcnNIZWFkZXIiLCAidXNlcnNMaXN0IiwgInVzZXJzRGF0YSIsICJhZGRVc2VyRm9ybSIsICJpbnZpdGVGb3JtQ29udGFpbmVyIiwgImludml0ZXNMaXN0IiwgImludml0ZXNEYXRhIiwgImlzc3VlZCIsICJvcGVuIiwgImJhY2tkcm9wIiwgImNsb3NlIiwgImF0dGFjaFRyaWdnZXIiLCAiYmFyQ29udGFpbmVyIiwgIl9tYXliZVNob3ciLCAibWUiLCAiZ2V0RG5zSWRzIiwgImdldERuc0Rpc3BsYXlOYW1lIiwgImJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zIiwgImdldEVuY3J5cHRpb25LZXkiLCAib2xkS2V5IiwgImFycmF5IiwgIkVOQ1JZUFRJT05fS0VZIiwgImNyZWRlbnRpYWxFbmNyeXB0IiwgIml2IiwgIml2SGV4IiwgImtleUJ5dGVzIiwgImNoYXJDb2RlIiwgImNyZWRlbnRpYWxEZWNyeXB0IiwgImVuY3J5cHRlZFRleHQiLCAiZGVjb2RlZCIsICJnZXRDcmVkZW50aWFsIiwgInRva2VuVHlwZSIsICJjcmVkVHlwZSIsICJlbmNyeXB0ZWQiLCAic2V0Q3JlZGVudGlhbCIsICJnZXRUb2tlbiIsICJnZXRVc2VybmFtZSIsICJzZXRUb2tlbiIsICJzZXRVc2VybmFtZSIsICJ1c2VybmFtZSIsICJnZXRBbGxDcmVkZW50aWFscyIsICJjbGVhckFsbENyZWRlbnRpYWxzIiwgImdldFN0b3JlZENyZWRlbnRpYWxzIiwgInJlYWRvbmx5VG9rZW4iLCAicmVhZG9ubHlVc2VybmFtZSIsICJhZG1pblRva2VuIiwgImFkbWluVXNlcm5hbWUiLCAib2xkVG9rZW4iLCAib2xkVXNlcm5hbWUiLCAiY3JlZHMiLCAidGFyZ2V0SWQiLCAic2VydmVycyIsICJoYXNBbnlDcmVkcyIsICJlbnRyeSIsICJyb1VzZXIiLCAicm9QYXNzIiwgImFkbWluVXNlciIsICJhZG1pblBhc3MiLCAic2V0UXVpY2siLCAidXAiLCAicmVzcG9uc2VUaW1lIiwgInRpbWVFbCIsICJnZXRSZXNwb25zZVRpbWVDbGFzcyIsICJ0aW1lIiwgImlzVXAiLCAiY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJyZWZyZXNoSW5GbGlnaHQiLCAicmVmcmVzaFF1ZXVlZCIsICJsb2FkU2VydmljZXMiLCAic2VydmljZVVybCIsICJzdmMiLCAiZG5zIiwgImNscyIsICJ0eHQiLCAiYnVpbGRHcmlkIiwgInJvb3QiLCAid3JhcCIsICJpbWciLCAiYXBwSWQiLCAiY2RuVXJscyIsICJ1bmlxdWVVcmxzIiwgIm5leHRJbmRleCIsICJuYW1lU3BhbiIsICJ0c0JhZGdlIiwgImNhdEluZm8iLCAiY2F0QmFkZ2UiLCAidXBkYXRlQmFkZ2UiLCAicmVzcG9uc2VSb3ciLCAidGltZVNwYW4iLCAiaGVhbHRoUm93IiwgInVwdGltZUNoaXAiLCAidXB0aW1lTWluaUJhciIsICJ1cHRpbWVGaWxsIiwgImJ0blJvdyIsICJsb2dzQnRuIiwgInVwZGF0ZUJ0biIsICJleGVjQnRuIiwgImNyZWRzQnRuIiwgIm9wdEJ0biIsICJzaGFyZUJ0biIsICJzZXRCYWRnZSIsICJyZWZyZXNoQWxsIiwgInVwZGF0ZVN0YW1wIiwgImNoZWNrZWRBdCIsICJzdGFtcCIsICJhcHBseUJhdGNoUmVzdWx0cyIsICJzdGF0dXNlcyIsICJyZWZyZXNoRmFsbGJhY2siLCAidG9wQ2hlY2tzIiwgInRvcFJlc3VsdHMiLCAiaW50ZXJuZXRSZXN1bHQiLCAiYmF0Y2hFcnJvciIsICJmYWxsYmFja0Vycm9yIiwgIm9wZW5CdG4iLCAicmVzdGFydERuc1NlcnZpY2UiLCAicmVzdGFydEJ0biIsICJ1cGRhdGVEbnNTZXJ2ZXIiLCAic2VydmVySXAiLCAib3JpZ2luYWxUZXh0IiwgImNoZWNrUmVzdWx0IiwgInVwZGF0ZVJlc3VsdCIsICJkb3dubG9hZEluZm8iLCAiaW5zdHJ1Y3Rpb25zSW5mbyIsICJjdXJyZW50RG5zSWQiLCAib3BlbkRuc1NldHRpbmdzIiwgInNlcnZlciIsICJzYXZlRG5zU2V0dGluZ3MiLCAiaXAiLCAicG9ydCIsICJ1cGRhdGUiLCAiY2xvc2VEbnNTZXR0aW5ncyIsICJyZW1vdmVEbnNTZXJ2ZXIiLCAiY29uZmlnIiwgInNldHRpbmdzQnRuIiwgImN1cnJlbnREbnNTZXJ2aWNlIiwgImxvZ3NJbnRlcnZhbCIsICJsb2dzUGF1c2VkIiwgImN1cnJlbnRDb250YWluZXJJZCIsICJjdXJyZW50Q29udGFpbmVyTmFtZSIsICJjb250YWluZXJMb2dzTW9kZSIsICJjdXJyZW50TG9nUGF0aCIsICJjdXJyZW50TG9nU2VydmljZU5hbWUiLCAiZmlsZUxvZ3NNb2RlIiwgImxvZ0V2ZW50U291cmNlIiwgImlzU3RyZWFtaW5nIiwgImZldGNoRG5zTG9ncyIsICJsaW5lcyIsICJzZXJ2ZXJJUCIsICJnZXRSY29kZUNvbG9yIiwgInJjb2RlIiwgInJlbmRlckRuc0xvZ0VudHJ5IiwgImxvZyIsICJyY29kZUNvbG9yIiwgImlzQmxvY2tlZCIsICJ1cGRhdGVMb2dzRGlzcGxheSIsICJ1cGRhdGVGaWxlTG9nc0Rpc3BsYXkiLCAidXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXkiLCAibG9nc0NvbnRlbnQiLCAibG9nRWxlbWVudCIsICJvcGVuTG9nc01vZGFsIiwgInBhdXNlQnRuIiwgInN0cmVhbUJ0biIsICJjbG9zZUxvZ3NNb2RhbCIsICJzdG9wTG9nU3RyZWFtaW5nIiwgInN0YXJ0TG9nU3RyZWFtaW5nIiwgImNvbnRhaW5lcklkIiwgImlzRXJyb3IiLCAibGV2ZWxDb2xvciIsICJsZXZlbEJhZGdlIiwgImZldGNoQ29udGFpbmVyTG9ncyIsICJlbmRwb2ludCIsICJyZW5kZXJDb250YWluZXJMb2dFbnRyeSIsICJzdHJlYW1Db2xvciIsICJzdHJlYW1CYWRnZSIsICJvcGVuQ29udGFpbmVyTG9nc01vZGFsIiwgImNvbnRhaW5lck5hbWUiLCAiZmV0Y2hGaWxlTG9ncyIsICJsb2dQYXRoIiwgInJlbmRlckZpbGVMb2dFbnRyeSIsICJsb2dMZXZlbCIsICJvcGVuRmlsZUxvZ3NNb2RhbCIsICJzZXJ2aWNlTmFtZSIsICJsb2FkRXhpc3RpbmdDQXMiLCAiY2FkZHlmaWxlUGF0aCIsICJzZWxlY3QiLCAiY2EiLCAib3B0aW9uIiwgImdlbmVyYXRlQ2FkZHlDb25maWciLCAic3ViZG9tYWluIiwgInNzbFR5cGUiLCAiY2FOYW1lIiwgImV4aXN0aW5nQ2EiLCAiZW5hYmxlQXV0aCIsICJlbmFibGVDb3JzIiwgImN1c3RvbUhlYWRlcnMiLCAidXBzdHJlYW1QYXRoIiwgImhlYWx0aENoZWNrIiwgInRpbWVvdXQiLCAidGFpbHNjYWxlT25seSIsICJjYWRkeUNvbmZpZyIsICJoZWFkZXJzIiwgImNyZWF0ZURuc1JlY29yZCIsICJ0dGwiLCAiZG5zVG9rZW4iLCAiZG9tYWluIiwgImVycm9yVGV4dCIsICJhZGRTZXJ2aWNlVG9Db25maWciLCAic2VydmljZUNvbmZpZyIsICJuZXdTZXJ2aWNlIiwgImFkZFRvQ2FkZHlmaWxlIiwgImN1cnJlbnRFZGl0U2VydmljZSIsICJvcGVuU2VydmljZUVkaXRNb2RhbCIsICJsb2dvUHJldmlldyIsICJsb2dvU3JjIiwgImNhdGVnb3J5U2VsZWN0IiwgImNsb3NlU2VydmljZUVkaXRNb2RhbCIsICJzYXZlU2VydmljZUNoYW5nZXMiLCAibmV3U3ViZG9tYWluIiwgIm5ld05hbWUiLCAibmV3UG9ydCIsICJuZXdJcCIsICJuZXdMb2dvIiwgIm5ld0NhdGVnb3J5IiwgIm9sZFN1YmRvbWFpbiIsICJhcHBJbmRleCIsICJmaWxlIiwgInJlYWRlciIsICJkYXRhVXJsIiwgInNob3dEZWxldGVNb2RhbCIsICJoYXNDb250YWluZXIiLCAicmVzb2x2ZSIsICJjb250YWluZXJJbmZvIiwgImhlbHAiLCAiY2FuY2VsQnRuIiwgInJlbW92ZUJ0biIsICJkZWxldGVCdG4iLCAiY2xlYW51cCIsICJoYW5kbGVDYW5jZWwiLCAiaGFuZGxlUmVtb3ZlIiwgImhhbmRsZURlbGV0ZSIsICJoYW5kbGVCYWNrZHJvcCIsICJ1cGRhdGVDb250YWluZXIiLCAic2VydmljZUlkIiwgImRlbGV0ZVNlcnZpY2UiLCAiZGVsZXRlQ29udGFpbmVyIiwgInJlc3VsdHMiLCAic2VydmljZUlQIiwgImRuc1Jlc3VsdCIsICJjYWRkeVJlc3VsdCIsICJpbmRleCIsICJjdXN0b21BcHBzIiwgImxvY2FsSW5kZXgiLCAic2VydmljZVJlc3VsdCIsICJoYXNFcnJvcnMiLCAiZXJyb3JNZXNzYWdlcyIsICJzdWNjZXNzU3RhdGVzIiwgImlzU3VjY2VzcyIsICJkZXJpdmVTdWJkb21haW4iLCAiZ2V0U21hcnRTc2xEZWZhdWx0IiwgInVwZGF0ZVNlcnZpY2VQcmV2aWV3IiwgIlFVSUNLX0lQUyIsICJkbnNQcmV2aWV3IiwgInVybFByZXZpZXciLCAiY29uZmlnUHJldmlldyIsICJkZXRlY3ROZXR3b3JrSVBzIiwgImxhbkJ0biIsICJ0c0J0biIsICJpcElucHV0IiwgImluaXRRdWlja0lQQnV0dG9ucyIsICJjdXJyZW50SVAiLCAib3BlbkFkZFNlcnZpY2VNb2RhbCIsICJtb2RhbENvbnRlbnQiLCAic3NsU2VsZWN0IiwgInRhaWxzY2FsZVN0YXR1cyIsICJ0YWlsc2NhbGVDaGVja2JveCIsICJzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nIiwgImxvY2FsUmFkaW8iLCAiZXh0ZXJuYWxSYWRpbyIsICJsb2NhbENvbmZpZyIsICJleHRlcm5hbENvbmZpZyIsICJ0YWJMb2NhbCIsICJ0YWJFeHRlcm5hbCIsICJzd2l0Y2hTZXJ2aWNlVHlwZSIsICJzZXR1cEF1dG9TdWJkb21haW4iLCAibmFtZUlucHV0IiwgInN1YmRvbWFpbklucHV0IiwgInN1YmRvbWFpblByZXZpZXciLCAidXNlckVkaXRlZFN1YmRvbWFpbiIsICJleHROYW1lSW5wdXQiLCAiZXh0U3ViZG9tYWluSW5wdXQiLCAiZXh0U3ViZG9tYWluUHJldmlldyIsICJleHREb21haW5QcmV2aWV3IiwgInVzZXJFZGl0ZWRFeHRTdWJkb21haW4iLCAiY3JlYXRlRXh0ZXJuYWxTZXJ2aWNlIiwgImV4dGVybmFsVXJsIiwgImxvZ28iLCAiaWNvbiIsICJjcmVhdGVEbnMiLCAiY3JlYXRlQ2FkZHkiLCAicHJveHlJcCIsICJwcmVzZXJ2ZUhvc3QiLCAiZm9sbG93UmVkaXJlY3RzIiwgImNhdGVnb3J5IiwgImRlZmF1bHRTZXJ2aWNlcyIsICJjdXN0b21TZXJ2aWNlcyIsICJjbG9zZUFkZFNlcnZpY2VNb2RhbCIsICJwYXJ0cyIsICJzdWJQcmV2IiwgImV4dFN1YlByZXYiLCAiZXh0TmFtZSIsICJleHRTdWIiLCAiZXh0VXJsIiwgImV4dExvZ28iLCAiZXh0SWNvbiIsICJsb2NhbE9wdHMiLCAiZXh0T3B0cyIsICJjcmVhdGVOZXdTZXJ2aWNlIiwgInN0YXR1c1BhcnRzIiwgImV4aXN0aW5nQ2FDb25maWciLCAiY3VzdG9tQ2FDb25maWciLCAiYnV0dG9uIiwgImRuc0NvbmZpZyIsICJlbGVtZW50IiwgImxvYWRDdXN0b21TZXJ2aWNlcyIsICJlcyIsICJyZWNvbm5lY3REZWxheSIsICJNQVhfUkVDT05ORUNUIiwgImNvbm5lY3QiLCAiX3NzZUZhaWxDb3VudCIsICJ1cGRhdGVzQnRuIiwgInNlYXJjaElucHV0IiwgInN0YXR1c1NlbGVjdCIsICJjb3VudFNwYW4iLCAiZ2V0Q2F0ZWdvcnlMaXN0IiwgInNlZW4iLCAiZnJvbUNhcmRzIiwgImNhdCIsICJhcGlDYXRzIiwgInJlZnJlc2hDYXRlZ29yeURyb3Bkb3duIiwgImxpc3QiLCAibyIsICJ1cGRhdGVGaWx0ZXIiLCAicXVlcnkiLCAic3RhdHVzRmlsdGVyIiwgImNhdGVnb3J5RmlsdGVyIiwgImNhcmRzIiwgInZpc2libGVDb3VudCIsICJ0b3RhbCIsICJkZWJvdW5jZSIsICJkZWxheSIsICJhcmdzIiwgImJhdGNoQnRuIiwgImJhdGNoQmFyIiwgImJhdGNoQ291bnQiLCAic3RhcnRCdG4iLCAic3RvcEJ0biIsICJiYXRjaE1vZGUiLCAic2VsZWN0ZWRDb250YWluZXJzIiwgImVudGVyQmF0Y2hNb2RlIiwgInVwZGF0ZVNlbGVjdGVkQ291bnQiLCAiY2hlY2tib3giLCAiZXhpdEJhdGNoTW9kZSIsICJjYiIsICJiYXRjaEFjdGlvbiIsICJhY3Rpb24iLCAiY29udGFpbmVycyIsICJhY3Rpb25MYWJlbCIsICJidG5zIiwgInN1Y2Nlc3MiLCAiZmFpbGVkIiwgImVycm9ycyJdCn0K