Files
dashcaddy/status/dist/init.js
T
Hermes 84edb035e3
CI / Test & Lint (push) Canceled after 0s
CI / Security audit (push) Canceled after 0s
[grade=B] feat(auth): onboard missing credentials into encrypted vault
2026-08-22 05:41:38 -07:00

333 lines
102 KiB
JavaScript

(function(){function v(){const n=safeGet("custom-services");if(n)try{JSON.parse(n).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(i){console.warn("Failed to load custom services:",i)}}v();function k(){const n=document.querySelectorAll(".top .card");n.forEach((i,e)=>{i.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{n.forEach(i=>i.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const n=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(i=>{console.warn("[init] Service worker registration failed:",i)})};document.readyState==="complete"?n():window.addEventListener("load",n,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),typeof window.openRequestedCredentialForm=="function"&&window.openRequestedCredentialForm(),k(),window.refreshAll(),setInterval(()=>{window._dcAuthLost||window.refreshAll()},DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const i=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();i.success&&window._updateAuthCard(i.config.enabled&&i.config.isSetUp,i.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(n){console.warn("[init] AdminPanel attachTrigger failed:",n)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const n=document.createElement("script");if(n.src="/dist/onboarding.js",n.defer=!0,document.head.appendChild(n),!document.querySelector('link[href="/css/driver.min.css"]')){const i=document.createElement("link");i.rel="stylesheet",i.href="/css/driver.min.css",document.head.appendChild(i)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const i=document.createElement("link");i.rel="stylesheet",i.href="/css/onboarding.css",document.head.appendChild(i)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const n=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!n||!n.tourCompleted&&n.currentStep===0}catch{return!0}}function E(){const n=document.querySelectorAll(".tools-section");if(!n.length)return;let i={};try{i=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}n.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(i[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let n=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));n=n||!!(a&&a.tourCompleted)}catch{}const i=n?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!i)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=n?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},i.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const n=await fetch("/api/v1/templates",{cache:"no-store"});if(!n.ok)return;const i=await n.json();i&&i.categories&&(window.DC_CATEGORIES=i.categories,typeof DC<"u"&&(DC.CATEGORIES=i.categories),q())}catch(n){console.warn("[init] Failed to load template categories:",n)}}function q(){const n=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;n&&document.querySelectorAll('select[data-role="service-category"]').forEach(i=>{const e=i.dataset.current||"",a=i.querySelector('option[value=""]');if(i.innerHTML="",a)i.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",i.appendChild(c)}Object.entries(n).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),i.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const i=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(i.success&&i.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(n){console.warn("TOTP check failed, proceeding normally:",n)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=`
.dc-monitor {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-bottom: 16px;
padding: 12px 16px;
background: var(--card-base);
border: 1px solid var(--border);
border-radius: var(--radius);
}
.dc-monitor-card {
padding: 10px 12px;
background: var(--card-bg, rgba(255,255,255,0.04));
border-radius: 8px;
border: 1px solid var(--border);
}
.dc-monitor-label {
font-size: 0.7rem;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 4px;
}
.dc-monitor-value {
font-size: 1.4rem;
font-weight: 600;
color: var(--fg);
}
.dc-monitor-sub {
font-size: 0.7rem;
color: var(--muted);
margin-top: 4px;
}
.dc-monitor-bar {
margin-top: 6px;
width: 100%;
height: 4px;
background: color-mix(in srgb, var(--muted) 20%, transparent);
border-radius: 2px;
overflow: hidden;
}
.dc-monitor-bar-fill {
height: 100%;
width: 0%;
background: var(--ok-fg, #27ae60);
transition: width 0.3s ease, background 0.3s ease;
}
.dc-monitor-bar-fill.warn { background: #f39c12; }
.dc-monitor-bar-fill.bad { background: #e74c3c; }
.dc-monitor-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.dc-monitor-title {
font-size: 0.85rem;
font-weight: 500;
color: var(--muted);
display: flex;
align-items: center;
gap: 6px;
}
.dc-monitor-pill {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 999px;
font-size: 0.7rem;
font-weight: 500;
}
.dc-monitor-pill.ok { background: color-mix(in srgb, #27ae60 20%, transparent); color: #27ae60; }
.dc-monitor-pill.warn { background: color-mix(in srgb, #f39c12 20%, transparent); color: #f39c12; }
.dc-monitor-pill.bad { background: color-mix(in srgb, #e74c3c 20%, transparent); color: #e74c3c; }
.dc-monitor-refresh {
font-size: 0.7rem;
color: var(--muted);
opacity: 0.7;
}
`,document.head.appendChild(v);const k=document.getElementById("service-filter-bar");if(!k)return;const u=document.createElement("div");u.className="dc-monitor",u.id="dc-monitor-panel",u.innerHTML=`
<div class="dc-monitor-header" style="grid-column: 1 / -1;">
<div class="dc-monitor-title">\u{1F4CA} System Overview</div>
<span class="dc-monitor-refresh" id="dc-monitor-refresh-stamp">\u2014</span>
</div>
<div class="dc-monitor-card">
<div class="dc-monitor-label">Services</div>
<div class="dc-monitor-value" id="dc-monitor-services">\u2014</div>
<div class="dc-monitor-sub" id="dc-monitor-services-sub">loading\u2026</div>
</div>
<div class="dc-monitor-card">
<div class="dc-monitor-label">Containers Up</div>
<div class="dc-monitor-value" id="dc-monitor-containers">\u2014</div>
<div class="dc-monitor-sub" id="dc-monitor-containers-sub">loading\u2026</div>
</div>
<div class="dc-monitor-card">
<div class="dc-monitor-label">Avg CPU</div>
<div class="dc-monitor-value" id="dc-monitor-cpu">\u2014</div>
<div class="dc-monitor-bar"><div class="dc-monitor-bar-fill" id="dc-monitor-cpu-bar"></div></div>
</div>
<div class="dc-monitor-card">
<div class="dc-monitor-label">Avg Memory</div>
<div class="dc-monitor-value" id="dc-monitor-mem">\u2014</div>
<div class="dc-monitor-bar"><div class="dc-monitor-bar-fill" id="dc-monitor-mem-bar"></div></div>
</div>
<div class="dc-monitor-card">
<div class="dc-monitor-label">Health</div>
<div class="dc-monitor-value" id="dc-monitor-health">\u2014</div>
<div class="dc-monitor-sub" id="dc-monitor-health-sub">\u2014</div>
</div>
`,k.parentNode.insertBefore(u,k);function h(e,a){const c=document.getElementById(e);if(!c)return;const s=Math.max(0,Math.min(100,Number(a)||0));c.style.width=s+"%",c.classList.remove("warn","bad"),s>=85?c.classList.add("bad"):s>=65&&c.classList.add("warn")}function f(e){return e==null||isNaN(e)?"\u2014":Math.round(e*10)/10+"%"}function b(e){if(e==null||isNaN(e))return"\u2014";const a=["B","KB","MB","GB","TB"];let c=0;for(;e>=1024&&c<a.length-1;)e/=1024,c++;return e.toFixed(1)+" "+a[c]}function C(){const e=(window.APPS||[]).length;let a=0;document.querySelectorAll("#cards .card").forEach(l=>{l.dataset.status==="on"&&a++});const c=document.getElementById("dc-monitor-services"),s=document.getElementById("dc-monitor-services-sub");c&&(c.textContent=`${a} / ${e}`),s&&(s.textContent=e===0?"no services yet":`${a} online \xB7 ${e-a} offline`)}function E(e){const a=document.getElementById("dc-monitor-health"),c=document.getElementById("dc-monitor-health-sub");if(!a)return;if(!e||e.summary==null){a.textContent="\u2014",c&&(c.textContent="no data");return}const s=e.summary,l=s.healthy??s.up??0,m=s.unhealthy??s.down??0,t=s.total??l+m;a.textContent=`${l}/${t}`,c&&(m===0?c.innerHTML='<span class="dc-monitor-pill ok">\u25CF all healthy</span>':m<=2?c.innerHTML=`<span class="dc-monitor-pill warn">\u25CF ${m} degraded</span>`:c.innerHTML=`<span class="dc-monitor-pill bad">\u25CF ${m} down</span>`)}async function S(){try{const e=await fetch("/api/v1/monitoring/stats",{cache:"no-store"});if(!e.ok)return null;const a=await e.json();return a&&a.stats?a.stats:null}catch{return null}}async function y(){try{const e=await fetch("/api/v1/health-checks/status",{cache:"no-store"});return e.ok?await e.json():null}catch{return null}}function q(e){const a=document.getElementById("dc-monitor-containers"),c=document.getElementById("dc-monitor-containers-sub"),s=document.getElementById("dc-monitor-cpu"),l=document.getElementById("dc-monitor-mem");if(!e){a&&(a.textContent="\u2014"),s&&(s.textContent="\u2014"),l&&(l.textContent="\u2014");return}const m=Object.values(e);if(m.length===0){a&&(a.textContent="0"),c&&(c.textContent="no containers reporting"),s&&(s.textContent="0%"),l&&(l.textContent="0%"),h("dc-monitor-cpu-bar",0),h("dc-monitor-mem-bar",0);return}let t=0,o=0,r=0,p=0,d=0;m.forEach(g=>{if(g.cpu!=null){const x=Number(g.cpu);isNaN(x)||(t+=x>1?x:x*100,p++)}if(g.memory!=null){const x=Number(g.memory);isNaN(x)||(o+=x,r+=Number(g.memoryUsage||0),d++)}});const w=p?t/p:0,L=d?o/d:0;if(a&&(a.textContent=String(m.length)),c){const g=r?` \xB7 ${b(r)} RAM`:"";c.textContent=`running${g}`}s&&(s.textContent=f(w)),l&&(l.textContent=f(L)),h("dc-monitor-cpu-bar",w),h("dc-monitor-mem-bar",L)}let n=!1;async function i(){if(!n){n=!0;try{C();const[e,a]=await Promise.all([S(),y()]);q(e),E(a);const c=document.getElementById("dc-monitor-refresh-stamp");if(c){const s=new Date;c.textContent=`updated ${s.toLocaleTimeString()}`}}finally{n=!1}}}window.refreshMonitoringWidgets=i,setInterval(i,typeof DC<"u"&&DC.POLL&&DC.POLL.STATS||5e3),setTimeout(i,200)})(),(function(){"use strict";const v=(...t)=>{window.DASHCADDY_DEBUG&&console.log(...t)},k=["#app-selector-modal","#app-deploy-modal","#weather-modal","#token-management-modal","#service-edit-modal","#notifications-modal","#backup-modal","#stats-modal","#arr-setup-modal","#add-service-modal","#error-log-modal","#logs-modal","#dns-template-modal"];let u=null,h=null,f=null;function b(){try{C(),document.addEventListener("keydown",E),v("[Keyboard Shortcuts] Initialized"),v("[Keyboard Shortcuts] Press Ctrl+K to open quick search"),v("[Keyboard Shortcuts] Press Escape to close modals")}catch(t){console.warn("[Keyboard Shortcuts] Failed to initialize:",t.message)}}function C(){u=document.createElement("div"),u.id="quick-search-modal",u.className="quick-search-modal",u.innerHTML=`
<div class="quick-search-content">
<div class="quick-search-input-wrapper">
<span class="quick-search-icon">\u{1F50D}</span>
<input type="text" id="quick-search-input" placeholder="Search services, apps, or actions..." autocomplete="off">
<span class="quick-search-shortcut">ESC</span>
</div>
<div id="quick-search-results" class="quick-search-results"></div>
<div class="quick-search-footer">
<span><kbd>\u2191\u2193</kbd> Navigate</span>
<span><kbd>Enter</kbd> Select</span>
<span><kbd>Esc</kbd> Close</span>
</div>
</div>
`;const t=document.createElement("style");t.textContent=`
.quick-search-modal {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
z-index: 100000;
justify-content: center;
align-items: flex-start;
padding-top: 15vh;
backdrop-filter: blur(4px);
}
.quick-search-modal.show {
display: flex;
}
.quick-search-content {
background: var(--card-base, #1a1a2e);
border: 1px solid var(--border, #333);
border-radius: 12px;
width: 90%;
max-width: 600px;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.quick-search-input-wrapper {
display: flex;
align-items: center;
padding: 16px 20px;
border-bottom: 1px solid var(--border, #333);
gap: 12px;
}
.quick-search-icon {
font-size: 20px;
opacity: 0.6;
}
#quick-search-input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--fg, #fff);
font-size: 18px;
font-family: inherit;
}
#quick-search-input::placeholder {
color: var(--muted, #666);
}
.quick-search-shortcut {
background: var(--card-hover, #2a2a4e);
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
color: var(--muted, #666);
font-family: monospace;
}
.quick-search-results {
max-height: 400px;
overflow-y: auto;
}
.quick-search-category {
padding: 8px 20px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
color: var(--muted, #666);
background: var(--card-hover, #2a2a4e);
letter-spacing: 0.5px;
}
.quick-search-item {
display: flex;
align-items: center;
padding: 12px 20px;
cursor: pointer;
transition: background 0.15s;
gap: 12px;
}
.quick-search-item:hover,
.quick-search-item.selected {
background: var(--accent, #3498db);
}
.quick-search-item-icon {
font-size: 24px;
width: 32px;
text-align: center;
}
.quick-search-item-content {
flex: 1;
}
.quick-search-item-title {
font-weight: 500;
color: var(--fg, #fff);
}
.quick-search-item-description {
font-size: 12px;
color: var(--muted, #aaa);
margin-top: 2px;
}
.quick-search-item-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
background: var(--card-hover, #2a2a4e);
color: var(--muted, #888);
}
.quick-search-empty {
padding: 40px 20px;
text-align: center;
color: var(--muted, #666);
}
.quick-search-footer {
display: flex;
justify-content: center;
gap: 24px;
padding: 12px 20px;
border-top: 1px solid var(--border, #333);
background: var(--card-hover, #2a2a4e);
font-size: 12px;
color: var(--muted, #666);
}
.quick-search-footer kbd {
background: var(--card-base, #1a1a2e);
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
margin-right: 4px;
}
`,document.head.appendChild(t),document.body.appendChild(u),h=document.getElementById("quick-search-input"),f=document.getElementById("quick-search-results"),h.addEventListener("input",e),h.addEventListener("keydown",l),u.addEventListener("click",o=>{o.target===u&&y()})}function E(t){try{if((t.ctrlKey||t.metaKey)&&t.key==="k"){t.preventDefault(),S();return}if(t.key==="Escape"){if(u&&u.classList.contains("show")){y();return}q()}}catch(o){console.warn("[Keyboard Shortcuts] Error handling keydown:",o.message)}}function S(){try{u.classList.add("show"),h.value="",h.focus(),n()}catch(t){console.warn("[Keyboard Shortcuts] Error opening quick search:",t.message)}}function y(){try{u.classList.remove("show"),h.value="",f.innerHTML=""}catch(t){console.warn("[Keyboard Shortcuts] Error closing quick search:",t.message)}}function q(){for(const t of k){const o=document.querySelector(t);if(o&&(o.classList.contains("show")||o.style.display==="flex"))return o.classList.remove("show"),o.style.display="none",!0}return!1}function n(){const t=`
<div class="quick-search-category">Quick Actions</div>
<div class="quick-search-item" data-action="refresh">
<span class="quick-search-item-icon">\u{1F504}</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">Refresh Dashboard</div>
<div class="quick-search-item-description">Refresh all service statuses</div>
</div>
</div>
<div class="quick-search-item" data-action="reload-caddy">
<span class="quick-search-item-icon">\u26A1</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">Reload Caddy</div>
<div class="quick-search-item-description">Reload Caddy configuration</div>
</div>
</div>
<div class="quick-search-item" data-action="add-service">
<span class="quick-search-item-icon">\u2795</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">Add Service</div>
<div class="quick-search-item-description">Open service configuration modal</div>
</div>
</div>
<div class="quick-search-item" data-action="app-selector">
<span class="quick-search-item-icon">\u{1F4F1}</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">App Selector</div>
<div class="quick-search-item-description">Deploy new applications</div>
</div>
</div>
<div class="quick-search-category">Services</div>
${i()}
`;f.innerHTML=t,s()}function i(){const t=document.querySelectorAll(".card[data-app], #cards .card");let o="";return t.forEach(r=>{const p=r.querySelector(".name")?.textContent||"Unknown",d=r.dataset.status||"unknown",w=r.dataset.app||"";p&&p!=="--"&&(o+=`
<div class="quick-search-item" data-action="open-service" data-service="${w}">
<span class="quick-search-item-icon">${d==="on"?"\u{1F7E2}":"\u{1F534}"}</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">${p}</div>
<div class="quick-search-item-description">Click to open service</div>
</div>
<span class="quick-search-item-badge">${d.toUpperCase()}</span>
</div>
`)}),o||'<div class="quick-search-empty">No services found</div>'}function e(t){try{const o=t.target.value.toLowerCase().trim();if(!o){n();return}const r=a(o);c(r)}catch(o){console.warn("[Keyboard Shortcuts] Error handling search input:",o.message)}}function a(t){const o={actions:[],services:[]};return[{id:"refresh",title:"Refresh Dashboard",icon:"\u{1F504}",keywords:"refresh reload update status"},{id:"reload-caddy",title:"Reload Caddy",icon:"\u26A1",keywords:"reload caddy proxy config"},{id:"add-service",title:"Add Service",icon:"\u2795",keywords:"add new service create"},{id:"app-selector",title:"App Selector",icon:"\u{1F4F1}",keywords:"app deploy install docker container"},{id:"backup",title:"Backup & Restore",icon:"\u{1F4BE}",keywords:"backup restore export import"},{id:"stats",title:"Container Stats",icon:"\u{1F4CA}",keywords:"stats resources cpu memory"},{id:"logs",title:"View Logs",icon:"\u{1F4CB}",keywords:"logs error debug"},{id:"tokens",title:"Manage Tokens",icon:"\u{1F511}",keywords:"tokens api keys credentials"},{id:"notifications",title:"Notifications",icon:"\u{1F514}",keywords:"alerts notifications discord telegram"},{id:"theme",title:"Change Theme",icon:"\u{1F3A8}",keywords:"theme dark light appearance"},{id:"tour",title:"Help Tour",icon:"\u{1F393}",keywords:"help tour guide onboarding"}].forEach(d=>{(d.title.toLowerCase().includes(t)||d.keywords.includes(t))&&o.actions.push(d)}),document.querySelectorAll(".card[data-app], #cards .card").forEach(d=>{const w=d.querySelector(".name")?.textContent||"",L=d.dataset.app||"",g=d.dataset.status||"unknown";(w.toLowerCase().includes(t)||L.toLowerCase().includes(t))&&o.services.push({id:L,title:w,status:g,icon:g==="on"?"\u{1F7E2}":"\u{1F534}"})}),o}function c(t){let o="";t.actions.length>0&&(o+='<div class="quick-search-category">Actions</div>',t.actions.forEach(r=>{o+=`
<div class="quick-search-item" data-action="${r.id}">
<span class="quick-search-item-icon">${r.icon}</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">${r.title}</div>
</div>
</div>
`})),t.services.length>0&&(o+='<div class="quick-search-category">Services</div>',t.services.forEach(r=>{o+=`
<div class="quick-search-item" data-action="open-service" data-service="${r.id}">
<span class="quick-search-item-icon">${r.icon}</span>
<div class="quick-search-item-content">
<div class="quick-search-item-title">${r.title}</div>
</div>
<span class="quick-search-item-badge">${r.status.toUpperCase()}</span>
</div>
`})),o||(o='<div class="quick-search-empty">No results found</div>'),f.innerHTML=o,s()}function s(){f.querySelectorAll(".quick-search-item").forEach((o,r)=>{o.addEventListener("click",()=>m(o)),r===0&&o.classList.add("selected")})}function l(t){try{const o=f.querySelectorAll(".quick-search-item"),r=f.querySelector(".quick-search-item.selected"),p=Array.from(o).indexOf(r);if(t.key==="ArrowDown"){t.preventDefault(),r&&r.classList.remove("selected");const d=(p+1)%o.length;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){t.preventDefault(),r&&r.classList.remove("selected");const d=p<=0?o.length-1:p-1;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else t.key==="Enter"&&(t.preventDefault(),r&&m(r))}catch(o){console.warn("[Keyboard Shortcuts] Error handling search navigation:",o.message)}}function m(t){try{const o=t.dataset.action,r=t.dataset.service;switch(y(),o){case"refresh":document.getElementById("refresh")?.click();break;case"reload-caddy":document.getElementById("reload-caddy-top")?.click();break;case"add-service":document.getElementById("add-service")?.click();break;case"app-selector":document.getElementById("add-service-btn")?.click();break;case"backup":document.getElementById("backup-restore-btn")?.click();break;case"stats":document.getElementById("container-stats-btn")?.click();break;case"logs":document.getElementById("view-error-logs")?.click();break;case"tokens":document.getElementById("manage-tokens")?.click();break;case"notifications":document.getElementById("manage-notifications")?.click();break;case"theme":document.getElementById("theme")?.click();break;case"tour":document.getElementById("restart-tour-btn")?.click();break;case"open-service":if(r){const p=document.querySelector(`[data-app="${r}"] [id$="-open"], [data-app="${r}"] button:not(.restart-btn):not(.logs-btn):not(.settings-btn)`);if(p)p.click();else{const d=document.querySelector(`[data-app="${r}"]`);d&&d.click()}}break;default:v("[Keyboard Shortcuts] Unknown action:",o)}}catch(o){console.warn("[Keyboard Shortcuts] Error executing action:",o.message)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b(),window.DashCaddyKeyboardShortcuts={openQuickSearch:S,closeQuickSearch:y}})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5vcGVuUmVxdWVzdGVkQ3JlZGVudGlhbEZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5vcGVuUmVxdWVzdGVkQ3JlZGVudGlhbEZvcm0oKTtcbiAgICB9XG4gICAgYW5pbWF0ZVRvcENhcmRzKCk7XG4gICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAvLyBTdG9wIHBvbGxpbmcgaWYgdGhlIHNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQgKGUuZy4gVE9UUCBnYXRlXG4gICAgICAvLyBub3cgYWN0aXZlLCBvciB1c2VyIGxvZ2dlZCBvdXQpLiBBdm9pZHMgcmVsZW50bGVzcyA0MDEvNDAzIG5vaXNlLlxuICAgICAgaWYgKHdpbmRvdy5fZGNBdXRoTG9zdCkgcmV0dXJuO1xuICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICB9LCBEQy5QT0xMLkRBU0hCT0FSRCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMoKTtcbiAgICAvLyBVcGRhdGUgYXV0aCBjYXJkIChtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCBieSB0aGUgYXV0by1sb2FkIElJRkUgYnV0IGVuc3VyZSBpdCdzIGNvcnJlY3QpXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgIGlmIChkLnN1Y2Nlc3MpIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQoZC5jb25maWcuZW5hYmxlZCAmJiBkLmNvbmZpZy5pc1NldFVwLCBkLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICBpZiAod2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICB9XG4gICAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgb25seSBvbmNlIHBlciBpbnN0YWxsLCBvdGhlcndpc2UganVzdCBhZGQgdGhlIHRvdXIgYnV0dG9uXG4gICAgYWRkVG91ckJ1dHRvbigpO1xuICAgIGlmIChzaG91bGRMb2FkT25ib2FyZGluZygpKSB7XG4gICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgIH1cblxuICAgIC8vIERDLTA0ODogaW5qZWN0IHRoZSBcIkFkbWluXCIgdHJpZ2dlciBidXR0b24gaW50byB0aGUgdG9wIGJhci4gVGhlXG4gICAgLy8gYnV0dG9uIG9ubHkgcmVuZGVycyB3aGVuIC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZTsgdGhlIG1vZHVsZVxuICAgIC8vIHJlLWNoZWNrcyBldmVyeSA2MHMgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3QuXG4gICAgaWYgKHdpbmRvdy5BZG1pblBhbmVsICYmIHR5cGVvZiB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBBZG1pblBhbmVsIGF0dGFjaFRyaWdnZXIgZmFpbGVkOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExhenktbG9hZCBvbmJvYXJkaW5nIGJ1bmRsZSAoNTIgS0IpIFx1MjAxNCBvbmx5IGxvYWRlZCB3aGVuIG5lZWRlZFxuICBmdW5jdGlvbiBsb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYz1cIi9kaXN0L29uYm9hcmRpbmcuanNcIl0nKSkgcmV0dXJuOyAvLyBhbHJlYWR5IGxvYWRpbmcvbG9hZGVkXG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHMuc3JjID0gJy9kaXN0L29uYm9hcmRpbmcuanMnO1xuICAgIHMuZGVmZXIgPSB0cnVlO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7XG4gICAgLy8gQWxzbyBsb2FkIG9uYm9hcmRpbmcgQ1NTIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3MvZHJpdmVyLm1pbi5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3MvZHJpdmVyLm1pbi5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWY9XCIvY3NzL29uYm9hcmRpbmcuY3NzXCJdJykpIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9ICcvY3NzL29uYm9hcmRpbmcuY3NzJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgb25ib2FyZGluZyBzaG91bGQgYXV0by1zdGFydCAoZmlyc3QtdGltZSB1c2VyKVxuICBmdW5jdGlvbiBzaG91bGRMb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAodHlwZW9mIFNJVEUgIT09ICd1bmRlZmluZWQnICYmIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJykpO1xuICAgICAgcmV0dXJuICFkYXRhIHx8ICghZGF0YS50b3VyQ29tcGxldGVkICYmIGRhdGEuY3VycmVudFN0ZXAgPT09IDApO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBkYXRhIG1lYW5zIGZpcnN0LXRpbWUgdXNlclxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENvbGxhcHNpYmxlIHRvb2xiYXIgc2VjdGlvbnMgPT09PT1cbiAgZnVuY3Rpb24gaW5pdFRvb2xiYXJTZWN0aW9ucygpIHtcbiAgICBjb25zdCBzZWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJyk7XG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBsZXQgc2F2ZWQgPSB7fTtcbiAgICB0cnkgeyBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnKSB8fCAne30nKTsgfSBjYXRjaCAoXykge31cblxuICAgIHNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBzZWN0aW9uLmRhdGFzZXQuc2VjdGlvbjtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb24taGVhZGVyJyk7XG4gICAgICBpZiAoIWhlYWRlcikgcmV0dXJuO1xuXG4gICAgICAvLyBSZXN0b3JlIHN0YXRlIChkZWZhdWx0OiBjb2xsYXBzZWQpXG4gICAgICBpZiAoc2F2ZWRba2V5XSkge1xuICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaXNPcGVuID0gc2VjdGlvbi5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG4gICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKTtcblxuICAgICAgICAvLyBTYXZlIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJykuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBzdGF0ZVtzLmRhdGFzZXQuc2VjdGlvbl0gPSBzLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHRvb2xiYXIgc2VjdGlvbnMgb24gRE9NIHJlYWR5XG4gIGluaXRUb29sYmFyU2VjdGlvbnMoKTtcblxuICAvLyBBZGQgcmVzdGFydCB0b3VyIGJ1dHRvbiAobG9hZHMgYnVuZGxlIG9uIGNsaWNrIGlmIG5vdCBsb2FkZWQpXG4gIC8vIFZpc2libGUgaW4gcHJpbWFyeSB0b29sYmFyIHVudGlsIHRvdXIgY29tcGxldGVkIG9uY2UsIHRoZW4gbW92ZXMgdG8gQWRtaW4gc2VjdGlvblxuICBmdW5jdGlvbiBhZGRUb3VyQnV0dG9uKCkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpKSByZXR1cm47XG5cbiAgICBsZXQgdG91ckRvbmUgPSB0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICB0b3VyRG9uZSA9IHRvdXJEb25lIHx8ICEhKGRhdGEgJiYgZGF0YS50b3VyQ29tcGxldGVkKTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gQmVmb3JlIGZpcnN0IGNvbXBsZXRpb246IHNob3cgaW4gcHJpbWFyeSB0b29sYmFyLiBBZnRlcjogdHVjayBpbnRvIEFkbWluIHNlY3Rpb24uXG4gICAgY29uc3QgdGFyZ2V0ID0gdG91ckRvbmVcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb25bZGF0YS1zZWN0aW9uPVwiYWRtaW5cIl0gLnRvb2xzLXNlY3Rpb24taXRlbXMnKVxuICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtcHJpbWFyeScpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uaWQgPSAncmVzdGFydC10b3VyLWJ0bic7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gdG91ckRvbmUgPyAnSGVscCBUb3VyJyA6ICdcdUQ4M0NcdURGOTMgSGVscCBUb3VyJztcbiAgICBidXR0b24udGl0bGUgPSAnUmVzdGFydCB0aGUgb25ib2FyZGluZyB0b3VyJztcbiAgICBidXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZykge1xuICAgICAgICB3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZy5yZXN0YXJ0VG91cigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZE9uYm9hcmRpbmcoKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYnVuZGxlIHRvIGxvYWQsIHRoZW4gc3RhcnRcbiAgICAgICAgY29uc3QgY2hlY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNsZWFySW50ZXJ2YWwoY2hlY2spLCA1MDAwKTsgLy8gZ2l2ZSB1cCBhZnRlciA1c1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cblxuICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9IGluaXRpYWxpemVEYXNoYm9hcmQ7XG4gIHdpbmRvdy5sb2FkQ3VzdG9tU2VydmljZXMgPSBsb2FkQ3VzdG9tU2VydmljZXM7XG4gIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpO1xuXG4gIC8vID09PT09IFRFTVBMQVRFIENBVEVHT1JJRVMgPT09PT1cbiAgLy8gQ2FjaGVkIHRlbXBsYXRlIGNhdGVnb3JpZXMgZnJvbSAvYXBpL3YxL3RlbXBsYXRlcyBmb3IgdXNlIGFjcm9zcyB0aGUgVUlcbiAgLy8gKHNlcnZpY2UgY3JlYXRlL2VkaXQsIGZpbHRlciBkcm9wZG93biwgY2F0ZWdvcnkgYmFkZ2VzLCBldGMuKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGVtcGxhdGVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmICghci5vaykgcmV0dXJuO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICAgIHdpbmRvdy5EQ19DQVRFR09SSUVTID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICAvLyBBbHNvIGV4cG9zZSB2aWEgZ2xvYmFscy5qcyBjb25zdGFudCBmb3IgY29udmVuaWVuY2VcbiAgICAgICAgaWYgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcpIERDLkNBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIFBvcHVsYXRlIGFueSBjYXRlZ29yeSA8c2VsZWN0PiB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAgICAgIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaW5pdF0gRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgY2F0ZWdvcmllczonLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpIHtcbiAgICBjb25zdCBjYXRzID0gd2luZG93LkRDX0NBVEVHT1JJRVMgfHwgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUyk7XG4gICAgaWYgKCFjYXRzKSByZXR1cm47XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W2RhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIl0nKS5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0LmRhdGFzZXQuY3VycmVudCB8fCAnJztcbiAgICAgIC8vIENsZWFyIG9wdGlvbnMgYnV0IGtlZXAgdGhlIGZpcnN0IChwbGFjZWhvbGRlcilcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJ29wdGlvblt2YWx1ZT1cIlwiXScpO1xuICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSBzZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIHBoLnZhbHVlID0gJyc7XG4gICAgICAgIHBoLnRleHRDb250ZW50ID0gJ1x1MjAxNCBTZWxlY3QgY2F0ZWdvcnkgXHUyMDE0JztcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKHBoKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5lbnRyaWVzKGNhdHMpLmZvckVhY2goKFtuYW1lLCBpbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7aW5mby5pY29uIHx8ICcnfSAke25hbWV9YC50cmltKCk7XG4gICAgICAgIGlmIChuYW1lID09PSBjdXJyZW50KSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWxsb3cgb3RoZXIgbW9kdWxlcyB0byByZS1ydW4gcG9wdWxhdGlvbiBhZnRlciB0aGV5IChyZSlpbmplY3Qgc2VsZWN0c1xuICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMgPSBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cztcbiAgd2luZG93LmxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMgPSBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzO1xuXG4gIC8vIFRPVFAtZ2F0ZWQgaW5pdGlhbGl6YXRpb25cbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG90cFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IHRvdHBEYXRhID0gYXdhaXQgdG90cFJlcy5qc29uKCk7XG5cbiAgICAgIGlmICh0b3RwRGF0YS5zdWNjZXNzICYmIHRvdHBEYXRhLmNvbmZpZy5lbmFibGVkKSB7XG4gICAgICAgIC8vIFRPVFAgaXMgZW5hYmxlZCAtIGNoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHRlc3RSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NoZWNrLXNlc3Npb24nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBpZiAodGVzdFJlcy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIC8vIE5lZWQgVE9UUCB2ZXJpZmljYXRpb24gLSBzaG93IG92ZXJsYXlcbiAgICAgICAgICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjsgLy8gaW5pdGlhbGl6ZURhc2hib2FyZCgpIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RPVFAgY2hlY2sgZmFpbGVkLCBwcm9jZWVkaW5nIG5vcm1hbGx5OicsIGUpO1xuICAgIH1cblxuICAgIC8vIFRPVFAgZGlzYWJsZWQgb3Igc2Vzc2lvbiB2YWxpZCAtIGluaXRpYWxpemUgaW1tZWRpYXRlbHlcbiAgICBpbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE1PTklUT1JJTkcgV0lER0VUUyA9PT09PT09PT09XG4vLyBFbWJlZHMgYSBjb21wYWN0IHN5c3RlbS1yZXNvdXJjZSArIGhlYWx0aCBzdW1tYXJ5IHBhbmVsIGRpcmVjdGx5IG9uIHRoZVxuLy8gbWFpbiBkYXNoYm9hcmQuIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIG1vbml0b3JpbmctZGFzaGJvYXJkLmh0bWxcbi8vIHBhZ2UgXHUyMDE0IHF1aWNrIGF0LWEtZ2xhbmNlIHN0YXRzIHdoZXJlIHlvdSBhbHJlYWR5IGFyZS5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gLS0tLS0gU3R5bGUgaW5qZWN0aW9uIChzY29wZWQgdG8gLmRjLW1vbml0b3Igc28gaXQgZG9lc24ndCBsZWFrKSAtLS0tLVxuICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGBcbiAgICAuZGMtbW9uaXRvciB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1jYXJkIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsMC4wNCkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdmFsdWUge1xuICAgICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLWZnKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3Itc3ViIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyIHtcbiAgICAgIG1hcmdpbi10b3A6IDZweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbXV0ZWQpIDIwJSwgdHJhbnNwYXJlbnQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwge1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcsICMyN2FlNjApO1xuICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCBiYWNrZ3JvdW5kIDAuM3MgZWFzZTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwud2FybiB7IGJhY2tncm91bmQ6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC5iYWQgIHsgYmFja2dyb3VuZDogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsLm9rICAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICMyN2FlNjA7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLndhcm4geyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNlNzRjM2M7IH1cbiAgICAuZGMtbW9uaXRvci1yZWZyZXNoIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG9wYWNpdHk6IDAuNztcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG5cbiAgLy8gLS0tLS0gQ29udGFpbmVyIGVsZW1lbnQgKGluc2VydGVkIGFib3ZlIHNlcnZpY2UtZmlsdGVyLWJhcikgLS0tLS1cbiAgY29uc3QgZmlsdGVyQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWJhcicpO1xuICBpZiAoIWZpbHRlckJhcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmNsYXNzTmFtZSA9ICdkYy1tb25pdG9yJztcbiAgcGFuZWwuaWQgPSAnZGMtbW9uaXRvci1wYW5lbCc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1oZWFkZXJcIiBzdHlsZT1cImdyaWQtY29sdW1uOiAxIC8gLTE7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci10aXRsZVwiPlx1RDgzRFx1RENDQSBTeXN0ZW0gT3ZlcnZpZXc8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1yZWZyZXNoXCIgaWQ9XCJkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXBcIj5cdTIwMTQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3Itc2VydmljZXNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlcy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5Db250YWluZXJzIFVwPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1zdWJcIiBpZD1cImRjLW1vbml0b3ItY29udGFpbmVycy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5BdmcgQ1BVPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jcHVcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhclwiPjxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhci1maWxsXCIgaWQ9XCJkYy1tb25pdG9yLWNwdS1iYXJcIj48L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBNZW1vcnk8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLW1lbVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItbWVtLWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+SGVhbHRoPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGhcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGgtc3ViXCI+XHUyMDE0PC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIEluc2VydCBBQk9WRSB0aGUgZmlsdGVyIGJhclxuICBmaWx0ZXJCYXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGFuZWwsIGZpbHRlckJhcik7XG5cbiAgLy8gLS0tLS0gSGVscGVycyAtLS0tLVxuICBmdW5jdGlvbiBzZXRCYXIoaWQsIHBjdCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIocGN0KSB8fCAwKSk7XG4gICAgZWwuc3R5bGUud2lkdGggPSBwICsgJyUnO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3dhcm4nLCAnYmFkJyk7XG4gICAgaWYgKHAgPj0gODUpIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZCcpO1xuICAgIGVsc2UgaWYgKHAgPj0gNjUpIGVsLmNsYXNzTGlzdC5hZGQoJ3dhcm4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFBjdCh2KSB7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCBpc05hTih2KSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZCh2ICogMTApIC8gMTApICsgJyUnO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYikge1xuICAgIGlmIChiID09IG51bGwgfHwgaXNOYU4oYikpIHJldHVybiAnXHUyMDE0JztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoYiA+PSAxMDI0ICYmIGkgPCB1bml0cy5sZW5ndGggLSAxKSB7IGIgLz0gMTAyNDsgaSsrOyB9XG4gICAgcmV0dXJuIGIudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VydmljZXNDYXJkKCkge1xuICAgIGNvbnN0IHRvdGFsID0gKHdpbmRvdy5BUFBTIHx8IFtdKS5sZW5ndGg7XG4gICAgbGV0IHVwID0gMDtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmQnKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKGMuZGF0YXNldC5zdGF0dXMgPT09ICdvbicpIHVwKys7XG4gICAgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1zZXJ2aWNlcycpO1xuICAgIGNvbnN0IHN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzLXN1YicpO1xuICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHt1cH0gLyAke3RvdGFsfWA7XG4gICAgaWYgKHN1Yikgc3ViLnRleHRDb250ZW50ID0gdG90YWwgPT09IDAgPyAnbm8gc2VydmljZXMgeWV0JyA6IGAke3VwfSBvbmxpbmUgXHUwMEI3ICR7dG90YWwgLSB1cH0gb2ZmbGluZWA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFN1bW1hcnkoZGF0YSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoLXN1YicpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5zdW1tYXJ5ID09IG51bGwpIHtcbiAgICAgIGVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSAnbm8gZGF0YSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSBkYXRhLnN1bW1hcnk7XG4gICAgY29uc3QgaGVhbHRoeSA9IHMuaGVhbHRoeSA/PyBzLnVwID8/IDA7XG4gICAgY29uc3QgdW5oZWFsdGh5ID0gcy51bmhlYWx0aHkgPz8gcy5kb3duID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSBzLnRvdGFsID8/IChoZWFsdGh5ICsgdW5oZWFsdGh5KTtcbiAgICBlbC50ZXh0Q29udGVudCA9IGAke2hlYWx0aHl9LyR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSB7XG4gICAgICBpZiAodW5oZWFsdGh5ID09PSAwKSB7XG4gICAgICAgIHN1Yi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXBpbGwgb2tcIj5cdTI1Q0YgYWxsIGhlYWx0aHk8L3NwYW4+JztcbiAgICAgIH0gZWxzZSBpZiAodW5oZWFsdGh5IDw9IDIpIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCB3YXJuXCI+XHUyNUNGICR7dW5oZWFsdGh5fSBkZWdyYWRlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBiYWRcIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRvd248L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBEYXRhIGZldGNoZXMgLS0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIHJldHVybiAoZGF0YSAmJiBkYXRhLnN0YXRzKSA/IGRhdGEuc3RhdHMgOiBudWxsO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVN0YXRzKHN0YXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNvbnRhaW5lcnMnKTtcbiAgICBjb25zdCBjb250YWluZXJzU3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycy1zdWInKTtcbiAgICBjb25zdCBjcHVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNwdScpO1xuICAgIGNvbnN0IG1lbUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItbWVtJyk7XG5cbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICBpZiAoY29udGFpbmVycykgY29udGFpbmVycy50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QudmFsdWVzKHN0YXRzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJzAnO1xuICAgICAgaWYgKGNvbnRhaW5lcnNTdWIpIGNvbnRhaW5lcnNTdWIudGV4dENvbnRlbnQgPSAnbm8gY29udGFpbmVycyByZXBvcnRpbmcnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICcwJSc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgMCk7XG4gICAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjcHVTdW0gPSAwLCBtZW1TdW0gPSAwLCBtZW1CeXRlcyA9IDAsIGNwdUNvdW50ID0gMCwgbWVtQ291bnQgPSAwO1xuICAgIGVudHJpZXMuZm9yRWFjaChzID0+IHtcbiAgICAgIC8vIENQVSBtYXkgYmUgcGVyY2VudGFnZSAoMC0xMDApIG9yIGZyYWN0aW9uICgwLTEpIFx1MjAxNCBoYW5kbGUgYm90aFxuICAgICAgaWYgKHMuY3B1ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3B1ID0gTnVtYmVyKHMuY3B1KTtcbiAgICAgICAgaWYgKCFpc05hTihjcHUpKSB7XG4gICAgICAgICAgY3B1U3VtICs9IGNwdSA+IDEgPyBjcHUgOiBjcHUgKiAxMDA7XG4gICAgICAgICAgY3B1Q291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMubWVtb3J5ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWVtID0gTnVtYmVyKHMubWVtb3J5KTtcbiAgICAgICAgaWYgKCFpc05hTihtZW0pKSB7XG4gICAgICAgICAgbWVtU3VtICs9IG1lbTtcbiAgICAgICAgICBtZW1CeXRlcyArPSBOdW1iZXIocy5tZW1vcnlVc2FnZSB8fCAwKTtcbiAgICAgICAgICBtZW1Db3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdmdDcHUgPSBjcHVDb3VudCA/IGNwdVN1bSAvIGNwdUNvdW50IDogMDtcbiAgICBjb25zdCBhdmdNZW0gPSBtZW1Db3VudCA/IG1lbVN1bSAvIG1lbUNvdW50IDogMDtcblxuICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gU3RyaW5nKGVudHJpZXMubGVuZ3RoKTtcbiAgICBpZiAoY29udGFpbmVyc1N1Yikge1xuICAgICAgY29uc3QgbWVtVHh0ID0gbWVtQnl0ZXMgPyBgIFx1MDBCNyAke2ZtdEJ5dGVzKG1lbUJ5dGVzKX0gUkFNYCA6ICcnO1xuICAgICAgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9IGBydW5uaW5nJHttZW1UeHR9YDtcbiAgICB9XG4gICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdDcHUpO1xuICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSBmbXRQY3QoYXZnTWVtKTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItY3B1LWJhcicsIGF2Z0NwdSk7XG4gICAgc2V0QmFyKCdkYy1tb25pdG9yLW1lbS1iYXInLCBhdmdNZW0pO1xuICB9XG5cbiAgLy8gLS0tLS0gUHVibGljIHJlZnJlc2ggZnVuY3Rpb24gLS0tLS1cbiAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgaWYgKGluRmxpZ2h0KSByZXR1cm47XG4gICAgaW5GbGlnaHQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzZXRTZXJ2aWNlc0NhcmQoKTtcbiAgICAgIGNvbnN0IFtzdGF0cywgaGVhbHRoXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFN0YXRzKCksIGZldGNoSGVhbHRoKCldKTtcbiAgICAgIGFwcGx5U3RhdHMoc3RhdHMpO1xuICAgICAgYXBwbHlIZWFsdGhTdW1tYXJ5KGhlYWx0aCk7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXAnKTtcbiAgICAgIGlmIChzdGFtcCkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzdGFtcC50ZXh0Q29udGVudCA9IGB1cGRhdGVkICR7bm93LnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluRmxpZ2h0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBpbml0LmpzIHRvIGNhbGwgb25jZSBhbmQgcmUtY2FsbCBhZnRlciBlYWNoIHJlZnJlc2hBbGwgY3ljbGVcbiAgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9IHJlZnJlc2g7XG5cbiAgLy8gQXV0by1yZWZyZXNoIG9uIHRoZSBTVEFUUyBpbnRlcnZhbCAoc2VwYXJhdGUgZnJvbSBmdWxsIERBU0hCT0FSRCByZWZyZXNoKVxuICBzZXRJbnRlcnZhbChyZWZyZXNoLCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5QT0xMICYmIERDLlBPTEwuU1RBVFMpIHx8IDUwMDApO1xuXG4gIC8vIFJlZnJlc2ggb25jZSBvbiBmaXJzdCBzY3JpcHQgbG9hZCAoaW5pdC5qcyBhbHNvIGNhbGxzIHRoaXM7IGRvdWJsZS1jYWxsIGlzIGhhcm1sZXNzKVxuICBzZXRUaW1lb3V0KHJlZnJlc2gsIDIwMCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIERhc2hDYWRkeSBLZXlib2FyZCBTaG9ydGN1dHMgU3lzdGVtXG4gKiBQcm92aWRlcyBnbG9iYWwga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciBpbXByb3ZlZCBuYXZpZ2F0aW9uXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLy8gQWxsIG1vZGFsIHNlbGVjdG9ycyB0aGF0IGNhbiBiZSBjbG9zZWQgd2l0aCBFc2NhcGVcbiAgY29uc3QgTU9EQUxfU0VMRUNUT1JTID0gW1xuICAgICcjYXBwLXNlbGVjdG9yLW1vZGFsJyxcbiAgICAnI2FwcC1kZXBsb3ktbW9kYWwnLFxuICAgICcjd2VhdGhlci1tb2RhbCcsXG4gICAgJyN0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyxcbiAgICAnI3NlcnZpY2UtZWRpdC1tb2RhbCcsXG4gICAgJyNub3RpZmljYXRpb25zLW1vZGFsJyxcbiAgICAnI2JhY2t1cC1tb2RhbCcsXG4gICAgJyNzdGF0cy1tb2RhbCcsXG4gICAgJyNhcnItc2V0dXAtbW9kYWwnLFxuICAgICcjYWRkLXNlcnZpY2UtbW9kYWwnLFxuICAgICcjZXJyb3ItbG9nLW1vZGFsJyxcbiAgICAnI2xvZ3MtbW9kYWwnLFxuICAgICcjZG5zLXRlbXBsYXRlLW1vZGFsJ1xuICBdO1xuXG4gIC8vIFF1aWNrIHNlYXJjaCBzdGF0ZVxuICBsZXQgcXVpY2tTZWFyY2hNb2RhbCA9IG51bGw7XG4gIGxldCBxdWlja1NlYXJjaElucHV0ID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoUmVzdWx0cyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGtleWJvYXJkIHNob3J0Y3V0cyBzeXN0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICAgIGNyZWF0ZVF1aWNrU2VhcmNoTW9kYWwoKTtcblxuICAgICAgLy8gQWRkIGdsb2JhbCBrZXlib2FyZCBsaXN0ZW5lclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuXG4gICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gSW5pdGlhbGl6ZWQnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBDdHJsK0sgdG8gb3BlbiBxdWljayBzZWFyY2gnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBFc2NhcGUgdG8gY2xvc2UgbW9kYWxzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZTonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpIHtcbiAgICBxdWlja1NlYXJjaE1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pZCA9ICdxdWljay1zZWFyY2gtbW9kYWwnO1xuICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NOYW1lID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaWNvblwiPlx1RDgzRFx1REQwRDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInF1aWNrLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHNlcnZpY2VzLCBhcHBzLCBvciBhY3Rpb25zLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtc2hvcnRjdXRcIj5FU0M8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIiBjbGFzcz1cInF1aWNrLXNlYXJjaC1yZXN1bHRzXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZm9vdGVyXCI+XG4gICAgICAgICAgPHNwYW4+PGtiZD5cdTIxOTFcdTIxOTM8L2tiZD4gTmF2aWdhdGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5FbnRlcjwva2JkPiBTZWxlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5Fc2M8L2tiZD4gQ2xvc2U8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIEFkZCBzdHlsZXNcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgICAgICAgei1pbmRleDogMTAwMDAwO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxNXZoO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1tb2RhbC5zaG93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlLCAjMWExYTJlKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCAjMzMzKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgI3F1aWNrLXNlYXJjaC1pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXNob3J0Y3V0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXJlc3VsdHMge1xuICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jYXRlZ29yeSB7XG4gICAgICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbTpob3ZlcixcbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS5zZWxlY3RlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCwgIzM0OThkYik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tY29udGVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1mZywgI2ZmZik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjYWFhKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzg4OCk7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZW1wdHkge1xuICAgICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1mb290ZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAyNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciBrYmQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHF1aWNrU2VhcmNoTW9kYWwpO1xuXG4gICAgcXVpY2tTZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtaW5wdXQnKTtcbiAgICBxdWlja1NlYXJjaFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2stc2VhcmNoLXJlc3VsdHMnKTtcblxuICAgIC8vIElucHV0IGhhbmRsaW5nXG4gICAgcXVpY2tTZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhhbmRsZVNlYXJjaElucHV0KTtcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVTZWFyY2hLZXlEb3duKTtcblxuICAgIC8vIENsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgcXVpY2tTZWFyY2hNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHF1aWNrU2VhcmNoTW9kYWwpIHtcbiAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBnbG9iYWwga2V5ZG93biBldmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDdHJsK0sgb3IgQ21kK0sgdG8gb3BlbiBxdWljayBzZWFyY2hcbiAgICAgIGlmICgoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5RdWlja1NlYXJjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVzY2FwZSB0byBjbG9zZSBtb2RhbHNcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgcXVpY2sgc2VhcmNoIGlzIG9wZW5cbiAgICAgICAgaWYgKHF1aWNrU2VhcmNoTW9kYWwgJiYgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIGNsb3NlIGFueSBvdGhlciBvcGVuIG1vZGFsXG4gICAgICAgIGNsb3NlVG9wTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBrZXlkb3duOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlblF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3Igb3BlbmluZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZVF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoUmVzdWx0cy5pbm5lckhUTUwgPSAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGNsb3NpbmcgcXVpY2sgc2VhcmNoOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB0b3Btb3N0IG9wZW4gbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlVG9wTW9kYWwoKSB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBNT0RBTF9TRUxFQ1RPUlMpIHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAobW9kYWwgJiYgKG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpIHx8IG1vZGFsLnN0eWxlLmRpc3BsYXkgPT09ICdmbGV4JykpIHtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgZGVmYXVsdC9zdWdnZXN0ZWQgcmVzdWx0c1xuICAgKi9cbiAgZnVuY3Rpb24gc2hvd0RlZmF1bHRSZXN1bHRzKCkge1xuICAgIGNvbnN0IGh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+UXVpY2sgQWN0aW9uczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWZyZXNoXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1RDgzRFx1REQwNDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWZyZXNoIERhc2hib2FyZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlZnJlc2ggYWxsIHNlcnZpY2Ugc3RhdHVzZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwicmVsb2FkLWNhZGR5XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1MjZBMTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWxvYWQgQ2FkZHk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5SZWxvYWQgQ2FkZHkgY29uZmlndXJhdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhZGQtc2VydmljZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdTI3OTU8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QWRkIFNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5PcGVuIHNlcnZpY2UgY29uZmlndXJhdGlvbiBtb2RhbDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhcHAtc2VsZWN0b3JcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVEQ0YxPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPkFwcCBTZWxlY3RvcjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkRlcGxveSBuZXcgYXBwbGljYXRpb25zPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgJHtnZXRTZXJ2aWNlSXRlbXMoKX1cbiAgICBgO1xuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlcnZpY2UgaXRlbXMgZnJvbSB0aGUgZGFzaGJvYXJkXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTZXJ2aWNlSXRlbXMoKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZFtkYXRhLWFwcF0sICNjYXJkcyAuY2FyZCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJ1Vua25vd24nO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnLS0nKSB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHthcHB9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3N0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCd9PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtuYW1lfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5DbGljayB0byBvcGVuIHNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1iYWRnZVwiPiR7c3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyBzZXJ2aWNlcyBmb3VuZDwvZGl2Pic7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoSW5wdXQoZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IGUudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHNlcnZpY2VzIGFuZCBhY3Rpb25zXG4gICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoQWxsKHF1ZXJ5KTtcbiAgICAgIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBpbnB1dDonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGFsbCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gc2VhcmNoQWxsKHF1ZXJ5KSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgc2VydmljZXM6IFtdXG4gICAgfTtcblxuICAgIC8vIFNlYXJjaCBhY3Rpb25zXG4gICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgIHsgaWQ6ICdyZWZyZXNoJywgdGl0bGU6ICdSZWZyZXNoIERhc2hib2FyZCcsIGljb246ICdcdUQ4M0RcdUREMDQnLCBrZXl3b3JkczogJ3JlZnJlc2ggcmVsb2FkIHVwZGF0ZSBzdGF0dXMnIH0sXG4gICAgICB7IGlkOiAncmVsb2FkLWNhZGR5JywgdGl0bGU6ICdSZWxvYWQgQ2FkZHknLCBpY29uOiAnXHUyNkExJywga2V5d29yZHM6ICdyZWxvYWQgY2FkZHkgcHJveHkgY29uZmlnJyB9LFxuICAgICAgeyBpZDogJ2FkZC1zZXJ2aWNlJywgdGl0bGU6ICdBZGQgU2VydmljZScsIGljb246ICdcdTI3OTUnLCBrZXl3b3JkczogJ2FkZCBuZXcgc2VydmljZSBjcmVhdGUnIH0sXG4gICAgICB7IGlkOiAnYXBwLXNlbGVjdG9yJywgdGl0bGU6ICdBcHAgU2VsZWN0b3InLCBpY29uOiAnXHVEODNEXHVEQ0YxJywga2V5d29yZHM6ICdhcHAgZGVwbG95IGluc3RhbGwgZG9ja2VyIGNvbnRhaW5lcicgfSxcbiAgICAgIHsgaWQ6ICdiYWNrdXAnLCB0aXRsZTogJ0JhY2t1cCAmIFJlc3RvcmUnLCBpY29uOiAnXHVEODNEXHVEQ0JFJywga2V5d29yZHM6ICdiYWNrdXAgcmVzdG9yZSBleHBvcnQgaW1wb3J0JyB9LFxuICAgICAgeyBpZDogJ3N0YXRzJywgdGl0bGU6ICdDb250YWluZXIgU3RhdHMnLCBpY29uOiAnXHVEODNEXHVEQ0NBJywga2V5d29yZHM6ICdzdGF0cyByZXNvdXJjZXMgY3B1IG1lbW9yeScgfSxcbiAgICAgIHsgaWQ6ICdsb2dzJywgdGl0bGU6ICdWaWV3IExvZ3MnLCBpY29uOiAnXHVEODNEXHVEQ0NCJywga2V5d29yZHM6ICdsb2dzIGVycm9yIGRlYnVnJyB9LFxuICAgICAgeyBpZDogJ3Rva2VucycsIHRpdGxlOiAnTWFuYWdlIFRva2VucycsIGljb246ICdcdUQ4M0RcdUREMTEnLCBrZXl3b3JkczogJ3Rva2VucyBhcGkga2V5cyBjcmVkZW50aWFscycgfSxcbiAgICAgIHsgaWQ6ICdub3RpZmljYXRpb25zJywgdGl0bGU6ICdOb3RpZmljYXRpb25zJywgaWNvbjogJ1x1RDgzRFx1REQxNCcsIGtleXdvcmRzOiAnYWxlcnRzIG5vdGlmaWNhdGlvbnMgZGlzY29yZCB0ZWxlZ3JhbScgfSxcbiAgICAgIHsgaWQ6ICd0aGVtZScsIHRpdGxlOiAnQ2hhbmdlIFRoZW1lJywgaWNvbjogJ1x1RDgzQ1x1REZBOCcsIGtleXdvcmRzOiAndGhlbWUgZGFyayBsaWdodCBhcHBlYXJhbmNlJyB9LFxuICAgICAgeyBpZDogJ3RvdXInLCB0aXRsZTogJ0hlbHAgVG91cicsIGljb246ICdcdUQ4M0NcdURGOTMnLCBrZXl3b3JkczogJ2hlbHAgdG91ciBndWlkZSBvbmJvYXJkaW5nJyB9XG4gICAgXTtcblxuICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKGFjdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhY3Rpb24ua2V5d29yZHMuaW5jbHVkZXMocXVlcnkpKSB7XG4gICAgICAgIHJlc3VsdHMuYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZWFyY2ggc2VydmljZXNcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5uYW1lJyk/LnRleHRDb250ZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwID0gY2FyZC5kYXRhc2V0LmFwcCB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQuZGF0YXNldC5zdGF0dXMgfHwgJ3Vua25vd24nO1xuXG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhcHAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5zZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICBpZDogYXBwLFxuICAgICAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIGljb246IHN0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwbGF5U2VhcmNoUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGlmIChyZXN1bHRzLmFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPkFjdGlvbnM8L2Rpdj4nO1xuICAgICAgcmVzdWx0cy5hY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCIke2FjdGlvbi5pZH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7YWN0aW9uLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHthY3Rpb24udGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2Pic7XG4gICAgICByZXN1bHRzLnNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHtzZXJ2aWNlLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHtzZXJ2aWNlLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtzZXJ2aWNlLnRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzZXJ2aWNlLnN0YXR1cy50b1VwcGVyQ2FzZSgpfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaHRtbCkge1xuICAgICAgaHRtbCA9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWVtcHR5XCI+Tm8gcmVzdWx0cyBmb3VuZDwvZGl2Pic7XG4gICAgfVxuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGNsaWNrIGxpc3RlbmVycyB0byByZXN1bHQgaXRlbXNcbiAgICovXG4gIGZ1bmN0aW9uIGF0dGFjaFJlc3VsdExpc3RlbmVycygpIHtcbiAgICBjb25zdCBpdGVtcyA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2stc2VhcmNoLWl0ZW0nKTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4ZWN1dGVBY3Rpb24oaXRlbSkpO1xuXG4gICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbSBieSBkZWZhdWx0XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGluIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvcignLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gQXJyYXkuZnJvbShpdGVtcykuaW5kZXhPZihzZWxlY3RlZCk7XG5cbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IChzZWxlY3RlZEluZGV4ICsgMSkgJSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gc2VsZWN0ZWRJbmRleCA8PSAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IHNlbGVjdGVkSW5kZXggLSAxO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgZXhlY3V0ZUFjdGlvbihzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBzZWFyY2ggbmF2aWdhdGlvbjonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhY3Rpb24gZnJvbSBxdWljayBzZWFyY2hcbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpdGVtLmRhdGFzZXQuYWN0aW9uO1xuICAgICAgY29uc3Qgc2VydmljZSA9IGl0ZW0uZGF0YXNldC5zZXJ2aWNlO1xuXG4gICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbG9hZC1jYWRkeSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWRkLXNlcnZpY2UnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhcHAtc2VsZWN0b3InOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmFja3VwJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0YXRzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb2dzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rva2Vucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9ucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG91cic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnQtdG91ci1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3Blbi1zZXJ2aWNlJzpcbiAgICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gW2lkJD1cIi1vcGVuXCJdLCBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdIGJ1dHRvbjpub3QoLnJlc3RhcnQtYnRuKTpub3QoLmxvZ3MtYnRuKTpub3QoLnNldHRpbmdzLWJ0bilgKTtcbiAgICAgICAgICAgIGlmIChvcGVuQnRuKSB7XG4gICAgICAgICAgICAgIG9wZW5CdG4uY2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBjYXJkIGFuZCBjbGljayBpdFxuICAgICAgICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXWApO1xuICAgICAgICAgICAgICBpZiAoY2FyZCkgY2FyZC5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gVW5rbm93biBhY3Rpb246JywgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGV4ZWN1dGluZyBhY3Rpb246JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdoZW4gRE9NIGlzIHJlYWR5XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdCgpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuRGFzaENhZGR5S2V5Ym9hcmRTaG9ydGN1dHMgPSB7XG4gICAgb3BlblF1aWNrU2VhcmNoLFxuICAgIGNsb3NlUXVpY2tTZWFyY2hcbiAgfTtcblxufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVksQ0FFWCxTQUFTQSxHQUFxQixDQUM1QixNQUFNQyxFQUFpQixRQUFRLGlCQUFpQixFQUNoRCxHQUFJQSxFQUNGLEdBQUksQ0FDZSxLQUFLLE1BQU1BLENBQWMsRUFFakMsUUFBUUMsR0FBVyxDQUNyQixPQUFPLEtBQUssS0FBS0MsR0FBT0EsRUFBSSxLQUFPRCxFQUFRLEVBQUUsR0FDaEQsT0FBTyxLQUFLLEtBQUtBLENBQU8sQ0FFNUIsQ0FBQyxDQUNILE9BQVNFLEVBQUcsQ0FDVixRQUFRLEtBQUssa0NBQW1DQSxDQUFDLENBQ25ELENBRUosQ0FHQUosRUFBbUIsRUFHbkIsU0FBU0ssR0FBa0IsQ0FDekIsTUFBTUMsRUFBVyxTQUFTLGlCQUFpQixZQUFZLEVBQ3ZEQSxFQUFTLFFBQVEsQ0FBQ0MsRUFBTUMsSUFBVSxDQUNoQ0QsRUFBSyxNQUFNLGdCQUFrQixHQUFHLEtBQUssSUFBSUMsRUFBUSxHQUFJLEdBQUcsQ0FBQyxJQUMzRCxDQUFDLEVBQ0Qsc0JBQXNCLElBQU0sQ0FDMUJGLEVBQVMsUUFBUUMsR0FBUUEsRUFBSyxVQUFVLElB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Z0RBLEVBQUUsT0FBTyxDQUN4RSxDQUNGLENBR0ksU0FBUyxhQUFlLFVBQzFCLFNBQVMsaUJBQWlCLG1CQUFvQjZGLENBQUksRUFFbERBLEVBQUssRUFJUCxPQUFPLDJCQUE2QixDQUNsQyxnQkFBQU8sRUFDQSxpQkFBQUQsQ0FDRixDQUVGLEdBQUciLAogICJuYW1lcyI6IFsibG9hZEN1c3RvbVNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgInNlcnZpY2UiLCAiYXBwIiwgImUiLCAiYW5pbWF0ZVRvcENhcmRzIiwgInRvcENhcmRzIiwgImNhcmQiLCAiaW5kZXgiLCAicmVnaXN0ZXJTZXJ2aWNlV29ya2VyIiwgInJlZ2lzdGVyIiwgImVycm9yIiwgIl9kYXNoYm9hcmRJbml0aWFsaXplZCIsICJpbml0aWFsaXplRGFzaGJvYXJkIiwgImxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMiLCAiZCIsICJhZGRUb3VyQnV0dG9uIiwgInNob3VsZExvYWRPbmJvYXJkaW5nIiwgImxvYWRPbmJvYXJkaW5nIiwgInMiLCAibGluayIsICJkYXRhIiwgImluaXRUb29sYmFyU2VjdGlvbnMiLCAic2VjdGlvbnMiLCAic2F2ZWQiLCAic2VjdGlvbiIsICJrZXkiLCAiaGVhZGVyIiwgImlzT3BlbiIsICJzdGF0ZSIsICJ0b3VyRG9uZSIsICJ0YXJnZXQiLCAiYnV0dG9uIiwgImNoZWNrIiwgInIiLCAicG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMiLCAiY2F0cyIsICJzZWxlY3QiLCAiY3VycmVudCIsICJwbGFjZWhvbGRlciIsICJwaCIsICJuYW1lIiwgImluZm8iLCAib3B0IiwgInRvdHBEYXRhIiwgInN0eWxlRWwiLCAiZmlsdGVyQmFyIiwgInBhbmVsIiwgInNldEJhciIsICJpZCIsICJwY3QiLCAiZWwiLCAicCIsICJmbXRQY3QiLCAidiIsICJmbXRCeXRlcyIsICJiIiwgInVuaXRzIiwgImkiLCAic2V0U2VydmljZXNDYXJkIiwgInRvdGFsIiwgInVwIiwgImMiLCAic3ViIiwgImFwcGx5SGVhbHRoU3VtbWFyeSIsICJoZWFsdGh5IiwgInVuaGVhbHRoeSIsICJmZXRjaFN0YXRzIiwgImZldGNoSGVhbHRoIiwgImFwcGx5U3RhdHMiLCAic3RhdHMiLCAiY29udGFpbmVycyIsICJjb250YWluZXJzU3ViIiwgImNwdUVsIiwgIm1lbUVsIiwgImVudHJpZXMiLCAiY3B1U3VtIiwgIm1lbVN1bSIsICJtZW1CeXRlcyIsICJjcHVDb3VudCIsICJtZW1Db3VudCIsICJjcHUiLCAibWVtIiwgImF2Z0NwdSIsICJhdmdNZW0iLCAibWVtVHh0IiwgImluRmxpZ2h0IiwgInJlZnJlc2giLCAiaGVhbHRoIiwgInN0YW1wIiwgIm5vdyIsICJkZWJ1ZyIsICJhcmdzIiwgIk1PREFMX1NFTEVDVE9SUyIsICJxdWlja1NlYXJjaE1vZGFsIiwgInF1aWNrU2VhcmNoSW5wdXQiLCAicXVpY2tTZWFyY2hSZXN1bHRzIiwgImluaXQiLCAiY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCIsICJoYW5kbGVLZXlEb3duIiwgInN0eWxlIiwgImhhbmRsZVNlYXJjaElucHV0IiwgImhhbmRsZVNlYXJjaEtleURvd24iLCAiY2xvc2VRdWlja1NlYXJjaCIsICJvcGVuUXVpY2tTZWFyY2giLCAiY2xvc2VUb3BNb2RhbCIsICJlMiIsICJzaG93RGVmYXVsdFJlc3VsdHMiLCAic2VsZWN0b3IiLCAibW9kYWwiLCAiaHRtbCIsICJnZXRTZXJ2aWNlSXRlbXMiLCAiYXR0YWNoUmVzdWx0TGlzdGVuZXJzIiwgImNhcmRzIiwgInN0YXR1cyIsICJxdWVyeSIsICJyZXN1bHRzIiwgInNlYXJjaEFsbCIsICJkaXNwbGF5U2VhcmNoUmVzdWx0cyIsICJhY3Rpb24iLCAiaXRlbSIsICJleGVjdXRlQWN0aW9uIiwgIml0ZW1zIiwgInNlbGVjdGVkIiwgInNlbGVjdGVkSW5kZXgiLCAibmV4dEluZGV4IiwgInByZXZJbmRleCIsICJvcGVuQnRuIl0KfQo=