",m.innerHTML=v,N("setup-step-summary")}async function M(m){try{const v=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)});return v.ok?(await v.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${v.status}`),{function:"saveConfigToServer"}),!1)}catch(v){return errorHandler.logError("[SetupWizard] Save Config",v,{function:"saveConfigToServer"}),!1}}async function R(){const m={setupComplete:!0,configurationType:w,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(w==="homelab"){m.tld=document.getElementById("setup-tld")?.value?.trim()||".home",m.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const L=document.getElementById("setup-dns-provider")?.value||"technitium";m.dns={provider:L,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},m.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else w==="simple"?(m.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",m.defaults={dnsType:"none",sslType:"none",targetIP:m.defaultIP}):w==="public"&&(m.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",m.email=document.getElementById("setup-public-email")?.value?.trim()||"",m.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",m.defaults={dnsType:m.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const v=await M(m);safeSet("dashcaddy-config",JSON.stringify(m)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const I=w==="homelab"?"Professional Home Lab":w==="simple"?"Simple Setup":"Public Server",b=v?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${I}. Settings saved to: ${b}`,"success",5e3),setTimeout(()=>location.reload(),500)}const h=document.getElementById("setup-step-1-next");h&&(h.onclick=function(m){m.preventDefault();const v=document.querySelector('input[name="config-type"]:checked');v&&(w=v.value),N(w==="homelab"?"setup-step-homelab":w==="simple"?"setup-step-simple":w==="public"?"setup-step-public":"setup-step-homelab")});const C=document.getElementById("setup-skip");C&&(C.onclick=async function(m){m.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await M({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const E=document.getElementById("setup-tld");E&&(E.oninput=function(m){const v=m.target.value||".home",I=document.getElementById("tld-preview"),b=document.getElementById("tld-preview-2");I&&(I.textContent=v),b&&(b.textContent=v)});const H=document.getElementById("setup-homelab-back");H&&(H.onclick=function(m){m.preventDefault(),N("setup-step-1")});const k=document.getElementById("setup-homelab-next");k&&(k.onclick=function(m){m.preventDefault();const v=document.getElementById("setup-tld")?.value?.trim()||"",I=document.getElementById("setup-ca-name")?.value?.trim()||"",b=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!v||!v.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!I){showNotification("Please enter a Certificate Authority name","warning");return}if(!b){showNotification("Please enter your DNS server IP address","warning");return}P()});const z=document.getElementById("setup-simple-back");z&&(z.onclick=function(m){m.preventDefault(),N("setup-step-1")});const S=document.getElementById("setup-simple-next");S&&(S.onclick=function(m){m.preventDefault(),P()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(m){m.onchange=function(){var v=document.getElementById("dns-requirement-note");v&&(v.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const T=document.getElementById("setup-public-back");T&&(T.onclick=function(m){m.preventDefault(),N("setup-step-1")});const D=document.getElementById("setup-public-next");D&&(D.onclick=function(m){m.preventDefault();const v=document.getElementById("setup-public-domain")?.value?.trim()||"",I=document.getElementById("setup-public-email")?.value?.trim()||"";if(!v){showNotification("Please enter your domain name","warning");return}if(!I||!I.includes("@")){showNotification("Please enter a valid email address","warning");return}P()});const y=document.getElementById("setup-summary-back");y&&(y.onclick=function(m){m.preventDefault(),w==="homelab"?N("setup-step-homelab"):w==="simple"?N("setup-step-simple"):w==="public"&&N("setup-step-public")});const B=document.getElementById("setup-summary-next");B&&(B.onclick=function(m){m.preventDefault(),N("setup-step-disk-safety")});const $=document.getElementById("setup-disk-safety-back");$&&($.onclick=function(m){m.preventDefault(),N("setup-step-summary")});const U=document.getElementById("setup-disk-safety-finish");U&&(U.onclick=function(m){m.preventDefault(),R()}),window.getGlobalConfig=async function(){try{const v=await fetch("/api/v1/config");if(v.ok){const I=await v.json();if(I&&I.setupComplete)return I}}catch{console.warn("Could not fetch config from server")}const m=safeGet("dashcaddy-config");return m?JSON.parse(m):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const w=new ErrorHandler;injectModal("app-selector-modal",`
Choose an App
`),injectModal("app-deploy-modal",`
Deploy Application
Your app will be available at: uptime.home
\u2713 Detected from existing media servers:
Select folders from existing servers, browse, or type paths manually. Separate multiple with commas.
Token expires in 4 minutes! Get it right before clicking Deploy. Leave empty to configure Plex manually later.
Checking Tailscale status...
\u2699\uFE0F Advanced Options
Use 'localhost' for same-host containers, or specific IP for remote services
Customize where container data is stored on the host. Media volumes are configured above.
Optional CPU and memory constraints. Leave at 0 for unlimited.
`);const x="custom-apps";let j=null,g=null;const N=document.getElementById("app-selector-modal"),P=document.getElementById("app-selector-grid");async function M(){try{const c=await(await fetch("/api/v1/apps/templates")).json();if(c.success)return j=c.templates,g=c.categories,!0}catch(l){w.logError("[AppSelector] Fetch Templates",l,{function:"fetchApiTemplates"})}return!1}async function R(l){try{return await(await fetch(`/api/v1/apps/ports/${l}/check`)).json()}catch(c){return w.logError("[AppSelector] Check Port",c,{function:"checkPortAvailability"}),{available:!0}}}async function h(l){try{const d=await(await fetch(`/api/v1/apps/ports/${l}/suggest`)).json();if(d.success)return d.suggestedPort}catch(c){w.logError("[AppSelector] Get Suggested Port",c,{function:"getSuggestedPort"})}return l}async function C(){if(P.innerHTML='
Loading app templates...
',!j&&!await M()){P.innerHTML='
Failed to load app templates. Please try again.
';return}P.innerHTML="";const l={};for(const[d,f]of Object.entries(j)){const p=f.category||"Other";l[p]||(l[p]=[]),l[p].push({id:d,...f})}const c=g?Object.keys(g):Object.keys(l).sort();for(const d of c){const f=l[d];if(!f||f.length===0)continue;f.sort((s,r)=>(r.popularity||0)-(s.popularity||0));const p=document.createElement("div");p.className="app-category-header";const e=g?.[d]||{};p.innerHTML=`${escapeHtml(e.icon||"")} ${escapeHtml(d)}`,e.color&&(p.style.borderBottomColor=e.color),P.appendChild(p),f.forEach(s=>{const r=document.createElement("div");r.className="app-option";const o=s.isDashboardWidget,a=o&&safeGet("widget-"+s.id+"-enabled")!=="false",t=o?`
${a?"ON":"OFF"}
`:"",n=!o&&s.difficulty?`
${escapeHtml(s.difficulty)}
`:"";r.innerHTML=`
${escapeHtml(s.icon||"\u{1F4E6}")}
${escapeHtml(s.name)}
${escapeHtml(s.description||"")}
${t}${n}
`,o?r.onclick=()=>E(s,r):r.onclick=()=>H(s),P.appendChild(r)})}window.renderRecipeCards&&await window.renderRecipeCards(P)}function E(l,c){const d="widget-"+l.id+"-enabled",p=!(safeGet(d)!=="false");safeSet(d,String(p));const e=l.widgetSelector;if(e){const r=document.querySelector(e);r&&(r.style.display=p?"":"none")}const s=c.querySelector('div[style*="border-radius: 4px"]');s&&(s.textContent=p?"ON":"OFF",s.style.background=p?"#2ecc7130":"#e74c3c30",s.style.color=p?"#2ecc71":"#e74c3c"),showNotification(`${l.name} widget ${p?"enabled":"disabled"}`,"success",2e3)}async function H(l){const c=document.getElementById("app-deploy-modal"),d=document.getElementById("app-deploy-title"),f=document.getElementById("deploy-subdomain"),p=document.getElementById("deploy-url-preview"),e=document.getElementById("deploy-ip"),s=document.getElementById("deploy-port"),r=document.getElementById("deploy-tailscale-only"),o=document.getElementById("tailscale-status");try{const V=await(await secureFetch("/api/v1/apps/check-existing",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:l.id})})).json();if(V.success&&V.exists){const Y=V.container;confirm(`Found existing ${l.name} container:
Container: ${Y.name}
Status: ${Y.status}
Port: ${Y.primaryPort||"N/A"}
Would you like to use this existing container?
Click OK to configure DNS/Caddy for the existing container.
Click Cancel to deploy a new container.`)&&(l._useExisting=!0,l._existingContainer=Y)}}catch{}d.textContent=`Deploy ${l.name}`;const a=l.subdomain||l.id.replace(/-/g,"");f.value=a;const t=document.getElementById("subpath-compat-warning");if(t)if(SITE.routingMode==="subdirectory"){const W=l.subpathSupport||"strip";W==="none"?(t.style.display="block",t.innerHTML='⚠ '+l.name+" does not support subdirectory mode. It may not work correctly at a subpath."):W==="strip"?(t.style.display="block",t.innerHTML='ⓘ '+l.name+" has unverified subdirectory support. It may require additional configuration."):t.style.display="none"}else t.style.display="none";const n=SITE.defaults.dnsType||(SITE.configurationType==="public"?"public":"private"),i=SITE.defaults.sslType||(SITE.configurationType==="public"?"letsencrypt":"internal"),u=document.querySelector(`input[name="dns-type"][value="${n}"]`),A=document.querySelector(`input[name="ssl-type"][value="${i}"]`);u?u.checked=!0:document.querySelector('input[name="dns-type"][value="private"]').checked=!0,A?A.checked=!0:document.querySelector('input[name="ssl-type"][value="internal"]').checked=!0,e.value=SITE.defaults.targetIP||"localhost",r.checked=!1;const O=document.querySelector("#app-deploy-modal .flex-col-gap")?.closest("div"),_=document.querySelector("#app-deploy-modal details"),F=_?.querySelector("div");if(_&&F&&(SITE.configurationType==="public"||SITE.configurationType==="homelab")){const W=document.querySelectorAll('#app-deploy-modal input[name="dns-type"]')[0]?.closest("div.flex-col-gap")?.parentElement,V=document.querySelectorAll('#app-deploy-modal input[name="ssl-type"]')[0]?.closest("div.flex-col-gap")?.parentElement;W&&!W.dataset.moved&&(F.appendChild(W),W.dataset.moved="1"),V&&!V.dataset.moved&&(F.appendChild(V),V.dataset.moved="1")}const q=document.getElementById("media-path-section"),J=document.getElementById("deploy-media-path"),G=document.getElementById("media-path-description");if(l.mediaMount){q.style.display="block",J.value="",J.placeholder="/media/Movies, /media/TVShows or click Browse";const W=document.getElementById("detected-mounts-container"),V=document.getElementById("detected-mounts-list");try{const X=await(await fetch("/api/v1/media/detected-mounts")).json();if(X.success&&X.mounts.length>0){W.style.display="block",V.innerHTML="";const ae=[...new Set(X.mounts.map(te=>te.hostPath))];J.value=ae.join(", "),X.mounts.forEach(te=>{const Q=document.createElement("button");Q.type="button";const de=ae.includes(te.hostPath);Q.style.cssText=`padding: 8px 14px; font-size: 0.85rem; background: color-mix(in srgb, var(--success) ${de?"40%":"15%"}, var(--card-bg)); border: 1px solid var(--success); border-radius: 6px; cursor: pointer; color: var(--fg);`,Q.innerHTML=`${escapeHtml(te.folderName)} from ${escapeHtml(te.sourceImage)}`,Q.title=`${te.hostPath} (from ${te.sourceContainer})`,Q.onclick=()=>{const le=J.value.split(",").map(ce=>ce.trim()).filter(ce=>ce),pe=le.indexOf(te.hostPath);pe>=0?(le.splice(pe,1),Q.style.background="color-mix(in srgb, var(--success) 15%, var(--card-bg))"):(le.push(te.hostPath),Q.style.background="color-mix(in srgb, var(--success) 40%, var(--card-bg))"),J.value=le.join(", ")},V.appendChild(Q)})}else W.style.display="none"}catch{W.style.display="none"}document.getElementById("browse-media-btn").onclick=()=>{openFolderBrowser(J)}}else q.style.display="none",J.value="",document.getElementById("detected-mounts-container").style.display="none";const Z=document.getElementById("plex-claim-section");Z&&(l.id==="plex"||l.claimToken?(Z.style.display="block",document.getElementById("deploy-plex-claim").value=""):Z.style.display="none");const ee=document.getElementById("volume-mounts-section"),ne=document.getElementById("volume-mounts-list");if(ne.innerHTML="",l.docker?.volumes?.length){const W=l.mediaMount?.containerPath,V=l.docker.volumes.filter(Y=>!Y.includes("{{MEDIA_PATH}}")&&!(W&&Y.endsWith(":"+W)));V.length>0?(ee.style.display="block",V.forEach((Y,X)=>{const[ae,te]=Y.split(":"),Q=document.createElement("div");Q.style.cssText="display: flex; gap: 6px; align-items: center;",Q.innerHTML=`
\u2192 ${te}
`,ne.appendChild(Q),Q.querySelector(".vol-browse-btn").onclick=()=>{const de=Q.querySelector(".vol-host-path");openFolderBrowser(de)}})):ee.style.display="none"}else ee.style.display="none";const oe=l.defaultPort||8080;s.value="",s.placeholder=`Default: ${oe}`;let K=document.getElementById("deploy-port-status");K||(K=document.createElement("div"),K.id="deploy-port-status",K.style.cssText="font-size: 0.8rem; margin-top: 4px;",s.parentNode.appendChild(K));async function ie(){const W=s.value||oe;K.innerHTML='Checking port...';const V=await R(W);if(V.available)K.innerHTML=`Port ${escapeHtml(String(W))} is available`;else{const Y=await h(oe);K.innerHTML=`
Port ${escapeHtml(W)} in use by ${escapeHtml(V.conflict?.usedBy||"unknown")}
`;const X=document.createElement("button");X.type="button",X.textContent=`Use ${Y}`,X.style.cssText="margin-left: 8px; padding: 2px 8px; font-size: 0.75rem; cursor: pointer;",X.onclick=()=>{document.getElementById("deploy-port").value=Y,K.innerHTML=`Using suggested port ${escapeHtml(String(Y))}`},K.appendChild(X)}}let re;s.oninput=function(){clearTimeout(re),re=setTimeout(ie,500)},ie();try{const V=await(await fetch("/api/v1/tailscale/status")).json();V.success&&V.installed&&V.connected?o.innerHTML=`
Connected${V.self?.hostname} (${V.self?.ip})| ${V.deviceCount} devices
`:V.installed?o.innerHTML='Not connected':(o.innerHTML='Not available',r.disabled=!0)}catch{o.innerHTML='Could not check status'}function se(){const W=f.value||"subdomain",V=document.querySelector('input[name="dns-type"]:checked').value,Y=document.querySelector('input[name="ssl-type"]:checked').value;let X="";if(SITE.routingMode==="subdirectory"&&SITE.domain)X=`https://${SITE.domain}/${W}`;else if(V==="private")X=`${Y==="none"?"http":"https"}://${buildDomain(W)}`;else if(V==="public"){const ae=Y==="none"?"http":"https",te=SITE.domain||W;X=SITE.domain?`${ae}://${W}.${SITE.domain}`:`${ae}://${W}`}else{const ae=s.value||l.defaultPort||DC.DEFAULTS.SERVICE_PORT;X=`http://${e.value}:${ae}`}p.textContent=X}f.oninput=se,e.oninput=se,s.oninput=se,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=se}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=se}),se(),N.classList.remove("show"),c.classList.add("show"),c.dataset.appTemplate=JSON.stringify(l)}async function k(l){const c=l.appTemplate,d=safeGetJSON(x,[]),f=c._useExisting&&c._existingContainer,p=d.find(e=>e.id===l.subdomain);if(!(p&&!f&&!confirm(`An app with subdomain "${l.subdomain}" already exists. Redeploy?`))){if(p){const e=d.indexOf(p);d.splice(e,1),safeSet(x,JSON.stringify(d))}if(f)l.port=c._existingContainer.primaryPort;else{const e=l.port||c.defaultPort||8080;showNotification(`Checking port ${e} availability...`,"info",0);const s=await R(e);if(!s.available){const r=await h(c.defaultPort||8080);if(confirm(`Port ${e} is already in use by ${s.conflict?.usedBy||"another container"}.
Would you like to use port ${r} instead?`))l.port=r;else{showNotification("Deployment cancelled - port conflict","error",5e3);return}}}showNotification(f?`Configuring ${c.name} with existing container...`:`Deploying ${c.name}...`,"info",0);try{const e={appId:c.id,config:{subdomain:l.subdomain,ip:l.ip,createDns:l.dnsType==="private",port:l.port||c.defaultPort||null,sslType:l.sslType,dnsType:l.dnsType,tailscaleOnly:l.tailscaleOnly||!1,mediaPath:l.mediaPath||null,plexClaimToken:l.plexClaimToken||null,customVolumes:l.customVolumes||null}};f&&(e.config.useExisting=!0,e.config.existingContainerId=c._existingContainer.id,e.config.existingPort=c._existingContainer.primaryPort,!l.port&&c._existingContainer.primaryPort&&(e.config.port=c._existingContainer.primaryPort));const s={app:c.id,port:l.port||c.defaultPort||null,subdomain:l.subdomain||"",media_path:l.mediaPath||"",env:l.plexClaimToken?{PLEX_CLAIM:l.plexClaimToken}:{}},o=await(await secureFetch("/api/v1/deploys/catalog/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();if(o.success){const a={id:l.subdomain,name:c.name,logo:`/assets/${c.id}.png`,containerId:null,url:o.url||`http://127.0.0.1:${s.port}`,ip:l.ip,appTemplate:c.id,tailscaleOnly:l.tailscaleOnly||!1};d.push(a),safeSet(x,JSON.stringify(d)),window.APPS&&!window.APPS.some(n=>n.id===c.id)&&(window.APPS.push(a),typeof window.buildGrid=="function"&&window.buildGrid(),typeof window.refreshAll=="function"&&setTimeout(()=>window.refreshAll(),500));let t=o.usedExisting?`${c.name} configured with existing container!
URL: ${o.url}`:`${c.name} deployed successfully!
URL: ${o.url}`;o.warning&&(t+=`
\u26A0 Warning: ${o.warning}`),showNotification(t,"success",8e3),delete c._useExisting,delete c._existingContainer,o.url&&o.url.startsWith("https://")&&z(o.url,c.name),o.setupInstructions&&o.setupInstructions.length>0&&setTimeout(()=>{const n=o.setupInstructions.join(`
`);showNotification(`Setup Instructions for ${c.name}: ${n}`,"info",1e4)},1e3)}else throw new Error(o.error||"Deployment failed")}catch(e){w.logError("[AppSelector] Deployment",e,{function:"deploy"}),showNotification(`Failed to deploy ${c.name}: ${e.message}`,"error",8e3)}}}async function z(l,c){showNotification(`\u23F3 Generating SSL certificate for ${c}...`,"warning",6e4);let d=0;const f=12,p=async()=>{d++;try{const e=await fetch(l,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${c} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return d{window.APPS.some(d=>d.id===c.id)||window.APPS.push(c)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{C(),N.classList.add("show")}),window.openDeployConfigFor=async function(l){if(!j&&!await M())return!1;const c=String(l||"").toLowerCase(),d=Object.entries(j).find(([p])=>p.toLowerCase()===c);if(!d)return!1;const f={id:d[0],...d[1]};return f.isDashboardWidget?(await C(),N.classList.add("show"),"selector"):(await H(f),!0)},wireModal(N,document.getElementById("app-selector-cancel"));const T=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{T.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const l=JSON.parse(T.dataset.appTemplate),c=document.getElementById("deploy-media-path").value.trim(),d=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(p=>{d.push({hostPath:p.value.trim(),containerPath:p.dataset.containerPath})});const f={appTemplate:l,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:c||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:d.length>0?d:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!f.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(l.mediaMount?.required&&!c){showNotification("Please enter a media library path for this application","warning");return}T.classList.remove("show"),k(f)}),wireModal(T);const D=document.getElementById("folder-browser-modal"),y=document.getElementById("folder-browser-path"),B=document.getElementById("folder-browser-list"),$=document.getElementById("folder-browser-selected"),U=document.getElementById("folder-browser-selected-list");let m="",v=[],I=null;window.openFolderBrowser=function(l){I=l,v=l.value.split(",").map(c=>c.trim()).filter(c=>c),m="",L(),b(""),D.classList.add("show")};async function b(l){y.textContent=l||"Select a drive...",B.innerHTML='
`,H.style.display="none",k.textContent="";return}if(!L&&l!==D)return;const p=Array.isArray(f.logs)?f.logs:[];if(p.length===0&&!L){const s=f.filters&&(f.filters.level||f.filters.context||f.filters.search||f.filters.since||f.filters.until)?"No error log entries match your filters.":"\u2705 No errors logged! Everything is working smoothly.";E.innerHTML=`
");for(const s of p){const r=(s.level||"?").toUpperCase(),o=r==="ERR"?"var(--bad-fg)":r==="WARN"?"var(--warn-fg, #f0c674)":"var(--muted)",a=s.timestamp?new Date(s.timestamp).toLocaleString():"\u2014",t=s.context||"\u2014",n=(s.error||"").split(`
`)[0],i=s.request&&s.request.ip||"";e+='
'})}})(),(function(){"use strict";const w=[{unit:"caddy",label:"Caddy (reverse proxy)"},{unit:"dashcaddy-api",label:"DashCaddy API (host systemd unit, not this container)"},{unit:"docker",label:"Docker daemon"},{unit:"ssh",label:"SSH server"},{unit:"systemd-journald",label:"systemd-journald"},{unit:"tailscaled",label:"Tailscale"},{unit:"networkd-dispatcher",label:"Networkd dispatcher"}];injectModal("journald-modal",`
\u{1F6F0}\uFE0F Host Logs (journald)
Stream host service logs from journalctl (read-only mount). Docker container logs are still in the Container Logs modal.
`}).join("");E.innerHTML=s,E.scrollHeight-E.scrollTop-E.clientHeight<80&&(E.scrollTop=E.scrollHeight)}H.textContent=`${y.length} entries`,k.textContent=p?`${e.length} of ${y.length} shown`:`${y.length} shown`}async function L(){if(!D)return;c();const p=j.value;if(!p)return;const e=Math.max(1,Math.min(5e3,Number(N.value)||200)),s=(g.value||"").trim();E.innerHTML='
Create and manage Docker container checkpoints for instant state recovery.
Image:
Status:
Created:
Container ID:
\u{1F4BE}Select a container to view its snapshots
`);const w=document.getElementById("snapshot-modal"),x=document.getElementById("snapshot-btn"),j=document.getElementById("snapshot-close"),g=document.getElementById("snapshot-container-select"),N=document.getElementById("snapshot-details"),P=document.getElementById("snapshot-create-btn"),M=document.getElementById("snapshot-create-status");let R=null;async function h(){try{const S=await(await fetch("/api/v1/containers")).json();if(!S.success||!S.containers)return;g.innerHTML='';for(const T of S.containers){const D=document.createElement("option");D.value=T.id,D.textContent=`${T.name||T.id} (${T.image||"unknown"})`,D.dataset.name=T.name,D.dataset.image=T.image,D.dataset.status=T.status,D.dataset.created=T.created,g.appendChild(D)}}catch(z){console.error("Failed to load containers:",z)}}function C(z){if(!z||!z.value){N.style.display="none",R=null;return}R=z.value,document.getElementById("snapshot-image").textContent=z.dataset.image||"-",document.getElementById("snapshot-status").textContent=z.dataset.status||"-",document.getElementById("snapshot-created").textContent=z.dataset.created?new Date(z.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=z.value.substring(0,12),N.style.display=""}async function E(){if(!R){M.textContent="Please select a container first",M.style.color="var(--bad-fg)";return}const z=document.getElementById("snapshot-name").value.trim();if(!z){M.textContent="Please enter a snapshot name",M.style.color="var(--bad-fg)";return}const S=document.getElementById("snapshot-leave-running").checked;P.disabled=!0,P.textContent="Creating...",M.textContent="";try{const D=await(await fetch(`/api/v1/containers/${encodeURIComponent(R)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:z,leaveRunning:S})})).json();D.success?(M.textContent=`\u2713 Snapshot "${z}" created successfully`,M.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(M.textContent=`\u2717 Failed: ${D.error||"Unknown error"}`,M.style.color="var(--bad-fg)")}catch(T){M.textContent=`\u2717 Error: ${T.message}`,M.style.color="var(--bad-fg)"}finally{P.disabled=!1,P.textContent="\u{1F4BE} Create Snapshot"}}function H(){w.classList.add("show"),h()}function k(){w.classList.remove("show"),N.style.display="none",R=null,g.selectedIndex=0}x?.addEventListener("click",H),j?.addEventListener("click",k),wireModal(w,j),g?.addEventListener("change",z=>{const S=g.options[g.selectedIndex];C(S)}),P?.addEventListener("click",E),w?.querySelectorAll(".panel-tab").forEach(z=>{z.addEventListener("click",()=>{w.querySelectorAll(".panel-tab").forEach(S=>S.classList.remove("active")),w.querySelectorAll(".panel-section").forEach(S=>S.classList.remove("active")),z.classList.add("active"),w.querySelector(`#${z.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`
\u{1F3AC} Smart Arr Connect
Auto-discover and connect your entire media stack.
`,h.style.display="block"}}function U(b){let L="";const l=b.services,c=["radarr","sonarr","prowlarr"];for(const p of c){const e=l[p];if(!e||e.status==="not_found"&&!e.url)continue;const s=T[p],r=D[p],o=e.status==="connected";L+=`
`}C.innerHTML=L,C.querySelectorAll("[data-smart-test]").forEach(p=>{p.addEventListener("click",()=>window.smartTestConnection(p.dataset.smartTest))})}window.smartTestConnection=async function(b){const L=document.getElementById(`smart-${b}-url`),l=document.getElementById(`smart-${b}-key`),c=document.getElementById(`smart-${b}-status`),d=L?.value.trim(),f=l?.value.trim();if(!d||!f){c.innerHTML='Enter URL and API key';return}c.innerHTML='';try{const e=await(await secureFetch("/api/v1/arr/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:b,url:d,apiKey:f})})).json();e.success?c.innerHTML=`✓ ${escapeHtml(e.appName||"Connected")} v${escapeHtml(e.version||"")}`:c.innerHTML=`✗ ${escapeHtml(e.error)}`}catch(p){c.innerHTML=`✗ ${escapeHtml(p.message)}`}};async function m(){y("progress"),E.innerHTML='
Connecting services...
';const b={};for(const l of["radarr","sonarr","prowlarr"]){const c=document.getElementById(`smart-${l}-url`)?.value.trim(),d=document.getElementById(`smart-${l}-key`)?.value.trim();d&&c?b[l]={apiKey:d,url:c}:d&&(b[l]={apiKey:d})}const L={services:Object.keys(b).length>0?b:void 0,configurePlex:document.getElementById("smart-opt-plex")?.checked,configureProwlarr:document.getElementById("smart-opt-prowlarr")?.checked,configureSeerr:document.getElementById("smart-opt-seerr")?.checked,saveCredentials:document.getElementById("smart-opt-save")?.checked};try{const c=await(await secureFetch("/api/v1/arr/smart-connect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(L)})).json();let d="";for(const f of c.steps||[]){const p=f.status==="success"?'✓':'✗',e=f.status==="success"?"var(--muted)":"var(--bad-fg)";d+=`
"}}}async function I(r,o){try{var a=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:r,...o})}),t=await a.json();t.success?showNotification("Schedule updated for "+r,"success"):(showNotification("Update failed: "+(t.error||"Unknown"),"error"),v())}catch(n){showNotification("Error: "+n.message,"error")}}async function b(r){try{var o=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(r),{method:"POST",headers:{"Content-Type":"application/json"}}),a=await o.json();a.success?showNotification("Backup started for "+r+"!","success"):showNotification("Backup failed: "+(a.error||"Unknown"),"error")}catch(t){showNotification("Error: "+t.message,"error")}}async function L(r){if(confirm("Remove backup schedule for "+r+"?"))try{var o=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(r),{method:"DELETE"}),a=await o.json();a.success?(showNotification("Schedule removed for "+r,"success"),v()):showNotification("Delete failed: "+(a.error||"Unknown"),"error")}catch(t){showNotification("Error: "+t.message,"error")}}async function l(){var r=document.getElementById("new-schedule-appid")?.value?.trim(),o=document.getElementById("new-schedule-interval")?.value||"daily",a=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!r){showNotification("Please enter an App ID","warning");return}try{var t=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:r,schedule:o,retention:{keep:a},enabled:!0})}),n=await t.json();if(n.success){showNotification("Schedule created for "+r,"success"),v();var i=document.getElementById("new-schedule-appid");i&&(i.value="")}else showNotification("Failed: "+(n.error||"Unknown"),"error")}catch(u){showNotification("Error: "+u.message,"error")}}async function c(){if($){$.innerHTML='
Loading...
';try{var r=await fetch("/api/v1/backups/files"),o=await r.json();if(!o.success)throw new Error(o.error||"Failed to load");var a=o.files||[];if(a.length===0){$.innerHTML='
"}}}window.__restoreServerBackup=async function(r){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var o=await secureFetch("/api/v1/backups/restore/"+r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),a=await o.json();a.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(a.error||"Unknown error"),"error")}catch(t){showNotification("Restore error: "+t.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",v),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",c),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",f),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",d);async function f(){if(U){try{var r=await fetch("/api/v1/license/status"),o=await r.json();if(o.tier!=="premium"){U.innerHTML='
\u2B50
Premium Feature
Point-in-time restore requires DashCaddy Premium with auto-backup enabled.
Configuration differs \u2014 restoring will replace current settings
':i+='
No changes
',i+="
"}i+='
',document.body.insertAdjacentHTML("beforeend",i),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function(O){O.target===this&&this.remove()})}catch(O){showNotification("Compare error: "+O.message,"error")}}async function s(r,o){if(confirm("Restore "+o+" for "+r+`?
This will replace current configuration, credentials, and data. Containers will be restarted.`))try{var a=await secureFetch("/api/v1/apps/"+encodeURIComponent(r)+"/revert/"+encodeURIComponent(o),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restartContainers:!0})}),t=await a.json();t.success?(showNotification(r+" restored to "+o,"success"),setTimeout(function(){location.reload()},1500)):showNotification("Restore failed: "+(t.error||"Unknown"),"error")}catch(n){showNotification("Restore error: "+n.message,"error")}}})(),(function(){injectModal("stats-modal",`
\u{1F4CA} Resource Monitor
Real-time and historical CPU, memory, network, and disk usage for containers.
Loading container stats...
\u{1F4C8}
Loading 24-hour aggregated metrics...
\u{1F4CA}
Choose a container and time range to view history.
\u{1F514}
Loading alert configurations...
`);const w=document.getElementById("stats-modal"),x=document.getElementById("container-stats-btn"),j=document.getElementById("stats-cancel"),g=document.getElementById("stats-refresh-btn"),N=document.getElementById("stats-auto-refresh"),P=document.getElementById("stats-container"),M=document.getElementById("stats-aggregated-container"),R=document.getElementById("stats-alerts-container"),h=document.getElementById("stats-last-update");let C=null,E=null;function H(d){if(d===0||!d)return"0 B";const f=1024,p=["B","KB","MB","GB"],e=Math.floor(Math.log(d)/Math.log(f));return parseFloat((d/Math.pow(f,e)).toFixed(1))+" "+p[e]}function k(d){return d<30?"#2ecc71":d<70?"#f39c12":"#e74c3c"}function z(d){return d<50?"#2ecc71":d<80?"#f39c12":"#e74c3c"}async function S(){try{let d=null,f=!1;try{const s=await(await fetch("/api/v1/monitoring/stats")).json();s.success&&s.stats&&(d=s.stats,f=!0,E=s.stats)}catch{}if(!f){const s=await(await fetch("/api/v1/stats/containers")).json();if(s.success&&s.stats){d={};for(const r of s.stats)d[r.name]={name:r.name,current:{cpu:r.cpu,memory:{percent:r.memory.percent,usage:r.memory.used,limit:r.memory.limit,usageMB:Math.round(r.memory.used/1048576),limitMB:Math.round(r.memory.limit/1048576)},network:{rxBytes:r.network.rx,txBytes:r.network.tx,rxMB:(r.network.rx/1048576).toFixed(1),txMB:(r.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:r.status};E=d}}if(!d||Object.keys(d).length===0){P.innerHTML='
';try{const s=await(await fetch(`/api/v1/monitoring/history/${encodeURIComponent(d)}?startTime=${p}&endTime=${f}`)).json();if(!s.success)throw new Error(s.error||"Failed to load history");const r=s.samples||[],o=s.tier||"raw";if(r.length===0){U.innerHTML=`
\u{1F4CA}No data for the last ${v}. Tier: ${b(o)}.
Service uptime tracking, SLA monitoring, and incident management.
Loading health status...
\u{1F6A8} Loading incidents...
\u2699\uFE0F Loading configuration...
\u{1F30D} Global Settings
Applies to all health checks. Settings are stored locally in this browser.
How often each service's health endpoint is checked.
How often container statistics (CPU/memory) are sampled.
Cap on stored history records per service.
Health history older than this is pruned.
Warn when disk usage exceeds this level.
Add Health Check
`);const w=document.getElementById("health-modal"),x=document.getElementById("health-check-btn"),j=document.getElementById("health-cancel"),g=document.getElementById("health-refresh-btn"),N=document.getElementById("health-status-container"),P=document.getElementById("health-incidents-container"),M=document.getElementById("health-config-container"),R=document.getElementById("health-last-update"),h=document.getElementById("health-add-btn"),C=document.getElementById("health-config-form"),E=document.getElementById("health-form-title"),H=document.getElementById("health-form-cancel"),k=document.getElementById("health-form-save"),z="dashcaddy-health-settings",S={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},T=document.getElementById("health-global-save"),D=document.getElementById("health-global-reset"),y=document.getElementById("health-global-status"),B=document.getElementById("health-setting-retention"),$=document.getElementById("health-setting-interval"),U=document.getElementById("health-setting-stats-interval"),m=document.getElementById("health-setting-max-entries"),v=document.getElementById("health-setting-disk-threshold");function I(){try{const a=safeGet(z),t=a?JSON.parse(a):{};return Object.assign({},S,t)}catch{return Object.assign({},S)}}function b(){const a=I();B&&(B.value=a.retentionDays),$&&($.value=a.pollingInterval),U&&(U.value=a.statsPollingInterval),m&&(m.value=a.maxEntriesPerService),v&&(v.value=a.diskUsageThreshold)}function L(){const a={retentionDays:Math.max(1,Math.min(3650,parseInt(B?.value)||S.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt($?.value)||S.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(U?.value)||S.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(m?.value)||S.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(v?.value)||S.diskUsageThreshold))};try{safeSet(z,JSON.stringify(a)),b(),y&&(y.textContent="Saved \u2713",y.style.color="var(--ok-fg)",setTimeout(()=>{y&&(y.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(t){y&&(y.textContent="Save failed",y.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+t.message,"error")}}function l(){try{safeSet(z,JSON.stringify(S))}catch{}b(),y&&(y.textContent="Reset to defaults \u2713",y.style.color="var(--ok-fg)",setTimeout(()=>{y&&(y.textContent="")},2500))}b(),T?.addEventListener("click",L),D?.addEventListener("click",l);let c=null;function d(a){return a>=99.9?"var(--ok-fg)":a>=95?"#f39c12":"var(--bad-fg)"}function f(a){const t={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`${a}`}async function p(){try{const t=await(await fetch("/api/v1/health-checks/status")).json();if(!t.success||!t.status||Object.keys(t.status).length===0){N.innerHTML='
\u{1F3E5}No health checks configured. Go to the Configure tab to add services.
';return}const n=Object.values(t.status);let i='
';i+='
',i+='
Service
Status
',i+='
Uptime 24h
Uptime 7d
',i+='
Avg Response
Last Check
';for(const u of n){const A=u.status==="up",O=A?"var(--dot-ok)":"var(--dot-bad)",_=u.uptime?.["24h"]??"-",F=u.uptime?.["7d"]??"-",q=u.avgResponseTime!=null?Math.round(u.avgResponseTime)+"ms":"-",J=u.timestamp?timeAgo(u.timestamp):"-";i+=`
';for(const _ of O){const F=_.status==="resolved",q=F&&_.duration?_.duration<6e4?Math.round(_.duration/1e3)+"s":Math.round(_.duration/6e4)+"m":"-";u+='
',u+=`
${escapeHtml(_.serviceId)}
`,u+=`
${escapeHtml(_.type)}
`,u+=`
${f(_.severity)}
`,u+=`
${_.status}
`,u+=`
${q}
`,u+=`
${timeAgo(_.createdAt)}
`,u+="
"}u+="
"}P.innerHTML=u||'
\u{1F6A8}No incidents recorded yet.
'}catch(a){P.innerHTML=`
Failed: ${escapeHtml(a.message)}
`}}async function s(){try{const t=await(await fetch("/api/v1/health-checks/status")).json(),n=t.success&&t.status?Object.values(t.status):[];if(n.length===0){M.innerHTML='
\u2699\uFE0FNo health checks configured yet. Click "Add Health Check" below.
`}}function r(a,t,n,i,u,A,O){c=a||null,E.textContent=a?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=a||"",document.getElementById("health-form-id").disabled=!!a,document.getElementById("health-form-name").value=t||"",document.getElementById("health-form-url").value=n||"",document.getElementById("health-form-timeout").value=i||1e4,document.getElementById("health-form-codes").value=u||"200",document.getElementById("health-form-sla").value=A||99.9,document.getElementById("health-form-slow").value=O||5e3,C.style.display="",h.style.display="none"}function o(){C.style.display="none",h.style.display="",c=null}h?.addEventListener("click",()=>r("","","",1e4,"200",99.9,5e3)),H?.addEventListener("click",o),k?.addEventListener("click",async()=>{const a=c||document.getElementById("health-form-id").value.trim();if(!a)return showNotification("Service ID is required","warning");const t=document.getElementById("health-form-url").value.trim();if(!t)return showNotification("URL is required","warning");const n=document.getElementById("health-form-codes").value.split(",").map(u=>parseInt(u.trim())).filter(Boolean),i={name:document.getElementById("health-form-name").value.trim()||a,url:t,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:n.length?n:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{k.textContent="Saving...",k.disabled=!0;const A=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(a)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})).json();if(!A.success)throw new Error(A.error||"Save failed");o(),s(),p()}catch(u){showNotification("Error: "+u.message,"error")}finally{k.textContent="Save",k.disabled=!1}}),document.addEventListener("health-edit",async a=>{const t=a.detail;r(t,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async a=>{const t=a.detail;if(confirm(`Delete health check for "${t}"?`))try{const i=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(t)}/configure`,{method:"DELETE"})).json();if(!i.success)throw new Error(i.error);s(),p()}catch(n){showNotification("Error: "+n.message,"error")}}),x?.addEventListener("click",()=>{w?.classList.add("show"),p()}),wireModal(w,j),g?.addEventListener("click",p),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",e),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",s)})(),(function(){injectModal("updates-modal",`
\u2B06\uFE0F Update Management
Check for container image updates, apply them, and manage rollbacks.
\u{1F4E6} Click "Check for Updates" to scan containers.
Loading update history...
\u{1F916} Loading auto-update configuration...
DashCaddy
Loading...
Update available
New version:
\u{1F4E6}No self-update history.
`);const w=document.getElementById("updates-modal"),x=document.getElementById("updates-btn"),j=document.getElementById("updates-cancel"),g=document.getElementById("updates-check-btn"),N=document.getElementById("updates-available-container"),P=document.getElementById("updates-history-container"),M=document.getElementById("updates-auto-container"),R=document.getElementById("updates-last-check");async function h(){try{const e=await(await fetch("/api/v1/updates/available")).json();if(!e.success)throw new Error(e.error);const s=e.updates||[];if(s.length===0){N.innerHTML='
';for(const t of s){const n=(()=>{const i=window.APPS||[];for(const u of i)if(u.containerId===t.containerId||u.name===t.containerName||u.id===t.containerName)return u.id;return t.containerName})();r+=`
`,r+=`
${escapeHtml(t.containerName)}
`,r+=`
${escapeHtml(t.imageName)}
`,r+=`
${escapeHtml(t.currentDigest)}
`,r+=`
${escapeHtml(t.latestDigest)}
`,r+='
',r+=``,r+=``,r+="
"}r+="
",N.innerHTML=r,R.textContent=s.length+" update(s) available";const o=document.getElementById("updates-count-badge"),a=document.getElementById("updates-update-all-btn");o&&(o.textContent=s.length+" pending",o.style.display=""),a&&s.length>0&&(a.style.display=""),window._pendingUpdates=s,N.querySelectorAll(".update-now-btn").forEach(t=>{t.addEventListener("click",async()=>{const n=t.dataset.id,i=t.dataset.name;if(confirm(`Update "${i}" to the latest version? The container will restart.`)){t.textContent="Updating...",t.disabled=!0;try{const A=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(n)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if(A.success)t.textContent="Done!",t.style.background="var(--ok-fg)",setTimeout(()=>h(),2e3);else throw new Error(A.error||"Update failed")}catch(u){t.textContent="Failed",t.style.color="var(--bad-fg)",showNotification("Update error: "+u.message,"error"),setTimeout(()=>{t.textContent="Update",t.disabled=!1,t.style.color="",t.style.background=""},3e3)}}})}),N.querySelectorAll(".rollback-btn").forEach(t=>{t.addEventListener("click",async()=>{const n=t.dataset.id,i=t.dataset.name;if(confirm(`Rollback "${i}" to its previous version?`)){t.textContent="Rolling back...",t.disabled=!0;try{const A=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(n)}`,{method:"POST"})).json();if(A.success)t.textContent="Rolled back!",setTimeout(()=>h(),2e3);else throw new Error(A.error||"Rollback failed")}catch(u){t.textContent="Failed",showNotification("Rollback error: "+u.message,"error"),setTimeout(()=>{t.textContent="Rollback",t.disabled=!1},3e3)}}})})}catch(p){N.innerHTML=`
Failed: ${escapeHtml(p.message)}
`}}async function C(){const p=window._pendingUpdates||[];if(!p.length)return;const e=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${p.length} containers? Each will restart.`))return;e.textContent="\u23F3 Updating...",e.disabled=!0;let s=0,r=0;for(const o of p)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?s++:r++}catch{r++}e.textContent="\u2705 Done",showNotification(`Update all: ${s} succeeded, ${r} failed.`,s>0&&r===0?"success":"error"),setTimeout(()=>{e.textContent="\u2B06\uFE0F Update All",e.disabled=!1,h()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",C);async function E(){g.textContent="\u{1F50D} Checking...",g.disabled=!0;try{const e=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!e.success)throw new Error(e.error);g.textContent="\u2705 Done!",await h()}catch(p){g.textContent="\u274C Failed",showNotification("Check error: "+p.message,"error")}setTimeout(()=>{g.textContent="\u{1F50D} Check for Updates",g.disabled=!1},3e3)}async function H(){try{P.innerHTML='
Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.
';t+='
',t+='
Container
Schedule
Window
Rollback
Last Run
Actions
';for(const n of o){const i=n.name||n.Names?.[0]?.replace(/^\//,"")||n.Id?.substring(0,12),u=n.containerId||n.Id,A=a[u]||{},O=A.enabled?A.schedule||"weekly":"",_=A.autoRollback!==!1,F=A.maintenanceWindow||"",q=A.lastAutoUpdate?timeAgo(A.lastAutoUpdate):"Never";t+=`
`}}const z=document.getElementById("dashcaddy-current-version"),S=document.getElementById("dashcaddy-update-badge"),T=document.getElementById("dashcaddy-update-details"),D=document.getElementById("dashcaddy-new-version"),y=document.getElementById("dashcaddy-changelog"),B=document.getElementById("dashcaddy-apply-btn"),$=document.getElementById("dashcaddy-check-btn"),U=document.getElementById("dashcaddy-rollback-btn"),m=document.getElementById("dashcaddy-status-bar"),v=document.getElementById("dashcaddy-history-container");let I=null;function b(p,e){m&&(m.style.display="block",m.style.background=e==="error"?"var(--bad-bg)":e==="success"?"var(--ok-bg)":"var(--bg)",m.style.color=e==="error"?"var(--bad-fg)":e==="success"?"var(--ok-fg)":"var(--fg)",m.textContent=p)}async function L(){try{const e=await(await fetch("/api/v1/system/version")).json();if(e.success){const s=e.commit&&e.commit!=="unknown"?e.commit:null;z.textContent="v"+e.version+(s?" ("+s.substring(0,7)+")":"")}}catch{z.textContent="Unable to fetch version"}}async function l(p){p||($.textContent="Checking...",$.disabled=!0);try{const s=await(await fetch("/api/v1/system/update-check")).json();if(I=s,s.success&&s.available&&s.remote){S.style.display="",T.style.display="",D.textContent="v"+s.remote.version,y.textContent=s.remote.changelog||"No changelog available.";const r=document.getElementById("updates-btn");if(r&&!r.querySelector(".update-dot")){const a=document.createElement("span");a.className="update-dot",a.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",r.style.position="relative",r.appendChild(a)}const o=document.getElementById("updates-dashcaddy-tab");if(o&&!o.querySelector(".update-dot")){const a=document.createElement("span");a.className="update-dot",a.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",o.appendChild(a)}}else S.style.display="none",T.style.display="none",await L(),p||b("You are running the latest version.","success");p||($.textContent="Check for Updates",$.disabled=!1)}catch(e){p||(b("Failed to check: "+e.message,"error"),$.textContent="Check for Updates",$.disabled=!1)}}async function c(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;B.textContent="Updating...",B.disabled=!0,b("Downloading and applying update...","info");try{const e=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(e.success)return b("Update initiated: v"+(e.fromVersion||"?")+" \u2192 v"+(e.toVersion||"?")+". The container will restart shortly.","success"),B.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(s=>s.remove()),!0;throw new Error(e.error||"Update failed")}catch(p){throw b("Update failed: "+p.message,"error"),B.textContent="Update Now",B.disabled=!1,p}}async function d(){try{const e=await(await fetch("/api/v1/system/update-history")).json(),s=e.success&&e.history?e.history:[];if(s.length===0){v.innerHTML='
\u{1F4E6}No self-update history.
';return}let r='
';r+='
When
Version
From
Status
';for(const o of s){const a=o.status==="success"?"\u2713 success":o.status==="pending"?"\u23F3 pending":o.status==="partial"?"\u26A0 partial":"\u2717 "+o.status,t=o.status==="success"?"var(--ok-fg)":o.status==="pending"?"var(--muted)":"var(--bad-fg)";r+='
"}}async function f(){try{const e=await(await fetch("/api/v1/system/rollback-versions")).json(),s=e.success&&e.versions?e.versions:[];if(s.length===0){showNotification("No rollback versions available.","info");return}const r=prompt(`Available rollback versions:
`+s.join(`
`)+`
Enter version to rollback to:`);if(!r)return;if(!s.includes(r)){showNotification("Invalid version: "+r,"error");return}if(!confirm("Rollback DashCaddy to v"+r+"? The container will restart."))return;b("Rolling back to v"+r+"...","info");const a=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:r})})).json();if(a.success)b("Rollback to v"+r+" initiated. Container will restart.","success");else throw new Error(a.error||"Rollback failed")}catch(p){b("Rollback failed: "+p.message,"error")}}$?.addEventListener("click",()=>l(!1)),B?.addEventListener("click",()=>c().catch(()=>{})),U?.addEventListener("click",f),g?.addEventListener("click",E),x?.addEventListener("click",()=>{w?.classList.add("show"),h()}),wireModal(w,j),window.openUpdateModal=function(p){w?.classList.add("show"),h().then(()=>{if(!p)return;const e=N.querySelector(`[data-app-id="${p}"]`);e&&(e.scrollIntoView({behavior:"smooth",block:"center"}),e.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{e.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",H),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",k),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{L(),d(),I||l(!0)}),window.dcApplyUpdate=c,window.dcCheckForUpdate=l,setTimeout(()=>l(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`
",R.innerHTML=E,R.querySelectorAll(".dr-vol-del").forEach(H=>{H.addEventListener("click",async()=>{if(confirm(`Delete volume "${H.dataset.name}"? Data will be lost.`)){H.textContent="...",H.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent(H.dataset.name)}?force=true`),N()}catch(k){showNotification("Delete failed: "+k.message,"error"),H.textContent="Delete",H.disabled=!1}}})})}catch(h){R.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const R=document.getElementById("dr-vol-name"),h=R.value.trim();if(!h){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:h}),R.value="",showNotification(`Volume "${h}" created`,"success"),N()}catch(C){showNotification("Create failed: "+C.message,"error")}});async function P(){const R=document.getElementById("dr-net-list");try{const C=(await getJSON("/api/v1/docker/networks")).networks||[];if(C.length===0){R.innerHTML='
\u{1F310}No networks found.
';return}let E='
';E+='
Name
Driver
Scope
Containers
Actions
';for(const H of C){const k=["bridge","host","none"].includes(H.name);E+='
';for(const E of h.results){const H=E.status==="deployed"||E.status==="created"?"\u2705":E.status==="exists"?"\u26A1":E.status==="skipped"?"\u23ED":"\u274C";C+='
`,E.style.display="none";return}if(!$&&U!==z)return;const d=Array.isArray(c.entries)?c.entries:[];if(d.length===0&&!$){const p=c.filters&&(c.filters.action||c.filters.outcome||c.filters.since||c.filters.until)?"No entries match your filters.":"No audit log entries yet. Actions will be logged automatically.";C.innerHTML=`
\u{1F4DC}${escapeHtml(p)}
`,E.style.display="none";return}let f="";$||(f='
',f+='
',f+='
When
',f+='
Actor
',f+='
IP
',f+='
Action
',f+='
Resource
',f+='
Result
',f+="
");for(const p of d){const e=p.outcome==="success",s=y(p);f+='
`}async function m(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],d=T.value;T.innerHTML=''+c.map(f=>``).join(""),d&&(T.value=d)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",I),document.getElementById("sec-hosts-refresh").addEventListener("click",v);async function v(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];M=c;const d=document.getElementById("sec-hosts-container");if(!c.length){d.innerHTML='
No hosts registered. Click \u2795 Register Host to add one.
id: ${b(f.id)} \xB7
registered ${new Date(f.registered_at).toLocaleDateString()} \xB7
last seen ${f.last_seen_at?new Date(f.last_seen_at).toLocaleString():"never"}
${p}
${f.id==="self"?"":``}
`}).join(""),d.querySelectorAll(".sec-host-del").forEach(f=>{f.addEventListener("click",async()=>{confirm(`Remove host ${f.dataset.id}? Events already received will remain in the store.`)&&(await fetch(`/api/v1/security/hosts/${encodeURIComponent(f.dataset.id)}`,{method:"DELETE"}),v())})})}catch(l){document.getElementById("sec-hosts-container").innerHTML='
Load failed: '+b(l.message)+"
"}}async function I(){const l=prompt("Host id (lowercase, no spaces):");if(!l)return;const c=prompt("Display label:",l)||l,d=prompt('Type ("dashcaddy", "service", or "agent"):',"agent")||"agent";try{const f=await fetch("/api/v1/security/hosts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:l,label:c,type:d})}),p=await f.json();if(!f.ok){alert("Failed: "+(p?.error?.message||f.statusText));return}alert(`\u2705 Host registered!
id: ${p.data.host.id}
label: ${p.data.host.label}
type: ${p.data.host.type}
\u{1F511} API KEY (save this NOW \u2014 won't be shown again):
${p.data.api_key}
Send this key as: Authorization: Bearer
To endpoint: POST /api/v1/security/events/ingest or /events/batch`),v()}catch(f){alert("Failed: "+f.message)}}function b(l){return String(l).replace(/[&<>"']/g,c=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[c])}function L(l,c){let d;return function(){clearTimeout(d),d=setTimeout(()=>l.apply(this,arguments),c)}}})(),window.__dc133_buildRepoOptions=function(w,x){var j=x||function(g){return String(g).replace(/[&<>"']/g,function(N){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[N]})};return''+(w||[]).map(function(g){return'"}).join("")},window.__dc133_requestToken=function(w,x){if(w)return"";var j=String(x||"").trim();return j||void 0},(function(){injectModal("deploys-modal",`
\u{1F69A} Deploys
Source deploys via shipdeck: build \u2192 package \u2192 systemd release \u2192 Caddy gate \u2192 DNS \u2192 verify.
Loading\u2026
Deploys are serialized fleet-side; a run takes ~30-60s. Output streams below when it finishes.
Loading\u2026
Gitea server (any instance)
Go repos with a main package install automatically: build, systemd release,
Caddy gate (tailnet-only), DNS, verify, dashboard card. Takes ~30-60s.
`);const w=D=>document.getElementById(D);let x=null,j=!1;function g(D){return window.escapeHtml?window.escapeHtml(String(D)):String(D).replace(/[&<>"']/g,y=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[y])}async function N(D,y){const B=await fetch("/dashcaddy-api/api/v1/deploys"+D,Object.assign({credentials:"include"},y||{}));let $=null;try{$=await B.json()}catch{$={success:!1,error:"non-JSON response"}}return{status:B.status,body:$}}function P(D){const y=w("dep-output");y.style.display="block",y.textContent=D||"(no output)",y.scrollTop=y.scrollHeight}async function M(){const D=w("dep-services"),{body:y}=await N("/services");if(!y.success){D.innerHTML=""+g(y.error||"unavailable")+"";return}const B=y.services||[];if(!B.length){D.innerHTML="No shipdeck deployments on record yet.";return}D.innerHTML='
Service
Last action
When
Release
'+B.map($=>"
"+g($.name)+"
"+g($.last_action)+"
"+g($.last_time)+"
"+g($.last_epoch)+'
').join("")+"
"}async function R(){const D=w("dep-repo-select"),{body:y}=await N("/repos");if(!y.success){D.innerHTML="";return}const B=y.repos||[];D.innerHTML=B.length?B.map($=>'").join(""):''}async function h(D){const y=w("dep-journal"),B=D?"?service="+encodeURIComponent(D):"",{body:$}=await N("/journal"+B),U=$.rows||[];if(!U.length){y.innerHTML="No journal rows.";return}y.innerHTML='
Time
Service
Action
Release
Duration
'+U.map(m=>"
"+g(m.time)+"
"+g(m.service)+"
"+g(m.action)+"
"+g(m.epoch)+"
"+g(m.duration||"\u2014")+"
").join("")+"
"}async function C(){const D=document.getElementById("dep-gh-gitea"),y=document.getElementById("dep-gh-gitea-host"),B=document.getElementById("dep-gh-gitea-token"),$=document.getElementById("dep-gh-anonymous"),U={};if(y&&y.value.trim()&&(U.gitea_url="https://"+y.value.trim().replace(/^https?:\/*/,"")),$&&$.checked)U.token="";else{const m=window.__dc133_requestToken(!1,B&&B.value);m!==void 0&&(U.token=m)}try{const{status:m,body:v}=await N("/gitea-repos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(U)});if(!v.success||!(v.repos||[]).length){D.innerHTML='";return}D.innerHTML=window.__dc133_buildRepoOptions(v.repos,g)}catch{D.innerHTML=''}}async function E(){const D=document.getElementById("dep-gh-btn"),y=document.getElementById("dep-gh-url").value.trim(),B=(document.getElementById("dep-gh-service").value.trim()||"").toLowerCase(),$=document.getElementById("dep-gh-args").value.trim();if(!y||!B){P("Repo URL and name are required.");return}const U=$?$.split(/\s+/):[];H(!0,D,"Install"),P("Installing "+y+`
Cloning, building, gating and DNS-ing... (~30-60s)`);try{const m=!!(document.getElementById("dep-gh-anonymous")||{}).checked,v=(document.getElementById("dep-gh-gitea-token")||{value:""}).value,I=window.__dc133_requestToken(m,v),{status:b,body:L}=await N("/install",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo_url:y,service:B,args:U,token:I})});if(!L.success){P((L.output?L.output+`
`:"")+"FAIL "+(L.error||"HTTP "+b)),H(!1,D,"Install");return}const l=L.service||{};if(!(window.APPS||[]).some(d=>d.id===l.id)){const d={id:l.id,name:l.name||l.id,url:l.url,logo:l.logo,tailscaleOnly:!0,isCustom:!0};try{await fetch("/dashcaddy-api/api/v1/services",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)}),window.APPS.push(d),typeof window.renderApps=="function"&&window.renderApps(),typeof window.renderGrid=="function"&&window.renderGrid()}catch{}}P("INSTALLED "+(l.name||l.id)+" in "+(l.deploy_seconds||"?")+`s
Card: `+(l.url||"")+`
`+(L.output||"").slice(-800)),M()}catch(m){P("install error: "+m.message)}H(!1,D,"Install")}function H(D,y,B){y&&(y.disabled=D,B&&(y.textContent=D?"Working\u2026":B))}async function k(){const D=w("dep-deploy-btn"),y=w("dep-repo-select").value;if(y){H(!0,D,"Deploy"),P("Deploying "+y+`
This can take ~30-60s\u2026`);try{const{body:B}=await N("/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dir:y})});P((B.output||B.error||"")+(B.success?`
\u2705 SUCCESS`:`
\u274C FAILED`)),M()}catch(B){P("deploy error: "+B.message)}H(!1,D,"Deploy")}}async function z(D,y){if(confirm("Roll back "+D+" to the previous release?")){H(!0,y,"Rollback"),P("Rolling back "+D+"\u2026");try{const{body:B}=await N("/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:D})});P((B.output||B.error||"")+(B.success?`
\u2705 ROLLED BACK`:`
\u274C FAILED`)),M()}catch(B){P("rollback error: "+B.message)}H(!1,y,"Rollback")}}async function S(D,y){H(!0,y,"Status");try{const{body:B}=await N("/status?service="+encodeURIComponent(D));P(B.output||B.error||"(no output)")}catch(B){P("status error: "+B.message)}H(!1,y,"Status")}function T(){x=document.getElementById("deploys-btn"),x&&(x.addEventListener("click",async()=>{w("deploys-modal").classList.add("open"),j||(j=!0,M(),R(),h(""),C())}),w("dep-close").addEventListener("click",()=>{w("deploys-modal").classList.remove("open")}),document.querySelectorAll(".dep-tab").forEach(D=>{D.addEventListener("click",()=>{document.querySelectorAll(".dep-tab").forEach(y=>y.classList.remove("active")),D.classList.add("active"),document.querySelectorAll("#deploys-modal .dep-panel").forEach(y=>{y.style.display=y.dataset.panel===D.dataset.tab?"block":"none"})})}),w("dep-deploy-btn").addEventListener("click",k),w("dep-gh-btn").addEventListener("click",E),["dep-gh-gitea-host","dep-gh-gitea-token"].forEach(D=>{const y=document.getElementById(D);y&&y.addEventListener("change",()=>C())}),document.getElementById("dep-gh-gitea").addEventListener("change",D=>{const y=D.target.value;if(y){document.getElementById("dep-gh-url").value=y;const B=D.target.selectedOptions[0],$=B&&B.dataset?B.dataset.id:"",U=document.getElementById("dep-gh-service");$&&!U.value&&(U.value=$)}}),w("dep-journal-btn").addEventListener("click",()=>h(w("dep-journal-name").value.trim())),w("dep-status-btn").addEventListener("click",()=>{const D=w("dep-status-name").value.trim();D&&S(D)}),w("dep-services").addEventListener("click",D=>{const y=D.target.closest(".dep-rollback");if(y)return z(y.dataset.service,y);const B=D.target.closest(".dep-status");if(B)return S(B.dataset.service,B)}))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",T):T()})(),(function(){const w=new ErrorHandler;injectModal("weather-modal",`
Weather Settings
Enter a city name, postal code, or “City, Country”
`);const x="weather-location",j="weather-zip",g="weather-geo",N="weather-unit";!safeGet(x)&&safeGet(j)&&safeSet(x,safeGet(j));function P(){return safeGet(N)||"imperial"}function M(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const R={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},h={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},C=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function E(y){return C[Math.round(y/22.5)%16]}async function H(y){const B=safeGet(g);if(B)try{const I=JSON.parse(B);if(I.query===y)return I}catch{}const $=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(y)}&count=1&language=en&format=json`);if(!$.ok)throw new Error("Geocoding failed");const U=await $.json();if(!U.results||!U.results.length)throw new Error("Location not found");const m=U.results[0],v={query:y,lat:m.latitude,lon:m.longitude,city:m.name,state:m.admin1||"",country:m.country||"",countryCode:m.country_code||""};return safeSet(g,JSON.stringify(v)),v}function k(y){return y.countryCode==="US"&&y.state?`${y.city}, ${y.state}`:y.country?`${y.city}, ${y.country}`:y.city}async function z(y){try{const B=await H(y),$=P(),U=$==="metric"?"celsius":"fahrenheit",m=$==="metric"?"kmh":"mph",v=`https://api.open-meteo.com/v1/forecast?latitude=${B.lat}&longitude=${B.lon}¤t=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${U}&wind_speed_unit=${m}`,I=await fetch(v);if(!I.ok)throw new Error("Weather fetch failed");const L=(await I.json()).current,l=L.weather_code;return{temp:Math.round(L.temperature_2m),condition:R[l]||"Unknown",icon:h[l]||"\u{1F324}\uFE0F",locationStr:k(B),windSpeed:Math.round(L.wind_speed_10m),windDir:E(L.wind_direction_10m),unit:$}}catch(B){return console.warn("Weather fetch failed:",B),null}}async function S(){const y=M();if(!y.icon||!y.temp||!y.condition||!y.location||!y.wind){console.warn("Weather widget elements not found");return}const B=safeGet(x);if(!B){y.location.textContent="Set Location",y.temp.textContent="--\xB0",y.condition.textContent="Click \u2699\uFE0F to configure",y.wind.textContent="--",y.icon.innerHTML='\u{1F324}\uFE0F';return}try{const $=await z(B);if($){const U=$.unit==="metric"?"\xB0C":"\xB0F",m=$.unit==="metric"?"km/h":"mph";y.location.textContent=$.locationStr,y.temp.textContent=`${$.temp}${U}`,y.condition.textContent=$.condition,y.wind.textContent=`Wind: ${$.windSpeed} ${m} ${$.windDir}`,y.icon.innerHTML=`${escapeHtml($.icon)}`}}catch($){w.logError("[Weather] Update Error",$,{function:"updateWeather"}),y.location.textContent="Weather Error",y.temp.textContent="Error",y.condition.textContent="Failed to load",y.wind.textContent="--"}}const T=document.getElementById("weather-modal"),D=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{D.value=safeGet(x)||"";const y=P(),B=T.querySelector(`input[name="weather-unit-radio"][value="${y}"]`);B&&(B.checked=!0),T.classList.add("show"),D.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{T.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const y=D.value.trim();if(y){safeGet(x)!==y&&safeSet(g,""),safeSet(x,y);const $=T.querySelector('input[name="weather-unit-radio"]:checked'),U=$?$.value:"imperial",m=P();safeSet(N,U),m!==U&&safeSet(g,""),T.classList.remove("show"),S()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(T),document.addEventListener("keydown",y=>{y.key==="Escape"&&T.classList.contains("show")&&T.classList.remove("show")}),S(),setInterval(S,DC.POLL.WEATHER)})(),(function(){const w=document.getElementById("clock-widget"),x=document.getElementById("clock-render");if(!w||!x)return;const j=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],g=["January","February","March","April","May","June","July","August","September","October","November","December"],N=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let P=safeGet("clock-style")||"default",M=-1,R=!1,h="",C="",E=null,H=null;function k(e){if(R||safeGet("clock-chimes")!=="true")return;R=!0;const s=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let r=0;function o(){if(r>=e){R=!1;return}const a=new Audio("/assets/sounds/church-bell.mp3");a.volume=s,a.play().catch(()=>{}),r++,r{R=!1},2500)}o()}function z(e){return j[e.getDay()]+", "+g[e.getMonth()]+" "+e.getDate()+", "+e.getFullYear()}function S(){C="",E=null}function T(){return C!=="digital"&&(x.innerHTML='
`).join(""),a.querySelectorAll(".cal-src-toggle").forEach(n=>n.addEventListener("click",async()=>{const i=n.dataset.id,u=n.dataset.enabled!=="1";n.disabled=!0;try{const A=await secureFetch(`/api/v1/calendar/sources/${encodeURIComponent(i)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:u})});if(!A.ok)throw new Error(`HTTP ${A.status}`);U(),v(!0)}catch(A){showNotification(`Calendar source update failed: ${A.message}`,"error")}finally{n.disabled=!1}})),a.querySelectorAll(".cal-src-del").forEach(n=>n.addEventListener("click",async()=>{const i=n.dataset.id;n.disabled=!0;try{const u=await secureFetch(`/api/v1/calendar/sources/${encodeURIComponent(i)}`,{method:"DELETE"});if(!u.ok)throw new Error(`HTTP ${u.status}`);U(),v(!0)}catch(u){showNotification(`Calendar source removal failed: ${u.message}`,"error")}finally{n.disabled=!1}}))}let m=null;async function v(a){if(v._inFlight){a&&(v._pendingForce=!0);return}v._inFlight=!0;try{let t=await S(!!a);if(a&&k){const n=k;k=null;const i=await S(!0);k=n;const u=await S(!0);T(i),y(u),$(i),m=i,v._inFlight=!1;return}if(k){const n=k;k=null;const i=await S(!1);k=n;const u=await S(!1);T(i),y(u),$(i),m=i,v._inFlight=!1;return}m=t,T(t),document.getElementById("calendar-modal").classList.contains("show")&&(y(t),$(t))}catch(t){w.logError("calendar-widget",t);const n=j();n.text&&(n.text.innerHTML='Calendar offline')}finally{v._inFlight=!1,v._pendingForce&&(v._pendingForce=!1,v(!0))}}let I=null;function b(){I=document.activeElement,document.getElementById("calendar-modal").classList.add("show"),y(m||{events:[]}),$(m||{events:[]}),U(),v(),document.getElementById("calendar-close").focus()}function L(){document.getElementById("calendar-modal").classList.remove("show"),I&&typeof I.focus=="function"&&I.focus()}function l(){return{type:document.getElementById("cal-add-type").value,name:document.getElementById("cal-add-name").value.trim(),url:document.getElementById("cal-add-url").value.trim(),user:document.getElementById("cal-add-user").value.trim(),pass:document.getElementById("cal-add-pass").value}}function c(a){document.getElementById("cal-add-status").textContent=a}document.getElementById("cal-add-test").addEventListener("click",async()=>{const a=l();if(!a.url){c("Enter a URL first.");return}c("Testing\u2026");try{const n=await(await secureFetch("/api/v1/calendar/discover",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:a.url,user:a.user,pass:a.pass})})).json(),i=n&&n.probe;i&&i.ok?c(`\u2713 Reachable (${i.server||"server"})${i.looksLikeCalendar?" \u2014 looks like a calendar":""}`):c(`\u2717 ${i&&i.error?i.error:"Not reachable"}`)}catch(t){c(`\u2717 ${t.message}`)}}),document.getElementById("cal-add-save").addEventListener("click",async()=>{const a=l();if(!a.name||!a.url){c("Name and URL are required.");return}try{const t=await secureFetch("/api/v1/calendar/sources",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a.name,type:a.type,url:a.url,user:a.user,pass:a.pass})});if(!t.ok){const n=await t.json().catch(()=>({}));c(`\u2717 ${n.error||n.message||`HTTP ${t.status}`}`);return}c("Saved."),document.getElementById("cal-add-details").open=!1,["cal-add-name","cal-add-url","cal-add-user","cal-add-pass"].forEach(n=>{document.getElementById(n).value=""}),U(),v(!0)}catch(t){c(`\u2717 ${t.message}`)}});const d=document.getElementById("calendar-widget");d&&(d.addEventListener("click",b),d.addEventListener("keydown",a=>{(a.key==="Enter"||a.key===" "||a.key==="Spacebar")&&(a.preventDefault(),b())}));const f=document.getElementById("calendar-settings");f&&f.addEventListener("click",a=>{a.stopPropagation(),b()});const p=document.getElementById("calendar-modal");p&&(document.getElementById("calendar-close").addEventListener("click",L),p.addEventListener("click",a=>{a.target===p&&L()}),document.addEventListener("keydown",a=>{a.key==="Escape"&&p.classList.contains("show")&&L()}));async function e(a){k||(k=new Date,k.setDate(1)),k=new Date(k.getFullYear(),k.getMonth()+a,1);const t=await S(!1).catch(()=>m);y(t||{events:[]})}const s=document.getElementById("cal-prev");s&&s.addEventListener("click",()=>{e(-1)});const r=document.getElementById("cal-next");r&&r.addEventListener("click",()=>{e(1)}),window.refreshCalendarWidget=v;const o=typeof DC<"u"&&DC.POLL&&DC.POLL.CALENDAR||3e5;setInterval(()=>{document.hidden||v(!0)},o),document.addEventListener("visibilitychange",()=>{document.hidden||v(!0)}),setTimeout(v,400)})(),(function(){const w=new ErrorHandler;injectModal("ai-connect-modal",`
\u{1F916} Connect your AI assistant
DashCaddy speaks MCP \u2014 Claude, ChatGPT and other AI assistants can manage your
homelab (deploy apps, check health, edit DNS) through one endpoint.
Pick an assistant and DashCaddy generates the access key + config for it.
MCP endpoint:\u2014
Choose your assistant:
Your access key (shown once):
\u2014
Paste into your client:
Active AI connections
Loading\u2026
`);const x=h=>document.getElementById(h);let j=null;function g(h){x("aiconn-status").textContent=h}async function N(){try{const h=await secureFetch("/api/v1/mcp/info");if(!h.ok)throw new Error(`HTTP ${h.status}`);const C=await h.json();j=C,x("aiconn-endpoint").style.display="block",x("aiconn-endpoint-url").textContent=C.endpoint,x("aiconn-tools").textContent=`${C.toolCount} tools \xB7 MCP ${C.protocolVersion} \xB7 DashCaddy v${C.serverVersion}`}catch(h){w.log(h,"ai-connect-info"),g("MCP endpoint unavailable on this build.")}}async function P(){const h=x("aiconn-connections");try{const E=await(await secureFetch("/api/v1/mcp/connections")).json().catch(()=>({})),H=E&&Array.isArray(E.connections)?E.connections:[];if(!H.length){h.innerHTML='
No connections yet \u2014 choose an assistant above.
';return}h.innerHTML=H.map(k=>`
${escapeHtml(k.name)}
\xB7 ${(k.scopes||[]).join(",")} \xB7 since ${escapeHtml((k.createdAt||"").slice(0,10))}${k.lastUsed?" \xB7 last used "+escapeHtml(String(k.lastUsed).slice(0,10)):""}
`).join("")}async function y(){try{const b=await(await fetch("/api/v1/license/status")).json();b.success&&(D(b.license),U(b.license))}catch(I){console.warn("Failed to load license status:",I.message)}}async function B(){const I=x.value.trim();if(!I){S("Please enter a license code.");return}z(),j.disabled=!0,j.textContent="Activating...";try{const L=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:I})})).json();L.success?(T(L.message),x.value="",D(L.license),showNotification("License activated! Premium features unlocked.","success",5e3),U(L.license)):S(L.error||"Activation failed")}catch(b){S("Network error: "+b.message)}finally{j.disabled=!1,j.textContent="Activate"}}async function $(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){g.disabled=!0,g.textContent="Deactivating...";try{const b=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();b.success?(T(b.message),await y(),showNotification("License deactivated.","info",3e3),U({active:!1})):S(b.error||"Deactivation failed")}catch(I){S("Network error: "+I.message)}finally{g.disabled=!1,g.textContent="Deactivate"}}}function U(I){const b=document.getElementById("license-status-topbar"),L=document.getElementById("license-topbar-icon"),l=document.getElementById("license-topbar-text"),c=document.getElementById("license-topbar-time");if(b)if(b.className="license-status-topbar "+(I.active?"premium":"free"),I.active)if(L.textContent="\u2605",l.textContent="PREMIUM",I.lifetime)c.textContent="\xB7 LIFETIME";else{const d=I.daysRemaining;c.textContent=d!=null?"\xB7 "+d+"d remaining":""}else L.textContent="\u2606",l.textContent=I.expired?"EXPIRED":"FREE TIER",c.textContent=""}function m(){z(),y(),w.classList.add("show")}x.addEventListener("input",function(){let I=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(I.length>this._prevLength&&(I=I.replace(/-/g,""),I.length>2&&!I.startsWith("DC")&&(I="DC"+I),I.startsWith("DC")&&I.length>2)){const b=["DC"],L=I.substring(2);for(let l=0;l{I.key==="Enter"&&B()}),wireModal(w,document.getElementById("license-cancel"));const v=document.getElementById("license-status-topbar");v&&v.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=m,window.checkPremiumFeature=async function(I){try{return(await(await fetch(`/api/v1/license/feature/${I}`)).json()).available}catch{return!1}},y().then(I=>{k&&U(k)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const w=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",`
Share \u2026
Create a public link or Tailscale invite so someone outside your network can access this service.
A single-use Tailscale pre-auth key is generated and emailed. The device joins your tailnet and is routed to this service via Caddy.
`}).join(""),C.querySelectorAll(".share-revoke").forEach(a=>{a.addEventListener("click",()=>l(a.dataset.shareId))})}catch{C.innerHTML='Could not load outstanding shares.'}}async function l(e){try{const s=await fetch(`/api/v1/share/${encodeURIComponent(e)}`,{method:"DELETE",credentials:"same-origin"});if(!s.ok){const r=await s.json().catch(()=>({}));B(r&&r.error||`Revoke failed (HTTP ${s.status}).`);return}$("Share revoked."),L()}catch{B("Network error while revoking.")}}async function c(){if(!T)return;y(),H.disabled=!0;const e=H.textContent;H.textContent="Creating\u2026";try{const s=parseInt(S.value,10),r=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:T.id,ttlMs:s})}),o=await r.json().catch(()=>({}));if(!r.ok||!o.success){f(r.status,o);return}const a=o.data.urlPath;N.value=m(a),M.textContent=`Public link \xB7 expires ${v(o.data.expiresAt)}`,g.style.display="block",$("Share link created."),L()}catch{B("Network error while creating share.")}finally{H.disabled=!1,H.textContent=e}}async function d(){if(!T)return;const e=(z.value||"").trim();if(!e||!e.includes("@")){B("A valid recipient email is required.");return}y(),k.disabled=!0;const s=k.textContent;k.textContent="Creating\u2026";try{const r=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:T.id,email:e})}),o=await r.json().catch(()=>({}));if(!r.ok||!o.success){f(r.status,o);return}const a=o.data&&o.data.urlPath;a?(N.value=m(a),M.textContent=`Tailscale invite \xB7 emailed to ${e} (or use this URL manually if delivery failed).`):(N.value="",M.textContent=`Tailscale invite sent to ${e}.`),g.style.display="block",$("Tailscale invite created."),z.value="",L()}catch{B("Network error while creating Tailscale invite.")}finally{k.disabled=!1,k.textContent=s}}function f(e,s){const r=s&&s.error||"";if(e===402){B("Share is a Pro feature. Activate a license to unlock.");return}if(e===400&&/tailscale/i.test(r)){B("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(e===403){B("You do not have permission to share services.");return}if(e===404){B("Service not found. It may have been deleted.");return}B(r||`Request failed (HTTP ${e}).`)}function p(e){!e||!e.id||(T={id:e.id,name:e.name||e.id},j.textContent=T.name,y(),b("public"),z.value="",S.value=String(w[1].ms),x.classList.add("show"),L())}x.querySelectorAll(".share-tab").forEach(e=>{e.addEventListener("click",()=>b(e.dataset.tab))}),H.addEventListener("click",c),k.addEventListener("click",d),E.addEventListener("click",()=>x.classList.remove("show")),wireModal(x,E),P.addEventListener("click",async()=>{const e=N.value;if(e)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(e):(N.select(),document.execCommand("copy"));const s=P.textContent;P.textContent="Copied!",setTimeout(()=>{P.textContent=s},1200)}catch{B("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=p})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIC8+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJmYXZpY29uLXN0YXR1c1wiIGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+VXNpbmcgRGFzaENhZGR5IGZhdmljb248L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImZhdmljb24tdXBsb2FkXCIgYWNjZXB0PVwiaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWxcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5VcGxvYWQgUE5HIG9yIFNWRyAtIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIElDTzwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJzZXR0aW5ncy10aW1lem9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCI+VGltZXpvbmU6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cInNldHRpbmdzLXRpbWV6b25lXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCI+XG4gICAgICAgICAgPCEtLSBQb3B1bGF0ZWQgYnkgSlMgd2l0aCBJQU5BIHRpbWV6b25lcyAtLT5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXNlZCBieSBhbGwgZGVwbG95ZWQgY29udGFpbmVycy4gQ2hhbmdlcyBhcHBseSB0byBuZXcgZGVwbG95bWVudHMuPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ28tcmVzZXRcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZWY0NDQ0IDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6ICNlZjQ0NDQ7IGNvbG9yOiAjZWY0NDQ0O1wiPlJlc2V0IHRvIERlZmF1bHQ8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ28tY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbG9nb01vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tbW9kYWwnKTtcbiAgY29uc3QgcHJldmlld0RhcmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1wcmV2aWV3LWRhcmsnKTtcbiAgY29uc3QgcHJldmlld0xpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1saWdodCcpO1xuICBjb25zdCBsb2dvU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc3RhdHVzJyk7XG4gIGNvbnN0IHNhbWVCb3RoQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYW1lLWJvdGgnKTtcbiAgY29uc3QgZHVhbFVwbG9hZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1kdWFsLXVwbG9hZHMnKTtcbiAgY29uc3Qgc2luZ2xlVXBsb2FkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2luZ2xlLXVwbG9hZCcpO1xuICBjb25zdCB1cGxvYWREYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWRhcmsnKTtcbiAgY29uc3QgdXBsb2FkTGlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby11cGxvYWQtbGlnaHQnKTtcbiAgY29uc3QgdXBsb2FkU2luZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLXNpbmdsZScpO1xuICBjb25zdCBicmFuZExvZ29EYXJrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWRhcmsnKTtcbiAgY29uc3QgYnJhbmRMb2dvTGlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYnJhbmQgLmJyYW5kLWxvZ28tbGlnaHQnKTtcbiAgY29uc3QgdG9wUm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcC1yb3cnKTtcbiAgY29uc3QgZGFzaGJvYXJkVGl0bGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoYm9hcmQtdGl0bGUnKTtcbiAgY29uc3QgREVGQVVMVF9USVRMRSA9IERDLk5BTUU7XG5cbiAgbGV0IHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nTGlnaHREYXRhID0gbnVsbDtcbiAgbGV0IHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9ICdsZWZ0JztcbiAgbGV0IGN1cnJlbnRUaXRsZSA9IERFRkFVTFRfVElUTEU7XG5cbiAgLy8gVG9nZ2xlIGJldHdlZW4gZHVhbCBhbmQgc2luZ2xlIHVwbG9hZCBtb2RlXG4gIHNhbWVCb3RoQ2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveC5jaGVja2VkKSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIC8vIENsZWFyIGluZGl2aWR1YWwgcGVuZGluZyBkYXRhXG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgICAgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR1YWxVcGxvYWRzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlYWQgZmlsZSBhcyBkYXRhIFVSTCBoZWxwZXJcbiAgZnVuY3Rpb24gcmVhZEZpbGVBc0RhdGFVUkwoZmlsZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWZpbGUgfHwgIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIHNlbGVjdCBhbiBpbWFnZSBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGUpID0+IGNhbGxiYWNrKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH1cblxuICAvLyBVcGxvYWQgaGFuZGxlcnNcbiAgdXBsb2FkRGFyaz8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICByZWFkRmlsZUFzRGF0YVVSTChlLnRhcmdldC5maWxlc1swXSwgKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IGRhdGE7XG4gICAgICBwcmV2aWV3RGFyay5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZGFyayBsb2dvIHJlYWR5IHRvIHNhdmUnO1xuICAgIH0pO1xuICB9KTtcblxuICB1cGxvYWRMaWdodD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICByZWFkRmlsZUFzRGF0YVVSTChlLnRhcmdldC5maWxlc1swXSwgKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0xpZ2h0LnNyYyA9IGRhdGE7XG4gICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ05ldyBsaWdodCBsb2dvIHJlYWR5IHRvIHNhdmUnO1xuICAgIH0pO1xuICB9KTtcblxuICB1cGxvYWRTaW5nbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IGRhdGE7XG4gICAgICBwcmV2aWV3RGFyay5zcmMgPSBkYXRhO1xuICAgICAgcHJldmlld0xpZ2h0LnNyYyA9IGRhdGE7XG4gICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ05ldyBsb2dvIHJlYWR5IHRvIHNhdmUgKGJvdGggdGhlbWVzKSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEFwcGx5IGxvZ28gcG9zaXRpb25cbiAgZnVuY3Rpb24gYXBwbHlMb2dvUG9zaXRpb24ocG9zKSB7XG4gICAgdG9wUm93LnNldEF0dHJpYnV0ZSgnZGF0YS1sb2dvLXBvcycsIHBvcyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxvZ28tcG9zLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gYnRuLmRhdGFzZXQucG9zID09PSBwb3MgPyAndmFyKC0tYWNjZW50KScgOiAndmFyKC0tY2FyZC1iZyknO1xuICAgICAgYnRuLnN0eWxlLmNvbG9yID0gYnRuLmRhdGFzZXQucG9zID09PSBwb3MgPyAnd2hpdGUnIDogJ3ZhcigtLWZnKSc7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBcHBseSBkYXNoYm9hcmQgdGl0bGVcbiAgZnVuY3Rpb24gYXBwbHlEYXNoYm9hcmRUaXRsZSh0aXRsZSkge1xuICAgIGN1cnJlbnRUaXRsZSA9IHRpdGxlIHx8IERFRkFVTFRfVElUTEU7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBjdXJyZW50VGl0bGU7XG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGFzaGJvYXJkLXRpdGxlJyk7XG4gICAgaWYgKGhlYWRlclRpdGxlKSBoZWFkZXJUaXRsZS50ZXh0Q29udGVudCA9IGN1cnJlbnRUaXRsZTtcbiAgfVxuXG4gIC8vIExvYWQgY3VzdG9tIGxvZ28sIHBvc2l0aW9uLCBhbmQgdGl0bGUgb24gc3RhcnR1cFxuICBhc3luYyBmdW5jdGlvbiBsb2FkQ3VzdG9tTG9nbygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9sb2dvJyk7XG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgLy8gQXBwbHkgZGFyay9saWdodCB2YXJpYW50c1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvRGFyaykge1xuICAgICAgICAgIGJyYW5kTG9nb0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgICBwcmV2aWV3RGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ29EYXJrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmN1c3RvbUxvZ29MaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEuY3VzdG9tTG9nb0xpZ2h0O1xuICAgICAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgfVxuICAgICAgICAvLyBMZWdhY3kgc2luZ2xlLWxvZ28gZmFsbGJhY2tcbiAgICAgICAgaWYgKCFkYXRhLmN1c3RvbUxvZ29EYXJrICYmICFkYXRhLmN1c3RvbUxvZ29MaWdodCAmJiBkYXRhLmN1c3RvbUxvZ28pIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhLmlzRGVmYXVsdCkge1xuICAgICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgY3VzdG9tIGxvZ28nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uKSB7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICBhcHBseUxvZ29Qb3NpdGlvbihkYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5kYXNoYm9hcmRUaXRsZSkge1xuICAgICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUoZGF0YS5kYXNoYm9hcmRUaXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gbG9nbzonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3NpdGlvbiBidXR0b24gaGFuZGxlcnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxvZ28tcG9zLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjdXJyZW50UG9zaXRpb24gPSBidG4uZGF0YXNldC5wb3M7XG4gICAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBPcGVuIGxvZ28gbW9kYWwgb24gYnJhbmQgY2xpY2tcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JyYW5kJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gICAgcGVuZGluZ1NpbmdsZURhdGEgPSBudWxsO1xuICAgIGlmICh1cGxvYWREYXJrKSB1cGxvYWREYXJrLnZhbHVlID0gJyc7XG4gICAgaWYgKHVwbG9hZExpZ2h0KSB1cGxvYWRMaWdodC52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRTaW5nbGUpIHVwbG9hZFNpbmdsZS52YWx1ZSA9ICcnO1xuICAgIC8vIFJlc2V0IGNoZWNrYm94IHRvIGR1YWwgbW9kZVxuICAgIGlmIChzYW1lQm90aENoZWNrYm94KSBzYW1lQm90aENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIC8vIFJlc2V0IHByZXZpZXdzIHRvIGN1cnJlbnQgaGVhZGVyIGxvZ29zXG4gICAgcHJldmlld0Rhcmsuc3JjID0gYnJhbmRMb2dvRGFyay5zcmM7XG4gICAgcHJldmlld0xpZ2h0LnNyYyA9IGJyYW5kTG9nb0xpZ2h0LnNyYztcbiAgICBjb25zdCBpc0N1c3RvbSA9IGJyYW5kTG9nb0Rhcmsuc3JjLmluY2x1ZGVzKCdjdXN0b20tbG9nbycpIHx8IGJyYW5kTG9nb0xpZ2h0LnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKTtcbiAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gaXNDdXN0b20gPyAnVXNpbmcgY3VzdG9tIGxvZ28nIDogJ1VzaW5nIGRlZmF1bHQgbG9nb3MnO1xuICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZSA9IGN1cnJlbnRUaXRsZTtcbiAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBTYXZlIGxvZ28sIHBvc2l0aW9uLCBhbmQgdGl0bGVcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV3VGl0bGUgPSBkYXNoYm9hcmRUaXRsZUlucHV0LnZhbHVlLnRyaW0oKSB8fCBERUZBVUxUX1RJVExFO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcG9zaXRpb246IGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgZGFzaGJvYXJkVGl0bGU6IG5ld1RpdGxlXG4gICAgICB9O1xuXG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggbG9nbyBkYXRhIHRvIHNlbmRcbiAgICAgIGlmIChzYW1lQm90aENoZWNrYm94Py5jaGVja2VkICYmIHBlbmRpbmdTaW5nbGVEYXRhKSB7XG4gICAgICAgIC8vIFNpbmdsZSBsb2dvIGZvciBib3RoIHZhcmlhbnRzXG4gICAgICAgIHBheWxvYWQuZGF0YURhcmsgPSBwZW5kaW5nU2luZ2xlRGF0YTtcbiAgICAgICAgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nU2luZ2xlRGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwZW5kaW5nRGFya0RhdGEpIHBheWxvYWQuZGF0YURhcmsgPSBwZW5kaW5nRGFya0RhdGE7XG4gICAgICAgIGlmIChwZW5kaW5nTGlnaHREYXRhKSBwYXlsb2FkLmRhdGFMaWdodCA9IHBlbmRpbmdMaWdodERhdGE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjb25zdCB0ID0gJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZGF0YS5wYXRoRGFyaykge1xuICAgICAgICAgIGJyYW5kTG9nb0Rhcmsuc3JjID0gZGF0YS5wYXRoRGFyayArIHQ7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5wYXRoRGFyayArIHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEucGF0aExpZ2h0KSB7XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhLnBhdGhMaWdodCArIHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICAgICAgYXBwbHlEYXNoYm9hcmRUaXRsZShuZXdUaXRsZSk7XG4gICAgICAgIGxvZ29Nb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHNhdmU6ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVzZXQgYWxsIGJyYW5kaW5nIHRvIGRlZmF1bHRzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXJlc2V0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnUmVzZXQgYWxsIGJyYW5kaW5nIHRvIERhc2hDYWRkeSBkZWZhdWx0cz9cXG5cXG5UaGlzIHdpbGwgcmVzZXQgdGhlIGxvZ28sIGZhdmljb24sIHRpdGxlLCBhbmQgcG9zaXRpb24uJykpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2dvUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9sb2dvJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgaWYgKGxvZ29SZXNwb25zZS5vaykge1xuICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gJy9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nJztcbiAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gJy9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmcnO1xuICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gJy9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nJztcbiAgICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgICAgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICAgICAgZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZSA9IERFRkFVTFRfVElUTEU7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUoREVGQVVMVF9USVRMRSk7XG4gICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oJ2xlZnQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmF2aWNvblJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChmYXZpY29uUmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZmF2aWNvbkxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKTtcbiAgICAgICAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgICAgICAgaWYgKGZhdmljb25MaW5rKSBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgIGlmIChmYXZpY29uUHJldmlldykgZmF2aWNvblByZXZpZXcuc3JjID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgIGlmIChmYXZpY29uU3RhdHVzKSBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIERhc2hDYWRkeSBmYXZpY29uJztcbiAgICAgICAgcGVuZGluZ0Zhdmljb25EYXRhID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3IgcmVzZXR0aW5nIGJyYW5kaW5nOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwobG9nb01vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1jYW5jZWwnKSk7XG5cbiAgLy8gPT09PT0gRkFWSUNPTiBIQU5ETElORyA9PT09PVxuICBjb25zdCBmYXZpY29uUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXByZXZpZXcnKTtcbiAgY29uc3QgZmF2aWNvblN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXN0YXR1cycpO1xuICBjb25zdCBmYXZpY29uVXBsb2FkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tdXBsb2FkJyk7XG4gIC8vIEF1ZGl0IFAwLTM6IHRoZSBtaXNzaW5nLWZhdmljb24gZmFsbGJhY2sgdXNlZCBpbmxpbmUgb25lcnJvciAoZGVhZCB1bmRlclxuICAvLyB0aGUgbWV0YSBDU1ApLiBTYW1lIGRhdGEtVVJJIGZhbGxiYWNrLCB3aXJlZCArIHJhY2UtZ3VhcmRlZC5cbiAgaWYgKGZhdmljb25QcmV2aWV3KSB7XG4gICAgY29uc3QgZmF2aWNvbkZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSUyMmh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTIyIHZpZXdCb3g9JTIyMCAwIDMyIDMyJTIyPjxyZWN0IGZpbGw9JTIyJTIzNjY3JTIyIHdpZHRoPSUyMjMyJTIyIGhlaWdodD0lMjIzMiUyMiByeD0lMjI0JTIyLz48L3N2Zz4nO1xuICAgIH07XG4gICAgZmF2aWNvblByZXZpZXcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmYXZpY29uRmFsbGJhY2spO1xuICAgIGlmIChmYXZpY29uUHJldmlldy5jb21wbGV0ZSAmJiBmYXZpY29uUHJldmlldy5uYXR1cmFsV2lkdGggPT09IDApIGZhdmljb25GYWxsYmFjaygpO1xuICB9XG4gIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICBsZXQgcGVuZGluZ0Zhdmljb25EYXRhID0gbnVsbDtcblxuICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpKSB7XG4gICAgZmF2aWNvbkxpbmsucmVsID0gJ2ljb24nO1xuICAgIGZhdmljb25MaW5rLmhyZWYgPSAnL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY28nO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZmF2aWNvbkxpbmspO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUZhdmljb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvZmF2aWNvbicpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLmN1c3RvbUZhdmljb24pIHtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5jdXN0b21GYXZpY29uICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBsb2FkIGN1c3RvbSBmYXZpY29uOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGZhdmljb25VcGxvYWQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGlmICghZmlsZS50eXBlLm1hdGNoKC9eaW1hZ2VcXC8ocG5nfHN2Z1xcK3htbCkkLykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYSBQTkcgb3IgU1ZHIGZpbGUnLCAnd2FybmluZycpO1xuICAgICAgZmF2aWNvblVwbG9hZC52YWx1ZSA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBwZW5kaW5nRmF2aWNvbkRhdGE7XG4gICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ05ldyBmYXZpY29uIHJlYWR5IHRvIHNhdmUnO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgZmF2aWNvbiBhbG9uZ3NpZGUgbG9nbyBzYXZlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdGYXZpY29uRGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9mYXZpY29uJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGF0YTogcGVuZGluZ0Zhdmljb25EYXRhIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIGZhdmljb25MaW5rLmhyZWYgPSBkYXRhLnBhdGggKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgY3VzdG9tIGZhdmljb24nO1xuICAgICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHNhdmUgZmF2aWNvbjogJyArIGVycm9yLmVycm9yLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3Igc2F2aW5nIGZhdmljb246ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGxvYWRDdXN0b21GYXZpY29uKCk7XG4gIGxvYWRDdXN0b21Mb2dvKCk7XG5cbiAgLy8gPT09PT0gVElNRVpPTkUgU0VUVElORyA9PT09PVxuICBjb25zdCBzZXR0aW5nc1R6U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzLXRpbWV6b25lJyk7XG4gIGlmIChzZXR0aW5nc1R6U2VsZWN0KSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAobG9nb01vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpICYmIHNldHRpbmdzVHpTZWxlY3Qub3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgY3VycmVudFR6O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgICAgICAgIGlmIChyZXMub2spIHsgY29uc3QgY2ZnID0gYXdhaXQgcmVzLmpzb24oKTsgY3VycmVudFR6ID0gY2ZnLnRpbWV6b25lOyB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgICAgIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHRpbmdzVHpTZWxlY3QsIGN1cnJlbnRUeik7XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShsb2dvTW9kYWwsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJ10gfSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHogPSBzZXR0aW5nc1R6U2VsZWN0LnZhbHVlO1xuICAgICAgaWYgKCF0eikgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGNmZy50aW1lem9uZSA9IHR6O1xuICAgICAgICBjZmcudXBkYXRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY2ZnKVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSB0aW1lem9uZTonLCBlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KSgpO1xuO1xuLy8gU2hhcmVkIHRpbWV6b25lIHV0aWxpdHkgXHUyMDE0IHVzZWQgYnkgc2V0dXAgd2l6YXJkIGFuZCBzZXR0aW5ncyBtb2RhbFxuLy8gZXJyb3JIYW5kbGVyIGlzIGRlY2xhcmVkIGdsb2JhbGx5IGluIGdsb2JhbHMuanMgKGNvcmUuanMgYnVuZGxlKTsgcmV1c2luZyBpdFxuLy8gaGVyZSBzbyB3ZSBkb24ndCBnZXQgXCJyZWRlY2xhcmF0aW9uIG9mIGNvbnN0IGVycm9ySGFuZGxlclwiIGF0IHNjcmlwdCBzY29wZS5cblxud2luZG93LnBvcHVsYXRlVGltZXpvbmVTZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RFbCwgc2VsZWN0ZWRUeikge1xuICBjb25zdCB0aW1lem9uZXMgPSBJbnRsLnN1cHBvcnRlZFZhbHVlc09mKCd0aW1lWm9uZScpO1xuICBjb25zdCBkZXRlY3RlZCA9IHNlbGVjdGVkVHogfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICBzZWxlY3RFbC5pbm5lckhUTUwgPSAnJztcbiAgZm9yIChjb25zdCB0eiBvZiB0aW1lem9uZXMpIHtcbiAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICBvcHQudmFsdWUgPSB0ejtcbiAgICBvcHQudGV4dENvbnRlbnQgPSB0ei5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgaWYgKHR6ID09PSBkZXRlY3RlZCkgb3B0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICBzZWxlY3RFbC5hcHBlbmRDaGlsZChvcHQpO1xuICB9XG59O1xuXG4vLyBTZXR1cCBXaXphcmQgU3lzdGVtIC0gU2VydmVyLXNpZGUgY29uZmlnIHN0b3JhZ2VcbihmdW5jdGlvbiAoKSB7XG4gIGxldCBjdXJyZW50Q29uZmlnVHlwZSA9ICdob21lbGFiJztcbiAgbGV0IHNlcnZlckNvbmZpZyA9IG51bGw7XG5cbiAgLy8gQ2hlY2sgc2VydmVyIGZvciBleGlzdGluZyBjb25maWcgb24gcGFnZSBsb2FkXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU2VydmVyQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHNlcnZlckNvbmZpZyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHNlcnZlckNvbmZpZyAmJiBzZXJ2ZXJDb25maWcuc2V0dXBDb21wbGV0ZSkge1xuICAgICAgICAgIC8vIENvbmZpZyBleGlzdHMgb24gc2VydmVyIC0gZG9uJ3Qgc2hvdyB3aXphcmRcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmZXRjaCBzZXJ2ZXIgY29uZmlnLCBjaGVja2luZyBsb2NhbFN0b3JhZ2UgZmFsbGJhY2s6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGNoZWNrIGxvY2FsU3RvcmFnZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBsb2NhbFNldHVwID0gc2FmZUdldCgnZGFzaGNhZGR5LXNldHVwJyk7XG4gICAgaWYgKGxvY2FsU2V0dXApIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTm8gY29uZmlnIGZvdW5kIC0gc2hvdyB3aXphcmRcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZFxuICBjaGVja1NlcnZlckNvbmZpZygpO1xuXG4gIC8vIFBvcHVsYXRlIHRpbWV6b25lIGRyb3Bkb3duIHdpdGggYXV0by1kZXRlY3Rpb25cbiAgY29uc3Qgc2V0dXBUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10aW1lem9uZScpO1xuICBpZiAoc2V0dXBUelNlbGVjdCkgd2luZG93LnBvcHVsYXRlVGltZXpvbmVTZWxlY3Qoc2V0dXBUelNlbGVjdCk7XG5cbiAgLy8gU3RlcCBuYXZpZ2F0aW9uXG4gIGZ1bmN0aW9uIHNob3dTdGVwKHN0ZXBJZCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR1cC1zdGVwJykuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgIHN0ZXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXRTdGVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RlcElkKTtcbiAgICBpZiAodGFyZ2V0U3RlcCkge1xuICAgICAgdGFyZ2V0U3RlcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBTaG93IHN1bW1hcnlcbiAgZnVuY3Rpb24gc2hvd1N1bW1hcnkoKSB7XG4gICAgY29uc3Qgc3VtbWFyeUNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1jb250ZW50Jyk7XG4gICAgaWYgKCFzdW1tYXJ5Q29udGVudCkgcmV0dXJuO1xuXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMjBweDtcIj4nO1xuXG4gICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc0lQID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuICAgICAgY29uc3QgZG5zUG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtcG9ydCcpPy52YWx1ZT8udHJpbSgpIHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuXG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5Ib21lIExhYiBDb25maWd1cmF0aW9uPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+VExEOjwvc3Ryb25nPiAke3RsZH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5DZXJ0aWZpY2F0ZSBBdXRob3JpdHk6PC9zdHJvbmc+ICR7Y2FOYW1lfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkROUyBTZXJ2ZXI6PC9zdHJvbmc+ICR7ZG5zSVB9OiR7ZG5zUG9ydH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHBzOi8vdXB0aW1lJHt0bGR9LCBodHRwczovL25leHRjbG91ZCR7dGxkfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuXG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5TaW1wbGUgU2V0dXA8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5BY2Nlc3MgTWV0aG9kOjwvc3Ryb25nPiBJUDpQb3J0IG9ubHk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5EZWZhdWx0IElQOjwvc3Ryb25nPiAke2lwfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTm9uZSAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gaHR0cDovLyR7aXB9OjgwODAsIGh0dHA6Ly8ke2lwfTozMDAwPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uc3QgZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1kb21haW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1lbWFpbCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuICAgICAgY29uc3Qgcm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25zdCBleGFtcGxlVXJscyA9IHJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5J1xuICAgICAgICA/IGBodHRwczovLyR7ZG9tYWlufS9zb25hcnIsIGh0dHBzOi8vJHtkb21haW59L2dyYWZhbmFgXG4gICAgICAgIDogYGh0dHBzOi8vc29uYXJyLiR7ZG9tYWlufSwgaHR0cHM6Ly9ncmFmYW5hLiR7ZG9tYWlufWA7XG4gICAgICBjb25zdCByb3V0aW5nTGFiZWwgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnU3ViZGlyZWN0b3J5IChkb21haW4uY29tL2FwcCknIDogJ1N1YmRvbWFpbiAoYXBwLmRvbWFpbi5jb20pJztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+UHVibGljIFNlcnZlcjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkRvbWFpbjo8L3N0cm9uZz4gJHtkb21haW59PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+U1NMOjwvc3Ryb25nPiBMZXQncyBFbmNyeXB0PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RW1haWw6PC9zdHJvbmc+ICR7ZW1haWx9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Um91dGluZzo8L3N0cm9uZz4gJHtyb3V0aW5nTGFiZWx9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiAke2V4YW1wbGVVcmxzfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgLy8gVGltZXpvbmUgKHVuaXZlcnNhbCBhY3Jvc3MgYWxsIGNvbmZpZyB0eXBlcylcbiAgICBjb25zdCB0eiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10aW1lem9uZScpPy52YWx1ZSB8fCBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgfHwgJ1VUQyc7XG4gICAgaHRtbCArPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOTVyZW07XCI+PHN0cm9uZz5UaW1lem9uZTo8L3N0cm9uZz4gJHt0ei5yZXBsYWNlKC9fL2csICcgJyl9PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBzdW1tYXJ5Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXN1bW1hcnknKTtcbiAgfVxuXG4gIC8vIFNhdmUgY29uZmlnIHRvIHNlcnZlclxuICBhc3luYyBmdW5jdGlvbiBzYXZlQ29uZmlnVG9TZXJ2ZXIoY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1NldHVwV2l6YXJkXSBTYXZlIENvbmZpZycsIG5ldyBFcnJvcihgU2VydmVyIHJldHVybmVkICR7cmVzcG9uc2Uuc3RhdHVzfWApLCB7IGZ1bmN0aW9uOiAnc2F2ZUNvbmZpZ1RvU2VydmVyJyB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBlcnJvciwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRmluaXNoIHNldHVwIGhhbmRsZXJcbiAgYXN5bmMgZnVuY3Rpb24gZmluaXNoU2V0dXAoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBjdXJyZW50Q29uZmlnVHlwZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10aW1lem9uZScpPy52YWx1ZSB8fCBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgfHwgJ1VUQydcbiAgICB9O1xuXG4gICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgIGNvbmZpZy50bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbmZpZy5jYU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtY2EtbmFtZScpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQcm92aWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtcHJvdmlkZXInKT8udmFsdWUgfHwgJ3RlY2huaXRpdW0nO1xuICAgICAgY29uZmlnLmRucyA9IHtcbiAgICAgICAgcHJvdmlkZXI6IHNlbGVjdGVkUHJvdmlkZXIsXG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJycsXG4gICAgICAgIHBvcnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtcG9ydCcpPy52YWx1ZT8udHJpbSgpIHx8IERDLkRFRkFVTFRTLkROU19QT1JULFxuICAgICAgICB0b2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy10b2tlbicpPy52YWx1ZT8udHJpbSgpIHx8ICcnXG4gICAgICB9O1xuICAgICAgY29uZmlnLmRlZmF1bHRzID0ge1xuICAgICAgICBkbnNUeXBlOiAncHJpdmF0ZScsXG4gICAgICAgIHNzbFR5cGU6ICdpbnRlcm5hbCcsXG4gICAgICAgIHRhcmdldElQOiAnbG9jYWxob3N0J1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgY29uZmlnLmRlZmF1bHRJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ25vbmUnLFxuICAgICAgICBzc2xUeXBlOiAnbm9uZScsXG4gICAgICAgIHRhcmdldElQOiBjb25maWcuZGVmYXVsdElQXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICBjb25maWcuZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1kb21haW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbmZpZy5lbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbmZpZy5yb3V0aW5nTW9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl06Y2hlY2tlZCcpPy52YWx1ZSB8fCAnc3ViZGlyZWN0b3J5JztcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogY29uZmlnLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyA/ICdub25lJyA6ICdwdWJsaWMnLFxuICAgICAgICBzc2xUeXBlOiAnbGV0c2VuY3J5cHQnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU2F2ZSB0byBzZXJ2ZXIgKHByaW1hcnkpIGFuZCBsb2NhbFN0b3JhZ2UgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNhdmVkVG9TZXJ2ZXIgPSBhd2FpdCBzYXZlQ29uZmlnVG9TZXJ2ZXIoY29uZmlnKTtcbiAgICBzYWZlU2V0KCdkYXNoY2FkZHktY29uZmlnJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LXNldHVwJywgJ2NvbXBsZXRlZCcpO1xuXG4gICAgLy8gSGlkZSB3aXphcmRcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIC8vIFNob3cgc3VjY2VzcyBub3RpZmljYXRpb25cbiAgICBjb25zdCBjb25maWdOYW1lID0gY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJyA/ICdQcm9mZXNzaW9uYWwgSG9tZSBMYWInIDpcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScgPyAnU2ltcGxlIFNldHVwJyA6ICdQdWJsaWMgU2VydmVyJztcbiAgICBjb25zdCBzYXZlTG9jYXRpb24gPSBzYXZlZFRvU2VydmVyID8gJ3NlcnZlciAoc2hhcmVkIGFjcm9zcyBhbGwgZGV2aWNlcyknIDogJ2xvY2FsbHkgKHRoaXMgYnJvd3NlciBvbmx5KSc7XG5cbiAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBDb21wbGV0ZSEgQ29uZmlndXJlZCBmb3I6ICR7Y29uZmlnTmFtZX0uIFNldHRpbmdzIHNhdmVkIHRvOiAke3NhdmVMb2NhdGlvbn1gLCAnc3VjY2VzcycsIDUwMDApO1xuXG4gICAgLy8gUmVsb2FkIHBhZ2UgdG8gYXBwbHkgY29uZmlndXJhdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gbG9jYXRpb24ucmVsb2FkKCksIDUwMCk7XG4gIH1cblxuICAvLyA9PT09PSBFdmVudCBIYW5kbGVycyB1c2luZyBkaXJlY3Qgb25jbGljayBmb3IgcmVsaWFiaWxpdHkgPT09PT1cblxuICAvLyBTdGVwIDE6IENvbnRpbnVlIGJ1dHRvblxuICBjb25zdCBzdGVwMU5leHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3RlcC0xLW5leHQnKTtcbiAgaWYgKHN0ZXAxTmV4dCkge1xuICAgIHN0ZXAxTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY29uZmlnLXR5cGVcIl06Y2hlY2tlZCcpO1xuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIGN1cnJlbnRDb25maWdUeXBlID0gc2VsZWN0ZWQudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTa2lwIHNldHVwIGJ1dHRvblxuICBjb25zdCBza2lwQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNraXAnKTtcbiAgaWYgKHNraXBCdG4pIHtcbiAgICBza2lwQnRuLm9uY2xpY2sgPSBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY29uZmlybSgnU2tpcCBzZXR1cD8gWW91IGNhbiBydW4gaXQgbGF0ZXIgZnJvbSBTZXR0aW5ncy4nKSkge1xuICAgICAgICAvLyBTYXZlIHNraXAgc3RhdHVzIHRvIHNlcnZlclxuICAgICAgICBhd2FpdCBzYXZlQ29uZmlnVG9TZXJ2ZXIoeyBzZXR1cENvbXBsZXRlOiB0cnVlLCBza2lwcGVkOiB0cnVlLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICAgICAgc2FmZVNldCgnZGFzaGNhZGR5LXNldHVwJywgJ3NraXBwZWQnKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvbWUgTGFiOiBUTEQgUHJldmlld1xuICBjb25zdCB0bGRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKTtcbiAgaWYgKHRsZElucHV0KSB7XG4gICAgdGxkSW5wdXQub25pbnB1dCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnN0IHRsZCA9IGUudGFyZ2V0LnZhbHVlIHx8ICcuaG9tZSc7XG4gICAgICBjb25zdCBwcmV2aWV3MSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGQtcHJldmlldycpO1xuICAgICAgY29uc3QgcHJldmlldzIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXctMicpO1xuICAgICAgaWYgKHByZXZpZXcxKSBwcmV2aWV3MS50ZXh0Q29udGVudCA9IHRsZDtcbiAgICAgIGlmIChwcmV2aWV3MikgcHJldmlldzIudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvbWUgTGFiIG5hdmlnYXRpb25cbiAgY29uc3QgaG9tZWxhYkJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtaG9tZWxhYi1iYWNrJyk7XG4gIGlmIChob21lbGFiQmFjaykge1xuICAgIGhvbWVsYWJCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC0xJyk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhvbWVsYWJOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItbmV4dCcpO1xuICBpZiAoaG9tZWxhYk5leHQpIHtcbiAgICBob21lbGFiTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuICAgICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc0lQID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuXG4gICAgICBpZiAoIXRsZCB8fCAhdGxkLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSB2YWxpZCBUTEQgc3RhcnRpbmcgd2l0aCBhIGRvdCAoZS5nLiwgLmhvbWUpJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjYU5hbWUpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWRuc0lQKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciB5b3VyIEROUyBzZXJ2ZXIgSVAgYWRkcmVzcycsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNob3dTdW1tYXJ5KCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFNpbXBsZSBuYXZpZ2F0aW9uXG4gIGNvbnN0IHNpbXBsZUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWJhY2snKTtcbiAgaWYgKHNpbXBsZUJhY2spIHtcbiAgICBzaW1wbGVCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC0xJyk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNpbXBsZU5leHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLW5leHQnKTtcbiAgaWYgKHNpbXBsZU5leHQpIHtcbiAgICBzaW1wbGVOZXh0Lm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBQdWJsaWMgcm91dGluZyBtb2RlIHRvZ2dsZSBcdTIwMTQgdXBkYXRlIHJlcXVpcmVtZW50IHRleHRcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXScpLmZvckVhY2goZnVuY3Rpb24ocmFkaW8pIHtcbiAgICByYWRpby5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXJlcXVpcmVtZW50LW5vdGUnKTtcbiAgICAgIGlmIChub3RlKSB7XG4gICAgICAgIG5vdGUudGV4dENvbnRlbnQgPSB0aGlzLnZhbHVlID09PSAnc3ViZGlyZWN0b3J5J1xuICAgICAgICAgID8gJ09ubHkgb25lIEROUyByZWNvcmQgbmVlZGVkIChmb3IgdGhlIG1haW4gZG9tYWluKSdcbiAgICAgICAgICA6ICdZb3VcXCdsbCBuZWVkIHRvIGNvbmZpZ3VyZSBETlMgbWFudWFsbHkgZm9yIGVhY2ggc3ViZG9tYWluJztcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyBQdWJsaWMgbmF2aWdhdGlvblxuICBjb25zdCBwdWJsaWNCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1iYWNrJyk7XG4gIGlmIChwdWJsaWNCYWNrKSB7XG4gICAgcHVibGljQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBwdWJsaWNOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1uZXh0Jyk7XG4gIGlmIChwdWJsaWNOZXh0KSB7XG4gICAgcHVibGljTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1kb21haW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXB1YmxpYy1lbWFpbCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnO1xuXG4gICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBkb21haW4gbmFtZScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNob3dTdW1tYXJ5KCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFN1bW1hcnkgbmF2aWdhdGlvblxuICBjb25zdCBzdW1tYXJ5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LWJhY2snKTtcbiAgaWYgKHN1bW1hcnlCYWNrKSB7XG4gICAgc3VtbWFyeUJhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXNpbXBsZScpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtcHVibGljJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIFN1bW1hcnkgXCJDb250aW51ZSBcdTIxOTJcIiBcdTIwMTQgYWR2YW5jZSB0byB0aGUgZGlzay1zYWZldHkgd2FybmluZyBzdGVwXG4gIGNvbnN0IHN1bW1hcnlOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktbmV4dCcpO1xuICBpZiAoc3VtbWFyeU5leHQpIHtcbiAgICBzdW1tYXJ5TmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtZGlzay1zYWZldHknKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRGlzay1zYWZldHkgc3RlcCBuYXZpZ2F0aW9uXG4gIGNvbnN0IGRpc2tTYWZldHlCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWJhY2snKTtcbiAgaWYgKGRpc2tTYWZldHlCYWNrKSB7XG4gICAgZGlza1NhZmV0eUJhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXN1bW1hcnknKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRmluaXNoIHNldHVwIGJ1dHRvbiAobm93IG9uIHRoZSBkaXNrLXNhZmV0eSBzdGVwKVxuICBjb25zdCBmaW5pc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZGlzay1zYWZldHktZmluaXNoJyk7XG4gIGlmIChmaW5pc2hCdG4pIHtcbiAgICBmaW5pc2hCdG4ub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZpbmlzaFNldHVwKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEV4cG9zZSBmdW5jdGlvbiB0byBnZXQgZ2xvYmFsIGNvbmZpZyAoZnJvbSBzZXJ2ZXIgb3IgbG9jYWxTdG9yYWdlKVxuICB3aW5kb3cuZ2V0R2xvYmFsQ29uZmlnID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgLy8gVHJ5IHNlcnZlciBmaXJzdFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2V0dXBDb21wbGV0ZSkge1xuICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmZXRjaCBjb25maWcgZnJvbSBzZXJ2ZXInKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBsb2NhbFN0b3JhZ2VcbiAgICBjb25zdCBjb25maWdTdHIgPSBzYWZlR2V0KCdkYXNoY2FkZHktY29uZmlnJyk7XG4gICAgaWYgKGNvbmZpZ1N0cikge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29uZmlnU3RyKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZGVmYXVsdCBjb25maWcgaWYgbm90IHNldFxuICAgIHJldHVybiB7XG4gICAgICBzZXR1cENvbXBsZXRlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYXRpb25UeXBlOiAnaG9tZWxhYicsXG4gICAgICB0bGQ6ICcuaG9tZScsXG4gICAgICBjYU5hbWU6ICcnLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEV4cG9zZSByZXNldCBmdW5jdGlvbiBmb3Igc2V0dGluZ3NcbiAgd2luZG93LnJlc2V0U2V0dXBXaXphcmQgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBpZiAoY29uZmlybSgnUmVzZXQgRGFzaENhZGR5IGNvbmZpZ3VyYXRpb24/IFRoaXMgd2lsbCBzaG93IHRoZSBzZXR1cCB3aXphcmQgYWdhaW4uJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZGVsZXRlIHNlcnZlciBjb25maWcnKTtcbiAgICAgIH1cbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgICAgc2FmZVJlbW92ZSgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuICB9O1xufSkoKTtcbjtcbi8vIEFwcCBTZWxlY3RvciBTeXN0ZW1cbihmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgaW5qZWN0TW9kYWwoJ2FwcC1zZWxlY3Rvci1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLXNlbGVjdG9yLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3Rvci1jb250ZW50XCI+XG4gICAgICA8aDIgc3R5bGU9XCJtYXJnaW46IDAgMCAyNHB4OyBjb2xvcjogdmFyKC0tZmcpOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+Q2hvb3NlIGFuIEFwcDwvaDI+XG4gICAgICA8ZGl2IGlkPVwiYXBwLXNlbGVjdG9yLWdyaWRcIiBjbGFzcz1cImFwcC1zZWxlY3Rvci1ncmlkXCI+PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiAyNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLXNlbGVjdG9yLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdhcHAtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJhcHAtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MDBweDsgbWF4LXdpZHRoOiA3MDBweDtcIj5cbiAgICAgIDxoMyBpZD1cImFwcC1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgQXBwbGljYXRpb248L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IGdhcDogMTZweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPCEtLSBTdWJkb21haW4vRG9tYWluIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktc3ViZG9tYWluXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgXHVEODNDXHVERjEwIFN1YmRvbWFpbiBvciBEb21haW5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LXN1YmRvbWFpblwiIHBsYWNlaG9sZGVyPVwidXB0aW1lXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPlxuICAgICAgICAgICAgWW91ciBhcHAgd2lsbCBiZSBhdmFpbGFibGUgYXQ6IDxzcGFuIGlkPVwiZGVwbG95LXVybC1wcmV2aWV3XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC13ZWlnaHQ6IDUwMDtcIj51cHRpbWUuaG9tZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwic3VicGF0aC1jb21wYXQtd2FybmluZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmZjk4MDAgMTAlLCB2YXIoLS1jYXJkLWJnKSk7IGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDMwJSwgdHJhbnNwYXJlbnQpOyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBETlMgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEREMyXHVGRTBGIEROUyBDb25maWd1cmF0aW9uXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHJpdmF0ZVwiIGNoZWNrZWQgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHJpdmF0ZSBETlMgKFRlY2huaXRpdW0pPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSB5b3VyIGxvY2FsIEROUyBzZXJ2ZXIgd2l0aCBjdXN0b20gVExEICguc2FtaSwgLmhvbWUsIGV0Yy4pPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJwdWJsaWNcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIiAvPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5QdWJsaWMgRE5TPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBhIHJlYWwgZG9tYWluIChleGFtcGxlLmNvbSkgLSByZXF1aXJlcyBETlMgcHJvdmlkZXIgc2V0dXA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cIm5vbmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIiAvPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5ObyBETlMgKElQOlBvcnQgb25seSk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+QWNjZXNzIHZpYSBJUCBhZGRyZXNzIGFuZCBwb3J0IC0gbm8gZG9tYWluIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTU0wgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVERDEyIFNTTC9UTFMgQ2VydGlmaWNhdGVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbC1nYXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJpbnRlcm5hbFwiIGNoZWNrZWQgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+SW50ZXJuYWwgQ0E8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+VXNlIENhZGR5J3MgaW50ZXJuYWwgY2VydGlmaWNhdGUgYXV0aG9yaXR5IChzZWxmLXNpZ25lZCk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3NsLXR5cGVcIiB2YWx1ZT1cImxldHNlbmNyeXB0XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+TGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5GcmVlIHB1YmxpYyBTU0wgY2VydGlmaWNhdGUgKHJlcXVpcmVzIHB1YmxpYyBkb21haW4pPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gU1NMIChIVFRQIG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlx1MjZBMFx1RkUwRiBOb3QgcmVjb21tZW5kZWQgLSB0cmFmZmljIHdpbGwgYmUgdW5lbmNyeXB0ZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1lZGlhIExpYnJhcnkgUGF0aCAoc2hvd24gZm9yIG1lZGlhIGFwcHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwibWVkaWEtcGF0aC1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdURDQzEgTWVkaWEgTGlicmFyeSBMb2NhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDtcIj5cbiAgICAgICAgICAgIDwhLS0gRGV0ZWN0ZWQgbW91bnRzIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVycyAtLT5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5cbiAgICAgICAgICAgICAgICBcdTI3MTMgRGV0ZWN0ZWQgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzOlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImRldGVjdGVkLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwO1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF0aCBpbnB1dCB3aXRoIGJyb3dzZSBidXR0b24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LW1lZGlhLXBhdGhcIiBwbGFjZWhvbGRlcj1cIi9tZWRpYS9Nb3ZpZXMsIC9tZWRpYS9UVlNob3dzXCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiYnJvd3NlLW1lZGlhLWJ0blwiIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgICAgXHVEODNEXHVEQ0MyIEJyb3dzZVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwibWVkaWEtcGF0aC1kZXNjcmlwdGlvblwiIGNsYXNzPVwidGV4dC1oaW50XCI+XG4gICAgICAgICAgICAgIFNlbGVjdCBmb2xkZXJzIGZyb20gZXhpc3Rpbmcgc2VydmVycywgYnJvd3NlLCBvciB0eXBlIHBhdGhzIG1hbnVhbGx5LiBTZXBhcmF0ZSBtdWx0aXBsZSB3aXRoIGNvbW1hcy5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFNlbGVjdGVkIHBhdGhzIGRpc3BsYXkgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0ZWQtbWVkaWEtcGF0aHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUGxleCBDbGFpbSBUb2tlbiAoc2hvd24gb25seSBmb3IgUGxleCBkZXBsb3ltZW50cykgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJwbGV4LWNsYWltLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMSBQbGV4IENsYWltIFRva2VuXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1wbGV4LWNsYWltXCIgcGxhY2Vob2xkZXI9XCJjbGFpbS14eHh4eHh4eHh4eHh4eHh4eHh4eFwiXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1mbGV4XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOTVyZW07XCIgLz5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL3BsZXgudHYvY2xhaW1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiAjZTVhMDBkOyBjb2xvcjogIzAwMDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICBHZXQgVG9rZW5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjZTVhMDBkOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgICBUb2tlbiBleHBpcmVzIGluIDQgbWludXRlcyEgR2V0IGl0IHJpZ2h0IGJlZm9yZSBjbGlja2luZyBEZXBsb3kuIExlYXZlIGVtcHR5IHRvIGNvbmZpZ3VyZSBQbGV4IG1hbnVhbGx5IGxhdGVyLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhaWxzY2FsZSBTZWN1cml0eSAtLT5cbiAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMCBUYWlsc2NhbGUgU2VjdXJpdHlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbC1nYXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJkZXBsb3ktdGFpbHNjYWxlLW9ubHlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDtcIiAvPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5UYWlsc2NhbGUtT25seSBBY2Nlc3M8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+UmVzdHJpY3QgdGhpcyBzZXJ2aWNlIHRvIFRhaWxzY2FsZSB1c2VycyBvbmx5ICgxMDAueC54LnggSVBzKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGlkPVwidGFpbHNjYWxlLXN0YXR1c1wiIHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNoZWNraW5nIFRhaWxzY2FsZSBzdGF0dXMuLi48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCBPcHRpb25zIChDb2xsYXBzaWJsZSkgLS0+XG4gICAgICAgIDxkZXRhaWxzPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlx1MjY5OVx1RkUwRiBBZHZhbmNlZCBPcHRpb25zPC9zdW1tYXJ5PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXBvcnRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+Q3VzdG9tIFBvcnQgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktcG9ydFwiIHBsYWNlaG9sZGVyPVwiTGVhdmUgZW1wdHkgZm9yIGRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LWlwXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlRhcmdldCBJUCBBZGRyZXNzPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktaXBcIiB2YWx1ZT1cImxvY2FsaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgICAgICBVc2UgJ2xvY2FsaG9zdCcgZm9yIHNhbWUtaG9zdCBjb250YWluZXJzLCBvciBzcGVjaWZpYyBJUCBmb3IgcmVtb3RlIHNlcnZpY2VzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlx1RDgzRFx1RENDMiBWb2x1bWUgTW91bnRzPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgQ3VzdG9taXplIHdoZXJlIGNvbnRhaW5lciBkYXRhIGlzIHN0b3JlZCBvbiB0aGUgaG9zdC4gTWVkaWEgdm9sdW1lcyBhcmUgY29uZmlndXJlZCBhYm92ZS5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJ2b2x1bWUtbW91bnRzLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdTI2OTlcdUZFMEYgUmVzb3VyY2UgTGltaXRzPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgT3B0aW9uYWwgQ1BVIGFuZCBtZW1vcnkgY29uc3RyYWludHMuIExlYXZlIGF0IDAgZm9yIHVubGltaXRlZC5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1jcHUtbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5DUFUgQ29yZXM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImRlcGxveS1jcHUtbGltaXRcIiB2YWx1ZT1cIjBcIiBtaW49XCIwXCIgbWF4PVwiNjRcIiBzdGVwPVwiMC4yNVwiIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBwbGFjZWhvbGRlcj1cIjAgPSB1bmxpbWl0ZWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPk1lbW9yeSAoTUIpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktbWVtb3J5LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjEzMTA3MlwiIHN0ZXA9XCI2NFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBwbGFjZWhvbGRlcj1cIjAgPSB1bmxpbWl0ZWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1kZXBsb3ktY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNvbmZpcm1cIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICBcdUQ4M0RcdURFODAgRGVwbG95XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IEFQUFNfS0VZID0gJ2N1c3RvbS1hcHBzJztcblxuICAvLyBDYWNoZSBmb3IgQVBJIHRlbXBsYXRlc1xuICBsZXQgYXBpVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IGFwaUNhdGVnb3JpZXMgPSBudWxsO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1zZWxlY3Rvci1tb2RhbCcpO1xuICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1zZWxlY3Rvci1ncmlkJyk7XG5cbiAgLy8gRmV0Y2ggYXBwIHRlbXBsYXRlcyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBmZXRjaEFwcFRlbXBsYXRlcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hcHBzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgYXBpVGVtcGxhdGVzID0gZGF0YS50ZW1wbGF0ZXM7XG4gICAgICAgIGFwaUNhdGVnb3JpZXMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0FwcFNlbGVjdG9yXSBGZXRjaCBUZW1wbGF0ZXMnLCBlLCB7IGZ1bmN0aW9uOiAnZmV0Y2hBcGlUZW1wbGF0ZXMnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBwb3J0IGF2YWlsYWJpbGl0eVxuICBhc3luYyBmdW5jdGlvbiBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2FwcHMvcG9ydHMvJHtwb3J0fS9jaGVja2ApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0FwcFNlbGVjdG9yXSBDaGVjayBQb3J0JywgZSwgeyBmdW5jdGlvbjogJ2NoZWNrUG9ydEF2YWlsYWJpbGl0eScgfSk7XG4gICAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfTsgLy8gQXNzdW1lIGF2YWlsYWJsZSBvbiBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBzdWdnZXN0ZWQgYXZhaWxhYmxlIHBvcnRcbiAgYXN5bmMgZnVuY3Rpb24gZ2V0U3VnZ2VzdGVkUG9ydChiYXNlUG9ydCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2FwcHMvcG9ydHMvJHtiYXNlUG9ydH0vc3VnZ2VzdGApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuc3VnZ2VzdGVkUG9ydDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gR2V0IFN1Z2dlc3RlZCBQb3J0JywgZSwgeyBmdW5jdGlvbjogJ2dldFN1Z2dlc3RlZFBvcnQnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZVBvcnQ7XG4gIH1cblxuICAvLyBCdWlsZCBhcHAgc2VsZWN0b3IgZ3JpZCBmcm9tIEFQSSB0ZW1wbGF0ZXNcbiAgYXN5bmMgZnVuY3Rpb24gYnVpbGRBcHBTZWxlY3RvcigpIHtcbiAgICBncmlkLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcgYXBwIHRlbXBsYXRlcy4uLjwvZGl2Pic7XG5cbiAgICAvLyBGZXRjaCB0ZW1wbGF0ZXMgaWYgbm90IGNhY2hlZFxuICAgIGlmICghYXBpVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgZmV0Y2hBcHBUZW1wbGF0ZXMoKTtcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBncmlkLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tZXJyb3IpO1wiPkZhaWxlZCB0byBsb2FkIGFwcCB0ZW1wbGF0ZXMuIFBsZWFzZSB0cnkgYWdhaW4uPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdyaWQuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAvLyBHcm91cCB0ZW1wbGF0ZXMgYnkgY2F0ZWdvcnlcbiAgICBjb25zdCBieUNhdGVnb3J5ID0ge307XG4gICAgZm9yIChjb25zdCBbYXBwSWQsIHRlbXBsYXRlXSBvZiBPYmplY3QuZW50cmllcyhhcGlUZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeSA9IHRlbXBsYXRlLmNhdGVnb3J5IHx8ICdPdGhlcic7XG4gICAgICBpZiAoIWJ5Q2F0ZWdvcnlbY2F0ZWdvcnldKSB7XG4gICAgICAgIGJ5Q2F0ZWdvcnlbY2F0ZWdvcnldID0gW107XG4gICAgICB9XG4gICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XS5wdXNoKHsgaWQ6IGFwcElkLCAuLi50ZW1wbGF0ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlIG9yZGVyIGluIGFwaUNhdGVnb3JpZXMgaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgY2F0ZWdvcnlPcmRlciA9IGFwaUNhdGVnb3JpZXMgPyBPYmplY3Qua2V5cyhhcGlDYXRlZ29yaWVzKSA6IE9iamVjdC5rZXlzKGJ5Q2F0ZWdvcnkpLnNvcnQoKTtcblxuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY2F0ZWdvcnlPcmRlcikge1xuICAgICAgY29uc3QgYXBwcyA9IGJ5Q2F0ZWdvcnlbY2F0ZWdvcnldO1xuICAgICAgaWYgKCFhcHBzIHx8IGFwcHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgLy8gU29ydCBhcHBzIGJ5IHBvcHVsYXJpdHkgKGRlc2NlbmRpbmcpXG4gICAgICBhcHBzLnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgICAgLy8gQ2F0ZWdvcnkgaGVhZGVyIHdpdGggaWNvbiBhbmQgY29sb3IgZnJvbSBBUElcbiAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaGVhZGVyLmNsYXNzTmFtZSA9ICdhcHAtY2F0ZWdvcnktaGVhZGVyJztcbiAgICAgIGNvbnN0IGNhdGVnb3J5SW5mbyA9IGFwaUNhdGVnb3JpZXM/LltjYXRlZ29yeV0gfHwge307XG4gICAgICBoZWFkZXIuaW5uZXJIVE1MID0gYCR7ZXNjYXBlSHRtbChjYXRlZ29yeUluZm8uaWNvbiB8fCAnJyl9ICR7ZXNjYXBlSHRtbChjYXRlZ29yeSl9YDtcbiAgICAgIGlmIChjYXRlZ29yeUluZm8uY29sb3IpIHtcbiAgICAgICAgaGVhZGVyLnN0eWxlLmJvcmRlckJvdHRvbUNvbG9yID0gY2F0ZWdvcnlJbmZvLmNvbG9yO1xuICAgICAgfVxuICAgICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgICAvLyBBcHAgb3B0aW9uc1xuICAgICAgYXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBvcHRpb24uY2xhc3NOYW1lID0gJ2FwcC1vcHRpb24nO1xuXG4gICAgICAgIC8vIFdpZGdldCBlbmFibGVkIGJhZGdlXG4gICAgICAgIGNvbnN0IGlzV2lkZ2V0ID0gYXBwLmlzRGFzaGJvYXJkV2lkZ2V0O1xuICAgICAgICBjb25zdCB3aWRnZXRFbmFibGVkID0gaXNXaWRnZXQgJiYgc2FmZUdldCgnd2lkZ2V0LScgKyBhcHAuaWQgKyAnLWVuYWJsZWQnKSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgY29uc3Qgd2lkZ2V0QmFkZ2UgPSBpc1dpZGdldFxuICAgICAgICAgID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MTMwJyA6ICcjZTc0YzNjMzAnfTsgY29sb3I6ICR7d2lkZ2V0RW5hYmxlZCA/ICcjMmVjYzcxJyA6ICcjZTc0YzNjJ307IGZvbnQtd2VpZ2h0OiA2MDA7XCI+JHt3aWRnZXRFbmFibGVkID8gJ09OJyA6ICdPRkYnfTwvZGl2PmBcbiAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIC8vIFNob3cgZGlmZmljdWx0eSBiYWRnZSAobm9uLXdpZGdldHMgb25seSlcbiAgICAgICAgY29uc3QgZGlmZmljdWx0eUJhZGdlID0gIWlzV2lkZ2V0ICYmIGFwcC5kaWZmaWN1bHR5ID9cbiAgICAgICAgICBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6ICR7XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0Vhc3knID8gJyMyZWNjNzEnIDpcbiAgICAgICAgICAgIGFwcC5kaWZmaWN1bHR5ID09PSAnSW50ZXJtZWRpYXRlJyA/ICcjZjM5YzEyJyA6ICcjZTc0YzNjJ1xuICAgICAgICAgIH0yMDsgY29sb3I6ICR7XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0Vhc3knID8gJyMyZWNjNzEnIDpcbiAgICAgICAgICAgIGFwcC5kaWZmaWN1bHR5ID09PSAnSW50ZXJtZWRpYXRlJyA/ICcjZjM5YzEyJyA6ICcjZTc0YzNjJ1xuICAgICAgICAgIH07XCI+JHtlc2NhcGVIdG1sKGFwcC5kaWZmaWN1bHR5KX08L2Rpdj5gIDogJyc7XG5cbiAgICAgICAgb3B0aW9uLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1pY29uXCI+JHtlc2NhcGVIdG1sKGFwcC5pY29uIHx8ICdcdUQ4M0RcdURDRTYnKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1uYW1lXCI+JHtlc2NhcGVIdG1sKGFwcC5uYW1lKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKGFwcC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICAgJHt3aWRnZXRCYWRnZX0ke2RpZmZpY3VsdHlCYWRnZX1cbiAgICAgICAgYDtcblxuICAgICAgICBpZiAoaXNXaWRnZXQpIHtcbiAgICAgICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHRvZ2dsZURhc2hib2FyZFdpZGdldChhcHAsIG9wdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiBzaG93RGVwbG95Q29uZmlnKGFwcCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JpZC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIHJlY2lwZSBjYXJkcyBhdCB0aGUgZW5kIG9mIHRoZSBncmlkXG4gICAgaWYgKHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcykge1xuICAgICAgYXdhaXQgd2luZG93LnJlbmRlclJlY2lwZUNhcmRzKGdyaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRvZ2dsZSBhIGRhc2hib2FyZCB3aWRnZXQgb24vb2ZmXG4gIGZ1bmN0aW9uIHRvZ2dsZURhc2hib2FyZFdpZGdldChhcHAsIG9wdGlvbkVsKSB7XG4gICAgY29uc3Qga2V5ID0gJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJztcbiAgICBjb25zdCBjdXJyZW50bHlFbmFibGVkID0gc2FmZUdldChrZXkpICE9PSAnZmFsc2UnO1xuICAgIGNvbnN0IG5ld1N0YXRlID0gIWN1cnJlbnRseUVuYWJsZWQ7XG4gICAgc2FmZVNldChrZXksIFN0cmluZyhuZXdTdGF0ZSkpO1xuXG4gICAgLy8gVXBkYXRlIHZpc2liaWxpdHkgaW1tZWRpYXRlbHlcbiAgICBjb25zdCBzZWxlY3RvciA9IGFwcC53aWRnZXRTZWxlY3RvcjtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoZWwpIGVsLnN0eWxlLmRpc3BsYXkgPSBuZXdTdGF0ZSA/ICcnIDogJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgYmFkZ2UgaW4gdGhlIGFwcCBzZWxlY3RvciBjYXJkXG4gICAgY29uc3QgYmFkZ2UgPSBvcHRpb25FbC5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyLXJhZGl1czogNHB4XCJdJyk7XG4gICAgaWYgKGJhZGdlKSB7XG4gICAgICBiYWRnZS50ZXh0Q29udGVudCA9IG5ld1N0YXRlID8gJ09OJyA6ICdPRkYnO1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9IG5ld1N0YXRlID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gbmV3U3RhdGUgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyc7XG4gICAgfVxuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgJHthcHAubmFtZX0gd2lkZ2V0ICR7bmV3U3RhdGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWAsICdzdWNjZXNzJywgMjAwMCk7XG4gIH1cblxuICAvLyBTaG93IGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBtb2RhbFxuICBhc3luYyBmdW5jdGlvbiBzaG93RGVwbG95Q29uZmlnKGFwcFRlbXBsYXRlKSB7XG4gICAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktdGl0bGUnKTtcbiAgICBjb25zdCBzdWJkb21haW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktc3ViZG9tYWluJyk7XG4gICAgY29uc3QgdXJsUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdXJsLXByZXZpZXcnKTtcbiAgICBjb25zdCBpcElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1pcCcpO1xuICAgIGNvbnN0IHBvcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcG9ydCcpO1xuICAgIGNvbnN0IHRhaWxzY2FsZUNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpO1xuICAgIGNvbnN0IHRhaWxzY2FsZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWlsc2NhbGUtc3RhdHVzJyk7XG5cbiAgICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgY29udGFpbmVyIHdpdGggc2FtZSBpbWFnZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVja1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXBwcy9jaGVjay1leGlzdGluZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFwcElkOiBhcHBUZW1wbGF0ZS5pZCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IGF3YWl0IGNoZWNrUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoY2hlY2tSZXN1bHQuc3VjY2VzcyAmJiBjaGVja1Jlc3VsdC5leGlzdHMpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY2hlY2tSZXN1bHQuY29udGFpbmVyO1xuICAgICAgICBjb25zdCB1c2VFeGlzdGluZyA9IGNvbmZpcm0oXG4gICAgICAgICAgYEZvdW5kIGV4aXN0aW5nICR7YXBwVGVtcGxhdGUubmFtZX0gY29udGFpbmVyOlxcblxcbmAgK1xuICAgICAgICAgIGBDb250YWluZXI6ICR7Y29udGFpbmVyLm5hbWV9XFxuYCArXG4gICAgICAgICAgYFN0YXR1czogJHtjb250YWluZXIuc3RhdHVzfVxcbmAgK1xuICAgICAgICAgIGBQb3J0OiAke2NvbnRhaW5lci5wcmltYXJ5UG9ydCB8fCAnTi9BJ31cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHRoaXMgZXhpc3RpbmcgY29udGFpbmVyP1xcblxcbmAgK1xuICAgICAgICAgIGBDbGljayBPSyB0byBjb25maWd1cmUgRE5TL0NhZGR5IGZvciB0aGUgZXhpc3RpbmcgY29udGFpbmVyLlxcbmAgK1xuICAgICAgICAgIGBDbGljayBDYW5jZWwgdG8gZGVwbG95IGEgbmV3IGNvbnRhaW5lci5gXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gU3RvcmUgZXhpc3RpbmcgY29udGFpbmVyIGluZm8gZm9yIGRlcGxveW1lbnRcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgPSB0cnVlO1xuICAgICAgICAgIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSBjb250YWluZXIgY2hlY2sgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gU2V0IHRpdGxlIHdpdGggYXBwIGluZm9cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHthcHBUZW1wbGF0ZS5uYW1lfWA7XG5cbiAgICAvLyBQcmUtZmlsbCBzdWJkb21haW4gZnJvbSB0ZW1wbGF0ZSBvciBhcHAgSURcbiAgICBjb25zdCBkZWZhdWx0U3ViZG9tYWluID0gYXBwVGVtcGxhdGUuc3ViZG9tYWluIHx8IGFwcFRlbXBsYXRlLmlkLnJlcGxhY2UoLy0vZywgJycpO1xuICAgIHN1YmRvbWFpbklucHV0LnZhbHVlID0gZGVmYXVsdFN1YmRvbWFpbjtcblxuICAgIC8vIFNob3cgc3VicGF0aCBjb21wYXRpYmlsaXR5IHdhcm5pbmcgaW4gc3ViZGlyZWN0b3J5IG1vZGVcbiAgICBjb25zdCBzdWJwYXRoV2FybmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJwYXRoLWNvbXBhdC13YXJuaW5nJyk7XG4gICAgaWYgKHN1YnBhdGhXYXJuaW5nKSB7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScpIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydCA9IGFwcFRlbXBsYXRlLnN1YnBhdGhTdXBwb3J0IHx8ICdzdHJpcCc7XG4gICAgICAgIGlmIChzdXBwb3J0ID09PSAnbm9uZScpIHtcbiAgICAgICAgICBzdWJwYXRoV2FybmluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBzdWJwYXRoV2FybmluZy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogI2ZmOTgwMDtcIj4mIzk4ODg7IDxzdHJvbmc+JyArIGFwcFRlbXBsYXRlLm5hbWUgKyAnPC9zdHJvbmc+IGRvZXMgbm90IHN1cHBvcnQgc3ViZGlyZWN0b3J5IG1vZGUuIEl0IG1heSBub3Qgd29yayBjb3JyZWN0bHkgYXQgYSBzdWJwYXRoLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQgPT09ICdzdHJpcCcpIHtcbiAgICAgICAgICBzdWJwYXRoV2FybmluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBzdWJwYXRoV2FybmluZy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiYjOTQzMjsgJyArIGFwcFRlbXBsYXRlLm5hbWUgKyAnIGhhcyB1bnZlcmlmaWVkIHN1YmRpcmVjdG9yeSBzdXBwb3J0LiBJdCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24uPC9zcGFuPic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcmUtc2VsZWN0IEROUy9TU0wgZnJvbSBzaXRlIGNvbmZpZyAoc2V0IGR1cmluZyBzZXR1cCB3aXphcmQpXG4gICAgY29uc3QgY2ZnRG5zVHlwZSA9IFNJVEUuZGVmYXVsdHMuZG5zVHlwZSB8fCAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgPyAncHVibGljJyA6ICdwcml2YXRlJyk7XG4gICAgY29uc3QgY2ZnU3NsVHlwZSA9IFNJVEUuZGVmYXVsdHMuc3NsVHlwZSB8fCAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgPyAnbGV0c2VuY3J5cHQnIDogJ2ludGVybmFsJyk7XG4gICAgY29uc3QgZG5zUmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCIke2NmZ0Ruc1R5cGV9XCJdYCk7XG4gICAgY29uc3Qgc3NsUmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl1bdmFsdWU9XCIke2NmZ1NzbFR5cGV9XCJdYCk7XG4gICAgaWYgKGRuc1JhZGlvKSBkbnNSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJkbnMtdHlwZVwiXVt2YWx1ZT1cInByaXZhdGVcIl0nKS5jaGVja2VkID0gdHJ1ZTtcbiAgICBpZiAoc3NsUmFkaW8pIHNzbFJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGVsc2UgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiaW50ZXJuYWxcIl0nKS5jaGVja2VkID0gdHJ1ZTtcbiAgICBpcElucHV0LnZhbHVlID0gU0lURS5kZWZhdWx0cy50YXJnZXRJUCB8fCAnbG9jYWxob3N0JztcbiAgICB0YWlsc2NhbGVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cbiAgICAvLyBNb3ZlIEROUy9TU0wgaW50byBBZHZhbmNlZCBzZWN0aW9uIHdoZW4gYWxyZWFkeSBjb25maWd1cmVkXG4gICAgY29uc3QgZG5zU2VjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIC5mbGV4LWNvbC1nYXAnKT8uY2xvc2VzdCgnZGl2Jyk7XG4gICAgY29uc3QgYWR2YW5jZWREZXRhaWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FwcC1kZXBsb3ktbW9kYWwgZGV0YWlscycpO1xuICAgIGNvbnN0IGFkdmFuY2VkQ29udGVudCA9IGFkdmFuY2VkRGV0YWlscz8ucXVlcnlTZWxlY3RvcignZGl2Jyk7XG4gICAgaWYgKGFkdmFuY2VkRGV0YWlscyAmJiBhZHZhbmNlZENvbnRlbnQgJiYgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnIHx8IFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdob21lbGFiJykpIHtcbiAgICAgIC8vIE1vdmUgRE5TIGFuZCBTU0wgc2VjdGlvbnMgaW5zaWRlIEFkdmFuY2VkXG4gICAgICBjb25zdCBkbnNTZWN0aW9uRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYXBwLWRlcGxveS1tb2RhbCBpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKVswXT8uY2xvc2VzdCgnZGl2LmZsZXgtY29sLWdhcCcpPy5wYXJlbnRFbGVtZW50O1xuICAgICAgY29uc3Qgc3NsU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChkbnNTZWN0aW9uRWwgJiYgIWRuc1NlY3Rpb25FbC5kYXRhc2V0Lm1vdmVkKSB7XG4gICAgICAgIGFkdmFuY2VkQ29udGVudC5hcHBlbmRDaGlsZChkbnNTZWN0aW9uRWwpO1xuICAgICAgICBkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCA9ICcxJztcbiAgICAgIH1cbiAgICAgIGlmIChzc2xTZWN0aW9uRWwgJiYgIXNzbFNlY3Rpb25FbC5kYXRhc2V0Lm1vdmVkKSB7XG4gICAgICAgIGFkdmFuY2VkQ29udGVudC5hcHBlbmRDaGlsZChzc2xTZWN0aW9uRWwpO1xuICAgICAgICBzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCA9ICcxJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbWVkaWEgcGF0aCBzZWN0aW9uIGZvciBtZWRpYSBhcHBzXG4gICAgY29uc3QgbWVkaWFQYXRoU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLXNlY3Rpb24nKTtcbiAgICBjb25zdCBtZWRpYVBhdGhJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVkaWEtcGF0aCcpO1xuICAgIGNvbnN0IG1lZGlhUGF0aERlc2NyaXB0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhLXBhdGgtZGVzY3JpcHRpb24nKTtcblxuICAgIGlmIChhcHBUZW1wbGF0ZS5tZWRpYU1vdW50KSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnBsYWNlaG9sZGVyID0gJy9tZWRpYS9Nb3ZpZXMsIC9tZWRpYS9UVlNob3dzIG9yIGNsaWNrIEJyb3dzZSc7XG5cbiAgICAgIC8vIEZldGNoIGRldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnNcbiAgICAgIGNvbnN0IGRldGVjdGVkTW91bnRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKTtcbiAgICAgIGNvbnN0IGRldGVjdGVkTW91bnRzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtbGlzdCcpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtb3VudHNSZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21lZGlhL2RldGVjdGVkLW1vdW50cycpO1xuICAgICAgICBjb25zdCBtb3VudHNSZXN1bHQgPSBhd2FpdCBtb3VudHNSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgaWYgKG1vdW50c1Jlc3VsdC5zdWNjZXNzICYmIG1vdW50c1Jlc3VsdC5tb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRldGVjdGVkTW91bnRzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIGRldGVjdGVkTW91bnRzTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgIC8vIEF1dG8tZmlsbCBtZWRpYSBwYXRoIHdpdGggYWxsIGRldGVjdGVkIG1vdW50c1xuICAgICAgICAgIGNvbnN0IGF1dG9QYXRocyA9IFsuLi5uZXcgU2V0KG1vdW50c1Jlc3VsdC5tb3VudHMubWFwKG0gPT4gbS5ob3N0UGF0aCkpXTtcbiAgICAgICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9IGF1dG9QYXRocy5qb2luKCcsICcpO1xuXG4gICAgICAgICAgbW91bnRzUmVzdWx0Lm1vdW50cy5mb3JFYWNoKG1vdW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgYnRuLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBhdXRvUGF0aHMuaW5jbHVkZXMobW91bnQuaG9zdFBhdGgpO1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSBgcGFkZGluZzogOHB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpICR7aXNTZWxlY3RlZCA/ICc0MCUnIDogJzE1JSd9LCB2YXIoLS1jYXJkLWJnKSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWZnKTtgO1xuICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG1vdW50LmZvbGRlck5hbWUpfTwvc3Bhbj48YnI+PHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5mcm9tICR7ZXNjYXBlSHRtbChtb3VudC5zb3VyY2VJbWFnZSl9PC9zcGFuPmA7XG4gICAgICAgICAgICBidG4udGl0bGUgPSBgJHttb3VudC5ob3N0UGF0aH0gKGZyb20gJHttb3VudC5zb3VyY2VDb250YWluZXJ9KWA7XG4gICAgICAgICAgICBidG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGhzID0gbWVkaWFQYXRoSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGN1cnJlbnRQYXRocy5pbmRleE9mKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGhzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAxNSUsIHZhcigtLWNhcmQtYmcpKSc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGhzLnB1c2gobW91bnQuaG9zdFBhdGgpO1xuICAgICAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSA0MCUsIHZhcigtLWNhcmQtYmcpKSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBjdXJyZW50UGF0aHMuam9pbignLCAnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRldGVjdGVkTW91bnRzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBicm93c2UgYnV0dG9uXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJvd3NlLW1lZGlhLWJ0bicpLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIG9wZW5Gb2xkZXJCcm93c2VyKG1lZGlhUGF0aElucHV0KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lZGlhUGF0aFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgLy8gU2hvdyBQbGV4IGNsYWltIHRva2VuIHNlY3Rpb24gZm9yIFBsZXggZGVwbG95bWVudHNcbiAgICBjb25zdCBwbGV4Q2xhaW1TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsZXgtY2xhaW0tc2VjdGlvbicpO1xuICAgIGlmIChwbGV4Q2xhaW1TZWN0aW9uKSB7XG4gICAgICBpZiAoYXBwVGVtcGxhdGUuaWQgPT09ICdwbGV4JyB8fCBhcHBUZW1wbGF0ZS5jbGFpbVRva2VuKSB7XG4gICAgICAgIHBsZXhDbGFpbVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpLnZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUG9wdWxhdGUgdm9sdW1lIG1vdW50cyBpbiBBZHZhbmNlZCBPcHRpb25zXG4gICAgY29uc3Qgdm9sdW1lU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLXNlY3Rpb24nKTtcbiAgICBjb25zdCB2b2x1bWVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZvbHVtZS1tb3VudHMtbGlzdCcpO1xuICAgIHZvbHVtZUxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUuZG9ja2VyPy52b2x1bWVzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1lZGlhQ29udGFpbmVyUGF0aCA9IGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LmNvbnRhaW5lclBhdGg7XG4gICAgICBjb25zdCBub25NZWRpYVZvbHVtZXMgPSBhcHBUZW1wbGF0ZS5kb2NrZXIudm9sdW1lcy5maWx0ZXIodiA9PiAhdi5pbmNsdWRlcygne3tNRURJQV9QQVRIfX0nKSAmJiAhKG1lZGlhQ29udGFpbmVyUGF0aCAmJiB2LmVuZHNXaXRoKCc6JyArIG1lZGlhQ29udGFpbmVyUGF0aCkpKTtcblxuICAgICAgaWYgKG5vbk1lZGlhVm9sdW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIG5vbk1lZGlhVm9sdW1lcy5mb3JFYWNoKCh2b2wsIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBbaG9zdERlZmF1bHQsIGNvbnRhaW5lclBhdGhdID0gdm9sLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgcm93LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7JztcbiAgICAgICAgICByb3cuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJ2b2wtaG9zdC1wYXRoXCIgZGF0YS1jb250YWluZXItcGF0aD1cIiR7Y29udGFpbmVyUGF0aH1cIiB2YWx1ZT1cIiR7aG9zdERlZmF1bHR9XCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIC8+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cdTIxOTIgJHtjb250YWluZXJQYXRofTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm9sLWJyb3dzZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzRFx1RENDMjwvYnV0dG9uPlxuICAgICAgICAgIGA7XG4gICAgICAgICAgdm9sdW1lTGlzdC5hcHBlbmRDaGlsZChyb3cpO1xuICAgICAgICAgIHJvdy5xdWVyeVNlbGVjdG9yKCcudm9sLWJyb3dzZS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSByb3cucXVlcnlTZWxlY3RvcignLnZvbC1ob3N0LXBhdGgnKTtcbiAgICAgICAgICAgIG9wZW5Gb2xkZXJCcm93c2VyKGlucHV0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdm9sdW1lU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IHBvcnQgZnJvbSB0ZW1wbGF0ZSBhbmQgY2hlY2sgYXZhaWxhYmlsaXR5XG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwO1xuICAgIHBvcnRJbnB1dC52YWx1ZSA9ICcnO1xuICAgIHBvcnRJbnB1dC5wbGFjZWhvbGRlciA9IGBEZWZhdWx0OiAke2RlZmF1bHRQb3J0fWA7XG5cbiAgICAvLyBBZGQgcG9ydCBzdGF0dXMgZWxlbWVudCBpZiBub3QgZXhpc3RzXG4gICAgbGV0IHBvcnRTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQtc3RhdHVzJyk7XG4gICAgaWYgKCFwb3J0U3RhdHVzKSB7XG4gICAgICBwb3J0U3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwb3J0U3RhdHVzLmlkID0gJ2RlcGxveS1wb3J0LXN0YXR1cyc7XG4gICAgICBwb3J0U3RhdHVzLnN0eWxlLmNzc1RleHQgPSAnZm9udC1zaXplOiAwLjhyZW07IG1hcmdpbi10b3A6IDRweDsnO1xuICAgICAgcG9ydElucHV0LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocG9ydFN0YXR1cyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVmYXVsdCBwb3J0IGF2YWlsYWJpbGl0eVxuICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cygpIHtcbiAgICAgIGNvbnN0IHBvcnRUb0NoZWNrID0gcG9ydElucHV0LnZhbHVlIHx8IGRlZmF1bHRQb3J0O1xuICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNoZWNraW5nIHBvcnQuLi48L3NwYW4+JztcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnRUb0NoZWNrKTtcbiAgICAgIGlmIChyZXN1bHQuYXZhaWxhYmxlKSB7XG4gICAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0Y2FmNTA7XCI+UG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHBvcnRUb0NoZWNrKSl9IGlzIGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGVkUG9ydCA9IGF3YWl0IGdldFN1Z2dlc3RlZFBvcnQoZGVmYXVsdFBvcnQpO1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZTc0YzNjO1wiPlBvcnQgJHtlc2NhcGVIdG1sKHBvcnRUb0NoZWNrKX0gaW4gdXNlIGJ5ICR7ZXNjYXBlSHRtbChyZXN1bHQuY29uZmxpY3Q/LnVzZWRCeSB8fCAndW5rbm93bicpfTwvc3Bhbj5cbiAgICAgICAgYDtcbiAgICAgICAgY29uc3QgdXNlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIHVzZUJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHVzZUJ0bi50ZXh0Q29udGVudCA9IGBVc2UgJHtzdWdnZXN0ZWRQb3J0fWA7XG4gICAgICAgIHVzZUJ0bi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi1sZWZ0OiA4cHg7IHBhZGRpbmc6IDJweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICAgIHVzZUJ0bi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcG9ydCcpLnZhbHVlID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlVzaW5nIHN1Z2dlc3RlZCBwb3J0ICR7ZXNjYXBlSHRtbChTdHJpbmcoc3VnZ2VzdGVkUG9ydCkpfTwvc3Bhbj5gO1xuICAgICAgICB9O1xuICAgICAgICBwb3J0U3RhdHVzLmFwcGVuZENoaWxkKHVzZUJ0bik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgcG9ydCBvbiBpbnB1dCBjaGFuZ2UgKGRlYm91bmNlZClcbiAgICBsZXQgcG9ydENoZWNrVGltZW91dDtcbiAgICBwb3J0SW5wdXQub25pbnB1dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHBvcnRDaGVja1RpbWVvdXQpO1xuICAgICAgcG9ydENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzLCA1MDApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsIHBvcnQgY2hlY2tcbiAgICBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKTtcblxuICAgIC8vIEZldGNoIFRhaWxzY2FsZSBzdGF0dXNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90YWlsc2NhbGUvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmluc3RhbGxlZCAmJiBkYXRhLmNvbm5lY3RlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0Y2FmNTA7XCI+Q29ubmVjdGVkPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDhweDtcIj4ke2RhdGEuc2VsZj8uaG9zdG5hbWV9ICgke2RhdGEuc2VsZj8uaXB9KTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+fCAke2RhdGEuZGV2aWNlQ291bnR9IGRldmljZXM8L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuaW5zdGFsbGVkKSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2ZmOTgwMDtcIj5Ob3QgY29ubmVjdGVkPC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Ob3QgYXZhaWxhYmxlPC9zcGFuPmA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db3VsZCBub3QgY2hlY2sgc3RhdHVzPC9zcGFuPmA7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIFVSTCBwcmV2aWV3IGluIHJlYWwtdGltZVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVVybFByZXZpZXcoKSB7XG4gICAgICBjb25zdCBzdWJkb21haW4gPSBzdWJkb21haW5JbnB1dC52YWx1ZSB8fCAnc3ViZG9tYWluJztcbiAgICAgIGNvbnN0IGRuc1R5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuICAgICAgY29uc3Qgc3NsVHlwZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXTpjaGVja2VkJykudmFsdWU7XG5cbiAgICAgIGxldCB1cmwgPSAnJztcbiAgICAgIGlmIChTSVRFLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyAmJiBTSVRFLmRvbWFpbikge1xuICAgICAgICAvLyBTdWJkaXJlY3RvcnkgbW9kZTogZG9tYWluLmNvbS9hcHBcbiAgICAgICAgdXJsID0gYGh0dHBzOi8vJHtTSVRFLmRvbWFpbn0vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSBpZiAoZG5zVHlwZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gc3NsVHlwZSA9PT0gJ25vbmUnID8gJ2h0dHAnIDogJ2h0dHBzJztcbiAgICAgICAgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtidWlsZERvbWFpbihzdWJkb21haW4pfWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gc3NsVHlwZSA9PT0gJ25vbmUnID8gJ2h0dHAnIDogJ2h0dHBzJztcbiAgICAgICAgY29uc3QgZG9tYWluID0gU0lURS5kb21haW4gfHwgc3ViZG9tYWluO1xuICAgICAgICB1cmwgPSBTSVRFLmRvbWFpbiA/IGAke3Byb3RvY29sfTovLyR7c3ViZG9tYWlufS4ke1NJVEUuZG9tYWlufWAgOiBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHBvcnRJbnB1dC52YWx1ZSB8fCBhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCBEQy5ERUZBVUxUUy5TRVJWSUNFX1BPUlQ7XG4gICAgICAgIHVybCA9IGBodHRwOi8vJHtpcElucHV0LnZhbHVlfToke3BvcnR9YDtcbiAgICAgIH1cbiAgICAgIHVybFByZXZpZXcudGV4dENvbnRlbnQgPSB1cmw7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGxpc3RlbmVyc1xuICAgIHN1YmRvbWFpbklucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIGlwSW5wdXQub25pbnB1dCA9IHVwZGF0ZVVybFByZXZpZXc7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJkbnMtdHlwZVwiXScpLmZvckVhY2gocmFkaW8gPT4ge1xuICAgICAgcmFkaW8ub25jaGFuZ2UgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIH0pO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpLmZvckVhY2gocmFkaW8gPT4ge1xuICAgICAgcmFkaW8ub25jaGFuZ2UgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIH0pO1xuXG4gICAgdXBkYXRlVXJsUHJldmlldygpO1xuXG4gICAgLy8gQ2xvc2UgYXBwIHNlbGVjdG9yLCBvcGVuIGRlcGxveSBjb25maWdcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gU3RvcmUgYXBwIHRlbXBsYXRlIGZvciBkZXBsb3ltZW50XG4gICAgZGVwbG95TW9kYWwuZGF0YXNldC5hcHBUZW1wbGF0ZSA9IEpTT04uc3RyaW5naWZ5KGFwcFRlbXBsYXRlKTtcbiAgfVxuXG4gIC8vIEFkZCBhcHAgdG8gZ3JpZCB3aXRoIGZ1bGwgRG9ja2VyIGRlcGxveW1lbnRcbiAgYXN5bmMgZnVuY3Rpb24gYWRkQXBwVG9HcmlkKGRlcGxveUNvbmZpZykge1xuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gZGVwbG95Q29uZmlnLmFwcFRlbXBsYXRlO1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdXNpbmcgZXhpc3RpbmcgY29udGFpbmVyXG4gICAgY29uc3QgdXNpbmdFeGlzdGluZyA9IGFwcFRlbXBsYXRlLl91c2VFeGlzdGluZyAmJiBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXI7XG5cbiAgICAvLyBDaGVjayBpZiBhcHAgYWxyZWFkeSBleGlzdHMgLSBza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lciAodXNlciBhbHJlYWR5IGNvbmZpcm1lZClcbiAgICBjb25zdCBleGlzdGluZ0FwcCA9IGN1c3RvbUFwcHMuZmluZChhID0+IGEuaWQgPT09IGRlcGxveUNvbmZpZy5zdWJkb21haW4pO1xuICAgIGlmIChleGlzdGluZ0FwcCAmJiAhdXNpbmdFeGlzdGluZykge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gY29uZmlybShgQW4gYXBwIHdpdGggc3ViZG9tYWluIFwiJHtkZXBsb3lDb25maWcuc3ViZG9tYWlufVwiIGFscmVhZHkgZXhpc3RzLiBSZWRlcGxveT9gKTtcbiAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG4gICAgfVxuICAgIC8vIFJlbW92ZSBmcm9tIGxvY2FsU3RvcmFnZSB0byBhbGxvdyByZWRlcGxveW1lbnQvdXBkYXRlXG4gICAgaWYgKGV4aXN0aW5nQXBwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGN1c3RvbUFwcHMuaW5kZXhPZihleGlzdGluZ0FwcCk7XG4gICAgICBjdXN0b21BcHBzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBzYWZlU2V0KEFQUFNfS0VZLCBKU09OLnN0cmluZ2lmeShjdXN0b21BcHBzKSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHkgYmVmb3JlIGRlcGxveW1lbnQgKHNraXAgaWYgdXNpbmcgZXhpc3RpbmcgY29udGFpbmVyKVxuICAgIGlmICghdXNpbmdFeGlzdGluZykge1xuICAgICAgY29uc3QgcG9ydFRvVXNlID0gZGVwbG95Q29uZmlnLnBvcnQgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYENoZWNraW5nIHBvcnQgJHtwb3J0VG9Vc2V9IGF2YWlsYWJpbGl0eS4uLmAsICdpbmZvJywgMCk7XG5cbiAgICAgIGNvbnN0IHBvcnRDaGVjayA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9Vc2UpO1xuICAgICAgaWYgKCFwb3J0Q2hlY2suYXZhaWxhYmxlKSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODApO1xuICAgICAgICBjb25zdCB1c2VBbHRlcm5hdGUgPSBjb25maXJtKFxuICAgICAgICAgIGBQb3J0ICR7cG9ydFRvVXNlfSBpcyBhbHJlYWR5IGluIHVzZSBieSAke3BvcnRDaGVjay5jb25mbGljdD8udXNlZEJ5IHx8ICdhbm90aGVyIGNvbnRhaW5lcid9LlxcblxcbmAgK1xuICAgICAgICAgIGBXb3VsZCB5b3UgbGlrZSB0byB1c2UgcG9ydCAke3N1Z2dlc3RlZFBvcnR9IGluc3RlYWQ/YFxuICAgICAgICApO1xuICAgICAgICBpZiAodXNlQWx0ZXJuYXRlKSB7XG4gICAgICAgICAgZGVwbG95Q29uZmlnLnBvcnQgPSBzdWdnZXN0ZWRQb3J0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0RlcGxveW1lbnQgY2FuY2VsbGVkIC0gcG9ydCBjb25mbGljdCcsICdlcnJvcicsIDUwMDApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgZXhpc3RpbmcgY29udGFpbmVyJ3MgcG9ydFxuICAgICAgZGVwbG95Q29uZmlnLnBvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgfVxuICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICB1c2luZ0V4aXN0aW5nXG4gICAgICAgID8gYENvbmZpZ3VyaW5nICR7YXBwVGVtcGxhdGUubmFtZX0gd2l0aCBleGlzdGluZyBjb250YWluZXIuLi5gXG4gICAgICAgIDogYERlcGxveWluZyAke2FwcFRlbXBsYXRlLm5hbWV9Li4uYCxcbiAgICAgICdpbmZvJywgMFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUHJlcGFyZSBkZXBsb3ltZW50IGNvbmZpZyBmcm9tIHVzZXIncyBjaG9pY2VzXG4gICAgICBjb25zdCBhcGlEZXBsb3lDb25maWcgPSB7XG4gICAgICAgIGFwcElkOiBhcHBUZW1wbGF0ZS5pZCxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgc3ViZG9tYWluOiBkZXBsb3lDb25maWcuc3ViZG9tYWluLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsXG4gICAgICAgICAgY3JlYXRlRG5zOiBkZXBsb3lDb25maWcuZG5zVHlwZSA9PT0gJ3ByaXZhdGUnLCAgLy8gT25seSBjcmVhdGUgRE5TIGZvciBwcml2YXRlXG4gICAgICAgICAgcG9ydDogZGVwbG95Q29uZmlnLnBvcnQgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgbnVsbCwgIC8vIFVzZSBjdXN0b20sIHRlbXBsYXRlIGRlZmF1bHQsIG9yIG51bGxcbiAgICAgICAgICBzc2xUeXBlOiBkZXBsb3lDb25maWcuc3NsVHlwZSxcbiAgICAgICAgICBkbnNUeXBlOiBkZXBsb3lDb25maWcuZG5zVHlwZSxcbiAgICAgICAgICB0YWlsc2NhbGVPbmx5OiBkZXBsb3lDb25maWcudGFpbHNjYWxlT25seSB8fCBmYWxzZSwgIC8vIFRhaWxzY2FsZS1vbmx5IGFjY2VzcyByZXN0cmljdGlvblxuICAgICAgICAgIG1lZGlhUGF0aDogZGVwbG95Q29uZmlnLm1lZGlhUGF0aCB8fCBudWxsLCAgLy8gTWVkaWEgZm9sZGVyIHBhdGggZm9yIG1lZGlhIGFwcHNcbiAgICAgICAgICBwbGV4Q2xhaW1Ub2tlbjogZGVwbG95Q29uZmlnLnBsZXhDbGFpbVRva2VuIHx8IG51bGwsICAvLyBQbGV4IGNsYWltIHRva2VuIGZvciBhdXRvLWNsYWltXG4gICAgICAgICAgY3VzdG9tVm9sdW1lczogZGVwbG95Q29uZmlnLmN1c3RvbVZvbHVtZXMgfHwgbnVsbCAgLy8gQ3VzdG9tIHZvbHVtZSBtb3VudCBvdmVycmlkZXNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGlmIHVzaW5nIGV4aXN0aW5nXG4gICAgICBpZiAodXNpbmdFeGlzdGluZykge1xuICAgICAgICBhcGlEZXBsb3lDb25maWcuY29uZmlnLnVzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ0NvbnRhaW5lcklkID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLmlkO1xuICAgICAgICBhcGlEZXBsb3lDb25maWcuY29uZmlnLmV4aXN0aW5nUG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnQgaWYgbm8gY3VzdG9tIHBvcnQgc3BlY2lmaWVkXG4gICAgICAgIGlmICghZGVwbG95Q29uZmlnLnBvcnQgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0KSB7XG4gICAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERDLUNBVEFMT0ctMzogZGVwbG95IHRocm91Z2ggc2hpcGRlY2sgKG5vIERvY2tlciBkYWVtb24pLiBUaGVcbiAgICAgIC8vIGJyaWRnZSByZW5kZXJzIHRoZSBjYXRhbG9nIGVudHJ5IHNlcnZlci1zaWRlIGFuZCBydW5zIHRoZSBPQ0lcbiAgICAgIC8vIGltYWdlIGFzIGEgaGFyZGVuZWQgc3lzdGVtZCBzZXJ2aWNlLiBTYW1lIG1vZGFsLCBzYW1lIGZpZWxkcy5cbiAgICAgIGNvbnN0IGNhdGFsb2dQYXlsb2FkID0ge1xuICAgICAgICBhcHA6IGFwcFRlbXBsYXRlLmlkLFxuICAgICAgICBwb3J0OiBkZXBsb3lDb25maWcucG9ydCB8fCBhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCBudWxsLFxuICAgICAgICBzdWJkb21haW46IGRlcGxveUNvbmZpZy5zdWJkb21haW4gfHwgJycsXG4gICAgICAgIG1lZGlhX3BhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgJycsXG4gICAgICAgIGVudjogZGVwbG95Q29uZmlnLnBsZXhDbGFpbVRva2VuID8geyBQTEVYX0NMQUlNOiBkZXBsb3lDb25maWcucGxleENsYWltVG9rZW4gfSA6IHt9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2RlcGxveXMvY2F0YWxvZy9kZXBsb3knLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY2F0YWxvZ1BheWxvYWQpXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gQWRkIHRvIHNhdmVkIGFwcHMgKHN0b3JlIElQIGZvciBsYXRlciBkZWxldGlvbilcbiAgICAgICAgY29uc3QgbmV3QXBwID0ge1xuICAgICAgICAgIGlkOiBkZXBsb3lDb25maWcuc3ViZG9tYWluLCAgLy8gVXNlIHN1YmRvbWFpbiBhcyBJRFxuICAgICAgICAgIG5hbWU6IGFwcFRlbXBsYXRlLm5hbWUsXG4gICAgICAgICAgbG9nbzogYC9hc3NldHMvJHthcHBUZW1wbGF0ZS5pZH0ucG5nYCxcbiAgICAgICAgICBjb250YWluZXJJZDogbnVsbCwgIC8vIHNoaXBkZWNrIGRlcGxveXMgaGF2ZSBubyBkb2NrZXIgY29udGFpbmVyIGlkXG4gICAgICAgICAgdXJsOiByZXN1bHQudXJsIHx8IGBodHRwOi8vMTI3LjAuMC4xOiR7Y2F0YWxvZ1BheWxvYWQucG9ydH1gLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsICAvLyBTdG9yZSBJUCBmb3IgRE5TIHJlY29yZCBkZWxldGlvblxuICAgICAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZS5pZCwgIC8vIFN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlIElEXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UgIC8vIFRhaWxzY2FsZSBwcm90ZWN0aW9uIHN0YXR1c1xuICAgICAgICB9O1xuICAgICAgICBjdXN0b21BcHBzLnB1c2gobmV3QXBwKTtcbiAgICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuXG4gICAgICAgIC8vIEFkZCB0byBBUFBTIGFycmF5IGFuZCByZWJ1aWxkIGdyaWRcbiAgICAgICAgLy8gQWNjZXNzIEFQUFMgZnJvbSBwYXJlbnQgc2NvcGUgdmlhIHdpbmRvd1xuICAgICAgICBpZiAod2luZG93LkFQUFMgJiYgIXdpbmRvdy5BUFBTLnNvbWUoYSA9PiBhLmlkID09PSBhcHBUZW1wbGF0ZS5pZCkpIHtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld0FwcCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgd2l0aCBVUkwgKGFuZCB3YXJuaW5nIGlmIEROUyBmYWlsZWQpXG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzdWx0LnVzZWRFeGlzdGluZ1xuICAgICAgICAgID8gYCR7YXBwVGVtcGxhdGUubmFtZX0gY29uZmlndXJlZCB3aXRoIGV4aXN0aW5nIGNvbnRhaW5lciFcXG5VUkw6ICR7cmVzdWx0LnVybH1gXG4gICAgICAgICAgOiBgJHthcHBUZW1wbGF0ZS5uYW1lfSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXFxuVVJMOiAke3Jlc3VsdC51cmx9YDtcbiAgICAgICAgaWYgKHJlc3VsdC53YXJuaW5nKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxuXHUyNkEwIFdhcm5pbmc6ICR7cmVzdWx0Lndhcm5pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24obWVzc2FnZSwgJ3N1Y2Nlc3MnLCA4MDAwKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgcHJvcGVydGllc1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nO1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIEhUVFBTIFVSTHMsIGNoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXNcbiAgICAgICAgaWYgKHJlc3VsdC51cmwgJiYgcmVzdWx0LnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgY2hlY2tTU0xDZXJ0aWZpY2F0ZShyZXN1bHQudXJsLCBhcHBUZW1wbGF0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc2V0dXAgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBJbnN0cnVjdGlvbnMgZm9yICR7YXBwVGVtcGxhdGUubmFtZX06ICR7aW5zdHJ1Y3Rpb25zfWAsICdpbmZvJywgMTAwMDApO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdEZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRGVwbG95bWVudCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZGVwbG95JyB9KTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGBGYWlsZWQgdG8gZGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAnZXJyb3InLFxuICAgICAgICA4MDAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXMgYW5kIG5vdGlmeSB3aGVuIHJlYWR5XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU1NMQ2VydGlmaWNhdGUodXJsLCBhcHBOYW1lKSB7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgXHUyM0YzIEdlbmVyYXRpbmcgU1NMIGNlcnRpZmljYXRlIGZvciAke2FwcE5hbWV9Li4uYCwgJ3dhcm5pbmcnLCA2MDAwMCk7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEyOyAvLyA2MCBzZWNvbmRzIHRvdGFsICg1IHNlY29uZCBpbnRlcnZhbHMpXG4gICAgXG4gICAgY29uc3QgY2hlY2tDZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGZldGNoIHRoZSBVUkwgLSBpZiBTU0wgd29ya3MsIHRoaXMgd2lsbCBzdWNjZWVkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IFxuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIG1vZGU6ICduby1jb3JzJyAvLyBBdm9pZCBDT1JTIGlzc3Vlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTU0wgaXMgd29ya2luZ1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBcdTI3MDUgJHthcHBOYW1lfSBpcyByZWFkeSEgU1NMIGNlcnRpZmljYXRlIGdlbmVyYXRlZC5gLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNTTCBub3QgcmVhZHkgeWV0XG4gICAgICAgIGlmIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dChjaGVja0NlcnQsIDUwMDApOyAvLyBDaGVjayBhZ2FpbiBpbiA1IHNlY29uZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgYFx1MjZBMFx1RkUwRiAke2FwcE5hbWV9IGRlcGxveWVkIGJ1dCBTU0wgY2VydGlmaWNhdGUgbWF5IHN0aWxsIGJlIGdlbmVyYXRpbmcuXFxuVHJ5IHJlZnJlc2hpbmcgaW4gYSBtb21lbnQgaWYgeW91IHNlZSBhIGNlcnRpZmljYXRlIGVycm9yLmAsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAxMDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgYWZ0ZXIgMyBzZWNvbmRzIChnaXZlIENhZGR5IHRpbWUgdG8gc3RhcnQpXG4gICAgc2V0VGltZW91dChjaGVja0NlcnQsIDMwMDApO1xuICB9XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBzdGFydHVwXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21BcHBzKCkge1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuICAgIGN1c3RvbUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwLmlkKSkge1xuICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGFwcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBEQy0xNjM6IHByb2dyYW1tYXRpYyBkZXBsb3ktY29uZmlnIG9wZW5lciBmb3IgdGhlIEFJIGNoYXQgcGFuZWwgKGFuZFxuICAvLyBhbnkgb3RoZXIgaW4tcGFnZSBjb25zdW1lcikuIFJlc29sdmVzIHRoZSB0ZW1wbGF0ZSBpZCBhZ2FpbnN0IHRoZVxuICAvLyBjYWNoZWQgQVBJIHRlbXBsYXRlcyAoZmV0Y2hpbmcgdGhlbSBpZiBuZWVkZWQpLCB0aGVuIG9wZW5zIHRoZSBzYW1lXG4gIC8vIGRlcGxveSBtb2RhbCBhIG1hbnVhbCBjbGljayB3b3VsZC4gUmV0dXJucyBmYWxzZSBmb3IgdW5rbm93biBpZHMuXG4gIHdpbmRvdy5vcGVuRGVwbG95Q29uZmlnRm9yID0gYXN5bmMgZnVuY3Rpb24gKHRlbXBsYXRlSWQpIHtcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgb2tGZXRjaCA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIW9rRmV0Y2gpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gU3RyaW5nKHRlbXBsYXRlSWQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhhcGlUZW1wbGF0ZXMpLmZpbmQoKFtpZF0pID0+IGlkLnRvTG93ZXJDYXNlKCkgPT09IGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFwcCA9IHsgaWQ6IGVudHJ5WzBdLCAuLi5lbnRyeVsxXSB9O1xuICAgIGlmIChhcHAuaXNEYXNoYm9hcmRXaWRnZXQpIHtcbiAgICAgIGF3YWl0IGJ1aWxkQXBwU2VsZWN0b3IoKTtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHJldHVybiAnc2VsZWN0b3InOyAvLyB3aWRnZXQgXHUyMDE0IHBvaW50IGF0IHRoZSBzZWxlY3RvciBncmlkIGluc3RlYWRcbiAgICB9XG4gICAgYXdhaXQgc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1zZWxlY3Rvci1jYW5jZWwnKSk7XG5cbiAgLy8gRGVwbG95IG1vZGFsIGV2ZW50IGxpc3RlbmVyc1xuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LW1vZGFsJyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktY29uZmlybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAvLyBHZXQgdXNlciBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgYXBwVGVtcGxhdGUgPSBKU09OLnBhcnNlKGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUpO1xuICAgIGNvbnN0IG1lZGlhUGF0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVkaWEtcGF0aCcpLnZhbHVlLnRyaW0oKTtcblxuICAgIC8vIENvbGxlY3QgY3VzdG9tIHZvbHVtZSBvdmVycmlkZXNcbiAgICBjb25zdCBjdXN0b21Wb2x1bWVzID0gW107XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3ZvbHVtZS1tb3VudHMtbGlzdCAudm9sLWhvc3QtcGF0aCcpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgY3VzdG9tVm9sdW1lcy5wdXNoKHsgaG9zdFBhdGg6IGlucHV0LnZhbHVlLnRyaW0oKSwgY29udGFpbmVyUGF0aDogaW5wdXQuZGF0YXNldC5jb250YWluZXJQYXRoIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGVwbG95Q29uZmlnID0ge1xuICAgICAgYXBwVGVtcGxhdGU6IGFwcFRlbXBsYXRlLFxuICAgICAgc3ViZG9tYWluOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpLnZhbHVlLnRyaW0oKSxcbiAgICAgIGRuc1R5cGU6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJkbnMtdHlwZVwiXTpjaGVja2VkJykudmFsdWUsXG4gICAgICBzc2xUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgaXA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKS52YWx1ZS50cmltKCksXG4gICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZS50cmltKCksXG4gICAgICB0YWlsc2NhbGVPbmx5OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXRhaWxzY2FsZS1vbmx5JykuY2hlY2tlZCxcbiAgICAgIG1lZGlhUGF0aDogbWVkaWFQYXRoIHx8IG51bGwsXG4gICAgICBwbGV4Q2xhaW1Ub2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wbGV4LWNsYWltJyk/LnZhbHVlLnRyaW0oKSB8fCBudWxsLFxuICAgICAgY3VzdG9tVm9sdW1lczogY3VzdG9tVm9sdW1lcy5sZW5ndGggPiAwID8gY3VzdG9tVm9sdW1lcyA6IG51bGwsXG4gICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgY3B1czogcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWNwdS1saW1pdCcpLnZhbHVlKSB8fCAwLFxuICAgICAgICBtZW1vcnk6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1tZW1vcnktbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgc3ViZG9tYWluXG4gICAgaWYgKCFkZXBsb3lDb25maWcuc3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSBzdWJkb21haW4gb3IgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lZGlhIHBhdGggZm9yIG1lZGlhIGFwcHNcbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudD8ucmVxdWlyZWQgJiYgIW1lZGlhUGF0aCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgbWVkaWEgbGlicmFyeSBwYXRoIGZvciB0aGlzIGFwcGxpY2F0aW9uJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkZXBsb3kgbW9kYWxcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG5cbiAgICAvLyBTdGFydCBkZXBsb3ltZW50XG4gICAgYWRkQXBwVG9HcmlkKGRlcGxveUNvbmZpZyk7XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCk7XG5cbiAgLy8gPT09PT0gRk9MREVSIEJST1dTRVIgRlVOQ1RJT05BTElUWSA9PT09PVxuICBjb25zdCBmb2xkZXJCcm93c2VyTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbW9kYWwnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItcGF0aCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1saXN0Jyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJTZWxlY3RlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWRMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXNlbGVjdGVkLWxpc3QnKTtcbiAgbGV0IGN1cnJlbnRCcm93c2VyUGF0aCA9ICcnO1xuICBsZXQgc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gIGxldCB0YXJnZXRNZWRpYUlucHV0ID0gbnVsbDtcblxuICB3aW5kb3cub3BlbkZvbGRlckJyb3dzZXIgPSBmdW5jdGlvbihtZWRpYUlucHV0KSB7XG4gICAgdGFyZ2V0TWVkaWFJbnB1dCA9IG1lZGlhSW5wdXQ7XG4gICAgc2VsZWN0ZWRGb2xkZXJzID0gbWVkaWFJbnB1dC52YWx1ZS5zcGxpdCgnLCcpLm1hcChwID0+IHAudHJpbSgpKS5maWx0ZXIocCA9PiBwKTtcbiAgICBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKCcnKTtcbiAgICBmb2xkZXJCcm93c2VyTW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRGb2xkZXJDb250ZW50cyhwYXRoKSB7XG4gICAgZm9sZGVyQnJvd3NlclBhdGgudGV4dENvbnRlbnQgPSBwYXRoIHx8ICdTZWxlY3QgYSBkcml2ZS4uLic7XG4gICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TG9hZGluZy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9icm93c2UvZGlyZWN0b3JpZXM/cGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX1gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBmb2xkZXJCcm93c2VyTGlzdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5FcnJvcjogJHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50QnJvd3NlclBhdGggPSByZXN1bHQucGF0aCB8fCAnJztcbiAgICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gY3VycmVudEJyb3dzZXJQYXRoIHx8ICdTZWxlY3QgYSBkcml2ZS4uLic7XG5cbiAgICAgIGxldCBodG1sID0gJyc7XG5cbiAgICAgIC8vIEFkZCBwYXJlbnQgZm9sZGVyIG5hdmlnYXRpb25cbiAgICAgIGlmIChyZXN1bHQucGFyZW50ICYmIHJlc3VsdC5wYXJlbnQgIT09IHJlc3VsdC5wYXRoKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJmb2xkZXItaXRlbVwiIGRhdGEtcGF0aD1cIiR7ZXNjYXBlSHRtbChyZXN1bHQucGFyZW50KX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07XCI+XHUyQjA2XHVGRTBGPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4uLiBQYXJlbnQgRGlyZWN0b3J5PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZm9sZGVyc1xuICAgICAgaWYgKHJlc3VsdC5pdGVtcy5sZW5ndGggPT09IDAgJiYgIXJlc3VsdC5wYXJlbnQpIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBicm93c2VhYmxlIGRyaXZlcyBjb25maWd1cmVkLiBDaGVjayB5b3VyIGRvY2tlci1jb21wb3NlLnltbCB2b2x1bWUgbW91bnRzLjwvZGl2Pic7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBzdWJmb2xkZXJzIGZvdW5kPC9kaXY+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGljb24gPSBpdGVtLnR5cGUgPT09ICdkcml2ZScgPyAnXHVEODNEXHVEQ0JFJyA6ICdcdUQ4M0RcdURDQzEnO1xuICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoaXRlbS5wYXRoKTtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFN0eWxlID0gaXNTZWxlY3RlZCA/ICdiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCk7JyA6ICcnO1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJmb2xkZXItaXRlbVwiIGRhdGEtcGF0aD1cIiR7ZXNjYXBlSHRtbChpdGVtLnBhdGgpfVwiIHN0eWxlPVwicGFkZGluZzogMTJweCAxNnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7ICR7c2VsZWN0ZWRTdHlsZX1cIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07XCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj4ke2VzY2FwZUh0bWwoaXRlbS5uYW1lKX08L3NwYW4+XG4gICAgICAgICAgICAke2lzU2VsZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tc3VjY2Vzcyk7XCI+XHUyNzEzPC9zcGFuPicgOiAnJ31cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXJzXG4gICAgICBmb2xkZXJCcm93c2VyTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuZm9sZGVyLWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0uZGF0YXNldC5wYXRoKTtcbiAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSBpc1NlbGVjdGVkID8gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAyMCUsIHRyYW5zcGFyZW50KScgOiAnJztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmb2xkZXJCcm93c2VyTGlzdC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZDogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpIHtcbiAgICBpZiAoc2VsZWN0ZWRGb2xkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWRMaXN0LmlubmVySFRNTCA9IHNlbGVjdGVkRm9sZGVycy5tYXAocGF0aCA9PiBgXG4gICAgICA8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7IGJvcmRlci1yYWRpdXM6IDRweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7XCI+XG4gICAgICAgICR7ZXNjYXBlSHRtbChwYXRoKX1cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yZW1vdmUtZm9sZGVyPVwiJHtlc2NhcGVIdG1sKHBhdGgpfVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtlc2NhcGVIdG1sKHBhdGgpfVwiIHN0eWxlPVwiYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiBub25lOyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7IGZvbnQtc2l6ZTogMXJlbTsgcGFkZGluZzogMDtcIj5cdTAwRDc8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICBgKS5qb2luKCcnKTtcbiAgICAvLyBBdWRpdCBQMC0zOiB3YXMgaW5saW5lIG9uY2xpY2sgKGRlYWQgdW5kZXIgdGhlIG1ldGEgQ1NQKVxuICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZExpc3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVtb3ZlLWZvbGRlcl0nKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHdpbmRvdy5yZW1vdmVTZWxlY3RlZEZvbGRlcihidG4uZGF0YXNldC5yZW1vdmVGb2xkZXIpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHdpbmRvdy5yZW1vdmVTZWxlY3RlZEZvbGRlciA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBzZWxlY3RlZEZvbGRlcnMgPSBzZWxlY3RlZEZvbGRlcnMuZmlsdGVyKHAgPT4gcCAhPT0gcGF0aCk7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHVwZGF0ZSBjaGVja21hcmtzXG4gIH07XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXNlbGVjdC1jdXJyZW50JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRCcm93c2VyUGF0aCAmJiAhc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGN1cnJlbnRCcm93c2VyUGF0aCkpIHtcbiAgICAgIHNlbGVjdGVkRm9sZGVycy5wdXNoKGN1cnJlbnRCcm93c2VyUGF0aCk7XG4gICAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgICBsb2FkRm9sZGVyQ29udGVudHMoY3VycmVudEJyb3dzZXJQYXRoKTsgLy8gUmVmcmVzaCB0byBzaG93IGNoZWNrbWFya1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGZvbGRlckJyb3dzZXJNb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLWNhbmNlbCcpKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItZG9uZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmICh0YXJnZXRNZWRpYUlucHV0KSB7XG4gICAgICB0YXJnZXRNZWRpYUlucHV0LnZhbHVlID0gc2VsZWN0ZWRGb2xkZXJzLmpvaW4oJywgJyk7XG4gICAgfVxuICAgIGZvbGRlckJyb3dzZXJNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIExvYWQgY3VzdG9tIGFwcHMgb24gcGFnZSBsb2FkXG4gIGxvYWRDdXN0b21BcHBzKCk7XG59KSgpO1xuO1xuLy8gUmVjaXBlIFN5c3RlbSBcdTIwMTQgbXVsdGktY29udGFpbmVyIHN0YWNrIGRlcGxveW1lbnRcbihmdW5jdGlvbigpIHtcbiAgLy8gPT09IFJFQ0lQRSBERVBMT1kgV0laQVJEIE1PREFMID09PVxuICBpbmplY3RNb2RhbCgncmVjaXBlLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwicmVjaXBlLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjIwcHg7IG1heC13aWR0aDogNzQwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJyZWNpcGUtZGVwbG95LXRpdGxlXCI+RGVwbG95IFJlY2lwZTwvaDM+XG5cbiAgICAgIDwhLS0gU3RlcCBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDsgbWFyZ2luOiAxNnB4IDAgMjRweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwIGFjdGl2ZVwiIGRhdGEtc3RlcD1cIjFcIj48c3Bhbj4xPC9zcGFuPiBDb21wb25lbnRzPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWNpcGUtc3RlcFwiIGRhdGEtc3RlcD1cIjJcIj48c3Bhbj4yPC9zcGFuPiBDb25maWd1cmF0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWNpcGUtc3RlcFwiIGRhdGEtc3RlcD1cIjNcIj48c3Bhbj4zPC9zcGFuPiBSZXZpZXc8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiNFwiPjxzcGFuPjQ8L3NwYW4+IFByb2dyZXNzPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDE6IENvbXBvbmVudCBTZWxlY3Rpb24gLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtMVwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5TZWxlY3QgQ29tcG9uZW50czo8L2xhYmVsPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLWNvbXBvbmVudC1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEwcHg7IG1hcmdpbi10b3A6IDhweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMjogU2hhcmVkIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtMlwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTZweDtcIj5cbiAgICAgICAgICA8IS0tIFNoYXJlZCB2b2x1bWVzIC0tPlxuICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lcy1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNoYXJlZCBWb2x1bWVzOjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXZvbHVtZS1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEwcHg7IG1hcmdpbi10b3A6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGltZXpvbmUgLS0+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+VGltZXpvbmU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicmVjaXBlLXRpbWV6b25lXCIgdmFsdWU9XCJVVENcIiBwbGFjZWhvbGRlcj1cImUuZy4gQW1lcmljYS9OZXdfWW9ya1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFRhcmdldCBJUCAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UYXJnZXQgSVAgQWRkcmVzczo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtaXBcIiB2YWx1ZT1cImhvc3QuZG9ja2VyLmludGVybmFsXCIgcGxhY2Vob2xkZXI9XCJsb2NhbGhvc3Qgb3IgSVBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPklQIHdoZXJlIGNvbnRhaW5lcnMgZXhwb3NlIHBvcnRzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFRhaWxzY2FsZSAtLT5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwicmVjaXBlLXRhaWxzY2FsZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5SZXN0cmljdCB0byBUYWlsc2NhbGUgbmV0d29yayBvbmx5PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAzOiBSZXZpZXcgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtM1wiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1yZXZpZXctY29udGVudFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07IGxpbmUtaGVpZ2h0OiAxLjc7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDQ6IFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInJlY2lwZS1zdGVwLTRcIiBjbGFzcz1cInJlY2lwZS1zdGVwLXBhbmVsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtcHJvZ3Jlc3MtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA4cHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LXJlc3VsdFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgZGlzcGxheTpub25lO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDIwcHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJyZWNpcGUtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJyZWNpcGUtcHJldlwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPkJhY2s8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1uZXh0XCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+TmV4dDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIC8vID09PSBTVEFURSA9PT1cbiAgbGV0IHJlY2lwZVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCByZWNpcGVDYXRlZ29yaWVzID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRSZWNpcGUgPSBudWxsO1xuICBsZXQgY3VycmVudFN0ZXAgPSAxO1xuICBsZXQgaXNQcmVtaXVtID0gZmFsc2U7XG5cbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWRlcGxveS1tb2RhbCcpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWNhbmNlbCcpO1xuICBjb25zdCBwcmV2QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1wcmV2Jyk7XG4gIGNvbnN0IG5leHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLW5leHQnKTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgLy8gPT09IEZFVENIIFJFQ0lQRSBURU1QTEFURVMgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUmVjaXBlVGVtcGxhdGVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvcmVjaXBlcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmVjaXBlVGVtcGxhdGVzID0gZGF0YS50ZW1wbGF0ZXM7XG4gICAgICAgIHJlY2lwZUNhdGVnb3JpZXMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gUHJlbWl1bSByZXF1aXJlZCBcdTIwMTQgdGVtcGxhdGVzIEFQSSBnYXRlZFxuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgaXNQcmVtaXVtID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCByZWNpcGUgdGVtcGxhdGVzOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vID09PSBDSEVDSyBQUkVNSVVNID09PVxuICBhc3luYyBmdW5jdGlvbiBjaGVja1JlY2lwZVByZW1pdW0oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL2ZlYXR1cmUvcmVjaXBlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaXNQcmVtaXVtID0gZGF0YS5hdmFpbGFibGU7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzUHJlbWl1bTtcbiAgfVxuXG4gIC8vID09PSBSRU5ERVIgUkVDSVBFIENBUkRTIElOVE8gQVBQIFNFTEVDVE9SID09PVxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXBwIHNlbGVjdG9yIHRvIGluamVjdCByZWNpcGUgY2FyZHNcbiAgd2luZG93LnJlbmRlclJlY2lwZUNhcmRzID0gYXN5bmMgZnVuY3Rpb24oZ3JpZCkge1xuICAgIGF3YWl0IGNoZWNrUmVjaXBlUHJlbWl1bSgpO1xuXG4gICAgLy8gQnVpbGQgcmVjaXBlIGRhdGEgXHUyMDE0IHdlIGNhbiBzaG93IGNhcmQgbWV0YWRhdGEgZXZlbiB3aXRob3V0IHByZW1pdW1cbiAgICAvLyAoY2FyZHMganVzdCBzaG93IGEgbG9jayBhbmQgcHJvbXB0IHRvIHVwZ3JhZGUpXG4gICAgbGV0IHJlY2lwZXM7XG4gICAgaWYgKGlzUHJlbWl1bSAmJiByZWNpcGVUZW1wbGF0ZXMpIHtcbiAgICAgIHJlY2lwZXMgPSByZWNpcGVUZW1wbGF0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNob3cgaGFyZGNvZGVkIHByZXZpZXcgY2FyZHMgd2hlbiBub3QgcHJlbWl1bVxuICAgICAgcmVjaXBlcyA9IGdldFByZXZpZXdSZWNpcGVzKCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZWNpcGVzIHx8IHJlY2lwZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBDYXRlZ29yeSBoZWFkZXJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBoZWFkZXIuY2xhc3NOYW1lID0gJ2FwcC1jYXRlZ29yeS1oZWFkZXInO1xuICAgIGhlYWRlci5pbm5lckhUTUwgPSBgXFx1RDgzRVxcdURERUEgUmVjaXBlc2A7XG4gICAgaGVhZGVyLnN0eWxlLmJvcmRlckJvdHRvbUNvbG9yID0gJyM4ZTQ0YWQnO1xuICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgIGNvbnN0IHJlY2lwZUxpc3QgPSBBcnJheS5pc0FycmF5KHJlY2lwZXMpID8gcmVjaXBlcyA6IE9iamVjdC52YWx1ZXMocmVjaXBlcyk7XG4gICAgcmVjaXBlTGlzdC5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICBmb3IgKGNvbnN0IHJlY2lwZSBvZiByZWNpcGVMaXN0KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG9wdGlvbi5jbGFzc05hbWUgPSAnYXBwLW9wdGlvbic7XG4gICAgICBvcHRpb24uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuXG4gICAgICBjb25zdCBjb21wb25lbnRCYWRnZSA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMik7IGNvbG9yOiAjYTg1NWY3O1wiPiR7cmVjaXBlLmNvbXBvbmVudENvdW50IHx8IHJlY2lwZS5jb21wb25lbnRzPy5sZW5ndGggfHwgJz8nfSBhcHBzPC9kaXY+YDtcblxuICAgICAgY29uc3QgbG9ja092ZXJsYXkgPSAhaXNQcmVtaXVtID8gYDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNnB4OyByaWdodDogNnB4OyBmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6IHJnYmEoMjQxLDE5NiwxNSwwLjIpOyBjb2xvcjogI2YxYzQwZjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5QUkVNSVVNPC9kaXY+YCA6ICcnO1xuXG4gICAgICBvcHRpb24uaW5uZXJIVE1MID0gYFxuICAgICAgICAke2xvY2tPdmVybGF5fVxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1pY29uXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5pY29uIHx8ICdcXHVEODNFXFx1RERFQScpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1uYW1lXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5uYW1lKX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChyZWNpcGUuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAke2NvbXBvbmVudEJhZGdlfVxuICAgICAgYDtcblxuICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQcmVtaXVtKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVjaXBlcyByZXF1aXJlIGEgRGFzaENhZGR5IFByZW1pdW0gbGljZW5zZS4gQ2xpY2sgdGhlIExpY2Vuc2UgYnV0dG9uIHRvIGFjdGl2YXRlLicsICd3YXJuaW5nJywgNTAwMCk7XG4gICAgICAgICAgaWYgKHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKSB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvcGVuUmVjaXBlRGVwbG95V2l6YXJkKHJlY2lwZSk7XG4gICAgICB9O1xuXG4gICAgICBncmlkLmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGdldFByZXZpZXdSZWNpcGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IGlkOiAnaHRwYy1zdWl0ZScsIG5hbWU6ICdIVFBDIFN1aXRlJywgaWNvbjogJ1xcdUQ4M0NcXHVERkFDJywgZGVzY3JpcHRpb246ICdDb21wbGV0ZSBtZWRpYSBhdXRvbWF0aW9uOiBmaW5kLCBkb3dubG9hZCwgb3JnYW5pemUsIGFuZCBzdHJlYW0nLCBjb21wb25lbnRDb3VudDogNiwgcG9wdWxhcml0eTogOTggfSxcbiAgICAgIHsgaWQ6ICduZXh0Y2xvdWQtY29tcGxldGUnLCBuYW1lOiAnTmV4dGNsb3VkIENvbXBsZXRlJywgaWNvbjogJ1xcdTI2MDFcXHVGRTBGJywgZGVzY3JpcHRpb246ICdGdWxsIHByb2R1Y3Rpdml0eSBzdWl0ZTogY2xvdWQgc3RvcmFnZSwgb2ZmaWNlIGVkaXRpbmcsIGFuZCBjb2xsYWJvcmF0aW9uJywgY29tcG9uZW50Q291bnQ6IDQsIHBvcHVsYXJpdHk6IDkwIH0sXG4gICAgICB7IGlkOiAnc21hcnQtaG9tZScsIG5hbWU6ICdTbWFydCBIb21lIEh1YicsIGljb246ICdcXHVEODNDXFx1REZFMCcsIGRlc2NyaXB0aW9uOiAnSG9tZSBhdXRvbWF0aW9uOiBjb250cm9sLCBhdXRvbWF0ZSwgYW5kIG1vbml0b3IgSW9UIGRldmljZXMnLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogODggfSxcbiAgICAgIHsgaWQ6ICdkZXYtZW52aXJvbm1lbnQnLCBuYW1lOiAnRGV2IEVudmlyb25tZW50JywgaWNvbjogJ1xcdUQ4M0RcXHVEQ0JCJywgZGVzY3JpcHRpb246ICdTZWxmLWhvc3RlZCBkZXZlbG9wbWVudCB3b3JrZmxvdzogR2l0LCBDSS9DRCwgSURFLCBhbmQgZGF0YWJhc2UnLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogODIgfVxuICAgIF07XG4gIH1cblxuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgPT09XG4gIGZ1bmN0aW9uIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKSB7XG4gICAgY3VycmVudFJlY2lwZSA9IHJlY2lwZTtcbiAgICBjdXJyZW50U3RlcCA9IDE7XG5cbiAgICAvLyBDbG9zZSBhcHAgc2VsZWN0b3JcbiAgICBjb25zdCBhcHBTZWxlY3Rvck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1zZWxlY3Rvci1tb2RhbCcpO1xuICAgIGlmIChhcHBTZWxlY3Rvck1vZGFsKSBhcHBTZWxlY3Rvck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LXRpdGxlJykudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7cmVjaXBlLm5hbWV9YDtcblxuICAgIC8vIFJlc2V0IHN0ZXBzXG4gICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgcmVuZGVyU3RlcDEoKTtcblxuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVN0ZXBVSSgpIHtcbiAgICAvLyBTdGVwIGluZGljYXRvcnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXN0ZXBzIC5yZWNpcGUtc3RlcCcpLmZvckVhY2goZWwgPT4ge1xuICAgICAgY29uc3Qgc3RlcCA9IHBhcnNlSW50KGVsLmRhdGFzZXQuc3RlcCk7XG4gICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBzdGVwID09PSBjdXJyZW50U3RlcCk7XG4gICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdjb21wbGV0ZWQnLCBzdGVwIDwgY3VycmVudFN0ZXApO1xuICAgIH0pO1xuXG4gICAgLy8gU3RlcCBwYW5lbHNcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA0OyBpKyspIHtcbiAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1zdGVwLSR7aX1gKTtcbiAgICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9IGkgPT09IGN1cnJlbnRTdGVwID8gJycgOiAnbm9uZSc7XG4gICAgfVxuXG4gICAgLy8gTmF2aWdhdGlvbiBidXR0b25zXG4gICAgcHJldkJ0bi5zdHlsZS5kaXNwbGF5ID0gY3VycmVudFN0ZXAgPiAxICYmIGN1cnJlbnRTdGVwIDwgNCA/ICcnIDogJ25vbmUnO1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gNCkge1xuICAgICAgbmV4dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0Nsb3NlJztcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRTdGVwID09PSAzKSB7XG4gICAgICBuZXh0QnRuLnRleHRDb250ZW50ID0gJ1xcdUQ4M0RcXHVERTgwIERlcGxveSc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0QnRuLnRleHRDb250ZW50ID0gJ05leHQnO1xuICAgICAgbmV4dEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2FuY2VsJztcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDE6IENvbXBvbmVudCBzZWxlY3Rpb25cbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDEoKSB7XG4gICAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY29tcG9uZW50LWxpc3QnKTtcbiAgICBsaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IGN1cnJlbnRSZWNpcGUuY29tcG9uZW50cyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29tcG9uZW50cykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyc7XG5cbiAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBjb21wLnJlcXVpcmVkO1xuICAgICAgY29uc3QgaXNJbnRlcm5hbCA9IGNvbXAuaW50ZXJuYWw7XG5cbiAgICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICR7aXNSZXF1aXJlZCA/ICdjaGVja2VkIGRpc2FibGVkJyA6ICdjaGVja2VkJ30gZGF0YS1jb21wb25lbnQtaWQ9XCIke2NvbXAuaWR9XCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTtcIiAvPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKGNvbXAucm9sZSB8fCBjb21wLmlkKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgJHtjb21wLnRlbXBsYXRlUmVmID8gZXNjYXBlSHRtbChjb21wLnRlbXBsYXRlUmVmKSA6ICdCdWlsdC1pbid9XG4gICAgICAgICAgICAke2lzUmVxdWlyZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLWxlZnQ6IDZweDtcIj5SZXF1aXJlZDwvc3Bhbj4nIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDZweDtcIj5PcHRpb25hbDwvc3Bhbj4nfVxuICAgICAgICAgICAgJHtpc0ludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDZweDtcIj4oSW50ZXJuYWwpPC9zcGFuPicgOiAnJ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAke2NvbXAubm90ZSA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0td2Fybi1mZyk7IG1hcmdpbi10b3A6IDRweDtcIj5cXHUyNkEwICR7ZXNjYXBlSHRtbChjb21wLm5vdGUpfTwvZGl2PmAgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgbGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAyOiBTaGFyZWQgY29uZmlndXJhdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMigpIHtcbiAgICBjb25zdCB2b2x1bWVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS12b2x1bWVzLXNlY3Rpb24nKTtcbiAgICBjb25zdCB2b2x1bWVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS12b2x1bWUtbGlzdCcpO1xuXG4gICAgY29uc3Qgc2hhcmVkVm9sdW1lcyA9IGN1cnJlbnRSZWNpcGUuc2hhcmVkVm9sdW1lcztcbiAgICBpZiAoc2hhcmVkVm9sdW1lcyAmJiBPYmplY3Qua2V5cyhzaGFyZWRWb2x1bWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHZvbHVtZUxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdm9sXSBvZiBPYmplY3QuZW50cmllcyhzaGFyZWRWb2x1bWVzKSkge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGdyaWQ7IGdhcDogNHB4Oyc7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JHtlc2NhcGVIdG1sKHZvbC5sYWJlbCB8fCBrZXkpfTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZGF0YS12b2x1bWUta2V5PVwiJHtrZXl9XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwodm9sLmRlZmF1bHRQYXRoIHx8ICcnKX1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2VzY2FwZUh0bWwodm9sLmRlZmF1bHRQYXRoIHx8ICcvcGF0aCcpfVwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPiR7ZXNjYXBlSHRtbCh2b2wuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICBgO1xuICAgICAgICB2b2x1bWVMaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdm9sdW1lU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMzogUmV2aWV3XG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAzKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXJldmlldy1jb250ZW50Jyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb21wb25lbnRzID0gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCk7XG5cbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHR6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10aW1lem9uZScpLnZhbHVlIHx8ICdVVEMnO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1pcCcpLnZhbHVlIHx8ICdob3N0LmRvY2tlci5pbnRlcm5hbCc7XG4gICAgY29uc3QgdGFpbHNjYWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkO1xuXG4gICAgY29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDE2cHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Db21wb25lbnRzICgke3NlbGVjdGVkQ29tcG9uZW50cy5sZW5ndGh9KTo8L3N0cm9uZz5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogNHB4OyBtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgJHtzZWxlY3RlZENvbXBvbmVudHMubWFwKGMgPT4gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiA0cHggMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgXFx1MjAyMiA8c3Ryb25nPiR7ZXNjYXBlSHRtbChjLnJvbGUgfHwgYy5pZCl9PC9zdHJvbmc+ICR7Yy5pbnRlcm5hbCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKVwiPihpbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke09iamVjdC5rZXlzKHZvbHVtZXMpLmxlbmd0aCA+IDAgPyBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxzdHJvbmc+Vm9sdW1lczo8L3N0cm9uZz5cbiAgICAgICAgJHtPYmplY3QuZW50cmllcyh2b2x1bWVzKS5tYXAoKFtrLCB2XSkgPT4gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtrfTogJHtlc2NhcGVIdG1sKHYpfTwvZGl2PmApLmpvaW4oJycpfVxuICAgICAgPC9kaXY+YCA6ICcnfVxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICBUaW1lem9uZTogJHtlc2NhcGVIdG1sKHR6KX0gJmJ1bGw7IElQOiAke2VzY2FwZUh0bWwoaXApfSAke3RhaWxzY2FsZSA/ICcmYnVsbDsgVGFpbHNjYWxlIG9ubHknIDogJyd9XG4gICAgICA8L2Rpdj5cblxuICAgICAgJHtjdXJyZW50UmVjaXBlLm5ldHdvcmsgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkRvY2tlciBuZXR3b3JrOiA8Y29kZT4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5uZXR3b3JrLm5hbWUpfTwvY29kZT48L2Rpdj5gIDogJyd9XG4gICAgYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50cygpIHtcbiAgICBjb25zdCBjaGVja2JveGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3JlY2lwZS1jb21wb25lbnQtbGlzdCBpbnB1dFtkYXRhLWNvbXBvbmVudC1pZF0nKTtcbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IG5ldyBTZXQoKTtcbiAgICBjaGVja2JveGVzLmZvckVhY2goY2IgPT4ge1xuICAgICAgaWYgKGNiLmNoZWNrZWQpIHNlbGVjdGVkSWRzLmFkZChjYi5kYXRhc2V0LmNvbXBvbmVudElkKTtcbiAgICB9KTtcblxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIHJlcXVpcmVkIGNvbXBvbmVudHNcbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYy5yZXF1aXJlZCkuZm9yRWFjaChjID0+IHNlbGVjdGVkSWRzLmFkZChjLmlkKSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50cy5maWx0ZXIoYyA9PiBzZWxlY3RlZElkcy5oYXMoYy5pZCkpO1xuICB9XG5cbiAgLy8gU3RlcCA0OiBEZXBsb3lcbiAgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURlcGxveSgpIHtcbiAgICBjb25zdCBwcm9ncmVzc0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByb2dyZXNzLWxpc3QnKTtcbiAgICBjb25zdCByZXN1bHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LXJlc3VsdCcpO1xuICAgIHJlc3VsdEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgcHJvZ3Jlc3NMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRDb21wb25lbnRzID0gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCk7XG5cbiAgICAvLyBTaG93IHByb2dyZXNzIGl0ZW1zXG4gICAgZm9yIChjb25zdCBjb21wIG9mIHNlbGVjdGVkQ29tcG9uZW50cykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLmlkID0gYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXAuaWR9YDtcbiAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTsnO1xuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1pY29uXCIgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cXHUyM0YzPC9zcGFuPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNpcGUtcHJvZ3Jlc3Mtc3RhdHVzXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlF1ZXVlZDwvc3Bhbj5cbiAgICAgIGA7XG4gICAgICBwcm9ncmVzc0xpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY29uZmlnXG4gICAgY29uc3Qgdm9sdW1lSW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3JlY2lwZS12b2x1bWUtbGlzdCBpbnB1dFtkYXRhLXZvbHVtZS1rZXldJyk7XG4gICAgY29uc3Qgdm9sdW1lcyA9IHt9O1xuICAgIHZvbHVtZUlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIHZvbHVtZXNbaW5wdXQuZGF0YXNldC52b2x1bWVLZXldID0gaW5wdXQudmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBzZWxlY3RlZENvbXBvbmVudHM6IHNlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBjLmlkKSxcbiAgICAgIHNoYXJlZENvbmZpZzoge1xuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1pcCcpLnZhbHVlIHx8ICdob3N0LmRvY2tlci5pbnRlcm5hbCcsXG4gICAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQycsXG4gICAgICAgIHRhaWxzY2FsZU9ubHk6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGFpbHNjYWxlJykuY2hlY2tlZCxcbiAgICAgICAgdm9sdW1lc1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudE92ZXJyaWRlczoge31cbiAgICB9O1xuXG4gICAgLy8gTWFyayBhbGwgYXMgZGVwbG95aW5nXG4gICAgZm9yIChjb25zdCBjb21wIG9mIHNlbGVjdGVkQ29tcG9uZW50cykge1xuICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGNvbXAuaWQsICdkZXBsb3lpbmcnLCAnRGVwbG95aW5nLi4uJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9yZWNpcGVzL2RlcGxveScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlY2lwZUlkOiBjdXJyZW50UmVjaXBlLmlkLCBjb25maWcgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIC8vIE1hcmsgZGVwbG95ZWQgY29tcG9uZW50c1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGxveWVkIG9mIChkYXRhLmRlcGxveWVkIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShkZXBsb3llZC5pZCwgJ3N1Y2Nlc3MnLCBkZXBsb3llZC51cmwgPyBgUnVubmluZyBcXHUyMTkyICR7ZGVwbG95ZWQudXJsfWAgOiAnUnVubmluZycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgZXJyb3JzXG4gICAgICAgIGZvciAoY29uc3QgZXJyIG9mIChkYXRhLmVycm9ycyB8fCBbXSkpIHtcbiAgICAgICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oZXJyLmNvbXBvbmVudElkLCAnZXJyb3InLCBlcnIuZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNDYsMjA0LDExMywwLjMpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1vay1mZyk7IG1hcmdpbi1ib3R0b206IDZweDtcIj4ke2VzY2FwZUh0bWwoZGF0YS5tZXNzYWdlIHx8ICdEZXBsb3llZCEnKX08L2Rpdj5cbiAgICAgICAgICAgICR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucyA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5TZXR1cCB0aXBzOjwvc3Ryb25nPlxuICAgICAgICAgICAgICA8dWwgc3R5bGU9XCJtYXJnaW46IDRweCAwIDAgMTZweDsgcGFkZGluZzogMDtcIj4ke2RhdGEuc2V0dXBJbnN0cnVjdGlvbnMubWFwKHMgPT4gYDxsaT4ke2VzY2FwZUh0bWwocyl9PC9saT5gKS5qb2luKCcnKX08L3VsPlxuICAgICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7Y3VycmVudFJlY2lwZS5uYW1lfSByZWNpcGUgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5IWAsICdzdWNjZXNzJywgNTAwMCk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBkYXNoYm9hcmRcbiAgICAgICAgaWYgKHdpbmRvdy5sb2FkU2VydmljZXMpIHdpbmRvdy5sb2FkU2VydmljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIDxzdHJvbmc+RGVwbG95bWVudCBmYWlsZWQ6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFJlY2lwZSBkZXBsb3ltZW50IGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicsIDUwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjEpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIzMSw3Niw2MCwwLjMpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgPHN0cm9uZz5OZXR3b3JrIGVycm9yOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX1cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3NJdGVtKGNvbXBvbmVudElkLCBzdGF0dXMsIHRleHQpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGByZWNpcGUtcHJvZ3Jlc3MtJHtjb21wb25lbnRJZH1gKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgaWNvbiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5yZWNpcGUtcHJvZ3Jlc3MtaWNvbicpO1xuICAgIGNvbnN0IHN0YXR1c0VsID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1zdGF0dXMnKTtcblxuICAgIGlmIChzdGF0dXMgPT09ICdkZXBsb3lpbmcnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTIzRjMnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYWNjZW50KSc7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzA1JztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1Mjc0Qyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG5cbiAgLy8gPT09IFNURVAgTkFWSUdBVElPTiA9PT1cbiAgbmV4dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwID0gNDtcbiAgICAgIHVwZGF0ZVN0ZXBVSSgpO1xuICAgICAgZXhlY3V0ZURlcGxveSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFN0ZXAgPCAzKSB7XG4gICAgICBjdXJyZW50U3RlcCsrO1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IDIpIHJlbmRlclN0ZXAyKCk7XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHJlbmRlclN0ZXAzKCk7XG4gICAgfVxuICB9KTtcblxuICBwcmV2QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0KSB7XG4gICAgICBjdXJyZW50U3RlcC0tO1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT0gUkVDSVBFIENBUkQgR1JPVVBJTkcgT04gREFTSEJPQVJEID09PVxuICAvLyBBZnRlciBkYXNoYm9hcmQgbG9hZHMsIGdyb3VwIGNhcmRzIHRoYXQgc2hhcmUgYSByZWNpcGVJZFxuICB3aW5kb3cuZ3JvdXBSZWNpcGVDYXJkcyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlcnZpY2UtY2FyZFtkYXRhLXJlY2lwZS1pZF0nKTtcbiAgICBpZiAoY2FyZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBncm91cHMgPSB7fTtcbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgcmVjaXBlSWQgPSBjYXJkLmRhdGFzZXQucmVjaXBlSWQ7XG4gICAgICBpZiAoIWdyb3Vwc1tyZWNpcGVJZF0pIGdyb3Vwc1tyZWNpcGVJZF0gPSBbXTtcbiAgICAgIGdyb3Vwc1tyZWNpcGVJZF0ucHVzaChjYXJkKTtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgW3JlY2lwZUlkLCBncm91cENhcmRzXSBvZiBPYmplY3QuZW50cmllcyhncm91cHMpKSB7XG4gICAgICBpZiAoZ3JvdXBDYXJkcy5sZW5ndGggPCAyKSBjb250aW51ZTtcblxuICAgICAgLy8gQXBwbHkgc3VidGxlIHZpc3VhbCBncm91cGluZ1xuICAgICAgZ3JvdXBDYXJkcy5mb3JFYWNoKChjYXJkLCBpKSA9PiB7XG4gICAgICAgIGNhcmQuc3R5bGUuYm9yZGVyTGVmdCA9ICczcHggc29saWQgcmdiYSgxNDIsNjgsMTczLDAuNSknO1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgIC8vIEFkZCBhIHJlY2lwZSBsYWJlbCB0byB0aGUgZmlyc3QgY2FyZFxuICAgICAgICAgIGxldCBsYWJlbCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnJlY2lwZS1ncm91cC1sYWJlbCcpO1xuICAgICAgICAgIGlmICghbGFiZWwpIHtcbiAgICAgICAgICAgIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBsYWJlbC5jbGFzc05hbWUgPSAncmVjaXBlLWdyb3VwLWxhYmVsJztcbiAgICAgICAgICAgIGxhYmVsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IC04cHg7IGxlZnQ6IDEycHg7IGZvbnQtc2l6ZTogMC42cmVtOyBwYWRkaW5nOiAxcHggOHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMTQyLDY4LDE3MywwLjMpOyBjb2xvcjogI2Q0YTVmZjsgZm9udC13ZWlnaHQ6IDYwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Oyc7XG4gICAgICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHJlY2lwZUlkLnJlcGxhY2UoLy0vZywgJyAnKTtcbiAgICAgICAgICAgIGNhcmQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IFJFQ0lQRSBNQU5BR0VNRU5UIEFDVElPTlMgPT09XG4gIHdpbmRvdy5tYW5hZ2VSZWNpcGUgPSBhc3luYyBmdW5jdGlvbihyZWNpcGVJZCwgYWN0aW9uKSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgL2FwaS92MS9yZWNpcGVzLyR7cmVjaXBlSWR9LyR7YWN0aW9ufWA7XG4gICAgY29uc3QgbWV0aG9kID0gYWN0aW9uID09PSAncmVtb3ZlJyA/ICdERUxFVEUnIDogJ1BPU1QnO1xuICAgIGNvbnN0IHVybCA9IGFjdGlvbiA9PT0gJ3JlbW92ZScgPyBgL2FwaS92MS9yZWNpcGVzLyR7cmVjaXBlSWR9YCA6IGVuZHBvaW50O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3JlbW92ZScgJiYgIWNvbmZpcm0oYFJlbW92ZSB0aGUgZW50aXJlICR7cmVjaXBlSWR9IHJlY2lwZT8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY29udGFpbmVycyBhbmQgY29uZmlndXJhdGlvbi5gKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2godXJsLCB7IG1ldGhvZCB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufTogJHtkYXRhLnJlc3VsdHM/LmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnZmFpbGVkJykubGVuZ3RoIHx8IDB9IGNvbXBvbmVudHMgcHJvY2Vzc2VkYCwgJ3N1Y2Nlc3MnLCA0MDAwKTtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2FkU2VydmljZXMpIHdpbmRvdy5sb2FkU2VydmljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFJlY2lwZSAke2FjdGlvbn0gZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgTmV0d29yayBlcnJvcjogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PSBJTkpFQ1QgQ1NTID09PVxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgIC5yZWNpcGUtc3RlcCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgcGFkZGluZzogOHB4IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43OHJlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAgc3BhbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSB7XG4gICAgICBjb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWFjY2VudCk7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC5hY3RpdmUgc3BhbiB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC5jb21wbGV0ZWQge1xuICAgICAgY29sb3I6IHZhcigtLW9rLWZnKTtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLW9rLWZnKTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLW9rLWZnKTtcbiAgICAgIGNvbG9yOiAjZmZmO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAtcGFuZWwge1xuICAgICAgbWluLWhlaWdodDogMTgwcHg7XG4gICAgfVxuICBgO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAvLyA9PT0gSU5JVCA9PT1cbiAgLy8gUHJlLWZldGNoIHByZW1pdW0gc3RhdHVzIG9uIGxvYWRcbiAgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBDQUREWSBSRUxPQUQgQlVUVE9OID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gUmVsb2FkIENhZGR5IGJ1dHRvbiBoYW5kbGVyXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWxvYWQtY2FkZHktdG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWxvYWQtY2FkZHktdG9wJyk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYnV0dG9uLnRleHRDb250ZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTIzRjMgUmVsb2FkaW5nLi4uJztcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY2FkZHkvcmVsb2FkJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vayAmJiByZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnXHUyNzA1IFJlbG9hZGVkISc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgMjAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdSZWxvYWQgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byByZWxvYWQgQ2FkZHk6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfVxuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEVSUk9SIExPRyBWSUVXRVIgKERDLTA1MikgPT09PT09PT09PVxuLy8gREMtMDUyOiBBZGRzIExldmVsIC8gQ29udGV4dCAvIFNlYXJjaCAvIFRpbWUtcmFuZ2UgZmlsdGVycywgc2VydmVyLXNpZGVcbi8vIHBhZ2luYXRpb24gd2l0aCBMb2FkIE1vcmUsIGNsaWNrLXRvLWV4cGFuZCBzdGFjayBmcmFtZXMsIGFuZCBhIGRpc3RpbmN0XG4vLyBjb250ZXh0cyBkcm9wZG93biBiYWNrZWQgYnkgL2FwaS92MS9lcnJvci1sb2dzL2NvbnRleHRzLiBNaXJyb3JzIHRoZVxuLy8gYXVkaXQtbG9nIFVYIChEQy0wNTApIHNvIG9wZXJhdG9ycyBjYW4gZHJpbGwgaW50byBhIHN1YnN5c3RlbSBhcyBlYXNpbHlcbi8vIGFzIHRoZXkgY2FuIGF1ZGl0IHdoby1kaWQtd2hhdC5cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUwuIFNhbWUgd2VhdGhlci1tb2RhbCBzaGVsbCBhcyBhdWRpdC1sb2cgc28gc3R5bGVzXG4gIC8vIGFyZSBzaGFyZWQ7IHdpZGVyIG1pbi13aWR0aCBiZWNhdXNlIGVycm9yIHN0YWNrcyBuZWVkIHJvb20gdG8gYnJlYXRoZS5cbiAgaW5qZWN0TW9kYWwoJ2Vycm9yLWxvZy1tb2RhbCcsIGA8ZGl2IGlkPVwiZXJyb3ItbG9nLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5NTBweDsgbWF4LXdpZHRoOiAxMTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NCIEVycm9yIExvZ3M8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBFcnJvcnMgYW5kIHdhcm5pbmdzIGZyb20gdGhlIERhc2hDYWRkeSBBUEkuIENsaWNrIGEgcm93IHRvIHNlZSB0aGUgZnVsbCBzdGFjayB0cmFjZS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+TGV2ZWw6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImVycm9yLWxvZy1sZXZlbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJFUlJcIj5FcnJvcnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiV0FSTlwiPldhcm5pbmdzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIklORk9cIj5JbmZvPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkRFQlVHXCI+RGVidWc8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5Db250ZXh0OjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJlcnJvci1sb2ctY29udGV4dFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODVyZW07IG1heC13aWR0aDogMjIwcHg7XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDhweDtcIj5TZWFyY2g6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXNlYXJjaFwiIHR5cGU9XCJzZWFyY2hcIiBwbGFjZWhvbGRlcj1cIm1lc3NhZ2UgLyBzdGFjayAvIGlwXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtOyBtaW4td2lkdGg6IDE4MHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNpbmNlOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImVycm9yLWxvZy1zaW5jZVwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlVudGlsOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImVycm9yLWxvZy11bnRpbFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImVycm9yLWxvZy1yZWZyZXNoXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWNsZWFyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHVEODNEXHVEREQxXHVGRTBGIENsZWFyIExvZzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJlcnJvci1sb2ctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBlcnJvciBsb2dzLi4uPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImVycm9yLWxvZy1sb2FkLW1vcmVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5Mb2FkIE1vcmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IHJpZ2h0O1wiPlxuICAgICAgICA8c3BhbiBpZD1cImVycm9yLWxvZy10b3RhbFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImVycm9yLWxvZy1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLW1vZGFsJyk7XG4gIGNvbnN0IHZpZXdCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXJlZnJlc2gnKTtcbiAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsZWFyJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jbG9zZScpO1xuICBjb25zdCBsZXZlbFNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctbGV2ZWwnKTtcbiAgY29uc3QgY29udGV4dFNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY29udGV4dCcpO1xuICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctc2VhcmNoJyk7XG4gIGNvbnN0IHNpbmNlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXNpbmNlJyk7XG4gIGNvbnN0IHVudGlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXVudGlsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY29udGFpbmVyJyk7XG4gIGNvbnN0IGxvYWRNb3JlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1sb2FkLW1vcmUnKTtcbiAgY29uc3QgdG90YWxTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy10b3RhbCcpO1xuXG4gIGNvbnN0IFBBR0VfU0laRSA9IDUwO1xuICBsZXQgY3VycmVudE9mZnNldCA9IDA7XG4gIGxldCBpbmZsaWdodCA9IG51bGw7XG4gIGxldCBmaWx0ZXJOb25jZSA9IDA7XG4gIC8vIENhY2hlZCBkaXN0aW5jdCBjb250ZXh0cyBzbyB0aGUgZHJvcGRvd24gaXMgcG9wdWxhdGVkIG9uY2UgcGVyIG9wZW4gYW5kXG4gIC8vIHJlLXBvcHVsYXRlZCBhZnRlciBhIGNsZWFyICh3aGljaCByZW1vdmVzIGFsbCBjb250ZXh0cykgb3IgYSByZWZyZXNoXG4gIC8vIHRoYXQgc3VyZmFjZXMgYSBuZXcgc3Vic3lzdGVtIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgbGV0IGtub3duQ29udGV4dHMgPSBbXTtcblxuICAvLyBkYXRldGltZS1sb2NhbCBmaWVsZHMgYXJlIG5haXZlIGxvY2FsIHRpbWUgXHUyMDE0IGNvbnZlcnQgdG8gVVRDIElTTyBzbyB0aGVcbiAgLy8gc2VydmVyIGNvbXBhcmVzIGNvcnJlY3RseS4gU2FtZSBzaGFwZSBhcyBhdWRpdC1sb2cuanMgc28gdGhlIG9wZXJhdG9yXG4gIC8vIHNlZXMgY29uc2lzdGVudCBiZWhhdmlvdXIgYmV0d2VlbiB0aGUgdHdvIG1vZGFscy5cbiAgZnVuY3Rpb24gdG9Jc28obG9jYWxEdFZhbHVlKSB7XG4gICAgaWYgKCFsb2NhbER0VmFsdWUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShsb2NhbER0VmFsdWUpO1xuICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvLyBQdWxsIHRoZSBkaXN0aW5jdCBjb250ZXh0cyBsaXN0IG9uY2UgcGVyIG9wZW4uIEZhaWx1cmVzIGFyZSBzaWxlbnRcbiAgLy8gKHRoZSBkcm9wZG93biB3aWxsIGp1c3Qgc2hvdyBcIkFsbFwiIG9ubHkpIHNvIGEgdHJhbnNpZW50IGJhY2tlbmQgaGljY3VwXG4gIC8vIGRvZXNuJ3QgYmxvY2sgdGhlIG9wZXJhdG9yIGZyb20gc2VlaW5nIHRoZSBhY3R1YWwgZXJyb3Igcm93cy5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaENvbnRleHRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzL2NvbnRleHRzJyk7XG4gICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHRzKSkgcmV0dXJuO1xuICAgICAga25vd25Db250ZXh0cyA9IGRhdGEuY29udGV4dHM7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjb250ZXh0U2VsLnZhbHVlO1xuICAgICAgY29udGV4dFNlbC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPic7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YS5jb250ZXh0cykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5uYW1lO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuY291bnR9KWA7XG4gICAgICAgIGNvbnRleHRTZWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc3RvcmUgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHN0aWxsIHByZXNlbnQuXG4gICAgICBpZiAoY3VycmVudFZhbHVlICYmIGRhdGEuY29udGV4dHMuc29tZSgoYykgPT4gYy5uYW1lID09PSBjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIGNvbnRleHRTZWwudmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFF1ZXJ5KCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhQQUdFX1NJWkUpKTtcbiAgICBwYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcoY3VycmVudE9mZnNldCkpO1xuICAgIGlmIChsZXZlbFNlbC52YWx1ZSkgcGFyYW1zLnNldCgnbGV2ZWwnLCBsZXZlbFNlbC52YWx1ZSk7XG4gICAgaWYgKGNvbnRleHRTZWwudmFsdWUpIHBhcmFtcy5zZXQoJ2NvbnRleHQnLCBjb250ZXh0U2VsLnZhbHVlKTtcbiAgICBjb25zdCBzaW5jZSA9IHRvSXNvKHNpbmNlSW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IHVudGlsID0gdG9Jc28odW50aWxJbnB1dC52YWx1ZSk7XG4gICAgaWYgKHNpbmNlKSBwYXJhbXMuc2V0KCdzaW5jZScsIHNpbmNlKTtcbiAgICBpZiAodW50aWwpIHBhcmFtcy5zZXQoJ3VudGlsJywgdW50aWwpO1xuICAgIGNvbnN0IHNlYXJjaCA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGlmIChzZWFyY2gpIHBhcmFtcy5zZXQoJ3NlYXJjaCcsIHNlYXJjaCk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRMb2dzKGFwcGVuZCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWFwcGVuZCkge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgICAgICAgZmlsdGVyTm9uY2UrKztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZmxpZ2h0KSBpbmZsaWdodC5hYm9ydCgpO1xuICAgICAgICBpbmZsaWdodCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG15Tm9uY2UgPSBmaWx0ZXJOb25jZTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGJ1aWxkUXVlcnkoKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvZXJyb3ItbG9ncz8nICsgcGFyYW1zLnRvU3RyaW5nKCksIHtcbiAgICAgICAgc2lnbmFsOiBpbmZsaWdodC5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIC8vIE1pcnJvciBhdWRpdC1sb2c6IHN1cmZhY2UgNHh4LzV4eCBleHBsaWNpdGx5IGluc3RlYWQgb2YgZmFsbGluZ1xuICAgICAgLy8gdGhyb3VnaCB0byBhIG1pc2xlYWRpbmcgXCJubyBlbnRyaWVzIHlldFwiIGVtcHR5IHN0YXRlLlxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24nKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3RhbGUtcmVzcG9uc2UgZ3VhcmQ6IGEgbm9uLWFwcGVuZCBsb2FkIGhhcHBlbmVkIGFmdGVyIHRoaXMgZmV0Y2gsXG4gICAgICAvLyBkaXNjYXJkIHNvIHdlIGRvbid0IHNwbGljZSBpbnRvIHRoZSB3cm9uZyBET00uXG4gICAgICBpZiAoIWFwcGVuZCAmJiBteU5vbmNlICE9PSBmaWx0ZXJOb25jZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsb2dzID0gQXJyYXkuaXNBcnJheShkYXRhLmxvZ3MpID8gZGF0YS5sb2dzIDogW107XG4gICAgICBpZiAobG9ncy5sZW5ndGggPT09IDAgJiYgIWFwcGVuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSAoZGF0YS5maWx0ZXJzICYmIChkYXRhLmZpbHRlcnMubGV2ZWwgfHwgZGF0YS5maWx0ZXJzLmNvbnRleHQgfHwgZGF0YS5maWx0ZXJzLnNlYXJjaCB8fCBkYXRhLmZpbHRlcnMuc2luY2UgfHwgZGF0YS5maWx0ZXJzLnVudGlsKSlcbiAgICAgICAgICA/ICdObyBlcnJvciBsb2cgZW50cmllcyBtYXRjaCB5b3VyIGZpbHRlcnMuJ1xuICAgICAgICAgIDogJ1x1MjcwNSBObyBlcnJvcnMgbG9nZ2VkISBFdmVyeXRoaW5nIGlzIHdvcmtpbmcgc21vb3RobHkuJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+JHtlc2NhcGVIdG1sKHJlYXNvbil9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gZGF0YS50b3RhbCA/IGAke2RhdGEudG90YWx9IHRvdGFsYCA6ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICBpZiAoIWFwcGVuZCkge1xuICAgICAgICBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTYwcHg7XCI+V2hlbjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogODBweDtcIj5MZXZlbDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTQwcHg7XCI+Q29udGV4dDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPk1lc3NhZ2U8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6IDExMHB4O1wiPklQPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbG9nIG9mIGxvZ3MpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSAobG9nLmxldmVsIHx8ICc/JykudG9VcHBlckNhc2UoKTtcbiAgICAgICAgY29uc3QgbGV2ZWxDb2xvciA9IGxldmVsID09PSAnRVJSJyA/ICd2YXIoLS1iYWQtZmcpJyA6IChsZXZlbCA9PT0gJ1dBUk4nID8gJ3ZhcigtLXdhcm4tZmcsICNmMGM2NzQpJyA6ICd2YXIoLS1tdXRlZCknKTtcbiAgICAgICAgY29uc3QgdHMgPSBsb2cudGltZXN0YW1wID8gbmV3IERhdGUobG9nLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCBjdHggPSBsb2cuY29udGV4dCB8fCAnXHUyMDE0JztcbiAgICAgICAgY29uc3QgbXNnID0gKGxvZy5lcnJvciB8fCAnJykuc3BsaXQoJ1xcbicpWzBdO1xuICAgICAgICBjb25zdCBpcCA9IChsb2cucmVxdWVzdCAmJiBsb2cucmVxdWVzdC5pcCkgfHwgJyc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7XCIgY2xhc3M9XCJlcnJvci1sb2ctcm93XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGxvZy50aW1lc3RhbXAgfHwgJycpfVwiPiR7ZXNjYXBlSHRtbCh0cyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtsZXZlbENvbG9yfTsgZm9udC13ZWlnaHQ6IDYwMDtcIj4ke2VzY2FwZUh0bWwobGV2ZWwpfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtO1wiPiR7ZXNjYXBlSHRtbChjdHgpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChtc2cpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGlwKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKGxvZy5kZXRhaWwpIHtcbiAgICAgICAgICBodG1sICs9IGA8dHIgY2xhc3M9XCJlcnJvci1sb2ctZGV0YWlsXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjx0ZCBjb2xzcGFuPVwiNVwiIHN0eWxlPVwicGFkZGluZzogNnB4IDZweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHByZSBzdHlsZT1cIm1hcmdpbjogMDsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBtYXgtaGVpZ2h0OiAzMjBweDsgb3ZlcmZsb3c6IGF1dG87XCI+JHtlc2NhcGVIdG1sKGxvZy5kZXRhaWwpfTwvcHJlPjwvdGQ+PC90cj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YWJsZSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xuICAgICAgICBpZiAodGFibGUpIHRhYmxlLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRPZmZzZXQgKz0gbG9ncy5sZW5ndGg7XG4gICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNNb3JlID8gJycgOiAnbm9uZSc7XG4gICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSBgJHtkYXRhLnRvdGFsfSB0b3RhbCR7ZGF0YS5oYXNNb3JlID8gJyAoc2hvd2luZyAnICsgY3VycmVudE9mZnNldCArICcpJyA6ICcnfWA7XG5cbiAgICAgIC8vIFRvZ2dsZSBkZXRhaWwgcm93cyBvbiBjbGljayBcdTIwMTQgc2FtZSBwYXR0ZXJuIGFzIGF1ZGl0LWxvZy5qc1xuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lcnJvci1sb2ctcm93JykuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmIChyb3cuZGF0YXNldC53aXJlZCkgcmV0dXJuO1xuICAgICAgICByb3cuZGF0YXNldC53aXJlZCA9ICd0cnVlJztcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRldGFpbCA9IHJvdy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgaWYgKGRldGFpbCAmJiBkZXRhaWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdlcnJvci1sb2ctZGV0YWlsJykpIHtcbiAgICAgICAgICAgIGRldGFpbC5zdHlsZS5kaXNwbGF5ID0gZGV0YWlsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICcnIDogJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSAmJiBlLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsZWFyTG9ncygpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0NsZWFyIHRoZSBlbnRpcmUgZXJyb3IgbG9nPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZXJyb3ItbG9ncycsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29uZmlybTogJ0NMRUFSJyB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIC8vIEFmdGVyIGEgY2xlYXIsIHRoZSBjb250ZXh0cyBsaXN0IHdpbGwgYmUgZW1wdHkgXHUyMDE0IHJlLWZldGNoIHNvIHRoZVxuICAgICAgICAvLyBkcm9wZG93biByZWZsZWN0cyByZWFsaXR5LiBMb2FkIHRoZSBub3ctZW1wdHkgcGFnZSBpbiBwYXJhbGxlbC5cbiAgICAgICAgYXdhaXQgcmVmcmVzaENvbnRleHRzKCk7XG4gICAgICAgIGxvYWRMb2dzKGZhbHNlKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignXHUyNzA1IEVycm9yIGxvZ3MgY2xlYXJlZCcsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgJyArIChkYXRhLmVycm9yIHx8ICdDbGVhciBmYWlsZWQnKSwgJ2Vycm9yJywgNDAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignXHUyNzRDICcgKyBlLm1lc3NhZ2UsICdlcnJvcicsIDQwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlYm91bmNlIHRleHQtaW5wdXQgY2hhbmdlcyBzbyB3ZSBkb24ndCByZWZldGNoIG9uIGV2ZXJ5IGtleXN0cm9rZS5cbiAgbGV0IHNlYXJjaERlYm91bmNlO1xuICBmdW5jdGlvbiB3aXJlRmlsdGVycygpIHtcbiAgICBsZXZlbFNlbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZExvZ3MoZmFsc2UpKTtcbiAgICBjb250ZXh0U2VsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkTG9ncyhmYWxzZSkpO1xuICAgIHNlYXJjaElucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChzZWFyY2hEZWJvdW5jZSk7XG4gICAgICBzZWFyY2hEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gbG9hZExvZ3MoZmFsc2UpLCAyNTApO1xuICAgIH0pO1xuICAgIGxldCBkYXRlRGVib3VuY2U7XG4gICAgW3NpbmNlSW5wdXQsIHVudGlsSW5wdXRdLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQoZGF0ZURlYm91bmNlKTtcbiAgICAgICAgZGF0ZURlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkTG9ncyhmYWxzZSksIDI1MCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRMb2dzKGZhbHNlKSk7XG4gICAgbG9hZE1vcmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZExvZ3ModHJ1ZSkpO1xuICAgIGNsZWFyQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFyTG9ncyk7XG4gICAgd2lyZU1vZGFsKG1vZGFsLCBjbG9zZUJ0bik7XG4gIH1cblxuICB2aWV3QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGF3YWl0IHJlZnJlc2hDb250ZXh0cygpO1xuICAgIGxvYWRMb2dzKGZhbHNlKTtcbiAgfSk7XG4gIHdpcmVGaWx0ZXJzKCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBDT05UQUlORVIgTE9HIFZJRVdFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdjb250YWluZXItbG9ncy1tb2RhbCcsIGA8ZGl2IGlkPVwiY29udGFpbmVyLWxvZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIiBzdHlsZT1cInotaW5kZXg6IDEwMDE7XCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5MDBweDsgbWF4LXdpZHRoOiA5NXZ3OyBoZWlnaHQ6IDgwdmg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy1ib3R0b206IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMDtcIj5cdUQ4M0RcdURDREMgQ29udGFpbmVyIExvZ3M8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5WaWV3IGFuZCBzdHJlYW0gRG9ja2VyIGNvbnRhaW5lciBsb2dzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtY29udHJvbHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IG1pbi13aWR0aDogMjAwcHg7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGEgY29udGFpbmVyLi4uPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjbC1sb2ctc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggbG9ncy4uLlwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyB3aWR0aDogMTUwcHg7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiY2wtbG9nLXRhaWxcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1MFwiPkxhc3QgNTAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDBcIiBzZWxlY3RlZD5MYXN0IDEwMCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwMFwiPkxhc3QgNTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTAwMFwiPkxhc3QgMTAwMCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBsb2dzPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtc3RyZWFtXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1MjVCNiBTdHJlYW08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtZG93bmxvYWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVEQ0JFIERvd25sb2FkPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsZWFyLXNlYXJjaFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1jbG9zZVwiIGNsYXNzPVwiY2xvc2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDtcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWNvbnRhaW5lci1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDE2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zZWNvbmRhcnksIHZhcigtLWJnKSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8c3Bhbj48c3Ryb25nPkltYWdlOjwvc3Ryb25nPiA8c3BhbiBpZD1cImNsLWltYWdlXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiA8c3BhbiBpZD1cImNsLXN0YXR1c1wiPi08L3NwYW4+PC9zcGFuPlxuICAgICAgICA8c3Bhbj48c3Ryb25nPkNyZWF0ZWQ6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtY3JlYXRlZFwiPi08L3NwYW4+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgaWQ9XCJjbC1sb2ctY29udGVudFwiIGNsYXNzPVwibG9ncy1jb250ZW50IHNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cImZsZXg6IDE7IG1pbi1oZWlnaHQ6IDA7IGJhY2tncm91bmQ6ICMxYTFhMWE7IGJvcmRlci1yYWRpdXM6IDZweDsgcGFkZGluZzogMTJweDsgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnTWVubG8nLCAnVWJ1bnR1IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTsgb3ZlcmZsb3c6IGF1dG87XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLXN0cmVhbS1zdGF0dXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZywgIzFhM2ExYSk7IGNvbG9yOiB2YXIoLS1vay1mZywgIzRhZGU4MCk7IGJvcmRlci1yYWRpdXM6IDZweDsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiY2wtc3RyZWFtLWluZGljYXRvclwiPlx1RDgzRFx1REQzNDwvc3Bhbj4gPHNwYW4gaWQ9XCJjbC1zdHJlYW0tdGV4dFwiPkRpc2Nvbm5lY3RlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1saW5lLWNvdW50XCI+MCBsaW5lczwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj58PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwiY2wtZmlsdGVyLWNvdW50XCI+MCBmaWx0ZXJlZDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbC1jbG9zZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJyk7XG4gIGNvbnN0IGNvbnRhaW5lclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jb250YWluZXItc2VsZWN0Jyk7XG4gIGNvbnN0IGxvZ0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLWNvbnRlbnQnKTtcbiAgY29uc3QgbG9nU2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy1zZWFyY2gnKTtcbiAgY29uc3QgbG9nVGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctdGFpbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXJlZnJlc2gnKTtcbiAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0cmVhbScpO1xuICBjb25zdCBkb3dubG9hZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1kb3dubG9hZCcpO1xuICBjb25zdCBjbGVhclNlYXJjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbGVhci1zZWFyY2gnKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UnKTtcbiAgY29uc3QgY2xvc2VCdG4yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsb3NlLWJ0bicpO1xuICBjb25zdCBzdHJlYW1TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXN0YXR1cycpO1xuICBjb25zdCBzdHJlYW1JbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLWluZGljYXRvcicpO1xuICBjb25zdCBzdHJlYW1UZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0cmVhbS10ZXh0Jyk7XG4gIGNvbnN0IGxpbmVDb3VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1saW5lLWNvdW50Jyk7XG4gIGNvbnN0IGZpbHRlckNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWZpbHRlci1jb3VudCcpO1xuICBcbiAgLy8gQ29udGFpbmVyIGluZm8gZWxlbWVudHNcbiAgY29uc3QgaW1hZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1pbWFnZScpO1xuICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdGF0dXMnKTtcbiAgY29uc3QgY3JlYXRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNyZWF0ZWQnKTtcblxuICBsZXQgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRMb2dzID0gW107XG4gIGxldCBmaWx0ZXJlZExvZ3MgPSBbXTtcbiAgbGV0IGV2ZW50U291cmNlID0gbnVsbDtcbiAgbGV0IGlzU3RyZWFtaW5nID0gZmFsc2U7XG4gIGxldCBzZWFyY2hUaW1lb3V0ID0gbnVsbDtcblxuICAvLyBGb3JtYXQgZGF0ZVxuICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVTdHIpIHtcbiAgICBpZiAoIWRhdGVTdHIpIHJldHVybiAnLSc7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGVTdHIpO1xuICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBkYXRlU3RyO1xuICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH1cblxuICAvLyBFc2NhcGUgSFRNTFxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHN0cikge1xuICAgIGlmICghc3RyKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gc3RyO1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgLy8gRm9ybWF0IGxvZyBlbnRyeSBmb3IgZGlzcGxheVxuICBmdW5jdGlvbiBmb3JtYXRMb2dFbnRyeShsb2csIGluZGV4KSB7XG4gICAgY29uc3Qgc3RyZWFtQ2xhc3MgPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdsb2ctc3RkZXJyJyA6ICdsb2ctc3Rkb3V0JztcbiAgICBjb25zdCBzdHJlYW1JY29uID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAnXHUyNkEwXHVGRTBGJyA6ICdcdUQ4M0RcdURDRTQnO1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwibG9nLWVudHJ5ICR7c3RyZWFtQ2xhc3N9XCIgZGF0YS1pbmRleD1cIiR7aW5kZXh9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLWxpbmUtbnVtXCIgc3R5bGU9XCJjb2xvcjogIzY2NjsgbWluLXdpZHRoOiA0MHB4OyB0ZXh0LWFsaWduOiByaWdodDsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+JHtpbmRleCArIDF9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1zdHJlYW0taWNvblwiIHN0eWxlPVwiY29sb3I6ICR7bG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAnI2Y1OWUwYicgOiAnIzIyYzU1ZSd9O1wiPiR7c3RyZWFtSWNvbn08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXRleHRcIiBzdHlsZT1cImZsZXg6IDE7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgd29yZC1icmVhazogYnJlYWstYWxsOyBjb2xvcjogI2U1ZTVlNTtcIj4ke2VzY2FwZUh0bWwobG9nLnRleHQpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvLyBSZW5kZXIgbG9ncyB0byB0aGUgY29udGVudCBhcmVhXG4gIGZ1bmN0aW9uIHJlbmRlckxvZ3MobG9ncywgc2VhcmNoVGVybSA9ICcnKSB7XG4gICAgaWYgKCFsb2dzIHx8IGxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dDb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+Tm8gbG9ncyBhdmFpbGFibGU8L2Rpdj4nO1xuICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSAnMCBmaWx0ZXJlZCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY3VycmVudExvZ3MgPSBsb2dzO1xuICAgIGZpbHRlcmVkTG9ncyA9IHNlYXJjaFRlcm0gPyBsb2dzLmZpbHRlcihsb2cgPT4gXG4gICAgICBsb2cudGV4dCAmJiBsb2cudGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSlcbiAgICApIDogbG9ncztcblxuICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2xvZ3MubGVuZ3RofSBsaW5lc2A7XG4gICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSBzZWFyY2hUZXJtID8gYCR7ZmlsdGVyZWRMb2dzLmxlbmd0aH0gb2YgJHtsb2dzLmxlbmd0aH0gc2hvd25gIDogYCR7bG9ncy5sZW5ndGh9IHNob3duYDtcblxuICAgIGlmIChmaWx0ZXJlZExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+Tm8gbG9ncyBtYXRjaCBcIiR7ZXNjYXBlSHRtbChzZWFyY2hUZXJtKX1cIjwvZGl2PmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSBmaWx0ZXJlZExvZ3MubWFwKChsb2csIGkpID0+IGZvcm1hdExvZ0VudHJ5KGxvZywgaSkpLmpvaW4oJycpO1xuICAgIFxuICAgIC8vIFNjcm9sbCB0byBib3R0b21cbiAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgLy8gTG9hZCBjb250YWluZXIgbGlzdFxuICBhc3luYyBmdW5jdGlvbiBsb2FkQ29udGFpbmVycygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvbG9ncy9jb250YWluZXJzJyk7XG4gICAgICBjb25zdCBjb250YWluZXJzID0gZGF0YS5jb250YWluZXJzIHx8IFtdO1xuICAgICAgXG4gICAgICAvLyBTdG9yZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgY29uc3QgY3VycmVudFZhbCA9IGNvbnRhaW5lclNlbGVjdC52YWx1ZTtcbiAgICAgIFxuICAgICAgY29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGEgY29udGFpbmVyLi4uPC9vcHRpb24+JztcbiAgICAgIFxuICAgICAgY29udGFpbmVycy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0aW9uLnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gYCR7Yy5uYW1lfSAoJHtjLmltYWdlLnNwbGl0KCc6JylbMF19KSAtICR7Yy5zdGF0dXN9YDtcbiAgICAgICAgb3B0aW9uLmRhdGFzZXQubmFtZSA9IGMubmFtZTtcbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuaW1hZ2UgPSBjLmltYWdlO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5zdGF0dXMgPSBjLnN0YXR1cztcbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuY3JlYXRlZCA9IGMuY3JlYXRlZDtcbiAgICAgICAgY29udGFpbmVyU2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gaWYgc3RpbGwgdmFsaWRcbiAgICAgIGlmIChjdXJyZW50VmFsICYmIGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRWYWx9XCJdYCkpIHtcbiAgICAgICAgY29udGFpbmVyU2VsZWN0LnZhbHVlID0gY3VycmVudFZhbDtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8oY3VycmVudFZhbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBjb250YWluZXIgaW5mb1xuICBmdW5jdGlvbiBsb2FkQ29udGFpbmVySW5mbyhjb250YWluZXJJZCkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2NvbnRhaW5lcklkfVwiXWApO1xuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGltYWdlRWwudGV4dENvbnRlbnQgPSBvcHRpb24uZGF0YXNldC5pbWFnZSB8fCAnLSc7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LnN0YXR1cyB8fCAnLSc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9IG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9PT0gJ3J1bm5pbmcnID8gJ3ZhcigtLW9rLWZnLCAjNGFkZTgwKScgOiAndmFyKC0tYmFkLWZnLCAjZWY0NDQ0KSc7XG4gICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSBmb3JtYXREYXRlKG9wdGlvbi5kYXRhc2V0LmNyZWF0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgbG9ncyBmb3Igc2VsZWN0ZWQgY29udGFpbmVyXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRMb2dzKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGlmICghY29udGFpbmVySWQpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGFueSBleGlzdGluZyBzdHJlYW1cbiAgICBzdG9wU3RyZWFtKCk7XG5cbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICBsb2FkQ29udGFpbmVySW5mbyhjb250YWluZXJJZCk7XG5cbiAgICBjb25zdCB0YWlsID0gbG9nVGFpbC52YWx1ZTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gbG9nU2VhcmNoLnZhbHVlLnRyaW0oKTtcblxuICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5Mb2FkaW5nIGxvZ3MuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3MvY29udGFpbmVyLyR7Y29udGFpbmVySWR9JHt0YWlsICE9PSAnYWxsJyA/IGA/dGFpbD0ke3RhaWx9YCA6ICcnfWA7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTih1cmwpO1xuXG4gICAgICBpZiAoZGF0YS5sb2dzICYmIGRhdGEubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlbmRlckxvZ3MoZGF0YS5sb2dzLCBzZWFyY2hUZXJtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGZvdW5kIGZvciB0aGlzIGNvbnRhaW5lcjwvZGl2Pic7XG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9ICcwIGxpbmVzJztcbiAgICAgICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSAnMCBmaWx0ZXJlZCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZWY0NDQ0KTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkVycm9yIGxvYWRpbmcgbG9nczogJHtlc2NhcGVIdG1sKGVyci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXJ0IHN0cmVhbWluZyBsb2dzXG4gIGZ1bmN0aW9uIHN0YXJ0U3RyZWFtKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGlmICghY29udGFpbmVySWQpIHJldHVybjtcblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGlzU3RyZWFtaW5nID0gdHJ1ZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y5IFN0b3AnO1xuICAgIHN0cmVhbVN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURGRTInO1xuICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSAnQ29ubmVjdGluZy4uLic7XG5cbiAgICBjb25zdCB1cmwgPSBgL2FwaS92MS9sb2dzL3N0cmVhbS8ke2NvbnRhaW5lcklkfWA7XG4gICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURGRTInO1xuICAgICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0ZWQgLSBzdHJlYW1pbmcgbG9ncyc7XG4gICAgfTtcblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbG9nID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChsb2cuZXJyb3IpIHtcbiAgICAgICAgICBzdHJlYW1JbmRpY2F0b3IudGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDM0JztcbiAgICAgICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gYEVycm9yOiAke2xvZy5lcnJvcn1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0byBjdXJyZW50IGxvZ3NcbiAgICAgICAgY3VycmVudExvZ3MucHVzaChsb2cpO1xuICAgICAgICBmaWx0ZXJlZExvZ3MucHVzaChsb2cpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGNvdW50c1xuICAgICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSBgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICAgICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBzaG93bmA7XG4gICAgICAgIFxuICAgICAgICAvLyBBcHBlbmQgbmV3IGxvZyBlbnRyeVxuICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gbG9nU2VhcmNoLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKCFzZWFyY2hUZXJtIHx8IChsb2cudGV4dCAmJiBsb2cudGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSkpKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBlbnRyeS5pbm5lckhUTUwgPSBmb3JtYXRMb2dFbnRyeShsb2csIGZpbHRlcmVkTG9ncy5sZW5ndGggLSAxKTtcbiAgICAgICAgICBjb25zdCBlbnRyeURpdiA9IGVudHJ5LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgIGVudHJ5RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnIzFhM2ExYSc7XG4gICAgICAgICAgbG9nQ29udGVudC5hcHBlbmRDaGlsZChlbnRyeURpdik7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXV0by1zY3JvbGwgdG8gYm90dG9tXG4gICAgICAgICAgbG9nQ29udGVudC5zY3JvbGxUb3AgPSBsb2dDb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGxvZzonLCBlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdEaXNjb25uZWN0ZWQnO1xuICAgICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RyZWFtJztcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgdGhlIEV2ZW50U291cmNlIGZvciBjbGVhbnVwXG4gICAgbW9kYWwuX2V2ZW50U291cmNlID0gZXZlbnRTb3VyY2U7XG4gIH1cblxuICAvLyBTdG9wIHN0cmVhbWluZyBsb2dzXG4gIGZ1bmN0aW9uIHN0b3BTdHJlYW0oKSB7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgZXZlbnRTb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobW9kYWwuX2V2ZW50U291cmNlKSB7XG4gICAgICBtb2RhbC5fZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlzU3RyZWFtaW5nID0gZmFsc2U7XG4gICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIHN0cmVhbVN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgLy8gRG93bmxvYWQgbG9ncyBhcyBmaWxlXG4gIGZ1bmN0aW9uIGRvd25sb2FkTG9ncygpIHtcbiAgICBpZiAoIWN1cnJlbnRMb2dzIHx8IGN1cnJlbnRMb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignTm8gbG9ncyB0byBkb3dubG9hZCcsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjb250YWluZXJTZWxlY3QucXVlcnlTZWxlY3Rvcihgb3B0aW9uW3ZhbHVlPVwiJHtjdXJyZW50Q29udGFpbmVySWR9XCJdYCk/LmRhdGFzZXQubmFtZSB8fCBjdXJyZW50Q29udGFpbmVySWQ7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgJy0nKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGAke2NvbnRhaW5lck5hbWV9LWxvZ3MtJHt0aW1lc3RhbXB9LnR4dGA7XG5cbiAgICBjb25zdCBjb250ZW50ID0gY3VycmVudExvZ3MubWFwKGxvZyA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBsb2cudGltZXN0YW1wIHx8ICcnO1xuICAgICAgY29uc3Qgc3RyZWFtID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAnW0VSUl0nIDogJ1tPVVRdJztcbiAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAgPyB0aW1lc3RhbXAgKyAnICcgOiAnJ30ke3N0cmVhbX0gJHtsb2cudGV4dH1gO1xuICAgIH0pLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb250ZW50XSwgeyB0eXBlOiAndGV4dC9wbGFpbicgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG5cbiAgICBzaG93Tm90aWZpY2F0aW9uKGBEb3dubG9hZGVkICR7Y3VycmVudExvZ3MubGVuZ3RofSBsb2cgbGluZXNgLCAnc3VjY2VzcycpO1xuICB9XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGxvZ1RhaWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBsb2FkTG9ncygpO1xuICB9KTtcblxuICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2FkTG9ncygpO1xuICB9KTtcblxuICBzdHJlYW1CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChpc1N0cmVhbWluZykge1xuICAgICAgc3RvcFN0cmVhbSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFN0cmVhbSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZG93bmxvYWRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRvd25sb2FkTG9ncygpO1xuICB9KTtcblxuICBjbGVhclNlYXJjaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgcmVuZGVyTG9ncyhjdXJyZW50TG9ncywgJycpO1xuICB9KTtcblxuICBsb2dTZWFyY2g/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgIC8vIERlYm91bmNlIHNlYXJjaFxuICAgIGNsZWFyVGltZW91dChzZWFyY2hUaW1lb3V0KTtcbiAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCBsb2dTZWFyY2gudmFsdWUudHJpbSgpKTtcbiAgICB9LCAzMDApO1xuICB9KTtcblxuICBsb2dTZWFyY2g/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGxvZ1NlYXJjaC52YWx1ZSA9ICcnO1xuICAgICAgcmVuZGVyTG9ncyhjdXJyZW50TG9ncywgJycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gT3BlbiBtb2RhbFxuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXctY29udGFpbmVyLWxvZ3MnKTtcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH0pO1xuXG4gIC8vIENsb3NlIG1vZGFsIGhhbmRsZXJzXG4gIGZ1bmN0aW9uIGNsb3NlTW9kYWwoKSB7XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBjbG9zZUJ0bjI/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG5cbiAgLy8gQ2xvc2Ugb24gZXNjYXBlIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICBjbG9zZU1vZGFsKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBXaXJlIGJhY2tkcm9wIGNsaWNrIHRvIGNsb3NlTW9kYWwgc28gdGhlIGxvZyBzdHJlYW0gc3RvcHMgdG9vLlxuICAvLyAoQ2FuJ3QgdXNlIHdpcmVNb2RhbCBoZXJlIFx1MjAxNCBpdCBvbmx5IGRvZXMgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXG4gIC8vIG9uIGJhY2tkcm9wIGNsaWNrLCB3aGljaCB3b3VsZCBsZWFrIHRoZSBTU0Uvc3RyZWFtIGNvbm5lY3Rpb24uKVxuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlTW9kYWwoKTsgfSk7XG5cbiAgLy8gRXhwb3NlIGZvciB1c2UgYnkgc2VydmljZSBjYXJkIGJ1dHRvbnMgKGdyaWQuanMgY2FsbHMgb3BlbkNvbnRhaW5lckxvZ3NNb2RhbClcbiAgd2luZG93Lm9wZW5Db250YWluZXJMb2dzTW9kYWwgPSBmdW5jdGlvbihjb250YWluZXJJZCwgY29udGFpbmVyTmFtZSkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQ29udGFpbmVycygpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gVHJ5IHRvIGZpbmQgYW5kIHNlbGVjdCB0aGUgY29udGFpbmVyXG4gICAgICBjb25zdCBvcHRpb24gPSBBcnJheS5mcm9tKGNvbnRhaW5lclNlbGVjdC5vcHRpb25zKS5maW5kKG9wdCA9PiBcbiAgICAgICAgb3B0LnZhbHVlID09PSBjb250YWluZXJJZCB8fCBvcHQuZGF0YXNldC5uYW1lID09PSBjb250YWluZXJOYW1lXG4gICAgICApO1xuICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgIGxvYWRDb250YWluZXJJbmZvKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcklkKSB7XG4gICAgICAgIC8vIElmIGNvbnRhaW5lciBub3QgZm91bmQgaW4gbGlzdCBidXQgd2UgaGF2ZSBhbiBJRCwgdHJ5IGxvYWRpbmcgZGlyZWN0bHlcbiAgICAgICAgY3VycmVudENvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICAgIGltYWdlRWwudGV4dENvbnRlbnQgPSBjb250YWluZXJOYW1lIHx8IGNvbnRhaW5lcklkO1xuICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICctJztcbiAgICAgICAgY3JlYXRlZEVsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBsb2FkTG9ncygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gY29udGFpbmVyIElELCBqdXN0IHNob3cgbW9kYWwgd2l0aCBjb250YWluZXIgbGlzdFxuICAgICAgICBsb2dDb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+U2VsZWN0IGEgY29udGFpbmVyIHRvIHZpZXcgbG9nczwvZGl2Pic7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBEQy0wNTU6IEhPU1QgSk9VUk5BTEQgTE9HIFZJRVdFUiA9PT09PT09PT09XG4vLyBTdHJlYW1zIGhvc3Qgc2VydmljZSBsb2dzIChjYWRkeSwgZGFzaGNhZGR5LWFwaSwgZG9ja2VyLCBzc2gsIFx1MjAyNikgdmlhIHRoZVxuLy8gam91cm5hbGN0bCBiaW5kLW1vdW50IGFkZGVkIGluIHN0YXJ0LnNoLiBTZXJ2ZXItU2VudCBFdmVudHMgZm9yIGxpdmVcbi8vIHRhaWxpbmc7IGJvdW5kZWQgbm9uLXN0cmVhbWluZyByZWFkIGZvciBoaXN0b3JpY2FsIHZpZXdzLlxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQWxsb3ctbGlzdCBtaXJyb3JzIHRoZSBiYWNrZW5kJ3MgQUxMT1dFRF9VTklUUyBzbyB0aGUgZHJvcGRvd24gc3RheXNcbiAgLy8gaG9uZXN0IHdoZW4gdGhlIGJpbmQtbW91bnQgaXNuJ3QgYXZhaWxhYmxlLiBUaGUgc2VydmVyIGlzIHN0aWxsIHRoZVxuICAvLyBzb3VyY2Ugb2YgdHJ1dGggXHUyMDE0IGFueXRoaW5nIG5vdCBpbiBpdHMgYWxsb3ctbGlzdCByZXR1cm5zIDQwMC5cbiAgY29uc3QgVU5JVF9QUkVTRVRTID0gW1xuICAgIHsgdW5pdDogJ2NhZGR5JywgICAgICAgICAgbGFiZWw6ICdDYWRkeSAocmV2ZXJzZSBwcm94eSknIH0sXG4gICAgeyB1bml0OiAnZGFzaGNhZGR5LWFwaScsICBsYWJlbDogJ0Rhc2hDYWRkeSBBUEkgKGhvc3Qgc3lzdGVtZCB1bml0LCBub3QgdGhpcyBjb250YWluZXIpJyB9LFxuICAgIHsgdW5pdDogJ2RvY2tlcicsICAgICAgICAgbGFiZWw6ICdEb2NrZXIgZGFlbW9uJyB9LFxuICAgIHsgdW5pdDogJ3NzaCcsICAgICAgICAgICAgbGFiZWw6ICdTU0ggc2VydmVyJyB9LFxuICAgIHsgdW5pdDogJ3N5c3RlbWQtam91cm5hbGQnLCBsYWJlbDogJ3N5c3RlbWQtam91cm5hbGQnIH0sXG4gICAgeyB1bml0OiAndGFpbHNjYWxlZCcsICAgICBsYWJlbDogJ1RhaWxzY2FsZScgfSxcbiAgICB7IHVuaXQ6ICduZXR3b3JrZC1kaXNwYXRjaGVyJywgbGFiZWw6ICdOZXR3b3JrZCBkaXNwYXRjaGVyJyB9LFxuICBdO1xuXG4gIGluamVjdE1vZGFsKCdqb3VybmFsZC1tb2RhbCcsIGBcbiAgICA8ZGl2IGlkPVwiam91cm5hbGQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIiBzdHlsZT1cInotaW5kZXg6IDEwMDI7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtaGVhZGVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmctYm90dG9tOiAxMnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1REVGMFx1RkUwRiBIb3N0IExvZ3MgKGpvdXJuYWxkKTwvaDM+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCIgc3R5bGU9XCJtYXJnaW46IDRweCAwIDAgMDsgZm9udC1zaXplOiAwLjg1cmVtOyBvcGFjaXR5OiAwLjc7XCI+XG4gICAgICAgICAgICAgIFN0cmVhbSBob3N0IHNlcnZpY2UgbG9ncyBmcm9tIDxjb2RlPmpvdXJuYWxjdGw8L2NvZGU+IChyZWFkLW9ubHkgbW91bnQpLiBEb2NrZXIgY29udGFpbmVyIGxvZ3MgYXJlIHN0aWxsIGluIHRoZSA8ZW0+Q29udGFpbmVyIExvZ3M8L2VtPiBtb2RhbC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJqZC11bml0LXNlbGVjdFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBtaW4td2lkdGg6IDIyMHB4O1wiPjwvc2VsZWN0PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJqZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNjBweDtcIiAvPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImpkLXRhaWxcIiBtaW49XCIxXCIgbWF4PVwiNTAwMFwiIHZhbHVlPVwiMjAwXCIgdGl0bGU9XCJMaW5lcyB0byBsb2FkIChoaXN0b3JpY2FsIHZpZXcpXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiA5MHB4O1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiamQtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgTG9hZCB0YWlsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiamQtc3RyZWFtXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1MjVCNiBTdHJlYW08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbGVhci1zZWFyY2hcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBmb250LXNpemU6IDAuODVyZW07XCIgdGl0bGU9XCJDbGVhciBzZWFyY2hcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbG9zZVwiIGNsYXNzPVwiY2xvc2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDtcIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImpkLW1ldGFcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICA8c3Bhbj48c3Ryb25nPlNvdXJjZTo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJqZC1zb3VyY2VcIj5qb3VybmFsZDwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PHN0cm9uZz5Vbml0Ojwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXVuaXQtZGlzcGxheVwiPi08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U3RyZWFtOjwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXN0cmVhbS1zdGF0ZVwiPmRpc2Nvbm5lY3RlZDwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJqZC1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+U2VsZWN0IGEgdW5pdCBhbmQgY2xpY2sgPGVtPkxvYWQgdGFpbDwvZW0+IG9yIDxlbT5TdHJlYW08L2VtPi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImpkLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+fDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtZmlsdGVyLWNvdW50XCI+MCBzaG93bjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImpkLW92ZXJmbG93XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBjb2xvcjogdmFyKC0td2Fybi1mZywgI2ZiYmYyNCk7XCI+XHUyNkEwIHN0cmVhbSBvdmVyZmxvdyBcdTIwMTQgcmUtbG9hZCB3aXRoIG5hcnJvd2VyIHdpbmRvdzwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiamQtY2xvc2UtYnRuXCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCk7XG5cbiAgY29uc3QgbW9kYWwgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvdXJuYWxkLW1vZGFsJyk7XG4gIGNvbnN0IHVuaXRTZWxlY3QgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC11bml0LXNlbGVjdCcpO1xuICBjb25zdCBzZWFyY2hJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtc2VhcmNoJyk7XG4gIGNvbnN0IHRhaWxJbnB1dCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1yZWZyZXNoJyk7XG4gIGNvbnN0IHN0cmVhbUJ0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zdHJlYW0nKTtcbiAgY29uc3QgY2xlYXJTZWFyY2ggID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xvc2UnKTtcbiAgY29uc3QgY2xvc2VCdG4yICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLWNsb3NlLWJ0bicpO1xuICBjb25zdCBjb250ZW50ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY29udGVudCcpO1xuICBjb25zdCBsaW5lQ291bnQgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtbGluZS1jb3VudCcpO1xuICBjb25zdCBmaWx0ZXJDb3VudCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtZmlsdGVyLWNvdW50Jyk7XG4gIGNvbnN0IG92ZXJmbG93SGludCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1vdmVyZmxvdycpO1xuICBjb25zdCB1bml0RGlzcGxheSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtdW5pdC1kaXNwbGF5Jyk7XG4gIGNvbnN0IHN0cmVhbVN0YXRlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zdHJlYW0tc3RhdGUnKTtcblxuICBsZXQgYXZhaWxhYmxlID0gZmFsc2U7ICAgICAvLyAvdmFyL2xvZy9qb3VybmFsIG1vdW50ZWQ/XG4gIGxldCBsaW5lcyA9IFtdOyAgICAgICAgICAgIC8vIGN1cnJlbnQgYnVmZmVyIChhcnJheSBvZiB7dGltZXN0YW1wLCB1bml0LCB0ZXh0fSlcbiAgbGV0IHN0cmVhbWluZyA9IGZhbHNlO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgc2VhcmNoVGltZXIgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykge1xuICAgIC8vIExvY2FsIHJlLWRlY2xhcmF0aW9uIHNvIHdlIGRvbid0IGRlcGVuZCBvbiBhIGdsb2JhbDsgc2FtZSBzZW1hbnRpY3NcbiAgICAvLyBhcyB0aGUgaGVscGVyIHVzZWQgYnkgY29udGFpbmVyLWxvZ3MuanMgYW5kIGVycm9yLWxvZ3MuanMuXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gU3RyaW5nKHMpO1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QXZhaWxhYmxlKGlzQXZhaWxhYmxlKSB7XG4gICAgYXZhaWxhYmxlID0gaXNBdmFpbGFibGU7XG4gICAgdW5pdFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICBVTklUX1BSRVNFVFMuZm9yRWFjaChwID0+IHtcbiAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LnZhbHVlID0gcC51bml0O1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gcC5sYWJlbCArICcgKCcgKyBwLnVuaXQgKyAnKSc7XG4gICAgICB1bml0U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgdW5pdFNlbGVjdC5kaXNhYmxlZCA9ICFpc0F2YWlsYWJsZTtcbiAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+am91cm5hbGQgYmluZC1tb3VudCBub3QgYXZhaWxhYmxlIGluIHRoaXMgY29udGFpbmVyLjxici8+PHNtYWxsPlJlcXVpcmVzIDxjb2RlPi92YXIvbG9nL2pvdXJuYWw8L2NvZGU+ICsgPGNvZGU+L3Vzci9iaW4vam91cm5hbGN0bDwvY29kZT4gbW91bnRlZCAoc3RhcnQuc2gpLjwvc21hbGw+PC9kaXY+JztcbiAgICAgIHJlZnJlc2hCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJvYmVBdmFpbGFibGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9sb2dzL2pvdXJuYWwvdW5pdHMnKTtcbiAgICAgIGlmICghcmVzcC5vaykgeyBzZXRBdmFpbGFibGUoZmFsc2UpOyByZXR1cm47IH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIHNldEF2YWlsYWJsZSghIWRhdGEuYXZhaWxhYmxlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRBdmFpbGFibGUoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckxpbmVzKCkge1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGVybSA/IGxpbmVzLmZpbHRlcihsID0+IChsLnRleHRDb250ZW50IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSA6IGxpbmVzO1xuICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBlbnRyaWVzJyArICh0ZXJtID8gYCBtYXRjaGluZyAmcXVvdDske2VzY2FwZUh0bWwodGVybSl9JnF1b3Q7YCA6ICcnKSArICc8L2Rpdj4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodG1sID0gZmlsdGVyZWQubWFwKGxpbmUgPT4ge1xuICAgICAgICBjb25zdCB0cyA9IGxpbmUudGltZXN0YW1wID8gZXNjYXBlSHRtbChsaW5lLnRpbWVzdGFtcCkgOiAnXHUyMDE0JztcbiAgICAgICAgY29uc3QgdCA9IGVzY2FwZUh0bWwobGluZS50ZXh0Q29udGVudCk7XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImpkLWxpbmVcIiBzdHlsZT1cInBhZGRpbmc6IDFweCAwOyBsaW5lLWhlaWdodDogMS40OyBjb2xvcjogI2Q0ZDRkNDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1yaWdodDogOHB4O1wiPiR7dHN9PC9zcGFuPiR7dH08L2Rpdj5gO1xuICAgICAgfSkuam9pbignJyk7XG4gICAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAvLyBBdXRvLXNjcm9sbCBvbmx5IGlmIHVzZXIgaXMgYWxyZWFkeSBhdCB0aGUgYm90dG9tIChkb24ndCBmaWdodCB0aGVtKS5cbiAgICAgIGNvbnN0IG5lYXJCb3R0b20gPSBjb250ZW50LnNjcm9sbEhlaWdodCAtIGNvbnRlbnQuc2Nyb2xsVG9wIC0gY29udGVudC5jbGllbnRIZWlnaHQgPCA4MDtcbiAgICAgIGlmIChuZWFyQm90dG9tKSBjb250ZW50LnNjcm9sbFRvcCA9IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgIH1cbiAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSBgJHtsaW5lcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgIGZpbHRlckNvdW50LnRleHRDb250ZW50ID0gdGVybSA/IGAke2ZpbHRlcmVkLmxlbmd0aH0gb2YgJHtsaW5lcy5sZW5ndGh9IHNob3duYCA6IGAke2xpbmVzLmxlbmd0aH0gc2hvd25gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFRhaWwoKSB7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybjtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgY29uc3QgdW5pdCA9IHVuaXRTZWxlY3QudmFsdWU7XG4gICAgaWYgKCF1bml0KSByZXR1cm47XG4gICAgY29uc3QgdGFpbCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDUwMDAsIE51bWJlcih0YWlsSW5wdXQudmFsdWUpIHx8IDIwMCkpO1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoJy9hcGkvdjEvbG9ncy9qb3VybmFsJywgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndW5pdCcsIHVuaXQpO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3RhaWwnLCBTdHJpbmcodGFpbCkpO1xuICAgICAgaWYgKHRlcm0pIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdzZWFyY2gnLCB0ZXJtKTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwibG9ncy1sb2FkaW5nXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZWY0NDQ0KTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoKGRhdGEgJiYgZGF0YS5lcnJvcikgfHwgKCdIVFRQICcgKyByZXNwLnN0YXR1cykpICsgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVuaXREaXNwbGF5LnRleHRDb250ZW50ID0gdW5pdDtcbiAgICAgIGxpbmVzID0gKGRhdGEuZW50cmllcyB8fCBbXSkubWFwKGUgPT4gKHtcbiAgICAgICAgdGltZXN0YW1wOiBlLnRpbWVzdGFtcCxcbiAgICAgICAgdW5pdDogZS51bml0LFxuICAgICAgICB0ZXh0Q29udGVudDogZS50ZXh0IHx8ICcnLFxuICAgICAgfSkpO1xuICAgICAgb3ZlcmZsb3dIaW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICByZW5kZXJMaW5lcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3I6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFN0cmVhbSgpIHtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuO1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBjb25zdCB1bml0ID0gdW5pdFNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIXVuaXQpIHJldHVybjtcbiAgICBjb25zdCB0ZXJtID0gKHNlYXJjaElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgdW5pdERpc3BsYXkudGV4dENvbnRlbnQgPSB1bml0O1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjggU3RvcCc7XG4gICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5hZGQoJ3N0cmVhbWluZycpO1xuICAgIHN0cmVhbVN0YXRlLnRleHRDb250ZW50ID0gJ3N0cmVhbWluZyc7XG4gICAgc3RyZWFtU3RhdGUuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcsICM0YWRlODApJztcbiAgICBsaW5lcyA9IFtdO1xuICAgIHJlbmRlckxpbmVzKCk7XG4gICAgb3ZlcmZsb3dIaW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2FwaS92MS9sb2dzL2pvdXJuYWwvc3RyZWFtJywgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3VuaXQnLCB1bml0KTtcbiAgICBpZiAodGVybSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NlYXJjaCcsIHRlcm0pO1xuICAgIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybC50b1N0cmluZygpKTtcbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXYpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gSlNPTi5wYXJzZShldi5kYXRhKTtcbiAgICAgICAgaWYgKGVudHJ5LmVycm9yKSB7XG4gICAgICAgICAgLy8gT3ZlcmZsb3cgLyB2YWxpZGF0aW9uIC8gYmluZC1tb3VudCBlcnJvcnNcbiAgICAgICAgICBpZiAoL3N0cmVhbSAoZXhjZWVkZWR8bGluZSBjYXApLy50ZXN0KGVudHJ5LmVycm9yKSkge1xuICAgICAgICAgICAgb3ZlcmZsb3dIaW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgIHN0b3BTdHJlYW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudC5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9XCJqZC1saW5lXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZWY0NDQ0KTsgcGFkZGluZzogNHB4IDA7XCI+XHUyNkEwICcgKyBlc2NhcGVIdG1sKGVudHJ5LmVycm9yKSArICc8L2Rpdj4nO1xuICAgICAgICAgIGNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgIHRpbWVzdGFtcDogZW50cnkudGltZXN0YW1wLFxuICAgICAgICAgIHVuaXQ6IGVudHJ5LnVuaXQgfHwgdW5pdCxcbiAgICAgICAgICB0ZXh0Q29udGVudDogZW50cnkudGV4dCB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhhcmQgY2FwIHRvIGtlZXAgbWVtb3J5IGJvdW5kZWQgaWYgb3BlcmF0b3Igc3RyZWFtcyBmb3JldmVyLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gNTAwMCkge1xuICAgICAgICAgIGxpbmVzID0gbGluZXMuc2xpY2UobGluZXMubGVuZ3RoIC0gNTAwMCk7XG4gICAgICAgICAgb3ZlcmZsb3dIaW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJMaW5lcygpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBJZ25vcmUgbWFsZm9ybWVkIGV2ZW50czsgdGhlIHNlcnZlciBpcyBhdXRob3JpdGF0aXZlLlxuICAgICAgfVxuICAgIH07XG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgIC8vIEV2ZW50U291cmNlIGF1dG8tcmVjb25uZWN0czsgbWFyayB0cmFuc2llbnQgaWYgd2Ugd2VyZSBleHBlY3RpbmdcbiAgICAgIC8vIG1vcmUsIG90aGVyd2lzZSB3ZSBjbG9zZWQgaXQgZGVsaWJlcmF0ZWx5LlxuICAgICAgaWYgKCFzdHJlYW1pbmcpIHJldHVybjtcbiAgICB9O1xuICAgIHN0cmVhbWluZyA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wU3RyZWFtKCkge1xuICAgIHN0cmVhbWluZyA9IGZhbHNlO1xuICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgdHJ5IHsgZXZlbnRTb3VyY2UuY2xvc2UoKTsgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgZXZlbnRTb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3N0cmVhbWluZycpO1xuICAgIHN0cmVhbVN0YXRlLnRleHRDb250ZW50ID0gJ2Rpc2Nvbm5lY3RlZCc7XG4gICAgc3RyZWFtU3RhdGUuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH1cblxuICAvLyBXaXJlIGV2ZW50c1xuICByZWZyZXNoQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFRhaWwpO1xuICBzdHJlYW1CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzdHJlYW1pbmcgPyBzdG9wU3RyZWFtKCkgOiBzdGFydFN0cmVhbSgpKTtcbiAgY2xlYXJTZWFyY2guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNlYXJjaElucHV0LnZhbHVlID0gJyc7IHJlbmRlckxpbmVzKCk7IH0pO1xuICBzZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZXIpO1xuICAgIHNlYXJjaFRpbWVyID0gc2V0VGltZW91dChyZW5kZXJMaW5lcywgMjAwKTtcbiAgfSk7XG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgcmVuZGVyTGluZXMoKTsgfVxuICB9KTtcbiAgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7XG4gIGNsb3NlQnRuMi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBjbG9zZSgpOyB9KTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiBtb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkgY2xvc2UoKTtcbiAgfSk7XG4gIC8vIFJlbG9hZCB0YWlsIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdW5pdCBkcm9wZG93biBjaGFuZ2VzIChpZiB3ZSBoYXZlXG4gIC8vIGRhdGEgYWxyZWFkeSBcdTIwMTQgc2F2ZXMgYSBjbGljaykuXG4gIHVuaXRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSBsb2FkVGFpbCgpO1xuICB9KTtcblxuICAvLyBIb29rIGludG8gdGhlIGV4aXN0aW5nIFwiQ29udGFpbmVyIExvZ3NcIiBtb2RhbCBidXR0b24gc28gb3BlcmF0b3JzIGdldCBhXG4gIC8vIHNlcGFyYXRlIGVudHJ5IHBvaW50OyBtaXJyb3IgdGhlIG9wZW5Db250YWluZXJMb2dzTW9kYWwgcGF0dGVybi5cbiAgZnVuY3Rpb24gb3BlbkpvdXJuYWxkTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHByb2JlQXZhaWxhYmxlKCk7XG4gIH1cbiAgd2luZG93Lm9wZW5Kb3VybmFsZE1vZGFsID0gb3BlbkpvdXJuYWxkTW9kYWw7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXctam91cm5hbGQtbG9ncycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Kb3VybmFsZE1vZGFsKTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBDT05UQUlORVIgU05BUFNIT1QgLyBDSEVDS1BPSU5UID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ3NuYXBzaG90LW1vZGFsJywgYDxkaXYgaWQ9XCJzbmFwc2hvdC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzAwcHg7IG1heC13aWR0aDogODUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0JFIENvbnRhaW5lciBTbmFwc2hvdHM8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBDcmVhdGUgYW5kIG1hbmFnZSBEb2NrZXIgY29udGFpbmVyIGNoZWNrcG9pbnRzIGZvciBpbnN0YW50IHN0YXRlIHJlY292ZXJ5LlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGlkPVwic25hcHNob3QtY29udGFpbmVyLXNlbGVjdC13cmFwcGVyXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+U2VsZWN0IENvbnRhaW5lcjo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwic25hcHNob3QtY29udGFpbmVyLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2VsZWN0IGEgY29udGFpbmVyIC0tPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1kZXRhaWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkltYWdlOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pbWFnZVwiPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5TdGF0dXM6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LXN0YXR1c1wiPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DcmVhdGVkOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1jcmVhdGVkXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lciBJRDo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3QtaWRcIiBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwic25hcHNob3QtY3JlYXRlXCI+Q3JlYXRlIFNuYXBzaG90PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic25hcHNob3QtbGlzdFwiPk1hbmFnZSBTbmFwc2hvdHM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+U25hcHNob3QgTmFtZTo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic25hcHNob3QtbmFtZVwiIHBsYWNlaG9sZGVyPVwiZS5nLiwgYmVmb3JlLXVwZGF0ZS0yMDI0XCIgXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTJweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjlyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzbmFwc2hvdC1sZWF2ZS1ydW5uaW5nXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgTGVhdmUgY29udGFpbmVyIHJ1bm5pbmcgYWZ0ZXIgY2hlY2twb2ludCAocmVzdW1lIHdpdGhvdXQgcmVzdGFydClcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNuYXBzaG90LWNyZWF0ZS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlx1RDgzRFx1RENCRSBDcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWNyZWF0ZS1zdGF0dXNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtbGlzdC1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMwMHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBpdHMgc25hcHNob3RzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtYnRuJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNsb3NlJyk7XG4gIGNvbnN0IGNvbnRhaW5lclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jb250YWluZXItc2VsZWN0Jyk7XG4gIGNvbnN0IGRldGFpbHNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtZGV0YWlscycpO1xuICBjb25zdCBjcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY3JlYXRlLWJ0bicpO1xuICBjb25zdCBjcmVhdGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY3JlYXRlLXN0YXR1cycpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb250YWluZXJzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLmNvbnRhaW5lcnMpIHJldHVybjtcbiAgICAgIFxuICAgICAgY29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2VsZWN0IGEgY29udGFpbmVyIC0tPC9vcHRpb24+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhLmNvbnRhaW5lcnMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdC52YWx1ZSA9IGMuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke2MubmFtZSB8fCBjLmlkfSAoJHtjLmltYWdlIHx8ICd1bmtub3duJ30pYDtcbiAgICAgICAgb3B0LmRhdGFzZXQubmFtZSA9IGMubmFtZTtcbiAgICAgICAgb3B0LmRhdGFzZXQuaW1hZ2UgPSBjLmltYWdlO1xuICAgICAgICBvcHQuZGF0YXNldC5zdGF0dXMgPSBjLnN0YXR1cztcbiAgICAgICAgb3B0LmRhdGFzZXQuY3JlYXRlZCA9IGMuY3JlYXRlZDtcbiAgICAgICAgY29udGFpbmVyU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY29udGFpbmVyczonLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93Q29udGFpbmVyRGV0YWlscyhvcHQpIHtcbiAgICBpZiAoIW9wdCB8fCAhb3B0LnZhbHVlKSB7XG4gICAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBvcHQudmFsdWU7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWltYWdlJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5pbWFnZSB8fCAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LXN0YXR1cycpLnRleHRDb250ZW50ID0gb3B0LmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY3JlYXRlZCcpLnRleHRDb250ZW50ID0gb3B0LmRhdGFzZXQuY3JlYXRlZCA/IG5ldyBEYXRlKG9wdC5kYXRhc2V0LmNyZWF0ZWQgKiAxMDAwKS50b0xvY2FsZVN0cmluZygpIDogJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1pZCcpLnRleHRDb250ZW50ID0gb3B0LnZhbHVlLnN1YnN0cmluZygwLCAxMik7XG4gICAgZGV0YWlsc0Rpdi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTbmFwc2hvdCgpIHtcbiAgICBpZiAoIWN1cnJlbnRDb250YWluZXJJZCkge1xuICAgICAgY3JlYXRlU3RhdHVzLnRleHRDb250ZW50ID0gJ1BsZWFzZSBzZWxlY3QgYSBjb250YWluZXIgZmlyc3QnO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LW5hbWUnKS52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIGVudGVyIGEgc25hcHNob3QgbmFtZSc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxlYXZlUnVubmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1sZWF2ZS1ydW5uaW5nJykuY2hlY2tlZDtcbiAgICBcbiAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdDcmVhdGluZy4uLic7XG4gICAgY3JlYXRlU3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2NvbnRhaW5lcnMvJHtlbmNvZGVVUklDb21wb25lbnQoY3VycmVudENvbnRhaW5lcklkKX0vY2hlY2twb2ludGAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWUsIGxlYXZlUnVubmluZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcxMyBTbmFwc2hvdCBcIiR7bmFtZX1cIiBjcmVhdGVkIHN1Y2Nlc3NmdWxseWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEZhaWxlZDogJHtkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gO1xuICAgICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY3JlYXRlU3RhdHVzLnRleHRDb250ZW50ID0gYFx1MjcxNyBFcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBjcmVhdGVCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdCc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3Blbk1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQ29udGFpbmVycygpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgZGV0YWlsc0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgY29udGFpbmVyU2VsZWN0LnNlbGVjdGVkSW5kZXggPSAwO1xuICB9XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuTW9kYWwpO1xuICBjbG9zZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjbG9zZUJ0bik7XG4gIFxuICBjb250YWluZXJTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3Qgb3B0ID0gY29udGFpbmVyU2VsZWN0Lm9wdGlvbnNbY29udGFpbmVyU2VsZWN0LnNlbGVjdGVkSW5kZXhdO1xuICAgIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCk7XG4gIH0pO1xuICBcbiAgY3JlYXRlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNyZWF0ZVNuYXBzaG90KTtcbiAgXG4gIC8vIFRhYiBzd2l0Y2hpbmdcbiAgbW9kYWw/LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC10YWInKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC1zZWN0aW9uJykuZm9yRWFjaChzID0+IHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgdGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihgIyR7dGFiLmRhdGFzZXQucGFuZWx9YCkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gU01BUlQgQVJSIENPTk5FQ1QgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnYXJyLXNldHVwLW1vZGFsJywgYDxkaXYgaWQ9XCJhcnItc2V0dXAtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDYwMHB4OyBtYXgtd2lkdGg6IDcyMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzQ1x1REZBQyBTbWFydCBBcnIgQ29ubmVjdDwvaDM+XG4gICAgICA8cCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICBBdXRvLWRpc2NvdmVyIGFuZCBjb25uZWN0IHlvdXIgZW50aXJlIG1lZGlhIHN0YWNrLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFBoYXNlIDE6IERldGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzbWFydC1waGFzZS1kZXRlY3RcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIj48L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlNjYW5uaW5nIGZvciBzZXJ2aWNlcy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LWRldGVjdC1yZXN1bHRzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGhhc2UgMjogQ3JlZGVudGlhbCBJbnB1dCAob25seSBmb3Igc2VydmljZXMgbmVlZGluZyBrZXlzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzbWFydC1waGFzZS1jcmVkZW50aWFsc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwiaGVhZGluZy1hY2NlbnQtc2VjdGlvblwiPkVudGVyIE1pc3NpbmcgQVBJIEtleXM8L2g0PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtY3JlZGVudGlhbC1pbnB1dHNcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIENvbm5lY3Rpb24gT3B0aW9ucyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPkNvbm5lY3Rpb24gT3B0aW9uczwvaDQ+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwib3B0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzbWFydC1vcHQtc2VlcnJcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29uZmlndXJlIFNlZXJyIHdpdGggUmFkYXJyICsgU29uYXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wbGV4XCIgY2hlY2tlZCBjbGFzcz1cImNoZWNrYm94LXNtXCIgLz5cbiAgICAgICAgICAgIENvbm5lY3QgUGxleCB0byBTZWVyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwib3B0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzbWFydC1vcHQtcHJvd2xhcnJcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQcm93bGFyciB0byBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zYXZlXCIgY2hlY2tlZCBjbGFzcz1cImNoZWNrYm94LXNtXCIgLz5cbiAgICAgICAgICAgIFNhdmUgQVBJIGtleXMgZm9yIG9uZS1jbGljayByZWNvbm5lY3RcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtY29ubmVjdC1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZTc0YzNjIDAlLCAjOWI1OWI2IDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxcmVtOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICBTbWFydCBDb25uZWN0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGhhc2UgMzogQ29ubmVjdGlvbiBQcm9ncmVzcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzbWFydC1waGFzZS1wcm9ncmVzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwiaGVhZGluZy1hY2NlbnQtc2VjdGlvblwiPkNvbm5lY3RpbmcgRXZlcnl0aGluZy4uLjwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1wcm9ncmVzcy1zdGVwc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSA0OiBSZXN1bHRzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1yZXN1bHRzLWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXBsZXgtbGlicmFyaWVzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNtYXJ0LXJldHJ5LWJ0blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogI2YzOWMxMjsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA1MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgUmV0cnkgRmFpbGVkIFN0ZXBzXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGEgaWQ9XCJzbWFydC1vcGVuLXNlZXJyXCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICBPcGVuIFNlZXJyXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEhlbHAgVGV4dCAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgPHN0cm9uZz5XaGVyZSB0byBmaW5kIEFQSSBrZXlzOjwvc3Ryb25nPjxicj5cbiAgICAgICAgUmFkYXJyL1NvbmFyci9Qcm93bGFycjogU2V0dGluZ3MgLT4gR2VuZXJhbCAtPiBTZWN1cml0eSAtPiBBUEkgS2V5XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFyci1zZXR1cC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fyci1zZXR1cC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fyci1zZXR1cC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fyci1zZXR1cC1jYW5jZWwnKTtcbiAgY29uc3QgY29ubmVjdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jb25uZWN0LWJ0bicpO1xuXG4gIC8vIFBoYXNlIGVsZW1lbnRzXG4gIGNvbnN0IHBoYXNlRGV0ZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBoYXNlLWRldGVjdCcpO1xuICBjb25zdCBwaGFzZUNyZWRlbnRpYWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzJyk7XG4gIGNvbnN0IHBoYXNlUHJvZ3Jlc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcHJvZ3Jlc3MnKTtcbiAgY29uc3QgcGhhc2VSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBoYXNlLXJlc3VsdHMnKTtcblxuICBjb25zdCBkZXRlY3RSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWRldGVjdC1yZXN1bHRzJyk7XG4gIGNvbnN0IGNyZWRlbnRpYWxJbnB1dHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtY3JlZGVudGlhbC1pbnB1dHMnKTtcbiAgY29uc3QgcHJvZ3Jlc3NTdGVwcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1wcm9ncmVzcy1zdGVwcycpO1xuICBjb25zdCByZXN1bHRzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1yZXN1bHRzLWNvbnRlbnQnKTtcbiAgY29uc3QgcGxleExpYnJhcmllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1wbGV4LWxpYnJhcmllcycpO1xuICBjb25zdCByZXRyeUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1yZXRyeS1idG4nKTtcblxuICBsZXQgZGV0ZWN0ZWREYXRhID0gbnVsbDsgLy8gU3RvcmUgZGV0ZWN0aW9uIHJlc3VsdHMgZm9yIHNtYXJ0LWNvbm5lY3RcblxuICBjb25zdCBzZXJ2aWNlSWNvbnMgPSB7IHBsZXg6ICdcdUQ4M0NcdURGQUMnLCByYWRhcnI6ICdcdUQ4M0NcdURGQUMnLCBzb25hcnI6ICdcdUQ4M0RcdURDRkEnLCBwcm93bGFycjogJ1x1RDgzRFx1REQwRCcsIHNlZXJyOiAnXHVEODNEXHVEQ0NCJyB9O1xuICBjb25zdCBzZXJ2aWNlTGFiZWxzID0geyBwbGV4OiAnUGxleCcsIHJhZGFycjogJ1JhZGFyciAoTW92aWVzKScsIHNvbmFycjogJ1NvbmFyciAoVFYpJywgcHJvd2xhcnI6ICdQcm93bGFyciAoSW5kZXhlcnMpJywgc2VlcnI6ICdTZWVycicgfTtcblxuICBmdW5jdGlvbiBzaG93UGhhc2UocGhhc2UpIHtcbiAgICBwaGFzZURldGVjdC5zdHlsZS5kaXNwbGF5ID0gcGhhc2UgPT09ICdkZXRlY3QnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZUNyZWRlbnRpYWxzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2NyZWRlbnRpYWxzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VQcm9ncmVzcy5zdHlsZS5kaXNwbGF5ID0gcGhhc2UgPT09ICdwcm9ncmVzcycgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlUmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gcGhhc2UgPT09ICdyZXN1bHRzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0dXNCYWRnZShzdGF0dXMpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICBjb25uZWN0ZWQ6IHsgYmc6ICd2YXIoLS1vay1mZyknLCBpY29uOiAnJiMxMDAwMzsnLCB0ZXh0OiAnQ29ubmVjdGVkJyB9LFxuICAgICAgbmVlZHNfa2V5OiB7IGJnOiAnI2YzOWMxMicsIGljb246ICcmIzEyODI3MzsnLCB0ZXh0OiAnTmVlZHMgQVBJIEtleScgfSxcbiAgICAgIG5vdF9mb3VuZDogeyBiZzogJ3ZhcigtLW11dGVkKScsIGljb246ICcmbWRhc2g7JywgdGV4dDogJ05vdCBGb3VuZCcgfSxcbiAgICAgIGVycm9yOiB7IGJnOiAndmFyKC0tYmFkLWZnKScsIGljb246ICcmIzEwMDA3OycsIHRleHQ6ICdFcnJvcicgfVxuICAgIH07XG4gICAgY29uc3QgYyA9IGNvbG9yc1tzdGF0dXNdIHx8IGNvbG9ycy5ub3RfZm91bmQ7XG4gICAgcmV0dXJuIGA8c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDRweDsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAke2MuYmd9IDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogJHtjLmJnfTtcIj4ke2MuaWNvbn0gJHtjLnRleHR9PC9zcGFuPmA7XG4gIH1cblxuICAvLyBQaGFzZSAxOiBTbWFydCBEZXRlY3Rpb25cbiAgYXN5bmMgZnVuY3Rpb24gc21hcnREZXRlY3QoKSB7XG4gICAgc2hvd1BoYXNlKCdkZXRlY3QnKTtcbiAgICBkZXRlY3RSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hcnIvc21hcnQtZGV0ZWN0Jyk7XG4gICAgICBkZXRlY3RlZERhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghZGV0ZWN0ZWREYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRldGVjdGlvbiBmYWlsZWQ6ICR7ZXNjYXBlSHRtbChkZXRlY3RlZERhdGEuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVuZGVyIGRldGVjdGlvbiByZXN1bHRzXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7XCI+JztcblxuICAgICAgZm9yIChjb25zdCBbc3ZjLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhkZXRlY3RlZERhdGEuc2VydmljZXMpKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXSB8fCAnXHVEODNEXHVEQ0U2JztcbiAgICAgICAgY29uc3QgbGFiZWwgPSBzZXJ2aWNlTGFiZWxzW3N2Y10gfHwgc3ZjO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBpbmZvLnNvdXJjZSA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAxcHggNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogM3B4O1wiPiR7ZXNjYXBlSHRtbChpbmZvLnNvdXJjZSl9PC9zcGFuPmAgOiAnJztcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGluZm8udmVyc2lvbiA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPnYke2VzY2FwZUh0bWwoaW5mby52ZXJzaW9uKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCBrZXlTYXZlZCA9IChpbmZvLmhhc0FwaUtleSB8fCBpbmZvLmhhc1Rva2VuKSAmJiBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCdcbiAgICAgICAgICA/ICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tb2stZmcpO1wiPktleSBzYXZlZDwvc3Bhbj4nIDogJyc7XG5cbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgcGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj4ke2ljb259PC9zcGFuPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7bGFiZWx9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICAgICAgJHtzb3VyY2V9ICR7dmVyc2lvbn0gJHtrZXlTYXZlZH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7c3RhdHVzQmFkZ2UoaW5mby5zdGF0dXMpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gICAgICAvLyBTdW1tYXJ5XG4gICAgICBjb25zdCBzID0gZGV0ZWN0ZWREYXRhLnN1bW1hcnk7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxEZXRlY3RlZCArICg1IC0gcy50b3RhbERldGVjdGVkKSkpfSBzZXJ2aWNlcyBkZXRlY3RlZCAmbWlkZG90O1xuICAgICAgICAke2VzY2FwZUh0bWwoU3RyaW5nKHMuZnVsbHlDb25uZWN0ZWQpKX0gY29ubmVjdGVkJHtzLm5lZWRzQXBpS2V5ID4gMCA/IGAgJm1pZGRvdDsgPHN0cm9uZz4ke2VzY2FwZUh0bWwoU3RyaW5nKHMubmVlZHNBcGlLZXkpKX0gbmVlZHMgQVBJIGtleTwvc3Ryb25nPmAgOiAnJ31cbiAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGRldGVjdFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgIC8vIEJ1aWxkIGNyZWRlbnRpYWwgaW5wdXRzIGZvciBzZXJ2aWNlcyB0aGF0IG5lZWQga2V5c1xuICAgICAgYnVpbGRDcmVkZW50aWFsSW5wdXRzKGRldGVjdGVkRGF0YSk7XG5cbiAgICAgIC8vIEF1dG8tYWR2YW5jZSBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2hvd1BoYXNlKCdjcmVkZW50aWFscycpO1xuICAgICAgfSwgODAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRldGVjdFJlc3VsdHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5FcnJvcjogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dCBmaWVsZHNcbiAgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsSW5wdXRzKGRhdGEpIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gZGF0YS5zZXJ2aWNlcztcbiAgICBjb25zdCBhcnJTZXJ2aWNlcyA9IFsncmFkYXJyJywgJ3NvbmFycicsICdwcm93bGFyciddO1xuXG4gICAgZm9yIChjb25zdCBzdmMgb2YgYXJyU2VydmljZXMpIHtcbiAgICAgIGNvbnN0IGluZm8gPSBzZXJ2aWNlc1tzdmNdO1xuICAgICAgaWYgKCFpbmZvIHx8IGluZm8uc3RhdHVzID09PSAnbm90X2ZvdW5kJyAmJiAhaW5mby51cmwpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBpY29uID0gc2VydmljZUljb25zW3N2Y107XG4gICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXTtcbiAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gaW5mby5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBpc0Nvbm5lY3RlZCA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknO1xuXG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2JvcmRlckNvbG9yfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj4ke2ljb259PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBpZD1cInNtYXJ0LSR7c3ZjfS1zdGF0dXNcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvOyBmb250LXNpemU6IDAuNzVyZW07XCI+XG4gICAgICAgICAgICAke2lzQ29ubmVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4mIzEwMDAzOyBDb25uZWN0ZWQ8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VVJMOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNtYXJ0LSR7c3ZjfS11cmxcIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpbmZvLnVybCB8fCAnJyl9XCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3NlZWRib3guY29tLyR7c3ZjfS9cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGZvbnQtc2l6ZTogMC44NXJlbTsgcGFkZGluZzogNnB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QVBJIEtleTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic21hcnQtJHtzdmN9LWtleVwiIHBsYWNlaG9sZGVyPVwiJHtpc0Nvbm5lY3RlZCA/ICcoc2F2ZWQpJyA6ICdQYXN0ZSBBUEkga2V5J31cIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGZvbnQtc2l6ZTogMC44NXJlbTsgcGFkZGluZzogNnB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1zbWFydC10ZXN0PVwiJHtzdmN9XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmc6IDRweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjtcIj5UZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIC8vIFBsZXggc3RhdHVzIChub24tZWRpdGFibGUsIGp1c3Qgc2hvd3Mgc3RhdHVzKVxuICAgIGNvbnN0IHBsZXggPSBzZXJ2aWNlcy5wbGV4O1xuICAgIGlmIChwbGV4KSB7XG4gICAgICBjb25zdCBwbGV4Q29ubmVjdGVkID0gcGxleC5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAke3BsZXhDb25uZWN0ZWQgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1ib3JkZXIpJ307IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlx1RDgzQ1x1REZBQzwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+UGxleDwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHBsZXguc3RhdHVzKX1cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvOyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHBsZXguc291cmNlIHx8ICcnKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBTZWVyciBzdGF0dXNcbiAgICBjb25zdCBzZWVyciA9IHNlcnZpY2VzLnNlZXJyO1xuICAgIGlmIChzZWVycikge1xuICAgICAgY29uc3Qgc2VlcnJPayA9IHNlZXJyLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBsZXQgY29uZmlndXJlZEh0bWwgPSAnJztcbiAgICAgIGlmIChzZWVyci5jb25maWd1cmVkU2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgY3MgPSBzZWVyci5jb25maWd1cmVkU2VydmljZXM7XG4gICAgICAgIGNvbmZpZ3VyZWRIdG1sID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5cbiAgICAgICAgICBDb25maWd1cmVkOiAke2NzLnJhZGFyciA/ICcmIzEwMDAzOyBSYWRhcnInIDogJyYjMTAwMDc7IFJhZGFycid9ICZtaWRkb3Q7XG4gICAgICAgICAgJHtjcy5zb25hcnIgPyAnJiMxMDAwMzsgU29uYXJyJyA6ICcmIzEwMDA3OyBTb25hcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3MucGxleCA/ICcmIzEwMDAzOyBQbGV4JyA6ICcmIzEwMDA3OyBQbGV4J31cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtzZWVyck9rID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0RcdURDQ0I8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlNlZXJyPC9zcGFuPlxuICAgICAgICAgICR7c3RhdHVzQmFkZ2Uoc2VlcnIuc3RhdHVzKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7Y29uZmlndXJlZEh0bWx9XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxJbnB1dHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAvLyBBdWRpdCBQMC0zOiB3YXMgaW5saW5lIG9uY2xpY2sgY2FsbGluZyBzbWFydFRlc3RDb25uZWN0aW9uIChkZWFkIHVuZGVyIENTUClcbiAgICBjcmVkZW50aWFsSW5wdXRzLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNtYXJ0LXRlc3RdJykuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cuc21hcnRUZXN0Q29ubmVjdGlvbihidG4uZGF0YXNldC5zbWFydFRlc3QpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRlc3QgY29ubmVjdGlvbiAoZ2xvYmFsIGZvciBvbmNsaWNrKVxuICB3aW5kb3cuc21hcnRUZXN0Q29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICBjb25zdCB1cmxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LXVybGApO1xuICAgIGNvbnN0IGtleUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtYXJ0LSR7c2VydmljZX0ta2V5YCk7XG4gICAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LXN0YXR1c2ApO1xuXG4gICAgY29uc3QgdXJsID0gdXJsSW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBhcGlLZXkgPSBrZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKCF1cmwgfHwgIWFwaUtleSkge1xuICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5FbnRlciBVUkwgYW5kIEFQSSBrZXk8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+JztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci90ZXN0LWNvbm5lY3Rpb24nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlLCB1cmwsIGFwaUtleSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JiMxMDAwMzsgJHtlc2NhcGVIdG1sKGRhdGEuYXBwTmFtZSB8fCAnQ29ubmVjdGVkJyl9IHYke2VzY2FwZUh0bWwoZGF0YS52ZXJzaW9uIHx8ICcnKX08L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JiMxMDAwNzsgJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IpfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JiMxMDAwNzsgJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9zcGFuPmA7XG4gICAgfVxuICB9O1xuXG4gIC8vIFBoYXNlIDM6IFNtYXJ0IENvbm5lY3RcbiAgYXN5bmMgZnVuY3Rpb24gc21hcnRDb25uZWN0KCkge1xuICAgIHNob3dQaGFzZSgncHJvZ3Jlc3MnKTtcbiAgICBwcm9ncmVzc1N0ZXBzLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj48ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPkNvbm5lY3Rpbmcgc2VydmljZXMuLi48L2Rpdj48L2Rpdj4nO1xuXG4gICAgLy8gR2F0aGVyIGlucHV0XG4gICAgY29uc3Qgc2VydmljZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBbJ3JhZGFycicsICdzb25hcnInLCAncHJvd2xhcnInXSkge1xuICAgICAgY29uc3QgdXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtYXJ0LSR7c3ZjfS11cmxgKT8udmFsdWUudHJpbSgpO1xuICAgICAgY29uc3QgYXBpS2V5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNtYXJ0LSR7c3ZjfS1rZXlgKT8udmFsdWUudHJpbSgpO1xuICAgICAgaWYgKGFwaUtleSAmJiB1cmwpIHtcbiAgICAgICAgc2VydmljZXNbc3ZjXSA9IHsgYXBpS2V5LCB1cmwgfTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpS2V5KSB7XG4gICAgICAgIC8vIEtleSBwcm92aWRlZCB3aXRob3V0IFVSTCAtIGxldCBiYWNrZW5kIHJlc29sdmVcbiAgICAgICAgc2VydmljZXNbc3ZjXSA9IHsgYXBpS2V5IH07XG4gICAgICB9XG4gICAgICAvLyBJZiBubyBrZXkgZW50ZXJlZCBidXQgc2VydmljZSB3YXMgYWxyZWFkeSBjb25uZWN0ZWQsIGJhY2tlbmQgdXNlcyBzdG9yZWQgY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgc2VydmljZXM6IE9iamVjdC5rZXlzKHNlcnZpY2VzKS5sZW5ndGggPiAwID8gc2VydmljZXMgOiB1bmRlZmluZWQsXG4gICAgICBjb25maWd1cmVQbGV4OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtb3B0LXBsZXgnKT8uY2hlY2tlZCxcbiAgICAgIGNvbmZpZ3VyZVByb3dsYXJyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtb3B0LXByb3dsYXJyJyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVTZWVycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zZWVycicpPy5jaGVja2VkLFxuICAgICAgc2F2ZUNyZWRlbnRpYWxzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtb3B0LXNhdmUnKT8uY2hlY2tlZFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvc21hcnQtY29ubmVjdCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFJlbmRlciBwcm9ncmVzcyBzdGVwc1xuICAgICAgbGV0IHN0ZXBzSHRtbCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgICBjb25zdCBpY29uID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JiMxMDAwMzs8L3NwYW4+J1xuICAgICAgICAgICAgICAgICAgIDogJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JiMxMDAwNzs8L3NwYW4+JztcbiAgICAgICAgY29uc3QgZGV0YWlsQ29sb3IgPSBzdGVwLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW11dGVkKScgOiAndmFyKC0tYmFkLWZnKSc7XG4gICAgICAgIHN0ZXBzSHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA2cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgJHtpY29ufVxuICAgICAgICAgIDxzcGFuPiR7ZXNjYXBlSHRtbChzdGVwLnN0ZXApfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvOyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAke2RldGFpbENvbG9yfTtcIj4ke2VzY2FwZUh0bWwoc3RlcC5kZXRhaWxzIHx8ICcnKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBwcm9ncmVzc1N0ZXBzLmlubmVySFRNTCA9IHN0ZXBzSHRtbDtcblxuICAgICAgLy8gU2hvdyByZXN1bHRzIGFmdGVyIGJyaWVmIGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNob3dSZXN1bHRzKGRhdGEpLCA1MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkNvbm5lY3Rpb24gZXJyb3I6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gUGhhc2UgNDogUmVzdWx0c1xuICBmdW5jdGlvbiBzaG93UmVzdWx0cyhkYXRhKSB7XG4gICAgc2hvd1BoYXNlKCdyZXN1bHRzJyk7XG5cbiAgICBjb25zdCBzID0gZGF0YS5zdW1tYXJ5IHx8IHt9O1xuICAgIGNvbnN0IGFsbEdvb2QgPSBzLmZhaWxlZCA9PT0gMCAmJiBzLnN1Y2NlZWRlZCA+IDA7XG4gICAgY29uc3QgaGVhZGVyQ29sb3IgPSBhbGxHb29kID8gJ3ZhcigtLW9rLWZnKScgOiAnI2YzOWMxMic7XG4gICAgY29uc3QgaGVhZGVySWNvbiA9IGFsbEdvb2QgPyAnJiMxMDAwMzsnIDogJyYjOTg4ODsnO1xuICAgIGNvbnN0IGhlYWRlclRleHQgPSBhbGxHb29kID8gJ0FsbCBDb25uZWN0ZWQhJyA6IGAke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbFN0ZXBzKSl9IFN0ZXBzIFN1Y2NlZWRlZGA7XG5cbiAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgJHtoZWFkZXJDb2xvcn0gMTIlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICR7aGVhZGVyQ29sb3J9OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS41cmVtOyBjb2xvcjogJHtoZWFkZXJDb2xvcn07XCI+JHtoZWFkZXJJY29ufTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogJHtoZWFkZXJDb2xvcn07XCI+JHtoZWFkZXJUZXh0fTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5zdWNjZWVkZWQpKX0gc3VjY2VlZGVkLCAke2VzY2FwZUh0bWwoU3RyaW5nKHMuZmFpbGVkKSl9IGZhaWxlZDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbiAgICAvLyBTdGVwcyBkZXRhaWxcbiAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0cHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgKGRhdGEuc3RlcHMgfHwgW10pKSB7XG4gICAgICBjb25zdCBpY29uID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JiMxMDAwMzs8L3NwYW4+J1xuICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDRweCA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAke2ljb259ICR7ZXNjYXBlSHRtbChzdGVwLnN0ZXApfSA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcblxuICAgIHJlc3VsdHNDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAvLyBTaG93IHJldHJ5IGJ1dHRvbiBpZiBhbnkgZmFpbHVyZXNcbiAgICByZXRyeUJ0bi5zdHlsZS5kaXNwbGF5ID0gcy5mYWlsZWQgPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgIC8vIEZldGNoIFBsZXggbGlicmFyaWVzIGlmIFBsZXggd2FzIGNvbm5lY3RlZFxuICAgIGlmIChkYXRhLnN0ZXBzPy5zb21lKHN0ID0+IHN0LnN0ZXAuaW5jbHVkZXMoJ1BsZXgnKSAmJiBzdC5zdGF0dXMgPT09ICdzdWNjZXNzJykpIHtcbiAgICAgIGZldGNoUGxleExpYnJhcmllcygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUGxleExpYnJhcmllcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvcGxleC9saWJyYXJpZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmxpYnJhcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5cdUQ4M0NcdURGQUMgJHtlc2NhcGVIdG1sKGRhdGEuc2VydmVyTmFtZSl9IExpYnJhcmllczwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA4cHg7XCI+YDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgZGF0YS5saWJyYXJpZXMpIHtcbiAgICAgICAgICBjb25zdCB0eXBlSWNvbiA9IGxpYi50eXBlID09PSAnbW92aWUnID8gJ1x1RDgzQ1x1REZBQycgOiBsaWIudHlwZSA9PT0gJ3Nob3cnID8gJ1x1RDgzRFx1RENGQScgOiAnXHVEODNDXHVERkI1JztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgICR7dHlwZUljb259IDxzdHJvbmc+JHtlc2NhcGVIdG1sKGxpYi50aXRsZSl9PC9zdHJvbmc+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKGxpYi5jb3VudCkpfSBpdGVtczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcGxleExpYnJhcmllcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgUGxleCBsaWJyYXJ5IGZldGNoIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZW50IGxpc3RlbmVyc1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgcGxleExpYnJhcmllcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHNtYXJ0RGV0ZWN0KCk7XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbiAgY29ubmVjdEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzbWFydENvbm5lY3QpO1xuICByZXRyeUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzbWFydENvbm5lY3QpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gTk9USUZJQ0FUSU9OIFNFVFRJTkdTID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbm90aWZpY2F0aW9ucy1tb2RhbCcsIGA8ZGl2IGlkPVwibm90aWZpY2F0aW9ucy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTUwcHg7IG1heC13aWR0aDogNjUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVERDE0IE5vdGlmaWNhdGlvbiBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDwhLS0gTWFzdGVyIFRvZ2dsZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY2NlbnQtaW5mby1ib3hcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibm90aWZpY2F0aW9ucy1lbmFibGVkXCIgLz5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5FbmFibGUgTm90aWZpY2F0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRpbnktbXV0ZWRcIj5SZWNlaXZlIGFsZXJ0cyB3aGVuIGNvbnRhaW5lcnMgZ28gdXAvZG93bjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUHJvdmlkZXJzIFNlY3Rpb24gLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5Ob3RpZmljYXRpb24gUHJvdmlkZXJzPC9oND5cblxuICAgICAgPCEtLSBEaXNjb3JkIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1wcm92aWRlciBwcm92aWRlci1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm92aWRlci1oZWFkZXJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGlzY29yZC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RGlzY29yZDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkaXNjb3JkLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkaXNjb3JkLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPldlYmhvb2sgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkaXNjb3JkLXdlYmhvb2tcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vZGlzY29yZC5jb20vYXBpL3YxL3dlYmhvb2tzLy4uLlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUZWxlZ3JhbSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInRlbGVncmFtLWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5UZWxlZ3JhbTwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJ0ZWxlZ3JhbS10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwidGVsZWdyYW0tY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Qm90IFRva2VuOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidGVsZWdyYW0tYm90LXRva2VuXCIgcGxhY2Vob2xkZXI9XCIxMjM0NTY6QUJDLi4uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGF0IElEOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidGVsZWdyYW0tY2hhdC1pZFwiIHBsYWNlaG9sZGVyPVwiLTEwMDEyMzQ1Njc4OTBcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbnRmeS5zaCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm50ZnktZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPm50Znkuc2g8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibnRmeS10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibnRmeS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlNlcnZlciBVUkw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJudGZ5LXNlcnZlclwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9udGZ5LnNoXCIgdmFsdWU9XCJodHRwczovL250Znkuc2hcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvcGljOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS10b3BpY1wiIHBsYWNlaG9sZGVyPVwiZGFzaGNhZGR5LWFsZXJ0c1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFbWFpbCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVtYWlsLWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5FbWFpbCAoU01UUCk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZW1haWwtdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImVtYWlsLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZnIgMWZyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TTVRQIEhvc3Q6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlbWFpbC1ob3N0XCIgcGxhY2Vob2xkZXI9XCJzbXRwLmdtYWlsLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+UG9ydDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZW1haWwtcG9ydFwiIHZhbHVlPVwiNTg3XCIgcGxhY2Vob2xkZXI9XCI1ODdcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+VXNlcm5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlbWFpbC11c2VyXCIgcGxhY2Vob2xkZXI9XCJ1c2VyQGdtYWlsLmNvbVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+UGFzc3dvcmQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiZW1haWwtcGFzc1wiIHBsYWNlaG9sZGVyPVwiYXBwIHBhc3N3b3JkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Gcm9tOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtZnJvbVwiIHBsYWNlaG9sZGVyPVwiRGFzaENhZGR5ICZsdDtub3JlcGx5QGV4YW1wbGUuY29tJmd0O1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+VG86PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlbWFpbC10b1wiIHBsYWNlaG9sZGVyPVwiYWRtaW5AZXhhbXBsZS5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IG1hcmdpbi10b3A6IDhweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1zZWN1cmVcIiAvPiBVc2UgVExTIChwb3J0IDQ2NSlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEhlYWx0aCBDaGVjayBTZXR0aW5ncyAtLT5cbiAgICAgIDxoNCBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPkhlYWx0aCBNb25pdG9yaW5nPC9oND5cbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImhlYWx0aC1jaGVjay1lbmFibGVkXCIgLz5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5FbmFibGUgSGVhbHRoIE1vbml0b3Jpbmc8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UGVyaW9kaWNhbGx5IGNoZWNrIGNvbnRhaW5lciBzdGF0dXM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jaGVjay1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkNoZWNrIGludGVydmFsOjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImhlYWx0aC1jaGVjay1pbnRlcnZhbFwiIHN0eWxlPVwid2lkdGg6IGF1dG87XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMVwiPjEgbWludXRlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNVwiIHNlbGVjdGVkPjUgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE1XCI+MTUgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMwXCI+MzAgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjYwXCI+MSBob3VyPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1jaGVjay1ub3dcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzVyZW07IG1hcmdpbi1sZWZ0OiBhdXRvO1wiPkNoZWNrIE5vdzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jaGVjay1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgIExhc3QgY2hlY2s6IE5ldmVyXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRXZlbnQgVHlwZXMgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5FdmVudHMgdG8gTm90aWZ5PC9oND5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtY29udGFpbmVyLWRvd25cIiBjaGVja2VkIC8+IENvbnRhaW5lciBEb3duXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtY29udGFpbmVyLXVwXCIgY2hlY2tlZCAvPiBDb250YWluZXIgUmVjb3ZlcmVkXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtZGVwbG95LXN1Y2Nlc3NcIiBjaGVja2VkIC8+IERlcGxveW1lbnQgU3VjY2Vzc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1mYWlsZWRcIiBjaGVja2VkIC8+IERlcGxveW1lbnQgRmFpbGVkXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtc3NsLWNlcnQtZXhwaXJ5XCIgY2hlY2tlZCAvPiBTU0wgRXhwaXJ5XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtZG5zLXByb3BhZ2F0aW9uXCIgY2hlY2tlZCAvPiBETlMgUHJvcGFnYXRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kcmlmdC1kZXRlY3RlZFwiIGNoZWNrZWQgLz4gQ29uZmlnIERyaWZ0XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtZGVwZW5kZW5jeS1yZXN0YXJ0XCIgY2hlY2tlZCAvPiBEZXBlbmRlbmN5IFJlc3RhcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtcmVjaXBlLXJlbW92ZWRcIiBjaGVja2VkIC8+IFJlY2lwZSBSZW1vdmVkXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtd29ya2Zsb3dcIiBjaGVja2VkIC8+IFdvcmtmbG93IEFjdGlvbnNcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1iYWNrdXAtY29tcGxldGVcIiBjaGVja2VkIC8+IEJhY2t1cCBDb21wbGV0ZVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWJhY2t1cC1mYWlsZWRcIiBjaGVja2VkIC8+IEJhY2t1cCBGYWlsZWRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC11cGRhdGUtYXZhaWxhYmxlXCIgY2hlY2tlZCAvPiBVcGRhdGVzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCIgc3R5bGU9XCJncmlkLWNvbHVtbjogMSAvIC0xO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXJlc291cmNlLWFsZXJ0XCIgY2hlY2tlZCAvPiBSZXNvdXJjZSBBbGVydHNcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEhpc3RvcnkgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5Ob3RpZmljYXRpb24gSGlzdG9yeTwvaDQ+XG4gICAgICA8ZGl2IGlkPVwibm90aWZpY2F0aW9uLWhpc3RvcnlcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDE1MHB4OyBvdmVyZmxvdy15OiBhdXRvOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gbm90aWZpY2F0aW9ucyB5ZXQ8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImxhc3Qtbm90aWZpY2F0aW9uLXNlbnRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiA2cHg7XCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zZW5kLXRlc3RcIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogYXV0bztcIj5TZW5kIFRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlIFNldHRpbmdzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk7XG4gIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1zYXZlJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLWNhbmNlbCcpO1xuXG4gIC8vIFByb3ZpZGVyIHRvZ2dsZSBoYW5kbGVyc1xuICBbJ2Rpc2NvcmQnLCAndGVsZWdyYW0nLCAnbnRmeScsICdlbWFpbCddLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWVuYWJsZWRgKTtcbiAgICBjb25zdCBjb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtwcm92aWRlcn0tY29uZmlnYCk7XG5cbiAgICBjaGVja2JveD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uZmlnLnN0eWxlLmRpc3BsYXkgPSBjaGVja2JveC5jaGVja2VkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrIHRvZ2dsZVxuICBjb25zdCBoZWFsdGhDaGVja0VuYWJsZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWVuYWJsZWQnKTtcbiAgY29uc3QgaGVhbHRoQ2hlY2tDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWNvbmZpZycpO1xuICBoZWFsdGhDaGVja0VuYWJsZWQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBoZWFsdGhDaGVja0NvbmZpZy5zdHlsZS5vcGFjaXR5ID0gaGVhbHRoQ2hlY2tFbmFibGVkLmNoZWNrZWQgPyAnMScgOiAnMC41JztcbiAgfSk7XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gY29uZmlnIGZyb20gQVBJXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWROb3RpZmljYXRpb25Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9jb25maWcnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZGF0YS5jb25maWc7XG5cbiAgICAgICAgLy8gTWFzdGVyIHRvZ2dsZVxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5lbmFibGVkO1xuXG4gICAgICAgIC8vIFByb3ZpZGVyc1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5wcm92aWRlcnM/LmRpc2NvcmQ/LmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZWxlZ3JhbS1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5wcm92aWRlcnM/LnRlbGVncmFtPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5wcm92aWRlcnM/Lm50Znk/LmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5lbmFibGVkIHx8IGZhbHNlO1xuXG4gICAgICAgIC8vIFNob3cvaGlkZSBjb25maWcgc2VjdGlvbnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtY29uZmlnJykuc3R5bGUuZGlzcGxheSA9IGNvbmZpZy5wcm92aWRlcnM/LmRpc2NvcmQ/LmVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tY29uZmlnJykuc3R5bGUuZGlzcGxheSA9IGNvbmZpZy5wcm92aWRlcnM/LnRlbGVncmFtPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktY29uZmlnJykuc3R5bGUuZGlzcGxheSA9IGNvbmZpZy5wcm92aWRlcnM/Lm50Znk/LmVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtY29uZmlnJykuc3R5bGUuZGlzcGxheSA9IGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgICAgICAvLyBudGZ5IHNlcnZlciBVUkxcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/Lm50Znk/LnNlcnZlclVybCkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LXNlcnZlcicpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5udGZ5LnNlcnZlclVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtYWlsIGZpZWxkcyBcdTIwMTQgREMtMDkyOiBwcmVmaWxsIHRoZSBGVUxMIGZvcm0gc28gYSBzYXZlIGRvZXNuJ3RcbiAgICAgICAgLy8gc2lsZW50bHkgd2lwZSBmaWVsZHMgdGhlIEdFVCByZXNwb25zZSBwcmV2aW91c2x5IG9taXR0ZWQuIFBhc3N3b3JkXG4gICAgICAgIC8vIGlzIG5ldmVyIHJldHVybmVkOyB3aGVuIG9uZSBpcyBzdG9yZWQgdGhlIGZpZWxkIHNob3dzIGEga2VlcC1oaW50XG4gICAgICAgIC8vIGFuZCBhbiBlbXB0eSBzdWJtaXQgcHJlc2VydmVzIHRoZSBzdG9yZWQgY3JlZGVudGlhbCBzZXJ2ZXItc2lkZS5cbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5ob3N0KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5ob3N0O1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LmZyb20pIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLmZyb207XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8udG8pIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC10bycpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC50bztcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5wb3J0KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcG9ydCcpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5wb3J0O1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LnNlY3VyZSAhPT0gdW5kZWZpbmVkKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtc2VjdXJlJykuY2hlY2tlZCA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwuc2VjdXJlID09PSB0cnVlO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LnVzZXJuYW1lKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdXNlcicpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC51c2VybmFtZTtcbiAgICAgICAgY29uc3QgZW1haWxQYXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcGFzcycpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/Lmhhc1Bhc3N3b3JkKSB7XG4gICAgICAgICAgZW1haWxQYXNzRWwudmFsdWUgPSAnJztcbiAgICAgICAgICBlbWFpbFBhc3NFbC5wbGFjZWhvbGRlciA9ICdzYXZlZCBcdTIwMTQgbGVhdmUgYmxhbmsgdG8ga2VlcCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1haWxQYXNzRWwucGxhY2Vob2xkZXIgPSAnYXBwIHBhc3N3b3JkJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhlYWx0aCBjaGVja1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWVuYWJsZWQnKS5jaGVja2VkID0gY29uZmlnLmhlYWx0aENoZWNrPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBpZiAoY29uZmlnLmhlYWx0aENoZWNrPy5pbnRlcnZhbE1pbnV0ZXMpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWludGVydmFsJykudmFsdWUgPSBjb25maWcuaGVhbHRoQ2hlY2suaW50ZXJ2YWxNaW51dGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaGVhbHRoQ2hlY2s/Lmxhc3RDaGVjaykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stc3RhdHVzJykudGV4dENvbnRlbnQgPVxuICAgICAgICAgICAgYExhc3QgY2hlY2s6ICR7bmV3IERhdGUoY29uZmlnLmhlYWx0aENoZWNrLmxhc3RDaGVjaykudG9Mb2NhbGVTdHJpbmcoKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXZlbnRzIFx1MjAxNCBjYW5vbmljYWwga2ViYWItY2FzZSBrZXlzLCBtYXRjaGluZyB0aGUgYmFja2VuZCBzdG9yZVxuICAgICAgICAvLyAoREMtMDkyOiBwcmV2aW91c2x5IHJlYWQgY2FtZWxDYXNlIGtleXMgdGhhdCBuZXZlciBleGlzdGVkLCBzb1xuICAgICAgICAvLyBldmVyeSB0b2dnbGUgcmUtcmVuZGVyZWQgYXMgJ2NoZWNrZWQnIHJlZ2FyZGxlc3Mgb2Ygc3RvcmVkIHN0YXRlKS5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci1kb3duJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnY29udGFpbmVyLWRvd24nXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItdXAnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydjb250YWluZXItdXAnXSA9PT0gdHJ1ZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnZGVwbG95LXN1Y2Nlc3MnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktZmFpbGVkJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnZGVwbG95LWZhaWxlZCddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXNzbC1jZXJ0LWV4cGlyeScpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ3NzbC1jZXJ0LWV4cGlyeSddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRucy1wcm9wYWdhdGlvbicpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2Rucy1wcm9wYWdhdGlvbiddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRyaWZ0LWRldGVjdGVkJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnZHJpZnQtZGV0ZWN0ZWQnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBlbmRlbmN5LXJlc3RhcnQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydkZXBlbmRlbmN5LXJlc3RhcnQnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZWNpcGUtcmVtb3ZlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ3JlY2lwZS1yZW1vdmVkJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtd29ya2Zsb3cnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWyd3b3JrZmxvdyddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWJhY2t1cC1jb21wbGV0ZScpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2JhY2t1cC1jb21wbGV0ZSddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWJhY2t1cC1mYWlsZWQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydiYWNrdXAtZmFpbGVkJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtdXBkYXRlLWF2YWlsYWJsZScpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ3VwZGF0ZS1hdmFpbGFibGUnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2FsZXJ0J10gIT09IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tOb3RpZmljYXRpb25zXSBMb2FkIENvbmZpZycsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZENvbmZpZycgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gaGlzdG9yeVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2hpc3Rvcnk/bGltaXQ9MTAnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb24taGlzdG9yeScpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3Rvcnk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGRhdGEuaGlzdG9yeS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW0udGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgIGNvbnN0IHR5cGVDb2xvcnMgPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICAgICAgIGVycm9yOiAndmFyKC0tYmFkLWZnKScsXG4gICAgICAgICAgICB3YXJuaW5nOiAnI2YzOWMxMicsXG4gICAgICAgICAgICBpbmZvOiAndmFyKC0tYWNjZW50KSdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogJHt0eXBlQ29sb3JzW2l0ZW0udHlwZV0gfHwgJ3ZhcigtLW11dGVkKSd9XCI+JHtpdGVtLnR5cGUgPT09ICdzdWNjZXNzJyA/ICdcdTI3MTMnIDogaXRlbS50eXBlID09PSAnZXJyb3InID8gJ1x1MjcxNycgOiAnXHUyMTM5J308L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDA7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiPiR7ZXNjYXBlSHRtbChpdGVtLnRpdGxlKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtkYXRlfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGA7XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBIaXN0b3J5JywgZXJyb3IsIHsgZnVuY3Rpb246ICdsb2FkSGlzdG9yeScgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2F2ZSBub3RpZmljYXRpb24gY29uZmlnXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgZW5hYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgIHByb3ZpZGVyczoge1xuICAgICAgICAgIGRpc2NvcmQ6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgd2ViaG9va1VybDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtd2ViaG9vaycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVsZWdyYW06IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZWxlZ3JhbS1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIGJvdFRva2VuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tYm90LXRva2VuJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgY2hhdElkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tY2hhdC1pZCcpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnRmeToge1xuICAgICAgICAgICAgZW5hYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBzZXJ2ZXJVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LXNlcnZlcicpLnZhbHVlLnRyaW0oKSB8fCAnaHR0cHM6Ly9udGZ5LnNoJyxcbiAgICAgICAgICAgIHRvcGljOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS10b3BpYycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW1haWw6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIGhvc3Q6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1ob3N0JykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgcG9ydDogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcnQnKS52YWx1ZSkgfHwgNTg3LFxuICAgICAgICAgICAgc2VjdXJlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtc2VjdXJlJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdXNlcicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcGFzcycpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgdG86IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC10bycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgJ2NvbnRhaW5lci1kb3duJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci1kb3duJykuY2hlY2tlZCxcbiAgICAgICAgICAnY29udGFpbmVyLXVwJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci11cCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ2RlcGxveS1zdWNjZXNzJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCxcbiAgICAgICAgICAnZGVwbG95LWZhaWxlZCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktZmFpbGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAnc3NsLWNlcnQtZXhwaXJ5JzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXNzbC1jZXJ0LWV4cGlyeScpLmNoZWNrZWQsXG4gICAgICAgICAgJ2Rucy1wcm9wYWdhdGlvbic6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kbnMtcHJvcGFnYXRpb24nKS5jaGVja2VkLFxuICAgICAgICAgICdkcmlmdC1kZXRlY3RlZCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kcmlmdC1kZXRlY3RlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ2RlcGVuZGVuY3ktcmVzdGFydCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBlbmRlbmN5LXJlc3RhcnQnKS5jaGVja2VkLFxuICAgICAgICAgICdyZWNpcGUtcmVtb3ZlZCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZWNpcGUtcmVtb3ZlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ3dvcmtmbG93JzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXdvcmtmbG93JykuY2hlY2tlZCxcbiAgICAgICAgICAnYmFja3VwLWNvbXBsZXRlJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWJhY2t1cC1jb21wbGV0ZScpLmNoZWNrZWQsXG4gICAgICAgICAgJ2JhY2t1cC1mYWlsZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtYmFja3VwLWZhaWxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ3VwZGF0ZS1hdmFpbGFibGUnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtdXBkYXRlLWF2YWlsYWJsZScpLmNoZWNrZWQsXG4gICAgICAgICAgJ2FsZXJ0JzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXJlc291cmNlLWFsZXJ0JykuY2hlY2tlZFxuICAgICAgICB9LFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgaW50ZXJ2YWxNaW51dGVzOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWludGVydmFsJykudmFsdWUpIHx8IDVcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm90aWZpY2F0aW9uIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHNhdmU6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBUZXN0IG5vdGlmaWNhdGlvbiBoYW5kbGVyc1xuICBhc3luYyBmdW5jdGlvbiB0ZXN0UHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3Rlc3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcm92aWRlciB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgJHtwcm92aWRlcn0gbm90aWZpY2F0aW9uIHNlbnQhYCwgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZGlzY29yZCcpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ3RlbGVncmFtJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCdudGZ5JykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZW1haWwnKSk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrIG5vdyBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1ub3cnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oZWFsdGgtY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICBgTGFzdCBjaGVjazogJHtuZXcgRGF0ZShkYXRhLmxhc3RDaGVjaykudG9Mb2NhbGVTdHJpbmcoKX0gKCR7ZGF0YS5jb250YWluZXJzTW9uaXRvcmVkfSBjb250YWluZXJzKWA7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0hlYWx0aCBjaGVjayBjb21wbGV0ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTW9kYWwgaGFuZGxlcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWROb3RpZmljYXRpb25Db25maWcoKTtcbiAgICBsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSgpO1xuICB9KTtcblxuICBzYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVOb3RpZmljYXRpb25Db25maWcpO1xuXG4gIC8vIFNlbmQgVGVzdCBidXR0b24gLSBzZW5kcyB0ZXN0IG5vdGlmaWNhdGlvbiB0byBhbGwgZW5hYmxlZCBwcm92aWRlcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2VuZC10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLXNlbmQtdGVzdCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnU2VuZGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc2VuZCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IFxuICAgICAgICAgIGV2ZW50OiAndGVzdCcsXG4gICAgICAgICAgZGF0YTogeyBtZXNzYWdlOiAnVGhpcyBpcyBhIHRlc3Qgbm90aWZpY2F0aW9uIGZyb20gRGFzaENhZGR5LicgfSxcbiAgICAgICAgICB0eXBlOiAnaW5mbydcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdUZXN0IG5vdGlmaWNhdGlvbiBzZW50IScsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIC8vIFVwZGF0ZSBsYXN0IHNlbnQgdGltZXN0YW1wXG4gICAgICAgIGxvYWROb3RpZmljYXRpb25TdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEucmVzdWx0cz8ubWFwKHIgPT4gYCR7ci5wcm92aWRlcn06ICR7ci5lcnJvciB8fCAnb2snfWApLmpvaW4oJywgJyl9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gc3RhdHVzIChsYXN0IHNlbnQgdGltZXN0YW1wKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmxhc3RTZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3RTZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFzdC1ub3RpZmljYXRpb24tc2VudCcpO1xuICAgICAgICBpZiAobGFzdFNlbnRFbCkge1xuICAgICAgICAgIGxhc3RTZW50RWwudGV4dENvbnRlbnQgPSBgTGFzdCBzZW50OiAke25ldyBEYXRlKGRhdGEubGFzdFNlbnQpLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIC0gc3RhdHVzIGlzIG5vdCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFBBTkVMIFRBQiBTV0lUQ0hJTkcgKHNoYXJlZCB1dGlsaXR5KSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCB0YWIgPSBlLnRhcmdldC5jbG9zZXN0KCcucGFuZWwtdGFiJyk7XG4gICAgaWYgKCF0YWIpIHJldHVybjtcbiAgICBjb25zdCBwYW5lbElkID0gdGFiLmRhdGFzZXQucGFuZWw7XG4gICAgaWYgKCFwYW5lbElkKSByZXR1cm47XG4gICAgY29uc3QgdGFiQmFyID0gdGFiLmNsb3Nlc3QoJy5wYW5lbC10YWJzJyk7XG4gICAgY29uc3QgbW9kYWxDb250ZW50ID0gdGFiQmFyLmNsb3Nlc3QoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICB0YWJCYXIucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgbW9kYWxDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC1zZWN0aW9uJykuZm9yRWFjaChzID0+IHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IG1vZGFsQ29udGVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHBhbmVsSWQpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBVTklGSUVEIEJBQ0tVUC9SRVNUT1JFIHYyLjAgPT09PT09PT09PVxuLy8gU2luZ2xlIGZpbGUgY2FwdHVyZXMgZXZlcnl0aGluZzogc2VydmVyIGNvbmZpZyArIGJyb3dzZXIgc3RhdGUgKyB0aGVtZXMgKyBlbmNyeXB0aW9uIGtleVxuKGZ1bmN0aW9uKCkge1xuICAvLyBBbGwgRGFzaENhZGR5IGxvY2FsU3RvcmFnZSBrZXlzIHRvIGluY2x1ZGUgaW4gYmFja3VwXG4gIHZhciBCUk9XU0VSX1NUQVRFX0tFWVMgPSBbXG4gICAgJ2Rhc2hjYWRkeV9zaXRlX2NvbmZpZycsICdkYXNoY2FkZHlfb25ib2FyZGluZycsICdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLFxuICAgICdkYXNoY2FkZHktc2V0dXAnLCAnZGFzaGNhZGR5LWNvbmZpZycsXG4gICAgJ3RoZW1lJywgJ3VzZXItdGhlbWVzJywgJ2N1c3RvbS10aGVtZScsXG4gICAgJ2N1c3RvbS1hcHBzJywgJ2N1c3RvbS1zZXJ2aWNlcycsICd0b29sYmFyLXNlY3Rpb25zJyxcbiAgICAnd2VhdGhlci1sb2NhdGlvbicsICd3ZWF0aGVyLXppcCcsICd3ZWF0aGVyLWdlbycsICd3ZWF0aGVyLXVuaXQnLFxuICAgICdjbG9jay1zdHlsZScsICdjbG9jay1jaGltZXMnLCAnY2xvY2stY2hpbWUtdm9sdW1lJ1xuICBdO1xuXG4gIC8vIENvbGxlY3QgYWxsIERhc2hDYWRkeSBicm93c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlXG4gIGZ1bmN0aW9uIGNvbGxlY3RCcm93c2VyU3RhdGUoKSB7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgLy8gR3JhYiBhbGwgd2hpdGVsaXN0ZWQga2V5c1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQlJPV1NFUl9TVEFURV9LRVlTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gQlJPV1NFUl9TVEFURV9LRVlTW2ldO1xuICAgICAgdmFyIHZhbCA9IHNhZmVHZXQoa2V5KTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHN0YXRlW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIC8vIEdyYWIgZHluYW1pYyB3aWRnZXQtKi1lbmFibGVkIGtleXNcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGsgPSBsb2NhbFN0b3JhZ2Uua2V5KGopO1xuICAgICAgICBpZiAoL153aWRnZXQtListZW5hYmxlZCQvLnRlc3QoaykpIHtcbiAgICAgICAgICBzdGF0ZVtrXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBwcml2YXRlIGJyb3dzaW5nICovIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBSZXN0b3JlIGJyb3dzZXIgc3RhdGUgZnJvbSBiYWNrdXAgaW50byBsb2NhbFN0b3JhZ2VcbiAgZnVuY3Rpb24gcmVzdG9yZUJyb3dzZXJTdGF0ZShicm93c2VyU3RhdGUpIHtcbiAgICBpZiAoIWJyb3dzZXJTdGF0ZSB8fCB0eXBlb2YgYnJvd3NlclN0YXRlICE9PSAnb2JqZWN0JykgcmV0dXJuIDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gYnJvd3NlclN0YXRlKSB7XG4gICAgICBpZiAoIWJyb3dzZXJTdGF0ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgICAgIHNhZmVTZXQoa2V5LCBicm93c2VyU3RhdGVba2V5XSk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgbGVnYWN5IHYxLjAuMCBpbXBvcnQtZXhwb3J0IGZvcm1hdCAocHJlLWJhY2t1cCBtb2RhbClcbiAgZnVuY3Rpb24gaXNMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLnZlcnNpb24gJiYgIWRhdGEuZmlsZXMgJiYgZGF0YS5zZXJ2aWNlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIC8vIE1hcCB0aGUgb2xkIGZsYXQga2V5cyBpbnRvIGJyb3dzZXJTdGF0ZSBmb3IgbG9jYWxTdG9yYWdlIHJlc3RvcmVcbiAgICB2YXIgYnJvd3NlclN0YXRlID0ge307XG4gICAgaWYgKGRhdGEuY3VzdG9tU2VydmljZXMpIGJyb3dzZXJTdGF0ZVsnY3VzdG9tLXNlcnZpY2VzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbVNlcnZpY2VzKTtcbiAgICBpZiAoZGF0YS5jdXN0b21BcHBzKSBicm93c2VyU3RhdGVbJ2N1c3RvbS1hcHBzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbUFwcHMpO1xuICAgIGlmIChkYXRhLndlYXRoZXJaaXApIGJyb3dzZXJTdGF0ZVsnd2VhdGhlci16aXAnXSA9IGRhdGEud2VhdGhlclppcDtcbiAgICBpZiAoZGF0YS50aGVtZSkgYnJvd3NlclN0YXRlWyd0aGVtZSddID0gZGF0YS50aGVtZTtcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzICYmIE9iamVjdC5rZXlzKGRhdGEudXNlclRoZW1lcykubGVuZ3RoKSBicm93c2VyU3RhdGVbJ3VzZXItdGhlbWVzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLnVzZXJUaGVtZXMpO1xuICAgIHJlc3RvcmVCcm93c2VyU3RhdGUoYnJvd3NlclN0YXRlKTtcblxuICAgIC8vIFB1c2ggc2VydmljZXMgdG8gc2VydmVyIGlmIGF2YWlsYWJsZVxuICAgIGlmIChkYXRhLnNlcnZpY2VzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YS5zZXJ2aWNlcylcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgIH1cblxuICAgIC8vIFB1c2ggdGhlbWVzIHRvIHNlcnZlciBpZiBhdmFpbGFibGVcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkYXRhLnVzZXJUaGVtZXMpLmZvckVhY2goZnVuY3Rpb24oc2x1Zykge1xuICAgICAgICB2YXIgdCA9IGRhdGEudXNlclRoZW1lc1tzbHVnXTtcbiAgICAgICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgICAgICAod2luZG93LlRIRU1FX1BST1BTIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHApIHsgaWYgKHRbcF0pIGNvbG9yc1twXSA9IHRbcF07IH0pO1xuICAgICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IHQubmFtZSB8fCBzbHVnLCBjb2xvcnM6IGNvbG9ycyB9KVxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdiYWNrdXAtbW9kYWwnLCBgPGRpdiBpZD1cImJhY2t1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTUwcHg7IG1heC13aWR0aDogNjUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0JFIEJhY2t1cCAmIFJlc3RvcmU8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBGdWxsIGJhY2t1cCBvZiB5b3VyIGVudGlyZSBEYXNoQ2FkZHkgc2V0dXAgXHUyMDE0IHNlcnZlciBjb25maWcsIGNyZWRlbnRpYWxzLCB0aGVtZXMsIGFuZCBicm93c2VyIHByZWZlcmVuY2VzIGluIG9uZSBmaWxlLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtbWFudWFsXCI+TWFudWFsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLXNjaGVkdWxlcy10YWJcIj5TY2hlZHVsZXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtZGlzay10YWJcIj5CYWNrdXBzIG9uIERpc2s8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCI+UG9pbnQtaW4tVGltZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTWFudWFsIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1tYW51YWxcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDwhLS0gRXhwb3J0IFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAxNSUsIHRyYW5zcGFyZW50KSwgY29sb3ItbWl4KGluIHNyZ2IsICMyZWNjNzEgMTAlLCB0cmFuc3BhcmVudCkpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjMjdhZTYwO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6ICMyZWNjNzE7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cdUQ4M0RcdURDRTQgRXhwb3J0IEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIERvd25sb2FkcyBldmVyeXRoaW5nIFx1MjAxNCBzZXJ2aWNlcywgQ2FkZHlmaWxlLCBjcmVkZW50aWFscywgZW5jcnlwdGlvbiBrZXksIHRoZW1lcywgYW5kIGFsbCBicm93c2VyIHByZWZlcmVuY2VzLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWV4cG9ydC1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjdhZTYwIDAlLCAjMmVjYzcxIDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdTJCMDdcdUZFMEYgRG93bmxvYWQgRnVsbCBCYWNrdXBcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJbXBvcnQgU2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGNvbG9yLW1peChpbiBzcmdiLCAjMzQ5OGRiIDE1JSwgdHJhbnNwYXJlbnQpLCBjb2xvci1taXgoaW4gc3JnYiwgIzI5ODBiOSAxMCUsIHRyYW5zcGFyZW50KSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICMzNDk4ZGI7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogIzM0OThkYjsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlx1RDgzRFx1RENFNSBSZXN0b3JlIEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIFVwbG9hZCBhIGJhY2t1cCBmaWxlIHRvIHJlc3RvcmUgeW91ciBlbnRpcmUgY29uZmlndXJhdGlvbiBcdTIwMTQgZHJhZyBhbmQgZHJvcCByZWFkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJiYWNrdXAtZmlsZS1pbnB1dFwiIGFjY2VwdD1cIi5qc29uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1zZWxlY3QtZmlsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMzNDk4ZGIgMCUsICMyOTgwYjkgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RENDMSBTZWxlY3QgQmFja3VwIEZpbGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWZpbGUtbmFtZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFByZXZpZXcgU2VjdGlvbiAoc2hvd24gYWZ0ZXIgZmlsZSBzZWxlY3RlZCkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IDAuOXJlbTtcIj5cdUQ4M0RcdURDQ0IgQmFja3VwIENvbnRlbnRzPC9oND5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXByZXZpZXctY29udGVudFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJiYWNrdXAtcmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgcmVzdG9yZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWRvLXJlc3RvcmUtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2U3NGMzYyAwJSwgI2MwMzkyYiAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3VsdCBNZXNzYWdlIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXJlc3VsdFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBTY2hlZHVsZXMgKFByZW1pdW0pIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtc2NoZWR1bGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0YwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNjaGVkdWxlcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQmFja3VwcyBvbiBEaXNrIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1kaXNrLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWRpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3VwIGZpbGVzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBQb2ludC1pbi1UaW1lIFJlc3RvcmUgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRpbnRpbWUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRUE8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEJhY2t1cCBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXAgaGlzdG9yeS4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbCcpO1xuICB2YXIgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKTtcbiAgdmFyIGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtY2FuY2VsJyk7XG4gIHZhciBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWV4cG9ydC1idG4nKTtcbiAgdmFyIHNlbGVjdEZpbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNlbGVjdC1maWxlJyk7XG4gIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWZpbGUtaW5wdXQnKTtcbiAgdmFyIGZpbGVOYW1lRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1maWxlLW5hbWUnKTtcbiAgdmFyIHByZXZpZXdEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXByZXZpZXcnKTtcbiAgdmFyIHByZXZpZXdDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgdmFyIHJlc3RvcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWRvLXJlc3RvcmUtYnRuJyk7XG4gIHZhciByZXN1bHREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3VsdCcpO1xuICB2YXIgc2NoZWR1bGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNjaGVkdWxlcy1jb250YWluZXInKTtcblxuICAvLyBBdWRpdCBQMC0zICgyMDI2LTEwLTI3KTogcHJlbWl1bSB1cHNlbGwgYnV0dG9ucyB1c2VkIGlubGluZSBvbmNsaWNrLFxuICAvLyB3aGljaCB0aGUgbWV0YSBDU1AgYmxvY2tzIFx1MjAxNCBkZWFkIGJ1dHRvbnMuIChUaGVpciBvbmNsaWNrIGFsc28gY2FsbGVkXG4gIC8vIHNjcm9sbFRvU2VjdGlvbignbGljZW5zZScpLCB3aGljaCBoYXMgTkVWRVIgZXhpc3RlZCBcdTIwMTQgZG91Ymx5IGRlYWQuKVxuICAvLyBkYXRhLXVwZ3JhZGUtbXNnICsgd2lyaW5nOyBsaWNlbnNlIFVJIG9wZW5zIHZpYSB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbC5cbiAgZnVuY3Rpb24gd2lyZVVwZ3JhZGVCdXR0b25zKHJvb3QpIHtcbiAgICBpZiAoIXJvb3QgfHwgIXJvb3QucXVlcnlTZWxlY3RvckFsbCkgcmV0dXJuO1xuICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdXBncmFkZS1tc2ddJykuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYnRuLmRhdGFzZXQudXBncmFkZU1zZywgJ2luZm8nKTtcbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKSB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIHZhciBkaXNrQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1kaXNrLWNvbnRhaW5lcicpO1xuICB2YXIgcG9pbnRpbnRpbWVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRpbnRpbWUtY29udGFpbmVyJyk7XG5cbiAgdmFyIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcblxuICAvLyBPcGVuIG1vZGFsXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwcmV2aWV3RGl2KSBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKGZpbGVOYW1lRGl2KSBmaWxlTmFtZURpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vID09PSBFWFBPUlQ6IFNlcnZlciBiYWNrdXAgKyBicm93c2VyIHN0YXRlIGluIG9uZSBmaWxlID09PVxuICBleHBvcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgZXhwb3J0QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gRXhwb3J0aW5nLi4uJztcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggc2VydmVyLXNpZGUgYmFja3VwIChjb25maWcsIHNlcnZpY2VzLCBjYWRkeWZpbGUsIGNyZWRlbnRpYWxzLCBlbmNyeXB0aW9uIGtleSwgdGhlbWVzLCBldGMuKVxuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3VwL2V4cG9ydCcpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIEFkZCBhbGwgYnJvd3NlciBsb2NhbFN0b3JhZ2Ugc3RhdGVcbiAgICAgIGRhdGEuYnJvd3NlclN0YXRlID0gY29sbGVjdEJyb3dzZXJTdGF0ZSgpO1xuXG4gICAgICAvLyBEb3dubG9hZCB1bmlmaWVkIGJhY2t1cFxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ2Rhc2hjYWRkeS1iYWNrdXAtJyArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJy5qc29uJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICBhLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuXG4gICAgICB2YXIgc3RhdGVDb3VudCA9IE9iamVjdC5rZXlzKGRhdGEuYnJvd3NlclN0YXRlKS5sZW5ndGg7XG4gICAgICB2YXIgdGhlbWVDb3VudCA9IGRhdGEudGhlbWVzID8gT2JqZWN0LmtleXMoZGF0YS50aGVtZXMpLmxlbmd0aCA6IDA7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBGdWxsIGJhY2t1cCBkb3dubG9hZGVkIFx1MjAxNCBzZXJ2ZXIgY29uZmlnICsgJyArIHN0YXRlQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MnICsgKHRoZW1lQ291bnQgPyAnICsgJyArIHRoZW1lQ291bnQgKyAnIHRoZW1lcycgOiAnJyk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgRXhwb3J0IGZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGdWxsIEJhY2t1cCc7XG4gIH0pO1xuXG4gIC8vIFNlbGVjdCBmaWxlIGJ1dHRvblxuICBzZWxlY3RGaWxlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBmaWxlSW5wdXQuY2xpY2soKTsgfSk7XG5cbiAgLy8gPT09IEZJTEUgU0VMRUNURUQ6IFByZXZpZXcgY29udGVudHMgPT09XG4gIGZpbGVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgZmlsZU5hbWVEaXYudGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0M0ICcgKyBmaWxlLm5hbWU7XG4gICAgZmlsZU5hbWVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgICB2YXIgYmFja3VwID0gSlNPTi5wYXJzZSh0ZXh0KTtcblxuICAgICAgLy8gSGFuZGxlIGxlZ2FjeSB2MS4wLjAgZm9ybWF0IChmcm9tIG9sZCBpbXBvcnQtZXhwb3J0LmpzKVxuICAgICAgaWYgKGlzTGVnYWN5Rm9ybWF0KGJhY2t1cCkpIHtcbiAgICAgICAgc2VsZWN0ZWRCYWNrdXAgPSBiYWNrdXA7XG4gICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxlZ2FjeSBmb3JtYXQgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPic7XG4gICAgICAgIGlmIChiYWNrdXAuc2VydmljZXM/Lmxlbmd0aCkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQ0IgJyArIGJhY2t1cC5zZXJ2aWNlcy5sZW5ndGggKyAnIHNlcnZpY2VzPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAuY3VzdG9tQXBwcz8ubGVuZ3RoKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzRFx1RENFNiAnICsgYmFja3VwLmN1c3RvbUFwcHMubGVuZ3RoICsgJyBjdXN0b20gYXBwczwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLnRoZW1lKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCBUaGVtZTogJyArIGVzY2FwZUh0bWwoYmFja3VwLnRoZW1lKSArICc8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC51c2VyVGhlbWVzKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCAnICsgT2JqZWN0LmtleXMoYmFja3VwLnVzZXJUaGVtZXMpLmxlbmd0aCArICcgY3VzdG9tIHRoZW1lczwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgICBwcmV2aWV3Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHYxLjErIC8gdjIuMCBmb3JtYXQgXHUyMDE0IHNlbmQgdG8gc2VydmVyIGZvciBwcmV2aWV3XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcHJldmlldycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShiYWNrdXApXG4gICAgICB9KTtcbiAgICAgIHZhciBwcmV2aWV3ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHByZXZpZXcuc3VjY2Vzcykge1xuICAgICAgICBzZWxlY3RlZEJhY2t1cCA9IGJhY2t1cDtcbiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+RXhwb3J0ZWQ6ICcgKyBuZXcgRGF0ZShiYWNrdXAuZXhwb3J0ZWRBdCkudG9Mb2NhbGVTdHJpbmcoKSArICcgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG5cbiAgICAgICAgLy8gU2VydmVyIGZpbGVzXG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPlNlcnZlciBDb25maWc8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJldmlldy5wcmV2aWV3LmZpbGVzKSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBwcmV2aWV3LnByZXZpZXcuZmlsZXNba2V5XTtcbiAgICAgICAgICB2YXIgaWNvbiA9IGluZm8uYWN0aW9uID09PSAnY3JlYXRlJyA/ICdcdUQ4M0NcdUREOTUnIDogJ1x1RDgzRFx1RENERCc7XG4gICAgICAgICAgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj4nICsgaWNvbiArICcgJyArIGVzY2FwZUh0bWwoaW5mby5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcblxuICAgICAgICAvLyBTZXJ2aWNlcyBjb3VudFxuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj4nICsgcHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCArICcgc2VydmljZXM8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbWVzXG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcudGhlbWVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5cdUQ4M0NcdURGQTggJyArIHByZXZpZXcucHJldmlldy50aGVtZUNvdW50ICsgJyBjdXN0b20gdGhlbWVzPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJyb3dzZXIgc3RhdGVcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy5icm93c2VyU3RhdGVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPkJyb3dzZXIgUHJlZmVyZW5jZXM8L2Rpdj4nO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNEXHVEREE1XHVGRTBGICcgKyBwcmV2aWV3LnByZXZpZXcuYnJvd3NlclN0YXRlQ291bnQgKyAnIHNhdmVkIHNldHRpbmdzICh0aGVtZSwgd2VhdGhlciwgY2xvY2ssIHdpZGdldHMsIGV0Yy4pPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpZXdDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjZBMFx1RkUwRiBJbnZhbGlkIGJhY2t1cCBmaWxlOiAnICsgZXNjYXBlSHRtbChwcmV2aWV3LmVycm9yKTtcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmMzljMTInO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgQ291bGQgbm90IHJlYWQgZmlsZTogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09IFJFU1RPUkU6IFNlcnZlciArIGJyb3dzZXIgc3RhdGUgPT09XG4gIHJlc3RvcmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFzZWxlY3RlZEJhY2t1cCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybSgnVGhpcyB3aWxsIG92ZXJ3cml0ZSB5b3VyIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgYnJvd3NlciBwcmVmZXJlbmNlcy4gQ29udGludWU/JykpIHJldHVybjtcbiAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IFJlc3RvcmluZy4uLic7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgZm9ybWF0XG4gICAgICBpZiAoaXNMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApKSB7XG4gICAgICAgIHJlc3RvcmVMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBMZWdhY3kgYmFja3VwIHJlc3RvcmVkIFx1MjAxNCBicm93c2VyIHNldHRpbmdzIGFuZCBzZXJ2aWNlcyBpbXBvcnRlZC4nO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMjAwMCk7XG4gICAgICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdjEuMSsgLyB2Mi4wIFx1MjAxNCByZXN0b3JlIHNlcnZlci1zaWRlIGZpcnN0XG4gICAgICB2YXIgcmVsb2FkQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlbG9hZC1jYWRkeScpPy5jaGVja2VkID8/IHRydWU7XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcmVzdG9yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGJhY2t1cDogc2VsZWN0ZWRCYWNrdXAsIG9wdGlvbnM6IHsgcmVsb2FkQ2FkZHk6IHJlbG9hZENhZGR5IH0gfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFRoZW4gcmVzdG9yZSBicm93c2VyIHN0YXRlXG4gICAgICB2YXIgYnJvd3NlckNvdW50ID0gMDtcbiAgICAgIGlmIChzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpIHtcbiAgICAgICAgYnJvd3NlckNvdW50ID0gcmVzdG9yZUJyb3dzZXJTdGF0ZShzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHZhciBtc2cgPSAnXHUyNzA1ICcgKyBkYXRhLm1lc3NhZ2U7XG4gICAgICAgIGlmIChicm93c2VyQ291bnQgPiAwKSBtc2cgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MgcmVzdG9yZWQ8L3NtYWxsPic7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHMuY2FkZHlSZWxvYWRlZCkgbXNnICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DYWRkeSBjb25maWd1cmF0aW9uIHJlbG9hZGVkPC9zbWFsbD4nO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gbXNnO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDIwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI2QTBcdUZFMEYgJyArIGVzY2FwZUh0bWwoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGJyb3dzZXJDb3VudCA+IDApIHJlc3VsdERpdi5pbm5lckhUTUwgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3Mgd2VyZSByZXN0b3JlZDwvc21hbGw+JztcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cz8uZXJyb3JzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCArPSAnPGJyPjxzbWFsbD4nICsgZGF0YS5yZXN1bHRzLmVycm9ycy5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gZXNjYXBlSHRtbChlLmZpbGUpICsgJzogJyArIGVzY2FwZUh0bWwoZS5lcnJvcik7IH0pLmpvaW4oJywgJykgKyAnPC9zbWFsbD4nO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2YzOWMxMic7XG4gICAgICB9XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgUmVzdG9yZSBmYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJ1x1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmcnO1xuICB9KTtcblxuICAvLyA9PT0gU2NoZWR1bGVzIFRhYiAoUHJlbWl1bSkgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTY2hlZHVsZXNUYWIoKSB7XG4gICAgaWYgKCFzY2hlZHVsZUNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5wcmVtaXVtUmVxdWlyZWQpIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAycmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlx1MkI1MDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlByZW1pdW0gRmVhdHVyZTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tYmFja3VwIHNjaGVkdWxpbmcgcmVxdWlyZXMgYSBEYXNoQ2FkZHkgUHJlbWl1bSBzdWJzY3JpcHRpb24uPC9kaXY+JyArXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdXBncmFkZS1tc2c9XCJVcGdyYWRlIHRvIFByZW1pdW0gdG8gZW5hYmxlIGF1dG8tYmFja3VwcyFcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjM5YzEyLCAjZTY3ZTIyKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgdG8gUHJlbWl1bTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB3aXJlVXBncmFkZUJ1dHRvbnMoc2NoZWR1bGVDb250YWluZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgc2NoZWR1bGVzJyk7XG4gICAgICBcbiAgICAgIHZhciBzY2hlZHVsZXMgPSBkYXRhLnNjaGVkdWxlcyB8fCBbXTtcbiAgICAgIFxuICAgICAgaWYgKHNjaGVkdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRjA8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIHNjaGVkdWxlcyBjb25maWd1cmVkPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlNlbGVjdCBhcHBzIGJlbG93IHRvIGVuYWJsZSBhdXRvLWJhY2t1cDwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNjaCA9IHNjaGVkdWxlc1tpXTtcbiAgICAgICAgdmFyIG5leHRSdW5TdHIgPSBzY2gubmV4dFJ1biA/IG5ldyBEYXRlKHNjaC5uZXh0UnVuKS50b0xvY2FsZVN0cmluZygpIDogJ05vdCBzY2hlZHVsZWQnO1xuICAgICAgICB2YXIgbGFzdFJ1blN0ciA9IHNjaC5sYXN0UnVuID8gbmV3IERhdGUoc2NoLmxhc3RSdW4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnTmV2ZXInO1xuICAgICAgICBcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzY2hlZHVsZS10b2dnbGVcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIicgKyAoc2NoLmVuYWJsZWQgPyAnIGNoZWNrZWQnIDogJycpICsgJyAvPicgK1xuICAgICAgICAgICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIChzY2guZW5hYmxlZCA/ICdPTicgOiAnT0ZGJykgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICcgIDwvbGFiZWw+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgZm9udC1zaXplOiAwLjhyZW07IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+U2NoZWR1bGU6PC9zcGFuPiA8c2VsZWN0IGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggNnB4O1wiPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImhvdXJseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdob3VybHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkhvdXJseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICd3ZWVrbHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPldlZWtseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnbW9udGhseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+TW9udGhseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgIDwvc2VsZWN0PjwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPktlZXAgbGFzdDo8L3NwYW4+IDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJyZXRlbnRpb24taW5wdXRcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiB2YWx1ZT1cIicgKyAoc2NoLnJldGVudGlvbj8ua2VlcCB8fCA3KSArICdcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMnB4IDZweDtcIiAvPjwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2Pk5leHQgcnVuOiAnICsgZXNjYXBlSHRtbChuZXh0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2Pkxhc3QgcnVuOiAnICsgZXNjYXBlSHRtbChsYXN0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwic2NoZWR1bGUtcnVuLW5vd1wiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1vay1mZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1MjVCNlx1RkUwRiBSdW4gTm93PC9idXR0b24+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInNjaGVkdWxlLWRlbGV0ZVwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1RDgzRFx1REREMVx1RkUwRiBSZW1vdmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgXG4gICAgICAvLyBBZGQgXCJBZGQgU2NoZWR1bGVcIiBzZWN0aW9uIGF0IGJvdHRvbVxuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1Mjc5NSBBZGQgTmV3IFNjaGVkdWxlPC9oND4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwO1wiPicgK1xuICAgICAgICAnICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm5ldy1zY2hlZHVsZS1hcHBpZFwiIHBsYWNlaG9sZGVyPVwiQXBwIElEIChlLmcuLCBwbGV4LCBzb25hcnIpXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDE1MHB4OyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCIgLz4nICtcbiAgICAgICAgJyAgPHNlbGVjdCBpZD1cIm5ldy1zY2hlZHVsZS1pbnRlcnZhbFwiIHN0eWxlPVwicGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJob3VybHlcIj5Ib3VybHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIiBzZWxlY3RlZD5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIj5XZWVrbHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiPk1vbnRobHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiNmhcIj5FdmVyeSA2IGhvdXJzPC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIjMwbVwiPkV2ZXJ5IDMwIG1pbnV0ZXM8L29wdGlvbj4nICtcbiAgICAgICAgJyAgPC9zZWxlY3Q+JyArXG4gICAgICAgICcgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJuZXctc2NoZWR1bGUtcmV0ZW50aW9uXCIgdmFsdWU9XCI3XCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIHBsYWNlaG9sZGVyPVwiS2VlcFwiIHN0eWxlPVwid2lkdGg6IDcwcHg7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIiAvPicgK1xuICAgICAgICAnICA8YnV0dG9uIGlkPVwiYWRkLXNjaGVkdWxlLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5BZGQgU2NoZWR1bGU8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JztcbiAgICAgIFxuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIFxuICAgICAgLy8gV2lyZSB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS10b2dnbGUnKS5mb3JFYWNoKGZ1bmN0aW9uKHRvZ2dsZSkge1xuICAgICAgICB0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKHRvZ2dsZS5kYXRhc2V0LmFwcGlkLCB7IGVuYWJsZWQ6IHRvZ2dsZS5jaGVja2VkIH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXNlbGVjdCcpLmZvckVhY2goZnVuY3Rpb24oc2VsKSB7XG4gICAgICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUoc2VsLmRhdGFzZXQuYXBwaWQsIHsgc2NoZWR1bGU6IHNlbC52YWx1ZSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXRlbnRpb24taW5wdXQnKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCkge1xuICAgICAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKGlucC5kYXRhc2V0LmFwcGlkLCB7IHJldGVudGlvbjogeyBrZWVwOiBwYXJzZUludChpbnAudmFsdWUpIHx8IDcgfSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1ydW4tbm93JykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJ1bkJhY2t1cE5vdyhidG4uZGF0YXNldC5hcHBpZCk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtZGVsZXRlJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGRlbGV0ZVNjaGVkdWxlKGJ0bi5kYXRhc2V0LmFwcGlkKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2NoZWR1bGUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkTmV3U2NoZWR1bGUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkIHRvIGxvYWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjaGVkdWxlKGFwcElkLCB1cGRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBwSWQsIC4uLnVwZGF0ZXMgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSB1cGRhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdVcGRhdGUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTsgLy8gUmVmcmVzaCBvbiBmYWlsdXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gcnVuQmFja3VwTm93KGFwcElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL2JhY2t1cC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdCYWNrdXAgc3RhcnRlZCBmb3IgJyArIGFwcElkICsgJyEnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQmFja3VwIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNjaGVkdWxlKGFwcElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZW1vdmUgYmFja3VwIHNjaGVkdWxlIGZvciAnICsgYXBwSWQgKyAnPycpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIHJlbW92ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZE5ld1NjaGVkdWxlKCkge1xuICAgIHZhciBhcHBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtYXBwaWQnKT8udmFsdWU/LnRyaW0oKTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWludGVydmFsJyk/LnZhbHVlIHx8ICdkYWlseSc7XG4gICAgdmFyIHJldGVudGlvbiA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtcmV0ZW50aW9uJyk/LnZhbHVlKSB8fCA3O1xuICAgIFxuICAgIGlmICghYXBwSWQpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhbiBBcHAgSUQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZCwgc2NoZWR1bGU6IGludGVydmFsLCByZXRlbnRpb246IHsga2VlcDogcmV0ZW50aW9uIH0sIGVuYWJsZWQ6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSBjcmVhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTtcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXRzXG4gICAgICAgIHZhciBhcHBJZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1hcHBpZCcpO1xuICAgICAgICBpZiAoYXBwSWRJbnB1dCkgYXBwSWRJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gPT09IEJhY2t1cHMgb24gRGlzayBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWREaXNrQmFja3VwcygpIHtcbiAgICBpZiAoIWRpc2tDb250YWluZXIpIHJldHVybjtcbiAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9maWxlcycpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCcpO1xuXG4gICAgICB2YXIgZmlsZXMgPSBkYXRhLmZpbGVzIHx8IFtdO1xuXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIGZpbGVzIG9uIGRpc2s8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+UnVuIGEgYmFja3VwIHRvIGNyZWF0ZSBiYWNrdXAgZmlsZXM8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHcm91cCBieSBhcHBJZFxuICAgICAgdmFyIGJ5QXBwID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmID0gZmlsZXNbaV07XG4gICAgICAgIHZhciBhcHBJZCA9IGYuYXBwSWQgfHwgJ3Vua25vd24nO1xuICAgICAgICBpZiAoIWJ5QXBwW2FwcElkXSkgYnlBcHBbYXBwSWRdID0gW107XG4gICAgICAgIGJ5QXBwW2FwcElkXS5wdXNoKGYpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPicgKyBmaWxlcy5sZW5ndGggKyAnIGJhY2t1cCBmaWxlKHMpIGFjcm9zcyAnICsgT2JqZWN0LmtleXMoYnlBcHApLmxlbmd0aCArICcgYXBwKHMpPC9kaXY+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7XCI+JztcblxuICAgICAgdmFyIGFwcElkcyA9IE9iamVjdC5rZXlzKGJ5QXBwKS5zb3J0KCk7XG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGFwcElkcy5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgYXBwSWQgPSBhcHBJZHNbYV07XG4gICAgICAgIHZhciBhcHBGaWxlcyA9IGJ5QXBwW2FwcElkXTtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgb3ZlcmZsb3c6IGhpZGRlbjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwoYXBwSWQpICsgJyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4oJyArIGFwcEZpbGVzLmxlbmd0aCArICcgYmFja3VwKHMpKTwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFwcEZpbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGYgPSBhcHBGaWxlc1tqXTtcbiAgICAgICAgICB2YXIgZGF0ZVN0ciA9IG5ldyBEYXRlKGYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGYuc2l6ZUZvcm1hdHRlZCArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGVTdHIgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cImRpc2stY29tcGFyZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyO1wiPkNvbXBhcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJkaXNrLXJlc3RvcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tb2stZmcpLCAjMjdhZTYwKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPlJlc3RvcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gICAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgdXAgYnV0dG9uc1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1jb21wYXJlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb21wYXJlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXN0b3JlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG4gIFxuICAvLyA9PT0gQmFja3VwIEhpc3RvcnkgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQmFja3VwSGlzdG9yeSgpIHtcbiAgICBpZiAoIWhpc3RvcnlDb250YWluZXIpIHJldHVybjtcbiAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9oaXN0b3J5P2xpbWl0PTUwJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NCPC9zcGFuPiBObyBiYWNrdXAgaGlzdG9yeSB5ZXQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5oaXN0b3J5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiayA9IGRhdGEuaGlzdG9yeVtpXTtcbiAgICAgICAgdmFyIHNpemVNQiA9IGJrLnNpemUgPyAoYmsuc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpIDogJz8nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPicgKyBlc2NhcGVIdG1sKGJrLm5hbWUgfHwgJ2JhY2t1cCcpICsgJzwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlICcgKyAoYmsuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnc3VjY2VzcycgOiAnZG93bicpICsgJ1wiPicgKyBlc2NhcGVIdG1sKGJrLnN0YXR1cykgKyAnPC9zcGFuPic7XG4gICAgICAgIGlmIChiay5zdGF0dXMgPT09ICdzdWNjZXNzJykgaHRtbCArPSAnICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2t1cC1yZXN0b3JlLWJ0blwiIGRhdGEtYmFja3VwLWlkPVwiJyArIGVzY2FwZUh0bWwoYmsuaWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPlJlc3RvcmU8L2J1dHRvbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgICcgKyBuZXcgRGF0ZShiay50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCkgKyAnIHwgJyArIHNpemVNQiArICcgTUIgfCAnICsgKGJrLmR1cmF0aW9uID8gKGJrLmR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgxKSArICdzJyA6ICctLScpO1xuICAgICAgICBpZiAoYmsuZW5jcnlwdGVkKSBodG1sICs9ICcgfCBcdUQ4M0RcdUREMTInO1xuICAgICAgICBodG1sICs9ICcgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYmFja3VwLXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHdpbmRvdy5fX3Jlc3RvcmVTZXJ2ZXJCYWNrdXAoYnRuLmRhdGFzZXQuYmFja3VwSWQpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgd2luZG93Ll9fcmVzdG9yZVNlcnZlckJhY2t1cCA9IGFzeW5jIGZ1bmN0aW9uKGJhY2t1cElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZXN0b3JlIGZyb20gdGhpcyBzZXJ2ZXIgYmFja3VwPyBUaGlzIHdpbGwgb3ZlcndyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9yZXN0b3JlLycgKyBiYWNrdXBJZCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzdG9yZVNlcnZpY2VzOiB0cnVlLCByZXN0b3JlQ29uZmlnOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpOyB9XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTY2hlZHVsZXNUYWIpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1kaXNrLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrQmFja3Vwcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRQb2ludEluVGltZVRhYik7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLWhpc3RvcnktdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEJhY2t1cEhpc3RvcnkpO1xuXG4gIC8vID09PT09IFBvaW50LWluLVRpbWUgUmVzdG9yZSBUYWIgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFBvaW50SW5UaW1lVGFiKCkge1xuICAgIGlmICghcG9pbnRpbnRpbWVDb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIENoZWNrIHByZW1pdW1cbiAgICB0cnkge1xuICAgICAgdmFyIGxpY2Vuc2VSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL3N0YXR1cycpO1xuICAgICAgdmFyIGxpY2Vuc2VEYXRhID0gYXdhaXQgbGljZW5zZVJlcy5qc29uKCk7XG4gICAgICBpZiAobGljZW5zZURhdGEudGllciAhPT0gJ3ByZW1pdW0nKSB7XG4gICAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cInBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cdTJCNTA8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5QcmVtaXVtIEZlYXR1cmU8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Qb2ludC1pbi10aW1lIHJlc3RvcmUgcmVxdWlyZXMgRGFzaENhZGR5IFByZW1pdW0gd2l0aCBhdXRvLWJhY2t1cCBlbmFibGVkLjwvZGl2PicgK1xuICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXVwZ3JhZGUtbXNnPVwiVXBncmFkZSB0byBQcmVtaXVtIGZvciBwb2ludC1pbi10aW1lIHJlc3RvcmUhXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2YzOWMxMiwgI2U2N2UyMik7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5VcGdyYWRlIHRvIFByZW1pdW08L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgd2lyZVVwZ3JhZGVCdXR0b25zKHBvaW50aW50aW1lQ29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cblxuICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIHNlcnZpY2VzIGZvciBkcm9wZG93blxuICAgICAgdmFyIHNlcnZpY2VzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMnKTtcbiAgICAgIHZhciBzZXJ2aWNlc0RhdGEgPSBhd2FpdCBzZXJ2aWNlc1Jlcy5qc29uKCk7XG4gICAgICB2YXIgc2VydmljZXMgPSBzZXJ2aWNlc0RhdGEuc2VydmljZXMgfHwgW107XG5cbiAgICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj4gTm8gYXBwcyBkZXBsb3llZCB5ZXQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiA4cHggMCAxMnB4O1wiPicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPicgK1xuICAgICAgICAnICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+QXBwOjwvbGFiZWw+JyArXG4gICAgICAgICcgIDxzZWxlY3QgaWQ9XCJwaXQtYXBwLXNlbGVjdFwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBtYXgtd2lkdGg6IDI0MHB4O1wiPic7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgZXNjYXBlSHRtbChzZXJ2aWNlc1tpXS5pZCB8fCBzZXJ2aWNlc1tpXS5uYW1lIHx8ICcnKSArICdcIj4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHNlcnZpY2VzW2ldLm5hbWUgfHwgc2VydmljZXNbaV0uaWQgfHwgJycpICsgJzwvb3B0aW9uPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3NlbGVjdD4nICtcbiAgICAgICAgJyAgPGJ1dHRvbiBpZD1cInBpdC1sb2FkLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5Mb2FkIEJhY2t1cHM8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPGRpdiBpZD1cInBpdC1iYWNrdXBzLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPjwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JztcblxuICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1sb2FkLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXBwSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWFwcC1zZWxlY3QnKT8udmFsdWU7XG4gICAgICAgIGlmIChhcHBJZCkgbG9hZFBvaW50SW5UaW1lQmFja3VwcyhhcHBJZCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkUG9pbnRJblRpbWVCYWNrdXBzKGFwcElkKSB7XG4gICAgdmFyIGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtYmFja3Vwcy1saXN0Jyk7XG4gICAgaWYgKCFsaXN0RWwpIHJldHVybjtcblxuICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3Vwcy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvZmlsZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCkpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5maWxlcyB8fCBkYXRhLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj4gTm8gYmFja3VwIGZpbGVzIGZvciAnICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGEuZmlsZXMubGVuZ3RoICsgJyBiYWNrdXAocyk8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj4nO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBkYXRhLmZpbGVzW2ldO1xuICAgICAgICB2YXIgZGF0ZVN0ciA9IG5ldyBEYXRlKGYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZi5zaXplRm9ybWF0dGVkICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgKyBkYXRlU3RyICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInBpdC1jb21wYXJlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyO1wiPkNvbXBhcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwicGl0LXJlc3RvcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLW9rLWZnKSwgIzI3YWU2MCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5SZXN0b3JlPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAvLyBXaXJlIHVwIGJ1dHRvbnNcbiAgICAgIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcucGl0LWNvbXBhcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGNvbXBhcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnBpdC1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXN0b3JlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb21wYXJlQmFja3VwRmlsZShhcHBJZCwgZmlsZW5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvY29tcGFyZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb21wYXJlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmID0gZGF0YS5kaWZmO1xuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNSk7IHotaW5kZXg6IDEwMDAwOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiBpZD1cImNvbXBhcmUtb3ZlcmxheVwiPicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAxMnB4OyBtYXgtd2lkdGg6IDYwMHB4OyB3aWR0aDogOTAlOyBtYXgtaGVpZ2h0OiA4MHZoOyBvdmVyZmxvdzogYXV0bzsgcGFkZGluZzogMjBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgJzxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDE2cHg7XCI+XHVEODNEXHVEQ0NBIENvbXBhcmU6ICcgKyBlc2NhcGVIdG1sKGZpbGVuYW1lKSArICc8L2g0PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlNpemU6ICcgKyAoZGlmZi5zaXplRm9ybWF0dGVkIHx8ICc/JykgKyAnIHwgQ3JlYXRlZDogJyArIG5ldyBEYXRlKGRpZmYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpICsgJzwvZGl2Pic7XG5cbiAgICAgIGlmIChkaWZmLnNlcnZpY2VzKSB7XG4gICAgICAgIHZhciBzdmNDaGFuZ2VkID0gZGlmZi5zZXJ2aWNlcy5oYXNDaGFuZ2VzID8gJ1x1RDgzRFx1REQzNCcgOiAnXHVEODNEXHVERkUyJztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgKyBzdmNDaGFuZ2VkICsgJyBTZXJ2aWNlcyAoYmFja3VwIHZzIGN1cnJlbnQpPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5CYWNrdXA6ICcgKyBkaWZmLnNlcnZpY2VzLmJhY2t1cENvdW50ICsgJyBzZXJ2aWNlcyB8IEN1cnJlbnQ6ICcgKyBkaWZmLnNlcnZpY2VzLmN1cnJlbnRDb3VudCArICcgc2VydmljZXM8L2Rpdj4nO1xuICAgICAgICBpZiAoZGlmZi5zZXJ2aWNlcy5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjZjM5YzEyO1wiPlNlcnZpY2VzIGRpZmZlciBcdTIwMTQgcmVzdG9yaW5nIHdpbGwgcmVwbGFjZSBjdXJyZW50IGNvbmZpZ3VyYXRpb248L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWZmLmNvbmZpZykge1xuICAgICAgICB2YXIgY2ZnQ2hhbmdlZCA9IGRpZmYuY29uZmlnLmhhc0NoYW5nZXMgPyAnXHVEODNEXHVERDM0JyA6ICdcdUQ4M0RcdURGRTInO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArIGNmZ0NoYW5nZWQgKyAnIENvbmZpZ3VyYXRpb248L2Rpdj4nO1xuICAgICAgICBpZiAoZGlmZi5jb25maWcuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICNmMzljMTI7XCI+Q29uZmlndXJhdGlvbiBkaWZmZXJzIFx1MjAxNCByZXN0b3Jpbmcgd2lsbCByZXBsYWNlIGN1cnJlbnQgc2V0dGluZ3M8L2Rpdj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW9rLWZnKTtcIj5ObyBjaGFuZ2VzPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8YnV0dG9uIGlkPVwiY29tcGFyZS1jbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+Q2xvc2U8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLWNsb3NlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1vdmVybGF5Jyk/LnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1vdmVybGF5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IHRoaXMpIHRoaXMucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb21wYXJlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwRmlsZShhcHBJZCwgZmlsZW5hbWUpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc3RvcmUgJyArIGZpbGVuYW1lICsgJyBmb3IgJyArIGFwcElkICsgJz9cXG5cXG5UaGlzIHdpbGwgcmVwbGFjZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGNyZWRlbnRpYWxzLCBhbmQgZGF0YS4gQ29udGFpbmVycyB3aWxsIGJlIHJlc3RhcnRlZC4nKSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcHBzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpICsgJy9yZXZlcnQvJyArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlc3RhcnRDb250YWluZXJzOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihhcHBJZCArICcgcmVzdG9yZWQgdG8gJyArIGZpbGVuYW1lLCAnc3VjY2VzcycpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMTUwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxufSkoKTtcbjtcbi8vID09PT09PT09PT0gUkVTT1VSQ0UgTU9OSVRPUiAoRW5oYW5jZWQpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ3N0YXRzLW1vZGFsJywgYDxkaXYgaWQ9XCJzdGF0cy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NBIFJlc291cmNlIE1vbml0b3I8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBSZWFsLXRpbWUgYW5kIGhpc3RvcmljYWwgQ1BVLCBtZW1vcnksIG5ldHdvcmssIGFuZCBkaXNrIHVzYWdlIGZvciBjb250YWluZXJzLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzdGF0cy1saXZlXCI+TGl2ZSBTdGF0czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIj4yNGggU3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWhpc3RvcnlcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtYWxlcnRzXCI+QWxlcnRzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IExpdmUgU3RhdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtbGl2ZVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgY29udGFpbmVyIHN0YXRzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiAyNGggQWdncmVnYXRlZCBTdW1tYXJ5IC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWFnZ3JlZ2F0ZWQtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQzg8L3NwYW4+XG4gICAgICAgICAgICBMb2FkaW5nIDI0LWhvdXIgYWdncmVnYXRlZCBtZXRyaWNzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBMb25nLXRlcm0gSGlzdG9yeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTJweDsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI6PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic3RhdHMtaGlzdG9yeS1jb250YWluZXJcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmbGV4OiAxOyBtaW4td2lkdGg6IDE4MHB4O1wiPjwvc2VsZWN0PlxuICAgICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5LXJhbmdlLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0biBhY3RpdmVcIiBkYXRhLXJhbmdlPVwiMWhcIj4xaDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIyNGhcIj4yNGg8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiN2RcIj43ZDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIzMGRcIj4zMGQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMXlcIj4xeTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnktY29udGFpbmVyLWFyZWFcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5cbiAgICAgICAgICAgIENob29zZSBhIGNvbnRhaW5lciBhbmQgdGltZSByYW5nZSB0byB2aWV3IGhpc3RvcnkuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBBbGVydCBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWFsZXJ0c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtYWxlcnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERDE0PC9zcGFuPlxuICAgICAgICAgICAgTG9hZGluZyBhbGVydCBjb25maWd1cmF0aW9ucy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEF1dG8tcmVmcmVzaCB0b2dnbGUgKGJvdHRvbSBiYXIpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzdGF0cy1hdXRvLXJlZnJlc2hcIiBjaGVja2VkIC8+XG4gICAgICAgICAgQXV0by1yZWZyZXNoIGV2ZXJ5IDVzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdGF0cy1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2ggTm93PC9idXR0b24+XG4gICAgICAgIDxzcGFuIGlkPVwic3RhdHMtbGFzdC11cGRhdGVcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3RhdHMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lci1zdGF0cy1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWNhbmNlbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGF1dG9SZWZyZXNoQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYXV0by1yZWZyZXNoJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1jb250YWluZXInKTtcbiAgY29uc3QgYWdncmVnYXRlZENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hZ2dyZWdhdGVkLWNvbnRhaW5lcicpO1xuICBjb25zdCBhbGVydHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYWxlcnRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0VXBkYXRlU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1sYXN0LXVwZGF0ZScpO1xuXG4gIGxldCByZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICBsZXQgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwIHx8ICFieXRlcykgcmV0dXJuICcwIEInO1xuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IHNpemVzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDEpKSArICcgJyArIHNpemVzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q3B1Q29sb3IocGVyY2VudCkge1xuICAgIGlmIChwZXJjZW50IDwgMzApIHJldHVybiAnIzJlY2M3MSc7XG4gICAgaWYgKHBlcmNlbnQgPCA3MCkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJyNlNzRjM2MnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWVtQ29sb3IocGVyY2VudCkge1xuICAgIGlmIChwZXJjZW50IDwgNTApIHJldHVybiAnIzJlY2M3MSc7XG4gICAgaWYgKHBlcmNlbnQgPCA4MCkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJyNlNzRjM2MnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXRzKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgbmV3IG1vbml0b3JpbmcgQVBJIGZpcnN0LCBmYWxsIGJhY2sgdG8gb2xkXG4gICAgICBsZXQgc3RhdHMgPSBudWxsO1xuICAgICAgbGV0IGlzTmV3QXBpID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL3N0YXRzJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHMpIHsgc3RhdHMgPSBkYXRhLnN0YXRzOyBpc05ld0FwaSA9IHRydWU7IGNhY2hlZE1vbml0b3JpbmdEYXRhID0gZGF0YS5zdGF0czsgfVxuICAgICAgfSBjYXRjaCAoXykge31cblxuICAgICAgaWYgKCFpc05ld0FwaSkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N0YXRzL2NvbnRhaW5lcnMnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXRzKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBhcnJheSBmb3JtYXQgdG8gb2JqZWN0IGZvcm1hdFxuICAgICAgICAgIHN0YXRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIGRhdGEuc3RhdHMpIHtcbiAgICAgICAgICAgIHN0YXRzW3MubmFtZV0gPSB7IG5hbWU6IHMubmFtZSwgY3VycmVudDogeyBjcHU6IHMuY3B1LCBtZW1vcnk6IHsgcGVyY2VudDogcy5tZW1vcnkucGVyY2VudCwgdXNhZ2U6IHMubWVtb3J5LnVzZWQsIGxpbWl0OiBzLm1lbW9yeS5saW1pdCwgdXNhZ2VNQjogTWF0aC5yb3VuZChzLm1lbW9yeS51c2VkIC8gMTA0ODU3NiksIGxpbWl0TUI6IE1hdGgucm91bmQocy5tZW1vcnkubGltaXQgLyAxMDQ4NTc2KSB9LCBuZXR3b3JrOiB7IHJ4Qnl0ZXM6IHMubmV0d29yay5yeCwgdHhCeXRlczogcy5uZXR3b3JrLnR4LCByeE1COiAocy5uZXR3b3JrLnJ4IC8gMTA0ODU3NikudG9GaXhlZCgxKSwgdHhNQjogKHMubmV0d29yay50eCAvIDEwNDg1NzYpLnRvRml4ZWQoMSkgfSwgZGlzazogeyByZWFkTUI6IDAsIHdyaXRlTUI6IDAgfSB9LCBzdGF0dXM6IHMuc3RhdHVzIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhY2hlZE1vbml0b3JpbmdEYXRhID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGF0cyB8fCBPYmplY3Qua2V5cyhzdGF0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBydW5uaW5nIGNvbnRhaW5lcnMgZm91bmQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpZCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdHMpKSB7XG4gICAgICAgIGNvbnN0IGN1ciA9IGluZm8uY3VycmVudCB8fCBpbmZvO1xuICAgICAgICBjb25zdCBjcHUgPSBjdXIuY3B1Py5wZXJjZW50IHx8IDA7XG4gICAgICAgIGNvbnN0IG1lbSA9IGN1ci5tZW1vcnk/LnBlcmNlbnQgfHwgMDtcbiAgICAgICAgY29uc3QgY3B1Q29sb3IgPSBnZXRDcHVDb2xvcihjcHUpO1xuICAgICAgICBjb25zdCBtZW1Db2xvciA9IGdldE1lbUNvbG9yKG1lbSk7XG4gICAgICAgIGNvbnN0IG1lbVVzZWQgPSBjdXIubWVtb3J5Py51c2FnZSB8fCBjdXIubWVtb3J5Py51c2VkIHx8IDA7XG4gICAgICAgIGNvbnN0IG1lbUxpbWl0ID0gY3VyLm1lbW9yeT8ubGltaXQgfHwgMDtcbiAgICAgICAgY29uc3QgbmV0UnggPSBjdXIubmV0d29yaz8ucnhCeXRlcyB8fCBjdXIubmV0d29yaz8ucnggfHwgMDtcbiAgICAgICAgY29uc3QgbmV0VHggPSBjdXIubmV0d29yaz8udHhCeXRlcyB8fCBjdXIubmV0d29yaz8udHggfHwgMDtcbiAgICAgICAgY29uc3QgYWdnID0gaW5mby5hZ2dyZWdhdGVkO1xuXG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZsZXg6IDE7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC9zcGFuPlxuICAgICAgICAgICAgICAke2FnZyA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC42NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMnB4IDZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgMTAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5hdmcgJHthZ2cuY3B1Py5hdmc/LnRvRml4ZWQoMCkgfHwgMH0lIGNwdTwvc3Bhbj5gIDogJyd9XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPiR7aW5mby5zdGF0dXMgfHwgJ3J1bm5pbmcnfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5DUFU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgaGVpZ2h0OiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAzcHg7IG92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAke01hdGgubWluKGNwdSwgMTAwKX0lOyBiYWNrZ3JvdW5kOiAke2NwdUNvbG9yfTsgYm9yZGVyLXJhZGl1czogM3B4OyB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogJHtjcHVDb2xvcn07IG1pbi13aWR0aDogNDVweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+JHtjcHUudG9GaXhlZCgxKX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgaGVpZ2h0OiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAzcHg7IG92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAke01hdGgubWluKG1lbSwgMTAwKX0lOyBiYWNrZ3JvdW5kOiAke21lbUNvbG9yfTsgYm9yZGVyLXJhZGl1czogM3B4OyB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogJHttZW1Db2xvcn07IG1pbi13aWR0aDogNDVweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+JHttZW0udG9GaXhlZCgxKX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj4ke2Zvcm1hdEJ5dGVzKG1lbVVzZWQpfSAvICR7Zm9ybWF0Qnl0ZXMobWVtTGltaXQpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5OZXR3b3JrPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzM0OThkYjtcIj5cdTIxOTMgJHtmb3JtYXRCeXRlcyhuZXRSeCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgNHB4O1wiPi88L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZTc0YzNjO1wiPlx1MjE5MSAke2Zvcm1hdEJ5dGVzKG5ldFR4KX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RVcGRhdGVTcGFuLnRleHRDb250ZW50ID0gJ1VwZGF0ZWQ6ICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHUyNzRDIEZhaWxlZCB0byBsb2FkIHN0YXRzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PSAyNGggQWdncmVnYXRlZCBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBZ2dyZWdhdGVkKCkge1xuICAgIGlmICghYWdncmVnYXRlZENvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YTtcbiAgICBpZiAoIWRhdGEgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhZ2dyZWdhdGVkQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQzg8L3NwYW4+Tm8gbW9uaXRvcmluZyBkYXRhIGF2YWlsYWJsZS4gT3BlbiB0aGUgTGl2ZSBTdGF0cyB0YWIgZmlyc3QuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDtcIj4nO1xuICAgIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgY29uc3QgYWdnID0gaW5mby5hZ2dyZWdhdGVkO1xuICAgICAgaWYgKCFhZ2cpIGNvbnRpbnVlO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cuY3B1Py5hdmc/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5BdmcgQ1BVPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5jcHU/Lm1heD8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPk1heCBDUFU8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLm1lbW9yeT8uYXZnPy50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+QXZnIE1lbTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cubWVtb3J5Py5tYXg/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5NYXggTWVtPC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHthZ2cuZGF0YVBvaW50cyA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDZweDtcIj4ke2FnZy5kYXRhUG9pbnRzfSBkYXRhIHBvaW50cyBvdmVyICR7YWdnLnRpbWVSYW5nZSB8fCAyNH1oPC9kaXY+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBhZ2dyZWdhdGVkQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyA9PT0gQWxlcnRzIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEFsZXJ0cygpIHtcbiAgICBpZiAoIWFsZXJ0c0NvbnRhaW5lcikgcmV0dXJuO1xuICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGFsZXJ0cy4uLjwvZGl2Pic7XG5cbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGE7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdUREMTQ8L3NwYW4+Tm8gY29udGFpbmVycyBmb3VuZC4gT3BlbiB0aGUgTGl2ZSBTdGF0cyB0YWIgZmlyc3QuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBwcmVtaXVtIHN0YXR1cyBmb3IgY29uZmlnIHNlY3Rpb24gdmlzaWJpbGl0eVxuICAgIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZXNvdXJjZS1hbGVydHMnKTtcbiAgICAgIGNvbnN0IGxkID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBsZC5hdmFpbGFibGU7XG4gICAgfSBjYXRjaCAoXykgeyBpc1ByZW1pdW0gPSBmYWxzZTsgfVxuXG4gICAgLy8gRmV0Y2ggYWxlcnQgaGlzdG9yeVxuICAgIGxldCBhbGVydEhpc3RvcnkgPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cz9saW1pdD01MCcpO1xuICAgICAgY29uc3QgaGQgPSBhd2FpdCBoci5qc29uKCk7XG4gICAgICBpZiAoaGQuc3VjY2VzcykgYWxlcnRIaXN0b3J5ID0gaGQuaGlzdG9yeSB8fCBbXTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gRmV0Y2ggYWxsIGFsZXJ0IGNvbmZpZ3NcbiAgICBsZXQgYWxsQ29uZmlncyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzL2NvbmZpZycpO1xuICAgICAgY29uc3QgY2QgPSBhd2FpdCBjci5qc29uKCk7XG4gICAgICBpZiAoY2Quc3VjY2VzcykgYWxsQ29uZmlncyA9IGNkLmNvbmZpZ3MgfHwge307XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBPYmplY3QuZW50cmllcyhkYXRhKTtcbiAgICBjb25zdCBjb250YWluZXJSb3dzID0gY29udGFpbmVycy5tYXAoKFtpZCwgaW5mb10pID0+IHtcbiAgICAgIGNvbnN0IGNmZyA9IGFsbENvbmZpZ3NbaWRdIHx8IHsgY3B1VGhyZXNob2xkOiA4MCwgbWVtb3J5VGhyZXNob2xkOiA5MCwgZGlza0lPVGhyZXNob2xkOiA1MCwgYXV0b1Jlc3RhcnQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPHRyIGRhdGEtY29udGFpbmVyPVwiJHtpZH1cIj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiA4cHg7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1jcHVcIiB2YWx1ZT1cIiR7Y2ZnLmNwdVRocmVzaG9sZCA/PyA4MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1tZW1cIiB2YWx1ZT1cIiR7Y2ZnLm1lbW9yeVRocmVzaG9sZCA/PyA5MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1kaXNrXCIgdmFsdWU9XCIke2NmZy5kaXNrSU9UaHJlc2hvbGQgPz8gNTB9XCIgbWluPVwiMFwiIG1heD1cIjEwMDBcIiBzdHlsZT1cIndpZHRoOiA3MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiYWxlcnQtYXV0b3Jlc3RhcnRcIiAke2NmZy5hdXRvUmVzdGFydCA/ICdjaGVja2VkJyA6ICcnfSAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxlcnQtdGVzdC1idG4gYnRuLXhzXCIgZGF0YS1jb250YWluZXI9XCIke2lkfVwiIGRhdGEtbmFtZT1cIiR7aW5mby5uYW1lIHx8IGlkfVwiIHN0eWxlPVwicGFkZGluZzogMnB4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5UZXN0PC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBjb25zdCBoaXN0b3J5Um93cyA9IGFsZXJ0SGlzdG9yeS5tYXAoZW50cnkgPT4ge1xuICAgICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKGVudHJ5LnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IG5vdGlmaWVkTWFyayA9IGVudHJ5Lm5vdGlmaWVkID8gJ1x1MjcxMycgOiAnXHUyMDE0JztcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWV9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZW50cnkuY29udGFpbmVyTmFtZSB8fCBlbnRyeS5jb250YWluZXJJZH08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1wiPiR7ZW50cnkubWV0cmljIHx8IGVudHJ5LnR5cGV9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPiR7dHlwZW9mIGVudHJ5LnZhbHVlID09PSAnbnVtYmVyJyA/IGVudHJ5LnZhbHVlLnRvRml4ZWQoMSkgOiBlbnRyeS52YWx1ZX0ke2VudHJ5Lm1ldHJpYyA9PT0gJ2Rpc2snID8gJyBNQi9zJyA6ICclJ308L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke25vdGlmaWVkTWFya308L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6ICR7ZW50cnkuYXV0b1Jlc3RhcnRUcmlnZ2VyZWQgPyAnI2YzOWMxMicgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHtlbnRyeS5hdXRvUmVzdGFydFRyaWdnZXJlZCA/ICdcdTIxQkInIDogJyd9PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBjb25zdCBjb25maWdTZWN0aW9uID0gaXNQcmVtaXVtID8gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwOyBmb250LXNpemU6IDAuOXJlbTtcIj5cdTI2OTlcdUZFMEYgQWxlcnQgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBpZD1cImdvLXRvLW5vdGlmaWNhdGlvbnNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lO1wiPkNvbmZpZ3VyZSBub3RpZmljYXRpb25zIFx1MjE5MjwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNQVSAlPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1lbSAlPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkRpc2sgSS9PIE1CL3M8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLVJlc3RhcnQ8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+PC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+JHtjb250YWluZXJSb3dzfTwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzYXZlLWFsbC1hbGVydHNcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TYXZlIEFsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGAgOiBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQxLDE5NiwxNSwwLjMpOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2YxYzQwZjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1MkI1MCBQcmVtaXVtIEZlYXR1cmU8L3NwYW4+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAwOyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXBncmFkZSB0byBjb25maWd1cmUgcmVzb3VyY2UgYWxlcnQgdGhyZXNob2xkcyBwZXIgY29udGFpbmVyLjwvcD5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInVwZ3JhZGUtZm9yLWFsZXJ0c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiAjZjFjNDBmOyBjb2xvcjogIzAwMDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5VcGdyYWRlIE5vdzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICAke2NvbmZpZ1NlY3Rpb259XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMHB4OyBmb250LXNpemU6IDAuOXJlbTtcIj5cdUQ4M0RcdURDQ0IgUmVjZW50IEFsZXJ0czwvaDQ+XG4gICAgICAgICR7aGlzdG9yeVJvd3MgPyBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG4gICAgICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VGltZTwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1ldHJpYzwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZhbHVlPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cdTI3MTM/PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+JHtoaXN0b3J5Um93c308L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCA6ICc8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGFsZXJ0cyByZWNvcmRlZCB5ZXQuPC9kaXY+J31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIHNhdmUtYWxsIGJ1dHRvblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWdzID0ge307XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjc3RhdHMtYWxlcnRzLWNvbnRhaW5lciB0cltkYXRhLWNvbnRhaW5lcl0nKS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IGNJZCA9IHJvdy5kYXRhc2V0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uZmlnc1tjSWRdID0ge1xuICAgICAgICAgIGNwdVRocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1jcHUnKT8udmFsdWUpIHx8IDgwLFxuICAgICAgICAgIG1lbW9yeVRocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1tZW0nKT8udmFsdWUpIHx8IDkwLFxuICAgICAgICAgIGRpc2tJT1RocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1kaXNrJyk/LnZhbHVlKSB8fCA1MCxcbiAgICAgICAgICBhdXRvUmVzdGFydDogISFyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWF1dG9yZXN0YXJ0Jyk/LmNoZWNrZWQsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy9jb25maWcnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maWdzIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBkLnN1Y2Nlc3MgPyAnXHUyNzA1IFNhdmVkJyA6ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIEFsbCc7IH0sIDIwMDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRXJyb3InO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUgQWxsJzsgfSwgMjAwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBsaW5rXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvLXRvLW5vdGlmaWNhdGlvbnMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLW5vdGlmaWNhdGlvbnMnKT8uY2xpY2soKTtcbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgdGVzdCBidXR0b25zXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFsZXJ0LXRlc3QtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcmlnID0gYnRuLnRleHRDb250ZW50O1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnLi4uJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy8ke2J0bi5kYXRhc2V0LmNvbnRhaW5lcn0vdGVzdGAsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVGVzdCBhbGVydCBzZW50IGZvciAnICsgYnRuLmRhdGFzZXQubmFtZSwgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMnO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSBvcmlnOyB9LCAyMDAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCB1cGdyYWRlIGJ1dHRvblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGdyYWRlLWZvci1hbGVydHMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgIGlmICh0eXBlb2Ygb3BlbkxpY2Vuc2VNb2RhbCA9PT0gJ2Z1bmN0aW9uJykgb3BlbkxpY2Vuc2VNb2RhbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRBdXRvUmVmcmVzaCgpIHtcbiAgICBpZiAocmVmcmVzaEludGVydmFsKSBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgaWYgKGF1dG9SZWZyZXNoQ2hlY2tib3g/LmNoZWNrZWQpIHtcbiAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IHNldEludGVydmFsKGxvYWRTdGF0cywgREMuUE9MTC5TVEFUUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgIGlmIChyZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaEludGVydmFsKTtcbiAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gT3BlbiBtb2RhbFxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZFN0YXRzKCk7XG4gICAgc3RhcnRBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbFxuICBjYW5jZWxCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN0YXRzKTtcblxuICBhdXRvUmVmcmVzaENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGF1dG9SZWZyZXNoQ2hlY2tib3guY2hlY2tlZCkgc3RhcnRBdXRvUmVmcmVzaCgpO1xuICAgIGVsc2Ugc3RvcEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtYWdncmVnYXRlZFwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRBZ2dyZWdhdGVkKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1hbGVydHNcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQWxlcnRzKTtcblxuICAvLyA9PT0gSGlzdG9yeSBUYWIgPT09XG4gIGNvbnN0IGhpc3RvcnlDb250YWluZXJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtaGlzdG9yeS1jb250YWluZXInKTtcbiAgY29uc3QgaGlzdG9yeUFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtaGlzdG9yeS1jb250YWluZXItYXJlYScpO1xuICBjb25zdCByYW5nZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhdHMtcmFuZ2UtYnRuJyk7XG5cbiAgbGV0IGN1cnJlbnRSYW5nZSA9ICcxaCc7XG5cbiAgZnVuY3Rpb24gcmFuZ2VUb01zKHJhbmdlKSB7XG4gICAgc3dpdGNoIChyYW5nZSkge1xuICAgICAgY2FzZSAnMWgnOiAgcmV0dXJuIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMjRoJzogcmV0dXJuIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICc3ZCc6ICByZXR1cm4gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICczMGQnOiByZXR1cm4gMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMXknOiAgcmV0dXJuIDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBkZWZhdWx0OiAgICByZXR1cm4gNjAgKiA2MCAqIDEwMDA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGllckxhYmVsKHRpZXIpIHtcbiAgICBpZiAodGllciA9PT0gJ3JhdycpIHJldHVybiAnbGl2ZSAoMTBzIHNhbXBsZXMpJztcbiAgICBpZiAodGllciA9PT0gJ2hvdXJseScpIHJldHVybiAnaG91cmx5IGF2ZXJhZ2UnO1xuICAgIGlmICh0aWVyID09PSAnZGFpbHknKSByZXR1cm4gJ2RhaWx5IGF2ZXJhZ2UnO1xuICAgIHJldHVybiB0aWVyO1xuICB9XG5cbiAgLy8gU2ltcGxlIFNWRyBzcGFya2xpbmUgXHUyMDE0IG5vIGV4dGVybmFsIGxpYlxuICBmdW5jdGlvbiByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgYWNjZXNzb3IsIGNvbG9yLCBsYWJlbCwgdW5pdCkge1xuICAgIGlmICghc2FtcGxlcyB8fCBzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGRhdGEgZm9yICR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gc2FtcGxlcy5tYXAoYWNjZXNzb3IpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMjBweDtcIj5ObyBkYXRhIGZvciAke2VzY2FwZUh0bWwobGFiZWwpfTwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLnZhbHVlcywgMSk7XG4gICAgY29uc3QgbWluID0gTWF0aC5taW4oLi4udmFsdWVzLCAwKTtcbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIGNvbnN0IHcgPSA2MDAsIGggPSA4MCwgcGFkID0gNDtcbiAgICBjb25zdCBzdGVwWCA9ICh3IC0gcGFkICogMikgLyBNYXRoLm1heCh2YWx1ZXMubGVuZ3RoIC0gMSwgMSk7XG4gICAgY29uc3QgcG9pbnRzID0gdmFsdWVzLm1hcCgodiwgaSkgPT4ge1xuICAgICAgY29uc3QgeCA9IHBhZCArIGkgKiBzdGVwWDtcbiAgICAgIGNvbnN0IHkgPSBoIC0gcGFkIC0gKCh2IC0gbWluKSAvIHJhbmdlKSAqIChoIC0gcGFkICogMik7XG4gICAgICByZXR1cm4gYCR7eC50b0ZpeGVkKDEpfSwke3kudG9GaXhlZCgxKX1gO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgICBjb25zdCBsYXN0ID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhdmcgPSB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB2YWx1ZXMubGVuZ3RoO1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBiYXNlbGluZTsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5sYXN0ICR7bGFzdC50b0ZpeGVkKDEpfSR7dW5pdH0gXHUwMEI3IGF2ZyAke2F2Zy50b0ZpeGVkKDEpfSR7dW5pdH0gXHUwMEI3IG1heCAke21heC50b0ZpeGVkKDEpfSR7dW5pdH08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgJHt3fSAke2h9XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6ICR7aH1weDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIke2NvbG9yfVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHBvaW50cz1cIiR7cG9pbnRzfVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCgpIHtcbiAgICBpZiAoIWhpc3RvcnlDb250YWluZXJTZWxlY3QpIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGEgfHwge307XG4gICAgY29uc3QgcHJldmlvdXMgPSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhkYXRhKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5ObyBjb250YWluZXJzPC9vcHRpb24+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC5pbm5lckhUTUwgPSBlbnRyaWVzXG4gICAgICAubWFwKChbaWQsIGluZm9dKSA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpZCl9XCI+JHtlc2NhcGVIdG1sKGluZm8ubmFtZSB8fCBpZCl9PC9vcHRpb24+YClcbiAgICAgIC5qb2luKCcnKTtcbiAgICBpZiAocHJldmlvdXMgJiYgZGF0YVtwcmV2aW91c10pIGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWUgPSBwcmV2aW91cztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRIaXN0b3J5KCkge1xuICAgIGlmICghaGlzdG9yeUFyZWEgfHwgIWhpc3RvcnlDb250YWluZXJTZWxlY3QpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXJJZCA9IGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5ObyBjb250YWluZXIgc2VsZWN0ZWQuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gZW5kVGltZSAtIHJhbmdlVG9NcyhjdXJyZW50UmFuZ2UpO1xuICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgaGlzdG9yeS4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvbW9uaXRvcmluZy9oaXN0b3J5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lcklkKX0/c3RhcnRUaW1lPSR7c3RhcnRUaW1lfSZlbmRUaW1lPSR7ZW5kVGltZX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBoaXN0b3J5Jyk7XG5cbiAgICAgIGNvbnN0IHNhbXBsZXMgPSBkYXRhLnNhbXBsZXMgfHwgW107XG4gICAgICBjb25zdCB0aWVyID0gZGF0YS50aWVyIHx8ICdyYXcnO1xuXG4gICAgICBpZiAoc2FtcGxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5ObyBkYXRhIGZvciB0aGUgbGFzdCAke2N1cnJlbnRSYW5nZX0uIFRpZXI6ICR7dGllckxhYmVsKHRpZXIpfS48L2Rpdj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERpZmZlcmVudCBzaGFwZSBiZXR3ZWVuIHJhdyB2cyByb2xsZWQtdXAgc2FtcGxlc1xuICAgICAgY29uc3QgaXNSYXcgPSB0aWVyID09PSAncmF3JztcbiAgICAgIGNvbnN0IGNwdUFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gcy5jcHU/LnBlcmNlbnQgOiAocykgPT4gcy5jcHU/LmF2ZztcbiAgICAgIGNvbnN0IG1lbUFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gcy5tZW1vcnk/LnBlcmNlbnQgOiAocykgPT4gcy5tZW1vcnk/LmF2Z1BlcmNlbnQ7XG4gICAgICBjb25zdCBuZXRSeEFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gKHMubmV0d29yaz8ucnhNQiB8fCAwKSA6IChzKSA9PiAocy5uZXR3b3JrPy5yeE1CIHx8IDApO1xuICAgICAgY29uc3QgbmV0VHhBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IChzLm5ldHdvcms/LnR4TUIgfHwgMCkgOiAocykgPT4gKHMubmV0d29yaz8udHhNQiB8fCAwKTtcblxuICAgICAgbGV0IGh0bWwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAke3NhbXBsZXMubGVuZ3RofSBzYW1wbGVzIFx1MDBCNyAke2VzY2FwZUh0bWwodGllckxhYmVsKHRpZXIpKX0gXHUwMEI3ICR7bmV3IERhdGUoc3RhcnRUaW1lKS50b0xvY2FsZVN0cmluZygpfSBcdTIxOTIgJHtuZXcgRGF0ZShlbmRUaW1lKS50b0xvY2FsZVN0cmluZygpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBjcHVBY2Nlc3NvciwgJyMyZWNjNzEnLCAnQ1BVJywgJyUnKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG1lbUFjY2Vzc29yLCAnIzM0OThkYicsICdNZW1vcnknLCAnJScpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbmV0UnhBY2Nlc3NvciwgJyM5YjU5YjYnLCAnTmV0d29yayBSWCcsICcgTUInKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG5ldFR4QWNjZXNzb3IsICcjZTY3ZTIyJywgJ05ldHdvcmsgVFgnLCAnIE1CJyk7XG5cbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjZBMFx1RkUwRjwvc3Bhbj5GYWlsZWQgdG8gbG9hZCBoaXN0b3J5OiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIHJhbmdlQnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgcmFuZ2VCdXR0b25zLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGN1cnJlbnRSYW5nZSA9IGJ0bi5kYXRhc2V0LnJhbmdlO1xuICAgICAgbG9hZEhpc3RvcnkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgbG9hZEhpc3RvcnkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtaGlzdG9yeVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QoKTtcbiAgICBsb2FkSGlzdG9yeSgpO1xuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEhFQUxUSCBDSEVDSyBEQVNIQk9BUkQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnaGVhbHRoLW1vZGFsJywgYDxkaXYgaWQ9XCJoZWFsdGgtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwMHB4OyBtYXgtd2lkdGg6IDEwMDBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0NcdURGRTUgSGVhbHRoIENoZWNrIERhc2hib2FyZDwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFNlcnZpY2UgdXB0aW1lIHRyYWNraW5nLCBTTEEgbW9uaXRvcmluZywgYW5kIGluY2lkZW50IG1hbmFnZW1lbnQuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1zdGF0dXNcIj5TdGF0dXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtaW5jaWRlbnRzXCI+SW5jaWRlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLWNvbmZpZ1wiPkNvbmZpZ3VyZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBTdGF0dXMgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLXN0YXR1c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1zdGF0dXMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGhlYWx0aCBzdGF0dXMuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEluY2lkZW50cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtaW5jaWRlbnRzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtaW5jaWRlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REVBODwvc3Bhbj4gTG9hZGluZyBpbmNpZGVudHMuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IENvbmZpZ3VyZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjY5OVx1RkUwRjwvc3Bhbj4gTG9hZGluZyBjb25maWd1cmF0aW9uLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gR2xvYmFsIFNldHRpbmdzOiByZXRlbnRpb24sIHBvbGxpbmcgaW50ZXJ2YWxzLCBtYXggZW50cmllcywgZGlzay11c2FnZSB0aHJlc2hvbGQgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtZ2xvYmFsLXNldHRpbmdzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDRweDtcIj5cdUQ4M0NcdURGMEQgR2xvYmFsIFNldHRpbmdzPC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7XCI+QXBwbGllcyB0byBhbGwgaGVhbHRoIGNoZWNrcy4gU2V0dGluZ3MgYXJlIHN0b3JlZCBsb2NhbGx5IGluIHRoaXMgYnJvd3Nlci48L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkhlYWx0aCBDaGVjayBQb2xsaW5nIEludGVydmFsIChzZWNvbmRzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1pbnRlcnZhbFwiIHZhbHVlPVwiNjBcIiBtaW49XCI1XCIgbWF4PVwiMzYwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5Ib3cgb2Z0ZW4gZWFjaCBzZXJ2aWNlJ3MgaGVhbHRoIGVuZHBvaW50IGlzIGNoZWNrZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TdGF0cyBQb2xsaW5nIEludGVydmFsIChzZWNvbmRzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1zdGF0cy1pbnRlcnZhbFwiIHZhbHVlPVwiMzBcIiBtaW49XCI1XCIgbWF4PVwiMzYwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5Ib3cgb2Z0ZW4gY29udGFpbmVyIHN0YXRpc3RpY3MgKENQVS9tZW1vcnkpIGFyZSBzYW1wbGVkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+TWF4IEVudHJpZXMgUGVyIFNlcnZpY2U8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctbWF4LWVudHJpZXNcIiB2YWx1ZT1cIjUwMFwiIG1pbj1cIjEwXCIgbWF4PVwiMTAwMDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkNhcCBvbiBzdG9yZWQgaGlzdG9yeSByZWNvcmRzIHBlciBzZXJ2aWNlLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGF0YSBSZXRlbnRpb24gKGRheXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLXJldGVudGlvblwiIHZhbHVlPVwiMzBcIiBtaW49XCIxXCIgbWF4PVwiMzY1MFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5IZWFsdGggaGlzdG9yeSBvbGRlciB0aGFuIHRoaXMgaXMgcHJ1bmVkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGlzay1Vc2FnZSBXYXJuaW5nICglKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1kaXNrLXRocmVzaG9sZFwiIHZhbHVlPVwiODBcIiBtaW49XCI1MFwiIG1heD1cIjk5XCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPldhcm4gd2hlbiBkaXNrIHVzYWdlIGV4Y2VlZHMgdGhpcyBsZXZlbC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZ2xvYmFsLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5TYXZlIEdsb2JhbCBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1nbG9iYWwtcmVzZXRcIiBjbGFzcz1cImJ0bi1zbVwiPlJlc2V0IHRvIERlZmF1bHRzPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImhlYWx0aC1nbG9iYWwtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWRkL0VkaXQgSGVhbHRoIENoZWNrIEZvcm0gLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnLWZvcm1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7XCI+XG4gICAgICAgICAgPGg0IGlkPVwiaGVhbHRoLWZvcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7XCI+QWRkIEhlYWx0aCBDaGVjazwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNlcnZpY2UgSUQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLWlkXCIgcGxhY2Vob2xkZXI9XCJlLmcuIHBsZXhcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGlzcGxheSBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIFBsZXggTWVkaWEgU2VydmVyXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOiBzcGFuIDI7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5VUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLXVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9wbGV4LmhvbWVcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VGltZW91dCAobXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXRpbWVvdXRcIiB2YWx1ZT1cIjEwMDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkV4cGVjdGVkIFN0YXR1cyBDb2RlczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tY29kZXNcIiB2YWx1ZT1cIjIwMFwiIHBsYWNlaG9sZGVyPVwiMjAwLCAzMDEsIDMwMlwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TTEEgVGFyZ2V0ICglKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS1zbGFcIiB2YWx1ZT1cIjk5LjlcIiBzdGVwPVwiMC4xXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNsb3cgUmVzcG9uc2UgVGhyZXNob2xkIChtcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tc2xvd1wiIHZhbHVlPVwiNTAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWZvcm0tY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWZvcm0tc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1hZGQtYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+KyBBZGQgSGVhbHRoIENoZWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIGlkPVwiaGVhbHRoLWxhc3QtdXBkYXRlXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IHN0YXR1c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc3RhdHVzLWNvbnRhaW5lcicpO1xuICBjb25zdCBpbmNpZGVudHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWluY2lkZW50cy1jb250YWluZXInKTtcbiAgY29uc3QgY29uZmlnQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jb25maWctY29udGFpbmVyJyk7XG4gIGNvbnN0IGxhc3RVcGRhdGVTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1sYXN0LXVwZGF0ZScpO1xuICBjb25zdCBhZGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWFkZC1idG4nKTtcbiAgY29uc3QgZm9ybUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jb25maWctZm9ybScpO1xuICBjb25zdCBmb3JtVGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGl0bGUnKTtcbiAgY29uc3QgZm9ybUNhbmNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jYW5jZWwnKTtcbiAgY29uc3QgZm9ybVNhdmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2F2ZScpO1xuXG4gIC8vIC0tLS0gR2xvYmFsIGhlYWx0aCBzZXR0aW5ncyAocmV0ZW50aW9uLCBwb2xsaW5nIGludGVydmFscywgbWF4IGVudHJpZXMsIGRpc2sgdGhyZXNob2xkKSAtLS0tXG4gIGNvbnN0IEhFQUxUSF9TRVRUSU5HU19LRVkgPSAnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncyc7XG4gIGNvbnN0IEhFQUxUSF9ERUZBVUxUUyA9IHsgcmV0ZW50aW9uRGF5czogMzAsIHBvbGxpbmdJbnRlcnZhbDogNjAsIHN0YXRzUG9sbGluZ0ludGVydmFsOiAzMCwgbWF4RW50cmllc1BlclNlcnZpY2U6IDUwMCwgZGlza1VzYWdlVGhyZXNob2xkOiA4MCB9O1xuICBjb25zdCBnbG9iYWxTYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtc2F2ZScpO1xuICBjb25zdCBnbG9iYWxSZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXJlc2V0Jyk7XG4gIGNvbnN0IGdsb2JhbFN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1zdGF0dXMnKTtcbiAgY29uc3QgcmV0ZW50aW9uSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctcmV0ZW50aW9uJyk7XG4gIGNvbnN0IGludGVydmFsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctaW50ZXJ2YWwnKTtcbiAgY29uc3Qgc3RhdHNJbnRlcnZhbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLXN0YXRzLWludGVydmFsJyk7XG4gIGNvbnN0IG1heEVudHJpZXNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1tYXgtZW50cmllcycpO1xuICBjb25zdCBkaXNrVGhyZXNob2xkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctZGlzay10aHJlc2hvbGQnKTtcblxuICBmdW5jdGlvbiBsb2FkSGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IHNhZmVHZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSk7XG4gICAgICBjb25zdCBzYXZlZCA9IHJhdyA/IEpTT04ucGFyc2UocmF3KSA6IHt9O1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIEhFQUxUSF9ERUZBVUxUUywgc2F2ZWQpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBIRUFMVEhfREVGQVVMVFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCkge1xuICAgIGNvbnN0IHMgPSBsb2FkSGVhbHRoU2V0dGluZ3MoKTtcbiAgICBpZiAocmV0ZW50aW9uSW5wdXQpIHJldGVudGlvbklucHV0LnZhbHVlID0gcy5yZXRlbnRpb25EYXlzO1xuICAgIGlmIChpbnRlcnZhbElucHV0KSBpbnRlcnZhbElucHV0LnZhbHVlID0gcy5wb2xsaW5nSW50ZXJ2YWw7XG4gICAgaWYgKHN0YXRzSW50ZXJ2YWxJbnB1dCkgc3RhdHNJbnRlcnZhbElucHV0LnZhbHVlID0gcy5zdGF0c1BvbGxpbmdJbnRlcnZhbDtcbiAgICBpZiAobWF4RW50cmllc0lucHV0KSBtYXhFbnRyaWVzSW5wdXQudmFsdWUgPSBzLm1heEVudHJpZXNQZXJTZXJ2aWNlO1xuICAgIGlmIChkaXNrVGhyZXNob2xkSW5wdXQpIGRpc2tUaHJlc2hvbGRJbnB1dC52YWx1ZSA9IHMuZGlza1VzYWdlVGhyZXNob2xkO1xuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUhlYWx0aFNldHRpbmdzKCkge1xuICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgcmV0ZW50aW9uRGF5czogTWF0aC5tYXgoMSwgTWF0aC5taW4oMzY1MCwgcGFyc2VJbnQocmV0ZW50aW9uSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMucmV0ZW50aW9uRGF5cykpLFxuICAgICAgcG9sbGluZ0ludGVydmFsOiBNYXRoLm1heCg1LCBNYXRoLm1pbigzNjAwLCBwYXJzZUludChpbnRlcnZhbElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnBvbGxpbmdJbnRlcnZhbCkpLFxuICAgICAgc3RhdHNQb2xsaW5nSW50ZXJ2YWw6IE1hdGgubWF4KDUsIE1hdGgubWluKDM2MDAsIHBhcnNlSW50KHN0YXRzSW50ZXJ2YWxJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5zdGF0c1BvbGxpbmdJbnRlcnZhbCkpLFxuICAgICAgbWF4RW50cmllc1BlclNlcnZpY2U6IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxMDAwMDAsIHBhcnNlSW50KG1heEVudHJpZXNJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5tYXhFbnRyaWVzUGVyU2VydmljZSkpLFxuICAgICAgZGlza1VzYWdlVGhyZXNob2xkOiBNYXRoLm1heCg1MCwgTWF0aC5taW4oOTksIHBhcnNlSW50KGRpc2tUaHJlc2hvbGRJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5kaXNrVXNhZ2VUaHJlc2hvbGQpKVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIHNhZmVTZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpKTtcbiAgICAgIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gICAgICBpZiAoZ2xvYmFsU3RhdHVzU3Bhbikge1xuICAgICAgICBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1NhdmVkIFx1MjcxMyc7XG4gICAgICAgIGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChnbG9iYWxTdGF0dXNTcGFuKSBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJyc7IH0sIDI1MDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSBzaG93Tm90aWZpY2F0aW9uKCdHbG9iYWwgaGVhbHRoIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgeyBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1NhdmUgZmFpbGVkJzsgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJzsgfVxuICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQgdG8gc2F2ZSBzZXR0aW5nczogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRIZWFsdGhTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgc2FmZVNldChIRUFMVEhfU0VUVElOR1NfS0VZLCBKU09OLnN0cmluZ2lmeShIRUFMVEhfREVGQVVMVFMpKTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgICBpZiAoZ2xvYmFsU3RhdHVzU3Bhbikge1xuICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdSZXNldCB0byBkZWZhdWx0cyBcdTI3MTMnO1xuICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChnbG9iYWxTdGF0dXNTcGFuKSBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJyc7IH0sIDI1MDApO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gIGdsb2JhbFNhdmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZUhlYWx0aFNldHRpbmdzKTtcbiAgZ2xvYmFsUmVzZXRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRIZWFsdGhTZXR0aW5ncyk7XG4gIC8vIC0tLS0gRW5kIGdsb2JhbCBoZWFsdGggc2V0dGluZ3MgLS0tLVxuXG4gIGxldCBlZGl0aW5nSWQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHVwdGltZUNvbG9yKHBjdCkge1xuICAgIGlmIChwY3QgPj0gOTkuOSkgcmV0dXJuICd2YXIoLS1vay1mZyknO1xuICAgIGlmIChwY3QgPj0gOTUpIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICd2YXIoLS1iYWQtZmcpJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldmVyaXR5QmFkZ2Uoc2V2KSB7XG4gICAgY29uc3QgY29sb3JzID0geyBjcml0aWNhbDogJ3ZhcigtLWJhZC1mZyknLCBoaWdoOiAnI2ZmNmI2YicsIG1lZGl1bTogJyNmMzljMTInLCBsb3c6ICd2YXIoLS1tdXRlZCknIH07XG4gICAgcmV0dXJuIGA8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiAke2NvbG9yc1tzZXZdIHx8ICd2YXIoLS1tdXRlZCknfTIwOyBjb2xvcjogJHtjb2xvcnNbc2V2XSB8fCAndmFyKC0tbXV0ZWQpJ307XCI+JHtzZXZ9PC9zcGFuPmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5zdGF0dXMgfHwgT2JqZWN0LmtleXMoZGF0YS5zdGF0dXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzQ1x1REZFNTwvc3Bhbj5ObyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQuIEdvIHRvIHRoZSBDb25maWd1cmUgdGFiIHRvIGFkZCBzZXJ2aWNlcy48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IE9iamVjdC52YWx1ZXMoZGF0YS5zdGF0dXMpO1xuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGxlZnQ7XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+U3RhdHVzPC90aD4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlVwdGltZSAyNGg8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5VcHRpbWUgN2Q8L3RoPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+QXZnIFJlc3BvbnNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+TGFzdCBDaGVjazwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGlzVXAgPSBzLnN0YXR1cyA9PT0gJ3VwJztcbiAgICAgICAgY29uc3QgZG90Q29sb3IgPSBpc1VwID8gJ3ZhcigtLWRvdC1vayknIDogJ3ZhcigtLWRvdC1iYWQpJztcbiAgICAgICAgY29uc3QgdTI0ID0gcy51cHRpbWU/LlsnMjRoJ10gPz8gJy0nO1xuICAgICAgICBjb25zdCB1N2QgPSBzLnVwdGltZT8uWyc3ZCddID8/ICctJztcbiAgICAgICAgY29uc3QgYXZnUnQgPSBzLmF2Z1Jlc3BvbnNlVGltZSAhPSBudWxsID8gTWF0aC5yb3VuZChzLmF2Z1Jlc3BvbnNlVGltZSkgKyAnbXMnIDogJy0nO1xuICAgICAgICBjb25zdCBsYXN0Q2hlY2sgPSBzLnRpbWVzdGFtcCA/IHRpbWVBZ28ocy50aW1lc3RhbXApIDogJy0nO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY3Vyc29yOiBwb2ludGVyO1wiIGRhdGEtaGVhbHRoLWlkPVwiJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX1cIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6ICR7ZG90Q29sb3J9OyBtYXJnaW4tcmlnaHQ6IDZweDtcIj48L3NwYW4+JHtpc1VwID8gJ1VwJyA6ICdEb3duJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7dHlwZW9mIHUyNCA9PT0gJ251bWJlcicgPyB1cHRpbWVDb2xvcih1MjQpIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7dHlwZW9mIHUyNCA9PT0gJ251bWJlcicgPyB1MjQudG9GaXhlZCgxKSArICclJyA6IHUyNH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7dHlwZW9mIHU3ZCA9PT0gJ251bWJlcicgPyB1cHRpbWVDb2xvcih1N2QpIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7dHlwZW9mIHU3ZCA9PT0gJ251bWJlcicgPyB1N2QudG9GaXhlZCgxKSArICclJyA6IHU3ZH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj4ke2F2Z1J0fTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7bGFzdENoZWNrfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBodG1sICs9IGA8dHIgaWQ9XCJoZWFsdGgtZGV0YWlsLSR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjx0ZCBjb2xzcGFuPVwiNlwiIHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj48ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgZGV0YWlscy4uLjwvZGl2PjwvdGQ+PC90cj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsYXN0VXBkYXRlU3Bhbi50ZXh0Q29udGVudCA9ICdVcGRhdGVkICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuXG4gICAgICAvLyBSb3cgY2xpY2sgdG8gZXhwYW5kIGRldGFpbHNcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0cltkYXRhLWhlYWx0aC1pZF0nKS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJvdy5kYXRhc2V0LmhlYWx0aElkO1xuICAgICAgICAgIGNvbnN0IGRldGFpbFJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZGV0YWlsLScgKyBpZCk7XG4gICAgICAgICAgaWYgKCFkZXRhaWxSb3cpIHJldHVybjtcbiAgICAgICAgICBpZiAoZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICAgICAgZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7aWR9L3N0YXRzP2hvdXJzPTI0YCk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzICYmIGQuc3RhdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3QgPSBkLnN0YXRzO1xuICAgICAgICAgICAgICBjb25zdCBydCA9IHN0LnJlc3BvbnNlVGltZSB8fCB7fTtcbiAgICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlRvdGFsIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZz4ke3N0LnRvdGFsQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcHRpbWU8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogJHt1cHRpbWVDb2xvcihzdC51cHRpbWUgfHwgMCl9O1wiPiR7KHN0LnVwdGltZSB8fCAwKS50b0ZpeGVkKDIpfSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF2ZyBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQuYXZnIHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5QOTUgLyBQOTk8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0LnA5NSB8fCAwKX1tcyAvICR7TWF0aC5yb3VuZChydC5wOTkgfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1pbiBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQubWluIHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5NYXggUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0Lm1heCB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXAgQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke3N0LnVwQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Eb3duIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7c3QuZG93bkNoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+Tm8gZGV0YWlsZWQgc3RhdHMgYXZhaWxhYmxlIGZvciB0aGlzIHBlcmlvZC48L2Rpdj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZCB0byBsb2FkIGhlYWx0aCBzdGF0dXM6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEluY2lkZW50cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW29wZW5SZXMsIGhpc3RSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL2luY2lkZW50cycpLFxuICAgICAgICBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL2luY2lkZW50cy9oaXN0b3J5P2xpbWl0PTUwJylcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgb3BlbkRhdGEgPSBhd2FpdCBvcGVuUmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3REYXRhID0gYXdhaXQgaGlzdFJlcy5qc29uKCk7XG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBPcGVuIGluY2lkZW50c1xuICAgICAgY29uc3Qgb3BlbiA9IChvcGVuRGF0YS5zdWNjZXNzICYmIG9wZW5EYXRhLmluY2lkZW50cykgPyBvcGVuRGF0YS5pbmNpZGVudHMgOiBbXTtcbiAgICAgIGlmIChvcGVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+PGg0IHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7IG1hcmdpbjogMCAwIDhweDtcIj5PcGVuIEluY2lkZW50cyAoJyArIG9wZW4ubGVuZ3RoICsgJyk8L2g0Pic7XG4gICAgICAgIGZvciAoY29uc3QgaW5jIG9mIG9wZW4pIHtcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZykzMDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChpbmMuc2VydmljZUlkKX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPiR7c2V2ZXJpdHlCYWRnZShpbmMuc2V2ZXJpdHkpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPiR7ZXNjYXBlSHRtbChpbmMubWVzc2FnZSl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+U3RhcnRlZCAke3RpbWVBZ28oaW5jLmNyZWF0ZWRBdCl9IFx1MDBCNyAke2luYy5vY2N1cnJlbmNlcyB8fCAxfSBvY2N1cnJlbmNlKHMpPC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW9rLWZnKTMwOyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuOXJlbTtcIj5BbGwgc2VydmljZXMgb3BlcmF0aW9uYWwgXHUyMDE0IG5vIG9wZW4gaW5jaWRlbnRzPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgLy8gSW5jaWRlbnQgaGlzdG9yeVxuICAgICAgY29uc3QgaGlzdG9yeSA9IChoaXN0RGF0YS5zdWNjZXNzICYmIGhpc3REYXRhLmhpc3RvcnkpID8gaGlzdERhdGEuaGlzdG9yeSA6IFtdO1xuICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9ICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW5jaWRlbnQgSGlzdG9yeTwvaDQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlR5cGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXZlcml0eTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkR1cmF0aW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PC90cj4nO1xuICAgICAgICBmb3IgKGNvbnN0IGluYyBvZiBoaXN0b3J5KSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBpbmMuc3RhdHVzID09PSAncmVzb2x2ZWQnO1xuICAgICAgICAgIGNvbnN0IGR1ciA9IHJlc29sdmVkICYmIGluYy5kdXJhdGlvbiA/IChpbmMuZHVyYXRpb24gPCA2MDAwMCA/IE1hdGgucm91bmQoaW5jLmR1cmF0aW9uIC8gMTAwMCkgKyAncycgOiBNYXRoLnJvdW5kKGluYy5kdXJhdGlvbiAvIDYwMDAwKSArICdtJykgOiAnLSc7XG4gICAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKGluYy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKGluYy50eXBlKX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7c2V2ZXJpdHlCYWRnZShpbmMuc2V2ZXJpdHkpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtyZXNvbHZlZCA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke2luYy5zdGF0dXN9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtkdXJ9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oaW5jLmNyZWF0ZWRBdCl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICB9XG5cbiAgICAgIGluY2lkZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sIHx8ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURFQTg8L3NwYW4+Tm8gaW5jaWRlbnRzIHJlY29yZGVkIHlldC48L2Rpdj4nO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGluY2lkZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0dXMgPyBPYmplY3QudmFsdWVzKGRhdGEuc3RhdHVzKSA6IFtdO1xuICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5ObyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQgeWV0LiBDbGljayBcIkFkZCBIZWFsdGggQ2hlY2tcIiBiZWxvdy48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNMQSBUYXJnZXQ8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGlzVXAgPSBzLnN0YXR1cyA9PT0gJ3VwJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChzLm5hbWUgfHwgcy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHtpc1VwID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7aXNVcCA/ICdVcCcgOiAnRG93bid9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+JHtzLnNsYT8udGFyZ2V0ID8gcy5zbGEudGFyZ2V0ICsgJyUnIDogJy0nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGRhdGEtaGVhbHRoLWFjdGlvbj1cImhlYWx0aC1lZGl0XCIgZGF0YS1zZXJ2aWNlLWlkPVwiJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IG1hcmdpbi1yaWdodDogNHB4O1wiPkVkaXQ8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGRhdGEtaGVhbHRoLWFjdGlvbj1cImhlYWx0aC1kZWxldGVcIiBkYXRhLXNlcnZpY2UtaWQ9XCIke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWxldGU8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9ICc8L3RkPjwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbmZpZ0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgLy8gQXVkaXQgUDAtMzogdGhlIEVkaXQvRGVsZXRlIGJ1dHRvbnMgZGlzcGF0Y2hlZCBDdXN0b21FdmVudHMgZnJvbVxuICAgICAgLy8gaW5saW5lIG9uY2xpY2sgXHUyMDE0IGRlYWQgdW5kZXIgdGhlIG1ldGEgQ1NQLiBTYW1lIGV2ZW50cywgd2lyZWQuXG4gICAgICBjb25maWdDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaGVhbHRoLWFjdGlvbl0nKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGJ0bi5kYXRhc2V0LmhlYWx0aEFjdGlvbiwgeyBkZXRhaWw6IGJ0bi5kYXRhc2V0LnNlcnZpY2VJZCB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93Rm9ybShpZCwgbmFtZSwgdXJsLCB0aW1lb3V0LCBjb2Rlcywgc2xhLCBzbG93KSB7XG4gICAgZWRpdGluZ0lkID0gaWQgfHwgbnVsbDtcbiAgICBmb3JtVGl0bGUudGV4dENvbnRlbnQgPSBpZCA/ICdFZGl0IEhlYWx0aCBDaGVjaycgOiAnQWRkIEhlYWx0aCBDaGVjayc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUgPSBpZCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS5kaXNhYmxlZCA9ICEhaWQ7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZSA9IG5hbWUgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXVybCcpLnZhbHVlID0gdXJsIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aW1lb3V0JykudmFsdWUgPSB0aW1lb3V0IHx8IDEwMDAwO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jb2RlcycpLnZhbHVlID0gY29kZXMgfHwgJzIwMCc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsYScpLnZhbHVlID0gc2xhIHx8IDk5Ljk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsb3cnKS52YWx1ZSA9IHNsb3cgfHwgNTAwMDtcbiAgICBmb3JtRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGFkZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUZvcm0oKSB7XG4gICAgZm9ybUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWRkQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBlZGl0aW5nSWQgPSBudWxsO1xuICB9XG5cbiAgYWRkQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dGb3JtKCcnLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCkpO1xuICBmb3JtQ2FuY2VsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVGb3JtKTtcblxuICBmb3JtU2F2ZT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlZGl0aW5nSWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghaWQpIHJldHVybiBzaG93Tm90aWZpY2F0aW9uKCdTZXJ2aWNlIElEIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICBjb25zdCB1cmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghdXJsKSByZXR1cm4gc2hvd05vdGlmaWNhdGlvbignVVJMIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcblxuICAgIGNvbnN0IGNvZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNvZGVzJykudmFsdWUuc3BsaXQoJywnKS5tYXAoYyA9PiBwYXJzZUludChjLnRyaW0oKSkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgbmFtZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgaWQsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGltZW91dCcpLnZhbHVlKSB8fCAxMDAwMCxcbiAgICAgIGV4cGVjdGVkU3RhdHVzQ29kZXM6IGNvZGVzLmxlbmd0aCA/IGNvZGVzIDogWzIwMF0sXG4gICAgICBzbGE6IHsgdGFyZ2V0OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbGEnKS52YWx1ZSkgfHwgOTkuOSB9LFxuICAgICAgc2xvd1Jlc3BvbnNlVGhyZXNob2xkOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xvdycpLnZhbHVlKSB8fCA1MDAwXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgZm9ybVNhdmUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgIGhpZGVGb3JtKCk7XG4gICAgICBsb2FkQ29uZmlnKCk7XG4gICAgICBsb2FkU3RhdHVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICAgIGZvcm1TYXZlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdoZWFsdGgtZWRpdCcsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlLmRldGFpbDtcbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNvbmZpZyB0byBwb3B1bGF0ZSBmb3JtIFx1MjAxNCB1c2UgY3VycmVudCBzdGF0dXMgZGF0YSBhcyBmYWxsYmFja1xuICAgIHNob3dGb3JtKGlkLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hlYWx0aC1kZWxldGUnLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGlkID0gZS5kZXRhaWw7XG4gICAgaWYgKCFjb25maXJtKGBEZWxldGUgaGVhbHRoIGNoZWNrIGZvciBcIiR7aWR9XCI/YCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTtcbiAgICAgIGxvYWRDb25maWcoKTtcbiAgICAgIGxvYWRTdGF0dXMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkU3RhdHVzKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN0YXR1cyk7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJoZWFsdGgtaW5jaWRlbnRzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEluY2lkZW50cyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiaGVhbHRoLWNvbmZpZ1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRDb25maWcpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVVBEQVRFIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgndXBkYXRlcy1tb2RhbCcsIGA8ZGl2IGlkPVwidXBkYXRlcy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHUyQjA2XHVGRTBGIFVwZGF0ZSBNYW5hZ2VtZW50PC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgQ2hlY2sgZm9yIGNvbnRhaW5lciBpbWFnZSB1cGRhdGVzLCBhcHBseSB0aGVtLCBhbmQgbWFuYWdlIHJvbGxiYWNrcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdmFpbGFibGVcIj5BdmFpbGFibGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCI+QXV0by1VcGRhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGlkPVwidXBkYXRlcy1kYXNoY2FkZHktdGFiXCI+RGFzaENhZGR5PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEF2YWlsYWJsZSBVcGRhdGVzIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXZhaWxhYmxlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtY2hlY2stYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+XHVEODNEXHVERDBEIENoZWNrIGZvciBVcGRhdGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtdXBkYXRlLWFsbC1idG5cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07IGJhY2tncm91bmQ6ICNmOTczMTY7IGNvbG9yOiAjZmZmOyBib3JkZXI6IDFweCBzb2xpZCAjZjk3MzE2OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cdTJCMDZcdUZFMEYgVXBkYXRlIEFsbDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1jb3VudC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0NTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+IENsaWNrIFwiQ2hlY2sgZm9yIFVwZGF0ZXNcIiB0byBzY2FuIGNvbnRhaW5lcnMuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtaGlzdG9yeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyB1cGRhdGUgaGlzdG9yeS4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQXV0by1VcGRhdGUgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdXRvXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF1dG8tY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPiBMb2FkaW5nIGF1dG8tdXBkYXRlIGNvbmZpZ3VyYXRpb24uLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IERhc2hDYWRkeSBTZWxmLVVwZGF0ZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXZlcnNpb24taW5mb1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07XCI+RGFzaENhZGR5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvblwiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj5VcGRhdGUgYXZhaWxhYmxlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1kZXRhaWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwO1wiPk5ldyB2ZXJzaW9uOiA8c3BhbiBpZD1cImRhc2hjYWRkeS1uZXctdmVyc2lvblwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LWFwcGx5LWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5VcGRhdGUgTm93PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1jaGFuZ2Vsb2dcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtaGVpZ2h0OiAxMjBweDsgb3ZlcmZsb3cteTogYXV0bzsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgbGluZS1oZWlnaHQ6IDEuNTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktc3RhdHVzLWJhclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRhc2hjYWRkeS1jaGVjay1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q2hlY2sgZm9yIFVwZGF0ZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LXJvbGxiYWNrLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgbWFyZ2luLWxlZnQ6IDZweDtcIj5Sb2xsYmFjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPk5vIHNlbGYtdXBkYXRlIGhpc3RvcnkuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1sYXN0LWNoZWNrXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ1cGRhdGVzLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNhbmNlbCcpO1xuICBjb25zdCBjaGVja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNoZWNrLWJ0bicpO1xuICBjb25zdCBhdmFpbGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICBjb25zdCBhdXRvQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYXV0by1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdENoZWNrU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWxhc3QtY2hlY2snKTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXZhaWxhYmxlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2F2YWlsYWJsZScpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAgaWYgKHVwZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNzA1PC9zcGFuPkFsbCBjb250YWluZXJzIGFyZSB1cCB0byBkYXRlLjwvZGl2Pic7XG4gICAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jb3VudC1iYWRnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5DdXJyZW50PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TGF0ZXN0PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdSBvZiB1cGRhdGVzKSB7XG4gICAgICAgIC8vIE1hdGNoIGFwcCBieSBjb250YWluZXJJZCBmaXJzdCwgdGhlbiBuYW1lXG4gICAgICAgIGNvbnN0IGFwcElkID0gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBhcHBzID0gd2luZG93LkFQUFMgfHwgW107XG4gICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFwcHMpIHtcbiAgICAgICAgICAgIGlmIChhLmNvbnRhaW5lcklkID09PSB1LmNvbnRhaW5lcklkIHx8IGEubmFtZSA9PT0gdS5jb250YWluZXJOYW1lIHx8IGEuaWQgPT09IHUuY29udGFpbmVyTmFtZSkgcmV0dXJuIGEuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1LmNvbnRhaW5lck5hbWU7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBkYXRhLWFwcC1pZD1cIiR7ZXNjYXBlSHRtbChhcHBJZCl9XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHUuaW1hZ2VOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtlc2NhcGVIdG1sKHUuY3VycmVudERpZ2VzdCl9PC9jb2RlPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2VzY2FwZUh0bWwodS5sYXRlc3REaWdlc3QpfTwvY29kZT48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInVwZGF0ZS1ub3ctYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lcklkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXJpZ2h0OiA0cHg7XCI+VXBkYXRlPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInJvbGxiYWNrLWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJJZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlJvbGxiYWNrPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSAnPC90ZD48L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdmFpbGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSB1cGRhdGVzLmxlbmd0aCArICcgdXBkYXRlKHMpIGF2YWlsYWJsZSc7XG5cbiAgICAgIC8vIFNob3cgY291bnQgYmFkZ2UgYW5kIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICBjb25zdCBjb3VudEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY291bnQtYmFkZ2UnKTtcbiAgICAgIGNvbnN0IHVwZGF0ZUFsbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgICBpZiAoY291bnRCYWRnZSkge1xuICAgICAgICBjb3VudEJhZGdlLnRleHRDb250ZW50ID0gdXBkYXRlcy5sZW5ndGggKyAnIHBlbmRpbmcnO1xuICAgICAgICBjb3VudEJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVBbGxCdG4gJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVwZGF0ZUFsbEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHVwZGF0ZXMgZm9yIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICB3aW5kb3cuX3BlbmRpbmdVcGRhdGVzID0gdXBkYXRlcztcblxuICAgICAgLy8gV2lyZSB1cGRhdGUgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtbm93LWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBVcGRhdGUgXCIke25hbWV9XCIgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uPyBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGluZy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRG9uZSEnO1xuICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRBdmFpbGFibGUoKSwgMjAwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVXBkYXRlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnVXBkYXRlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5zdHlsZS5jb2xvciA9ICcnOyBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9LCAzMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdpcmUgcm9sbGJhY2sgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb2xsYmFjay1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidG4uZGF0YXNldC5uYW1lO1xuICAgICAgICAgIGlmICghY29uZmlybShgUm9sbGJhY2sgXCIke25hbWV9XCIgdG8gaXRzIHByZXZpb3VzIHZlcnNpb24/YCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUm9sbGluZyBiYWNrLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy9yb2xsYmFjay8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1JvbGxlZCBiYWNrISc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZEF2YWlsYWJsZSgpLCAyMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdSb2xsYmFjayBmYWlsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRmFpbGVkJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1JvbGxiYWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnUm9sbGJhY2snOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMzAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIEFsbCBcdTIwMTQgc2VxdWVudGlhbGx5LCBza2lwIGZhaWx1cmVzXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbENvbnRhaW5lcnMoKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgfHwgW107XG4gICAgaWYgKCF1cGRhdGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgYWxsICR7dXBkYXRlcy5sZW5ndGh9IGNvbnRhaW5lcnM/IEVhY2ggd2lsbCByZXN0YXJ0LmApKSByZXR1cm47XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBVcGRhdGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsZXQgc3VjY2VzcyA9IDAsIGZhaWxlZCA9IDA7XG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudCh1LmNvbnRhaW5lcklkKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgc3VjY2VzcysrO1xuICAgICAgICBlbHNlIGZhaWxlZCsrO1xuICAgICAgfSBjYXRjaCAoXykgeyBmYWlsZWQrKzsgfVxuICAgIH1cbiAgICBidG4udGV4dENvbnRlbnQgPSBgXHUyNzA1IERvbmVgO1xuICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhbGw6ICR7c3VjY2Vzc30gc3VjY2VlZGVkLCAke2ZhaWxlZH0gZmFpbGVkLmAsIHN1Y2Nlc3MgPiAwICYmIGZhaWxlZCA9PT0gMCA/ICdzdWNjZXNzJyA6ICdlcnJvcicpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNlx1RkUwRiBVcGRhdGUgQWxsJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgbG9hZEF2YWlsYWJsZSgpO1xuICAgIH0sIDMwMDApO1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVBbGxDb250YWluZXJzKTtcblxuICBhc3luYyBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEIENoZWNraW5nLi4uJztcbiAgICBjaGVja0J0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IERvbmUhJztcbiAgICAgIGF3YWl0IGxvYWRBdmFpbGFibGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NoZWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCBDaGVjayBmb3IgVXBkYXRlcyc7IGNoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDMwMDApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2hpc3Rvcnk/bGltaXQ9NTAnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3RvcnkgPyBkYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+Tm8gdXBkYXRlIGhpc3RvcnkgeWV0LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5EdXJhdGlvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBoIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3Qgb2sgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnO1xuICAgICAgICBjb25zdCBkdXIgPSBoLmR1cmF0aW9uID8gKGguZHVyYXRpb24gPCAxMDAwID8gaC5kdXJhdGlvbiArICdtcycgOiBNYXRoLnJvdW5kKGguZHVyYXRpb24gLyAxMDAwKSArICdzJykgOiAnLSc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oaC50aW1lc3RhbXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChoLmNvbnRhaW5lck5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChoLmltYWdlTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtkdXJ9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMyBzdWNjZXNzJyA6ICdcdTI3MTcgZmFpbGVkJ308L3NwYW4+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmICghb2sgJiYgaC5lcnJvcikge1xuICAgICAgICAgIGh0bWwgKz0gYDx0cj48dGQgY29sc3Bhbj1cIjVcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChoLmVycm9yKX08L3RkPjwvdHI+YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdXRvQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgICAvLyBGZXRjaCBjb250YWluZXJzIGFuZCBzYXZlZCBhdXRvLXVwZGF0ZSBjb25maWcgaW4gcGFyYWxsZWxcbiAgICAgIGNvbnN0IFtjb250YWluZXJzUmVzLCBjb25maWdSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaCgnL2FwaS92MS9zdGF0cy9jb250YWluZXJzJyksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXV0by11cGRhdGUnKVxuICAgICAgXSk7XG4gICAgICBjb25zdCBjb250YWluZXJzRGF0YSA9IGF3YWl0IGNvbnRhaW5lcnNSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IGF3YWl0IGNvbmZpZ1Jlcy5qc29uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBjb250YWluZXJzRGF0YS5zdWNjZXNzICYmIGNvbnRhaW5lcnNEYXRhLnN0YXRzID8gY29udGFpbmVyc0RhdGEuc3RhdHMgOiBbXTtcbiAgICAgIGNvbnN0IHNhdmVkQ29uZmlnID0gY29uZmlnRGF0YS5zdWNjZXNzICYmIGNvbmZpZ0RhdGEuY29uZmlnID8gY29uZmlnRGF0YS5jb25maWcgOiB7fTtcblxuICAgICAgaWYgKGNvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5ObyBydW5uaW5nIGNvbnRhaW5lcnMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by11cGRhdGVzIHJ1biBkdXJpbmcgbWFpbnRlbmFuY2Ugd2luZG93IChkZWZhdWx0IDJBTS00QU0pLiBEYWlseSA9IGV2ZXJ5IGRheSwgV2Vla2x5ID0gU3VuZGF5cywgTW9udGhseSA9IDFzdCBvZiBtb250aC48L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkNvbnRhaW5lcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNjaGVkdWxlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2luZG93PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Um9sbGJhY2s8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5MYXN0IFJ1bjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBuYW1lID0gYy5uYW1lIHx8IGMuTmFtZXM/LlswXT8ucmVwbGFjZSgvXlxcLy8sICcnKSB8fCBjLklkPy5zdWJzdHJpbmcoMCwgMTIpO1xuICAgICAgICBjb25zdCBjaWQgPSBjLmNvbnRhaW5lcklkIHx8IGMuSWQ7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRDb25maWdbY2lkXSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVWYWwgPSBzYXZlZC5lbmFibGVkID8gKHNhdmVkLnNjaGVkdWxlIHx8ICd3ZWVrbHknKSA6ICcnO1xuICAgICAgICBjb25zdCByb2xsYmFja1ZhbCA9IHNhdmVkLmF1dG9Sb2xsYmFjayAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHdpbmRvd1ZhbCA9IHNhdmVkLm1haW50ZW5hbmNlV2luZG93IHx8ICcnO1xuICAgICAgICBjb25zdCBsYXN0UnVuID0gc2F2ZWQubGFzdEF1dG9VcGRhdGUgPyB0aW1lQWdvKHNhdmVkLmxhc3RBdXRvVXBkYXRlKSA6ICdOZXZlcic7XG5cbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCIgZGF0YS1jb250YWluZXItaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJhdXRvLXNjaGVkdWxlXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiR7IXNjaGVkdWxlVmFsID8gJyBzZWxlY3RlZCcgOiAnJ30+RGlzYWJsZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PkRhaWx5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCIke3NjaGVkdWxlVmFsID09PSAnd2Vla2x5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PldlZWtseTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIiR7c2NoZWR1bGVWYWwgPT09ICdtb250aGx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9Pk1vbnRobHk8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF1dG8td2luZG93XCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHdpbmRvd1ZhbCl9XCIgcGxhY2Vob2xkZXI9XCIwMjowMC0wNDowMFwiIHN0eWxlPVwid2lkdGg6IDkwcHg7IHBhZGRpbmc6IDNweCA2cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJhdXRvLXJvbGxiYWNrXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiJHtyb2xsYmFja1ZhbCA/ICcgY2hlY2tlZCcgOiAnJ30gLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7bGFzdFJ1bn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+PGJ1dHRvbiBjbGFzcz1cInNhdmUtYXV0by1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj5TYXZlPC9idXR0b24+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgc2F2ZSBidXR0b25zXG4gICAgICBhdXRvQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYXZlLWF1dG8tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCByb3cgPSBidG4uY2xvc2VzdCgndHInKTtcbiAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by1zY2hlZHVsZScpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHJvbGxiYWNrID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXJvbGxiYWNrJykuY2hlY2tlZDtcbiAgICAgICAgICBjb25zdCB3aW5kb3cgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8td2luZG93JykudmFsdWUudHJpbSgpO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL2F1dG8tdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbmFibGVkOiAhIXNjaGVkdWxlLCBzY2hlZHVsZTogc2NoZWR1bGUgfHwgJ3dlZWtseScsIGF1dG9Sb2xsYmFjazogcm9sbGJhY2ssIG1haW50ZW5hbmNlV2luZG93OiB3aW5kb3cgfHwgdW5kZWZpbmVkIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyBTYXZlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNyBFcnJvcic7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDIwMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERBU0hDQUREWSBTRUxGLVVQREFURSA9PT09PVxuXG4gIGNvbnN0IGRjVmVyc2lvbkluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvbicpO1xuICBjb25zdCBkY1VwZGF0ZUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtYmFkZ2UnKTtcbiAgY29uc3QgZGNVcGRhdGVEZXRhaWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtZGV0YWlscycpO1xuICBjb25zdCBkY05ld1ZlcnNpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LW5ldy12ZXJzaW9uJyk7XG4gIGNvbnN0IGRjQ2hhbmdlbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1jaGFuZ2Vsb2cnKTtcbiAgY29uc3QgZGNBcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktYXBwbHktYnRuJyk7XG4gIGNvbnN0IGRjQ2hlY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWNoZWNrLWJ0bicpO1xuICBjb25zdCBkY1JvbGxiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1yb2xsYmFjay1idG4nKTtcbiAgY29uc3QgZGNTdGF0dXNCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXN0YXR1cy1iYXInKTtcbiAgY29uc3QgZGNIaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lcicpO1xuXG4gIGxldCBkY0xhc3RDaGVjayA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZGNTaG93U3RhdHVzKG1zZywgdHlwZSkge1xuICAgIGlmICghZGNTdGF0dXNCYXIpIHJldHVybjtcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5iYWNrZ3JvdW5kID0gdHlwZSA9PT0gJ2Vycm9yJyA/ICd2YXIoLS1iYWQtYmcpJyA6IHR5cGUgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1iZyknIDogJ3ZhcigtLWJnKSc7XG4gICAgZGNTdGF0dXNCYXIuc3R5bGUuY29sb3IgPSB0eXBlID09PSAnZXJyb3InID8gJ3ZhcigtLWJhZC1mZyknIDogdHlwZSA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBkY1N0YXR1c0Jhci50ZXh0Q29udGVudCA9IG1zZztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjTG9hZFZlcnNpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS92ZXJzaW9uJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gZGF0YS5jb21taXQgJiYgZGF0YS5jb21taXQgIT09ICd1bmtub3duJyA/IGRhdGEuY29tbWl0IDogbnVsbDtcbiAgICAgICAgZGNWZXJzaW9uSW5mby50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEudmVyc2lvbiArIChjb21taXQgPyAnICgnICsgY29tbWl0LnN1YnN0cmluZygwLCA3KSArICcpJyA6ICcnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICBkY1ZlcnNpb25JbmZvLnRleHRDb250ZW50ID0gJ1VuYWJsZSB0byBmZXRjaCB2ZXJzaW9uJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0NoZWNrRm9yVXBkYXRlKHNpbGVudCkge1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNraW5nLi4uJztcbiAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1jaGVjaycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBkY0xhc3RDaGVjayA9IGRhdGE7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5hdmFpbGFibGUgJiYgZGF0YS5yZW1vdGUpIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjVXBkYXRlRGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjTmV3VmVyc2lvbi50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEucmVtb3RlLnZlcnNpb247XG4gICAgICAgIGRjQ2hhbmdlbG9nLnRleHRDb250ZW50ID0gZGF0YS5yZW1vdGUuY2hhbmdlbG9nIHx8ICdObyBjaGFuZ2Vsb2cgYXZhaWxhYmxlLic7XG5cbiAgICAgICAgLy8gQWRkIG5vdGlmaWNhdGlvbiBkb3QgdG8gdGhlIFVwZGF0ZXMgYnV0dG9uXG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7cmlnaHQ6MnB4O3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTsnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGFkZCBkb3QgdG8gdGhlIERhc2hDYWRkeSB0YWJcbiAgICAgICAgY29uc3QgZGNUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1kYXNoY2FkZHktdGFiJyk7XG4gICAgICAgIGlmIChkY1RhYiAmJiAhZGNUYWIucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgZGNUYWIuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkY1VwZGF0ZURldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgYXdhaXQgZGNMb2FkVmVyc2lvbigpO1xuICAgICAgICBpZiAoIXNpbGVudCkgZGNTaG93U3RhdHVzKCdZb3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uLicsICdzdWNjZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2sgZm9yIFVwZGF0ZXMnO1xuICAgICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZGNTaG93U3RhdHVzKCdGYWlsZWQgdG8gY2hlY2s6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNrIGZvciBVcGRhdGVzJztcbiAgICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjQXBwbHlVcGRhdGUoKSB7XG4gICAgaWYgKCFjb25maXJtKCdBcHBseSBEYXNoQ2FkZHkgdXBkYXRlPyBUaGUgQVBJIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybiBmYWxzZTtcbiAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nLi4uJztcbiAgICBkY0FwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBkY1Nob3dTdGF0dXMoJ0Rvd25sb2FkaW5nIGFuZCBhcHBseWluZyB1cGRhdGUuLi4nLCAnaW5mbycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWFwcGx5JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBpbml0aWF0ZWQ6IHYnICsgKGRhdGEuZnJvbVZlcnNpb24gfHwgJz8nKSArICcgXHUyMTkyIHYnICsgKGRhdGEudG9WZXJzaW9uIHx8ICc/JykgKyAnLiBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydCBzaG9ydGx5LicsICdzdWNjZXNzJyk7XG4gICAgICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbGllZCEnO1xuICAgICAgICAvLyBSZW1vdmUgbm90aWZpY2F0aW9uIGRvdHNcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1kb3QnKS5mb3JFYWNoKGQgPT4gZC5yZW1vdmUoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGUgTm93JztcbiAgICAgIGRjQXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNMb2FkSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1oaXN0b3J5Jyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5ID8gZGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gc2VsZi11cGRhdGUgaGlzdG9yeS48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlZlcnNpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Gcm9tPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGggb2YgaGlzdG9yeSkge1xuICAgICAgICBjb25zdCBzdCA9IGguc3RhdHVzID09PSAnc3VjY2VzcycgPyAnXHUyNzEzIHN1Y2Nlc3MnIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICdcdTIzRjMgcGVuZGluZycgOiBoLnN0YXR1cyA9PT0gJ3BhcnRpYWwnID8gJ1x1MjZBMCBwYXJ0aWFsJyA6ICdcdTI3MTcgJyArIGguc3RhdHVzO1xuICAgICAgICBjb25zdCBzdENvbG9yID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1mZyknIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIHRpbWVBZ28oaC50aW1lc3RhbXApICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPnYnICsgZXNjYXBlSHRtbChoLnZlcnNpb24pICsgKGgucm9sbGJhY2sgPyAnIChyb2xsYmFjayknIDogJycpICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPnYnICsgZXNjYXBlSHRtbChoLmZyb21WZXJzaW9uIHx8ICc/JykgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJyArIHN0Q29sb3IgKyAnO1wiPicgKyBzdCArICc8L3NwYW4+PC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmIChoLmVycm9yKSB7XG4gICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZCBjb2xzcGFuPVwiNFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JyArIGVzY2FwZUh0bWwoaC5lcnJvcikgKyAnPC90ZD48L3RyPic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGgubm90ZSkge1xuICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQgY29sc3Bhbj1cIjRcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGVzY2FwZUh0bWwoaC5ub3RlKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjU2hvd1JvbGxiYWNrKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vcm9sbGJhY2stdmVyc2lvbnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS52ZXJzaW9ucyA/IGRhdGEudmVyc2lvbnMgOiBbXTtcbiAgICAgIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm8gcm9sbGJhY2sgdmVyc2lvbnMgYXZhaWxhYmxlLicsICdpbmZvJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcnNpb24gPSBwcm9tcHQoJ0F2YWlsYWJsZSByb2xsYmFjayB2ZXJzaW9uczpcXG4nICsgdmVyc2lvbnMuam9pbignXFxuJykgKyAnXFxuXFxuRW50ZXIgdmVyc2lvbiB0byByb2xsYmFjayB0bzonKTtcbiAgICAgIGlmICghdmVyc2lvbikgcmV0dXJuO1xuICAgICAgaWYgKCF2ZXJzaW9ucy5pbmNsdWRlcyh2ZXJzaW9uKSkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdJbnZhbGlkIHZlcnNpb246ICcgKyB2ZXJzaW9uLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maXJtKCdSb2xsYmFjayBEYXNoQ2FkZHkgdG8gdicgKyB2ZXJzaW9uICsgJz8gVGhlIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybjtcbiAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGluZyBiYWNrIHRvIHYnICsgdmVyc2lvbiArICcuLi4nLCAnaW5mbycpO1xuICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3N5c3RlbS9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb24gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxiYWNrIHRvIHYnICsgdmVyc2lvbiArICcgaW5pdGlhdGVkLiBDb250YWluZXIgd2lsbCByZXN0YXJ0LicsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnUm9sbGJhY2sgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNTaG93U3RhdHVzKCdSb2xsYmFjayBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGRjQ2hlY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZGNDaGVja0ZvclVwZGF0ZShmYWxzZSkpO1xuICBkY0FwcGx5QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGRjQXBwbHlVcGRhdGUoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICBkY1JvbGxiYWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRjU2hvd1JvbGxiYWNrKTtcblxuICBjaGVja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0ZvclVwZGF0ZXMpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdmFpbGFibGUoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBPcGVuIFVwZGF0ZSBNYW5hZ2VtZW50IG1vZGFsLCBvcHRpb25hbGx5IHNjcm9sbGVkIHRvIGEgc3BlY2lmaWMgYXBwXG4gIHdpbmRvdy5vcGVuVXBkYXRlTW9kYWwgPSBmdW5jdGlvbihhcHBJZCkge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFhcHBJZCkgcmV0dXJuO1xuICAgICAgLy8gU2Nyb2xsIHRvIGFuZCBoaWdobGlnaHQgdGhlIG1hdGNoaW5nIHJvd1xuICAgICAgY29uc3Qgcm93ID0gYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcC1pZD1cIiR7YXBwSWR9XCJdYCk7XG4gICAgICBpZiAocm93KSB7XG4gICAgICAgIHJvdy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgICByb3cuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDI0OSwxMTUsMjIsMC4xNSknO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgcm93LnN0eWxlLmJhY2tncm91bmQgPSAnJzsgfSwgMzAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkSGlzdG9yeSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEF1dG9Db25maWcpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtZGFzaGNhZGR5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRjTG9hZFZlcnNpb24oKTtcbiAgICBkY0xvYWRIaXN0b3J5KCk7XG4gICAgaWYgKCFkY0xhc3RDaGVjaykgZGNDaGVja0ZvclVwZGF0ZSh0cnVlKTtcbiAgfSk7XG5cbiAgd2luZG93LmRjQXBwbHlVcGRhdGUgPSBkY0FwcGx5VXBkYXRlO1xuICB3aW5kb3cuZGNDaGVja0ZvclVwZGF0ZSA9IGRjQ2hlY2tGb3JVcGRhdGU7XG5cbiAgLy8gTm9uLWJsb2NraW5nIGNoZWNrIG9uIHBhZ2UgbG9hZCBcdTIwMTQganVzdCBhZGRzIG5vdGlmaWNhdGlvbiBkb3QgaWYgdXBkYXRlIGF2YWlsYWJsZVxuICBzZXRUaW1lb3V0KCgpID0+IGRjQ2hlY2tGb3JVcGRhdGUodHJ1ZSksIDUwMDApO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIFJFU09VUkNFUyAoVm9sdW1lcywgTmV0d29ya3MsIERpc2sgVXNhZ2UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2RvY2tlci1yZXNvdXJjZXMtbW9kYWwnLCBgPGRpdiBpZD1cImRvY2tlci1yZXNvdXJjZXMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REMzMyBEb2NrZXIgUmVzb3VyY2VzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5NYW5hZ2Ugdm9sdW1lcywgbmV0d29ya3MsIGFuZCB2aWV3IGRpc2sgdXNhZ2UuPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJkci12b2x1bWVzXCI+Vm9sdW1lczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImRyLW5ldHdvcmtzXCI+TmV0d29ya3M8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJkci1kaXNrXCI+RGlzayBVc2FnZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVm9sdW1lcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci12b2x1bWVzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci12b2wtbmFtZVwiIHBsYWNlaG9sZGVyPVwiVm9sdW1lIG5hbWVcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkci12b2wtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNyZWF0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRyLXZvbC1saXN0XCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOZXR3b3JrcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1uZXR3b3Jrc1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci1uZXQtbmFtZVwiIHBsYWNlaG9sZGVyPVwiTmV0d29yayBuYW1lXCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZHItbmV0LWRyaXZlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyaWRnZVwiPmJyaWRnZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm92ZXJsYXlcIj5vdmVybGF5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaG9zdFwiPmhvc3Q8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZHItbmV0LWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1uZXQtbGlzdFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzayBVc2FnZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1kaXNrXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1kaXNrLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkci1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9ja2VyLXJlc291cmNlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2tlci1yZXNvdXJjZXMtYnRuJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLWNsb3NlJyk7XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYnl0ZXMpIHtcbiAgICBpZiAoIWJ5dGVzIHx8IGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQic7XG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhNYXRoLmFicyhieXRlcykpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdygxMDI0LCBpKSkudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgLy8gPT09PT0gVk9MVU1FUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVm9sdW1lcygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLWxpc3QnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnKTtcbiAgICAgIGNvbnN0IHZvbHMgPSBkYXRhLnZvbHVtZXMgfHwgW107XG4gICAgICBpZiAodm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gdm9sdW1lcyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TmFtZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkRyaXZlcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPlNjb3BlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2b2xzKSB7XG4gICAgICAgIGNvbnN0IGlzU3lzdGVtID0gdi5uYW1lID09PSAnYnVpbGRraXQnIHx8IHYubmFtZS5sZW5ndGggPT09IDY0O1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IG1heC13aWR0aDogMzAwcHg7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCI+JHtlc2NhcGVIdG1sKHYubmFtZS5sZW5ndGggPiA0MCA/IHYubmFtZS5zdWJzdHJpbmcoMCwgMzcpICsgJy4uLicgOiB2Lm5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHYuZHJpdmVyKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbCh2LnNjb3BlKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaWYgKCFpc1N5c3RlbSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJkci12b2wtZGVsXCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci12b2wtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgdm9sdW1lIFwiJHtidG4uZGF0YXNldC5uYW1lfVwiPyBEYXRhIHdpbGwgYmUgbG9zdC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvdm9sdW1lcy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5uYW1lKX0/Zm9yY2U9dHJ1ZWApO1xuICAgICAgICAgICAgbG9hZFZvbHVtZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZWxldGUnO1xuICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1uYW1lJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgdm9sdW1lIG5hbWUnLCAnd2FybmluZycpOyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnLCB7IG5hbWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFZvbHVtZSBcIiR7bmFtZX1cIiBjcmVhdGVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIGxvYWRWb2x1bWVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ3JlYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBORVRXT1JLUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTmV0d29ya3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1saXN0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycpO1xuICAgICAgY29uc3QgbmV0cyA9IGRhdGEubmV0d29ya3MgfHwgW107XG4gICAgICBpZiAobmV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0NcdURGMTA8L3NwYW4+Tm8gbmV0d29ya3MgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPk5hbWU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5Ecml2ZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5TY29wZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkNvbnRhaW5lcnM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5ldHMpIHtcbiAgICAgICAgY29uc3QgaXNTeXN0ZW0gPSBbJ2JyaWRnZScsICdob3N0JywgJ25vbmUnXS5pbmNsdWRlcyhuLm5hbWUpO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG4ubmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwobi5kcml2ZXIpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKG4uc2NvcGUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtuLmNvbnRhaW5lcnN9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGlmICghaXNTeXN0ZW0pIHtcbiAgICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwiZHItbmV0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwobi5pZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG4ubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci1uZXQtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgbmV0d29yayBcIiR7YnRuLmRhdGFzZXQubmFtZX1cIj9gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvbmV0d29ya3MvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWApO1xuICAgICAgICAgICAgbG9hZE5ldHdvcmtzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVsZXRlJztcbiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtY3JlYXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtbmFtZScpO1xuICAgIGNvbnN0IGRyaXZlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtZHJpdmVyJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgbmV0d29yayBuYW1lJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycsIHsgbmFtZSwgZHJpdmVyOiBkcml2ZXJTZWxlY3QudmFsdWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYE5ldHdvcmsgXCIke25hbWV9XCIgY3JlYXRlZGAsICdzdWNjZXNzJyk7XG4gICAgICBsb2FkTmV0d29ya3MoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDcmVhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IERJU0sgVVNBR0UgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZERpc2tVc2FnZSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItZGlzay1jb250ZW50Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9kaXNrLXVzYWdlJyk7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICAgICAgeyBsYWJlbDogJ0ltYWdlcycsIGljb246ICdcdUQ4M0RcdURDQzAnLCBjb3VudDogZGF0YS5pbWFnZXMuY291bnQsIHNpemU6IGRhdGEuaW1hZ2VzLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmltYWdlcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udGFpbmVycycsIGljb246ICdcdUQ4M0RcdURDRTYnLCBjb3VudDogZGF0YS5jb250YWluZXJzLmNvdW50LCBzaXplOiBkYXRhLmNvbnRhaW5lcnMuc2l6ZSwgZXh0cmE6IGAke2RhdGEuY29udGFpbmVycy5ydW5uaW5nfSBydW5uaW5nYCB9LFxuICAgICAgICB7IGxhYmVsOiAnVm9sdW1lcycsIGljb246ICdcdUQ4M0RcdURDQkUnLCBjb3VudDogZGF0YS52b2x1bWVzLmNvdW50LCBzaXplOiBkYXRhLnZvbHVtZXMuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEudm9sdW1lcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQnVpbGQgQ2FjaGUnLCBpY29uOiAnXHVEODNEXHVERDI3JywgY291bnQ6IGRhdGEuYnVpbGRDYWNoZS5jb3VudCwgc2l6ZTogZGF0YS5idWlsZENhY2hlLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmJ1aWxkQ2FjaGUucmVjbGFpbWFibGUgfSxcbiAgICAgIF07XG5cbiAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5Ub3RhbDogJHtmbXRCeXRlcyhkYXRhLnRvdGFsU2l6ZSl9PC9kaXY+YDtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7cy5pY29ufSAke3MubGFiZWx9IDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjgycmVtO1wiPigke3MuY291bnR9KTwvc3Bhbj48L2Rpdj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPiR7Zm10Qnl0ZXMocy5zaXplKX08L2Rpdj5gO1xuICAgICAgICBpZiAocy5yZWNsYWltYWJsZSA+IDApIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UmVjbGFpbWFibGU6ICR7Zm10Qnl0ZXMocy5yZWNsYWltYWJsZSl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHMuZXh0cmEpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtzLmV4dHJhfTwvZGl2PmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBNb2RhbCBldmVudHNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkVm9sdW1lcygpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjbG9zZUJ0bik7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJkci1uZXR3b3Jrc1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWROZXR3b3Jrcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiZHItZGlza1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrVXNhZ2UpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIENPTVBPU0UgSU1QT1JUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2NvbXBvc2UtaW1wb3J0LW1vZGFsJywgYDxkaXYgaWQ9XCJjb21wb3NlLWltcG9ydC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjUwcHg7IG1heC13aWR0aDogODAwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0U2IEltcG9ydCBEb2NrZXIgQ29tcG9zZTwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+UGFzdGUgYSBkb2NrZXItY29tcG9zZS55bWwgdG8gaW1wb3J0IGFuZCBkZXBsb3kgc2VydmljZXMuPC9wPlxuXG4gICAgICA8IS0tIFN0ZXAgMTogUGFzdGUgWUFNTCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcGFzdGVcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5TdGFjayBOYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNvbXBvc2Utc3RhY2stbmFtZVwiIHBsYWNlaG9sZGVyPVwibXktc3RhY2tcIiB2YWx1ZT1cIlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5kb2NrZXItY29tcG9zZS55bWw8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImNvbXBvc2UteWFtbFwiIHJvd3M9XCIxNFwiIHBsYWNlaG9sZGVyPVwidmVyc2lvbjogJzMnJiMxMDtzZXJ2aWNlczomIzEwOyAgd2ViOiYjMTA7ICAgIGltYWdlOiBuZ2lueDpsYXRlc3QmIzEwOyAgICBwb3J0czomIzEwOyAgICAgIC0gJzgwODA6ODAnXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjgycmVtOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgcmVzaXplOiB2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImNvbXBvc2UtZmlsZS11cGxvYWRcIiBhY2NlcHQ9XCIueW1sLC55YW1sXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+b3IgdXBsb2FkIGEgZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1wYXJzZS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4O1wiPlBhcnNlICYgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMjogUHJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cImNvbXBvc2UtcHJldmlldy1jb250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1kZXBsb3ktYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDtcIj5EZXBsb3kgQWxsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtYmFjay1idG5cIj5CYWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAzOiBQcm9ncmVzcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJvZ3Jlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXByb2dyZXNzLWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWltcG9ydC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtaW1wb3J0LWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1jYW5jZWwnKTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgbGV0IHBhcnNlZERhdGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHNob3dTdGVwKHN0ZXApIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXBhc3RlJykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwYXN0ZScgPyAnJyA6ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXByZXZpZXcnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3ByZXZpZXcnID8gJycgOiAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RlcC1wcm9ncmVzcycpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncHJvZ3Jlc3MnID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzaG93U3RlcCgncGFzdGUnKTtcbiAgICBwYXJzZWREYXRhID0gbnVsbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUgPSAnJztcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBGaWxlIHVwbG9hZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1maWxlLXVwbG9hZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZSA9IHJlYWRlci5yZXN1bHQ7IH07XG4gICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFBhcnNlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXBhcnNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YW1sU3RyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdGFja05hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUudHJpbSgpIHx8ICdzdGFjayc7XG4gICAgaWYgKCF5YW1sU3RyKSB7IHNob3dOb3RpZmljYXRpb24oJ1Bhc3RlIGEgZG9ja2VyLWNvbXBvc2UueW1sJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wYXJzZS1idG4nKTtcbiAgICBjb25zdCBvcmlnVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnUGFyc2luZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9pbXBvcnQtY29tcG9zZScsIHsgeWFtbDogeWFtbFN0ciwgc3RhY2tOYW1lIH0pO1xuICAgICAgcGFyc2VkRGF0YSA9IGRhdGE7XG4gICAgICBwYXJzZWREYXRhLnN0YWNrTmFtZSA9IHN0YWNrTmFtZTtcbiAgICAgIHJlbmRlclByZXZpZXcoZGF0YSk7XG4gICAgICBzaG93U3RlcCgncHJldmlldycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BhcnNlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdUZXh0O1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiByZW5kZXJQcmV2aWV3KGRhdGEpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKGRhdGEubmV0d29ya3MgJiYgZGF0YS5uZXR3b3Jrcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5ldHdvcmtzOiAke2RhdGEubmV0d29ya3MubWFwKG4gPT4gYDxjb2RlPiR7ZXNjYXBlSHRtbChuKX08L2NvZGU+YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgIH1cbiAgICBpZiAoZGF0YS52b2x1bWVzICYmIGRhdGEudm9sdW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZvbHVtZXM6ICR7ZGF0YS52b2x1bWVzLm1hcCh2ID0+IGA8Y29kZT4ke2VzY2FwZUh0bWwodil9PC9jb2RlPmApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICB9XG5cbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPiR7ZGF0YS5zZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2Uocyk8L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzNTBweDtcIj4nO1xuXG4gICAgZm9yIChjb25zdCBzdmMgb2YgZGF0YS5zZXJ2aWNlcykge1xuICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBzdmMuc2tpcCA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiPmA7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKHN2Yy5uYW1lKX1gO1xuICAgICAgaWYgKHN2Yy5za2lwKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlx1MjAxNCBza2lwcGVkOiAke2VzY2FwZUh0bWwoc3ZjLnJlYXNvbil9PC9zcGFuPmA7XG4gICAgICBodG1sICs9IGA8L2Rpdj5gO1xuXG4gICAgICBpZiAoIXN2Yy5za2lwKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkltYWdlOiA8Y29kZT4ke2VzY2FwZUh0bWwoc3ZjLmltYWdlKX08L2NvZGU+PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5wb3J0cz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UG9ydHM6ICR7c3ZjLnBvcnRzLm1hcChwID0+IGAke3AuaG9zdH06JHtwLmNvbnRhaW5lcn1gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMudm9sdW1lcz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Vm9sdW1lczogJHtzdmMudm9sdW1lcy5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN2Yy5lbnZpcm9ubWVudCB8fCB7fSkubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RW52IHZhcnM6ICR7T2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5lbnZGaWxlV2FybmluZykgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChzdmMuZW52RmlsZVdhcm5pbmcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMucmVzb3VyY2VzPy5jcHVzIHx8IHN2Yy5yZXNvdXJjZXM/Lm1lbW9yeSkge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXMuY3B1cykgcGFydHMucHVzaChgQ1BVOiAke3N2Yy5yZXNvdXJjZXMuY3B1c31gKTtcbiAgICAgICAgICBpZiAoc3ZjLnJlc291cmNlcy5tZW1vcnkpIHBhcnRzLnB1c2goYE1lbTogJHtzdmMucmVzb3VyY2VzLm1lbW9yeX1NQmApO1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5MaW1pdHM6ICR7cGFydHMuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBCYWNrIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1iYWNrLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dTdGVwKCdwYXN0ZScpKTtcblxuICAvLyBEZXBsb3lcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZGVwbG95LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXBhcnNlZERhdGEpIHJldHVybjtcblxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRlcGxveS1idG4nKTtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95aW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNob3dTdGVwKCdwcm9ncmVzcycpO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXByb2dyZXNzLWNvbnRlbnQnKTtcbiAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IERlcGxveWluZyBzZXJ2aWNlcy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9kZXBsb3ktY29tcG9zZScsIHtcbiAgICAgICAgc2VydmljZXM6IHBhcnNlZERhdGEuc2VydmljZXMsXG4gICAgICAgIG5ldHdvcmtzOiBwYXJzZWREYXRhLm5ldHdvcmtzLFxuICAgICAgICBzdGFja05hbWU6IHBhcnNlZERhdGEuc3RhY2tOYW1lXG4gICAgICB9KTtcblxuICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+U3RhY2sgXCIke2VzY2FwZUh0bWwocmVzdWx0LnN0YWNrTmFtZSl9XCIgXHUyMDE0IERlcGxveW1lbnQgQ29tcGxldGU8L2Rpdj5gO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDM1MHB4O1wiPic7XG5cbiAgICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQucmVzdWx0cykge1xuICAgICAgICBjb25zdCBpY29uID0gci5zdGF0dXMgPT09ICdkZXBsb3llZCcgfHwgci5zdGF0dXMgPT09ICdjcmVhdGVkJyA/ICdcdTI3MDUnIDogci5zdGF0dXMgPT09ICdleGlzdHMnID8gJ1x1MjZBMScgOiByLnN0YXR1cyA9PT0gJ3NraXBwZWQnID8gJ1x1MjNFRCcgOiAnXHUyNzRDJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYCR7aWNvbn0gPHN0cm9uZz4ke2VzY2FwZUh0bWwoci5uYW1lKX08L3N0cm9uZz4gKCR7ci50eXBlfSkgXHUyMDE0ICR7ZXNjYXBlSHRtbChyLnN0YXR1cyl9YDtcbiAgICAgICAgaWYgKHIuZXJyb3IpIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChyLmVycm9yKX08L3NwYW4+YDtcbiAgICAgICAgaWYgKHIuc3ViZG9tYWluKSBodG1sICs9IGAgXHUyMTkyIDxjb2RlPiR7ZXNjYXBlSHRtbChyLnN1YmRvbWFpbil9PC9jb2RlPmA7XG4gICAgICAgIGlmIChyLnJlYXNvbikgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4oJHtlc2NhcGVIdG1sKHIucmVhc29uKX0pPC9zcGFuPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLWRvbmUtYnRuXCI+RG9uZTwvYnV0dG9uPjwvZGl2Pic7XG5cbiAgICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRvbmUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2FkU2VydmljZXMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5sb2FkU2VydmljZXMoKS50aGVuKCgpID0+IHsgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuYnVpbGRHcmlkKCk7IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFN0YWNrIFwiJHtyZXN1bHQuc3RhY2tOYW1lfVwiIGRlcGxveWVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlcGxveW1lbnQgZmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLXJldHJ5LWJ0blwiPkJhY2s8L2J1dHRvbj48L2Rpdj5gO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcmV0cnktYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd1N0ZXAoJ3Bhc3RlJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95IEFsbCc7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ09OVEFJTkVSIEVYRUMgLyBTSEVMTCAoV2ViU29ja2V0ICsgeHRlcm0uanMpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2V4ZWMtbW9kYWwnLCBgPGRpdiBpZD1cImV4ZWMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDcwMHB4OyBtYXgtd2lkdGg6IDkwMHB4OyBwYWRkaW5nLWJvdHRvbTogMDtcIj5cbiAgICAgIDxoMyBpZD1cImV4ZWMtdGl0bGVcIj5UZXJtaW5hbDwvaDM+XG4gICAgICA8ZGl2IGlkPVwiZXhlYy10ZXJtaW5hbFwiIHN0eWxlPVwiaGVpZ2h0OiA0MjBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBiYWNrZ3JvdW5kOiAjMWUxZTFlO1wiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXhlYy1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1tb2RhbCcpO1xuICBjb25zdCB0ZXJtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy10ZXJtaW5hbCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLWNsb3NlJyk7XG5cbiAgbGV0IHRlcm0gPSBudWxsO1xuICBsZXQgd3MgPSBudWxsO1xuICBsZXQgZml0QWRkb24gPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgaWYgKHdzKSB7IHRyeSB7IHdzLmNsb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IHdzID0gbnVsbDsgfVxuICAgIGlmICh0ZXJtKSB7IHRyeSB7IHRlcm0uZGlzcG9zZSgpOyB9IGNhdGNoIChfKSB7fSB0ZXJtID0gbnVsbDsgfVxuICAgIGZpdEFkZG9uID0gbnVsbDtcbiAgICB0ZXJtRWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRXhlYyhjb250YWluZXJJZCwgY29udGFpbmVyTmFtZSkge1xuICAgIGNsZWFudXAoKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXRpdGxlJykudGV4dENvbnRlbnQgPSBgVGVybWluYWwgXHUyMDE0ICR7Y29udGFpbmVyTmFtZSB8fCBjb250YWluZXJJZH1gO1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBFbnN1cmUgeHRlcm0gaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBUZXJtaW5hbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRlcm1FbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiAjZjQ0OyBwYWRkaW5nOiAyMHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPnh0ZXJtLmpzIG5vdCBsb2FkZWQ8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRlcm0gPSBuZXcgVGVybWluYWwoe1xuICAgICAgY3Vyc29yQmxpbms6IHRydWUsXG4gICAgICBmb250U2l6ZTogMTQsXG4gICAgICBmb250RmFtaWx5OiBcIidDYXNjYWRpYSBDb2RlJywgJ0ZpcmEgQ29kZScsICdDb25zb2xhcycsIG1vbm9zcGFjZVwiLFxuICAgICAgdGhlbWU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogJyMxZTFlMWUnLFxuICAgICAgICBmb3JlZ3JvdW5kOiAnI2Q0ZDRkNCcsXG4gICAgICAgIGN1cnNvcjogJyNhZWFmYWQnLFxuICAgICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAnIzI2NGY3OCcsXG4gICAgICB9LFxuICAgICAgc2Nyb2xsYmFjazogNTAwMCxcbiAgICB9KTtcblxuICAgIC8vIEZpdCBhZGRvblxuICAgIGlmICh0eXBlb2YgRml0QWRkb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBmaXRBZGRvbiA9IG5ldyBGaXRBZGRvbi5GaXRBZGRvbigpO1xuICAgICAgdGVybS5sb2FkQWRkb24oZml0QWRkb24pO1xuICAgIH1cblxuICAgIHRlcm0ub3Blbih0ZXJtRWwpO1xuICAgIGlmIChmaXRBZGRvbikge1xuICAgICAgLy8gU21hbGwgZGVsYXkgZm9yIERPTSB0byBzZXR0bGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZml0QWRkb24uZml0KCksIDUwKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IFdlYlNvY2tldFxuICAgIGNvbnN0IHByb3RvY29sID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgd3MgPSBuZXcgV2ViU29ja2V0KGAke3Byb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fS93cy9leGVjLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lcklkKX1gKTtcbiAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgIHdzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRlcm0ud3JpdGVsbignXFx4MWJbMzJtQ29ubmVjdGluZy4uLlxceDFiWzBtJyk7XG4gICAgICAvLyBTZW5kIGluaXRpYWwgcmVzaXplXG4gICAgICBpZiAoZml0QWRkb24pIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGZpdEFkZG9uLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgICAgIGlmIChkaW1zKSB7XG4gICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdyZXNpemUnLCBjb2xzOiBkaW1zLmNvbHMsIHJvd3M6IGRpbXMucm93cyB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd3Mub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZS5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oYFxceDFiWzMybUNvbm5lY3RlZCAoJHttc2cuc2hlbGx9KVxceDFiWzBtXFxyXFxuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKGBcXHgxYlszMW1FcnJvcjogJHttc2cubWVzc2FnZX1cXHgxYlswbWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21TZXNzaW9uIGVuZGVkLlxceDFiWzBtJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICAvLyBQbGFpbiB0ZXh0XG4gICAgICAgIHRlcm0ud3JpdGUoZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJpbmFyeSBkYXRhXG4gICAgICAgIHRlcm0ud3JpdGUobmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGVybSkgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21EaXNjb25uZWN0ZWQuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgd3Mub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGlmICh0ZXJtKSB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMxbUNvbm5lY3Rpb24gZXJyb3IuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgLy8gVGVybWluYWwgaW5wdXQgXHUyMTkyIFdlYlNvY2tldFxuICAgIHRlcm0ub25EYXRhKChkYXRhKSA9PiB7XG4gICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSByZXNpemVcbiAgICB0ZXJtLm9uUmVzaXplKCh7IGNvbHMsIHJvd3MgfSkgPT4ge1xuICAgICAgaWYgKHdzICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncmVzaXplJywgY29scywgcm93cyB9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZS1maXQgb24gd2luZG93IHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7IGlmIChmaXRBZGRvbikgZml0QWRkb24uZml0KCk7IH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuXG4gICAgLy8gU3RvcmUgaGFuZGxlciBmb3IgY2xlYW51cFxuICAgIG1vZGFsLl9yZXNpemVIYW5kbGVyID0gcmVzaXplSGFuZGxlcjtcbiAgfVxuXG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cbiAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBBbHNvIGNsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtb2RhbC5fcmVzaXplSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3J0XG4gIHdpbmRvdy5vcGVuRXhlY01vZGFsID0gb3BlbkV4ZWM7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBBVURJVCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIERDLTA1MDogc3VyZmFjZSBhdXRoZW50aWNhdGVkIHVzZXIgaWRlbnRpdHkgKHVzZXJFbWFpbCAvIHVzZXJSb2xlIGZyb21cbi8vIGF1ZGl0TG9nZ2VyLmRldGFpbHMpLCBhZGQgb3V0Y29tZSBmaWx0ZXIsIHBhc3MgY29uZmlybT1DTEVBUiBib2R5IGZvclxuLy8gZGVzdHJ1Y3RpdmUgREVMRVRFLlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYXVkaXQtbW9kYWwnLCBgPGRpdiBpZD1cImF1ZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5NTBweDsgbWF4LXdpZHRoOiAxMTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0RDIEF1ZGl0IExvZzwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFRyYWNrIGFsbCBhY3Rpb25zIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBBUEkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNhdGVnb3J5OjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJhdWRpdC1maWx0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VydmljZVwiPlNlcnZpY2VzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRhaW5lclwiPkNvbnRhaW5lcnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2FkZHlcIj5DYWRkeTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkbnNcIj5ETlM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYmFja3VwXCI+QmFja3Vwczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb25maWdcIj5Db25maWc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXV0aFwiPkF1dGg8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5SZXN1bHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImF1ZGl0LW91dGNvbWUtZmlsdGVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QW55PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN1Y2Nlc3NcIj5cdTI3MTMgU3VjY2Vzczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsdXJlXCI+XHUyNzE3IEZhaWx1cmU8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiYXVkaXQtc2luY2VcIiB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5VbnRpbDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdWRpdC11bnRpbFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtY2xlYXItYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHVEODNEXHVEREQxXHVGRTBGIENsZWFyIExvZzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJhdWRpdC1sb2ctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBhdWRpdCBsb2cuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtbG9hZC1tb3JlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+TG9hZCBNb3JlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9nLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2xlYXItYnRuJyk7XG4gIGNvbnN0IGZpbHRlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1maWx0ZXInKTtcbiAgY29uc3Qgb3V0Y29tZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1vdXRjb21lLWZpbHRlcicpO1xuICBjb25zdCBzaW5jZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LXNpbmNlJyk7XG4gIGNvbnN0IHVudGlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9hZC1tb3JlJyk7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDsgLy8gQWJvcnRDb250cm9sbGVyIGZvciB0aGUgaW4tZmxpZ2h0IHJlcXVlc3RcbiAgbGV0IGZpbHRlck5vbmNlID0gMDsgLy8gaW5jcmVtZW50cyBvbiBldmVyeSBmcmVzaCAobm9uLWFwcGVuZCkgbG9hZDsgbGV0c1xuICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBpbi1mbGlnaHQgYXBwZW5kIGRldGVjdCB0aGUgZmlsdGVyIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBza2lwIGl0cyBET00gc3BsaWNlLlxuICBjb25zdCBQQUdFX1NJWkUgPSA1MDtcblxuICAvLyBkYXRldGltZS1sb2NhbCBmaWVsZHMgY2Fycnkgbm8gdGltZXpvbmUgb2Zmc2V0IFx1MjAxNCBjb252ZXJ0IHRvIElTTyA4NjAxXG4gIC8vIHdpdGggdGhlIGxvY2FsIG9mZnNldCBzbyB0aGUgc2VydmVyIGNhbiBjb21wYXJlIGNvcnJlY3RseS5cbiAgZnVuY3Rpb24gdG9Jc28obG9jYWxEdFZhbHVlKSB7XG4gICAgaWYgKCFsb2NhbER0VmFsdWUpIHJldHVybiBudWxsO1xuICAgIC8vIEJyb3dzZXJzIGV4cG9zZSBkYXRldGltZS1sb2NhbCBhcyBuYWl2ZSBsb2NhbCB0aW1lLiBuZXcgRGF0ZSgpIG9uXG4gICAgLy8gdGhhdCBzdHJpbmcgcGFyc2VzIGl0IGFzIExPQ0FMLCBzbyB0b0lTT1N0cmluZygpIHlpZWxkcyB0aGUgVVRDXG4gICAgLy8gZXF1aXZhbGVudCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdWRpdChhcHBlbmQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QgYW5kIGJ1bXAgdGhlIGZpbHRlciBub25jZSBzbyBhbnlcbiAgICAgICAgLy8gYXBwZW5kaW5nIGZldGNoIChzdGlsbCBpbiBmbGlnaHQpIGtub3dzIHRvIGRpc2NhcmQgaXRzIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgICAgICAgZmlsdGVyTm9uY2UrKztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZmxpZ2h0KSBpbmZsaWdodC5hYm9ydCgpO1xuICAgICAgICBpbmZsaWdodCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG15Tm9uY2UgPSBmaWx0ZXJOb25jZTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgICAgcGFyYW1zLnNldCgnb2Zmc2V0JywgU3RyaW5nKGN1cnJlbnRPZmZzZXQpKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZpbHRlclNlbGVjdC52YWx1ZTtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lU2VsZWN0LnZhbHVlO1xuICAgICAgY29uc3Qgc2luY2UgPSB0b0lzbyhzaW5jZUlucHV0LnZhbHVlKTtcbiAgICAgIGNvbnN0IHVudGlsID0gdG9Jc28odW50aWxJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoYWN0aW9uKSBwYXJhbXMuc2V0KCdhY3Rpb24nLCBhY3Rpb24pO1xuICAgICAgaWYgKG91dGNvbWUpIHBhcmFtcy5zZXQoJ291dGNvbWUnLCBvdXRjb21lKTtcbiAgICAgIGlmIChzaW5jZSkgcGFyYW1zLnNldCgnc2luY2UnLCBzaW5jZSk7XG4gICAgICBpZiAodW50aWwpIHBhcmFtcy5zZXQoJ3VudGlsJywgdW50aWwpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gU3VyZmFjZSA0MDEvNDAzLzUwMCBleHBsaWNpdGx5IFx1MjAxNCB0aGUgZGFzaGJvYXJkIHVzZWQgdG8gcmVuZGVyIGFueVxuICAgICAgLy8gbm9uLXN1Y2Nlc3MgcmVzcG9uc2UgYXMgXCJubyBhdWRpdCBsb2cgZW50cmllcyB5ZXQsXCIgd2hpY2ggaXNcbiAgICAgIC8vIG1pc2xlYWRpbmcgZm9yIGFuIGV4cGlyZWQgc2Vzc2lvbi5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6IEhUVFAgJHtyZXMuc3RhdHVzfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24nKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBJZiBhIG5vbi1hcHBlbmQgbG9hZCBoYXBwZW5lZCBhZnRlciB0aGlzIGZldGNoIHdhcyBpc3N1ZWQsIHRoZVxuICAgICAgLy8gb3BlcmF0b3IgY2hhbmdlZCBmaWx0ZXJzOyBkaXNjYXJkIHRoZSBub3ctc3RhbGUgcmVzcG9uc2UuXG4gICAgICBpZiAoIWFwcGVuZCAmJiBteU5vbmNlICE9PSBmaWx0ZXJOb25jZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5lbnRyaWVzKSA/IGRhdGEuZW50cmllcyA6IFtdO1xuXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgJiYgIWFwcGVuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5hY3Rpb24gfHwgZGF0YS5maWx0ZXJzLm91dGNvbWUgfHwgZGF0YS5maWx0ZXJzLnNpbmNlIHx8IGRhdGEuZmlsdGVycy51bnRpbClcbiAgICAgICAgICA/ICdObyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnTm8gYXVkaXQgbG9nIGVudHJpZXMgeWV0LiBBY3Rpb25zIHdpbGwgYmUgbG9nZ2VkIGF1dG9tYXRpY2FsbHkuJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDREM8L3NwYW4+JHtlc2NhcGVIdG1sKHJlYXNvbil9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+QWN0b3I8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JUDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkFjdGlvbjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlJlc291cmNlPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+UmVzdWx0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IG9rID0gZS5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gYWN0b3JMYWJlbChlKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImF1ZGl0LXJvd1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChlLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHt0aW1lQWdvKGUudGltZXN0YW1wKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPiR7YWN0b3J9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoZS5pcCB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChlLmFjdGlvbiB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChlLnJlc291cmNlIHx8ICctJyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMycgOiAnXHUyNzE3J30gJHtlc2NhcGVIdG1sKGUub3V0Y29tZSB8fCAnJyl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoZS5kZXRhaWxzICYmIE9iamVjdC5rZXlzKGUuZGV0YWlscykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImF1ZGl0LWRldGFpbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjZcIiBzdHlsZT1cInBhZGRpbmc6IDZweCA2cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjxwcmUgc3R5bGU9XCJtYXJnaW46IDA7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoZS5kZXRhaWxzLCBudWxsLCAyKSl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIC8vIGhhc01vcmUgaXMgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciAocG9zdC1maWx0ZXIgdG90YWwpLCBzbyB0aGVcbiAgICAgIC8vIExvYWQgTW9yZSBidXR0b24gc3RheXMgYWNjdXJhdGUgd2hlbiBmaWx0ZXJzIGNoYW5nZSBtaWQtc2Nyb2xsLlxuICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzTW9yZSA/ICcnIDogJ25vbmUnO1xuXG4gICAgICAvLyBUb2dnbGUgZGV0YWlsIHJvd3Mgb24gY2xpY2tcbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYXVkaXQtcm93JykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93LmRhdGFzZXQud2lyZWQpIHJldHVybjtcbiAgICAgICAgcm93LmRhdGFzZXQud2lyZWQgPSAndHJ1ZSc7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSByb3cubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIGlmIChkZXRhaWwgJiYgZGV0YWlsLmNsYXNzTGlzdC5jb250YWlucygnYXVkaXQtZGV0YWlsJykpIHtcbiAgICAgICAgICAgIGRldGFpbC5zdHlsZS5kaXNwbGF5ID0gZGV0YWlsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICcnIDogJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkIHdoZW4gd2UgZGVsaWJlcmF0ZWx5IGNhbmNlbCBhbiBpbi1mbGlnaHRcbiAgICAgIC8vIHJlcXVlc3QgKGUuZy4gdGhlIG9wZXJhdG9yIGNoYW5nZWQgZmlsdGVycyBtaWQtZmV0Y2gpIFx1MjAxNCBkb24ndFxuICAgICAgLy8gZmxhc2ggYSBcIkZhaWxlZDogVGhlIHVzZXIgYWJvcnRlZCBhIHJlcXVlc3RcIiBtZXNzYWdlIG92ZXIgdGhlXG4gICAgICAvLyBsb2FkaW5nIHNwaW5uZXIuIFRoZSBuZXcgZmV0Y2ggaGFzIGFscmVhZHkga2lja2VkIG9mZi5cbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbmRlciB0aGUgaHVtYW4tcmVhZGFibGUgYWN0b3I6IHByZWZlciB1c2VyRW1haWwsIGZhbGwgYmFjayB0b1xuICAvLyB1c2VySWQsIGZhbGwgYmFjayB0byBiYXJlIElQLiBJZiBubyB1c2VyIGF0dHJpYnV0aW9uLCBtYXJrIGFzXG4gIC8vIFwic3lzdGVtXCIgc28gdGhlIG9wZXJhdG9yIGtub3dzIHRoZSBlbnRyeSBjYW1lIGZyb20gYW4gdW5hdXRoZW50aWNhdGVkXG4gIC8vIG9yIHNlcnZpY2UgcGF0aCAoZS5nLiBjcm9uLWRyaXZlbiBiYWNrdXBzKS5cbiAgZnVuY3Rpb24gYWN0b3JMYWJlbChlbnRyeSkge1xuICAgIGNvbnN0IGQgPSBlbnRyeS5kZXRhaWxzIHx8IHt9O1xuICAgIGNvbnN0IGVtYWlsID0gZC51c2VyRW1haWw7XG4gICAgY29uc3QgaWQgPSBkLnVzZXJJZDtcbiAgICBjb25zdCByb2xlID0gZC51c2VyUm9sZTtcbiAgICBjb25zdCBwcm92aWRlciA9IGQudmlhUHJvdmlkZXI7XG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICBjb25zdCB0YWcgPSByb2xlID8gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43MnJlbTtcIj5bJHtlc2NhcGVIdG1sKHJvbGUpfSR7cHJvdmlkZXIgPyAnLycgKyBlc2NhcGVIdG1sKHByb3ZpZGVyKSA6ICcnfV08L3NwYW4+YCA6ICcnO1xuICAgICAgcmV0dXJuIGAke2VzY2FwZUh0bWwoZW1haWwpfSR7dGFnfWA7XG4gICAgfVxuICAgIGlmIChpZCkgcmV0dXJuIGA8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKGlkKX08L3NwYW4+YDtcbiAgICBpZiAoIWVudHJ5LmlwKSByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5zeXN0ZW08L3NwYW4+JztcbiAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5hbm9uPC9zcGFuPic7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdWRpdChmYWxzZSk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIGZpbHRlclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIG91dGNvbWVTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRBdWRpdChmYWxzZSkpO1xuICAvLyBSZS1mZXRjaCBvbiBkYXRlIGNoYW5nZSBvbmx5IHdoZW4gYm90aCBmaWVsZHMgaGF2ZSBhIHZhbHVlIG9yIGJvdGggYXJlXG4gIC8vIGVtcHR5IFx1MjAxNCB0eXBpbmcgb25lIGNoYXJhY3RlciBzaG91bGRuJ3QgdHJpZ2dlciBhIGZldGNoIGZvciBldmVyeSBrZXlzdHJva2UuXG4gIGxldCBkYXRlRGVib3VuY2U7XG4gIFtzaW5jZUlucHV0LCB1bnRpbElucHV0XS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoZGF0ZURlYm91bmNlKTtcbiAgICAgIGRhdGVEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSwgMjUwKTtcbiAgICB9KTtcbiAgfSk7XG4gIGxvYWRNb3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRBdWRpdCh0cnVlKSk7XG5cbiAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBhdWRpdCBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIGxvYWRBdWRpdChmYWxzZSk7XG4gICAgICBlbHNlIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBTRUNVUklUWSBDRU5URVIgPT09PT09PT09PVxuLy8gTXVsdGktc291cmNlIHNlY3VyaXR5IGV2ZW50IHZpZXdlciArIGhvc3QgcmVnaXN0cnkgVUkuXG4vL1xuLy8gU2hvd3MgbGl2ZSBldmVudHMgZnJvbSBhbnkgc291cmNlIChBUEkgYXVkaXQsIENhZGR5IGFjY2VzcyBsb2csIGZhaWwyYmFuLFxuLy8gc2hhcmVkX2JhbnMpIG9uIGFueSByZWdpc3RlcmVkIGhvc3QgKHRoaXMgRGFzaENhZGR5LCBmdXR1cmUgcmVtb3RlIGFnZW50cykuXG4vL1xuLy8gTGl2ZS10YWlsIHVzZXMgU1NFICgvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdHJlYW0pLlxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnc2VjdXJpdHktbW9kYWwnLCBgPGRpdiBpZD1cInNlY3VyaXR5LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5ODBweDsgbWF4LXdpZHRoOiAxMjgwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVERUUxXHVGRTBGIFNlY3VyaXR5IENlbnRlcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIExpdmUgZXZlbnRzIGZyb20gQVBJLCBDYWRkeSwgZmFpbDJiYW4gJiBzaGFyZWRfYmFucy4gTGl2ZS10YWlsIHZpYSBTU0UuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtdGFic1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwib3ZlcnZpZXdcIj5PdmVydmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYlwiIGRhdGEtdGFiPVwiZXZlbnRzXCI+RXZlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiXCIgZGF0YS10YWI9XCJob3N0c1wiPkhvc3RzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBPVkVSVklFVyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cIm92ZXJ2aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdHNcIiBpZD1cInNlYy1zdGF0c1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MThweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cInRvdGFsXCI+XHUyMDE0IGV2ZW50czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwid2FyblwiPlx1MjAxNCB3YXJuaW5nczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiZXJyb3JcIj5cdTIwMTQgZXJyb3JzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJkZW5pZWRcIj5cdTIwMTQgZGVuaWVkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJob3N0c1wiPlx1MjAxNCBob3N0czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgQWN0b3JzICgyNGgpPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWMtdG9wLWFjdG9yc1wiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoyNDBweDtcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgVGFyZ2V0cyAoMjRoKTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjLXRvcC10YXJnZXRzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjI0MHB4O1wiPlx1MjAxNDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVWRU5UUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImV2ZW50c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zb3VyY2VcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgc291cmNlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFwaVwiPkFQSTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsMmJhblwiPmZhaWwyYmFuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2hhcmVkLWJhbnNcIj5zaGFyZWRfYmFuczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFnZW50XCI+QWdlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zZXZlcml0eVwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBzZXZlcml0aWVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3JpdGljYWxcIj5jcml0aWNhbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+ZXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuXCI+d2Fybjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vdGljZVwiPm5vdGljZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZm9cIj5pbmZvPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItaG9zdFwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCBpZD1cInNlYy1maWx0ZXItYWN0b3JcIiBjbGFzcz1cInNlYy1maWx0ZXJcIiBwbGFjZWhvbGRlcj1cImFjdG9yIChJUCBvciB1c2VyKVwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VjLWxpdmUtdGFpbFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICA8c3Bhbj5MaXZlIHRhaWw8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzZWMtZXZlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIT1NUUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImhvc3RzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1ob3N0LXJlZ2lzdGVyLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHUyNzk1IFJlZ2lzdGVyIEhvc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWhvc3RzLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2VjLWhvc3RzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PT09PT09PT09IFNUQVRFID09PT09PT09PT09PT1cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdXJpdHktbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN1cml0eS1jZW50ZXItYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtY2FuY2VsJyk7XG4gIGNvbnN0IHRhYnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXRhYicpO1xuICBjb25zdCBwYW5lbHMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXBhbmVsJyk7XG5cbiAgbGV0IGFsbEV2ZW50cyA9IFtdOyAvLyBuZXdlc3QgZmlyc3RcbiAgbGV0IGFsbEhvc3RzID0gW107XG4gIGxldCBzc2VTb3VyY2UgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT0gVEFCIFNXSVRDSElORyA9PT09PT09PT09PT09XG4gIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRhYnMuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdCA9PT0gdGFiKSk7XG4gICAgICBwYW5lbHMuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gdGFiLmRhdGFzZXQudGFiID8gJycgOiAnbm9uZScpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ292ZXJ2aWV3JykgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnZXZlbnRzJykgcmVmcmVzaEV2ZW50cygpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ2hvc3RzJykgcmVmcmVzaEhvc3RzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT0gT1BFTi9DTE9TRSA9PT09PT09PT09PT09XG4gIGlmIChvcGVuQnRuKSB7XG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgc3RhcnRMaXZlVGFpbCgpO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBjbG9zZU1vZGFsKCk7IH0pO1xuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gTElWRSBUQUlMIChTU0UpID09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gc3RhcnRMaXZlVGFpbCgpIHtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtbGl2ZS10YWlsJykuY2hlY2tlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgRXZlbnRTb3VyY2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm47IC8vIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHNzZVNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RyZWFtJyk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignaW5pdCcsIChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgICAgICByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHknLCAoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV2ID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGFsbEV2ZW50cy51bnNoaWZ0KGV2KTtcbiAgICAgICAgICBpZiAoYWxsRXZlbnRzLmxlbmd0aCA+IDUwMCkgYWxsRXZlbnRzLmxlbmd0aCA9IDUwMDtcbiAgICAgICAgICAvLyBBdXRvLXJlZnJlc2ggd2hpY2hldmVyIHBhbmVsIGlzIHNob3dpbmdcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2VjLXRhYi5hY3RpdmUnKT8uZGF0YXNldD8udGFiO1xuICAgICAgICAgIGlmIChhY3RpdmUgPT09ICdldmVudHMnKSByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgICBlbHNlIGlmIChhY3RpdmUgPT09ICdvdmVydmlldycpIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9KTtcbiAgICAgIHNzZVNvdXJjZS5vbmVycm9yID0gKCkgPT4geyAvKiBicm93c2VyIGF1dG8tcmVjb25uZWN0cyAqLyB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSBTU0UgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0b3BMaXZlVGFpbCgpIHtcbiAgICBpZiAoc3NlU291cmNlKSB7IHRyeSB7IHNzZVNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIHt9IHNzZVNvdXJjZSA9IG51bGw7IH1cbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWxpdmUtdGFpbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHN0YXJ0TGl2ZVRhaWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PSBPVkVSVklFVyA9PT09PT09PT09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hPdmVydmlldygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQqNjAqNjAqMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IFtzdGF0c1JlcywgaG9zdHNSZXMsIGV2ZW50c1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdGF0cz9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaW5jZSl9YCksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyksXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cz9saW1pdD0xJnNpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNpbmNlKX1gKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgc3RhdHMgPSAoYXdhaXQgc3RhdHNSZXMuanNvbigpKS5kYXRhIHx8IHt9O1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgaG9zdHNSZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGV2ZW50c0NvdW50ID0gKGF3YWl0IGV2ZW50c1Jlcy5qc29uKCkpLmRhdGE/LnRvdGFsIHx8IDA7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwidG90YWxcIl0nKS50ZXh0Q29udGVudCA9IGAke2V2ZW50c0NvdW50fSBldmVudHMgKDI0aClgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJ3YXJuXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8ud2FybiB8fCAwfSB3YXJuaW5nc2A7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImVycm9yXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8uZXJyb3IgfHwgMH0gZXJyb3JzYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiZGVuaWVkXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9vdXRjb21lPy5kZW5pZWQgfHwgMH0gZGVuaWVkYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiaG9zdHNcIl0nKS50ZXh0Q29udGVudCA9IGAke2hvc3RzLmxlbmd0aH0gaG9zdHNgO1xuXG4gICAgICByZW5kZXJUb3BMaXN0KCdzZWMtdG9wLWFjdG9ycycsIHN0YXRzLnRvcF9hY3RvcnMgfHwgW10pO1xuICAgICAgcmVuZGVyVG9wTGlzdCgnc2VjLXRvcC10YXJnZXRzJywgc3RhdHMudG9wX3RhcmdldHMgfHwgW10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSByZWZyZXNoT3ZlcnZpZXcgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbmRlclRvcExpc3QoaWQsIGl0ZW1zKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRhdGE8L2Rpdj4nOyByZXR1cm47IH1cbiAgICBlbC5pbm5lckhUTUwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NXJlbTtcIj4nICtcbiAgICAgIGl0ZW1zLm1hcChpdCA9PiBgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6M3B4IDA7d29yZC1icmVhazpicmVhay1hbGw7XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhpdC5rZXkpKX08L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPiR7aXQuY291bnR9PC90ZD48L3RyPmApLmpvaW4oJycpICtcbiAgICAgICc8L3RhYmxlPic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEVWRU5UUyA9PT09PT09PT09PT09XG4gIGNvbnN0IGZpbHRlclNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNvdXJjZScpO1xuICBjb25zdCBmaWx0ZXJTZXZlcml0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNldmVyaXR5Jyk7XG4gIGNvbnN0IGZpbHRlckhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1ob3N0Jyk7XG4gIGNvbnN0IGZpbHRlckFjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItYWN0b3InKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtcmVmcmVzaC1idG4nKTtcblxuICBbZmlsdGVyU291cmNlLCBmaWx0ZXJTZXZlcml0eSwgZmlsdGVySG9zdF0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZWZyZXNoRXZlbnRzKSk7XG4gIGZpbHRlckFjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UocmVmcmVzaEV2ZW50cywgMjUwKSk7XG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoRXZlbnRzKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRXZlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBwYXJhbXMuc2V0KCdsaW1pdCcsICcyMDAnKTtcbiAgICAgIGlmIChmaWx0ZXJTb3VyY2UudmFsdWUpICBwYXJhbXMuc2V0KCdzb3VyY2VfdHlwZScsIGZpbHRlclNvdXJjZS52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyU2V2ZXJpdHkudmFsdWUpIHBhcmFtcy5zZXQoJ3NldmVyaXR5JywgZmlsdGVyU2V2ZXJpdHkudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlckhvc3QudmFsdWUpICAgIHBhcmFtcy5zZXQoJ3NvdXJjZV9ob3N0JywgZmlsdGVySG9zdC52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyQWN0b3IudmFsdWUpICAgcGFyYW1zLnNldCgnYWN0b3JfcHJlZml4JywgZmlsdGVyQWN0b3IudmFsdWUpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE7XG4gICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgIHJlbmRlckV2ZW50cygpO1xuXG4gICAgICAvLyBSZWZyZXNoIGhvc3QgZHJvcGRvd24gaWYgd2UgZG9uJ3QgaGF2ZSBpdCB5ZXRcbiAgICAgIGlmICghZmlsdGVySG9zdC5vcHRpb25zLmxlbmd0aCB8fCBmaWx0ZXJIb3N0Lm9wdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGF3YWl0IHJlZnJlc2hIb3N0RmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ldmVudHMtY29udGFpbmVyJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPkxvYWQgZmFpbGVkOiAnK2VzY2FwZUh0bWwoZS5tZXNzYWdlKSsnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudHMoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWV2ZW50cy1jb250YWluZXInKTtcbiAgICBpZiAoIWFsbEV2ZW50cy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGV2ZW50czwvZGl2Pic7IHJldHVybjsgfVxuICAgIGVsLmlubmVySFRNTCA9IGFsbEV2ZW50cy5zbGljZSgwLCAyMDApLm1hcChyZW5kZXJFdmVudFJvdykuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudFJvdyhldikge1xuICAgIGNvbnN0IHNldiA9IGV2LnNldmVyaXR5IHx8ICdpbmZvJztcbiAgICBjb25zdCBzZXZDb2xvciA9IHtcbiAgICAgIGNyaXRpY2FsOiAnI2MwMzkyYicsIGVycm9yOiAnI2U3NGMzYycsIHdhcm46ICcjZjM5YzEyJyxcbiAgICAgIG5vdGljZTogJyMzNDk4ZGInLCBpbmZvOiAnIzdmOGM4ZCcsXG4gICAgfVtzZXZdIHx8ICcjN2Y4YzhkJztcbiAgICBjb25zdCB0aW1lID0gZXYudHMgPyBuZXcgRGF0ZShldi50cykudG9Mb2NhbGVUaW1lU3RyaW5nKCkgOiAnJztcbiAgICBjb25zdCBzb3VyY2UgPSBldi5zb3VyY2VfdHlwZSB8fCAnJztcbiAgICBjb25zdCBhY3RvciA9IGV2LmFjdG9yIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldCB8fCAnJztcbiAgICBjb25zdCBhY3Rpb24gPSBldi5hY3Rpb24gfHwgJyc7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGV2Lm91dGNvbWUgfHwgJyc7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2VjLWV2ZW50LXJvd1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo4NHB4IDgwcHggMWZyIDFmciAxMDBweCA5MHB4O2dhcDo4cHg7cGFkZGluZzo1cHggOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Zm9udC1zaXplOjAuODJyZW07YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjoke3NldkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHNldil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKHNvdXJjZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoYWN0b3IpfVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChhY3Rvcil9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwodGFyZ2V0KX1cIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoYWN0aW9uKX0gJHtlc2NhcGVIdG1sKHRhcmdldCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKG91dGNvbWUpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO3RleHQtYWxpZ246cmlnaHQ7XCI+JHtlc2NhcGVIdG1sKHRpbWUpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhvc3RGaWx0ZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyk7XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaWx0ZXJIb3N0LnZhbHVlO1xuICAgICAgZmlsdGVySG9zdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPicgK1xuICAgICAgICBob3N0cy5tYXAoaCA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChoLmlkKX1cIj4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L29wdGlvbj5gKS5qb2luKCcnKTtcbiAgICAgIGlmIChjdXJyZW50KSBmaWx0ZXJIb3N0LnZhbHVlID0gY3VycmVudDtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhPU1RTID09PT09PT09PT09PT1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0LXJlZ2lzdGVyLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVnaXN0ZXJIb3N0UHJvbXB0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1yZWZyZXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoSG9zdHMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hIb3N0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgYWxsSG9zdHMgPSBob3N0cztcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKTtcbiAgICAgIGlmICghaG9zdHMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBob3N0cyByZWdpc3RlcmVkLiBDbGljayBcdTI3OTUgUmVnaXN0ZXIgSG9zdCB0byBhZGQgb25lLjwvZGl2Pic7IHJldHVybjsgfVxuICAgICAgZWwuaW5uZXJIVE1MID0gaG9zdHMubWFwKGggPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAhaC5lbmFibGVkID8gJ1x1RDgzRFx1REQzNCBkaXNhYmxlZCdcbiAgICAgICAgICAgICAgICAgICAgIDogIWgubGFzdF9zZWVuX2F0ID8gJ1x1MjZBQSByZWdpc3RlcmVkJ1xuICAgICAgICAgICAgICAgICAgICAgOiAoRGF0ZS5ub3coKSAtIERhdGUucGFyc2UoaC5sYXN0X3NlZW5fYXQpID4gMzAqNjAqMTAwMCkgPyAnXHVEODNEXHVERkUxIHN0YWxlJ1xuICAgICAgICAgICAgICAgICAgICAgOiAnXHVEODNEXHVERkUyIG9ubGluZSc7XG4gICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1sZWZ0OjhweDtmb250LXNpemU6MC44cmVtO1wiPiR7ZXNjYXBlSHRtbChoLnR5cGUpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzhyZW07bWFyZ2luLXRvcDoycHg7XCI+XG4gICAgICAgICAgICAgIGlkOiAke2VzY2FwZUh0bWwoaC5pZCl9IFx1MDBCN1xuICAgICAgICAgICAgICByZWdpc3RlcmVkICR7bmV3IERhdGUoaC5yZWdpc3RlcmVkX2F0KS50b0xvY2FsZURhdGVTdHJpbmcoKX0gXHUwMEI3XG4gICAgICAgICAgICAgIGxhc3Qgc2VlbiAke2gubGFzdF9zZWVuX2F0ID8gbmV3IERhdGUoaC5sYXN0X3NlZW5fYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnbmV2ZXInfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07bWFyZ2luLXJpZ2h0OjEycHg7XCI+JHtzdGF0dXN9PC9zcGFuPlxuICAgICAgICAgICAgJHtoLmlkID09PSAnc2VsZicgPyAnJyA6IGA8YnV0dG9uIGNsYXNzPVwiYnRuLXNtIHNlYy1ob3N0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoaC5pZCl9XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS1iYWQtZmcpO1wiPlJlbW92ZTwvYnV0dG9uPmB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcblxuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy1ob3N0LWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgUmVtb3ZlIGhvc3QgJHtidG4uZGF0YXNldC5pZH0/IEV2ZW50cyBhbHJlYWR5IHJlY2VpdmVkIHdpbGwgcmVtYWluIGluIHRoZSBzdG9yZS5gKSkgcmV0dXJuO1xuICAgICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2hvc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0LmlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgcmVmcmVzaEhvc3RzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+TG9hZCBmYWlsZWQ6ICcrZXNjYXBlSHRtbChlLm1lc3NhZ2UpKyc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVySG9zdFByb21wdCgpIHtcbiAgICBjb25zdCBpZCA9IHByb21wdCgnSG9zdCBpZCAobG93ZXJjYXNlLCBubyBzcGFjZXMpOicpO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBsYWJlbCA9IHByb21wdCgnRGlzcGxheSBsYWJlbDonLCBpZCkgfHwgaWQ7XG4gICAgY29uc3QgdHlwZSAgPSBwcm9tcHQoJ1R5cGUgKFwiZGFzaGNhZGR5XCIsIFwic2VydmljZVwiLCBvciBcImFnZW50XCIpOicsICdhZ2VudCcpIHx8ICdhZ2VudCc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIGxhYmVsLCB0eXBlIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghcmVzLm9rKSB7IGFsZXJ0KCdGYWlsZWQ6ICcgKyAoZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzLnN0YXR1c1RleHQpKTsgcmV0dXJuOyB9XG4gICAgICAvLyBTaG93IHRoZSBhcGlfa2V5IE9OQ0UgaW4gYSBkaWFsb2dcbiAgICAgIGFsZXJ0KGBcdTI3MDUgSG9zdCByZWdpc3RlcmVkIVxcblxcbmlkOiAke2RhdGEuZGF0YS5ob3N0LmlkfVxcbmxhYmVsOiAke2RhdGEuZGF0YS5ob3N0LmxhYmVsfVxcbnR5cGU6ICR7ZGF0YS5kYXRhLmhvc3QudHlwZX1cXG5cXG5cdUQ4M0RcdUREMTEgQVBJIEtFWSAoc2F2ZSB0aGlzIE5PVyBcdTIwMTQgd29uJ3QgYmUgc2hvd24gYWdhaW4pOlxcblxcbiR7ZGF0YS5kYXRhLmFwaV9rZXl9XFxuXFxuU2VuZCB0aGlzIGtleSBhczogQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhcGlfa2V5PlxcblRvIGVuZHBvaW50OiBQT1NUIC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL2luZ2VzdCBvciAvZXZlbnRzL2JhdGNoYCk7XG4gICAgICByZWZyZXNoSG9zdHMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhbGVydCgnRmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD5cIiddL2csIGMgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBtcykge1xuICAgIGxldCB0OyByZXR1cm4gZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0KTsgdCA9IHNldFRpbWVvdXQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgbXMpOyB9O1xuICB9XG59KSgpOztcbi8vID09PT09PT09PT0gU0hJUERFQ0sgREVQTE9ZUyAoREMtMTMwKSA9PT09PT09PT09XG4vLyBTb3VyY2UgZGVwbG95cyBwYW5lbDogZHJpdmVzIHRoZSBzaGlwZGVjayBDTEkgdmlhIHRoZSBEYXNoQ2FkZHlcbi8vIC9hcGkvdjEvZGVwbG95cyBicmlkZ2UgcHJveHkuIE1vZGFsIGxpc3RzIGRlcGxveWFibGUgcmVwb3MgKyBkZXBsb3llZFxuLy8gc2VydmljZXMsIHNob3dzIHRoZSBqb3VybmFsLCBhbmQgcnVucyBkZXBsb3kvcm9sbGJhY2sgd2l0aCBsaXZlIG91dHB1dC5cbi8vXG4vLyBGb2xsb3dzIHRoZSBzZWN1cml0eS1jZW50ZXIuanMgbW9kYWwgcGF0dGVybiAoaW5qZWN0TW9kYWwgKyBidXR0b24gaW4gdGhlXG4vLyB0b3AgYmFyKSBhbmQgdGhlIHdlYXRoZXItbW9kYWwgdmlzdWFsIGxhbmd1YWdlLlxuXG4vLyBEQy0xMzM6IHB1cmUgcmVwby1vcHRpb24gYnVpbGRlci4gUmVtb3RlIEdpdGVhIGZpZWxkcyBhcmUgVU5UUlVTVEVEIChhXG4vLyBob3N0aWxlIGluc3RhbmNlIGNvbnRyb2xzIGZ1bGxfbmFtZS9kZXNjcmlwdGlvbi91cmwpLCBzbyBldmVyeVxuLy8gaW50ZXJwb2xhdGVkIHZhbHVlIG11c3QgYmUgSFRNTC1lc2NhcGVkIGJlZm9yZSBpbm5lckhUTUwuIEV4cG9zZWQgb25cbi8vIHdpbmRvdyBzbyBzdGF0dXMvdGVzdHMgY2FuIHBpbiB0aGUgZXNjYXBpbmcgd2l0aCBob3N0aWxlIHBheWxvYWRzLlxud2luZG93Ll9fZGMxMzNfYnVpbGRSZXBvT3B0aW9ucyA9IGZ1bmN0aW9uIChyZXBvcywgZXNjRm4pIHtcbiAgdmFyIGUgPSBlc2NGbiB8fCBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PlwiJ10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnXCInOiAnJnF1b3Q7JywgXCInXCI6ICcmIzM5OycgfVtjXTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuICc8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IGNob29zZSBhIHJlcG8gXHUyMDE0PC9vcHRpb24+JyArXG4gICAgKHJlcG9zIHx8IFtdKS5tYXAoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiAnPG9wdGlvbiB2YWx1ZT1cIicgKyBlKHIudXJsKSArICdcIiBkYXRhLWlkPVwiJyArIGUoci5pZCkgKyAnXCI+JyArXG4gICAgICAgIGUoci5mdWxsX25hbWUpICsgKHIuZGVzY3JpcHRpb24gPyAnIFx1MjAxNCAnICsgZShyLmRlc2NyaXB0aW9uKSA6ICcnKSArICc8L29wdGlvbj4nO1xuICAgIH0pLmpvaW4oJycpO1xufTtcblxuLy8gVGhyZWUtc3RhdGUgdG9rZW4gc2VtYW50aWNzLCBleHBvc2VkIGZvciBWTSB0ZXN0czpcbi8vIGFub255bW91cz10cnVlIC0+IGV4cGxpY2l0IGVtcHR5OyB0eXBlZCB2YWx1ZSAtPiB0b2tlbjsgbmVpdGhlciAtPiBvbWl0dGVkLlxud2luZG93Ll9fZGMxMzNfcmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKGFub255bW91cywgdHlwZWQpIHtcbiAgaWYgKGFub255bW91cykgcmV0dXJuICcnO1xuICB2YXIgdCA9IFN0cmluZyh0eXBlZCB8fCAnJykudHJpbSgpO1xuICByZXR1cm4gdCB8fCB1bmRlZmluZWQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICBpbmplY3RNb2RhbCgnZGVwbG95cy1tb2RhbCcsIGA8ZGl2IGlkPVwiZGVwbG95cy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODYwcHg7IG1heC13aWR0aDogMTIwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REU5QSBEZXBsb3lzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgU291cmNlIGRlcGxveXMgdmlhIHNoaXBkZWNrOiBidWlsZCBcdTIxOTIgcGFja2FnZSBcdTIxOTIgc3lzdGVtZCByZWxlYXNlIFx1MjE5MiBDYWRkeSBnYXRlIFx1MjE5MiBETlMgXHUyMTkyIHZlcmlmeS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlYy10YWJzXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjE0cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJzZXJ2aWNlc1wiPlNlcnZpY2VzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXAtdGFiXCIgZGF0YS10YWI9XCJkZXBsb3lcIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWJcIiBkYXRhLXRhYj1cImpvdXJuYWxcIj5Kb3VybmFsPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImRlcC10YWJcIiBkYXRhLXRhYj1cImluc3RhbGxcIj5JbnN0YWxsPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTRVJWSUNFUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cInNlcnZpY2VzXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtc2VydmljZXNcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MzIwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJkZXAtc3RhdHVzLW5hbWVcIiBwbGFjZWhvbGRlcj1cInNlcnZpY2UgbmFtZVwiIHN0eWxlPVwid2lkdGg6MjIwcHg7XCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtc3RhdHVzLWJ0blwiPkNoZWNrIHN0YXR1czwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERFUExPWSBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImRlcGxveVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVwLXJlcG8tc2VsZWN0XCIgc3R5bGU9XCJtaW4td2lkdGg6MjgwcHg7XCI+PG9wdGlvbj5Mb2FkaW5nXHUyMDI2PC9vcHRpb24+PC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGlkPVwiZGVwLWRlcGxveS1idG5cIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5EZXBsb3lzIGFyZSBzZXJpYWxpemVkIGZsZWV0LXNpZGU7IGEgcnVuIHRha2VzIH4zMC02MHMuIE91dHB1dCBzdHJlYW1zIGJlbG93IHdoZW4gaXQgZmluaXNoZXMuPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSk9VUk5BTCBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWpvdXJuYWwtbmFtZVwiIHBsYWNlaG9sZGVyPVwic2VydmljZSAoZW1wdHkgPSBhbGwpXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtcIiAvPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBpZD1cImRlcC1qb3VybmFsLWJ0blwiPlJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtam91cm5hbFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDozMjBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBJTlNUQUxMIFRBQiAoREMtMTMxKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXAtcGFuZWxcIiBkYXRhLXBhbmVsPVwiaW5zdGFsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dhcDoxMHB4O21heC13aWR0aDo2NDBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dhcDo0cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtcIj5HaXRlYSBzZXJ2ZXIgKGFueSBpbnN0YW5jZSk8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlcC1naC1naXRlYS1ob3N0XCIgcGxhY2Vob2xkZXI9XCJnaXQuZGFzaGNhZGR5Lm5ldCAoZGVmYXVsdClcIiBzdHlsZT1cImZsZXg6MTtcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiAvPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkZXAtZ2gtZ2l0ZWEtdG9rZW5cIiB0eXBlPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cInRva2VuIChwcml2YXRlIHJlcG9zKVwiIHN0eWxlPVwiZmxleDoxO1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MTJweDtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLWFub255bW91c1wiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIEFub255bW91cyBcdTIwMTQgaWdub3JlIHRoZSBzYXZlZCBmbGVldCB0b2tlbiBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+UGljayBhIHJlcG88L3NwYW4+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVwLWdoLWdpdGVhXCIgc3R5bGU9XCJtaW4td2lkdGg6MjgwcHg7XCI+PG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmdcdTIwMjY8L29wdGlvbj48L3NlbGVjdD5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+XHUyMDI2b3IgcGFzdGUgYW55IHJlcG8gVVJMIChHaXRIdWIsIEdpdGVhLCBvciBhbnkgaHR0cHMgZ2l0IGhvc3QpPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLXVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9cIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+TmFtZSAodXNlZCBhcyBzdWJkb21haW47IGNhcmQgdGl0bGUgZmFsbHMgYmFjayB0byByZXBvIG5hbWUpPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLXNlcnZpY2VcIiBwbGFjZWhvbGRlcj1cIm15LWFwcFwiIHN0eWxlPVwid2lkdGg6MjIwcHg7XCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+T3B0aW9uYWwgbGF1bmNoIGFyZ3MgKHNwYWNlLXNlcGFyYXRlZCBzaW1wbGUgdG9rZW5zLCBlLmcuIC10ZXh0IGhpKTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlcC1naC1hcmdzXCIgcGxhY2Vob2xkZXI9XCItdGV4dCBoZWxsb1wiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiAvPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+XG4gICAgICAgICAgICBHbyByZXBvcyB3aXRoIGEgbWFpbiBwYWNrYWdlIGluc3RhbGwgYXV0b21hdGljYWxseTogYnVpbGQsIHN5c3RlbWQgcmVsZWFzZSxcbiAgICAgICAgICAgIENhZGR5IGdhdGUgKHRhaWxuZXQtb25seSksIEROUywgdmVyaWZ5LCBkYXNoYm9hcmQgY2FyZC4gVGFrZXMgfjMwLTYwcy5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaWQ9XCJkZXAtZ2gtYnRuXCI+SW5zdGFsbDwvYnV0dG9uPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBPVVRQVVQgLS0+XG4gICAgICA8cHJlIGlkPVwiZGVwLW91dHB1dFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO21heC1oZWlnaHQ6MjYwcHg7bWFyZ2luLXRvcDoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYmctMiwjMTExKTtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czo4cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7XCI+PC9wcmU+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7bWFyZ2luLXRvcDoxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0ICQgPSAoaWQpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgbGV0IG9wZW5CdG4gPSBudWxsO1xuICBsZXQgbG9hZGVkT25jZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGVzYyhzKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5lc2NhcGVIdG1sID8gd2luZG93LmVzY2FwZUh0bWwoU3RyaW5nKHMpKSA6IFN0cmluZyhzKS5yZXBsYWNlKC9bJjw+XCInXS9nLCAoYykgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYXBpKHBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9kYXNoY2FkZHktYXBpL2FwaS92MS9kZXBsb3lzJyArIHBhdGgsIE9iamVjdC5hc3NpZ24oeyBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0sIG9wdHMgfHwge30pKTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgdHJ5IHsgYm9keSA9IGF3YWl0IHIuanNvbigpOyB9IGNhdGNoIChlKSB7IGJvZHkgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ25vbi1KU09OIHJlc3BvbnNlJyB9OyB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByLnN0YXR1cywgYm9keSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd091dHB1dCh0ZXh0KSB7XG4gICAgY29uc3QgZWwgPSAkKCdkZXAtb3V0cHV0Jyk7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICcobm8gb3V0cHV0KSc7XG4gICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VzKCkge1xuICAgIGNvbnN0IGVsID0gJCgnZGVwLXNlcnZpY2VzJyk7XG4gICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zZXJ2aWNlcycpO1xuICAgIGlmICghYm9keS5zdWNjZXNzKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBib2R5LnNlcnZpY2VzIHx8IFtdO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIGVsLmlubmVySFRNTCA9ICc8ZW0+Tm8gc2hpcGRlY2sgZGVwbG95bWVudHMgb24gcmVjb3JkIHlldC48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5TZXJ2aWNlPC90aD48dGg+TGFzdCBhY3Rpb248L3RoPjx0aD5XaGVuPC90aD48dGg+UmVsZWFzZTwvdGg+PHRoPjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChzKSA9PlxuICAgICAgICAnPHRyPicgK1xuICAgICAgICAnPHRkPjxzdHJvbmc+JyArIGVzYyhzLm5hbWUpICsgJzwvc3Ryb25nPjwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfYWN0aW9uKSArICc8L3RkPicgK1xuICAgICAgICAnPHRkPicgKyBlc2Mocy5sYXN0X3RpbWUpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfZXBvY2gpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXJvbGxiYWNrXCIgZGF0YS1zZXJ2aWNlPVwiJyArIGVzYyhzLm5hbWUpICsgJ1wiPlJvbGxiYWNrPC9idXR0b24+ICcgK1xuICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXN0YXR1c1wiIGRhdGEtc2VydmljZT1cIicgKyBlc2Mocy5uYW1lKSArICdcIj5TdGF0dXM8L2J1dHRvbj48L3RkPicgK1xuICAgICAgICAnPC90cj4nXG4gICAgICApLmpvaW4oJycpICsgJzwvdGJvZHk+PC90YWJsZT4nO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFJlcG9zKCkge1xuICAgIGNvbnN0IHNlbCA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpO1xuICAgIGNvbnN0IHsgYm9keSB9ID0gYXdhaXQgYXBpKCcvcmVwb3MnKTtcbiAgICBpZiAoIWJvZHkuc3VjY2Vzcykge1xuICAgICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXBvcyA9IGJvZHkucmVwb3MgfHwgW107XG4gICAgc2VsLmlubmVySFRNTCA9IHJlcG9zLmxlbmd0aFxuICAgICAgPyByZXBvcy5tYXAoKHIpID0+ICc8b3B0aW9uIHZhbHVlPVwiJyArIGVzYyhyLmRpcikgKyAnXCI+JyArIGVzYyhyLm5hbWUpICsgJzwvb3B0aW9uPicpLmpvaW4oJycpXG4gICAgICA6ICc8b3B0aW9uIHZhbHVlPVwiXCI+KG5vIHJlcG9zIHdpdGggYSBTaGlwZGVja2ZpbGUgZm91bmQpPC9vcHRpb24+JztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRKb3VybmFsKHNlcnZpY2UpIHtcbiAgICBjb25zdCBlbCA9ICQoJ2RlcC1qb3VybmFsJyk7XG4gICAgY29uc3QgcXMgPSBzZXJ2aWNlID8gJz9zZXJ2aWNlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc2VydmljZSkgOiAnJztcbiAgICBjb25zdCB7IGJvZHkgfSA9IGF3YWl0IGFwaSgnL2pvdXJuYWwnICsgcXMpO1xuICAgIGNvbnN0IHJvd3MgPSAoYm9keS5yb3dzIHx8IFtdKTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPk5vIGpvdXJuYWwgcm93cy48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5UaW1lPC90aD48dGg+U2VydmljZTwvdGg+PHRoPkFjdGlvbjwvdGg+PHRoPlJlbGVhc2U8L3RoPjx0aD5EdXJhdGlvbjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChyKSA9PlxuICAgICAgICAnPHRyPjx0ZD4nICsgZXNjKHIudGltZSkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLnNlcnZpY2UpICsgJzwvdGQ+PHRkPicgKyBlc2Moci5hY3Rpb24pICtcbiAgICAgICAgJzwvdGQ+PHRkPicgKyBlc2Moci5lcG9jaCkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLmR1cmF0aW9uIHx8ICdcdTIwMTQnKSArICc8L3RkPjwvdHI+J1xuICAgICAgKS5qb2luKCcnKSArICc8L3Rib2R5PjwvdGFibGU+JztcbiAgfVxuXG5cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkR2l0ZWFSZXBvcygpIHtcbiAgICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhJyk7XG4gICAgY29uc3QgaG9zdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1naXRlYS1ob3N0Jyk7XG4gICAgY29uc3QgdG9rRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhLXRva2VuJyk7XG4gICAgY29uc3QgYW5vbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1hbm9ueW1vdXMnKTtcbiAgICBjb25zdCBwYXlsb2FkID0ge307XG4gICAgaWYgKGhvc3RFbCAmJiBob3N0RWwudmFsdWUudHJpbSgpKSBwYXlsb2FkLmdpdGVhX3VybCA9ICdodHRwczovLycgKyBob3N0RWwudmFsdWUudHJpbSgpLnJlcGxhY2UoL15odHRwcz86XFwvKi8sICcnKTtcbiAgICAvLyBEaXN0aW5ndWlzaCBvbWl0dGVkIChmbGVldCBmYWxsYmFjayBhbGxvd2VkKSBmcm9tIGV4cGxpY2l0IGFub255bW91c1xuICAgIC8vIChlbXB0eSB0b2tlbiBwcmVzZXJ2ZWQgb24gd2lyZSkuIEEgbm9uLWVtcHR5IHVzZXIgdG9rZW4gd2lucy5cbiAgICBpZiAoYW5vbkVsICYmIGFub25FbC5jaGVja2VkKSBwYXlsb2FkLnRva2VuID0gJyc7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB0ID0gd2luZG93Ll9fZGMxMzNfcmVxdWVzdFRva2VuKGZhbHNlLCB0b2tFbCAmJiB0b2tFbC52YWx1ZSk7XG4gICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLnRva2VuID0gdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc3RhdHVzLCBib2R5IH0gPSBhd2FpdCBhcGkoJy9naXRlYS1yZXBvcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5LnN1Y2Nlc3MgfHwgIShib2R5LnJlcG9zIHx8IFtdKS5sZW5ndGgpIHtcbiAgICAgICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+JyArIGVzYyhib2R5LmVycm9yIHx8ICdubyByZXBvcyBmb3VuZCcpICsgJzwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFsbCByZW1vdGUgZmllbGRzIGFyZSB1bnRydXN0ZWQgKGhvc3RpbGUgR2l0ZWEgaW5zdGFuY2Ugb3IgcmVwb1xuICAgICAgLy8gbWV0YWRhdGEpIFx1MjAxNCBidWlsZCBvcHRpb25zIHRocm91Z2ggdGhlIGVzY2FwaW5nIGhlbHBlciAocGlubmVkIGJ5XG4gICAgICAvLyBzdGF0dXMvdGVzdHMvZGVwbG95cy1pbnN0YWxsLnRlc3QuanMpLlxuICAgICAgc2VsLmlubmVySFRNTCA9IHdpbmRvdy5fX2RjMTMzX2J1aWxkUmVwb09wdGlvbnMoYm9keS5yZXBvcywgZXNjKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWwuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj51bmF2YWlsYWJsZTwvb3B0aW9uPic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuSW5zdGFsbCgpIHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWJ0bicpO1xuICAgIGNvbnN0IHJlcG9VcmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXAtZ2gtc2VydmljZScpLnZhbHVlLnRyaW0oKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhcmdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1hcmdzJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghcmVwb1VybCB8fCAhc2VydmljZSkgeyBzaG93T3V0cHV0KCdSZXBvIFVSTCBhbmQgbmFtZSBhcmUgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICAgIGNvbnN0IGFyZ3MgPSBhcmdzUmF3ID8gYXJnc1Jhdy5zcGxpdCgvXFxzKy8pIDogW107XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdJbnN0YWxsJyk7XG4gICAgc2hvd091dHB1dCgnSW5zdGFsbGluZyAnICsgcmVwb1VybCArICdcXG5DbG9uaW5nLCBidWlsZGluZywgZ2F0aW5nIGFuZCBETlMtaW5nLi4uICh+MzAtNjBzKScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbm9ueW1vdXMgPSAhIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWFub255bW91cycpIHx8IHt9KS5jaGVja2VkO1xuICAgICAgY29uc3QgdHlwZWRUb2tlbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhLXRva2VuJykgfHwgeyB2YWx1ZTogJycgfSkudmFsdWU7XG4gICAgICBjb25zdCByZXF1ZXN0VG9rZW4gPSB3aW5kb3cuX19kYzEzM19yZXF1ZXN0VG9rZW4oYW5vbnltb3VzLCB0eXBlZFRva2VuKTtcbiAgICAgIGNvbnN0IHsgc3RhdHVzLCBib2R5IH0gPSBhd2FpdCBhcGkoJy9pbnN0YWxsJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVwb191cmw6IHJlcG9VcmwsIHNlcnZpY2UsIGFyZ3MsXG4gICAgICAgICAgdG9rZW46IHJlcXVlc3RUb2tlbiB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd091dHB1dCgoYm9keS5vdXRwdXQgPyBib2R5Lm91dHB1dCArICdcXG4nIDogJycpICsgJ0ZBSUwgJyArIChib2R5LmVycm9yIHx8ICgnSFRUUCAnICsgc3RhdHVzKSkpO1xuICAgICAgICBzZXRCdXN5KGZhbHNlLCBidG4sICdJbnN0YWxsJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN2YyA9IGJvZHkuc2VydmljZSB8fCB7fTtcbiAgICAgIGNvbnN0IGV4aXN0cyA9ICh3aW5kb3cuQVBQUyB8fCBbXSkuc29tZSgoYSkgPT4gYS5pZCA9PT0gc3ZjLmlkKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNhcmQgPSB7IGlkOiBzdmMuaWQsIG5hbWU6IHN2Yy5uYW1lIHx8IHN2Yy5pZCwgdXJsOiBzdmMudXJsLCBsb2dvOiBzdmMubG9nbywgdGFpbHNjYWxlT25seTogdHJ1ZSwgaXNDdXN0b206IHRydWUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmZXRjaCgnL2Rhc2hjYWRkeS1hcGkvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjYXJkKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGNhcmQpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlbmRlckFwcHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZW5kZXJBcHBzKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cucmVuZGVyR3JpZCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlbmRlckdyaWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBjYXJkIHJlZ2lzdHJhdGlvbiBiZXN0LWVmZm9ydCAqLyB9XG4gICAgICB9XG4gICAgICBzaG93T3V0cHV0KCdJTlNUQUxMRUQgJyArIChzdmMubmFtZSB8fCBzdmMuaWQpICsgJyBpbiAnICsgKHN2Yy5kZXBsb3lfc2Vjb25kcyB8fCAnPycpICsgJ3MnICtcbiAgICAgICAgJ1xcbkNhcmQ6ICcgKyAoc3ZjLnVybCB8fCAnJykgK1xuICAgICAgICAnXFxuJyArIChib2R5Lm91dHB1dCB8fCAnJykuc2xpY2UoLTgwMCkpO1xuICAgICAgbG9hZFNlcnZpY2VzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd091dHB1dCgnaW5zdGFsbCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ0luc3RhbGwnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEJ1c3koYnVzeSwgYnRuLCBsYWJlbCkge1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgYnRuLmRpc2FibGVkID0gYnVzeTtcbiAgICBpZiAobGFiZWwpIGJ0bi50ZXh0Q29udGVudCA9IGJ1c3kgPyAnV29ya2luZ1x1MjAyNicgOiBsYWJlbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bkRlcGxveSgpIHtcbiAgICBjb25zdCBidG4gPSAkKCdkZXAtZGVwbG95LWJ0bicpO1xuICAgIGNvbnN0IGRpciA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpLnZhbHVlO1xuICAgIGlmICghZGlyKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdEZXBsb3knKTtcbiAgICBzaG93T3V0cHV0KCdEZXBsb3lpbmcgJyArIGRpciArICdcXG5UaGlzIGNhbiB0YWtlIH4zMC02MHNcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9kZXBsb3knLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkaXIgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgU1VDQ0VTUycgOiAnXFxuXHUyNzRDIEZBSUxFRCcpKTtcbiAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dPdXRwdXQoJ2RlcGxveSBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ0RlcGxveScpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuUm9sbGJhY2soc2VydmljZSwgYnRuKSB7XG4gICAgaWYgKCFjb25maXJtKCdSb2xsIGJhY2sgJyArIHNlcnZpY2UgKyAnIHRvIHRoZSBwcmV2aW91cyByZWxlYXNlPycpKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdSb2xsYmFjaycpO1xuICAgIHNob3dPdXRwdXQoJ1JvbGxpbmcgYmFjayAnICsgc2VydmljZSArICdcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2UgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgUk9MTEVEIEJBQ0snIDogJ1xcblx1Mjc0QyBGQUlMRUQnKSk7XG4gICAgICBsb2FkU2VydmljZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdyb2xsYmFjayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ1JvbGxiYWNrJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBydW5TdGF0dXMoc2VydmljZSwgYnRuKSB7XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdTdGF0dXMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zdGF0dXM/c2VydmljZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UpKTtcbiAgICAgIHNob3dPdXRwdXQoYm9keS5vdXRwdXQgfHwgYm9keS5lcnJvciB8fCAnKG5vIG91dHB1dCknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdzdGF0dXMgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBzZXRCdXN5KGZhbHNlLCBidG4sICdTdGF0dXMnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpcmUoKSB7XG4gICAgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3lzLWJ0bicpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuXG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICQoJ2RlcGxveXMtbW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7XG4gICAgICBpZiAoIWxvYWRlZE9uY2UpIHtcbiAgICAgICAgbG9hZGVkT25jZSA9IHRydWU7XG4gICAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgICAgICBsb2FkUmVwb3MoKTtcbiAgICAgICAgbG9hZEpvdXJuYWwoJycpO1xuICAgICAgICBsb2FkR2l0ZWFSZXBvcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnZGVwLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAkKCdkZXBsb3lzLW1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgIH0pO1xuXG4gICAgLy8gdGFiIHN3aXRjaGluZ1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodCkgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlcGxveXMtbW9kYWwgLmRlcC1wYW5lbCcpLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXkgPSBwLmRhdGFzZXQucGFuZWwgPT09IHRhYi5kYXRhc2V0LnRhYiA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkKCdkZXAtZGVwbG95LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcnVuRGVwbG95KTtcbiAgICAkKCdkZXAtZ2gtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBydW5JbnN0YWxsKTtcbiAgICBbJ2RlcC1naC1naXRlYS1ob3N0JywgJ2RlcC1naC1naXRlYS10b2tlbiddLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmIChlbCkgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEdpdGVhUmVwb3MoKSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1naXRlYScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICBjb25zdCB2ID0gZS50YXJnZXQudmFsdWU7XG4gICAgICBpZiAodikge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLXVybCcpLnZhbHVlID0gdjtcbiAgICAgICAgY29uc3Qgb3B0ID0gZS50YXJnZXQuc2VsZWN0ZWRPcHRpb25zWzBdO1xuICAgICAgICBjb25zdCBpZCA9IG9wdCAmJiBvcHQuZGF0YXNldCA/IG9wdC5kYXRhc2V0LmlkIDogJyc7XG4gICAgICAgIGNvbnN0IHN2YyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXAtZ2gtc2VydmljZScpO1xuICAgICAgICBpZiAoaWQgJiYgIXN2Yy52YWx1ZSkgc3ZjLnZhbHVlID0gaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgICQoJ2RlcC1qb3VybmFsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEpvdXJuYWwoJCgnZGVwLWpvdXJuYWwtbmFtZScpLnZhbHVlLnRyaW0oKSkpO1xuICAgICQoJ2RlcC1zdGF0dXMtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gJCgnZGVwLXN0YXR1cy1uYW1lJykudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKG5hbWUpIHJ1blN0YXR1cyhuYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIGR5bmFtaWMgYnV0dG9ucyAoc2VydmljZSB0YWJsZSlcbiAgICAkKCdkZXAtc2VydmljZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCByYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZXAtcm9sbGJhY2snKTtcbiAgICAgIGlmIChyYikgcmV0dXJuIHJ1blJvbGxiYWNrKHJiLmRhdGFzZXQuc2VydmljZSwgcmIpO1xuICAgICAgY29uc3Qgc2IgPSBlLnRhcmdldC5jbG9zZXN0KCcuZGVwLXN0YXR1cycpO1xuICAgICAgaWYgKHNiKSByZXR1cm4gcnVuU3RhdHVzKHNiLmRhdGFzZXQuc2VydmljZSwgc2IpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3aXJlKTtcbiAgfSBlbHNlIHtcbiAgICB3aXJlKCk7XG4gIH1cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFdFQVRIRVIgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnd2VhdGhlci1tb2RhbCcsIGA8ZGl2IGlkPVwid2VhdGhlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIj48aDM+V2VhdGhlciBTZXR0aW5nczwvaDM+XG4gICAgPGxhYmVsIGZvcj1cIndlYXRoZXItbG9jYXRpb24taW5wdXRcIj5Mb2NhdGlvbjo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwid2VhdGhlci1sb2NhdGlvbi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQ2l0eSBuYW1lIG9yIFpJUCAoZS5nLiwgSGFtYnVyZywgOTAyMTApXCIgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkVudGVyIGEgY2l0eSBuYW1lLCBwb3N0YWwgY29kZSwgb3IgJmxkcXVvO0NpdHksIENvdW50cnkmcmRxdW87PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+VW5pdHM8L2xhYmVsPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cImltcGVyaWFsXCI+PHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtY2FyZFwiPiZkZWc7RiAvIG1waDwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cIm1ldHJpY1wiPjxzcGFuIGNsYXNzPVwid2VhdGhlci11bml0LWNhcmRcIj4mZGVnO0MgLyBrbS9oPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+PGJ1dHRvbiBpZD1cIndlYXRoZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+PGJ1dHRvbiBpZD1cIndlYXRoZXItc2F2ZVwiPlNhdmU8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gKTtcblxuICAvKiBXZWF0aGVyIFdpZGdldCBcdTIwMTQgcG93ZXJlZCBieSBPcGVuLU1ldGVvIChmcmVlLCBubyBBUEkga2V5KSAqL1xuICBjb25zdCBMT0NBVElPTl9LRVkgPSAnd2VhdGhlci1sb2NhdGlvbic7XG4gIGNvbnN0IExFR0FDWV9LRVkgPSAnd2VhdGhlci16aXAnO1xuICBjb25zdCBHRU9fQ0FDSEVfS0VZID0gJ3dlYXRoZXItZ2VvJztcbiAgY29uc3QgVU5JVF9LRVkgPSAnd2VhdGhlci11bml0JztcblxuICAvLyBNaWdyYXRlIGZyb20gb2xkIFpJUC1vbmx5IGtleVxuICBpZiAoIXNhZmVHZXQoTE9DQVRJT05fS0VZKSAmJiBzYWZlR2V0KExFR0FDWV9LRVkpKSB7XG4gICAgc2FmZVNldChMT0NBVElPTl9LRVksIHNhZmVHZXQoTEVHQUNZX0tFWSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VW5pdCgpIHtcbiAgICByZXR1cm4gc2FmZUdldChVTklUX0tFWSkgfHwgJ2ltcGVyaWFsJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdlYXRoZXJFbGVtZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItaWNvbicpLFxuICAgICAgdGVtcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItdGVtcCcpLFxuICAgICAgY29uZGl0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1jb25kaXRpb24nKSxcbiAgICAgIGxvY2F0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1sb2NhdGlvbicpLFxuICAgICAgd2luZDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItd2luZCcpXG4gICAgfTtcbiAgfVxuXG4gIC8vIFdNTyBXZWF0aGVyIENvZGUgbWFwcGluZ1xuICBjb25zdCB3bW9EZXNjcmlwdGlvbnMgPSB7XG4gICAgMDogJ0NsZWFyIHNreScsIDE6ICdNYWlubHkgY2xlYXInLCAyOiAnUGFydGx5IGNsb3VkeScsIDM6ICdPdmVyY2FzdCcsXG4gICAgNDU6ICdGb2cnLCA0ODogJ1JpbWUgZm9nJyxcbiAgICA1MTogJ0xpZ2h0IGRyaXp6bGUnLCA1MzogJ0RyaXp6bGUnLCA1NTogJ0RlbnNlIGRyaXp6bGUnLFxuICAgIDU2OiAnRnJlZXppbmcgZHJpenpsZScsIDU3OiAnRGVuc2UgZnJlZXppbmcgZHJpenpsZScsXG4gICAgNjE6ICdMaWdodCByYWluJywgNjM6ICdNb2RlcmF0ZSByYWluJywgNjU6ICdIZWF2eSByYWluJyxcbiAgICA2NjogJ0xpZ2h0IGZyZWV6aW5nIHJhaW4nLCA2NzogJ0hlYXZ5IGZyZWV6aW5nIHJhaW4nLFxuICAgIDcxOiAnTGlnaHQgc25vdycsIDczOiAnTW9kZXJhdGUgc25vdycsIDc1OiAnSGVhdnkgc25vdycsIDc3OiAnU25vdyBncmFpbnMnLFxuICAgIDgwOiAnTGlnaHQgc2hvd2VycycsIDgxOiAnTW9kZXJhdGUgc2hvd2VycycsIDgyOiAnVmlvbGVudCBzaG93ZXJzJyxcbiAgICA4NTogJ0xpZ2h0IHNub3cgc2hvd2VycycsIDg2OiAnSGVhdnkgc25vdyBzaG93ZXJzJyxcbiAgICA5NTogJ1RodW5kZXJzdG9ybScsIDk2OiAnVGh1bmRlcnN0b3JtIHdpdGggaGFpbCcsIDk5OiAnU2V2ZXJlIHRodW5kZXJzdG9ybSdcbiAgfTtcblxuICBjb25zdCB3bW9JY29ucyA9IHtcbiAgICAwOiAnXHUyNjAwXHVGRTBGJywgMTogJ1x1RDgzQ1x1REYyNFx1RkUwRicsIDI6ICdcdTI2QzUnLCAzOiAnXHUyNjAxXHVGRTBGJyxcbiAgICA0NTogJ1x1RDgzQ1x1REYyQlx1RkUwRicsIDQ4OiAnXHVEODNDXHVERjJCXHVGRTBGJyxcbiAgICA1MTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDUzOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNTU6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLFxuICAgIDU2OiAnXHVEODNDXHVERjI4XHVGRTBGJywgNTc6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLFxuICAgIDYxOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNjM6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA2NTogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgNjY6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA2NzogJ1x1RDgzQ1x1REYyOFx1RkUwRicsXG4gICAgNzE6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA3MzogJ1x1Mjc0NFx1RkUwRicsIDc1OiAnXHUyNzQ0XHVGRTBGJywgNzc6ICdcdTI3NDRcdUZFMEYnLFxuICAgIDgwOiAnXHVEODNDXHVERjI2XHVGRTBGJywgODE6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA4MjogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgODU6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA4NjogJ1x1Mjc0NFx1RkUwRicsXG4gICAgOTU6ICdcdTI2QzhcdUZFMEYnLCA5NjogJ1x1MjZDOFx1RkUwRicsIDk5OiAnXHUyNkM4XHVGRTBGJ1xuICB9O1xuXG4gIC8vIFdpbmQgZGlyZWN0aW9uIGZyb20gZGVncmVlc1xuICBjb25zdCB3aW5kRGlycyA9IFsnTicsJ05ORScsJ05FJywnRU5FJywnRScsJ0VTRScsJ1NFJywnU1NFJywnUycsJ1NTVycsJ1NXJywnV1NXJywnVycsJ1dOVycsJ05XJywnTk5XJ107XG4gIGZ1bmN0aW9uIGRlZ1RvRGlyKGRlZykge1xuICAgIHJldHVybiB3aW5kRGlyc1tNYXRoLnJvdW5kKGRlZyAvIDIyLjUpICUgMTZdO1xuICB9XG5cbiAgLy8gR2VvY29kZSBsb2NhdGlvbiB2aWEgT3Blbi1NZXRlbywgd2l0aCBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgYXN5bmMgZnVuY3Rpb24gZ2VvY29kZUxvY2F0aW9uKHF1ZXJ5KSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2FmZUdldChHRU9fQ0FDSEVfS0VZKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW8gPSBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgICAgIGlmIChnZW8ucXVlcnkgPT09IHF1ZXJ5KSByZXR1cm4gZ2VvO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZ2VvY29kaW5nLWFwaS5vcGVuLW1ldGVvLmNvbS92MS9zZWFyY2g/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmNvdW50PTEmbGFuZ3VhZ2U9ZW4mZm9ybWF0PWpzb25gKTtcbiAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignR2VvY29kaW5nIGZhaWxlZCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICBpZiAoIWRhdGEucmVzdWx0cyB8fCAhZGF0YS5yZXN1bHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBub3QgZm91bmQnKTtcbiAgICBjb25zdCByID0gZGF0YS5yZXN1bHRzWzBdO1xuICAgIGNvbnN0IGdlbyA9IHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgbGF0OiByLmxhdGl0dWRlLFxuICAgICAgbG9uOiByLmxvbmdpdHVkZSxcbiAgICAgIGNpdHk6IHIubmFtZSxcbiAgICAgIHN0YXRlOiByLmFkbWluMSB8fCAnJyxcbiAgICAgIGNvdW50cnk6IHIuY291bnRyeSB8fCAnJyxcbiAgICAgIGNvdW50cnlDb2RlOiByLmNvdW50cnlfY29kZSB8fCAnJ1xuICAgIH07XG4gICAgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShnZW8pKTtcbiAgICByZXR1cm4gZ2VvO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24oZ2VvKSB7XG4gICAgLy8gRm9yIFVTIGxvY2F0aW9ucyBzaG93IFwiQ2l0eSwgU3RhdGVcIiwgZm9yIG90aGVycyBzaG93IFwiQ2l0eSwgQ291bnRyeVwiXG4gICAgaWYgKGdlby5jb3VudHJ5Q29kZSA9PT0gJ1VTJyAmJiBnZW8uc3RhdGUpIHtcbiAgICAgIHJldHVybiBgJHtnZW8uY2l0eX0sICR7Z2VvLnN0YXRlfWA7XG4gICAgfVxuICAgIGlmIChnZW8uY291bnRyeSkge1xuICAgICAgcmV0dXJuIGAke2dlby5jaXR5fSwgJHtnZW8uY291bnRyeX1gO1xuICAgIH1cbiAgICByZXR1cm4gZ2VvLmNpdHk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFdlYXRoZXIobG9jYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VvID0gYXdhaXQgZ2VvY29kZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBjb25zdCB0ZW1wVW5pdCA9IHVuaXQgPT09ICdtZXRyaWMnID8gJ2NlbHNpdXMnIDogJ2ZhaHJlbmhlaXQnO1xuICAgICAgY29uc3Qgd2luZFVuaXQgPSB1bml0ID09PSAnbWV0cmljJyA/ICdrbWgnIDogJ21waCc7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkub3Blbi1tZXRlby5jb20vdjEvZm9yZWNhc3Q/bGF0aXR1ZGU9JHtnZW8ubGF0fSZsb25naXR1ZGU9JHtnZW8ubG9ufSZjdXJyZW50PXRlbXBlcmF0dXJlXzJtLHdlYXRoZXJfY29kZSx3aW5kX3NwZWVkXzEwbSx3aW5kX2RpcmVjdGlvbl8xMG0mdGVtcGVyYXR1cmVfdW5pdD0ke3RlbXBVbml0fSZ3aW5kX3NwZWVkX3VuaXQ9JHt3aW5kVW5pdH1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignV2VhdGhlciBmZXRjaCBmYWlsZWQnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNvbnN0IGMgPSBkYXRhLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjb2RlID0gYy53ZWF0aGVyX2NvZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wOiBNYXRoLnJvdW5kKGMudGVtcGVyYXR1cmVfMm0pLFxuICAgICAgICBjb25kaXRpb246IHdtb0Rlc2NyaXB0aW9uc1tjb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICAgIGljb246IHdtb0ljb25zW2NvZGVdIHx8ICdcdUQ4M0NcdURGMjRcdUZFMEYnLFxuICAgICAgICBsb2NhdGlvblN0cjogZm9ybWF0TG9jYXRpb24oZ2VvKSxcbiAgICAgICAgd2luZFNwZWVkOiBNYXRoLnJvdW5kKGMud2luZF9zcGVlZF8xMG0pLFxuICAgICAgICB3aW5kRGlyOiBkZWdUb0RpcihjLndpbmRfZGlyZWN0aW9uXzEwbSksXG4gICAgICAgIHVuaXRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2VhdGhlciBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlV2VhdGhlcigpIHtcbiAgICBjb25zdCB3ZWF0aGVyV2lkZ2V0ID0gZ2V0V2VhdGhlckVsZW1lbnRzKCk7XG4gICAgaWYgKCF3ZWF0aGVyV2lkZ2V0Lmljb24gfHwgIXdlYXRoZXJXaWRnZXQudGVtcCB8fCAhd2VhdGhlcldpZGdldC5jb25kaXRpb24gfHwgIXdlYXRoZXJXaWRnZXQubG9jYXRpb24gfHwgIXdlYXRoZXJXaWRnZXQud2luZCkge1xuICAgICAgY29uc29sZS53YXJuKCdXZWF0aGVyIHdpZGdldCBlbGVtZW50cyBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gJ1NldCBMb2NhdGlvbic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnLS1cXHUwMEIwJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gJ0NsaWNrIFxcdTI2OTlcXHVGRTBGIHRvIGNvbmZpZ3VyZSc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSAnLS0nO1xuICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj5cXHVEODNDXFx1REYyNFxcdUZFMEY8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2VhdGhlciA9IGF3YWl0IGZldGNoV2VhdGhlcihsb2NhdGlvbik7XG4gICAgICBpZiAod2VhdGhlcikge1xuICAgICAgICBjb25zdCB0ZW1wU3VmZml4ID0gd2VhdGhlci51bml0ID09PSAnbWV0cmljJyA/ICdcXHUwMEIwQycgOiAnXFx1MDBCMEYnO1xuICAgICAgICBjb25zdCB3aW5kTGFiZWwgPSB3ZWF0aGVyLnVuaXQgPT09ICdtZXRyaWMnID8gJ2ttL2gnIDogJ21waCc7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSB3ZWF0aGVyLmxvY2F0aW9uU3RyO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSBgJHt3ZWF0aGVyLnRlbXB9JHt0ZW1wU3VmZml4fWA7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gd2VhdGhlci5jb25kaXRpb247XG4gICAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9IGBXaW5kOiAke3dlYXRoZXIud2luZFNwZWVkfSAke3dpbmRMYWJlbH0gJHt3ZWF0aGVyLndpbmREaXJ9YDtcbiAgICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj4ke2VzY2FwZUh0bWwod2VhdGhlci5pY29uKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbV2VhdGhlcl0gVXBkYXRlIEVycm9yJywgZXJyb3IsIHsgZnVuY3Rpb246ICd1cGRhdGVXZWF0aGVyJyB9KTtcbiAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSAnV2VhdGhlciBFcnJvcic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnRXJyb3InO1xuICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gJy0tJztcbiAgICB9XG4gIH1cblxuICAvLyBXZWF0aGVyIHNldHRpbmdzIG1vZGFsXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItbW9kYWwnKTtcbiAgY29uc3QgbG9jYXRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLWxvY2F0aW9uLWlucHV0Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9jYXRpb25JbnB1dC52YWx1ZSA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKSB8fCAnJztcbiAgICAvLyBTZXQgdW5pdCByYWRpb1xuICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCJdW3ZhbHVlPVwiJHt1bml0fVwiXWApO1xuICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvY2F0aW9uSW5wdXQuZm9jdXMoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBsb2MgPSBsb2NhdGlvbklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAobG9jKSB7XG4gICAgICAvLyBDbGVhciBnZW8gY2FjaGUgd2hlbiBsb2NhdGlvbiBjaGFuZ2VzIHNvIGl0IHJlLWdlb2NvZGVzXG4gICAgICBjb25zdCBvbGRMb2MgPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSk7XG4gICAgICBpZiAob2xkTG9jICE9PSBsb2MpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgc2FmZVNldChMT0NBVElPTl9LRVksIGxvYyk7XG4gICAgICAvLyBTYXZlIHVuaXQgcHJlZmVyZW5jZVxuICAgICAgY29uc3QgdW5pdFJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiXTpjaGVja2VkJyk7XG4gICAgICBjb25zdCBuZXdVbml0ID0gdW5pdFJhZGlvID8gdW5pdFJhZGlvLnZhbHVlIDogJ2ltcGVyaWFsJztcbiAgICAgIGNvbnN0IG9sZFVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBzYWZlU2V0KFVOSVRfS0VZLCBuZXdVbml0KTtcbiAgICAgIC8vIENsZWFyIGdlbyBjYWNoZSBpZiB1bml0IGNoYW5nZWQgKG5lZWQgZnJlc2ggd2VhdGhlciBkYXRhKVxuICAgICAgaWYgKG9sZFVuaXQgIT09IG5ld1VuaXQpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgdXBkYXRlV2VhdGhlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSBsb2NhdGlvbiAoZS5nLiwgSGFtYnVyZywgTG9uZG9uLCA5MDIxMCknLCAnd2FybmluZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBFc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEluaXRpYWxpemUgd2VhdGhlclxuICB1cGRhdGVXZWF0aGVyKCk7XG4gIC8vIFVwZGF0ZSB3ZWF0aGVyIGV2ZXJ5IDEwIG1pbnV0ZXNcbiAgc2V0SW50ZXJ2YWwodXBkYXRlV2VhdGhlciwgREMuUE9MTC5XRUFUSEVSKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERJR0lUQUwgQ0xPQ0sgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXdpZGdldCcpO1xuICBjb25zdCByZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stcmVuZGVyJyk7XG4gIGlmICghd2lkZ2V0IHx8ICFyZW5kZXIpIHJldHVybjtcblxuICBjb25zdCBEQVlTID0gWydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddO1xuICBjb25zdCBNT05USFMgPSBbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ107XG4gIGNvbnN0IFJPTUFOID0gWydYSUknLCdJJywnSUknLCdJSUknLCdJVicsJ1YnLCdWSScsJ1ZJSScsJ1ZJSUknLCdJWCcsJ1gnLCdYSSddO1xuXG4gIGxldCBjdXJyZW50U3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgbGV0IGxhc3RDaGltZUhvdXIgPSAtMTtcbiAgbGV0IGNoaW1lUGxheWluZyA9IGZhbHNlO1xuICBsZXQgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgbGV0IGFjdGl2ZUxheW91dCA9ICcnO1xuICBsZXQgZGlnaXRhbFJlZnMgPSBudWxsO1xuICBsZXQgdGlja1RpbWVyID0gbnVsbDtcblxuICAvLyA9PT09PSBDSElNRVMgPT09PT1cbiAgZnVuY3Rpb24gcGxheUNoaW1lcyhjb3VudCkge1xuICAgIGlmIChjaGltZVBsYXlpbmcpIHJldHVybjtcbiAgICBpZiAoc2FmZUdldCgnY2xvY2stY2hpbWVzJykgIT09ICd0cnVlJykgcmV0dXJuO1xuICAgIGNoaW1lUGxheWluZyA9IHRydWU7XG4gICAgY29uc3Qgdm9sID0gcGFyc2VJbnQoc2FmZUdldCgnY2xvY2stY2hpbWUtdm9sdW1lJykgfHwgJzUwJywgMTApIC8gMTAwO1xuICAgIGxldCBpID0gMDtcbiAgICBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgICBpZiAoaSA+PSBjb3VudCkgeyBjaGltZVBsYXlpbmcgPSBmYWxzZTsgcmV0dXJuOyB9XG4gICAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICAgIGJlbGwudm9sdW1lID0gdm9sO1xuICAgICAgYmVsbC5wbGF5KCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgaSsrO1xuICAgICAgaWYgKGkgPCBjb3VudCkgc2V0VGltZW91dChzdHJpa2UsIDI1MDApO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHsgY2hpbWVQbGF5aW5nID0gZmFsc2U7IH0sIDI1MDApO1xuICAgIH1cbiAgICBzdHJpa2UoKTtcbiAgfVxuXG4gIC8vID09PT09IERBVEUgU1RSSU5HID09PT09XG4gIGZ1bmN0aW9uIGRhdGVTdHIobm93KSB7XG4gICAgcmV0dXJuIERBWVNbbm93LmdldERheSgpXSArICcsICcgKyBNT05USFNbbm93LmdldE1vbnRoKCldICsgJyAnICsgbm93LmdldERhdGUoKSArICcsICcgKyBub3cuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0UmVuZGVyTGF5b3V0KCkge1xuICAgIGFjdGl2ZUxheW91dCA9ICcnO1xuICAgIGRpZ2l0YWxSZWZzID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuc3VyZURpZ2l0YWxMYXlvdXQoKSB7XG4gICAgaWYgKGFjdGl2ZUxheW91dCAhPT0gJ2RpZ2l0YWwnKSB7XG4gICAgICByZW5kZXIuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgY2xhc3M9XCJjbG9jay10aW1lXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1tYWluXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc2Vjb25kc1wiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLWFtcG1cIj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPjwvZGl2Pic7XG4gICAgICBkaWdpdGFsUmVmcyA9IHtcbiAgICAgICAgbWFpbjogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1tYWluJyksXG4gICAgICAgIHNlY29uZHM6IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stc2Vjb25kcycpLFxuICAgICAgICBhbXBtOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLWFtcG0nKSxcbiAgICAgICAgZGF0ZTogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1kYXRlJylcbiAgICAgIH07XG4gICAgICBhY3RpdmVMYXlvdXQgPSAnZGlnaXRhbCc7XG4gICAgfVxuICAgIHJldHVybiBkaWdpdGFsUmVmcztcbiAgfVxuXG4gIC8vID09PT09IFNUWUxFIFJFTkRFUkVSUyA9PT09PVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRlZmF1bHQobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IHJlZnMgPSBlbnN1cmVEaWdpdGFsTGF5b3V0KCk7XG4gICAgcmVmcy5tYWluLnRleHRDb250ZW50ID0gYCR7aH06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5zZWNvbmRzLnRleHRDb250ZW50ID0gYDoke1N0cmluZyhzKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLmFtcG0udGV4dENvbnRlbnQgPSBhbXBtO1xuICAgIHJlZnMuZGF0ZS50ZXh0Q29udGVudCA9IGRhdGVTdHIobm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckxjZChub3csIGNscykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCByZWZzID0gZW5zdXJlRGlnaXRhbExheW91dCgpO1xuICAgIHJlZnMubWFpbi50ZXh0Q29udGVudCA9IGAke1N0cmluZyhoKS5wYWRTdGFydCgyLCcwJyl9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuc2Vjb25kcy50ZXh0Q29udGVudCA9IGA6JHtTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5hbXBtLnRleHRDb250ZW50ID0gYW1wbTtcbiAgICByZWZzLmRhdGUudGV4dENvbnRlbnQgPSBkYXRlU3RyKG5vdyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGbGlwKG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBkaWdpdHMgPSBTdHJpbmcoaCkucGFkU3RhcnQoMiwnICcpICsgU3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKSArIFN0cmluZyhzKS5wYWRTdGFydCgyLCcwJyk7XG5cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiZmxpcC1jbG9jay1yb3dcIj4nO1xuICAgIC8vIEhvdXJzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMF0sIDApO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzFdLCAxKTtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImZsaXAtY29sb25cIj46PC9zcGFuPic7XG4gICAgLy8gTWludXRlc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzJdLCAyKTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1szXSwgMyk7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJmbGlwLWNvbG9uXCI+Ojwvc3Bhbj4nO1xuICAgIC8vIFNlY29uZHNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1s0XSwgNCk7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbNV0sIDUpO1xuICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwiZmxpcC1hbXBtXCI+JHthbXBtfTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdmbGlwJztcblxuICAgIC8vIFRyaWdnZXIgZmxpcCBhbmltYXRpb24gb24gY2hhbmdlZCBkaWdpdHNcbiAgICBpZiAocHJldkZsaXBEaWdpdHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgIGlmIChkaWdpdHNbaV0gIT09IHByZXZGbGlwRGlnaXRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgY2FyZCA9IHJlbmRlci5xdWVyeVNlbGVjdG9yKGAuZmxpcC1jYXJkW2RhdGEtaWR4PVwiJHtpfVwiXWApO1xuICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsYXNzTGlzdC5hZGQoJ2ZsaXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldkZsaXBEaWdpdHMgPSBkaWdpdHM7XG4gIH1cblxuICBmdW5jdGlvbiBmbGlwQ2FyZChkaWdpdCwgaWR4KSB7XG4gICAgY29uc3QgZCA9IGRpZ2l0ID09PSAnICcgPyAnJyA6IGRpZ2l0O1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZsaXAtY2FyZFwiIGRhdGEtaWR4PVwiJHtpZHh9XCI+PGRpdiBjbGFzcz1cImZsaXAtdG9wXCI+JHtkfTwvZGl2PjxkaXYgY2xhc3M9XCJmbGlwLWJvdHRvbVwiPiR7ZH08L2Rpdj48L2Rpdj5gO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQmluYXJ5KG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAvLyA2IGNvbHVtbnM6IEggdGVucywgSCBvbmVzLCBNIHRlbnMsIE0gb25lcywgUyB0ZW5zLCBTIG9uZXNcbiAgICBjb25zdCBjb2xzID0gW1xuICAgICAgTWF0aC5mbG9vcihoIC8gMTApLCBoICUgMTAsXG4gICAgICBNYXRoLmZsb29yKG0gLyAxMCksIG0gJSAxMCxcbiAgICAgIE1hdGguZmxvb3IocyAvIDEwKSwgcyAlIDEwXG4gICAgXTtcblxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJiaW5hcnktY2xvY2tcIj4nO1xuICAgIC8vIExhYmVsc1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktbGFiZWxzXCI+PHNwYW4+SDwvc3Bhbj48c3Bhbj5IPC9zcGFuPjxzcGFuPk08L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5TPC9zcGFuPjxzcGFuPlM8L3NwYW4+PC9kaXY+JztcbiAgICAvLyA0IHJvd3MgZm9yIGJpdHMgOCw0LDIsMVxuICAgIGZvciAobGV0IGJpdCA9IDM7IGJpdCA+PSAwOyBiaXQtLSkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1yb3dcIj4nO1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgICAgY29uc3Qgb24gPSAoY29sc1tjb2xdID4+IGJpdCkgJiAxO1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiYmluYXJ5LWRvdCAke29uID8gJ29uJyA6ICcnfVwiPjwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBWYWx1ZSByb3dcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LXZhbHVlc1wiPic7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgIGh0bWwgKz0gYDxzcGFuPiR7Y29sc1tjb2xdfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJiaW5hcnktYW1wbVwiPiR7YW1wbX08L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdiaW5hcnknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQW5hbG9nKG5vdywgdXNlUm9tYW4pIHtcbiAgICBjb25zdCBoID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBzaXplID0gMTIwO1xuICAgIGNvbnN0IGN4ID0gc2l6ZSAvIDIsIGN5ID0gc2l6ZSAvIDI7XG5cbiAgICAvLyBBbmdsZXNcbiAgICBjb25zdCBzQW5nbGUgPSAocyAvIDYwKSAqIDM2MCAtIDkwO1xuICAgIGNvbnN0IG1BbmdsZSA9ICgobSArIHMgLyA2MCkgLyA2MCkgKiAzNjAgLSA5MDtcbiAgICBjb25zdCBoQW5nbGUgPSAoKChoICUgMTIpICsgbSAvIDYwKSAvIDEyKSAqIDM2MCAtIDkwO1xuXG4gICAgLy8gTnVtYmVyIGxhYmVsc1xuICAgIGxldCBsYWJlbHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBhbmdsZSA9IChpIC8gMTIpICogMiAqIE1hdGguUEkgLSBNYXRoLlBJIC8gMjtcbiAgICAgIGNvbnN0IHIgPSA0NztcbiAgICAgIGNvbnN0IHggPSBjeCArIHIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5ID0gY3kgKyByICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgbGFiZWwgPSB1c2VSb21hbiA/IFJPTUFOW2kgJSAxMl0gOiBpO1xuICAgICAgY29uc3QgZnMgPSB1c2VSb21hbiA/ICc3JyA6ICc5JztcbiAgICAgIGxhYmVscyArPSBgPHRleHQgeD1cIiR7eH1cIiB5PVwiJHt5fVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJjZW50cmFsXCIgZmlsbD1cInZhcigtLWZnKVwiIGZvbnQtc2l6ZT1cIiR7ZnN9XCIgZm9udC13ZWlnaHQ9XCI2MDBcIiBmb250LWZhbWlseT1cIidTYW1pIEdyb3Rlc2snLHNhbnMtc2VyaWZcIj4ke2xhYmVsfTwvdGV4dD5gO1xuICAgIH1cblxuICAgIC8vIFRpY2sgbWFya3NcbiAgICBsZXQgdGlja3MgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gKGkgLyA2MCkgKiAyICogTWF0aC5QSSAtIE1hdGguUEkgLyAyO1xuICAgICAgY29uc3Qgb3V0ZXIgPSA1NjtcbiAgICAgIGNvbnN0IGlubmVyID0gaSAlIDUgPT09IDAgPyA1MiA6IDU0O1xuICAgICAgY29uc3QgeDEgPSBjeCArIGlubmVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTEgPSBjeSArIGlubmVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgeDIgPSBjeCArIG91dGVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTIgPSBjeSArIG91dGVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgdyA9IGkgJSA1ID09PSAwID8gMS41IDogMC41O1xuICAgICAgdGlja3MgKz0gYDxsaW5lIHgxPVwiJHt4MX1cIiB5MT1cIiR7eTF9XCIgeDI9XCIke3gyfVwiIHkyPVwiJHt5Mn1cIiBzdHJva2U9XCJ2YXIoLS1tdXRlZClcIiBzdHJva2Utd2lkdGg9XCIke3d9XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5gO1xuICAgIH1cblxuICAgIGNvbnN0IHN2ZyA9IGA8c3ZnIGNsYXNzPVwiYW5hbG9nLWNsb2NrLXN2Z1wiIHZpZXdCb3g9XCIwIDAgJHtzaXplfSAke3NpemV9XCIgd2lkdGg9XCIke3NpemV9XCIgaGVpZ2h0PVwiJHtzaXplfVwiPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCI1OFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwidmFyKC0tYm9yZGVyKVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAke3RpY2tzfVxuICAgICAgJHtsYWJlbHN9XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDI4ICogTWF0aC5jb3MoaEFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgMjggKiBNYXRoLnNpbihoQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCJ2YXIoLS1mZylcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgMzggKiBNYXRoLmNvcyhtQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyAzOCAqIE1hdGguc2luKG1BbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cInZhcigtLWZnKVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyA0MiAqIE1hdGguY29zKHNBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDQyICogTWF0aC5zaW4oc0FuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwiI2U3NGMzY1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCIzXCIgZmlsbD1cInZhcigtLWZnKVwiLz5cbiAgICA8L3N2Zz5gO1xuXG4gICAgY29uc3QgYW1wbSA9IG5vdy5nZXRIb3VycygpID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiYW5hbG9nLWNsb2NrLXdyYXBcIj4ke3N2Z308ZGl2IGNsYXNzPVwiYW5hbG9nLWluZm9cIj48c3BhbiBjbGFzcz1cImFuYWxvZy1kaWdpdGFsXCI+JHsobm93LmdldEhvdXJzKCkgJSAxMiB8fCAxMil9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX0gJHthbXBtfTwvc3Bhbj48c3BhbiBjbGFzcz1cImFuYWxvZy1kYXRlLXNtXCI+JHtkYXRlU3RyKG5vdyl9PC9zcGFuPjwvZGl2PjwvZGl2PmA7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2FuYWxvZyc7XG4gIH1cblxuICAvLyA9PT09PSBNQUlOIFRJQ0sgPT09PT1cbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggPSBub3cuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IG0gPSBub3cuZ2V0TWludXRlcygpO1xuICAgIGNvbnN0IHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuXG4gICAgLy8gU2V0IHN0eWxlIGNsYXNzIG9uIHdpZGdldFxuICAgIGNvbnN0IG5leHRDbGFzc05hbWUgPSAnY2xvY2std2lkZ2V0JyArIChjdXJyZW50U3R5bGUgIT09ICdkZWZhdWx0JyA/ICcgJyArIGN1cnJlbnRTdHlsZSA6ICcnKTtcbiAgICBpZiAod2lkZ2V0LmNsYXNzTmFtZSAhPT0gbmV4dENsYXNzTmFtZSkge1xuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IG5leHRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjdXJyZW50U3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xjZCc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1ibHVlJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLWFtYmVyJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXJldHJvJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXRheGknOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdmbGlwJzogcmVuZGVyRmxpcChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2JpbmFyeSc6IHJlbmRlckJpbmFyeShub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2FuYWxvZyc6IHJlbmRlckFuYWxvZyhub3csIGZhbHNlKTsgYnJlYWs7XG4gICAgICBjYXNlICdyb21hbic6IHJlbmRlckFuYWxvZyhub3csIHRydWUpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJlbmRlckRlZmF1bHQobm93KTtcbiAgICB9XG5cbiAgICAvLyBIb3VybHkgY2hpbWVzXG4gICAgaWYgKG0gPT09IDAgJiYgcyA9PT0gMCAmJiBoICE9PSBsYXN0Q2hpbWVIb3VyKSB7XG4gICAgICBsYXN0Q2hpbWVIb3VyID0gaDtcbiAgICAgIHBsYXlDaGltZXMoaCk7XG4gICAgfVxuICAgIGlmIChtICE9PSAwKSBsYXN0Q2hpbWVIb3VyID0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZU5leHRUaWNrKCkge1xuICAgIGNsZWFyVGltZW91dCh0aWNrVGltZXIpO1xuICAgIGNvbnN0IGludGVydmFsID0gZG9jdW1lbnQuaGlkZGVuID8gNjAwMDAgOiAxMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gaW50ZXJ2YWwgLSAoRGF0ZS5ub3coKSAlIGludGVydmFsKSArIDI1O1xuICAgIHRpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGljaygpO1xuICAgICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgIHRpY2soKTtcbiAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gIH0pO1xuXG4gIHRpY2soKTtcbiAgc2NoZWR1bGVOZXh0VGljaygpO1xuXG4gIC8vID09PT09IFNFVFRJTkdTIE1PREFMID09PT09XG4gIGNvbnN0IFNUWUxFUyA9IFtcbiAgICB7IGlkOiAnZGVmYXVsdCcsIGxhYmVsOiAnRGVmYXVsdCcsIGljb246ICdcdUQ4M0RcdURENTAnIH0sXG4gICAgeyBpZDogJ2xjZCcsIGxhYmVsOiAnTENEIEdyZWVuJywgaWNvbjogJ1x1RDgzRFx1REM5QScgfSxcbiAgICB7IGlkOiAnbGNkLWJsdWUnLCBsYWJlbDogJ0xDRCBCbHVlJywgaWNvbjogJ1x1RDgzRFx1REM5OScgfSxcbiAgICB7IGlkOiAnbGNkLWFtYmVyJywgbGFiZWw6ICdMQ0QgQW1iZXInLCBpY29uOiAnXHVEODNEXHVERkUwJyB9LFxuICAgIHsgaWQ6ICdsY2QtcmV0cm8nLCBsYWJlbDogJ0xDRCBSZXRybycsIGljb246ICdcdUQ4M0RcdURGRTknIH0sXG4gICAgeyBpZDogJ2xjZC10YXhpJywgbGFiZWw6ICdMQ0QgVGF4aScsIGljb246ICdcdUQ4M0RcdURGRTEnIH0sXG4gICAgeyBpZDogJ2ZsaXAnLCBsYWJlbDogJ0ZsaXAgQ2xvY2snLCBpY29uOiAnXHVEODNEXHVEQ0RGJyB9LFxuICAgIHsgaWQ6ICdiaW5hcnknLCBsYWJlbDogJ0JpbmFyeScsIGljb246ICdcdUQ4M0RcdURDQkInIH0sXG4gICAgeyBpZDogJ2FuYWxvZycsIGxhYmVsOiAnQW5hbG9nJywgaWNvbjogJ1x1MjNGMCcgfSxcbiAgICB7IGlkOiAncm9tYW4nLCBsYWJlbDogJ1JvbWFuJywgaWNvbjogJ1x1RDgzQ1x1REZEQlx1RkUwRicgfSxcbiAgXTtcblxuICBsZXQgc3R5bGVPcHRpb25zSHRtbCA9ICc8ZGl2IGNsYXNzPVwiY2xvY2stc3R5bGUtZ3JpZFwiPic7XG4gIFNUWUxFUy5mb3JFYWNoKHMgPT4ge1xuICAgIHN0eWxlT3B0aW9uc0h0bWwgKz0gYDxsYWJlbCBjbGFzcz1cImNsb2NrLXN0eWxlLW9wdGlvblwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiIHZhbHVlPVwiJHtzLmlkfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1pY29uXCI+JHtzLmljb259PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtbGFiZWxcIj4ke3MubGFiZWx9PC9zcGFuPjwvc3Bhbj5cbiAgICA8L2xhYmVsPmA7XG4gIH0pO1xuICBzdHlsZU9wdGlvbnNIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwiY2xvY2stc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDQyMHB4O1wiPlxuICAgICAgPGgzPkNsb2NrIFNldHRpbmdzPC9oMz5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogOHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlN0eWxlPC9sYWJlbD5cbiAgICAgICAgJHtzdHlsZU9wdGlvbnNIdG1sfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNsb2NrLWNoaW1lcy10b2dnbGVcIj4gSG91cmx5IGNodXJjaCBiZWxsIGNoaW1lc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7IG1hcmdpbi1sZWZ0OiAyNHB4O1wiPlxuICAgICAgICAgIFN0cmlrZXMgdGhlIG51bWJlciBvZiB0aGUgaG91ciAoZS5nLiwgMyBiZWxscyBhdCAzOjAwKVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCIgaWQ9XCJjbG9jay12b2x1bWUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlZvbHVtZTwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDA4PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImNsb2NrLWNoaW1lLXZvbHVtZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjUwXCIgc3R5bGU9XCJmbGV4OiAxOyBhY2NlbnQtY29sb3I6IHZhcigtLW9rLWZnKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMEE8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLWNoaW1lLXRlc3RcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLXNldHRpbmdzLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stc2V0dGluZ3Mtc2F2ZVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcpO1xuICBjb25zdCBjaGltZXNUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWVzLXRvZ2dsZScpO1xuICBjb25zdCB2b2x1bWVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdm9sdW1lJyk7XG4gIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stdm9sdW1lLXNlY3Rpb24nKTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoYGlucHV0W3ZhbHVlPVwiJHtzdHlsZX1cIl1gKTtcbiAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNoaW1lc1RvZ2dsZS5jaGVja2VkID0gc2FmZUdldCgnY2xvY2stY2hpbWVzJykgPT09ICd0cnVlJztcbiAgICB2b2x1bWVTbGlkZXIudmFsdWUgPSBzYWZlR2V0KCdjbG9jay1jaGltZS12b2x1bWUnKSB8fCAnNTAnO1xuICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUub3BhY2l0eSA9IGNoaW1lc1RvZ2dsZS5jaGVja2VkID8gJzEnIDogJzAuNCc7XG4gIH1cblxuICBjaGltZXNUb2dnbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLm9wYWNpdHkgPSBjaGltZXNUb2dnbGUuY2hlY2tlZCA/ICcxJyA6ICcwLjQnO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFNldHRpbmdzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCB2b2wgPSBwYXJzZUludCh2b2x1bWVTbGlkZXIudmFsdWUsIDEwKSAvIDEwMDtcbiAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICBiZWxsLnZvbHVtZSA9IHZvbDtcbiAgICBiZWxsLnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCJdOmNoZWNrZWQnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJhZGlvID8gcmFkaW8udmFsdWUgOiAnZGVmYXVsdCc7XG4gICAgc2FmZVNldCgnY2xvY2stc3R5bGUnLCBzdHlsZSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWVzJywgU3RyaW5nKGNoaW1lc1RvZ2dsZS5jaGVja2VkKSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWUtdm9sdW1lJywgdm9sdW1lU2xpZGVyLnZhbHVlKTtcbiAgICBjdXJyZW50U3R5bGUgPSBzdHlsZTtcbiAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgdGljaygpO1xuICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignQ2xvY2sgc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBMaXZlIHByZXZpZXcgd2hlbiBjbGlja2luZyBzdHlsZSBvcHRpb25zXG4gIG1vZGFsPy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICByYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjdXJyZW50U3R5bGUgPSByYWRpby52YWx1ZTtcbiAgICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgICAgdGljaygpO1xuICAgIH0pO1xuICB9KTtcbn0pKCk7XG47XG4vLyBEQy0xNjg6IGNhbGVuZGFyIGV2ZW50LWNhY2hlIHNlbWFudGljcyAoc2hhcmVkIGJ5IHdpZGdldCArIHRlc3RzKS5cbi8vIEtleWVkIGJ5IHVpZCtzdGFydCAocmVjdXJyaW5nIGluc3RhbmNlcyBkaWZmZXIgcGVyIG9jY3VycmVuY2UpOyBhIGZldGNoZWRcbi8vIHdpbmRvdyBpcyBhdXRob3JpdGF0aXZlIGZvciBlbnRyaWVzIHN0YXJ0aW5nIGluc2lkZSBpdCAoZGVsZXRpb25zIGFuZFxuLy8gcmVzY2hlZHVsZXMgcHJvcGFnYXRlKSwgZW50cmllcyBvdXRzaWRlIGl0IHN1cnZpdmUuXG4ndXNlIHN0cmljdCc7XG4oZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBldmVudEtleShldikge1xuICAgIC8vIEF1ZGl0IDIwMjYtMTAtMjc6IGEgbnVsbC9pbnZhbGlkIHN0YXJ0IHRocmV3IFJhbmdlRXJyb3Igb3V0IG9mIG1lcmdlKClcbiAgICAvLyBhbmQgZmxpcHBlZCB0aGUgd2hvbGUgd2lkZ2V0IG9mZmxpbmUgXHUyMDE0IGRlZ3JhZGUgdG8gYSBzdHJpbmcga2V5IGluc3RlYWQuXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGV2LnN0YXJ0KTtcbiAgICBjb25zdCBzdGFydElzbyA9IGlzTmFOKGQuZ2V0VGltZSgpKVxuICAgICAgPyBgaW52YWxpZDoke2V2LnN0YXJ0ID09IG51bGwgPyAnbnVsbCcgOiBTdHJpbmcoZXYuc3RhcnQpfWBcbiAgICAgIDogZC50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiBldi51aWQgPyBgJHtldi51aWR9QCR7c3RhcnRJc299YCA6IGAke3N0YXJ0SXNvfXwke2V2LnRpdGxlIHx8ICcnfWA7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6ICgpID0+IG1hcC5zaXplLFxuICAgICAgbWVyZ2UoYm9keSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgZXZdIG9mIG1hcCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKGV2LnN0YXJ0KS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAodCA+PSByYW5nZS5zdGFydC5nZXRUaW1lKCkgJiYgdCA8PSByYW5nZS5lbmQuZ2V0VGltZSgpKSBtYXAuZGVsZXRlKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mICgoYm9keSAmJiBBcnJheS5pc0FycmF5KGJvZHkuZXZlbnRzKSkgPyBib2R5LmV2ZW50cyA6IFtdKSkge1xuICAgICAgICAgIG1hcC5zZXQoZXZlbnRLZXkoZXYpLCBldik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXZlbnRzOiBbLi4ubWFwLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBuZXcgRGF0ZShhLnN0YXJ0KSAtIG5ldyBEYXRlKGIuc3RhcnQpKSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYXBpID0geyBldmVudEtleSwgY3JlYXRlQ2FjaGUgfTtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGFwaTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuQ2FsZW5kYXJDYWNoZSA9IGFwaTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBTEVOREFSIFdJREdFVCAoREMtMTYxICsgREMtMTY4KSA9PT09PT09PT09XG4vLyBaZXJvLWNvbmZpZyBmb3IgY2FsZW5kYXJzIGRlcGxveWVkIHRocm91Z2ggRGFzaENhZGR5IChSYWRpY2FsZSBhdXRvLXdpcmluZyk7XG4vLyBtYW51YWwgQ2FsREFWL0lDUyBzb3VyY2VzIHZpYSB0aGUgXHUyNjk5XHVGRTBGIHNldHRpbmdzIG1vZGFsLiBXZWF0aGVyLXdpZGdldCBwYXR0ZXJuOlxuLy8gY29tcGFjdCB0b3AtYmFyIGRpc3BsYXkgKyB3ZWF0aGVyLW1vZGFsIHNoZWxsICsgc2VydmVyLWJhY2tlZCBzZXR0aW5ncy5cbi8vXG4vLyBEQy0xNjggKG93bmVyIHJlcXVpcmVtZW50cyk6XG4vLyAgMS4gRW1wdHkgXHUyMTkyIGNoaXAgc2F5cyBcIk5vIHVwY29taW5nIGFwcG9pbnRtZW50c1wiIChjYWxlbmRhciBJUyBjb25uZWN0ZWQpLlxuLy8gIDIuIFdpdGggZXZlbnRzIFx1MjE5MiBjaGlwIHNob3dzIHRoZSBuZXh0IGFwcG9pbnRtZW50ICh0aXRsZSArIGRheS90aW1lKS5cbi8vICAzLiBNb2RhbCBcdTIxOTIgbW9udGggR1JJRCB3aXRoIGFwcG9pbnRtZW50IGRheXMgaGlnaGxpZ2h0ZWQgKCsgdGltZXMgaW5cbi8vICAgICB0b29sdGlwIGFuZCB0aGUgVXBjb21pbmcgbGlzdCksIG5vdCBqdXN0IGEgZmxhdCBsaXN0LlxuLy8gIDQuIENoaXAgc3RheXMgd2VhdGhlci13aWRnZXQgc2l6ZSAoQ1NTIGtlZXBzIHBhZGRpbmcvZm9udCBpZGVudGljYWwpLlxuLy8gIDUuIEV2ZXJ5dGhpbmcgc3R5bGVkIHdpdGggQ1NTIHZhcmlhYmxlcyArIFtkYXRhLXRoZW1lXSBvdmVycmlkZXMgaW5cbi8vICAgICBkYXNoYm9hcmQuY3NzIFx1MjAxNCBjb3JyZWN0IGFjcm9zcyBhbGwgdGhlbWVzIGFuZCB1c2VyIHRoZW1lcy5cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4gIGluamVjdE1vZGFsKCdjYWxlbmRhci1tb2RhbCcsIGA8ZGl2IGlkPVwiY2FsZW5kYXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50IGNhbC1tb2RhbC1jb250ZW50XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwiY2FsZW5kYXItbW9kYWwtdGl0bGVcIj5cbiAgICAgIDxoMyBpZD1cImNhbGVuZGFyLW1vZGFsLXRpdGxlXCI+XHVEODNEXHVEQ0M1IENhbGVuZGFyPC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWwtbW9udGhiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNhbC1wcmV2XCIgY2xhc3M9XCJjYWwtbmF2LWJ0blwiIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBtb250aFwiPlx1MjAzOTwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImNhbC1tb250aC1sYWJlbFwiIGNsYXNzPVwiY2FsLW1vbnRoLWxhYmVsXCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FsLW5leHRcIiBjbGFzcz1cImNhbC1uYXYtYnRuXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj5cdTIwM0E8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImNhbC1ncmlkXCIgY2xhc3M9XCJjYWwtZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXVwY29taW5nXCIgc3R5bGU9XCJtYXJnaW46MTJweCAwIDE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tYm90dG9tOjZweDtcIj5VcGNvbWluZyBhcHBvaW50bWVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXVwY29taW5nLWxpc3RcIiBjbGFzcz1cImNhbC1saXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbC1lbXB0eVwiPk5vIHVwY29taW5nIGFwcG9pbnRtZW50cy48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE0cHg7cGFkZGluZy10b3A6MTJweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1mZyk7bWFyZ2luLWJvdHRvbTo4cHg7XCI+Q2FsZW5kYXJzPC9sYWJlbD5cbiAgICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXNvdXJjZXMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NnB4O21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cbiAgICAgICAgPGRldGFpbHMgaWQ9XCJjYWxlbmRhci1hZGQtZGV0YWlsc1wiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07Y29sb3I6dmFyKC0tYWNjZW50KTtcIj4rIEFkZCBhIGNhbGVuZGFyIChDYWxEQVYgVVJMIG9yIElDUyBmZWVkKTwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07XCI+VHlwZVxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjYWwtYWRkLXR5cGVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhbGRhdlwiPkNhbERBVjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImljc1wiPklDUyBmZWVkIChyZWFkLW9ubHkpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjgycmVtO2ZsZXg6MTtcIj5OYW1lXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYWwtYWRkLW5hbWVcIiBwbGFjZWhvbGRlcj1cIldvcmsgY2FsZW5kYXJcIiBtYXhsZW5ndGg9XCIxMjBcIiBzdHlsZT1cIndpZHRoOjEwMCU7YmFja2dyb3VuZDp2YXIoLS1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7XCI+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjgycmVtO1wiPlVSTFxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhbC1hZGQtdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2NhbGVuZGFyLmV4YW1wbGUuY29tL3VzZXIvY2FsZW5kYXIvXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6dmFyKC0tYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O1wiPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07ZmxleDoxO1wiPlVzZXJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhbC1hZGQtdXNlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwid2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDtcIj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07ZmxleDoxO1wiPlBhc3N3b3JkXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiY2FsLWFkZC1wYXNzXCIgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6dmFyKC0tYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O1wiPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiY2FsLWFkZC10ZXN0XCI+VGVzdCBjb25uZWN0aW9uPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjYWwtYWRkLXNhdmVcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjYWwtYWRkLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWluLWhlaWdodDoxZW07XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPjxidXR0b24gaWQ9XCJjYWxlbmRhci1jbG9zZVwiPkNsb3NlPC9idXR0b24+PC9kaXY+XG4gICAgPC9kaXY+PC9kaXY+YCk7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpXG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7XG4gIH1cblxuICBjb25zdCB3aWRnZXRFbHMgPSAoKSA9PiAoe1xuICAgIGljb246IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci13aWRnZXQtaWNvbicpLFxuICAgIHRleHQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci13aWRnZXQtdGV4dCcpLFxuICB9KTtcblxuICBmdW5jdGlvbiBmbXRXaGVuKHN0YXJ0LCBhbGxEYXkpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoc3RhcnQpO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTsgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgY29uc3QgZGF5ID0gbmV3IERhdGUoZCk7IGRheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICBjb25zdCBkYXlzID0gTWF0aC5yb3VuZCgoZGF5IC0gdG9kYXkpIC8gODY0MDAwMDApO1xuICAgIGNvbnN0IGRheUxhYmVsID0gZGF5cyA9PT0gMCA/ICdUb2RheScgOiBkYXlzID09PSAxID8gJ1RvbW9ycm93JyA6XG4gICAgICBkLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnIH0pO1xuICAgIGNvbnN0IHRpbWVMYWJlbCA9IGFsbERheSA/ICdhbGwtZGF5JyA6IGQudG9Mb2NhbGVUaW1lU3RyaW5nKHVuZGVmaW5lZCwgeyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xuICAgIHJldHVybiBgJHtkYXlMYWJlbH0gJHt0aW1lTGFiZWx9YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFRpbWUoc3RhcnQsIGFsbERheSkge1xuICAgIGlmIChhbGxEYXkpIHJldHVybiAnYWxsLWRheSc7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHN0YXJ0KS50b0xvY2FsZVRpbWVTdHJpbmcodW5kZWZpbmVkLCB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkYXlLZXkoZCkge1xuICAgIHJldHVybiBgJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICAvLyBFdmVudCBjYWNoZSBrZXllZCBieSBpZGVudGl0eTogdWlkICsgc3RhcnQgKHJlY3VycmluZyBpbnN0YW5jZXMgc2hhcmUgYVxuICAvLyBVSUQgYnV0IGRpZmZlciBwZXIgb2NjdXJyZW5jZTsgZXZlbnRzIHdpdGhvdXQgVUlEIGZhbGwgYmFjayB0b1xuICAvLyBzdGFydCt0aXRsZSkuIE9uIGVhY2ggZmV0Y2gsIGVudHJpZXMgd2hvc2Ugc3RhcnQgZmFsbHMgSU5TSURFIHRoZSBmZXRjaGVkXG4gIC8vIHdpbmRvdyBhcmUgUkVQTEFDRUQgYnkgdGhlIHNlcnZlciByZXNwb25zZSAoYXV0aG9yaXRhdGl2ZSBmb3IgdGhhdFxuICAvLyB3aW5kb3cgXHUyMDE0IGRlbGV0aW9ucy9yZXNjaGVkdWxlcyBwcm9wYWdhdGUpOyBlbnRyaWVzIG91dHNpZGUgaXQgc3Vydml2ZS5cbiAgLy8gREMtMTY4OiBjYWNoZSBzZW1hbnRpY3MgbGl2ZSBpbiBjYWxlbmRhci1jYWNoZS5qcyAoc2FtZSBmaWxlIGJ1bmRsZWRcbiAgLy8gYWhlYWQgb2YgdGhpcyBvbmUpIHNvIHRlc3RzIGNhbiBleGVyY2lzZSB0aGVtIGRpcmVjdGx5LlxuICBjb25zdCBjYWNoZSA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuQ2FsZW5kYXJDYWNoZSlcbiAgICA/IHdpbmRvdy5DYWxlbmRhckNhY2hlLmNyZWF0ZUNhY2hlKCkgOiBudWxsO1xuICBmdW5jdGlvbiBtZXJnZUV2ZW50cyhib2R5LCByYW5nZSkge1xuICAgIGlmIChjYWNoZSkgcmV0dXJuIGNhY2hlLm1lcmdlKGJvZHksIHJhbmdlKTtcbiAgICAvLyBmYWxsYmFjayBpZiB0aGUgaGVscGVyIHNvbWVob3cgZmFpbGVkIHRvIGxvYWQ6IG5haXZlIHBhc3N0aHJvdWdoXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgLy8gTG9hZGVkIHJhbmdlOiB0aGUgdW5pb24gb2YgW3N0YXJ0LGVuZF0gd2luZG93cyBhbHJlYWR5IGZldGNoZWQuIE5hdmlnYXRpbmdcbiAgLy8gdGhlIGdyaWQgb3V0c2lkZSBpdCB0cmlnZ2VycyBhIHJlZmV0Y2ggZm9yIHRoZSBtaXNzaW5nIG1vbnRoIChqdWRnZSByMTpcbiAgLy8gXCJyZWZldGNoIHdoZW4gbmF2aWdhdGluZyBvdXRzaWRlIHRoZSBsb2FkZWQgcmFuZ2VcIjsganVkZ2UgcjI6IG1lcmdlIGJ5XG4gIC8vIGV2ZW50IGlkZW50aXR5IHNvIG1vbnRoIG5hdmlnYXRpb24gbmV2ZXIgZHJvcHMgcHJpb3IgbW9udGhzKS5cbiAgLy8gZmV0Y2hlZCBpbnRlcnZhbHMgYXMgYSBkaXNqb2ludCBsaXN0IFx1MjAxNCBhIGdhcCBiZXR3ZWVuIHR3byBmZXRjaGVkIHdpbmRvd3NcbiAgLy8gaXMgTkVWRVIgcmVwb3J0ZWQgY292ZXJlZCAoanVkZ2UgcjYpLlxuICBsZXQgbG9hZGVkSW50ZXJ2YWxzID0gW107IC8vIFt7c3RhcnQ6IERhdGUsIGVuZDogRGF0ZX1dIHNvcnRlZCwgZGlzam9pbnRcbiAgZnVuY3Rpb24gd2luZG93Rm9yKHZpZXcpIHtcbiAgICAvLyBBbmNob3Igb24gdGhlIHZpc2libGUgbW9udGg6IHRoYXQgbW9udGggXHUwMEIxIHBhZGRpbmcgZm9yIHRoZSBjaGlwJ3NcbiAgICAvLyBcIm5leHQgYXBwb2ludG1lbnRcIiAoMSBkYXkgYmFjayBmb3IgaW4tcHJvZ3Jlc3MsIDIgbW9udGhzIGZvcndhcmQpLlxuICAgIGNvbnN0IGJhc2UgPSB2aWV3IHx8IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShiYXNlLmdldEZ1bGxZZWFyKCksIGJhc2UuZ2V0TW9udGgoKSAtIDEsIDEsIDAsIDAsIDAsIDApO1xuICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKGJhc2UuZ2V0RnVsbFllYXIoKSwgYmFzZS5nZXRNb250aCgpICsgMiwgMCwgMjMsIDU5LCA1OSwgOTk5KTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gIH1cbiAgZnVuY3Rpb24gY292ZXJzKHJhbmdlKSB7XG4gICAgLy8gY292ZXJlZCBvbmx5IGlmIFNPTUUgc2luZ2xlIGZldGNoZWQgaW50ZXJ2YWwgZnVsbHkgY29udGFpbnMgdGhlIHJhbmdlXG4gICAgcmV0dXJuIGxvYWRlZEludGVydmFscy5zb21lKGl2ID0+XG4gICAgICBpdi5zdGFydC5nZXRUaW1lKCkgPD0gcmFuZ2Uuc3RhcnQuZ2V0VGltZSgpICYmXG4gICAgICBpdi5lbmQuZ2V0VGltZSgpID49IHJhbmdlLmVuZC5nZXRUaW1lKCkpO1xuICB9XG4gIGZ1bmN0aW9uIG1lcmdlUmFuZ2UocmFuZ2UpIHtcbiAgICAvLyBpbnNlcnQgKyBtZXJnZSBvdmVybGFwcGluZy9hZGphY2VudCBpbnRlcnZhbHMsIGtlZXBpbmcgdGhlIGxpc3QgZGlzam9pbnRcbiAgICBjb25zdCBpdnMgPSBsb2FkZWRJbnRlcnZhbHMuZmlsdGVyKGl2ID0+XG4gICAgICBpdi5lbmQuZ2V0VGltZSgpID49IHJhbmdlLnN0YXJ0LmdldFRpbWUoKSAmJiBpdi5zdGFydC5nZXRUaW1lKCkgPD0gcmFuZ2UuZW5kLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcmVzdCA9IGxvYWRlZEludGVydmFscy5maWx0ZXIoaXYgPT4gIWl2cy5pbmNsdWRlcyhpdikpO1xuICAgIGlmIChpdnMubGVuZ3RoKSB7XG4gICAgICByYW5nZSA9IHtcbiAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKE1hdGgubWluKHJhbmdlLnN0YXJ0LmdldFRpbWUoKSwgLi4uaXZzLm1hcChpID0+IGkuc3RhcnQuZ2V0VGltZSgpKSkpLFxuICAgICAgICBlbmQ6IG5ldyBEYXRlKE1hdGgubWF4KHJhbmdlLmVuZC5nZXRUaW1lKCksIC4uLml2cy5tYXAoaSA9PiBpLmVuZC5nZXRUaW1lKCkpKSksXG4gICAgICB9O1xuICAgIH1cbiAgICBsb2FkZWRJbnRlcnZhbHMgPSByZXN0LmNvbmNhdChbcmFuZ2VdKS5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCk7XG4gIH1cbiAgbGV0IHZpZXdNb250aCA9IG51bGw7IC8vIGZpcnN0IGRheSBvZiB2aXNpYmxlIG1vbnRoIChob2lzdGVkIGVhcmx5OiB1c2VkIGJ5IGZldGNoKVxuICBsZXQgbGFzdENhY2hlZCA9IHsgZXZlbnRzOiBbXSB9O1xuICBhc3luYyBmdW5jdGlvbiBmZXRjaENhbGVuZGFyKGZvcmNlKSB7XG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3dGb3Iodmlld01vbnRoKTtcbiAgICBpZiAoIWZvcmNlICYmIGNvdmVycyhyYW5nZSkpIHJldHVybiBsYXN0Q2FjaGVkO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9jYWxlbmRhci9ldmVudHM/c3RhcnQ9JHtyYW5nZS5zdGFydC50b0lTT1N0cmluZygpfSZlbmQ9JHtyYW5nZS5lbmQudG9JU09TdHJpbmcoKX1gLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4geyBub3RDb25maWd1cmVkOiB0cnVlIH07XG4gICAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoYENhbGVuZGFyIEFQSSBIVFRQICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgIGxhc3RDYWNoZWQgPSBtZXJnZUV2ZW50cyhib2R5LCByYW5nZSk7XG4gICAgbWVyZ2VSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIGxhc3RDYWNoZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJXaWRnZXQoYm9keSkge1xuICAgIGNvbnN0IGVscyA9IHdpZGdldEVscygpO1xuICAgIGlmICghZWxzLmljb24gfHwgIWVscy50ZXh0KSByZXR1cm47XG4gICAgY29uc3QgdXBjb21pbmcgPSB1cGNvbWluZ09ubHkoKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmV2ZW50cykpID8gYm9keS5ldmVudHMgOiBbXSk7XG4gICAgaWYgKCF1cGNvbWluZy5sZW5ndGgpIHtcbiAgICAgIGVscy5pY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNSc7XG4gICAgICBlbHMudGV4dC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC1tdXRlZFwiPk5vIHVwY29taW5nIGFwcG9pbnRtZW50czwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdXBjb21pbmdbMF07XG4gICAgZWxzLmljb24udGV4dENvbnRlbnQgPSBuZXh0LmFsbERheSA/ICdcdUQ4M0RcdURERDNcdUZFMEYnIDogJ1x1MjNGMCc7XG4gICAgZWxzLnRleHQuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiY2FsLWNoaXAtdGl0bGVcIj4ke2VzY2FwZUh0bWwobmV4dC50aXRsZSB8fCAnVW50aXRsZWQnKX08L3NwYW4+YCArXG4gICAgICBgPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC13aGVuXCI+XHUwMEI3ICR7ZXNjYXBlSHRtbChmbXRXaGVuKG5leHQuc3RhcnQsIG5leHQuYWxsRGF5KSl9PC9zcGFuPmA7XG4gIH1cblxuICAvLyAtLS0tIE1vbnRoIGdyaWQgLS0tLVxuICBmdW5jdGlvbiBldmVudE1hcChib2R5KSB7XG4gICAgY29uc3QgbWFwID0ge307XG4gICAgZm9yIChjb25zdCBldiBvZiAoKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmV2ZW50cykpID8gYm9keS5ldmVudHMgOiBbXSkpIHtcbiAgICAgIGNvbnN0IGsgPSBkYXlLZXkobmV3IERhdGUoZXYuc3RhcnQpKTtcbiAgICAgIChtYXBba10gPSBtYXBba10gfHwgW10pLnB1c2goZXYpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyR3JpZChib2R5KSB7XG4gICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtZ3JpZCcpO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbC1tb250aC1sYWJlbCcpO1xuICAgIGlmICghZ3JpZCB8fCAhbGFiZWwpIHJldHVybjtcbiAgICBpZiAoIXZpZXdNb250aCkgeyB2aWV3TW9udGggPSBuZXcgRGF0ZSgpOyB2aWV3TW9udGguc2V0RGF0ZSgxKTsgfVxuICAgIGNvbnN0IHkgPSB2aWV3TW9udGguZ2V0RnVsbFllYXIoKSwgbSA9IHZpZXdNb250aC5nZXRNb250aCgpO1xuICAgIGxhYmVsLnRleHRDb250ZW50ID0gdmlld01vbnRoLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIGNvbnN0IGJ5RGF5ID0gZXZlbnRNYXAoYm9keSk7XG4gICAgY29uc3QgdG9kYXlLZXkgPSBkYXlLZXkobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZmlyc3REb3cgPSBuZXcgRGF0ZSh5LCBtLCAxKS5nZXREYXkoKTtcbiAgICBjb25zdCBkYXlzSW4gPSBuZXcgRGF0ZSh5LCBtICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgIGxldCBodG1sID0gWydTJywgJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJ10ubWFwKGQgPT4gYDxkaXYgY2xhc3M9XCJjYWwtZG93XCI+JHtkfTwvZGl2PmApLmpvaW4oJycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3REb3c7IGkrKykgaHRtbCArPSAnPGRpdiBjbGFzcz1cImNhbC1kYXkgY2FsLXBhZFwiPjwvZGl2Pic7XG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbjsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3l9LSR7U3RyaW5nKG0gKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGJ5RGF5W2tleV0gfHwgW107XG4gICAgICBjb25zdCBjbHMgPSBbJ2NhbC1kYXknXTtcbiAgICAgIGlmIChrZXkgPT09IHRvZGF5S2V5KSBjbHMucHVzaCgnY2FsLXRvZGF5Jyk7XG4gICAgICBpZiAoZGF5RXZlbnRzLmxlbmd0aCkgY2xzLnB1c2goJ2NhbC1oYXMtZXZlbnRzJyk7XG4gICAgICBjb25zdCBkb3RzID0gZGF5RXZlbnRzLnNsaWNlKDAsIDMpLm1hcCgoZSkgPT5cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwiY2FsLWRvdFwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGZtdFRpbWUoZS5zdGFydCwgZS5hbGxEYXkpKX1cIj48L3NwYW4+YCkuam9pbignJyk7XG4gICAgICBjb25zdCB0aXAgPSBkYXlFdmVudHMubWFwKGUgPT4gYCR7Zm10VGltZShlLnN0YXJ0LCBlLmFsbERheSl9IFx1MjAxNCAke2UudGl0bGUgfHwgJ1VudGl0bGVkJ31gKS5qb2luKCdcXG4nKTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCIke2Nscy5qb2luKCcgJyl9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwodGlwIHx8IGtleSl9XCI+YCArXG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImNhbC1kYXludW1cIj4ke2RheX08L3NwYW4+JHtkb3RzID8gYDxzcGFuIGNsYXNzPVwiY2FsLWRvdHNcIj4ke2RvdHN9PC9zcGFuPmAgOiAnJ308L2Rpdj5gO1xuICAgIH1cbiAgICBncmlkLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGNvbWluZ09ubHkoZXZlbnRzKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IFtdKVxuICAgICAgLmZpbHRlcihlID0+IHtcbiAgICAgICAgY29uc3QgZW5kVCA9IGUuZW5kID8gbmV3IERhdGUoZS5lbmQpLmdldFRpbWUoKSA6IG5ldyBEYXRlKGUuc3RhcnQpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGVuZFQgPj0gbm93OyAvLyBvbmdvaW5nIGFwcG9pbnRtZW50cyBzdGlsbCBxdWFsaWZ5XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGEuc3RhcnQpIC0gbmV3IERhdGUoYi5zdGFydCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyVXBjb21pbmcoYm9keSkge1xuICAgIGNvbnN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItdXBjb21pbmctbGlzdCcpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50cyA9IHVwY29taW5nT25seSgoYm9keSAmJiBBcnJheS5pc0FycmF5KGJvZHkuZXZlbnRzKSkgPyBib2R5LmV2ZW50cyA6IFtdKTtcbiAgICBpZiAoIWV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIGxpc3QuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJjYWwtZW1wdHlcIj5ObyB1cGNvbWluZyBhcHBvaW50bWVudHMuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGlzdC5pbm5lckhUTUwgPSBldmVudHMuc2xpY2UoMCwgMTIpLm1hcChldiA9PlxuICAgICAgYDxkaXYgY2xhc3M9XCJjYWwtcm93XCI+XG4gICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC13aGVuXCI+JHtlc2NhcGVIdG1sKGZtdFdoZW4oZXYuc3RhcnQsIGV2LmFsbERheSkpfTwvc3Bhbj5cbiAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FsLWV2dGl0bGVcIj4ke2VzY2FwZUh0bWwoZXYudGl0bGUgfHwgJ1VudGl0bGVkJyl9PC9zcGFuPlxuICAgICAgICAgJHtldi5sb2NhdGlvbiA/IGA8c3BhbiBjbGFzcz1cImNhbC1sb2NcIj4ke2VzY2FwZUh0bWwoZXYubG9jYXRpb24pfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgPC9kaXY+YCkuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJTb3VyY2VzKCkge1xuICAgIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1zb3VyY2VzLWxpc3QnKTtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICAgIGxldCBzb3VyY2VzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWxlbmRhci9zb3VyY2VzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgc291cmNlcyA9IChib2R5ICYmIEFycmF5LmlzQXJyYXkoYm9keS5zb3VyY2VzKSkgPyBib2R5LnNvdXJjZXNcbiAgICAgICAgICA6IChBcnJheS5pc0FycmF5KGJvZHkpID8gYm9keSA6IFtdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIG1vZGFsIHN0aWxsIHVzYWJsZSAqLyB9XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiY2FsLWVtcHR5XCI+Tm8gY2FsZW5kYXJzIGNvbm5lY3RlZC4gRGVwbG95IFJhZGljYWxlIGZyb20gdGhlIEFwcCBTZWxlY3RvciB0byBhdXRvLWNvbm5lY3Qgb25lLCBvciBhZGQgYSBDYWxEQVYvSUNTIFVSTCBiZWxvdy48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsaXN0RWwuaW5uZXJIVE1MID0gc291cmNlcy5tYXAocyA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsLXJvdyBjYWwtc3JjLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC1ldnRpdGxlXCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLmlkKX1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC1sb2NcIj5cdTAwQjcgJHtlc2NhcGVIdG1sKHMudHlwZSl9JHtzLmF1dG9Qcm92aXNpb25lZCA/ICcgXHUwMEI3IGF1dG8td2lyZWQnIDogJyd9PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbC1zcmMtdG9nZ2xlIGNhbC1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKHMuaWQpfVwiIGRhdGEtZW5hYmxlZD1cIiR7cy5lbmFibGVkICE9PSBmYWxzZSA/ICcxJyA6ICcwJ31cIj4ke3MuZW5hYmxlZCAhPT0gZmFsc2UgPyAnXHUyNzEzIG9uJyA6ICdvZmYnfTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsLXNyYy1kZWwgY2FsLWJ0biBjYWwtYnRuLWRhbmdlclwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCI+cmVtb3ZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKTtcbiAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLmNhbC1zcmMtdG9nZ2xlJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgIGNvbnN0IGVuYWJsZSA9IGJ0bi5kYXRhc2V0LmVuYWJsZWQgIT09ICcxJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY2FsZW5kYXIvc291cmNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW5hYmxlZDogZW5hYmxlIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZW5kZXJTb3VyY2VzKCk7IHJlZnJlc2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYENhbGVuZGFyIHNvdXJjZSB1cGRhdGUgZmFpbGVkOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLmNhbC1zcmMtZGVsJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY2FsZW5kYXIvc291cmNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZW5kZXJTb3VyY2VzKCk7IHJlZnJlc2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYENhbGVuZGFyIHNvdXJjZSByZW1vdmFsIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBsZXQgbGFzdEJvZHkgPSBudWxsO1xuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoKGZvcmNlKSB7XG4gICAgLy8gQ29hbGVzY2UgaW5zdGVhZCBvZiBkcm9wcGluZyAoYXVkaXQgMjAyNi0xMC0yNyk6IGEgZm9yY2VkIHJlZnJlc2ggdGhhdFxuICAgIC8vIGxhbmRzIHdoaWxlIGFub3RoZXIgaXMgbWlkLWZsaWdodCBwcmV2aW91c2x5IHZhbmlzaGVkLCBsZWF2aW5nIHRoZVxuICAgIC8vIGNoaXAvZ3JpZCBzdGFsZSB1bnRpbCB0aGUgbmV4dCA1LW1pbnV0ZSB0aWNrLlxuICAgIGlmIChyZWZyZXNoLl9pbkZsaWdodCkgeyBpZiAoZm9yY2UpIHJlZnJlc2guX3BlbmRpbmdGb3JjZSA9IHRydWU7IHJldHVybjsgfVxuICAgIHJlZnJlc2guX2luRmxpZ2h0ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgLy8gZm9yY2U9dHJ1ZSAocGVyaW9kaWMgdGljaywgc291cmNlIG11dGF0aW9ucyk6IGJ5cGFzcyB0aGUgY292ZXJlZC1cbiAgICAgIC8vIHdpbmRvdyBjYWNoZSBzbyBzZXJ2ZXItc2lkZSBkZWxldGlvbnMvcmVzY2hlZHVsZXMgcHJvcGFnYXRlLlxuICAgICAgbGV0IGJvZHkgPSBhd2FpdCBmZXRjaENhbGVuZGFyKCEhZm9yY2UpO1xuICAgICAgaWYgKGZvcmNlICYmIHZpZXdNb250aCkge1xuICAgICAgICAvLyBuYXZpZ2F0ZWQgdmlldzogQUxTTyByZWZyZXNoIHRoZSBub3ctd2luZG93IHNvIHRoZSBjaGlwIGNhbid0IGdvXG4gICAgICAgIC8vIHN0YWxlLCB0aGVuIHRoZSB2aWV3IHdpbmRvdyBzbyB0aGUgZ3JpZCBjYW4ndCBnbyBzdGFsZS4gVGhlIENISVBcbiAgICAgICAgLy8gYWx3YXlzIHJlbmRlcnMgZnJvbSB0aGUgbm93LXdpbmRvdyAocjE0OiBhIHZpZXdlZCBmdXR1cmUvcGFzdCBtb250aFxuICAgICAgICAvLyBtdXN0IG5ldmVyIHJlcGxhY2UgdGhlIHJlYWwgbmV4dCBhcHBvaW50bWVudCkuXG4gICAgICAgIGNvbnN0IHNhdmVkID0gdmlld01vbnRoO1xuICAgICAgICB2aWV3TW9udGggPSBudWxsO1xuICAgICAgICBjb25zdCBub3dCb2R5ID0gYXdhaXQgZmV0Y2hDYWxlbmRhcih0cnVlKTtcbiAgICAgICAgdmlld01vbnRoID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IHZpZXdCb2R5ID0gYXdhaXQgZmV0Y2hDYWxlbmRhcih0cnVlKTtcbiAgICAgICAgcmVuZGVyV2lkZ2V0KG5vd0JvZHkpOyAgICAgICAvLyBjaGlwID0gYWN0dWFsIG5leHQgYXBwb2ludG1lbnRcbiAgICAgICAgcmVuZGVyR3JpZCh2aWV3Qm9keSk7ICAgICAgICAvLyBncmlkID0gbmF2aWdhdGVkIG1vbnRoXG4gICAgICAgIHJlbmRlclVwY29taW5nKG5vd0JvZHkpOyAgICAgLy8gbGlzdCA9IHVwY29taW5nIG9ubHlcbiAgICAgICAgbGFzdEJvZHkgPSBub3dCb2R5O1xuICAgICAgICByZWZyZXNoLl9pbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmlld01vbnRoKSB7XG4gICAgICAgIC8vIHIxNTogbm9uLWZvcmNlZCByZWZyZXNoIHdpdGggYSBuYXZpZ2F0ZWQgdmlld01vbnRoIFx1MjAxNCBzYW1lIGd1YXJhbnRlZTpcbiAgICAgICAgLy8gY2hpcCBmcm9tIHRoZSBOT1ctd2luZG93LCBncmlkIGZyb20gdGhlIHZpZXctd2luZG93LlxuICAgICAgICBjb25zdCBzYXZlZCA9IHZpZXdNb250aDtcbiAgICAgICAgdmlld01vbnRoID0gbnVsbDtcbiAgICAgICAgY29uc3Qgbm93Qm9keSA9IGF3YWl0IGZldGNoQ2FsZW5kYXIoZmFsc2UpO1xuICAgICAgICB2aWV3TW9udGggPSBzYXZlZDtcbiAgICAgICAgY29uc3Qgdmlld0JvZHkgPSBhd2FpdCBmZXRjaENhbGVuZGFyKGZhbHNlKTtcbiAgICAgICAgcmVuZGVyV2lkZ2V0KG5vd0JvZHkpO1xuICAgICAgICByZW5kZXJHcmlkKHZpZXdCb2R5KTtcbiAgICAgICAgcmVuZGVyVXBjb21pbmcobm93Qm9keSk7XG4gICAgICAgIGxhc3RCb2R5ID0gbm93Qm9keTtcbiAgICAgICAgcmVmcmVzaC5faW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdEJvZHkgPSBib2R5O1xuICAgICAgcmVuZGVyV2lkZ2V0KGJvZHkpO1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1tb2RhbCcpLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgIHJlbmRlckdyaWQoYm9keSk7XG4gICAgICAgIHJlbmRlclVwY29taW5nKGJvZHkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignY2FsZW5kYXItd2lkZ2V0JywgZSk7IC8vIHdhcyBlcnJvckhhbmRsZXIubG9nKCkgXHUyMDE0IHdoaWNoIG5ldmVyIGV4aXN0ZWQgKG9ubHkgbG9nRXJyb3IgZG9lcyksIHNvIHRoZSBjYXRjaCBpdHNlbGYgdGhyZXdcbiAgICAgIGNvbnN0IGVscyA9IHdpZGdldEVscygpO1xuICAgICAgaWYgKGVscy50ZXh0KSBlbHMudGV4dC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC1tdXRlZFwiPkNhbGVuZGFyIG9mZmxpbmU8L3NwYW4+JztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVmcmVzaC5faW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIGlmIChyZWZyZXNoLl9wZW5kaW5nRm9yY2UpIHtcbiAgICAgICAgcmVmcmVzaC5fcGVuZGluZ0ZvcmNlID0gZmFsc2U7XG4gICAgICAgIHJlZnJlc2godHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLSBNb2RhbCB3aXJpbmcgKGNsYXNzLWJhc2VkIC5zaG93IGxpa2UgZXZlcnkgb3RoZXIgbW9kYWwsIHNvXG4gIC8vIGNsaWNrLW91dHNpZGUgdmlhIHdpcmVNb2RhbCArIEVzY2FwZSArIGZvY3VzIG1hbmFnZW1lbnQgYWxsIHdvcmspIC0tLS1cbiAgbGV0IGNhbExhc3RGb2N1cyA9IG51bGw7XG4gIGZ1bmN0aW9uIG9wZW5Nb2RhbCgpIHtcbiAgICBjYWxMYXN0Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGVuZGFyLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHJlbmRlckdyaWQobGFzdEJvZHkgfHwgeyBldmVudHM6IFtdIH0pO1xuICAgIHJlbmRlclVwY29taW5nKGxhc3RCb2R5IHx8IHsgZXZlbnRzOiBbXSB9KTtcbiAgICByZW5kZXJTb3VyY2VzKCk7XG4gICAgLy8gcmVmcmVzaCgpIHJlbmRlcnMgZ3JpZCt1cGNvbWluZyBpdHNlbGYgb25jZSB0aGUgbW9kYWwgaXMgc2hvd2luZyBcdTIwMTQgb25lXG4gICAgLy8gZmV0Y2ggc2VxdWVuY2UsIG5vdCB0d28gcmFjaW5nIG9uZXMgKGF1ZGl0IDIwMjYtMTAtMjcpLlxuICAgIHJlZnJlc2goKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItY2xvc2UnKS5mb2N1cygpO1xuICB9XG4gIGZ1bmN0aW9uIGNsb3NlTW9kYWwoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGVuZGFyLW1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGlmIChjYWxMYXN0Rm9jdXMgJiYgdHlwZW9mIGNhbExhc3RGb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgY2FsTGFzdEZvY3VzLmZvY3VzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtQ3JlZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXR5cGUnKS52YWx1ZSxcbiAgICAgIG5hbWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLW5hbWUnKS52YWx1ZS50cmltKCksXG4gICAgICB1cmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXVybCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgIHVzZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXVzZXInKS52YWx1ZS50cmltKCksXG4gICAgICBwYXNzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1wYXNzJykudmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXR1cyhtc2cpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1zdGF0dXMnKS50ZXh0Q29udGVudCA9IG1zZztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXRlc3QnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmID0gZm9ybUNyZWRzKCk7XG4gICAgaWYgKCFmLnVybCkgeyBzZXRTdGF0dXMoJ0VudGVyIGEgVVJMIGZpcnN0LicpOyByZXR1cm47IH1cbiAgICBzZXRTdGF0dXMoJ1Rlc3RpbmdcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NhbGVuZGFyL2Rpc2NvdmVyJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiBmLnVybCwgdXNlcjogZi51c2VyLCBwYXNzOiBmLnBhc3MgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY29uc3QgcCA9IGJvZHkgJiYgYm9keS5wcm9iZTtcbiAgICAgIGlmIChwICYmIHAub2spIHNldFN0YXR1cyhgXHUyNzEzIFJlYWNoYWJsZSAoJHtwLnNlcnZlciB8fCAnc2VydmVyJ30pJHtwLmxvb2tzTGlrZUNhbGVuZGFyID8gJyBcdTIwMTQgbG9va3MgbGlrZSBhIGNhbGVuZGFyJyA6ICcnfWApO1xuICAgICAgZWxzZSBzZXRTdGF0dXMoYFx1MjcxNyAke3AgJiYgcC5lcnJvciA/IHAuZXJyb3IgOiAnTm90IHJlYWNoYWJsZSd9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0U3RhdHVzKGBcdTI3MTcgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZiA9IGZvcm1DcmVkcygpO1xuICAgIGlmICghZi5uYW1lIHx8ICFmLnVybCkgeyBzZXRTdGF0dXMoJ05hbWUgYW5kIFVSTCBhcmUgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY2FsZW5kYXIvc291cmNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IGYubmFtZSwgdHlwZTogZi50eXBlLCB1cmw6IGYudXJsLCB1c2VyOiBmLnVzZXIsIHBhc3M6IGYucGFzcyB9KVxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgICBzZXRTdGF0dXMoYFx1MjcxNyAke2JvZHkuZXJyb3IgfHwgYm9keS5tZXNzYWdlIHx8IGBIVFRQICR7cmVzcC5zdGF0dXN9YH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0U3RhdHVzKCdTYXZlZC4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLWRldGFpbHMnKS5vcGVuID0gZmFsc2U7XG4gICAgICBbJ2NhbC1hZGQtbmFtZScsICdjYWwtYWRkLXVybCcsICdjYWwtYWRkLXVzZXInLCAnY2FsLWFkZC1wYXNzJ10uZm9yRWFjaChpZCA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZSA9ICcnOyB9KTtcbiAgICAgIHJlbmRlclNvdXJjZXMoKTsgcmVmcmVzaCh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRTdGF0dXMoYFx1MjcxNyAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNhbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci13aWRnZXQnKTtcbiAgaWYgKGNhbEJ0bikge1xuICAgIGNhbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gICAgLy8gcm9sZT1cImJ1dHRvblwiICsgdGFiaW5kZXg9MCBwcm9taXNlIGtleWJvYXJkIHN1cHBvcnQgXHUyMDE0IGhvbm9yIGl0XG4gICAgLy8gKGF1ZGl0IDIwMjYtMTAtMjc6IEVudGVyL1NwYWNlIHByZXZpb3VzbHkgZGlkIG5vdGhpbmcpLlxuICAgIGNhbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnIHx8IGUua2V5ID09PSAnU3BhY2ViYXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgY2FsU2V0dGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItc2V0dGluZ3MnKTtcbiAgaWYgKGNhbFNldHRpbmdzKSBjYWxTZXR0aW5ncy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5Nb2RhbCgpOyB9KTtcbiAgY29uc3QgY2FsTW9kYWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1tb2RhbCcpO1xuICBpZiAoY2FsTW9kYWxFbCkge1xuICAgIC8vIEFsbCB0aHJlZSBkaXNtaXNzYWwgcGF0aHMgKENsb3NlIGJ1dHRvbiwgYmFja2Ryb3AgY2xpY2ssIEVzY2FwZSkgcm91dGVcbiAgICAvLyB0aHJvdWdoIGNsb3NlTW9kYWwgc28gZm9jdXMgcmV0dXJucyB0byB0aGUgd2lkZ2V0IGV2ZXJ5IHRpbWUgKGp1ZGdlXG4gICAgLy8gcG9saXNoLCB1cm46dW1wOmRieG15aHZyN2Nwa2V1M21iZmRldnJjbzd1dHNvazc0M3VkanNqN2F0aWg2cWs0ZnJkaXEgXHUyMDE0XG4gICAgLy8gd2lyZU1vZGFsJ3Mgb3duIGhhbmRsZXJzIGJ5cGFzcyBmb2N1cyByZXN0b3JlLCBzbyB0aGV5J3JlIG5vdCB1c2VkIGhlcmUpLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gICAgY2FsTW9kYWxFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gY2FsTW9kYWxFbCkgY2xvc2VNb2RhbCgpOyB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgY2FsTW9kYWxFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkgY2xvc2VNb2RhbCgpO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGRlbHRhKSB7XG4gICAgaWYgKCF2aWV3TW9udGgpIHsgdmlld01vbnRoID0gbmV3IERhdGUoKTsgdmlld01vbnRoLnNldERhdGUoMSk7IH1cbiAgICB2aWV3TW9udGggPSBuZXcgRGF0ZSh2aWV3TW9udGguZ2V0RnVsbFllYXIoKSwgdmlld01vbnRoLmdldE1vbnRoKCkgKyBkZWx0YSwgMSk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGZldGNoQ2FsZW5kYXIoZmFsc2UpLmNhdGNoKCgpID0+IGxhc3RCb2R5KTtcbiAgICByZW5kZXJHcmlkKGJvZHkgfHwgeyBldmVudHM6IFtdIH0pO1xuICB9XG4gIGNvbnN0IGNhbFByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLXByZXYnKTtcbiAgaWYgKGNhbFByZXYpIGNhbFByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IG5hdmlnYXRlKC0xKTsgfSk7XG4gIGNvbnN0IGNhbE5leHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLW5leHQnKTtcbiAgaWYgKGNhbE5leHQpIGNhbE5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IG5hdmlnYXRlKDEpOyB9KTtcblxuICB3aW5kb3cucmVmcmVzaENhbGVuZGFyV2lkZ2V0ID0gcmVmcmVzaDtcblxuICBjb25zdCBQT0xMID0gKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuUE9MTCAmJiBEQy5QT0xMLkNBTEVOREFSKSB8fCAzMDAwMDA7XG4gIC8vIFNraXAgdGlja3MgaW4gaGlkZGVuIHRhYnM7IGNhdGNoIHVwIG9uY2Ugb24gcmV0dXJuIChhdWRpdCAyMDI2LTEwLTI3KS5cbiAgc2V0SW50ZXJ2YWwoKCkgPT4geyBpZiAoIWRvY3VtZW50LmhpZGRlbikgcmVmcmVzaCh0cnVlKTsgfSwgUE9MTCk7IC8vIGZvcmNlZDogY2F0Y2ggc2VydmVyLXNpZGUgZGVsZXRpb25zXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7IGlmICghZG9jdW1lbnQuaGlkZGVuKSByZWZyZXNoKHRydWUpOyB9KTtcbiAgc2V0VGltZW91dChyZWZyZXNoLCA0MDApO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ09OTkVDVCBZT1VSIEFJIChEQy0xNjIpID09PT09PT09PT1cbi8vIE9uZSBidXR0b24sIG9uZSBmbG93OiBjbGljayBcIlx1RDgzRVx1REQxNiBDb25uZWN0IEFJXCIgXHUyMTkyIHBpY2sgQ2xhdWRlL0NoYXRHUFQvZ2VuZXJpY1xuLy8gXHUyMTkyIERhc2hDYWRkeSBtaW50cyBhIGRlZGljYXRlZCBka18ga2V5ICsgcmVhZHktdG8tcGFzdGUgTUNQIGNvbmZpZy4gVGhlXG4vLyBkYXNoYm9hcmQncyBvd24gc2Vzc2lvbiBkb2VzIHRoZSBzaWduaW5nLWluOyB0aGUgQUkgYXNzaXN0YW50IGF1dGhlbnRpY2F0ZXNcbi8vIHdpdGggdGhlIGtleSBhZ2FpbnN0IFBPU1QgL2FwaS92MS9tY3AuIEtleXMgbGlzdGVkL3Jldm9rZWFibGUgaGVyZSB0b28uXG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcblxuICBpbmplY3RNb2RhbCgnYWktY29ubmVjdC1tb2RhbCcsIGA8ZGl2IGlkPVwiYWktY29ubmVjdC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDo1NjBweDttYXgtd2lkdGg6NzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNFXHVERDE2IENvbm5lY3QgeW91ciBBSSBhc3Npc3RhbnQ8L2gzPlxuICAgICAgPGRpdiBpZD1cImFpY29ubi1pbnRyb1wiIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgRGFzaENhZGR5IHNwZWFrcyBNQ1AgXHUyMDE0IENsYXVkZSwgQ2hhdEdQVCBhbmQgb3RoZXIgQUkgYXNzaXN0YW50cyBjYW4gbWFuYWdlIHlvdXJcbiAgICAgICAgaG9tZWxhYiAoZGVwbG95IGFwcHMsIGNoZWNrIGhlYWx0aCwgZWRpdCBETlMpIHRocm91Z2ggb25lIGVuZHBvaW50LlxuICAgICAgICBQaWNrIGFuIGFzc2lzdGFudCBhbmQgRGFzaENhZGR5IGdlbmVyYXRlcyB0aGUgYWNjZXNzIGtleSArIGNvbmZpZyBmb3IgaXQuXG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImFpY29ubi1lbmRwb2ludFwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbjowIDAgMTJweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC44cmVtO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtcIj5NQ1AgZW5kcG9pbnQ6PC9zcGFuPlxuICAgICAgICA8Y29kZSBpZD1cImFpY29ubi1lbmRwb2ludC11cmxcIiBzdHlsZT1cInVzZXItc2VsZWN0OmFsbDtcIj5cdTIwMTQ8L2NvZGU+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhaWNvbm4tY29weS1lbmRwb2ludFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O2ZvbnQtc2l6ZTowLjc1cmVtO1wiPkNvcHk8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cImFpY29ubi10b29sc1wiIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAxOiBwaWNrIGNsaWVudCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tc3RlcC1waWNrXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luOjZweCAwIDhweDtcIj5DaG9vc2UgeW91ciBhc3Npc3RhbnQ6PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWljb25uLWNsaWVudC1idG5cIiBkYXRhLWNsaWVudD1cImNsYXVkZVwiPlx1RDgzRFx1REZFMCBDbGF1ZGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWljb25uLWNsaWVudC1idG5cIiBkYXRhLWNsaWVudD1cImNoYXRncHRcIj5cdUQ4M0RcdURGRTIgQ2hhdEdQVDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhaWNvbm4tY2xpZW50LWJ0blwiIGRhdGEtY2xpZW50PVwiZ2VuZXJpY1wiPlx1RDgzRFx1REQwQyBPdGhlciAvIGdlbmVyaWM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDI6IHRoZSBnZW5lcmF0ZWQgY29ubmVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tc3RlcC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7XCIgaWQ9XCJhaWNvbm4tY29uZmlnLXRpdGxlXCI+WW91ciBhY2Nlc3Mga2V5IChzaG93biBvbmNlKTo8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgPGNvZGUgaWQ9XCJhaWNvbm4ta2V5XCIgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYWNjZW50KTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCk7dXNlci1zZWxlY3Q6YWxsO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPlx1MjAxNDwvY29kZT5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYWljb25uLWNvcHkta2V5XCI+Q29weTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5QYXN0ZSBpbnRvIHlvdXIgY2xpZW50OjwvZGl2PlxuICAgICAgICA8cHJlIGlkPVwiYWljb25uLXNuaXBwZXRcIiBzdHlsZT1cIndoaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO2ZvbnQtc2l6ZTowLjc4cmVtO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHg7bWF4LWhlaWdodDoyMjBweDtvdmVyZmxvdzphdXRvO21hcmdpbjowIDAgOHB4O1wiPjwvcHJlPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhaWNvbm4tY29weS1zbmlwcGV0XCI+Q29weSBjb25maWc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYWljb25uLWJhY2tcIj5cdTIxOTAgQ2hvb3NlIGEgZGlmZmVyZW50IGFzc2lzdGFudDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImFpY29ubi1jbGllbnQtbm90ZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV4aXN0aW5nIGNvbm5lY3Rpb25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTRweDtwYWRkaW5nLXRvcDoxMnB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7XCI+QWN0aXZlIEFJIGNvbm5lY3Rpb25zPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tY29ubmVjdGlvbnNcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXgtaGVpZ2h0OjE2MHB4O292ZXJmbG93LXk6YXV0bztcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJhaWNvbm4tc3RhdHVzXCIgc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuNzhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO2FsaWduLXNlbGY6Y2VudGVyO1wiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFpY29ubi1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj48L2Rpdj5gKTtcblxuICBjb25zdCAkID0gKGlkKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGxldCBpbmZvID0gbnVsbDtcblxuICBmdW5jdGlvbiBzZXRTdGF0dXMobXNnKSB7ICQoJ2FpY29ubi1zdGF0dXMnKS50ZXh0Q29udGVudCA9IG1zZzsgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbWNwL2luZm8nKTtcbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpbmZvID0gYm9keTtcbiAgICAgICQoJ2FpY29ubi1lbmRwb2ludCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgJCgnYWljb25uLWVuZHBvaW50LXVybCcpLnRleHRDb250ZW50ID0gYm9keS5lbmRwb2ludDtcbiAgICAgICQoJ2FpY29ubi10b29scycpLnRleHRDb250ZW50ID0gYCR7Ym9keS50b29sQ291bnR9IHRvb2xzIFx1MDBCNyBNQ1AgJHtib2R5LnByb3RvY29sVmVyc2lvbn0gXHUwMEI3IERhc2hDYWRkeSB2JHtib2R5LnNlcnZlclZlcnNpb259YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nKGUsICdhaS1jb25uZWN0LWluZm8nKTtcbiAgICAgIHNldFN0YXR1cygnTUNQIGVuZHBvaW50IHVuYXZhaWxhYmxlIG9uIHRoaXMgYnVpbGQuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbm5lY3Rpb25zKCkge1xuICAgIGNvbnN0IGxpc3RFbCA9ICQoJ2FpY29ubi1jb25uZWN0aW9ucycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbWNwL2Nvbm5lY3Rpb25zJyk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBjb25zdCBrZXlzID0gKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmNvbm5lY3Rpb25zKSkgPyBib2R5LmNvbm5lY3Rpb25zIDogW107XG4gICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPk5vIGNvbm5lY3Rpb25zIHlldCBcdTIwMTQgY2hvb3NlIGFuIGFzc2lzdGFudCBhYm92ZS48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0ga2V5cy5tYXAoayA9PiBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjAuOHJlbTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTtcIj4ke2VzY2FwZUh0bWwoay5uYW1lKX1cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO1wiPlx1MDBCNyAkeyhrLnNjb3BlcyB8fCBbXSkuam9pbignLCcpfSBcdTAwQjcgc2luY2UgJHtlc2NhcGVIdG1sKChrLmNyZWF0ZWRBdCB8fCAnJykuc2xpY2UoMCwgMTApKX0ke2subGFzdFVzZWQgPyAnIFx1MDBCNyBsYXN0IHVzZWQgJyArIGVzY2FwZUh0bWwoU3RyaW5nKGsubGFzdFVzZWQpLnNsaWNlKDAsIDEwKSkgOiAnJ308L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhaWNvbm4tcmV2b2tlXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChrLmlkKX1cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1cmVtO2NvbG9yOnZhcigtLWVyci1mZyk7XCI+UmV2b2tlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmApLmpvaW4oJycpO1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5haWNvbm4tcmV2b2tlJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hdXRoL2tleXMvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykgeyBzZXRTdGF0dXMoJ0Nvbm5lY3Rpb24gcmV2b2tlZC4nKTsgbG9hZENvbm5lY3Rpb25zKCk7IH1cbiAgICAgICAgICBlbHNlIHsgY29uc3QgYiA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOyBzZXRTdGF0dXMoYi5lcnJvciB8fCAnUmV2b2tlIGZhaWxlZC4nKTsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH1cbiAgICAgICAgfSBjYXRjaCAoZSkgeyBzZXRTdGF0dXMoJ1Jldm9rZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfVxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBsb2FkIGNvbm5lY3Rpb25zLjwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihjbGllbnQpIHtcbiAgICBzZXRTdGF0dXMoYENyZWF0aW5nICR7Y2xpZW50fSBjb25uZWN0aW9uXHUyMDI2YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9tY3AvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2xpZW50IH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkua2V5KSB7XG4gICAgICAgIHNldFN0YXR1cyhib2R5LmVycm9yIHx8IGBGYWlsZWQgKEhUVFAgJHtyZXNwLnN0YXR1c30pYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICQoJ2FpY29ubi1rZXknKS50ZXh0Q29udGVudCA9IGJvZHkua2V5O1xuICAgICAgLy8gcmV2MiBjb25maWcgc2hhcGU6IGh0dHBDb25maWcgPSB7dXJsLCB0cmFuc3BvcnQsIGhlYWRlcnMsXG4gICAgICAvLyBtY3BQcm90b2NvbFZlcnNpb259IFx1MjAxNCB0aGUgc3RhbmRhcmQgU3RyZWFtYWJsZS1IVFRQIGNvbm5lY3Rpb24gY2FyZC5cbiAgICAgIGNvbnN0IHNuaXBwZXQgPSBib2R5Lmh0dHBDb25maWcgPyBKU09OLnN0cmluZ2lmeShib2R5Lmh0dHBDb25maWcsIG51bGwsIDIpIDogJyc7XG4gICAgICAkKCdhaWNvbm4tc25pcHBldCcpLnRleHRDb250ZW50ID0gc25pcHBldCB8fCAnKHNlZSBub3RlIGJlbG93KSc7XG4gICAgICAkKCdhaWNvbm4tY2xpZW50LW5vdGUnKS50ZXh0Q29udGVudCA9IGJvZHkubm90ZSB8fCAnJztcbiAgICAgICQoJ2FpY29ubi1jb25maWctdGl0bGUnKS50ZXh0Q29udGVudCA9XG4gICAgICAgIGNsaWVudCA9PT0gJ2NoYXRncHQnID8gJ0FjY2VzcyBrZXkgKENoYXRHUFQgbm90ZSBiZWxvdyk6JyA6ICdZb3VyIGFjY2VzcyBrZXkgKHNob3duIG9uY2UpOic7XG4gICAgICAkKCdhaWNvbm4tc3RlcC1waWNrJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICQoJ2FpY29ubi1zdGVwLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgc2V0U3RhdHVzKCcnKTtcbiAgICAgIGxvYWRDb25uZWN0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2coZSwgJ2FpLWNvbm5lY3QtY3JlYXRlJyk7XG4gICAgICBzZXRTdGF0dXMoJ0ZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29weVRleHQodGV4dCwgb2tNc2cpIHtcbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkudGhlbigoKSA9PiBzZXRTdGF0dXMob2tNc2cpKS5jYXRjaCgoKSA9PiBzZXRTdGF0dXMoJ0NvcHkgZmFpbGVkIFx1MjAxNCBzZWxlY3QgbWFudWFsbHkuJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0dXMoJ0NsaXBib2FyZCB1bmF2YWlsYWJsZSBcdTIwMTQgc2VsZWN0IG1hbnVhbGx5LicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gd2lyaW5nIC0tLS1cbiAgJCgnYWktY29ubmVjdC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAkKCdhaS1jb25uZWN0LW1vZGFsJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAkKCdhaWNvbm4tc3RlcC1waWNrJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgJCgnYWljb25uLXN0ZXAtY29uZmlnJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzZXRTdGF0dXMoJycpO1xuICAgIGxvYWRJbmZvKCk7XG4gICAgbG9hZENvbm5lY3Rpb25zKCk7XG4gIH0pO1xuICAkKCdhaWNvbm4tY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgJCgnYWktY29ubmVjdC1tb2RhbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0pO1xuICAkKCdhaWNvbm4tYmFjaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICQoJ2FpY29ubi1zdGVwLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgJCgnYWljb25uLXN0ZXAtcGljaycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFpY29ubi1jbGllbnQtYnRuJykuZm9yRWFjaChidG4gPT5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjcmVhdGVDb25uZWN0aW9uKGJ0bi5kYXRhc2V0LmNsaWVudCkpKTtcbiAgJCgnYWljb25uLWNvcHkta2V5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb3B5VGV4dCgkKCdhaWNvbm4ta2V5JykudGV4dENvbnRlbnQsICdLZXkgY29waWVkIFx1MjAxNCBwYXN0ZSBpdCBpbnRvIHlvdXIgY2xpZW50LicpKTtcbiAgJCgnYWljb25uLWNvcHktc25pcHBldCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29weVRleHQoJCgnYWljb25uLXNuaXBwZXQnKS50ZXh0Q29udGVudCwgJ0NvbmZpZyBjb3BpZWQuJykpO1xuICAkKCdhaWNvbm4tY29weS1lbmRwb2ludCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29weVRleHQoaW5mbyA/IGluZm8uZW5kcG9pbnQgOiAkKCdhaWNvbm4tZW5kcG9pbnQtdXJsJykudGV4dENvbnRlbnQsICdFbmRwb2ludCBjb3BpZWQuJykpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ0FSRCBIRUFMVEggJiBVUERBVEUgQkFER0VTID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gRmV0Y2ggaGVhbHRoIGRhdGEgYW5kIHVwZGF0ZSBjYXJkIFVJXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5zdGF0dXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBbc2VydmljZUlkLCBzdmNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuc3RhdHVzKSkge1xuICAgICAgICBjb25zdCB1cHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHRpbWUtJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGNvbnN0IGJhckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwdGltZS1iYXItJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGlmICghdXB0aW1lRWwpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHVwdGltZTI0ID0gc3ZjLnVwdGltZT8uWycyNGgnXTtcbiAgICAgICAgaWYgKHVwdGltZTI0ICE9PSB1bmRlZmluZWQgJiYgdXB0aW1lMjQgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBwY3QgPSB1cHRpbWUyNC50b0ZpeGVkKDEpO1xuICAgICAgICAgIHVwdGltZUVsLnRleHRDb250ZW50ID0gYCR7cGN0fSUgdXB0aW1lYDtcbiAgICAgICAgICAvLyBDb2xvciBjbGFzc1xuICAgICAgICAgIHVwdGltZUVsLmNsYXNzTmFtZSA9ICd1cHRpbWUtY2hpcCc7XG4gICAgICAgICAgaWYgKHVwdGltZTI0ID49IDk5LjkpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2V4Y2VsbGVudCcpO1xuICAgICAgICAgIGVsc2UgaWYgKHVwdGltZTI0ID49IDk5KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdnb29kJyk7XG4gICAgICAgICAgZWxzZSBpZiAodXB0aW1lMjQgPj0gOTUpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2RlZ3JhZGVkJyk7XG4gICAgICAgICAgZWxzZSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdwb29yJyk7XG5cbiAgICAgICAgICBpZiAoYmFyRWwpIGJhckVsLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZSBcdTIwMTQgdXB0aW1lIGNoaXBzIHN0YXkgaGlkZGVuICovXG4gICAgICBjb25zb2xlLndhcm4oJ1tDYXJkIEJhZGdlc10gSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyYWNrIGRpc21pc3NlZCB1cGRhdGVzIChwZXIgc2Vzc2lvbilcbiAgbGV0IGRpc21pc3NlZFVwZGF0ZXM7XG4gIHRyeSB7XG4gICAgZGlzbWlzc2VkVXBkYXRlcyA9IG5ldyBTZXQoSlNPTi5wYXJzZShzYWZlU2Vzc2lvbkdldCgnZGlzbWlzc2VkLXVwZGF0ZXMnKSB8fCAnW10nKSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvKiBTZXNzaW9uIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi9cbiAgICBkaXNtaXNzZWRVcGRhdGVzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgLy8gVHJhY2sgZ2xvYmFsIHVwZGF0ZSBzdGF0ZSBmb3IgY3Jvc3MtY29tcG9uZW50IGFjY2Vzc1xuICBsZXQga25vd25VcGRhdGVzID0gW107XG5cbiAgLy8gRmV0Y2ggdXBkYXRlIGRhdGEgYW5kIHNob3cgYmFkZ2VzXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkVXBkYXRlcyhub3RpZnlOZXcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdmFpbGFibGUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHJldHVybjtcblxuICAgICAgLy8gQ2xlYXIgYWxsIHVwZGF0ZSBiYWRnZXMgZmlyc3RcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtYXZhaWxhYmxlLWJhZGdlJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJykpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAga25vd25VcGRhdGVzID0gdXBkYXRlczsgLy8gc3RvcmUgZ2xvYmFsbHlcblxuICAgICAgLy8gTm90aWZ5IGlmIG5ldyB1cGRhdGVzIGFwcGVhcmVkIChwZXJpb2RpYyBjaGVjayB3aXRoIG5vdGlmaWNhdGlvbilcbiAgICAgIGlmIChub3RpZnlOZXcgJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB3aW5kb3cuX2xhc3RLbm93blVwZGF0ZUNvdW50IHx8IDA7XG4gICAgICAgIGlmIChwcmV2ID4gMCAmJiB1cGRhdGVzLmxlbmd0aCA+IHByZXYpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke3VwZGF0ZXMubGVuZ3RofSBjb250YWluZXIgdXBkYXRlKHMpIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgVXBkYXRlIE1hbmFnZW1lbnQgdG8gcmV2aWV3LmAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93Ll9sYXN0S25vd25VcGRhdGVDb3VudCA9IHVwZGF0ZXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGZvciAoY29uc3QgdXBkIG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IGNvbnRhaW5lciBuYW1lIHRvIHNlcnZpY2UgaWRcbiAgICAgICAgY29uc3QgYXBwcyA9IHdpbmRvdy5BUFBTIHx8IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGFwcCBvZiBhcHBzKSB7XG4gICAgICAgICAgaWYgKGFwcC5jb250YWluZXJJZCA9PT0gdXBkLmNvbnRhaW5lcklkIHx8IGFwcC5pZCA9PT0gdXBkLmNvbnRhaW5lck5hbWUgfHwgYXBwLm5hbWUgPT09IHVwZC5jb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGRpc21pc3NlZCB1cGRhdGVzXG4gICAgICAgICAgICBpZiAoZGlzbWlzc2VkVXBkYXRlcy5oYXMoYXBwLmlkKSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUtYmFkZ2UtJyArIGFwcC5pZCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlLWJ0bi0nICsgYXBwLmlkKTtcbiAgICAgICAgICAgIGlmIChiYWRnZSkge1xuICAgICAgICAgICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgIGJhZGdlLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIHRvIG9wZW4gVXBkYXRlIE1hbmFnZW1lbnQuYDtcbiAgICAgICAgICAgICAgYmFkZ2Uuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgICAgICBiYWRnZS5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gVXBkYXRlIE1hbmFnZW1lbnQgbW9kYWwgZm9jdXNlZCBvbiB0aGlzIGFwcFxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlblVwZGF0ZU1vZGFsKSB3aW5kb3cub3BlblVwZGF0ZU1vZGFsKGFwcC5pZCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIaWdobGlnaHQgdXBkYXRlIGJ1dHRvbiBpZiB1cGRhdGUgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOTczMTYnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2Y5NzMxNic7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5ib3hTaGFkb3cgPSAnMCAwIDZweCAjZjk3MzE2ODgnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgdG8gb3BlbiBVcGRhdGUgTWFuYWdlbWVudC5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogVXBkYXRlcyBBUEkgdW5hdmFpbGFibGUgXHUyMDE0IGJhZGdlcyBzdGF5IGhpZGRlbiAqL1xuICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIFVwZGF0ZXMgQVBJIHVuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUnVuIGhlYWx0aCBhbmQgdXBkYXRlIGNoZWNrcyBhZnRlciBtYWluIHJlZnJlc2gsIGFuZCBwZXJpb2RpY2FsbHlcbiAgZnVuY3Rpb24gc2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzKCkge1xuICAgIC8vIEluaXRpYWwgbG9hZCAoZGVsYXllZCB0byBub3QgY29tcGV0ZSB3aXRoIG1haW4gcHJvYmUgY2hlY2tzKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcmVzaENhcmRIZWFsdGgoKTtcbiAgICAgIHJlZnJlc2hDYXJkVXBkYXRlcygpO1xuICAgIH0sIDUwMDApO1xuXG4gICAgLy8gUGVyaW9kaWMgcmVmcmVzaCBldmVyeSA2MCBzZWNvbmRzIFx1MjAxNCBub3RpZnkgb24gbmV3IHVwZGF0ZXMgZGV0ZWN0ZWRcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICByZWZyZXNoQ2FyZEhlYWx0aCgpO1xuICAgICAgcmVmcmVzaENhcmRVcGRhdGVzKHRydWUpOyAvLyB0cnVlID0gbm90aWZ5IGlmIG5ldyB1cGRhdGVzIGZvdW5kXG4gICAgfSwgNjAwMDApO1xuICB9XG5cbiAgLy8gSG9vayBpbnRvIG1haW4gcmVmcmVzaCBjeWNsZVxuICBjb25zdCBvcmlnUmVmcmVzaEFsbCA9IHdpbmRvdy5yZWZyZXNoQWxsO1xuICBpZiAob3JpZ1JlZnJlc2hBbGwpIHtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ1JlZnJlc2hBbGwoKTtcbiAgICAgICAgLy8gUmVmcmVzaCBoZWFsdGggZGF0YSBhZnRlciBtYWluIHN0YXR1cyBjaGVja1xuICAgICAgICBzZXRUaW1lb3V0KHJlZnJlc2hDYXJkSGVhbHRoLCAxMDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIEVycm9yIGluIHJlZnJlc2hBbGwgaG9vazonLCBlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIFBJQ0tFUiArIFRIRU1FIEJVSUxERVIgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoZW1lQmVmb3JlQnVpbGRlciA9IG51bGw7XG4gIHZhciBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gIHZhciBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9OyAvLyB0cmFja3Mgd2hpY2ggYWR2YW5jZWQgZmllbGRzIHVzZXIgbWFudWFsbHkgY2hhbmdlZFxuXG4gIC8vIERpc3BsYXkgbmFtZXMgZm9yIGJ1aWx0LWluIHRoZW1lc1xuICB2YXIgVEhFTUVfTEFCRUxTID0ge1xuICAgIGRhcms6ICdEYXJrJyxcbiAgICBsaWdodDogJ0xpZ2h0JyxcbiAgICBibHVlOiAnQmx1ZScsXG4gICAgYmxhY2s6ICdCbGFjaycsXG4gICAgbm9yZDogJ05vcmQnLFxuICAgIGRyYWN1bGE6ICdEcmFjdWxhJyxcbiAgICAnc29sYXJpemVkLWRhcmsnOiAnU29sYXJpemVkIERhcmsnLFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOiAnU29sYXJpemVkIExpZ2h0JyxcbiAgICB0YXhpOiAnVGF4aScsXG4gICAgb2NlYW46ICdPY2VhbicsXG4gIH07XG5cbiAgLy8gQ29sb3IgcGlja2VyIGZpZWxkIGRlZmluaXRpb25zOiBbY3NzLXByb3AsIGxhYmVsLCBzZWN0aW9uXVxuICB2YXIgRklFTERTID0gW1xuICAgIFsnYmcnLCAgICAgICAgICAgICdCYWNrZ3JvdW5kJywgICAgJ2Jhc2UnXSxcbiAgICBbJ2NhcmQtYmFzZScsICAgICAnQ2FyZCcsICAgICAgICAgICdiYXNlJ10sXG4gICAgWydmZycsICAgICAgICAgICAgJ1RleHQnLCAgICAgICAgICAnYmFzZSddLFxuICAgIFsnbXV0ZWQnLCAgICAgICAgICdNdXRlZCBUZXh0JywgICAgJ2Jhc2UnXSxcbiAgICBbJ2JvcmRlcicsICAgICAgICAnQm9yZGVyJywgICAgICAgICdiYXNlJ10sXG4gICAgWydhY2NlbnQnLCAgICAgICAgJ0FjY2VudCcsICAgICAgICAnYWNjZW50J10sXG4gICAgWydhY2NlbnQtc3Ryb25nJywgJ0FjY2VudCBTdHJvbmcnLCAnYWNjZW50J10sXG4gICAgWydvay1iZycsICAgICAgICAgJ09LIEJhY2tncm91bmQnLCAnc3RhdHVzJ10sXG4gICAgWydvay1mZycsICAgICAgICAgJ09LIFRleHQnLCAgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtYmcnLCAgICAgICAgJ0Vycm9yIEJnJywgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtZmcnLCAgICAgICAgJ0Vycm9yIFRleHQnLCAgICAnc3RhdHVzJ10sXG4gICAgWydkb3Qtb2snLCAgICAgICAgJ0RvdCBPSycsICAgICAgICAnc3RhdHVzJ10sXG4gICAgWydkb3QtYmFkJywgICAgICAgJ0RvdCBFcnJvcicsICAgICAnc3RhdHVzJ10sXG4gICAgWyd1cHRpbWUnLCAgICAgICAgJ1VwdGltZSBCYXInLCAgICAnc3RhdHVzJ10sXG4gICAgWydob3ZlcicsICAgICAgICAgJ0hvdmVyJywgICAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2NhcmQtaG92ZXInLCAgICAnQ2FyZCBIb3ZlcicsICAgICdhZHZhbmNlZCddLFxuICAgIFsnYmFzZScsICAgICAgICAgICdUYWdzL0JhZGdlcycsICAgJ2FkdmFuY2VkJ10sXG4gICAgWydmZy1tdXRlZCcsICAgICAgJ0RpbSBUZXh0JywgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ3N1Y2Nlc3MnLCAgICAgICAnU3VjY2VzcycsICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnZXJyb3InLCAgICAgICAgICdFcnJvcicsICAgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWyd3YXJuaW5nJywgICAgICAgJ1dhcm5pbmcnLCAgICAgICAnYWR2YW5jZWQnXSxcbiAgXTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQ3ljbGUgQnV0dG9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHZhciB0aGVtZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpO1xuICBpZiAoIXRoZW1lQnRuKSByZXR1cm47XG4gIHZhciB0aGVtZUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWxhYmVsJyk7XG5cbiAgZnVuY3Rpb24gZ2V0TGFiZWxGb3IodCkge1xuICAgIGlmIChUSEVNRV9MQUJFTFNbdF0pIHJldHVybiBUSEVNRV9MQUJFTFNbdF07XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgaWYgKHVzZXJUaGVtZXNbdF0pIHJldHVybiB1c2VyVGhlbWVzW3RdLm5hbWUgfHwgdDtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxhYmVsKCkge1xuICAgIGlmICh0aGVtZUxhYmVsKSB0aGVtZUxhYmVsLnRleHRDb250ZW50ID0gZ2V0TGFiZWxGb3Iod2luZG93LmdldEFjdGl2ZVRoZW1lKCkpO1xuICB9XG5cbiAgdGhlbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpc3QgPSB3aW5kb3cuVEhFTUVTLnNsaWNlKCk7XG4gICAgdmFyIGN1cnJlbnQgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICB2YXIgaWR4ID0gbGlzdC5pbmRleE9mKGN1cnJlbnQpO1xuICAgIHZhciBuZXh0ID0gbGlzdFsoaWR4ICsgMSkgJSBsaXN0Lmxlbmd0aF07XG4gICAgd2luZG93LmFwcGx5VGhlbWUobmV4dCk7XG4gICAgdXBkYXRlTGFiZWwoKTtcbiAgfSk7XG5cbiAgdXBkYXRlTGFiZWwoKTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQnVpbGRlciBNb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBidWlsZEZpZWxkc0hUTUwoKSB7XG4gICAgdmFyIHNlY3Rpb25zID0geyBiYXNlOiAnQmFzZSBDb2xvcnMnLCBhY2NlbnQ6ICdBY2NlbnQnLCBzdGF0dXM6ICdTdGF0dXMnLCBhZHZhbmNlZDogJ0FkdmFuY2VkIChhdXRvLWRlcml2ZWQpJyB9O1xuICAgIHZhciBncm91cGVkID0ge307XG4gICAgRklFTERTLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgIGlmICghZ3JvdXBlZFtmWzJdXSkgZ3JvdXBlZFtmWzJdXSA9IFtdO1xuICAgICAgZ3JvdXBlZFtmWzJdXS5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgdmFyIGh0bWwgPSAnJztcbiAgICBPYmplY3Qua2V5cyhzZWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWFkdmFuY2VkLXRvZ2dsZVwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGVcIiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgNHB4O2N1cnNvcjpwb2ludGVyO2NvbG9yOnZhcigtLWFjY2VudCk7Zm9udC1zaXplOi44NXJlbTt1c2VyLXNlbGVjdDpub25lO1wiPlNob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDs8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZFwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb25cIj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvbi10aXRsZVwiPicgKyBzZWN0aW9uc1trZXldICsgJzwvZGl2Pic7XG4gICAgICAoZ3JvdXBlZFtrZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXJvd1wiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItbGFiZWxcIj4nICsgZlsxXSArICc8L3NwYW4+JyArXG4gICAgICAgICAgJzxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY29sb3JcIiBkYXRhLXByb3A9XCInICsgZlswXSArICdcIicgKyAoa2V5ID09PSAnYWR2YW5jZWQnID8gJyBkYXRhLWFkdmFuY2VkPVwiMVwiJyA6ICcnKSArICcgdmFsdWU9XCIjMDAwMDAwXCIgLz4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWhleFwiIGRhdGEtaGV4PVwiJyArIGZbMF0gKyAnXCI+IzAwMDAwMDwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9KTtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpIHtcbiAgICByZXR1cm4gd2luZG93LlRIRU1FUy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAnPG9wdGlvbiB2YWx1ZT1cIicgKyB0ICsgJ1wiPicgKyBnZXRMYWJlbEZvcih0KSArICc8L29wdGlvbj4nO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgdmFyIG1vZGFsSFRNTCA9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6NDIwcHg7bWF4LXdpZHRoOjU2MHB4O1wiPicgK1xuICAgICc8aDM+VGhlbWUgQnVpbGRlcjwvaDM+JyArXG5cbiAgICAvLyBFZGl0IGV4aXN0aW5nIHVzZXIgdGhlbWVzIGRyb3Bkb3duXG4gICAgJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWV4aXN0aW5nXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpub25lO1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPkVkaXQ6PC9sYWJlbD4nICtcbiAgICAnPHNlbGVjdCBpZD1cInRoZW1lLWJ1aWxkZXItZWRpdC1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07bWFyZ2luLXJpZ2h0OjhweDtcIj4nICtcbiAgICAnPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBOZXcgVGhlbWUgXHUyMDE0PC9vcHRpb24+JyArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1kZWxldGVcIiBzdHlsZT1cInBhZGRpbmc6NHB4IDEwcHg7YmFja2dyb3VuZDpjb2xvci1taXgoaW4gc3JnYix2YXIoLS1iYWQtZmcpIDE1JSx0cmFuc3BhcmVudCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1iYWQtZmcpO2NvbG9yOnZhcigtLWJhZC1mZyk7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44cmVtO2N1cnNvcjpwb2ludGVyO1wiPkRlbGV0ZTwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPk5hbWU6PC9sYWJlbD4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLW5hbWVcIiBtYXhsZW5ndGg9XCIyMFwiIHBsYWNlaG9sZGVyPVwiTXkgVGhlbWVcIiAnICtcbiAgICAnc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO3dpZHRoOjE0MHB4O1wiIC8+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcjtcIiBmb3I9XCJ0aGVtZS1idWlsZGVyLWxpZ2h0YmdcIj4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwidGhlbWUtYnVpbGRlci1saWdodGJnXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NnB4O2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiAvPicgK1xuICAgICdMaWdodCBiYWNrZ3JvdW5kICh1c2UgZGFyayBsb2dvKTwvbGFiZWw+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7XCI+U3RhcnQgZnJvbTo8L2xhYmVsPicgK1xuICAgICc8c2VsZWN0IGlkPVwidGhlbWUtYnVpbGRlci1zdGFydFwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTtcIj4nICtcbiAgICBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKSArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1wcmV2aWV3XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLXByZXZpZXdcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY2FyZFwiIGlkPVwidGhlbWUtcHJldmlldy1jYXJkXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LXRpdGxlXCI+U2FtcGxlIENhcmQ8L2Rpdj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctbXV0ZWRcIj5TZWNvbmRhcnkgdGV4dCBwcmV2aWV3PC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWJhZGdlc1wiPicgK1xuICAgICc8c3BhbiBjbGFzcz1cInByZXZpZXctYmFkZ2VcIiBpZD1cInByZXZpZXctYmFkZ2Utb2tcIj5PTjwvc3Bhbj4nICtcbiAgICAnPHNwYW4gY2xhc3M9XCJwcmV2aWV3LWJhZGdlXCIgaWQ9XCJwcmV2aWV3LWJhZGdlLWJhZFwiPk9GRjwvc3Bhbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWRvdHNcIj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3Qtb2tcIj48L3NwYW4+IE9ubGluZTwvc3Bhbj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3QtYmFkXCI+PC9zcGFuPiBPZmZsaW5lPC9zcGFuPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPGJ1dHRvbiBjbGFzcz1cInByZXZpZXctYnRuXCIgaWQ9XCJwcmV2aWV3LWFjY2VudC1idG5cIj5BY2NlbnQgQnV0dG9uPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgIGJ1aWxkRmllbGRzSFRNTCgpICtcblxuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1pbXBvcnRcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87XCIgdGl0bGU9XCJJbXBvcnQgdGhlbWUgZnJvbSBKU09OIGZpbGVcIj5JbXBvcnQ8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItZXhwb3J0XCIgdGl0bGU9XCJFeHBvcnQgdGhlbWUgYXMgSlNPTiBmaWxlXCI+RXhwb3J0PC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlIFRoZW1lPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj48L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCd0aGVtZS1idWlsZGVyLW1vZGFsJywgbW9kYWxIVE1MKTtcblxuICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1tb2RhbCcpO1xuICB2YXIgc3RhcnRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1zdGFydCcpO1xuICB2YXIgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbmFtZScpO1xuICB2YXIgZWRpdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWVkaXQtc2VsZWN0Jyk7XG4gIHZhciBleGlzdGluZ1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leGlzdGluZycpO1xuICB2YXIgbGlnaHRCZ0NoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbGlnaHRiZycpO1xuICB2YXIgcGlja2VycyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGVtZS1idWlsZGVyLWNvbG9yJyk7XG4gIHZhciBhZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZCcpO1xuICB2YXIgYWR2YW5jZWRUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGUnKTtcbiAgdmFyIGV4cG9ydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWV4cG9ydCcpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZHZhbmNlZCB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgdmFyIGFkdmFuY2VkVmlzaWJsZSA9IGZhbHNlO1xuICBhZHZhbmNlZFRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhZHZhbmNlZFZpc2libGUgPSAhYWR2YW5jZWRWaXNpYmxlO1xuICAgIGFkdmFuY2VkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gYWR2YW5jZWRWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gYWR2YW5jZWRWaXNpYmxlXG4gICAgICA/ICdIaWRlIGFkdmFuY2VkIGNvbG9ycyAmIzk2NTA7J1xuICAgICAgOiAnU2hvdyBhZHZhbmNlZCBjb2xvcnMgJiM5NjYwOyc7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBwaWNrZXIgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRDdXJyZW50Q29sb3JzKCkge1xuICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGNvbG9yc1twLmRhdGFzZXQucHJvcF0gPSBwLnZhbHVlO1xuICAgIH0pO1xuICAgIGNvbG9yc1snY2FyZC1iZyddID0gY29sb3JzWydjYXJkLWJhc2UnXTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmFzZUNvbG9ycygpIHtcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoIXAuZGF0YXNldC5hZHZhbmNlZCkgY29sb3JzW3AuZGF0YXNldC5wcm9wXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgY29sb3JzWydjYXJkLWJnJ10gPSBjb2xvcnNbJ2NhcmQtYmFzZSddO1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgY29sb3JzLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCkge1xuICAgIHZhciBiYXNlID0gZ2V0QmFzZUNvbG9ycygpO1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGJhc2UpIDoge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmICFhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgdmFyIHZhbCA9IGRlcml2ZWRbcC5kYXRhc2V0LnByb3BdIHx8ICcjMzMzMzMzJztcbiAgICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkVGhlbWVJbnRvUGlja2Vycyh0aGVtZU5hbWUpIHtcbiAgICB2YXIgY29sb3JzID0gd2luZG93LlRIRU1FX0NPTE9SU1t0aGVtZU5hbWVdO1xuICAgIGlmICghY29sb3JzKSByZXR1cm47XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHZhciB2YWwgPSBjb2xvcnNbcC5kYXRhc2V0LnByb3BdIHx8ICcjMDAwMDAwJztcbiAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgncmdiYScpIHx8IHZhbC5zdGFydHNXaXRoKCdjb2xvci1taXgnKSkgdmFsID0gJyMzMzMzMzMnO1xuICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgICBsaWdodEJnQ2hlY2suY2hlY2tlZCA9ICEhY29sb3JzLmxpZ2h0Qmc7XG4gICAgdXBkYXRlUHJldmlldygpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHNsdWcpIHtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW3NsdWddO1xuICAgIGlmICghdGhlbWUpIHJldHVybjtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgdmFyIHZhbCA9IHRoZW1lW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgLy8gSWYgdGhlbWUgaGFzIGV4cGxpY2l0IGFkdmFuY2VkIHZhbHVlcywgbWFyayBhcyBvdmVycmlkZGVuXG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmIHRoZW1lW3AuZGF0YXNldC5wcm9wXSkge1xuICAgICAgICBhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5hbWVJbnB1dC52YWx1ZSA9IHRoZW1lLm5hbWUgfHwgJyc7XG4gICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lLmxpZ2h0Qmc7XG4gICAgLy8gRmlsbCBhbnkgbWlzc2luZyBhZHZhbmNlZCBmaWVsZHMgZnJvbSBkZXJpdmF0aW9uXG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByZXZpZXcoKSB7XG4gICAgdmFyIGMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1wcmV2aWV3Jyk7XG4gICAgdmFyIGNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtcHJldmlldy1jYXJkJyk7XG4gICAgdmFyIHRpdGxlID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy10aXRsZScpO1xuICAgIHZhciBtdXRlZCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctbXV0ZWQnKTtcbiAgICB2YXIgYmFkZ2VPayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWJhZGdlLW9rJyk7XG4gICAgdmFyIGJhZGdlQmFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYmFkZ2UtYmFkJyk7XG4gICAgdmFyIGRvdE9rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctZG90LW9rJyk7XG4gICAgdmFyIGRvdEJhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWRvdC1iYWQnKTtcbiAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYWNjZW50LWJ0bicpO1xuICAgIHZhciBkb3RzID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy1kb3RzJyk7XG5cbiAgICBwcmV2aWV3LnN0eWxlLmJhY2tncm91bmQgPSBjWydiZyddO1xuICAgIGNhcmQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2NhcmQtYmFzZSddO1xuICAgIGNhcmQuc3R5bGUuYm9yZGVyQ29sb3IgPSBjWydib3JkZXInXTtcbiAgICB0aXRsZS5zdHlsZS5jb2xvciA9IGNbJ2ZnJ107XG4gICAgbXV0ZWQuc3R5bGUuY29sb3IgPSBjWydtdXRlZCddO1xuICAgIGJhZGdlT2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ29rLWJnJ107XG4gICAgYmFkZ2VPay5zdHlsZS5jb2xvciA9IGNbJ29rLWZnJ107XG4gICAgYmFkZ2VCYWQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2JhZC1iZyddO1xuICAgIGJhZGdlQmFkLnN0eWxlLmNvbG9yID0gY1snYmFkLWZnJ107XG4gICAgZG90T2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2RvdC1vayddO1xuICAgIGRvdEJhZC5zdHlsZS5iYWNrZ3JvdW5kID0gY1snZG90LWJhZCddO1xuICAgIGRvdHMuc3R5bGUuY29sb3IgPSBjWydmZyddO1xuICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYWNjZW50J107XG4gICAgYnRuLnN0eWxlLmNvbG9yID0gY1snYmcnXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5Q29sb3JzTGl2ZShjb2xvcnMpIHtcbiAgICAvLyBJbmNsdWRlIGRlcml2ZWQgY29sb3JzIGZvciBmdWxsIGxpdmUgcHJldmlld1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGNvbG9ycykgOiB7fTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgdmFyIHZhbCA9IGNvbG9yc1twcm9wXSB8fCBkZXJpdmVkW3Byb3BdO1xuICAgICAgaWYgKHZhbCkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tJyArIHByb3AsIHZhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIHVwIGNvbG9yIHBpY2tlcnNcbiAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgcC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSBwLnZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIC8vIFRyYWNrIG1hbnVhbCBhZHZhbmNlZCBvdmVycmlkZXNcbiAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQpIHtcbiAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJhc2UgY29sb3IgY2hhbmdlZCBcdTIwMTQgcmUtZGVyaXZlIGFkdmFuY2VkIHZhbHVlcyAodW5sZXNzIG92ZXJyaWRkZW4pXG4gICAgICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlUHJldmlldygpO1xuICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExpZ2h0LWJnIGNoZWNrYm94IHNob3VsZCByZS1kZXJpdmUgYWR2YW5jZWQgY29sb3JzXG4gIGxpZ2h0QmdDaGVjay5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgfSk7XG5cbiAgc3RhcnRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgbG9hZFRoZW1lSW50b1BpY2tlcnMoc3RhcnRTZWxlY3QudmFsdWUpO1xuICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICB9KTtcblxuICAvLyBQb3B1bGF0ZSBhbmQgcmVmcmVzaCB0aGUgZWRpdC1leGlzdGluZyBkcm9wZG93blxuICBmdW5jdGlvbiByZWZyZXNoRWRpdERyb3Bkb3duKCkge1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBzbHVncyA9IE9iamVjdC5rZXlzKHVzZXJUaGVtZXMpO1xuICAgIGVkaXRTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTmV3IFRoZW1lIFx1MjAxNDwvb3B0aW9uPic7XG4gICAgc2x1Z3MuZm9yRWFjaChmdW5jdGlvbiAoc2x1Zykge1xuICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LnZhbHVlID0gc2x1ZztcbiAgICAgIG9wdC50ZXh0Q29udGVudCA9IHVzZXJUaGVtZXNbc2x1Z10ubmFtZSB8fCBzbHVnO1xuICAgICAgZWRpdFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgIH0pO1xuICAgIGV4aXN0aW5nU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gc2x1Z3MubGVuZ3RoID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvLyBBbHNvIHJlZnJlc2ggXCJTdGFydCBmcm9tXCIgb3B0aW9uc1xuICBmdW5jdGlvbiByZWZyZXNoU3RhcnRGcm9tKCkge1xuICAgIHN0YXJ0U2VsZWN0LmlubmVySFRNTCA9IGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpO1xuICB9XG5cbiAgLy8gRWRpdCBkcm9wZG93biBjaGFuZ2VcbiAgZWRpdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNsdWcgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChzbHVnKSB7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHNsdWc7XG4gICAgICBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnMoc2x1Zyk7XG4gICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc3RhcnRTZWxlY3QudmFsdWUgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHN0YXJ0U2VsZWN0LnZhbHVlKTtcbiAgICB9XG4gICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSBlZGl0aW5nU2x1ZyA/ICcnIDogJ25vbmUnO1xuICB9KTtcblxuICBmdW5jdGlvbiBvcGVuQnVpbGRlcigpIHtcbiAgICB0aGVtZUJlZm9yZUJ1aWxkZXIgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcblxuICAgIC8vIFJlc2V0IGFkdmFuY2VkIHNlY3Rpb24gdG8gY29sbGFwc2VkXG4gICAgYWR2YW5jZWRWaXNpYmxlID0gZmFsc2U7XG4gICAgYWR2YW5jZWRTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gJ1Nob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDsnO1xuXG4gICAgcmVmcmVzaEVkaXREcm9wZG93bigpO1xuICAgIHJlZnJlc2hTdGFydEZyb20oKTtcblxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGlmICh1c2VyVGhlbWVzW3RoZW1lQmVmb3JlQnVpbGRlcl0pIHtcbiAgICAgIC8vIEFjdGl2ZSB0aGVtZSBpcyBhIHVzZXIgdGhlbWUgXHUyMDE0IG9wZW4gaXQgZm9yIGVkaXRpbmdcbiAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGxvYWRVc2VyVGhlbWVJbnRvUGlja2Vycyh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0U2VsZWN0LnZhbHVlID0gJyc7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHN0YXJ0U2VsZWN0LnZhbHVlID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgbG9hZFRoZW1lSW50b1BpY2tlcnModGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG5cbiAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IGVkaXRpbmdTbHVnID8gJycgOiAnbm9uZSc7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgdmFyIGN1c3RvbWl6ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1jdXN0b21pemUtYnRuJyk7XG4gIGlmIChjdXN0b21pemVCdG4pIHtcbiAgICBjdXN0b21pemVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IG9wZW5CdWlsZGVyKCk7IH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNhdmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItc2F2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb2xvcnMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIG5hbWUgPSBuYW1lSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdGhlbWUgbmFtZScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgICBuYW1lSW5wdXQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1ZztcbiAgICB2YXIgb2xkU2x1ZyA9IG51bGw7XG5cbiAgICBpZiAoZWRpdGluZ1NsdWcpIHtcbiAgICAgIHNsdWcgPSBlZGl0aW5nU2x1ZztcbiAgICAgIC8vIElmIG5hbWUgY2hhbmdlZCwgcmUtc2x1Z2lmeSBhbmQgcG90ZW50aWFsbHkgcmVuYW1lXG4gICAgICB2YXIgbmV3U2x1ZyA9IHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lKG5hbWUsIGVkaXRpbmdTbHVnKTtcbiAgICAgIGlmIChuZXdTbHVnICE9PSBlZGl0aW5nU2x1Zykge1xuICAgICAgICBvbGRTbHVnID0gZWRpdGluZ1NsdWc7XG4gICAgICAgIGRlbGV0ZSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICAgICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihlZGl0aW5nU2x1Zyk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBkZWxldGUgd2luZG93LlRIRU1FX0NPTE9SU1tlZGl0aW5nU2x1Z107XG4gICAgICAgIHNsdWcgPSBuZXdTbHVnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzbHVnID0gd2luZG93LnNsdWdpZnlUaGVtZU5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlbWUgZGF0YSB3aXRoIEFMTCBjb2xvciBwcm9wZXJ0aWVzXG4gICAgdmFyIHRoZW1lRGF0YSA9IHsgbmFtZTogbmFtZSB9O1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgdGhlbWVEYXRhLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoY29sb3JzW3BdKSB0aGVtZURhdGFbcF0gPSBjb2xvcnNbcF07XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIGNhY2hlIGltbWVkaWF0ZWx5IGZvciBpbnN0YW50IFVJXG4gICAgdXNlclRoZW1lc1tzbHVnXSA9IHRoZW1lRGF0YTtcbiAgICBzYWZlU2V0KHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KHVzZXJUaGVtZXMpKTtcblxuICAgIC8vIENsZWFyIGlubGluZSBwcmV2aWV3IHByb3BlcnRpZXNcbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICAvLyBSZS1pbmplY3QgQ1NTIGFuZCBhcHBseVxuICAgIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShzbHVnKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgdmFyIGFwaUNvbG9ycyA9IHt9O1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChjb2xvcnNbcF0pIGFwaUNvbG9yc1twXSA9IGNvbG9yc1twXTsgfSk7XG5cbiAgICAvLyBJZiBzbHVnIGNoYW5nZWQsIGRlbGV0ZSB0aGUgb2xkIG9uZSBmcm9tIHNlcnZlclxuICAgIGlmIChvbGRTbHVnKSB7XG4gICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIG9sZFNsdWcsIHsgbWV0aG9kOiAnREVMRVRFJyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgfVxuXG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBuYW1lLCBjb2xvcnM6IGFwaUNvbG9ycywgbGlnaHRCZzogbGlnaHRCZ0NoZWNrLmNoZWNrZWQgfSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQgbG9jYWxseSAoc2VydmVyIHN5bmMgZmFpbGVkKScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDYW5jZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB7XG4gICAgICB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIERlbGV0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1kZWxldGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSByZXR1cm47XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgbmFtZSA9IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddID8gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z10ubmFtZSA6IGVkaXRpbmdTbHVnO1xuXG4gICAgaWYgKCFjb25maXJtKCdEZWxldGUgXCInICsgbmFtZSArICdcIiB0aGVtZT8nKSkgcmV0dXJuO1xuXG4gICAgdmFyIHNsdWdUb0RlbGV0ZSA9IGVkaXRpbmdTbHVnO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseVxuICAgIGRlbGV0ZSB1c2VyVGhlbWVzW3NsdWdUb0RlbGV0ZV07XG4gICAgc2FmZVNldCh3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyVGhlbWVzKSk7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBydW50aW1lXG4gICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihzbHVnVG9EZWxldGUpO1xuICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgIGRlbGV0ZSB3aW5kb3cuVEhFTUVfQ09MT1JTW3NsdWdUb0RlbGV0ZV07XG5cbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgd2luZG93LmluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gICAgdmFyIGZhbGxiYWNrID0gdGhlbWVCZWZvcmVCdWlsZGVyICYmIHRoZW1lQmVmb3JlQnVpbGRlciAhPT0gc2x1Z1RvRGVsZXRlID8gdGhlbWVCZWZvcmVCdWlsZGVyIDogJ2RhcmsnO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKGZhbGxiYWNrKTtcblxuICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIERlbGV0ZSBmcm9tIHNlcnZlclxuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Z1RvRGVsZXRlLCB7IG1ldGhvZDogJ0RFTEVURScgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIGRlbGV0ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgZGVsZXRlZCBsb2NhbGx5IChzZXJ2ZXIgc3luYyBmYWlsZWQpJywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV4cG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leHBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIHRoZSB0aGVtZSBmaXJzdCwgdGhlbiBleHBvcnQnLCAnd2FybmluZycsIDMwMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICBpZiAoIXRoZW1lKSByZXR1cm47XG5cbiAgICB2YXIgZXhwb3J0RGF0YSA9IHtcbiAgICAgIF9kYXNoY2FkZHlfdGhlbWU6IHRydWUsXG4gICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydERhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNsdWc6IGVkaXRpbmdTbHVnLFxuICAgICAgbmFtZTogdGhlbWUubmFtZSxcbiAgICAgIGxpZ2h0Qmc6IHRoZW1lLmxpZ2h0QmcgfHwgZmFsc2UsXG4gICAgICBjb2xvcnM6IHt9XG4gICAgfTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHRoZW1lW3BdKSBleHBvcnREYXRhLmNvbG9yc1twXSA9IHRoZW1lW3BdO1xuICAgIH0pO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGVkaXRpbmdTbHVnICsgJy10aGVtZS5qc29uJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICBzaG93Tm90aWZpY2F0aW9uKCdUaGVtZSBleHBvcnRlZCBhcyAnICsgZWRpdGluZ1NsdWcgKyAnLXRoZW1lLmpzb24nLCAnc3VjY2VzcycsIDMwMDApO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW1wb3J0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWltcG9ydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5hY2NlcHQgPSAnLmpzb24nO1xuICAgIGlucHV0Lm9uY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShldi50YXJnZXQucmVzdWx0KTtcblxuICAgICAgICAgIC8vIFN1cHBvcnQgYm90aCB3cmFwcGVkIGZvcm1hdCBhbmQgcmF3IHRoZW1lIGZvcm1hdFxuICAgICAgICAgIHZhciB0aGVtZU5hbWUsIHRoZW1lQ29sb3JzLCB0aGVtZUxpZ2h0Qmc7XG4gICAgICAgICAgaWYgKGRhdGEuX2Rhc2hjYWRkeV90aGVtZSAmJiBkYXRhLmNvbG9ycykge1xuICAgICAgICAgICAgLy8gV3JhcHBlZCBleHBvcnQgZm9ybWF0XG4gICAgICAgICAgICB0aGVtZU5hbWUgPSBkYXRhLm5hbWUgfHwgJ0ltcG9ydGVkJztcbiAgICAgICAgICAgIHRoZW1lQ29sb3JzID0gZGF0YS5jb2xvcnM7XG4gICAgICAgICAgICB0aGVtZUxpZ2h0QmcgPSBkYXRhLmxpZ2h0QmcgfHwgZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm5hbWUgJiYgKGRhdGEuYmcgfHwgZGF0YVsnY2FyZC1iYXNlJ10pKSB7XG4gICAgICAgICAgICAvLyBSYXcgdGhlbWUgSlNPTiAoc2FtZSBmb3JtYXQgYXMgc2VydmVyIGZpbGVzKVxuICAgICAgICAgICAgdGhlbWVOYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgdGhlbWVDb2xvcnMgPSB7fTtcbiAgICAgICAgICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChkYXRhW3BdKSB0aGVtZUNvbG9yc1twXSA9IGRhdGFbcF07IH0pO1xuICAgICAgICAgICAgdGhlbWVMaWdodEJnID0gZGF0YS5saWdodEJnIHx8IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIERhc2hDYWRkeSB0aGVtZSBmaWxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTG9hZCBpbnRvIGJ1aWxkZXJcbiAgICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSB0aGVtZU5hbWU7XG4gICAgICAgICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lTGlnaHRCZztcbiAgICAgICAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9ICcnO1xuICAgICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG5cbiAgICAgICAgICAvLyBBcHBseSBjb2xvcnMgdG8gcGlja2Vyc1xuICAgICAgICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoZW1lQ29sb3JzW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICAgICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiB0aGVtZUNvbG9yc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZpbGwgYW55IG1pc3NpbmcgYWR2YW5jZWQgZmllbGRzXG4gICAgICAgICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgICAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICAgICAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcIicgKyB0aGVtZU5hbWUgKyAnXCIgbG9hZGVkIGludG8gYnVpbGRlci4gQ2xpY2sgU2F2ZSB0byBrZWVwIGl0LicsICdzdWNjZXNzJywgNTAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ltcG9ydCBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICB9O1xuICAgIGlucHV0LmNsaWNrKCk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNb2RhbCBjbG9zZSBoYW5kbGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB3aXJlTW9kYWwobW9kYWwpO1xuXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gTGljZW5zZSBNYW5hZ2VtZW50IFVJXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBsaWNlbnNlIG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2xpY2Vuc2UtbW9kYWwnLCBgPGRpdiBpZD1cImxpY2Vuc2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzPkRhc2hDYWRkeSBMaWNlbnNlPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBBY3RpdmF0ZSBhIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3RhdHVzLXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IHBhZGRpbmc6IDZweCAxNHB4OyBib3JkZXItcmFkaXVzOiAyMHB4OyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLXRleHRcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1kZXRhaWxzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGxpbmUtaGVpZ2h0OiAxLjY7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtYWN0aXZhdGUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5MaWNlbnNlIENvZGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJsaWNlbnNlLWNvZGUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkRDLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYXCJcbiAgICAgICAgICBtYXhsZW5ndGg9XCIzNVwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAxcHg7XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5FbnRlciB5b3VyIGxpY2Vuc2UgY29kZSB0byBhY3RpdmF0ZSBwcmVtaXVtIGZlYXR1cmVzPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWZlYXR1cmVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgZGlzcGxheTogYmxvY2s7XCI+UHJlbWl1bSBGZWF0dXJlczo8L2xhYmVsPlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1mZWF0dXJlLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMTUpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3VjY2Vzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xNSk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtZGVhY3RpdmF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWFjdGl2YXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWFjdGl2YXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+QWN0aXZhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLW1vZGFsJyk7XG4gIGNvbnN0IGNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWNvZGUtaW5wdXQnKTtcbiAgY29uc3QgYWN0aXZhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1hY3RpdmF0ZScpO1xuICBjb25zdCBkZWFjdGl2YXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZGVhY3RpdmF0ZScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZXJyb3InKTtcbiAgY29uc3Qgc3VjY2Vzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2Utc3VjY2VzcycpO1xuICBjb25zdCBiYWRnZUljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGJhZGdlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWJhZGdlLXRleHQnKTtcbiAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZScpO1xuICBjb25zdCBkZXRhaWxzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1kZXRhaWxzJyk7XG4gIGNvbnN0IGZlYXR1cmVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZmVhdHVyZS1saXN0Jyk7XG4gIGNvbnN0IGFjdGl2YXRlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWFjdGl2YXRlLXNlY3Rpb24nKTtcblxuICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBzdWNjZXNzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyU3RhdHVzKHN0YXR1cykge1xuICAgIGN1cnJlbnRTdGF0dXMgPSBzdGF0dXM7XG5cbiAgICBpZiAoc3RhdHVzLmFjdGl2ZSkge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDQ2LDIwNCwxMTMsMC4xNSknO1xuICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgIGJhZGdlSWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNjA1JztcbiAgICAgIGJhZGdlVGV4dC50ZXh0Q29udGVudCA9ICdQcmVtaXVtIEFjdGl2ZSc7XG4gICAgICBjb25zdCBleHBpcnlMaW5lID0gc3RhdHVzLmxpZmV0aW1lXG4gICAgICAgID8gJzxkaXY+TGljZW5zZTogPHN0cm9uZz5MSUZFVElNRTwvc3Ryb25nPjwvZGl2PidcbiAgICAgICAgOiBgPGRpdj5FeHBpcmVzOiA8c3Ryb25nPiR7bmV3IERhdGUoc3RhdHVzLmV4cGlyZXNBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9PC9zdHJvbmc+ICgke3N0YXR1cy5kYXlzUmVtYWluaW5nfSBkYXlzIHJlbWFpbmluZyk8L2Rpdj5gO1xuICAgICAgZGV0YWlsc0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdj5Db2RlOiA8Y29kZSBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtzdGF0dXMuY29kZSB8fCAnKioqJ308L2NvZGU+PC9kaXY+XG4gICAgICAgICR7ZXhwaXJ5TGluZX1cbiAgICAgIGA7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBkZWFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDE0OSwxNjUsMTY2LDAuMTUpJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBiYWRnZUljb24udGV4dENvbnRlbnQgPSAnXFx1MjYwNic7XG4gICAgICBiYWRnZVRleHQudGV4dENvbnRlbnQgPSBzdGF0dXMuZXhwaXJlZCA/ICdMaWNlbnNlIEV4cGlyZWQnIDogJ0ZyZWUgVGllcic7XG4gICAgICBkZXRhaWxzRWwuaW5uZXJIVE1MID0gc3RhdHVzLmV4cGlyZWRcbiAgICAgICAgPyAnPGRpdj5Zb3VyIGxpY2Vuc2UgaGFzIGV4cGlyZWQuIEVudGVyIGEgbmV3IGNvZGUgdG8gcmVuZXcuPC9kaXY+J1xuICAgICAgICA6ICc8ZGl2PkVudGVyIGEgbGljZW5zZSBjb2RlIHRvIHVubG9jayBwcmVtaXVtIGZlYXR1cmVzLjwvZGl2Pic7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBmZWF0dXJlIGxpc3RcbiAgICBjb25zdCBmZWF0dXJlcyA9IHN0YXR1cy5wcmVtaXVtRmVhdHVyZXMgfHwge307XG4gICAgY29uc3QgYWN0aXZlRmVhdHVyZXMgPSBuZXcgU2V0KHN0YXR1cy5mZWF0dXJlcyB8fCBbXSk7XG4gICAgZmVhdHVyZUxpc3QuaW5uZXJIVE1MID0gT2JqZWN0LmVudHJpZXMoZmVhdHVyZXMpLm1hcCgoW2tleSwgaW5mb10pID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZUZlYXR1cmVzLmhhcyhrZXkpO1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7YWN0aXZlID8gJ1xcdTI3MDUnIDogJ1xcdUQ4M0RcXHVERDEyJ308L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7aW5mby5uYW1lfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtpbmZvLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmVuZGVyU3RhdHVzKGRhdGEubGljZW5zZSk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKGRhdGEubGljZW5zZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBsaWNlbnNlIHN0YXR1czonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlTGljZW5zZSgpIHtcbiAgICBjb25zdCBjb2RlID0gY29kZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHNob3dFcnJvcignUGxlYXNlIGVudGVyIGEgbGljZW5zZSBjb2RlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9hY3RpdmF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dTdWNjZXNzKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGNvZGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICByZW5kZXJTdGF0dXMoZGF0YS5saWNlbnNlKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTGljZW5zZSBhY3RpdmF0ZWQhIFByZW1pdW0gZmVhdHVyZXMgdW5sb2NrZWQuJywgJ3N1Y2Nlc3MnLCA1MDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoZGF0YS5saWNlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdBY3RpdmF0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0ZSc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVhY3RpdmF0ZUxpY2Vuc2UoKSB7XG4gICAgaWYgKCFjb25maXJtKCdEZWFjdGl2YXRlIHlvdXIgbGljZW5zZT8gWW91IGNhbiByZXVzZSB0aGUgY29kZSBvbiBhbm90aGVyIG1hY2hpbmUuJykpIHJldHVybjtcblxuICAgIGRlYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRlYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnRGVhY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9kZWFjdGl2YXRlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93U3VjY2VzcyhkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBhd2FpdCBsb2FkU3RhdHVzKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0xpY2Vuc2UgZGVhY3RpdmF0ZWQuJywgJ2luZm8nLCAzMDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoeyBhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0RlYWN0aXZhdGlvbiBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0RlYWN0aXZhdGUnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlckJhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IHRvcGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgICBjb25zdCBpY29uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItaWNvbicpO1xuICAgIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci10ZXh0Jyk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLXRpbWUnKTtcbiAgICBpZiAoIXRvcGJhcikgcmV0dXJuO1xuXG4gICAgdG9wYmFyLmNsYXNzTmFtZSA9ICdsaWNlbnNlLXN0YXR1cy10b3BiYXIgJyArIChzdGF0dXMuYWN0aXZlID8gJ3ByZW1pdW0nIDogJ2ZyZWUnKTtcblxuICAgIGlmIChzdGF0dXMuYWN0aXZlKSB7XG4gICAgICBpY29uRWwudGV4dENvbnRlbnQgPSAnXFx1MjYwNSc7XG4gICAgICB0ZXh0RWwudGV4dENvbnRlbnQgPSAnUFJFTUlVTSc7XG4gICAgICBpZiAoc3RhdHVzLmxpZmV0aW1lKSB7XG4gICAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9ICdcXHUwMGI3IExJRkVUSU1FJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRheXMgPSBzdGF0dXMuZGF5c1JlbWFpbmluZztcbiAgICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gZGF5cyAhPSBudWxsID8gJ1xcdTAwYjcgJyArIGRheXMgKyAnZCByZW1haW5pbmcnIDogJyc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25FbC50ZXh0Q29udGVudCA9ICdcXHUyNjA2JztcbiAgICAgIHRleHRFbC50ZXh0Q29udGVudCA9IHN0YXR1cy5leHBpcmVkID8gJ0VYUElSRUQnIDogJ0ZSRUUgVElFUic7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTGljZW5zZU1vZGFsKCkge1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGxvYWRTdGF0dXMoKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICAvLyBGb3JtYXQgY29kZSBpbnB1dCBhcyB1c2VyIHR5cGVzIChhdXRvLWFkZCBkYXNoZXMpXG4gIGNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkge1xuICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvW15BLVowLTktXS9nLCAnJyk7XG4gICAgLy8gRG9uJ3QgYXV0by1mb3JtYXQgaWYgdXNlciBpcyBkZWxldGluZ1xuICAgIGlmICh2YWwubGVuZ3RoID4gdGhpcy5fcHJldkxlbmd0aCkge1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLy0vZywgJycpO1xuICAgICAgaWYgKHZhbC5sZW5ndGggPiAyICYmICF2YWwuc3RhcnRzV2l0aCgnREMnKSkge1xuICAgICAgICB2YWwgPSAnREMnICsgdmFsO1xuICAgICAgfVxuICAgICAgLy8gQWRkIGRhc2hlcyBhZnRlciBEQyBhbmQgZXZlcnkgNSBjaGFyc1xuICAgICAgaWYgKHZhbC5zdGFydHNXaXRoKCdEQycpICYmIHZhbC5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gWydEQyddO1xuICAgICAgICBjb25zdCByZXN0ID0gdmFsLnN1YnN0cmluZygyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSA1KSB7XG4gICAgICAgICAgcGFydHMucHVzaChyZXN0LnN1YnN0cmluZyhpLCBpICsgNSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhbCA9IHBhcnRzLmpvaW4oJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcHJldkxlbmd0aCA9IHZhbC5sZW5ndGg7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfSk7XG5cbiAgLy8gV2lyZSB1cCBldmVudHNcbiAgYWN0aXZhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhY3RpdmF0ZUxpY2Vuc2UpO1xuICBkZWFjdGl2YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVhY3RpdmF0ZUxpY2Vuc2UpO1xuICBjb2RlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBhY3RpdmF0ZUxpY2Vuc2UoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtY2FuY2VsJykpO1xuICBjb25zdCB0b3BiYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsICYmIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCkpO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsID0gb3BlbkxpY2Vuc2VNb2RhbDtcblxuICAvLyBFeHBvc2UgZmVhdHVyZSBjaGVjayBmb3IgZnJvbnRlbmQgZ2F0aW5nXG4gIHdpbmRvdy5jaGVja1ByZW1pdW1GZWF0dXJlID0gYXN5bmMgZnVuY3Rpb24oZmVhdHVyZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvbGljZW5zZS9mZWF0dXJlLyR7ZmVhdHVyZX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gTG9hZCBzdGF0dXMgb24gcGFnZSBsb2FkXG4gIGxvYWRTdGF0dXMoKS50aGVuKHN0YXR1cyA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGF0dXMpIHVwZGF0ZUhlYWRlckJhZGdlKGN1cnJlbnRTdGF0dXMpO1xuICB9KTtcbn0pKCk7XG47XG4vLyBTaGFyZSBNb2RhbCBcdTIwMTQgREMtMDU4XG4vL1xuLy8gQWRtaW4gVUkgZm9yIERDLTA1MyBzaGFyZSByb3V0ZXMuIE9wZW5lZCBmcm9tIHRoZSBcIlNoYXJlXCIgYnV0dG9uIG9uIGVhY2hcbi8vIHNlcnZpY2UgY2FyZCAoYWRkZWQgaW4gY29yZS9ncmlkLmpzIG5leHQgdG8gdGhlIGV4aXN0aW5nIG9wdGlvbnMvZGVsZXRlXG4vLyBidXR0b25zKS4gVHdvIHRhYnM6XG4vLyAgIC0gUHVibGljIGxpbms6IHBpY2sgYSBUVEwgKDFoLzI0aC83ZCksIFBPU1QgL2FwaS92MS9zaGFyZSwgcmVuZGVyIHRoZVxuLy8gICAgIHJldHVybmVkIHVybFBhdGggd2l0aCBhIGNvcHkgYnV0dG9uICsgcmV2b2tlIGNvbnRyb2wuXG4vLyAgIC0gVGFpbHNjYWxlIGludml0ZTogZW50ZXIgYW4gZW1haWwsIFBPU1QgL2FwaS92MS9zaGFyZS90YWlsc2NhbGUsIHJlbmRlclxuLy8gICAgIGRlbGl2ZXJlZCBzdGF0dXMgKGluYm94IHZzIGRldi1jb25zb2xlIGZhbGxiYWNrIHZzIFVSTCBmYWxsYmFjaykuXG4vL1xuLy8gTW9kYWwgYWxzbyBsaXN0cyBvdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlIChHRVQgL2FwaS92MS9zaGFyZSlcbi8vIHdpdGggcmV2b2tlIGJ1dHRvbnMuIFRoZSBsaXN0IHJlZnJlc2hlcyBhZnRlciBldmVyeSBpc3N1ZS9yZXZva2UuXG4vL1xuLy8gQm90aCBpc3N1ZSBlbmRwb2ludHMgYXJlIFByby1nYXRlZCBvbiB0aGUgc2VydmVyIFx1MjAxNCB0aGUgbW9kYWwgc3VyZmFjZXMgYSA0MDJcbi8vIGFzIGFuIHVwZ3JhZGUgcHJvbXB0IChcIlNoYXJlIGlzIGEgUHJvIGZlYXR1cmUuIEFjdGl2YXRlIGEgbGljZW5zZSB0byB1bmxvY2suXCIpLlxuLy8gVGFpbHNjYWxlIGludml0ZXMgYWRkaXRpb25hbGx5IHJlcXVpcmUgdGFpbHNjYWxlQ29vcmQgY29uZmlndXJlZCBvbiB0aGUgaG9zdDtcbi8vIHRoZSBzZXJ2ZXIgcmV0dXJucyA0MDAgd2l0aCBhIGNsZWFyIG1lc3NhZ2Ugd2hlbiBtaXNzaW5nLlxuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAod2luZG93Ll9fZGNfMDU4X3NoYXJlX21vZGFsX2xvYWRlZCkgcmV0dXJuO1xuICB3aW5kb3cuX19kY18wNThfc2hhcmVfbW9kYWxfbG9hZGVkID0gdHJ1ZTtcblxuICBjb25zdCBUVExfT1BUSU9OUyA9IFtcbiAgICB7IG1zOiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcxIGhvdXInIH0sXG4gICAgeyBtczogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcyNCBob3VycycgfSxcbiAgICB7IG1zOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICc3IGRheXMnIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ3NoYXJlLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJzaGFyZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzaGFyZS1tb2RhbC10aXRsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0NjBweDsgbWF4LXdpZHRoOiA1ODBweDtcIj5cbiAgICAgICAgPGgzIGlkPVwic2hhcmUtbW9kYWwtdGl0bGVcIj5TaGFyZSA8c3BhbiBpZD1cInNoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZVwiPlx1MjAyNjwvc3Bhbj48L2gzPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgICBDcmVhdGUgYSBwdWJsaWMgbGluayBvciBUYWlsc2NhbGUgaW52aXRlIHNvIHNvbWVvbmUgb3V0c2lkZSB5b3VyIG5ldHdvcmsgY2FuIGFjY2VzcyB0aGlzIHNlcnZpY2UuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFic1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJwdWJsaWNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWFjY2VudCk7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBQdWJsaWMgbGlua1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWJcIiBkYXRhLXRhYj1cInRhaWxzY2FsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAwOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBUYWlsc2NhbGUgaW52aXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWItcGFuZWxcIiBkYXRhLXBhbmVsPVwicHVibGljXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtcHVibGljLXR0bFwiPkxpbmsgZHVyYXRpb246PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2hhcmUtcHVibGljLXR0bFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgJHtUVExfT1BUSU9OUy5tYXAobyA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7by5tc31cIj4ke28ubGFiZWx9PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXB1YmxpYy1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgQ3JlYXRlIHNoYXJlIGxpbmtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYi1wYW5lbFwiIGRhdGEtcGFuZWw9XCJ0YWlsc2NhbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtdHMtZW1haWxcIj5SZWNpcGllbnQgZW1haWw6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJzaGFyZS10cy1lbWFpbFwiIHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiYWxpY2VAZXhhbXBsZS5jb21cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBBIHNpbmdsZS11c2UgVGFpbHNjYWxlIHByZS1hdXRoIGtleSBpcyBnZW5lcmF0ZWQgYW5kIGVtYWlsZWQuIFRoZSBkZXZpY2Ugam9pbnMgeW91ciB0YWlsbmV0IGFuZCBpcyByb3V0ZWQgdG8gdGhpcyBzZXJ2aWNlIHZpYSBDYWRkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXRzLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6ICMwNDE0MWY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBDcmVhdGUgVGFpbHNjYWxlIGludml0ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlNoYXJlIGxpbms6PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtaXNzdWVkLXVybFwiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHlcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWlzc3VlZC1jb3B5XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICBDb3B5XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkLW1ldGFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA4cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjE1KTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLXN1Y2Nlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMTUpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLW91dHN0YW5kaW5nXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPk91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtb3V0c3RhbmRpbmctbGlzdFwiIHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWNhbmNlbFwiIHR5cGU9XCJidXR0b25cIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1tb2RhbCcpO1xuICBjb25zdCBzZXJ2aWNlTmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZScpO1xuICBjb25zdCBpc3N1ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQnKTtcbiAgY29uc3QgaXNzdWVkVXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLXVybCcpO1xuICBjb25zdCBpc3N1ZWRDb3B5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC1jb3B5Jyk7XG4gIGNvbnN0IGlzc3VlZE1ldGFFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtbWV0YScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWVycm9yJyk7XG4gIGNvbnN0IHN1Y2Nlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1zdWNjZXNzJyk7XG4gIGNvbnN0IG91dHN0YW5kaW5nTGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW91dHN0YW5kaW5nLWxpc3QnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWNhbmNlbCcpO1xuICBjb25zdCBwdWJsaWNDcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtcHVibGljLWNyZWF0ZScpO1xuICBjb25zdCB0c0NyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS10cy1jcmVhdGUnKTtcbiAgY29uc3QgdHNFbWFpbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXRzLWVtYWlsJyk7XG4gIGNvbnN0IHB1YmxpY1R0bFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1wdWJsaWMtdHRsJyk7XG5cbiAgbGV0IGN1cnJlbnRTZXJ2aWNlID0gbnVsbDsgLy8geyBpZCwgbmFtZSB9XG4gIGxldCBhY3RpdmVUYWIgPSAncHVibGljJztcblxuICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9vcmlnaW5Gcm9tUGFnZSgpIHtcbiAgICAvLyBCdWlsZCB0aGUgYWJzb2x1dGUgc2hhcmUgVVJMIGZyb20gdGhlIHBhZ2UncyBjdXJyZW50IG9yaWdpbiBzbyB0aGVcbiAgICAvLyBsaW5rIGlzIGNvcnJlY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1c2VyIGlzIG9uIGh0dHA6Ly9sb2NhbGhvc3RcbiAgICAvLyAoZGV2KSBvciBodHRwczovL3N0YXR1cy5zYW1pIChwcm9kKS4gVGhlIHVybFBhdGggcmV0dXJuZWQgYnkgdGhlIEFQSVxuICAgIC8vIGlzIGEgcGF0aC1vbmx5IHN0cmluZyBzdGFydGluZyB3aXRoIC9zaGFyZS8uXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gIH1cblxuICBmdW5jdGlvbiBfYWJzVXJsKHVybFBhdGgpIHtcbiAgICBpZiAodXJsUGF0aC5zdGFydHNXaXRoKCdodHRwJykpIHJldHVybiB1cmxQYXRoO1xuICAgIHJldHVybiBfb3JpZ2luRnJvbVBhZ2UoKSArIHVybFBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBfZm9ybWF0RXhwaXJ5KGlzbykge1xuICAgIGlmICghaXNvKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7XG4gICAgaWYgKE51bWJlci5pc05hTihkLmdldFRpbWUoKSkpIHJldHVybiAnJztcbiAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Zvcm1hdFJlbWFpbmluZyhtcykge1xuICAgIGlmIChtcyA8PSAwKSByZXR1cm4gJ2V4cGlyZWQnO1xuICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKG1zIC8gMzYwMDAwMCk7XG4gICAgaWYgKGggPj0gMjQpIHJldHVybiBgJHtNYXRoLmZsb29yKGggLyAyNCl9ZCAke2ggJSAyNH1oIGxlZnRgO1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChtcyAlIDM2MDAwMDApIC8gNjAwMDApO1xuICAgIHJldHVybiBgJHtofWggJHttfW0gbGVmdGA7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBY3RpdmVUYWIobmFtZSkge1xuICAgIGFjdGl2ZVRhYiA9IG5hbWU7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYnRuLmRhdGFzZXQudGFiID09PSBuYW1lO1xuICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcbiAgICAgIGJ0bi5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWFjY2VudCknIDogJ3RyYW5zcGFyZW50JztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWZnKScgOiAndmFyKC0tbXV0ZWQpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gaXNBY3RpdmUgPyAnNjAwJyA6ICc0MDAnO1xuICAgIH0pO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWItcGFuZWwnKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gcC5kYXRhc2V0LnBhbmVsID09PSBuYW1lID8gJycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkT3V0c3RhbmRpbmcoKSB7XG4gICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nXHUyMDI2PC9zcGFuPic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZScsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBzaGFyZXMgbGlzdGVkLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjb25zdCBsaXN0ID0gKGJvZHkgJiYgYm9keS5kYXRhKSB8fCBbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gbGlzdC5maWx0ZXIocyA9PiBzLnNlcnZpY2VJZCA9PT0gY3VycmVudFNlcnZpY2UuaWQpO1xuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIG91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSBmaWx0ZXJlZC5tYXAocyA9PiB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHMuZXhwaXJlc0F0ID8gX2Zvcm1hdFJlbWFpbmluZyhuZXcgRGF0ZShzLmV4cGlyZXNBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgOiAnJztcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtcm93XCIgZGF0YS1zaGFyZS1pZD1cIiR7ZXNjYXBlSHRtbChzLmlkKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDA7IGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz4ke3Mua2luZCA9PT0gJ3RhaWxzY2FsZScgPyAnVGFpbHNjYWxlJyA6ICdQdWJsaWMnfTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+IFx1MDBCNyBleHBpcmVzICR7ZXNjYXBlSHRtbChfZm9ybWF0RXhwaXJ5KHMuZXhwaXJlc0F0KSl9ICgke3JlbWFpbmluZ30pPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNoYXJlLXJldm9rZVwiIGRhdGEtc2hhcmUtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICBSZXZva2VcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSkuam9pbignJyk7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtcmV2b2tlJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiByZXZva2VTaGFyZShidG4uZGF0YXNldC5zaGFyZUlkKSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBsb2FkIG91dHN0YW5kaW5nIHNoYXJlcy48L3NwYW4+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXZva2VTaGFyZShpZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2hhcmUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICAgIHNob3dFcnJvcihib2R5ICYmIGJvZHkuZXJyb3IgfHwgYFJldm9rZSBmYWlsZWQgKEhUVFAgJHtyZXNwLnN0YXR1c30pLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VjY2VzcygnU2hhcmUgcmV2b2tlZC4nKTtcbiAgICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvciB3aGlsZSByZXZva2luZy4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBpc3N1ZVB1YmxpYygpIHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgcHVibGljQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudDtcbiAgICBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSAnQ3JlYXRpbmdcdTIwMjYnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0dGxNcyA9IHBhcnNlSW50KHB1YmxpY1R0bFNlbGVjdC52YWx1ZSwgMTApO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQsIHR0bE1zIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkuc3VjY2Vzcykge1xuICAgICAgICBfcmVuZGVyQXBpRXJyb3IocmVzcC5zdGF0dXMsIGJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxQYXRoID0gYm9keS5kYXRhLnVybFBhdGg7XG4gICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9IF9hYnNVcmwodXJsUGF0aCk7XG4gICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgUHVibGljIGxpbmsgXHUwMEI3IGV4cGlyZXMgJHtfZm9ybWF0RXhwaXJ5KGJvZHkuZGF0YS5leHBpcmVzQXQpfWA7XG4gICAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHNob3dTdWNjZXNzKCdTaGFyZSBsaW5rIGNyZWF0ZWQuJyk7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgc2hhcmUuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHB1YmxpY0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaXNzdWVUYWlsc2NhbGUoKSB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVtYWlsID0gKHRzRW1haWxJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIHNob3dFcnJvcignQSB2YWxpZCByZWNpcGllbnQgZW1haWwgaXMgcmVxdWlyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHRzQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRzQ3JlYXRlQnRuLnRleHRDb250ZW50O1xuICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nXHUyMDI2JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlL3RhaWxzY2FsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkLCBlbWFpbCB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFyZXNwLm9rIHx8ICFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgX3JlbmRlckFwaUVycm9yKHJlc3Auc3RhdHVzLCBib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGFpbHNjYWxlIHNoYXJlcyBzaG93IHRoZSByYXcgdXJsUGF0aCAod2hpY2ggaXMgdGhlIHNoYXJlIFVSTCkgaWZcbiAgICAgIC8vIGVtYWlsIGRlbGl2ZXJ5IGZhaWxlZC4gVGhlIHNoYXJlIGl0c2VsZiBpcyBvbmUtc2hvdCBzbyB0aGUgYWRtaW5cbiAgICAgIC8vIGNhbiBtYW51YWxseSBwYXN0ZSB0aGUgbGluayBpbnRvIGEgY2hhdCBpZiBTTVRQIGZhaWxlZC5cbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gYm9keS5kYXRhICYmIGJvZHkuZGF0YS51cmxQYXRoO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gX2Fic1VybChmYWxsYmFjayk7XG4gICAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgaW52aXRlIFx1MDBCNyBlbWFpbGVkIHRvICR7ZW1haWx9IChvciB1c2UgdGhpcyBVUkwgbWFudWFsbHkgaWYgZGVsaXZlcnkgZmFpbGVkKS5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSBpbnZpdGUgc2VudCB0byAke2VtYWlsfS5gO1xuICAgICAgfVxuICAgICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBzaG93U3VjY2VzcygnVGFpbHNjYWxlIGludml0ZSBjcmVhdGVkLicpO1xuICAgICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgVGFpbHNjYWxlIGludml0ZS4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHNDcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckFwaUVycm9yKHN0YXR1cywgYm9keSkge1xuICAgIGNvbnN0IGVyciA9IChib2R5ICYmIGJvZHkuZXJyb3IpIHx8ICcnO1xuICAgIGlmIChzdGF0dXMgPT09IDQwMikge1xuICAgICAgc2hvd0Vycm9yKCdTaGFyZSBpcyBhIFBybyBmZWF0dXJlLiBBY3RpdmF0ZSBhIGxpY2Vuc2UgdG8gdW5sb2NrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDAgJiYgL3RhaWxzY2FsZS9pLnRlc3QoZXJyKSkge1xuICAgICAgc2hvd0Vycm9yKCdUYWlsc2NhbGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBob3N0LiBTZXQgdXAgVGFpbHNjYWxlIGluIHRoZSBkYXNoYm9hcmQgZmlyc3QuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgc2hvd0Vycm9yKCdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBzaGFyZSBzZXJ2aWNlcy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBzaG93RXJyb3IoJ1NlcnZpY2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNob3dFcnJvcihlcnIgfHwgYFJlcXVlc3QgZmFpbGVkIChIVFRQICR7c3RhdHVzfSkuYCk7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuU2hhcmVNb2RhbChzZXJ2aWNlKSB7XG4gICAgaWYgKCFzZXJ2aWNlIHx8ICFzZXJ2aWNlLmlkKSByZXR1cm47XG4gICAgY3VycmVudFNlcnZpY2UgPSB7IGlkOiBzZXJ2aWNlLmlkLCBuYW1lOiBzZXJ2aWNlLm5hbWUgfHwgc2VydmljZS5pZCB9O1xuICAgIHNlcnZpY2VOYW1lRWwudGV4dENvbnRlbnQgPSBjdXJyZW50U2VydmljZS5uYW1lO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHNldEFjdGl2ZVRhYigncHVibGljJyk7XG4gICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgcHVibGljVHRsU2VsZWN0LnZhbHVlID0gU3RyaW5nKFRUTF9PUFRJT05TWzFdLm1zKTsgLy8gMjRoIGRlZmF1bHRcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gIH1cblxuICAvLyBXaXJlIGV2ZW50c1xuICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldEFjdGl2ZVRhYihidG4uZGF0YXNldC50YWIpKTtcbiAgfSk7XG4gIHB1YmxpY0NyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGlzc3VlUHVibGljKTtcbiAgdHNDcmVhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpc3N1ZVRhaWxzY2FsZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBDb3B5LXRvLWNsaXBib2FyZCBmb3IgdGhlIGlzc3VlZCBzaGFyZSBVUkxcbiAgaXNzdWVkQ29weUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cmwgPSBpc3N1ZWRVcmxJbnB1dC52YWx1ZTtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzIC8gdW5zYWZlIGNvbnRleHRzXG4gICAgICAgIGlzc3VlZFVybElucHV0LnNlbGVjdCgpO1xuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50O1xuICAgICAgaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7IH0sIDEyMDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkLiBTZWxlY3QgdGhlIFVSTCBtYW51YWxseS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuU2hhcmVNb2RhbCA9IG9wZW5TaGFyZU1vZGFsO1xufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVcsQ0FFVixZQUFZLGFBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQW9ONUIsRUFFUCxNQUFNSSxFQUFRLFNBQVMsZUFBZSxxQkFBcUIsRUFDckR1VCxFQUFVLFNBQVMsZUFBZSxzQkFBc0IsRUFDeEQ2RCxFQUFVLFNBQVMsZUFBZSxvQkFBb0IsRUFDdEQzTyxFQUFZLFNBQVMsZUFBZSxzQkFBc0IsRUFHaEUsQ0FBQyxVQUFXLFdBQVksT0FBUSxPQUFPLEVBQUUsUUFBUTRPLEdBQVksQ0FDM0QsTUFBTUMsRUFBVyxTQUFTLGVBQWUsR0FBR0QsQ0FBUSxVQUFVLEVBQ3hEbFosRUFBUyxTQUFTLGVBQWUsR0FBR2taLENBQVEsU0FBUyxFQUUzREMsR0FBVSxpQkFBaUIsU0FBVSxJQUFNLENBQ3pDblosRUFBTyxNQUFNLFFBQVVtWixFQUFTLFFBQVUsUUFBVSxNQUN0RCxDQUFDLENBQ0gsQ0FBQyxFQUdELE1BQU1DLEVBQXFCLFNBQVMsZUFBZSxzQkFBc0IsRUFDbkVDLEVBQW9CLFNBQVMsZUFBZSxxQkFBcUIsRUFDdkVELEdBQW9CLGlCQUFpQixTQUFVLElBQU0sQ0FDbkRDLEVBQWtCLE1BQU0sUUFBVUQsRUFBbUIsUUFBVSxJQUFNLEtBQ3ZFLENBQUMsRUFHRCxlQUFlRSxHQUF5QixDQUN0QyxHQUFJLENBRUYsTUFBTTNjLEVBQU8sTUFESSxNQUFNLE1BQU0sOEJBQThCLEdBQy9CLEtBQUssRUFFakMsR0FBSUEsRUFBSyxRQUFTLENBQ2hCLE1BQU1xRCxFQUFTckQsRUFBSyxPQUdwQixTQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBVXFELEVBQU8sUUFHbEUsU0FBUyxlQUFlLGlCQUFpQixFQUFFLFFBQVVBLEVBQU8sV0FBVyxTQUFTLFNBQVcsR0FDM0YsU0FBUyxlQUFlLGtCQUFrQixFQUFFLFFBQVVBLEVBQU8sV0FBVyxVQUFVLFNBQVcsR0FDN0YsU0FBUyxlQUFlLGNBQWMsRUFBRSxRQUFVQSxFQUFPLFdBQVcsTUFBTSxTQUFXLEdBQ3JGLFNBQVMsZUFBZSxlQUFlLEVBQUUsUUFBVUEsRUFBTyxXQUFXLE9BQU8sU0FBVyxHQUd2RixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxRQUFVQSxFQUFPLFdBQVcsU0FBUyxRQUFVLFFBQVUsT0FDekcsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE1BQU0sUUFBVUEsRUFBTyxXQUFXLFVBQVUsUUFBVSxRQUFVLE9BQzNHLFNBQVMsZUFBZSxhQUFhLEVBQUUsTUFBTSxRQUFVQSxFQUFPLFdBQVcsTUFBTSxRQUFVLFFBQVUsT0FDbkcsU0FBUyxlQUFlLGNBQWMsRUFBRSxNQUFNLFFBQVVBLEVBQU8sV0FBVyxPQUFPLFFBQVUsUUFBVSxPQUdqR0EsRUFBTyxXQUFXLE1BQU0sWUFDMUIsU0FBUyxlQUFlLGFBQWEsRUFBRSxNQUFRQSxFQUFPLFVBQVUsS0FBSyxXQU9uRUEsRUFBTyxXQUFXLE9BQU8sT0FBTSxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQVFBLEVBQU8sVUFBVSxNQUFNLE1BQ3BHQSxFQUFPLFdBQVcsT0FBTyxPQUFNLFNBQVMsZUFBZSxZQUFZLEVBQUUsTUFBUUEsRUFBTyxVQUFVLE1BQU0sTUFDcEdBLEVBQU8sV0FBVyxPQUFPLEtBQUksU0FBUyxlQUFlLFVBQVUsRUFBRSxNQUFRQSxFQUFPLFVBQVUsTUFBTSxJQUNoR0EsRUFBTyxXQUFXLE9BQU8sT0FBTSxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQVFBLEVBQU8sVUFBVSxNQUFNLE1BQ3BHQSxFQUFPLFdBQVcsT0FBTyxTQUFXLFNBQVcsU0FBUyxlQUFlLGNBQWMsRUFBRSxRQUFVQSxFQUFPLFVBQVUsTUFBTSxTQUFXLElBQ25JQSxFQUFPLFdBQVcsT0FBTyxXQUFVLFNBQVMsZUFBZSxZQUFZLEVBQUUsTUFBUUEsRUFBTyxVQUFVLE1BQU0sVUFDNUcsTUFBTXVaLEVBQWMsU0FBUyxlQUFlLFlBQVksRUFDcER2WixFQUFPLFdBQVcsT0FBTyxhQUMzQnVaLEVBQVksTUFBUSxHQUNwQkEsRUFBWSxZQUFjLG9DQUUxQkEsRUFBWSxZQUFjLGVBSTVCLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFVdlosRUFBTyxhQUFhLFNBQVcsR0FDckZBLEVBQU8sYUFBYSxrQkFDdEIsU0FBUyxlQUFlLHVCQUF1QixFQUFFLE1BQVFBLEVBQU8sWUFBWSxpQkFFMUVBLEVBQU8sYUFBYSxZQUN0QixTQUFTLGVBQWUscUJBQXFCLEVBQUUsWUFDN0MsZUFBZSxJQUFJLEtBQUtBLEVBQU8sWUFBWSxTQUFTLEVBQUUsZUFBZSxDQUFDLElBTTFFLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFVQSxFQUFPLFNBQVMsZ0JBQWdCLElBQU0sR0FDaEcsU0FBUyxlQUFlLG9CQUFvQixFQUFFLFFBQVVBLEVBQU8sU0FBUyxjQUFjLElBQU0sR0FDNUYsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVVBLEVBQU8sU0FBUyxnQkFBZ0IsSUFBTSxHQUNoRyxTQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFBVUEsRUFBTyxTQUFTLGVBQWUsSUFBTSxHQUM5RixTQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBVUEsRUFBTyxTQUFTLGlCQUFpQixJQUFNLEdBQ2xHLFNBQVMsZUFBZSx1QkFBdUIsRUFBRSxRQUFVQSxFQUFPLFNBQVMsaUJBQWlCLElBQU0sR0FDbEcsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVVBLEVBQU8sU0FBUyxnQkFBZ0IsSUFBTSxHQUNoRyxTQUFTLGVBQWUsMEJBQTBCLEVBQUUsUUFBVUEsRUFBTyxTQUFTLG9CQUFvQixJQUFNLEdBQ3hHLFNBQVMsZUFBZSxzQkFBc0IsRUFBRSxRQUFVQSxFQUFPLFNBQVMsZ0JBQWdCLElBQU0sR0FDaEcsU0FBUyxlQUFlLGdCQUFnQixFQUFFLFFBQVVBLEVBQU8sUUFBUyxXQUFnQixHQUNwRixTQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFBVUEsRUFBTyxTQUFTLGlCQUFpQixJQUFNLEdBQ2xHLFNBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUFVQSxFQUFPLFNBQVMsZUFBZSxJQUFNLEdBQzlGLFNBQVMsZUFBZSx3QkFBd0IsRUFBRSxRQUFVQSxFQUFPLFNBQVMsa0JBQWtCLElBQU0sR0FDcEcsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQVVBLEVBQU8sUUFBUyxRQUFhLEVBQ3pGLENBQ0YsT0FBUzVDLEVBQU8sQ0FDZHFFLEVBQWEsU0FBUyw4QkFBK0JyRSxFQUFPLENBQUUsU0FBVSxZQUFhLENBQUMsQ0FDeEYsQ0FDRixDQUdBLGVBQWVvYyxHQUEwQixDQUN2QyxHQUFJLENBRUYsTUFBTTdjLEVBQU8sTUFESSxNQUFNLE1BQU0sd0NBQXdDLEdBQ3pDLEtBQUssRUFFM0IySCxFQUFZLFNBQVMsZUFBZSxzQkFBc0IsRUFDNUQzSCxFQUFLLFNBQVdBLEVBQUssU0FBUyxPQUFTLEVBQ3pDMkgsRUFBVSxVQUFZM0gsRUFBSyxRQUFRLElBQUltTixHQUFRLENBQzdDLE1BQU0yUCxFQUFPLElBQUksS0FBSzNQLEVBQUssU0FBUyxFQUFFLGVBQWUsRUFPckQsTUFBTztBQUFBO0FBQUEsb0NBTlksQ0FDakIsUUFBUyxlQUNULE1BQU8sZ0JBQ1AsUUFBUyxVQUNULEtBQU0sZUFDUixFQUdxQ0EsRUFBSyxJQUFJLEdBQUssY0FBYyxLQUFLQSxFQUFLLE9BQVMsVUFBWSxTQUFNQSxFQUFLLE9BQVMsUUFBVSxTQUFNLFFBQUc7QUFBQTtBQUFBLGlIQUVoQyxXQUFXQSxFQUFLLEtBQUssQ0FBQztBQUFBLHVFQUNoRTJQLENBQUk7QUFBQTtBQUFBO0FBQUEsV0FJbkUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUVWblYsRUFBVSxVQUFZLGlHQUUxQixPQUFTbEgsRUFBTyxDQUNkcUUsRUFBYSxTQUFTLCtCQUFnQ3JFLEVBQU8sQ0FBRSxTQUFVLGFBQWMsQ0FBQyxDQUMxRixDQUNGLENBR0EsZUFBZXNjLEdBQXlCLENBQ3RDLEdBQUksQ0FDRixNQUFNMVosRUFBUyxDQUNiLFFBQVMsU0FBUyxlQUFlLHVCQUF1QixFQUFFLFFBQzFELFVBQVcsQ0FDVCxRQUFTLENBQ1AsUUFBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsUUFDcEQsV0FBWSxTQUFTLGVBQWUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLENBQ3BFLEVBQ0EsU0FBVSxDQUNSLFFBQVMsU0FBUyxlQUFlLGtCQUFrQixFQUFFLFFBQ3JELFNBQVUsU0FBUyxlQUFlLG9CQUFvQixFQUFFLE1BQU0sS0FBSyxFQUNuRSxPQUFRLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxNQUFNLEtBQUssQ0FDakUsRUFDQSxLQUFNLENBQ0osUUFBUyxTQUFTLGVBQWUsY0FBYyxFQUFFLFFBQ2pELFVBQVcsU0FBUyxlQUFlLGFBQWEsRUFBRSxNQUFNLEtBQUssR0FBSyxrQkFDbEUsTUFBTyxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQU0sS0FBSyxDQUMxRCxFQUNBLE1BQU8sQ0FDTCxRQUFTLFNBQVMsZUFBZSxlQUFlLEVBQUUsUUFDbEQsS0FBTSxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQU0sS0FBSyxFQUN2RCxLQUFNLFNBQVMsU0FBUyxlQUFlLFlBQVksRUFBRSxLQUFLLEdBQUssSUFDL0QsT0FBUSxTQUFTLGVBQWUsY0FBYyxFQUFFLFFBQ2hELFNBQVUsU0FBUyxlQUFlLFlBQVksRUFBRSxNQUFNLEtBQUssRUFDM0QsU0FBVSxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQU0sS0FBSyxFQUMzRCxLQUFNLFNBQVMsZUFBZSxZQUFZLEVBQUUsTUFBTSxLQUFLLEVBQ3ZELEdBQUksU0FBUyxlQUFlLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FDckQsQ0FDRixFQUNBLE9BQVEsQ0FDTixpQkFBa0IsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQ2xFLGVBQWdCLFNBQVMsZUFBZSxvQkFBb0IsRUFBRSxRQUM5RCxpQkFBa0IsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQ2xFLGdCQUFpQixTQUFTLGVBQWUscUJBQXFCLEVBQUUsUUFDaEUsa0JBQW1CLFNBQVMsZUFBZSx1QkFBdUIsRUFBRSxRQUNwRSxrQkFBbUIsU0FBUyxlQUFlLHVCQUF1QixFQUFFLFFBQ3BFLGlCQUFrQixTQUFTLGVBQWUsc0JBQXNCLEVBQUUsUUFDbEUscUJBQXNCLFNBQVMsZUFBZSwwQkFBMEIsRUFBRSxRQUMxRSxpQkFBa0IsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQ2xFLFNBQVksU0FBUyxlQUFlLGdCQUFnQixFQUFFLFFBQ3RELGtCQUFtQixTQUFTLGVBQWUsdUJBQXVCLEVBQUUsUUFDcEUsZ0JBQWlCLFNBQVMsZUFBZSxxQkFBcUIsRUFBRSxRQUNoRSxtQkFBb0IsU0FBUyxlQUFlLHdCQUF3QixFQUFFLFFBQ3RFLE1BQVMsU0FBUyxlQUFlLHNCQUFzQixFQUFFLE9BQzNELEVBQ0EsWUFBYSxDQUNYLFFBQVMsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFFBQ3pELGdCQUFpQixTQUFTLFNBQVMsZUFBZSx1QkFBdUIsRUFBRSxLQUFLLEdBQUssQ0FDdkYsQ0FDRixFQVFNckQsRUFBTyxNQU5JLE1BQU0sWUFBWSwrQkFBZ0MsQ0FDakUsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVVxRCxDQUFNLENBQzdCLENBQUMsR0FFMkIsS0FBSyxFQUM3QnJELEVBQUssU0FDUCxpQkFBaUIsOEJBQStCLFVBQVcsR0FBSSxFQUMvRGtGLEVBQU0sVUFBVSxPQUFPLE1BQU0sR0FFN0IsaUJBQWlCLG1CQUFtQmxGLEVBQUssS0FBSyxHQUFJLFFBQVMsR0FBSSxDQUVuRSxPQUFTUyxFQUFPLENBQ2QsaUJBQWlCLFVBQVVBLEVBQU0sT0FBTyxHQUFJLFFBQVMsR0FBSSxDQUMzRCxDQUNGLENBR0EsZUFBZXVjLEVBQWFULEVBQVUsQ0FDcEMsR0FBSSxDQU9GLE1BQU12YyxFQUFPLE1BTkksTUFBTSxZQUFZLDZCQUE4QixDQUMvRCxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLFNBQUF1YyxDQUFTLENBQUMsQ0FDbkMsQ0FBQyxHQUUyQixLQUFLLEVBQzdCdmMsRUFBSyxRQUNQLGlCQUFpQixRQUFRdWMsQ0FBUSxzQkFBdUIsVUFBVyxHQUFJLEVBRXZFLGlCQUFpQixnQkFBZ0J2YyxFQUFLLEtBQUssR0FBSSxRQUFTLEdBQUksQ0FFaEUsT0FBU1MsRUFBTyxDQUNkLGlCQUFpQixVQUFVQSxFQUFNLE9BQU8sR0FBSSxRQUFTLEdBQUksQ0FDM0QsQ0FDRixDQUVBLFNBQVMsZUFBZSxjQUFjLEdBQUcsaUJBQWlCLFFBQVMsSUFBTXVjLEVBQWEsU0FBUyxDQUFDLEVBQ2hHLFNBQVMsZUFBZSxlQUFlLEdBQUcsaUJBQWlCLFFBQVMsSUFBTUEsRUFBYSxVQUFVLENBQUMsRUFDbEcsU0FBUyxlQUFlLFdBQVcsR0FBRyxpQkFBaUIsUUFBUyxJQUFNQSxFQUFhLE1BQU0sQ0FBQyxFQUMxRixTQUFTLGVBQWUsWUFBWSxHQUFHLGlCQUFpQixRQUFTLElBQU1BLEVBQWEsT0FBTyxDQUFDLEVBRzVGLFNBQVMsZUFBZSxrQkFBa0IsR0FBRyxpQkFBaUIsUUFBUyxTQUFZLENBQ2pGLEdBQUksQ0FFRixNQUFNaGQsRUFBTyxNQURJLE1BQU0sWUFBWSxxQ0FBc0MsQ0FBRSxPQUFRLE1BQU8sQ0FBQyxHQUMvRCxLQUFLLEVBRTdCQSxFQUFLLFVBQ1AsU0FBUyxlQUFlLHFCQUFxQixFQUFFLFlBQzdDLGVBQWUsSUFBSSxLQUFLQSxFQUFLLFNBQVMsRUFBRSxlQUFlLENBQUMsS0FBS0EsRUFBSyxtQkFBbUIsZUFDdkYsaUJBQWlCLHlCQUEwQixVQUFXLEdBQUksRUFFOUQsT0FBU1MsRUFBTyxDQUNkLGlCQUFpQixVQUFVQSxFQUFNLE9BQU8sR0FBSSxRQUFTLEdBQUksQ0FDM0QsQ0FDRixDQUFDLEVBR0RnWSxHQUFTLGlCQUFpQixRQUFTLElBQU0sQ0FDdkN2VCxFQUFNLFVBQVUsSUFBSSxNQUFNLEVBQzFCeVgsRUFBdUIsRUFDdkJFLEVBQXdCLENBQzFCLENBQUMsRUFFRFAsR0FBUyxpQkFBaUIsUUFBU1MsQ0FBc0IsRUFHekQsU0FBUyxlQUFlLHlCQUF5QixHQUFHLGlCQUFpQixRQUFTLFNBQVksQ0FDeEYsTUFBTTVjLEVBQU0sU0FBUyxlQUFlLHlCQUF5QixFQUN2RG1SLEVBQWVuUixFQUFJLFlBQ3pCQSxFQUFJLFlBQWMsYUFDbEJBLEVBQUksU0FBVyxHQUVmLEdBQUksQ0FXRixNQUFNSCxFQUFPLE1BVkksTUFBTSxZQUFZLDZCQUE4QixDQUMvRCxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUNuQixNQUFPLE9BQ1AsS0FBTSxDQUFFLFFBQVMsNkNBQThDLEVBQy9ELEtBQU0sTUFDUixDQUFDLENBQ0gsQ0FBQyxHQUUyQixLQUFLLEVBQzdCQSxFQUFLLFNBQ1AsaUJBQWlCLDBCQUEyQixVQUFXLEdBQUksRUFFM0RpZCxFQUF1QixHQUV2QixpQkFBaUIsZ0JBQWdCamQsRUFBSyxTQUFTLElBQUltUixHQUFLLEdBQUdBLEVBQUUsUUFBUSxLQUFLQSxFQUFFLE9BQVMsSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBSSxRQUFTLEdBQUksQ0FFNUgsT0FBUzFRLEVBQU8sQ0FDZCxpQkFBaUIsVUFBVUEsRUFBTSxPQUFPLEdBQUksUUFBUyxHQUFJLENBQzNELFFBQUUsQ0FDQU4sRUFBSSxZQUFjbVIsRUFDbEJuUixFQUFJLFNBQVcsRUFDakIsQ0FDRixDQUFDLEVBR0QsZUFBZThjLEdBQXlCLENBQ3RDLEdBQUksQ0FFRixNQUFNamQsRUFBTyxNQURJLE1BQU0sTUFBTSw4QkFBOEIsR0FDL0IsS0FBSyxFQUNqQyxHQUFJQSxFQUFLLFNBQVdBLEVBQUssU0FBVSxDQUNqQyxNQUFNa2QsRUFBYSxTQUFTLGVBQWUsd0JBQXdCLEVBQy9EQSxJQUNGQSxFQUFXLFlBQWMsY0FBYyxJQUFJLEtBQUtsZCxFQUFLLFFBQVEsRUFBRSxlQUFlLENBQUMsR0FFbkYsQ0FDRixNQUFnQixDQUVoQixDQUNGLENBRUEsVUFBVWtGLEVBQU95SSxDQUFTLENBQzVCLEdBQUcsR0FHRixVQUFXLENBQ1YsU0FBUyxpQkFBaUIsUUFBVTVOLEdBQU0sQ0FDeEMsTUFBTW1aLEVBQU1uWixFQUFFLE9BQU8sUUFBUSxZQUFZLEVBQ3pDLEdBQUksQ0FBQ21aLEVBQUssT0FDVixNQUFNaUUsRUFBVWpFLEVBQUksUUFBUSxNQUM1QixHQUFJLENBQUNpRSxFQUFTLE9BQ2QsTUFBTUMsRUFBU2xFLEVBQUksUUFBUSxhQUFhLEVBQ2xDbUUsRUFBZUQsRUFBTyxRQUFRLHdCQUF3QixFQUM1REEsRUFBTyxpQkFBaUIsWUFBWSxFQUFFLFFBQVF2YyxHQUFLQSxFQUFFLFVBQVUsT0FBTyxRQUFRLENBQUMsRUFDL0VxWSxFQUFJLFVBQVUsSUFBSSxRQUFRLEVBQzFCbUUsRUFBYSxpQkFBaUIsZ0JBQWdCLEVBQUUsUUFBUWhOLEdBQUtBLEVBQUUsVUFBVSxPQUFPLFFBQVEsQ0FBQyxFQUN6RixNQUFNaU4sRUFBU0QsRUFBYSxjQUFjLElBQU1GLENBQU8sRUFDbkRHLEdBQVFBLEVBQU8sVUFBVSxJQUFJLFFBQVEsQ0FDM0MsQ0FBQyxDQUNILEdBQUcsR0FJRixVQUFXLENBRVYsSUFBSUMsRUFBcUIsQ0FDdkIsd0JBQXlCLHVCQUF3QiwyQkFDakQsa0JBQW1CLG1CQUNuQixRQUFTLGNBQWUsZUFDeEIsY0FBZSxrQkFBbUIsbUJBQ2xDLG1CQUFvQixjQUFlLGNBQWUsZUFDbEQsY0FBZSxlQUFnQixvQkFDakMsRUFHQSxTQUFTQyxHQUFzQixDQUc3QixRQUZJQyxFQUFRLENBQUMsRUFFSjdULEVBQUksRUFBR0EsRUFBSTJULEVBQW1CLE9BQVEzVCxJQUFLLENBQ2xELElBQUkvQyxFQUFNMFcsRUFBbUIzVCxDQUFDLEVBQzFCOFQsRUFBTSxRQUFRN1csQ0FBRyxFQUNqQjZXLEdBQVEsT0FBMkJELEVBQU01VyxDQUFHLEVBQUk2VyxFQUN0RCxDQUVBLEdBQUksQ0FDRixRQUFTQyxFQUFJLEVBQUdBLEVBQUksYUFBYSxPQUFRQSxJQUFLLENBQzVDLElBQUloTyxFQUFJLGFBQWEsSUFBSWdPLENBQUMsRUFDdEIsc0JBQXNCLEtBQUtoTyxDQUFDLElBQzlCOE4sRUFBTTlOLENBQUMsRUFBSSxhQUFhLFFBQVFBLENBQUMsRUFFckMsQ0FDRixNQUFZLENBQXlCLENBQ3JDLE9BQU84TixDQUNULENBR0EsU0FBU0csRUFBb0JDLEVBQWMsQ0FDekMsR0FBSSxDQUFDQSxHQUFnQixPQUFPQSxHQUFpQixTQUFVLE1BQU8sR0FDOUQsSUFBSUMsRUFBUSxFQUNaLFFBQVNqWCxLQUFPZ1gsRUFDVEEsRUFBYSxlQUFlaFgsQ0FBRyxJQUNwQyxRQUFRQSxFQUFLZ1gsRUFBYWhYLENBQUcsQ0FBQyxFQUM5QmlYLEtBRUYsT0FBT0EsQ0FDVCxDQUdBLFNBQVNDLEVBQWUvZCxFQUFNLENBQzVCLE9BQU9BLEVBQUssU0FBVyxDQUFDQSxFQUFLLE9BQVNBLEVBQUssUUFDN0MsQ0FFQSxTQUFTZ2UsRUFBb0JoZSxFQUFNLENBRWpDLElBQUk2ZCxFQUFlLENBQUMsRUFDaEI3ZCxFQUFLLGlCQUFnQjZkLEVBQWEsaUJBQWlCLEVBQUksS0FBSyxVQUFVN2QsRUFBSyxjQUFjLEdBQ3pGQSxFQUFLLGFBQVk2ZCxFQUFhLGFBQWEsRUFBSSxLQUFLLFVBQVU3ZCxFQUFLLFVBQVUsR0FDN0VBLEVBQUssYUFBWTZkLEVBQWEsYUFBYSxFQUFJN2QsRUFBSyxZQUNwREEsRUFBSyxRQUFPNmQsRUFBYSxNQUFXN2QsRUFBSyxPQUN6Q0EsRUFBSyxZQUFjLE9BQU8sS0FBS0EsRUFBSyxVQUFVLEVBQUUsU0FBUTZkLEVBQWEsYUFBYSxFQUFJLEtBQUssVUFBVTdkLEVBQUssVUFBVSxHQUN4SDRkLEVBQW9CQyxDQUFZLEVBRzVCN2QsRUFBSyxVQUFZLE1BQU0sUUFBUUEsRUFBSyxRQUFRLEdBQzlDLFlBQVksbUJBQW9CLENBQzlCLE9BQVEsTUFDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVQSxFQUFLLFFBQVEsQ0FDcEMsQ0FBQyxFQUFFLE1BQU0sVUFBVyxDQUFDLENBQUMsRUFJcEJBLEVBQUssWUFDUCxPQUFPLEtBQUtBLEVBQUssVUFBVSxFQUFFLFFBQVEsU0FBU2llLEVBQU0sQ0FDbEQsSUFBSSxFQUFJamUsRUFBSyxXQUFXaWUsQ0FBSSxFQUN4QjdELEVBQVMsQ0FBQyxHQUNiLE9BQU8sYUFBZSxDQUFDLEdBQUcsUUFBUSxTQUFTalIsRUFBRyxDQUFNLEVBQUVBLENBQUMsSUFBR2lSLEVBQU9qUixDQUFDLEVBQUksRUFBRUEsQ0FBQyxFQUFHLENBQUMsRUFDOUUsWUFBWSxrQkFBb0I4VSxFQUFNLENBQ3BDLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsS0FBTSxFQUFFLE1BQVFBLEVBQU0sT0FBUTdELENBQU8sQ0FBQyxDQUMvRCxDQUFDLEVBQUUsTUFBTSxVQUFXLENBQUMsQ0FBQyxDQUN4QixDQUFDLENBRUwsQ0FHQSxZQUFZLGVBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0EwR3JCLEVBRVAsSUFBSWxWLEVBQVEsU0FBUyxlQUFlLGNBQWMsRUFDOUN1VCxFQUFVLFNBQVMsZUFBZSxvQkFBb0IsRUFDdEQ5SyxFQUFZLFNBQVMsZUFBZSxlQUFlLEVBQ25EdVEsRUFBWSxTQUFTLGVBQWUsbUJBQW1CLEVBQ3ZEQyxFQUFnQixTQUFTLGVBQWUsb0JBQW9CLEVBQzVEQyxFQUFZLFNBQVMsZUFBZSxtQkFBbUIsRUFDdkRDLEVBQWMsU0FBUyxlQUFlLGtCQUFrQixFQUN4REMsRUFBYSxTQUFTLGVBQWUsZ0JBQWdCLEVBQ3JEQyxFQUFpQixTQUFTLGVBQWUsd0JBQXdCLEVBQ2pFQyxFQUFhLFNBQVMsZUFBZSx1QkFBdUIsRUFDNURDLEVBQVksU0FBUyxlQUFlLGVBQWUsRUFDbkRDLEVBQW9CLFNBQVMsZUFBZSw0QkFBNEIsRUFNNUUsU0FBU0MsRUFBbUJDLEVBQU0sQ0FDNUIsQ0FBQ0EsR0FBUSxDQUFDQSxFQUFLLGtCQUNuQkEsRUFBSyxpQkFBaUIsb0JBQW9CLEVBQUUsUUFBU3plLEdBQVEsQ0FDM0RBLEVBQUksaUJBQWlCLFFBQVMsSUFBTSxDQUNsQyxpQkFBaUJBLEVBQUksUUFBUSxXQUFZLE1BQU0sRUFDM0MsT0FBTyxrQkFBa0IsT0FBTyxpQkFBaUIsQ0FDdkQsQ0FBQyxDQUNILENBQUMsQ0FDSCxDQUNBLElBQUkwZSxFQUFtQixTQUFTLGVBQWUsMEJBQTBCLEVBQ3JFQyxFQUFnQixTQUFTLGVBQWUsdUJBQXVCLEVBQy9EQyxFQUF1QixTQUFTLGVBQWUsdUJBQXVCLEVBRXRFQyxFQUFpQixLQUdyQnZHLEdBQVMsaUJBQWlCLFFBQVMsVUFBVyxDQUM1Q3ZULEVBQU0sVUFBVSxJQUFJLE1BQU0sRUFDdEJ1WixJQUFXQSxFQUFVLE1BQU0sUUFBVSxRQUNyQ0gsSUFBWUEsRUFBVyxNQUFNLFFBQVUsUUFDdkNELElBQWFBLEVBQVksTUFBTSxRQUFVLFFBQzdDVyxFQUFpQixJQUNuQixDQUFDLEVBRUQsVUFBVTlaLEVBQU95SSxDQUFTLEVBRzFCdVEsR0FBVyxpQkFBaUIsUUFBUyxnQkFBaUIsQ0FDcERBLEVBQVUsU0FBVyxHQUNyQkEsRUFBVSxVQUFZLG1EQUN0QixHQUFJLENBRUYsSUFBSTFkLEVBQVcsTUFBTSxNQUFNLHVCQUF1QixFQUM5Q1IsRUFBTyxNQUFNUSxFQUFTLEtBQUssRUFHL0JSLEVBQUssYUFBZXdkLEVBQW9CLEVBR3hDLElBQUl6RyxFQUFPLElBQUksS0FBSyxDQUFDLEtBQUssVUFBVS9XLEVBQU0sS0FBTSxDQUFDLENBQUMsRUFBRyxDQUFFLEtBQU0sa0JBQW1CLENBQUMsRUFDN0U2SyxFQUFNLElBQUksZ0JBQWdCa00sQ0FBSSxFQUM5Qi9RLEVBQUksU0FBUyxjQUFjLEdBQUcsRUFDbENBLEVBQUUsS0FBTzZFLEVBQ1Q3RSxFQUFFLFNBQVcsb0JBQXNCLElBQUksS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUksUUFDNUUsU0FBUyxLQUFLLFlBQVlBLENBQUMsRUFDM0JBLEVBQUUsTUFBTSxFQUNSLFNBQVMsS0FBSyxZQUFZQSxDQUFDLEVBQzNCLElBQUksZ0JBQWdCNkUsQ0FBRyxFQUV2QixJQUFJb1UsRUFBYSxPQUFPLEtBQUtqZixFQUFLLFlBQVksRUFBRSxPQUM1Q2tmLEVBQWFsZixFQUFLLE9BQVMsT0FBTyxLQUFLQSxFQUFLLE1BQU0sRUFBRSxPQUFTLEVBQ2pFeWUsRUFBVSxVQUFZLHdEQUFnRFEsRUFBYSxxQkFBdUJDLEVBQWEsTUFBUUEsRUFBYSxVQUFZLElBQ3hKVCxFQUFVLE1BQU0sUUFBVSxRQUMxQkEsRUFBVSxNQUFNLFdBQWEsb0RBQzdCQSxFQUFVLE1BQU0sT0FBUyx3QkFDM0IsT0FBUzFlLEVBQUcsQ0FDVjBlLEVBQVUsVUFBWSx5QkFBc0IsV0FBVzFlLEVBQUUsT0FBTyxFQUNoRTBlLEVBQVUsTUFBTSxRQUFVLFFBQzFCQSxFQUFVLE1BQU0sV0FBYSxxREFDN0JBLEVBQVUsTUFBTSxPQUFTLHlCQUMzQixDQUNBUCxFQUFVLFNBQVcsR0FDckJBLEVBQVUsVUFBWSxtQ0FDeEIsQ0FBQyxFQUdEQyxHQUFlLGlCQUFpQixRQUFTLFVBQVcsQ0FBRUMsRUFBVSxNQUFNLENBQUcsQ0FBQyxFQUcxRUEsR0FBVyxpQkFBaUIsU0FBVSxlQUFlcmUsRUFBRyxDQUN0RCxJQUFJSCxFQUFPRyxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQzNCLEdBQUtILEVBQ0wsQ0FBQXllLEVBQVksWUFBYyxhQUFRemUsRUFBSyxLQUN2Q3llLEVBQVksTUFBTSxRQUFVLFFBQzVCSSxFQUFVLE1BQU0sUUFBVSxPQUMxQixHQUFJLENBQ0YsSUFBSWpPLEVBQU8sTUFBTTVRLEVBQUssS0FBSyxFQUN2QnVmLEVBQVMsS0FBSyxNQUFNM08sQ0FBSSxFQUc1QixHQUFJdU4sRUFBZW9CLENBQU0sRUFBRyxDQUMxQkgsRUFBaUJHLEVBQ2pCLElBQUl6YyxFQUFPLDRGQUE4RixXQUFXeWMsRUFBTyxPQUFPLEVBQUksVUFDdEl6YyxHQUFRLDBEQUNKeWMsRUFBTyxVQUFVLFNBQVF6YyxHQUFRLDZHQUF3R3ljLEVBQU8sU0FBUyxPQUFTLG9CQUNsS0EsRUFBTyxZQUFZLFNBQVF6YyxHQUFRLDZHQUF3R3ljLEVBQU8sV0FBVyxPQUFTLHVCQUN0S0EsRUFBTyxRQUFPemMsR0FBUSxvSEFBK0csV0FBV3ljLEVBQU8sS0FBSyxFQUFJLFdBQ2hLQSxFQUFPLGFBQVl6YyxHQUFRLDZHQUF3RyxPQUFPLEtBQUt5YyxFQUFPLFVBQVUsRUFBRSxPQUFTLHlCQUMvS3pjLEdBQVEsU0FDUjZiLEVBQWUsVUFBWTdiLEVBQzNCNGIsRUFBVyxNQUFNLFFBQVUsUUFDM0IsTUFDRixDQUdBLElBQUk5ZCxFQUFXLE1BQU0sWUFBWSx5QkFBMEIsQ0FDekQsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUyZSxDQUFNLENBQzdCLENBQUMsRUFDR0MsRUFBVSxNQUFNNWUsRUFBUyxLQUFLLEVBQ2xDLEdBQUk0ZSxFQUFRLFFBQVMsQ0FDbkJKLEVBQWlCRyxFQUNqQixJQUFJemMsRUFBTyxzRkFBd0YsSUFBSSxLQUFLeWMsRUFBTyxVQUFVLEVBQUUsZUFBZSxFQUFJLE1BQVEsV0FBV0EsRUFBTyxPQUFPLEVBQUksVUFHdkx6YyxHQUFRLGtKQUNSQSxHQUFRLCtFQUNSLFFBQVNtRSxLQUFPdVksRUFBUSxRQUFRLE1BQU8sQ0FDckMsSUFBSTdFLEVBQU82RSxFQUFRLFFBQVEsTUFBTXZZLENBQUcsRUFDaEN1RyxFQUFPbU4sRUFBSyxTQUFXLFNBQVcsWUFBTyxZQUM3QzdYLEdBQVEsbUdBQXFHMEssRUFBTyxJQUFNLFdBQVdtTixFQUFLLFdBQVcsRUFBSSxTQUMzSixDQUNBN1gsR0FBUSxTQUdKMGMsRUFBUSxRQUFRLGVBQ2xCMWMsR0FBUSw2RUFBK0UwYyxFQUFRLFFBQVEsYUFBZSxtQkFJcEhBLEVBQVEsUUFBUSxhQUNsQjFjLEdBQVEsdUZBQWtGMGMsRUFBUSxRQUFRLFdBQWEsd0JBSXJIQSxFQUFRLFFBQVEsb0JBQ2xCMWMsR0FBUSxxSkFDUkEsR0FBUSx5RUFBK0QwYyxFQUFRLFFBQVEsa0JBQW9CLGdFQUc3R2IsRUFBZSxVQUFZN2IsRUFDM0I0YixFQUFXLE1BQU0sUUFBVSxPQUM3QixNQUNFRyxFQUFVLFVBQVkscUNBQTZCLFdBQVdXLEVBQVEsS0FBSyxFQUMzRVgsRUFBVSxNQUFNLFFBQVUsUUFDMUJBLEVBQVUsTUFBTSxXQUFhLCtDQUM3QkEsRUFBVSxNQUFNLE9BQVMsb0JBQ3pCSCxFQUFXLE1BQU0sUUFBVSxNQUUvQixPQUFTdmUsRUFBRyxDQUNWMGUsRUFBVSxVQUFZLCtCQUE0QixXQUFXMWUsRUFBRSxPQUFPLEVBQ3RFMGUsRUFBVSxNQUFNLFFBQVUsUUFDMUJBLEVBQVUsTUFBTSxXQUFhLHFEQUM3QkEsRUFBVSxNQUFNLE9BQVMsMEJBQ3pCSCxFQUFXLE1BQU0sUUFBVSxNQUM3QixFQUNGLENBQUMsRUFHREUsR0FBWSxpQkFBaUIsUUFBUyxnQkFBaUIsQ0FDckQsR0FBS1EsR0FDQSxRQUFRLG1GQUFtRixFQUNoRyxDQUFBUixFQUFXLFNBQVcsR0FDdEJBLEVBQVcsVUFBWSxtREFDdkIsR0FBSSxDQUVGLEdBQUlULEVBQWVpQixDQUFjLEVBQUcsQ0FDbENoQixFQUFvQmdCLENBQWMsRUFDbENQLEVBQVUsVUFBWSwrRUFDdEJBLEVBQVUsTUFBTSxXQUFhLG9EQUM3QkEsRUFBVSxNQUFNLE9BQVMseUJBQ3pCQSxFQUFVLE1BQU0sUUFBVSxRQUMxQixXQUFXLFVBQVcsQ0FBRSxTQUFTLE9BQU8sQ0FBRyxFQUFHLEdBQUksRUFDbERELEVBQVcsU0FBVyxHQUN0QkEsRUFBVyxVQUFZLDRCQUN2QixNQUNGLENBR0EsSUFBSWEsRUFBYyxTQUFTLGVBQWUscUJBQXFCLEdBQUcsU0FBVyxHQUN6RTdlLEVBQVcsTUFBTSxZQUFZLHlCQUEwQixDQUN6RCxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLE9BQVF3ZSxFQUFnQixRQUFTLENBQUUsWUFBYUssQ0FBWSxDQUFFLENBQUMsQ0FDeEYsQ0FBQyxFQUNHcmYsRUFBTyxNQUFNUSxFQUFTLEtBQUssRUFHM0I4ZSxFQUFlLEVBS25CLEdBSklOLEVBQWUsZUFDakJNLEVBQWUxQixFQUFvQm9CLEVBQWUsWUFBWSxHQUc1RGhmLEVBQUssUUFBUyxDQUNoQixJQUFJMlQsRUFBTSxVQUFPM1QsRUFBSyxRQUNsQnNmLEVBQWUsSUFBRzNMLEdBQU8sMkNBQTZDMkwsRUFBZSxzQ0FDckZ0ZixFQUFLLFFBQVEsZ0JBQWUyVCxHQUFPLGdGQUN2QzhLLEVBQVUsVUFBWTlLLEVBQ3RCOEssRUFBVSxNQUFNLFdBQWEsb0RBQzdCQSxFQUFVLE1BQU0sT0FBUyx5QkFDekIsV0FBVyxVQUFXLENBQUUsU0FBUyxPQUFPLENBQUcsRUFBRyxHQUFJLENBQ3BELE1BQ0VBLEVBQVUsVUFBWSxnQkFBUSxXQUFXemUsRUFBSyxPQUFPLEVBQ2pEc2YsRUFBZSxJQUFHYixFQUFVLFdBQWEsMkNBQTZDYSxFQUFlLDJDQUNyR3RmLEVBQUssU0FBUyxRQUFRLE9BQVMsSUFDakN5ZSxFQUFVLFdBQWEsY0FBZ0J6ZSxFQUFLLFFBQVEsT0FBTyxJQUFJLFNBQVNELEVBQUcsQ0FBRSxPQUFPLFdBQVdBLEVBQUUsSUFBSSxFQUFJLEtBQU8sV0FBV0EsRUFBRSxLQUFLLENBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFJLFlBRXZKMGUsRUFBVSxNQUFNLFdBQWEsK0NBQzdCQSxFQUFVLE1BQU0sT0FBUyxvQkFFM0JBLEVBQVUsTUFBTSxRQUFVLE9BQzVCLE9BQVMxZSxFQUFHLENBQ1YwZSxFQUFVLFVBQVksMEJBQXVCLFdBQVcxZSxFQUFFLE9BQU8sRUFDakUwZSxFQUFVLE1BQU0sUUFBVSxRQUMxQkEsRUFBVSxNQUFNLFdBQWEscURBQzdCQSxFQUFVLE1BQU0sT0FBUyx5QkFDM0IsQ0FDQUQsRUFBVyxTQUFXLEdBQ3RCQSxFQUFXLFVBQVksNEJBQ3pCLENBQUMsRUFHRCxlQUFlZSxHQUFtQixDQUNoQyxHQUFLYixFQUNMLENBQUFBLEVBQWtCLFVBQVksZ0ZBQzlCLEdBQUksQ0FDRixJQUFJbGQsRUFBTSxNQUFNLE1BQU0sMEJBQTBCLEVBQzVDeEIsRUFBTyxNQUFNd0IsRUFBSSxLQUFLLEVBRTFCLEdBQUl4QixFQUFLLGdCQUFpQixDQUN4QjBlLEVBQWtCLFVBQVksdW5CQU05QkMsRUFBbUJELENBQWlCLEVBQ3BDLE1BQ0YsQ0FFQSxHQUFJLENBQUMxZSxFQUFLLFFBQVMsTUFBTSxJQUFJLE1BQU1BLEVBQUssT0FBUywwQkFBMEIsRUFFM0UsSUFBSXdmLEVBQVl4ZixFQUFLLFdBQWEsQ0FBQyxFQUVuQyxHQUFJd2YsRUFBVSxTQUFXLEVBQUcsQ0FDMUJkLEVBQWtCLFVBQVksb09BSzlCLE1BQ0YsQ0FHQSxRQURJaGMsRUFBTyxpRUFDRmtILEVBQUksRUFBR0EsRUFBSTRWLEVBQVUsT0FBUTVWLElBQUssQ0FDekMsSUFBSTZWLEVBQU1ELEVBQVU1VixDQUFDLEVBQ2pCOFYsRUFBYUQsRUFBSSxRQUFVLElBQUksS0FBS0EsRUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFJLGdCQUNwRUUsRUFBYUYsRUFBSSxRQUFVLElBQUksS0FBS0EsRUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFJLFFBRXhFL2MsR0FBUSxnUkFFbUQsV0FBVytjLEVBQUksS0FBSyxFQUFJLDZKQUViLFdBQVdBLEVBQUksS0FBSyxFQUFJLEtBQU9BLEVBQUksUUFBVSxXQUFhLElBQU0sa0VBQ25FQSxFQUFJLFFBQVUsS0FBTyxPQUFTLCtPQUlhLFdBQVdBLEVBQUksS0FBSyxFQUFJLHdJQUNwR0EsRUFBSSxXQUFhLFNBQVcsWUFBYyxJQUFNLDZDQUNqREEsRUFBSSxXQUFhLFFBQVUsWUFBYyxJQUFNLDZDQUM5Q0EsRUFBSSxXQUFhLFNBQVcsWUFBYyxJQUFNLCtDQUMvQ0EsRUFBSSxXQUFhLFVBQVksWUFBYyxJQUFNLDBKQUV3QyxXQUFXQSxFQUFJLEtBQUssRUFBSSxhQUFlQSxFQUFJLFdBQVcsTUFBUSxHQUFLLHNQQUd2SyxXQUFXQyxDQUFVLEVBQUksMEJBQ3pCLFdBQVdDLENBQVUsRUFBSSxvR0FHSyxXQUFXRixFQUFJLEtBQUssRUFBSSx1UkFDekIsV0FBV0EsRUFBSSxLQUFLLEVBQUksa05BRy9FLENBQ0EvYyxHQUFRLFNBR1JBLEdBQVEsMjFDQWlCUmdjLEVBQWtCLFVBQVloYyxFQUc5QmdjLEVBQWtCLGlCQUFpQixrQkFBa0IsRUFBRSxRQUFRLFNBQVNrQixFQUFRLENBQzlFQSxFQUFPLGlCQUFpQixTQUFVLFVBQVcsQ0FBRUMsRUFBZUQsRUFBTyxRQUFRLE1BQU8sQ0FBRSxRQUFTQSxFQUFPLE9BQVEsQ0FBQyxDQUFHLENBQUMsQ0FDckgsQ0FBQyxFQUNEbEIsRUFBa0IsaUJBQWlCLGtCQUFrQixFQUFFLFFBQVEsU0FBU29CLEVBQUssQ0FDM0VBLEVBQUksaUJBQWlCLFNBQVUsVUFBVyxDQUFFRCxFQUFlQyxFQUFJLFFBQVEsTUFBTyxDQUFFLFNBQVVBLEVBQUksS0FBTSxDQUFDLENBQUcsQ0FBQyxDQUMzRyxDQUFDLEVBQ0RwQixFQUFrQixpQkFBaUIsa0JBQWtCLEVBQUUsUUFBUSxTQUFTcUIsRUFBSyxDQUMzRUEsRUFBSSxpQkFBaUIsU0FBVSxVQUFXLENBQUVGLEVBQWVFLEVBQUksUUFBUSxNQUFPLENBQUUsVUFBVyxDQUFFLEtBQU0sU0FBU0EsRUFBSSxLQUFLLEdBQUssQ0FBRSxDQUFFLENBQUMsQ0FBRyxDQUFDLENBQ3JJLENBQUMsRUFDRHJCLEVBQWtCLGlCQUFpQixtQkFBbUIsRUFBRSxRQUFRLFNBQVN2ZSxFQUFLLENBQzVFQSxFQUFJLGlCQUFpQixRQUFTLFVBQVcsQ0FBRTZmLEVBQWE3ZixFQUFJLFFBQVEsS0FBSyxDQUFHLENBQUMsQ0FDL0UsQ0FBQyxFQUNEdWUsRUFBa0IsaUJBQWlCLGtCQUFrQixFQUFFLFFBQVEsU0FBU3ZlLEVBQUssQ0FDM0VBLEVBQUksaUJBQWlCLFFBQVMsVUFBVyxDQUFFOGYsRUFBZTlmLEVBQUksUUFBUSxLQUFLLENBQUcsQ0FBQyxDQUNqRixDQUFDLEVBQ0QsU0FBUyxlQUFlLGtCQUFrQixHQUFHLGlCQUFpQixRQUFTK2YsQ0FBYyxDQUV2RixPQUFTbmdCLEVBQUcsQ0FDVjJlLEVBQWtCLFVBQVksMEVBQTRFLFdBQVczZSxFQUFFLE9BQU8sRUFBSSxRQUNwSSxFQUNGLENBRUEsZUFBZThmLEVBQWVsYSxFQUFPd2EsRUFBUyxDQUM1QyxHQUFJLENBQ0YsSUFBSTNlLEVBQU0sTUFBTSxZQUFZLDJCQUE0QixDQUN0RCxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLE1BQUFtRSxFQUFPLEdBQUd3YSxDQUFRLENBQUMsQ0FDNUMsQ0FBQyxFQUNHbmdCLEVBQU8sTUFBTXdCLEVBQUksS0FBSyxFQUN0QnhCLEVBQUssUUFDUCxpQkFBaUIsd0JBQTBCMkYsRUFBTyxTQUFTLEdBRTNELGlCQUFpQixtQkFBcUIzRixFQUFLLE9BQVMsV0FBWSxPQUFPLEVBQ3ZFdWYsRUFBaUIsRUFFckIsT0FBU3hmLEVBQUcsQ0FDVixpQkFBaUIsVUFBWUEsRUFBRSxRQUFTLE9BQU8sQ0FDakQsQ0FDRixDQUVBLGVBQWVpZ0IsRUFBYXJhLEVBQU8sQ0FDakMsR0FBSSxDQUNGLElBQUluRSxFQUFNLE1BQU0sWUFBWSwwQkFBNEIsbUJBQW1CbUUsQ0FBSyxFQUFHLENBQ2pGLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLENBQ2hELENBQUMsRUFDRzNGLEVBQU8sTUFBTXdCLEVBQUksS0FBSyxFQUN0QnhCLEVBQUssUUFDUCxpQkFBaUIsc0JBQXdCMkYsRUFBUSxJQUFLLFNBQVMsRUFFL0QsaUJBQWlCLG1CQUFxQjNGLEVBQUssT0FBUyxXQUFZLE9BQU8sQ0FFM0UsT0FBU0QsRUFBRyxDQUNWLGlCQUFpQixVQUFZQSxFQUFFLFFBQVMsT0FBTyxDQUNqRCxDQUNGLENBRUEsZUFBZWtnQixFQUFldGEsRUFBTyxDQUNuQyxHQUFLLFFBQVEsOEJBQWdDQSxFQUFRLEdBQUcsRUFDeEQsR0FBSSxDQUNGLElBQUluRSxFQUFNLE1BQU0sWUFBWSw0QkFBOEIsbUJBQW1CbUUsQ0FBSyxFQUFHLENBQUUsT0FBUSxRQUFTLENBQUMsRUFDckczRixFQUFPLE1BQU13QixFQUFJLEtBQUssRUFDdEJ4QixFQUFLLFNBQ1AsaUJBQWlCLHdCQUEwQjJGLEVBQU8sU0FBUyxFQUMzRDRaLEVBQWlCLEdBRWpCLGlCQUFpQixtQkFBcUJ2ZixFQUFLLE9BQVMsV0FBWSxPQUFPLENBRTNFLE9BQVNELEVBQUcsQ0FDVixpQkFBaUIsVUFBWUEsRUFBRSxRQUFTLE9BQU8sQ0FDakQsQ0FDRixDQUVBLGVBQWVtZ0IsR0FBaUIsQ0FDOUIsSUFBSXZhLEVBQVEsU0FBUyxlQUFlLG9CQUFvQixHQUFHLE9BQU8sS0FBSyxFQUNuRXlhLEVBQVcsU0FBUyxlQUFlLHVCQUF1QixHQUFHLE9BQVMsUUFDdEVDLEVBQVksU0FBUyxTQUFTLGVBQWUsd0JBQXdCLEdBQUcsS0FBSyxHQUFLLEVBRXRGLEdBQUksQ0FBQzFhLEVBQU8sQ0FDVixpQkFBaUIseUJBQTBCLFNBQVMsRUFDcEQsTUFDRixDQUVBLEdBQUksQ0FDRixJQUFJbkUsRUFBTSxNQUFNLFlBQVksMkJBQTRCLENBQ3RELE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsTUFBQW1FLEVBQU8sU0FBVXlhLEVBQVUsVUFBVyxDQUFFLEtBQU1DLENBQVUsRUFBRyxRQUFTLEVBQUssQ0FBQyxDQUNuRyxDQUFDLEVBQ0dyZ0IsRUFBTyxNQUFNd0IsRUFBSSxLQUFLLEVBQzFCLEdBQUl4QixFQUFLLFFBQVMsQ0FDaEIsaUJBQWlCLHdCQUEwQjJGLEVBQU8sU0FBUyxFQUMzRDRaLEVBQWlCLEVBRWpCLElBQUllLEVBQWEsU0FBUyxlQUFlLG9CQUFvQixFQUN6REEsSUFBWUEsRUFBVyxNQUFRLEdBQ3JDLE1BQ0UsaUJBQWlCLFlBQWN0Z0IsRUFBSyxPQUFTLFdBQVksT0FBTyxDQUVwRSxPQUFTRCxFQUFHLENBQ1YsaUJBQWlCLFVBQVlBLEVBQUUsUUFBUyxPQUFPLENBQ2pELENBQ0YsQ0FHQSxlQUFld2dCLEdBQWtCLENBQy9CLEdBQUt6QixFQUNMLENBQUFBLEVBQWMsVUFBWSxnRkFDMUIsR0FBSSxDQUNGLElBQUl0ZCxFQUFNLE1BQU0sTUFBTSx1QkFBdUIsRUFDekN4QixFQUFPLE1BQU13QixFQUFJLEtBQUssRUFDMUIsR0FBSSxDQUFDeEIsRUFBSyxRQUFTLE1BQU0sSUFBSSxNQUFNQSxFQUFLLE9BQVMsZ0JBQWdCLEVBRWpFLElBQUl3Z0IsRUFBUXhnQixFQUFLLE9BQVMsQ0FBQyxFQUUzQixHQUFJd2dCLEVBQU0sU0FBVyxFQUFHLENBQ3RCMUIsRUFBYyxVQUFZLDROQUsxQixNQUNGLENBSUEsUUFESTJCLEVBQVEsQ0FBQyxFQUNKN1csRUFBSSxFQUFHQSxFQUFJNFcsRUFBTSxPQUFRNVcsSUFBSyxDQUNyQyxJQUFJOFcsRUFBSUYsRUFBTTVXLENBQUMsRUFDWGpFLEVBQVErYSxFQUFFLE9BQVMsVUFDbEJELEVBQU05YSxDQUFLLElBQUc4YSxFQUFNOWEsQ0FBSyxFQUFJLENBQUMsR0FDbkM4YSxFQUFNOWEsQ0FBSyxFQUFFLEtBQUsrYSxDQUFDLENBQ3JCLENBRUEsSUFBSWhlLEVBQU8sOEVBQWdGOGQsRUFBTSxPQUFTLDBCQUE0QixPQUFPLEtBQUtDLENBQUssRUFBRSxPQUFTLGdCQUNsSy9kLEdBQVEsa0VBR1IsUUFESWllLEVBQVMsT0FBTyxLQUFLRixDQUFLLEVBQUUsS0FBSyxFQUM1QnphLEVBQUksRUFBR0EsRUFBSTJhLEVBQU8sT0FBUTNhLElBQUssQ0FDdEMsSUFBSUwsRUFBUWdiLEVBQU8zYSxDQUFDLEVBQ2hCNGEsRUFBV0gsRUFBTTlhLENBQUssRUFDMUJqRCxHQUFRLGtTQUVOLFdBQVdpRCxDQUFLLEVBQUksaUZBQW1GaWIsRUFBUyxPQUFTLDJCQUczSCxRQUFTakQsRUFBSSxFQUFHQSxFQUFJaUQsRUFBUyxPQUFRakQsSUFBSyxDQUN4QyxJQUFJK0MsRUFBSUUsRUFBU2pELENBQUMsRUFDZG5JLEVBQVUsSUFBSSxLQUFLa0wsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUNuRGhlLEdBQVEsc09BRW9ELFdBQVdnZSxFQUFFLElBQUksRUFBSSxpRUFDbEJBLEVBQUUsY0FBZ0IseUZBRUFsTCxFQUFVLDhGQUVyQyxXQUFXN1AsQ0FBSyxFQUFJLG9CQUFzQixXQUFXK2EsRUFBRSxJQUFJLEVBQUksdU9BQy9ELFdBQVcvYSxDQUFLLEVBQUksb0JBQXNCLFdBQVcrYSxFQUFFLElBQUksRUFBSSw2TkFHdkgsQ0FDQWhlLEdBQVEsUUFDVixDQUNBQSxHQUFRLFNBRVJvYyxFQUFjLFVBQVlwYyxFQUcxQm9jLEVBQWMsaUJBQWlCLG1CQUFtQixFQUFFLFFBQVEsU0FBUzNlLEVBQUssQ0FDeEVBLEVBQUksaUJBQWlCLFFBQVMsVUFBVyxDQUFFMGdCLEVBQWtCMWdCLEVBQUksUUFBUSxNQUFPQSxFQUFJLFFBQVEsUUFBUSxDQUFHLENBQUMsQ0FDMUcsQ0FBQyxFQUNEMmUsRUFBYyxpQkFBaUIsbUJBQW1CLEVBQUUsUUFBUSxTQUFTM2UsRUFBSyxDQUN4RUEsRUFBSSxpQkFBaUIsUUFBUyxVQUFXLENBQUUyZ0IsRUFBa0IzZ0IsRUFBSSxRQUFRLE1BQU9BLEVBQUksUUFBUSxRQUFRLENBQUcsQ0FBQyxDQUMxRyxDQUFDLENBQ0gsT0FBU0osRUFBRyxDQUNWK2UsRUFBYyxVQUFZLGtFQUFvRSxXQUFXL2UsRUFBRSxPQUFPLEVBQUksUUFDeEgsRUFDRixDQUdBLGVBQWVnaEIsR0FBb0IsQ0FDakMsR0FBS2xDLEVBQ0wsQ0FBQUEsRUFBaUIsVUFBWSxnRkFDN0IsR0FBSSxDQUNGLElBQUlyZCxFQUFNLE1BQU0sTUFBTSxrQ0FBa0MsRUFDcER4QixFQUFPLE1BQU13QixFQUFJLEtBQUssRUFDMUIsR0FBSSxDQUFDeEIsRUFBSyxTQUFXLENBQUNBLEVBQUssU0FBUyxPQUFRLENBQzFDNmUsRUFBaUIsVUFBWSxpR0FDN0IsTUFDRixDQUVBLFFBREluYyxFQUFPLGlFQUNGa0gsRUFBSSxFQUFHQSxFQUFJNUosRUFBSyxRQUFRLE9BQVE0SixJQUFLLENBQzVDLElBQUlvWCxFQUFLaGhCLEVBQUssUUFBUTRKLENBQUMsRUFDbkJxWCxFQUFTRCxFQUFHLE1BQVFBLEVBQUcsS0FBTyxLQUFPLE1BQU0sUUFBUSxDQUFDLEVBQUksSUFDNUR0ZSxHQUFRLDJJQUNSQSxHQUFRLDBHQUNSQSxHQUFRLHVDQUF5QyxXQUFXc2UsRUFBRyxNQUFRLFFBQVEsRUFBSSxVQUNuRnRlLEdBQVEsa0VBQ1JBLEdBQVEsb0NBQXNDc2UsRUFBRyxTQUFXLFVBQVksVUFBWSxRQUFVLEtBQU8sV0FBV0EsRUFBRyxNQUFNLEVBQUksVUFDekhBLEVBQUcsU0FBVyxZQUFXdGUsR0FBUSw0REFBOEQsV0FBV3NlLEVBQUcsRUFBRSxFQUFJLG9FQUN2SHRlLEdBQVEsYUFDUkEsR0FBUSxXQUNSQSxHQUFRLDJEQUNSQSxHQUFRLE9BQVMsSUFBSSxLQUFLc2UsRUFBRyxTQUFTLEVBQUUsZUFBZSxFQUFJLE1BQVFDLEVBQVMsVUFBWUQsRUFBRyxVQUFZQSxFQUFHLFNBQVcsS0FBTSxRQUFRLENBQUMsRUFBSSxJQUFNLE1BQzFJQSxFQUFHLFlBQVd0ZSxHQUFRLGdCQUMxQkEsR0FBUSxXQUNSQSxHQUFRLFFBQ1YsQ0FDQUEsR0FBUSxTQUNSbWMsRUFBaUIsVUFBWW5jLEVBQzdCbWMsRUFBaUIsaUJBQWlCLHFCQUFxQixFQUFFLFFBQVEsU0FBUzFlLEVBQUssQ0FDN0VBLEVBQUksaUJBQWlCLFFBQVMsVUFBVyxDQUFFLE9BQU8sc0JBQXNCQSxFQUFJLFFBQVEsUUFBUSxDQUFHLENBQUMsQ0FDbEcsQ0FBQyxDQUNILE9BQVNKLEVBQUcsQ0FDVjhlLEVBQWlCLFVBQVksa0VBQW9FLFdBQVc5ZSxFQUFFLE9BQU8sRUFBSSxRQUMzSCxFQUNGLENBRUEsT0FBTyxzQkFBd0IsZUFBZW1oQixFQUFVLENBQ3RELEdBQUssUUFBUSw2RUFBNkUsRUFDMUYsR0FBSSxDQUNGLElBQUkxZixFQUFNLE1BQU0sWUFBWSwyQkFBNkIwZixFQUFVLENBQ2pFLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsZ0JBQWlCLEdBQU0sY0FBZSxFQUFLLENBQUMsQ0FDckUsQ0FBQyxFQUNHbGhCLEVBQU8sTUFBTXdCLEVBQUksS0FBSyxFQUN0QnhCLEVBQUssU0FDUCxpQkFBaUIsa0NBQW1DLFNBQVMsRUFDN0QsU0FBUyxPQUFPLEdBRWhCLGlCQUFpQixvQkFBc0JBLEVBQUssT0FBUyxpQkFBa0IsT0FBTyxDQUVsRixPQUFTRCxFQUFHLENBQUUsaUJBQWlCLGtCQUFvQkEsRUFBRSxRQUFTLE9BQU8sQ0FBRyxDQUMxRSxFQUdBLFNBQVMsY0FBYyxxQ0FBcUMsR0FBRyxpQkFBaUIsUUFBU3dmLENBQWdCLEVBQ3pHLFNBQVMsY0FBYyxnQ0FBZ0MsR0FBRyxpQkFBaUIsUUFBU2dCLENBQWUsRUFDbkcsU0FBUyxjQUFjLHVDQUF1QyxHQUFHLGlCQUFpQixRQUFTWSxDQUFrQixFQUM3RyxTQUFTLGNBQWMsbUNBQW1DLEdBQUcsaUJBQWlCLFFBQVNKLENBQWlCLEVBR3hHLGVBQWVJLEdBQXFCLENBQ2xDLEdBQUtwQyxFQUdMLElBQUksQ0FDRixJQUFJcUMsRUFBYSxNQUFNLE1BQU0sd0JBQXdCLEVBQ2pEQyxFQUFjLE1BQU1ELEVBQVcsS0FBSyxFQUN4QyxHQUFJQyxFQUFZLE9BQVMsVUFBVyxDQUNsQ3RDLEVBQXFCLFVBQVksbW9CQU1qQ0osRUFBbUJJLENBQW9CLEVBQ3ZDLE1BQ0YsQ0FDRixNQUFZLENBQWUsQ0FFM0JBLEVBQXFCLFVBQVksZ0ZBRWpDLEdBQUksQ0FFRixJQUFJdUMsRUFBYyxNQUFNLE1BQU0sa0JBQWtCLEVBQzVDQyxFQUFlLE1BQU1ELEVBQVksS0FBSyxFQUN0QzFHLEVBQVcyRyxFQUFhLFVBQVksQ0FBQyxFQUV6QyxHQUFJM0csRUFBUyxTQUFXLEVBQUcsQ0FDekJtRSxFQUFxQixVQUFZLGdHQUNqQyxNQUNGLENBTUEsUUFKSXJjLEVBQU8sNldBSUZrSCxFQUFJLEVBQUdBLEVBQUlnUixFQUFTLE9BQVFoUixJQUNuQ2xILEdBQVEsa0JBQW9CLFdBQVdrWSxFQUFTaFIsQ0FBQyxFQUFFLElBQU1nUixFQUFTaFIsQ0FBQyxFQUFFLE1BQVEsRUFBRSxFQUFJLEtBQ2pGLFdBQVdnUixFQUFTaFIsQ0FBQyxFQUFFLE1BQVFnUixFQUFTaFIsQ0FBQyxFQUFFLElBQU0sRUFBRSxFQUFJLFlBRTNEbEgsR0FBUSxnU0FNUnFjLEVBQXFCLFVBQVlyYyxFQUVqQyxTQUFTLGVBQWUsY0FBYyxHQUFHLGlCQUFpQixRQUFTLFVBQVcsQ0FDNUUsSUFBSWlELEVBQVEsU0FBUyxlQUFlLGdCQUFnQixHQUFHLE1BQ25EQSxHQUFPNmIsRUFBdUI3YixDQUFLLENBQ3pDLENBQUMsQ0FDSCxPQUFTNUYsRUFBRyxDQUNWZ2YsRUFBcUIsVUFBWSxrRUFBb0UsV0FBV2hmLEVBQUUsT0FBTyxFQUFJLFFBQy9ILEVBQ0YsQ0FFQSxlQUFleWhCLEVBQXVCN2IsRUFBTyxDQUMzQyxJQUFJOGIsRUFBUyxTQUFTLGVBQWUsa0JBQWtCLEVBQ3ZELEdBQUtBLEVBRUwsQ0FBQUEsRUFBTyxVQUFZLCtHQUVuQixHQUFJLENBQ0YsSUFBSWpnQixFQUFNLE1BQU0sTUFBTSx5QkFBMkIsbUJBQW1CbUUsQ0FBSyxDQUFDLEVBQ3RFM0YsRUFBTyxNQUFNd0IsRUFBSSxLQUFLLEVBRTFCLEdBQUksQ0FBQ3hCLEVBQUssU0FBVyxDQUFDQSxFQUFLLE9BQVNBLEVBQUssTUFBTSxTQUFXLEVBQUcsQ0FDM0R5aEIsRUFBTyxVQUFZLDBGQUFxRixXQUFXOWIsQ0FBSyxFQUFJLFNBQzVILE1BQ0YsQ0FLQSxRQUhJakQsRUFBTyw2RUFBK0UxQyxFQUFLLE1BQU0sT0FBUyxpRkFHckcsRUFBSSxFQUFHLEVBQUlBLEVBQUssTUFBTSxPQUFRLElBQUssQ0FDMUMsSUFBSTBnQixFQUFJMWdCLEVBQUssTUFBTSxDQUFDLEVBQ2hCd1YsRUFBVSxJQUFJLEtBQUtrTCxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQ25EaGUsR0FBUSxpUkFFb0QsV0FBV2dlLEVBQUUsSUFBSSxFQUFJLGlFQUNsQkEsRUFBRSxjQUFnQix5RkFFQWxMLEVBQVUsNkZBRXRDLFdBQVc3UCxDQUFLLEVBQUksb0JBQXNCLFdBQVcrYSxFQUFFLElBQUksRUFBSSx1T0FDL0QsV0FBVy9hLENBQUssRUFBSSxvQkFBc0IsV0FBVythLEVBQUUsSUFBSSxFQUFJLDhOQUd0SCxDQUNBaGUsR0FBUSxTQUNSK2UsRUFBTyxVQUFZL2UsRUFHbkIrZSxFQUFPLGlCQUFpQixrQkFBa0IsRUFBRSxRQUFRLFNBQVN0aEIsRUFBSyxDQUNoRUEsRUFBSSxpQkFBaUIsUUFBUyxVQUFXLENBQUUwZ0IsRUFBa0IxZ0IsRUFBSSxRQUFRLE1BQU9BLEVBQUksUUFBUSxRQUFRLENBQUcsQ0FBQyxDQUMxRyxDQUFDLEVBQ0RzaEIsRUFBTyxpQkFBaUIsa0JBQWtCLEVBQUUsUUFBUSxTQUFTdGhCLEVBQUssQ0FDaEVBLEVBQUksaUJBQWlCLFFBQVMsVUFBVyxDQUFFMmdCLEVBQWtCM2dCLEVBQUksUUFBUSxNQUFPQSxFQUFJLFFBQVEsUUFBUSxDQUFHLENBQUMsQ0FDMUcsQ0FBQyxDQUNILE9BQVNKLEVBQUcsQ0FDVjBoQixFQUFPLFVBQVksa0VBQW9FLFdBQVcxaEIsRUFBRSxPQUFPLEVBQUksUUFDakgsRUFDRixDQUVBLGVBQWU4Z0IsRUFBa0JsYixFQUFPa1IsRUFBVSxDQUNoRCxHQUFJLENBQ0YsSUFBSXJWLEVBQU0sTUFBTSxZQUFZLDJCQUE2QixtQkFBbUJxVixDQUFRLEVBQUcsQ0FDckYsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQ3pCLENBQUMsRUFDRzdXLEVBQU8sTUFBTXdCLEVBQUksS0FBSyxFQUMxQixHQUFJLENBQUN4QixFQUFLLFFBQVMsQ0FDakIsaUJBQWlCLG9CQUFzQkEsRUFBSyxPQUFTLFdBQVksT0FBTyxFQUN4RSxNQUNGLENBRUEsSUFBSTBoQixFQUFPMWhCLEVBQUssS0FDWjBDLEVBQU8sa2FBRXNDLFdBQVdtVSxDQUFRLEVBQUkseUZBQ2dCNkssRUFBSyxlQUFpQixLQUFPLGVBQWlCLElBQUksS0FBS0EsRUFBSyxTQUFTLEVBQUUsZUFBZSxFQUFJLFNBRWxMLEdBQUlBLEVBQUssU0FBVSxDQUNqQixJQUFJQyxFQUFhRCxFQUFLLFNBQVMsV0FBYSxZQUFPLFlBQ25EaGYsR0FBUSw4TUFDc0VpZixFQUFhLG1HQUN2QkQsRUFBSyxTQUFTLFlBQWMsd0JBQTBCQSxFQUFLLFNBQVMsYUFBZSxrQkFDbkpBLEVBQUssU0FBUyxhQUNoQmhmLEdBQVEsOElBRVZBLEdBQVEsUUFDVixDQUVBLEdBQUlnZixFQUFLLE9BQVEsQ0FDZixJQUFJRSxFQUFhRixFQUFLLE9BQU8sV0FBYSxZQUFPLFlBQ2pEaGYsR0FBUSw4TUFDc0VrZixFQUFhLHVCQUN2RkYsRUFBSyxPQUFPLFdBQ2RoZixHQUFRLDZIQUVSQSxHQUFRLHdFQUVWQSxHQUFRLFFBQ1YsQ0FFQUEsR0FBUSxxTUFHUixTQUFTLEtBQUssbUJBQW1CLFlBQWFBLENBQUksRUFDbEQsU0FBUyxlQUFlLG1CQUFtQixHQUFHLGlCQUFpQixRQUFTLFVBQVcsQ0FDakYsU0FBUyxlQUFlLGlCQUFpQixHQUFHLE9BQU8sQ0FDckQsQ0FBQyxFQUNELFNBQVMsZUFBZSxpQkFBaUIsR0FBRyxpQkFBaUIsUUFBUyxTQUFTM0MsRUFBRyxDQUM1RUEsRUFBRSxTQUFXLE1BQU0sS0FBSyxPQUFPLENBQ3JDLENBQUMsQ0FDSCxPQUFTQSxFQUFHLENBQ1YsaUJBQWlCLGtCQUFvQkEsRUFBRSxRQUFTLE9BQU8sQ0FDekQsQ0FDRixDQUVBLGVBQWUrZ0IsRUFBa0JuYixFQUFPa1IsRUFBVSxDQUNoRCxHQUFLLFFBQVEsV0FBYUEsRUFBVyxRQUFVbFIsRUFBUTtBQUFBO0FBQUEsOEZBQW9HLEVBRTNKLEdBQUksQ0FDRixJQUFJbkUsRUFBTSxNQUFNLFlBQVksZ0JBQWtCLG1CQUFtQm1FLENBQUssRUFBSSxXQUFhLG1CQUFtQmtSLENBQVEsRUFBRyxDQUNuSCxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLGtCQUFtQixFQUFLLENBQUMsQ0FDbEQsQ0FBQyxFQUNHN1csRUFBTyxNQUFNd0IsRUFBSSxLQUFLLEVBQ3RCeEIsRUFBSyxTQUNQLGlCQUFpQjJGLEVBQVEsZ0JBQWtCa1IsRUFBVSxTQUFTLEVBQzlELFdBQVcsVUFBVyxDQUFFLFNBQVMsT0FBTyxDQUFHLEVBQUcsSUFBSSxHQUVsRCxpQkFBaUIsb0JBQXNCN1csRUFBSyxPQUFTLFdBQVksT0FBTyxDQUU1RSxPQUFTRCxFQUFHLENBQ1YsaUJBQWlCLGtCQUFvQkEsRUFBRSxRQUFTLE9BQU8sQ0FDekQsQ0FDRixDQUNGLEdBQUcsR0FHRixVQUFXLENBRVYsWUFBWSxjQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQWdGcEIsRUFFUCxNQUFNbUYsRUFBUSxTQUFTLGVBQWUsYUFBYSxFQUM3Q3VULEVBQVUsU0FBUyxlQUFlLHFCQUFxQixFQUN2RDlLLEVBQVksU0FBUyxlQUFlLGNBQWMsRUFDbEQ2RCxFQUFhLFNBQVMsZUFBZSxtQkFBbUIsRUFDeERxUSxFQUFzQixTQUFTLGVBQWUsb0JBQW9CLEVBQ2xFbGEsRUFBWSxTQUFTLGVBQWUsaUJBQWlCLEVBQ3JEbWEsRUFBc0IsU0FBUyxlQUFlLDRCQUE0QixFQUMxRUMsRUFBa0IsU0FBUyxlQUFlLHdCQUF3QixFQUNsRUMsRUFBaUIsU0FBUyxlQUFlLG1CQUFtQixFQUVsRSxJQUFJQyxFQUFrQixLQUNsQkMsRUFBdUIsS0FFM0IsU0FBU0MsRUFBWUMsRUFBTyxDQUMxQixHQUFJQSxJQUFVLEdBQUssQ0FBQ0EsRUFBTyxNQUFPLE1BQ2xDLE1BQU16UyxFQUFJLEtBQ0owUyxFQUFRLENBQUMsSUFBSyxLQUFNLEtBQU0sSUFBSSxFQUM5QnpZLEVBQUksS0FBSyxNQUFNLEtBQUssSUFBSXdZLENBQUssRUFBSSxLQUFLLElBQUl6UyxDQUFDLENBQUMsRUFDbEQsT0FBTyxZQUFZeVMsRUFBUSxLQUFLLElBQUl6UyxFQUFHL0YsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUksSUFBTXlZLEVBQU16WSxDQUFDLENBQ3hFLENBRUEsU0FBUzBZLEVBQVlDLEVBQVMsQ0FDNUIsT0FBSUEsRUFBVSxHQUFXLFVBQ3JCQSxFQUFVLEdBQVcsVUFDbEIsU0FDVCxDQUVBLFNBQVNDLEVBQVlELEVBQVMsQ0FDNUIsT0FBSUEsRUFBVSxHQUFXLFVBQ3JCQSxFQUFVLEdBQVcsVUFDbEIsU0FDVCxDQUVBLGVBQWVFLEdBQVksQ0FDekIsR0FBSSxDQUVGLElBQUlDLEVBQVEsS0FDUkMsRUFBVyxHQUNmLEdBQUksQ0FFRixNQUFNM2lCLEVBQU8sTUFERCxNQUFNLE1BQU0sMEJBQTBCLEdBQzNCLEtBQUssRUFDeEJBLEVBQUssU0FBV0EsRUFBSyxRQUFTMGlCLEVBQVExaUIsRUFBSyxNQUFPMmlCLEVBQVcsR0FBTVQsRUFBdUJsaUIsRUFBSyxNQUNyRyxNQUFZLENBQUMsQ0FFYixHQUFJLENBQUMyaUIsRUFBVSxDQUViLE1BQU0zaUIsRUFBTyxNQURJLE1BQU0sTUFBTSwwQkFBMEIsR0FDM0IsS0FBSyxFQUNqQyxHQUFJQSxFQUFLLFNBQVdBLEVBQUssTUFBTyxDQUU5QjBpQixFQUFRLENBQUMsRUFDVCxVQUFXclMsS0FBS3JRLEVBQUssTUFDbkIwaUIsRUFBTXJTLEVBQUUsSUFBSSxFQUFJLENBQUUsS0FBTUEsRUFBRSxLQUFNLFFBQVMsQ0FBRSxJQUFLQSxFQUFFLElBQUssT0FBUSxDQUFFLFFBQVNBLEVBQUUsT0FBTyxRQUFTLE1BQU9BLEVBQUUsT0FBTyxLQUFNLE1BQU9BLEVBQUUsT0FBTyxNQUFPLFFBQVMsS0FBSyxNQUFNQSxFQUFFLE9BQU8sS0FBTyxPQUFPLEVBQUcsUUFBUyxLQUFLLE1BQU1BLEVBQUUsT0FBTyxNQUFRLE9BQU8sQ0FBRSxFQUFHLFFBQVMsQ0FBRSxRQUFTQSxFQUFFLFFBQVEsR0FBSSxRQUFTQSxFQUFFLFFBQVEsR0FBSSxNQUFPQSxFQUFFLFFBQVEsR0FBSyxTQUFTLFFBQVEsQ0FBQyxFQUFHLE1BQU9BLEVBQUUsUUFBUSxHQUFLLFNBQVMsUUFBUSxDQUFDLENBQUUsRUFBRyxLQUFNLENBQUUsT0FBUSxFQUFHLFFBQVMsQ0FBRSxDQUFFLEVBQUcsT0FBUUEsRUFBRSxNQUFPLEVBRS9hNlIsRUFBdUJRLENBQ3pCLENBQ0YsQ0FFQSxHQUFJLENBQUNBLEdBQVMsT0FBTyxLQUFLQSxDQUFLLEVBQUUsU0FBVyxFQUFHLENBQzdDL2EsRUFBVSxVQUFZLHlHQUN0QixNQUNGLENBRUEsSUFBSWpGLEVBQU8saUVBRVgsU0FBVyxDQUFDMEosRUFBSW1PLENBQUksSUFBSyxPQUFPLFFBQVFtSSxDQUFLLEVBQUcsQ0FDOUMsTUFBTUUsRUFBTXJJLEVBQUssU0FBV0EsRUFDdEJzSSxFQUFNRCxFQUFJLEtBQUssU0FBVyxFQUMxQkUsRUFBTUYsRUFBSSxRQUFRLFNBQVcsRUFDN0JHLEVBQVdULEVBQVlPLENBQUcsRUFDMUJHLEVBQVdSLEVBQVlNLENBQUcsRUFDMUJHLEVBQVVMLEVBQUksUUFBUSxPQUFTQSxFQUFJLFFBQVEsTUFBUSxFQUNuRE0sRUFBV04sRUFBSSxRQUFRLE9BQVMsRUFDaENPLEVBQVFQLEVBQUksU0FBUyxTQUFXQSxFQUFJLFNBQVMsSUFBTSxFQUNuRFEsRUFBUVIsRUFBSSxTQUFTLFNBQVdBLEVBQUksU0FBUyxJQUFNLEVBQ25EUyxFQUFNOUksRUFBSyxXQUVqQjdYLEdBQVE7QUFBQTtBQUFBO0FBQUEseURBR3lDNlgsRUFBSyxNQUFRbk8sQ0FBRTtBQUFBLGdCQUN4RGlYLEVBQU0sb0tBQW9LQSxFQUFJLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBSyxDQUFDLGVBQWlCLEVBQUU7QUFBQSxzSUFDcEc5SSxFQUFLLFFBQVUsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVEQU92RyxLQUFLLElBQUlzSSxFQUFLLEdBQUcsQ0FBQyxrQkFBa0JFLENBQVE7QUFBQTtBQUFBLDZFQUV0QkEsQ0FBUSwwQ0FBMENGLEVBQUksUUFBUSxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1REFPdEYsS0FBSyxJQUFJQyxFQUFLLEdBQUcsQ0FBQyxrQkFBa0JFLENBQVE7QUFBQTtBQUFBLDZFQUV0QkEsQ0FBUSwwQ0FBMENGLEVBQUksUUFBUSxDQUFDLENBQUM7QUFBQTtBQUFBLHlGQUVwRFgsRUFBWWMsQ0FBTyxDQUFDLE1BQU1kLEVBQVllLENBQVEsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseURBS3BGZixFQUFZZ0IsQ0FBSyxDQUFDO0FBQUE7QUFBQSx5REFFbEJoQixFQUFZaUIsQ0FBSyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBS2hFLENBQ0ExZ0IsR0FBUSxTQUNSaUYsRUFBVSxVQUFZakYsRUFDdEJzZixFQUFlLFlBQWMsWUFBYyxJQUFJLEtBQUssRUFBRSxtQkFBbUIsQ0FDM0UsT0FBU2ppQixFQUFHLENBQ1Y0SCxFQUFVLFVBQVksc0dBQWlHLFdBQVc1SCxFQUFFLE9BQU8sQ0FBQyxRQUM5SSxDQUNGLENBR0EsZUFBZXVqQixHQUFpQixDQUM5QixHQUFJLENBQUN4QixFQUFxQixPQUMxQixNQUFNOWhCLEVBQU9raUIsRUFDYixHQUFJLENBQUNsaUIsR0FBUSxPQUFPLEtBQUtBLENBQUksRUFBRSxTQUFXLEVBQUcsQ0FDM0M4aEIsRUFBb0IsVUFBWSx1SUFDaEMsTUFDRixDQUNBLElBQUlwZixFQUFPLGtFQUNYLFNBQVcsQ0FBQzBKLEVBQUltTyxDQUFJLElBQUssT0FBTyxRQUFRdmEsQ0FBSSxFQUFHLENBQzdDLE1BQU1xakIsRUFBTTlJLEVBQUssV0FDWjhJLElBQ0wzZ0IsR0FBUTtBQUFBLDhEQUNnRDZYLEVBQUssTUFBUW5PLENBQUU7QUFBQTtBQUFBLCtEQUVkaVgsRUFBSSxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUssQ0FBQztBQUFBLCtEQUM3QkEsRUFBSSxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUssQ0FBQztBQUFBLCtEQUM3QkEsRUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLEdBQUssQ0FBQztBQUFBLCtEQUNoQ0EsRUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLEdBQUssQ0FBQztBQUFBO0FBQUEsVUFFckZBLEVBQUksV0FBYSx5RUFBeUVBLEVBQUksVUFBVSxxQkFBcUJBLEVBQUksV0FBYSxFQUFFLFVBQVksRUFBRTtBQUFBLGNBRXBLLENBQ0EzZ0IsR0FBUSxTQUNSb2YsRUFBb0IsVUFBWXBmLENBQ2xDLENBR0EsZUFBZTZnQixHQUFhLENBQzFCLEdBQUksQ0FBQ3hCLEVBQWlCLE9BQ3RCQSxFQUFnQixVQUFZLHVGQUU1QixNQUFNL2hCLEVBQU9raUIsRUFDYixHQUFJLENBQUNsaUIsR0FBUSxPQUFPLEtBQUtBLENBQUksRUFBRSxTQUFXLEVBQUcsQ0FDM0MraEIsRUFBZ0IsVUFBWSw4SEFDNUIsTUFDRixDQUdBLElBQUlyVSxFQUFZLEdBQ2hCLEdBQUksQ0FHRkEsR0FEVyxNQURFLE1BQU0sTUFBTSx5Q0FBeUMsR0FDNUMsS0FBSyxHQUNaLFNBQ2pCLE1BQVksQ0FBRUEsRUFBWSxFQUFPLENBR2pDLElBQUk4VixFQUFlLENBQUMsRUFDcEIsR0FBSSxDQUVGLE1BQU1DLEVBQUssTUFEQSxNQUFNLE1BQU0sb0NBQW9DLEdBQ3ZDLEtBQUssRUFDckJBLEVBQUcsVUFBU0QsRUFBZUMsRUFBRyxTQUFXLENBQUMsRUFDaEQsTUFBWSxDQUFDLENBR2IsSUFBSUMsRUFBYSxDQUFDLEVBQ2xCLEdBQUksQ0FFRixNQUFNQyxFQUFLLE1BREEsTUFBTSxNQUFNLGtDQUFrQyxHQUNyQyxLQUFLLEVBQ3JCQSxFQUFHLFVBQVNELEVBQWFDLEVBQUcsU0FBVyxDQUFDLEVBQzlDLE1BQVksQ0FBQyxDQUdiLE1BQU1DLEVBRGEsT0FBTyxRQUFRNWpCLENBQUksRUFDTCxJQUFJLENBQUMsQ0FBQ29NLEVBQUltTyxDQUFJLElBQU0sQ0FDbkQsTUFBTTdZLEVBQU1naUIsRUFBV3RYLENBQUUsR0FBSyxDQUFFLGFBQWMsR0FBSSxnQkFBaUIsR0FBSSxnQkFBaUIsR0FBSSxZQUFhLEdBQU8sUUFBUyxFQUFNLEVBQy9ILE1BQU87QUFBQSw4QkFDaUJBLENBQUU7QUFBQSx3REFDd0JtTyxFQUFLLE1BQVFuTyxDQUFFO0FBQUEsd0ZBQ2lCMUssRUFBSSxjQUFnQixFQUFFLGlGQUFpRmdNLEVBQVksR0FBSyxVQUFVO0FBQUEsd0ZBQ2xJaE0sRUFBSSxpQkFBbUIsRUFBRSxpRkFBaUZnTSxFQUFZLEdBQUssVUFBVTtBQUFBLHlGQUNwSWhNLEVBQUksaUJBQW1CLEVBQUUsa0ZBQWtGZ00sRUFBWSxHQUFLLFVBQVU7QUFBQSwyRkFDcEloTSxFQUFJLFlBQWMsVUFBWSxFQUFFLElBQUlnTSxFQUFZLEdBQUssVUFBVTtBQUFBO0FBQUEsb0VBRXRGdEIsQ0FBRSxnQkFBZ0JtTyxFQUFLLE1BQVFuTyxDQUFFO0FBQUE7QUFBQTtBQUFBLE9BSWpHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFFSnlYLEVBQWNMLEVBQWEsSUFBSXJYLEdBQVMsQ0FDNUMsTUFBTTJYLEVBQU8sSUFBSSxLQUFLM1gsRUFBTSxTQUFTLEVBQUUsZUFBZSxFQUNoRDRYLEVBQWU1WCxFQUFNLFNBQVcsU0FBTSxTQUM1QyxNQUFPO0FBQUE7QUFBQSxrRkFFcUUyWCxDQUFJO0FBQUEsNERBQzFCM1gsRUFBTSxlQUFpQkEsRUFBTSxXQUFXO0FBQUEsc0VBQzlCQSxFQUFNLFFBQVVBLEVBQU0sSUFBSTtBQUFBLDBDQUN0RCxPQUFPQSxFQUFNLE9BQVUsU0FBV0EsRUFBTSxNQUFNLFFBQVEsQ0FBQyxFQUFJQSxFQUFNLEtBQUssR0FBR0EsRUFBTSxTQUFXLE9BQVMsUUFBVSxHQUFHO0FBQUEsOERBQzVGNFgsQ0FBWTtBQUFBLG9FQUNONVgsRUFBTSxxQkFBdUIsVUFBWSxjQUFjLE1BQU1BLEVBQU0scUJBQXVCLFNBQU0sRUFBRTtBQUFBO0FBQUEsT0FHbEssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUVKNlgsRUFBZ0J0VyxFQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQWtCakJrVyxDQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRSjdCLEVBQWdCLFVBQVk7QUFBQSxRQUN4QmlDLENBQWE7QUFBQTtBQUFBO0FBQUEsVUFHWEgsRUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQWFEQSxDQUFXO0FBQUE7QUFBQTtBQUFBLFVBR3RCLG9HQUFvRztBQUFBO0FBQUEsTUFLNUcsU0FBUyxlQUFlLGlCQUFpQixHQUFHLGlCQUFpQixRQUFTLFNBQVksQ0FDaEYsTUFBTUksRUFBVSxDQUFDLEVBQ2pCLFNBQVMsaUJBQWlCLDRDQUE0QyxFQUFFLFFBQVFsYSxHQUFPLENBQ3JGLE1BQU1tYSxFQUFNbmEsRUFBSSxRQUFRLFVBQ3hCa2EsRUFBUUMsQ0FBRyxFQUFJLENBQ2IsYUFBYyxTQUFTbmEsRUFBSSxjQUFjLFlBQVksR0FBRyxLQUFLLEdBQUssR0FDbEUsZ0JBQWlCLFNBQVNBLEVBQUksY0FBYyxZQUFZLEdBQUcsS0FBSyxHQUFLLEdBQ3JFLGdCQUFpQixTQUFTQSxFQUFJLGNBQWMsYUFBYSxHQUFHLEtBQUssR0FBSyxHQUN0RSxZQUFhLENBQUMsQ0FBQ0EsRUFBSSxjQUFjLG9CQUFvQixHQUFHLFFBQ3hELFFBQVMsRUFDWCxDQUNGLENBQUMsRUFDRCxHQUFJLENBTUYsTUFBTTBJLEVBQUksTUFMRSxNQUFNLFlBQVksbUNBQW9DLENBQ2hFLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsUUFBQXdSLENBQVEsQ0FBQyxDQUNsQyxDQUFDLEdBQ21CLEtBQUssRUFDbkI5akIsRUFBTSxTQUFTLGVBQWUsaUJBQWlCLEVBQ3JEQSxFQUFJLFlBQWNzUyxFQUFFLFFBQVUsZUFBWSxnQkFDMUMsV0FBVyxJQUFNLENBQUV0UyxFQUFJLFlBQWMsVUFBWSxFQUFHLEdBQUksQ0FDMUQsTUFBWSxDQUNWLE1BQU1BLEVBQU0sU0FBUyxlQUFlLGlCQUFpQixFQUNyREEsRUFBSSxZQUFjLGVBQ2xCLFdBQVcsSUFBTSxDQUFFQSxFQUFJLFlBQWMsVUFBWSxFQUFHLEdBQUksQ0FDMUQsQ0FDRixDQUFDLEVBR0QsU0FBUyxlQUFlLHFCQUFxQixHQUFHLGlCQUFpQixRQUFVSixHQUFNLENBQy9FQSxFQUFFLGVBQWUsRUFDakJtRixFQUFNLFVBQVUsT0FBTyxNQUFNLEVBQzdCaWYsRUFBZ0IsRUFDaEIsU0FBUyxlQUFlLHNCQUFzQixHQUFHLE1BQU0sQ0FDekQsQ0FBQyxFQUdELFNBQVMsaUJBQWlCLGlCQUFpQixFQUFFLFFBQVFoa0IsR0FBTyxDQUMxREEsRUFBSSxpQkFBaUIsUUFBUyxTQUFZLENBQ3hDLE1BQU1pa0IsRUFBT2prQixFQUFJLFlBQ2pCQSxFQUFJLFlBQWMsTUFDbEIsR0FBSSxDQUNGLE1BQU0sWUFBWSw2QkFBNkJBLEVBQUksUUFBUSxTQUFTLFFBQVMsQ0FBRSxPQUFRLE1BQU8sQ0FBQyxFQUMvRkEsRUFBSSxZQUFjLFNBQ2xCLGlCQUFpQix1QkFBeUJBLEVBQUksUUFBUSxLQUFNLFVBQVcsR0FBSSxDQUM3RSxNQUFZLENBQ1ZBLEVBQUksWUFBYyxRQUNwQixDQUNBLFdBQVcsSUFBTSxDQUFFQSxFQUFJLFlBQWNpa0IsQ0FBTSxFQUFHLEdBQUksQ0FDcEQsQ0FBQyxDQUNILENBQUMsRUFHRCxTQUFTLGVBQWUsb0JBQW9CLEdBQUcsaUJBQWlCLFFBQVMsSUFBTSxDQUM3RWxmLEVBQU0sVUFBVSxPQUFPLE1BQU0sRUFDN0JpZixFQUFnQixFQUNaLE9BQU8sa0JBQXFCLFlBQVksaUJBQWlCLENBQy9ELENBQUMsQ0FDSCxDQUVBLFNBQVNFLEdBQW1CLENBQ3RCcEMsR0FBaUIsY0FBY0EsQ0FBZSxFQUM5Q0osR0FBcUIsVUFDdkJJLEVBQWtCLFlBQVlRLEVBQVcsR0FBRyxLQUFLLEtBQUssRUFFMUQsQ0FFQSxTQUFTMEIsR0FBa0IsQ0FDckJsQyxJQUNGLGNBQWNBLENBQWUsRUFDN0JBLEVBQWtCLEtBRXRCLENBR0F4SixHQUFTLGlCQUFpQixRQUFTLElBQU0sQ0FDdkN2VCxFQUFNLFVBQVUsSUFBSSxNQUFNLEVBQzFCdWQsRUFBVSxFQUNWNEIsRUFBaUIsQ0FDbkIsQ0FBQyxFQUdEMVcsR0FBVyxpQkFBaUIsUUFBUyxJQUFNLENBQ3pDekksRUFBTSxVQUFVLE9BQU8sTUFBTSxFQUM3QmlmLEVBQWdCLENBQ2xCLENBQUMsRUFFRGpmLEdBQU8saUJBQWlCLFFBQVVuRixHQUFNLENBQ2xDQSxFQUFFLFNBQVdtRixJQUNmQSxFQUFNLFVBQVUsT0FBTyxNQUFNLEVBQzdCaWYsRUFBZ0IsRUFFcEIsQ0FBQyxFQUVEM1MsR0FBWSxpQkFBaUIsUUFBU2lSLENBQVMsRUFFL0NaLEdBQXFCLGlCQUFpQixTQUFVLElBQU0sQ0FDaERBLEVBQW9CLFFBQVN3QyxFQUFpQixFQUM3Q0YsRUFBZ0IsQ0FDdkIsQ0FBQyxFQUdELFNBQVMsY0FBYyxpQ0FBaUMsR0FBRyxpQkFBaUIsUUFBU2IsQ0FBYyxFQUNuRyxTQUFTLGNBQWMsNkJBQTZCLEdBQUcsaUJBQWlCLFFBQVNDLENBQVUsRUFHM0YsTUFBTWUsRUFBeUIsU0FBUyxlQUFlLHlCQUF5QixFQUMxRUMsRUFBYyxTQUFTLGVBQWUsOEJBQThCLEVBQ3BFQyxFQUFlLFNBQVMsaUJBQWlCLGtCQUFrQixFQUVqRSxJQUFJQyxFQUFlLEtBRW5CLFNBQVNDLEVBQVVDLEVBQU8sQ0FDeEIsT0FBUUEsRUFBTyxDQUNiLElBQUssS0FBTyxNQUFPLE1BQVUsSUFDN0IsSUFBSyxNQUFPLE1BQU8sTUFBVSxHQUFLLElBQ2xDLElBQUssS0FBTyxNQUFPLE9BQWMsR0FBSyxJQUN0QyxJQUFLLE1BQU8sTUFBTyxLQUFVLEdBQUssR0FBSyxJQUN2QyxJQUFLLEtBQU8sTUFBTyxLQUFNLEdBQUssR0FBSyxHQUFLLElBQ3hDLFFBQVksTUFBTyxNQUFVLEdBQy9CLENBQ0YsQ0FFQSxTQUFTQyxFQUFVQyxFQUFNLENBQ3ZCLE9BQUlBLElBQVMsTUFBYyxxQkFDdkJBLElBQVMsU0FBaUIsaUJBQzFCQSxJQUFTLFFBQWdCLGdCQUN0QkEsQ0FDVCxDQUdBLFNBQVNDLEVBQWdCQyxFQUFTQyxFQUFVQyxFQUFPbFUsRUFBT3NILEVBQU0sQ0FDOUQsR0FBSSxDQUFDME0sR0FBV0EsRUFBUSxTQUFXLEVBQ2pDLE1BQU8sb0ZBQW9GLFdBQVdoVSxDQUFLLENBQUMsU0FFOUcsTUFBTW1VLEVBQVNILEVBQVEsSUFBSUMsQ0FBUSxFQUFFLE9BQU90YixHQUFLQSxHQUFLLElBQUksRUFDMUQsR0FBSXdiLEVBQU8sU0FBVyxFQUNwQixNQUFPLG9GQUFvRixXQUFXblUsQ0FBSyxDQUFDLFNBRTlHLE1BQU1vVSxFQUFNLEtBQUssSUFBSSxHQUFHRCxFQUFRLENBQUMsRUFDM0JFLEVBQU0sS0FBSyxJQUFJLEdBQUdGLEVBQVEsQ0FBQyxFQUMzQlAsRUFBUVEsRUFBTUMsR0FBTyxFQUNyQkMsRUFBSSxJQUFLQyxFQUFJLEdBQUlDLEVBQU0sRUFDdkJDLEdBQVNILEVBQUlFLEVBQU0sR0FBSyxLQUFLLElBQUlMLEVBQU8sT0FBUyxFQUFHLENBQUMsRUFDckRPLEVBQVNQLEVBQU8sSUFBSSxDQUFDeGIsRUFBR0UsSUFBTSxDQUNsQyxNQUFNOGIsRUFBSUgsRUFBTTNiLEVBQUk0YixFQUNkRyxFQUFJTCxFQUFJQyxHQUFRN2IsRUFBSTBiLEdBQU9ULEdBQVVXLEVBQUlDLEVBQU0sR0FDckQsTUFBTyxHQUFHRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUlDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFDeEMsQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUNMQyxFQUFPVixFQUFPQSxFQUFPLE9BQVMsQ0FBQyxFQUMvQlcsRUFBTVgsRUFBTyxPQUFPLENBQUNsZixFQUFHQyxJQUFNRCxFQUFJQyxFQUFHLENBQUMsRUFBSWlmLEVBQU8sT0FDdkQsTUFBTztBQUFBO0FBQUE7QUFBQSwrREFHb0QsV0FBV25VLENBQUssQ0FBQztBQUFBLHdFQUNSNlUsRUFBSyxRQUFRLENBQUMsQ0FBQyxHQUFHdk4sQ0FBSSxhQUFVd04sRUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHeE4sQ0FBSSxhQUFVOE0sRUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHOU0sQ0FBSTtBQUFBO0FBQUEsNEJBRWhJZ04sQ0FBQyxJQUFJQyxDQUFDLDREQUE0REEsQ0FBQztBQUFBLDBDQUNyREwsQ0FBSyxnQ0FBZ0NRLENBQU07QUFBQTtBQUFBO0FBQUEsS0FJbkYsQ0FFQSxTQUFTSyxHQUFpQyxDQUN4QyxHQUFJLENBQUN4QixFQUF3QixPQUM3QixNQUFNdGtCLEVBQU9raUIsR0FBd0IsQ0FBQyxFQUNoQzZELEVBQVd6QixFQUF1QixNQUNsQzBCLEVBQVUsT0FBTyxRQUFRaG1CLENBQUksRUFDbkMsR0FBSWdtQixFQUFRLFNBQVcsRUFBRyxDQUN4QjFCLEVBQXVCLFVBQVksMENBQ25DLE1BQ0YsQ0FDQUEsRUFBdUIsVUFBWTBCLEVBQ2hDLElBQUksQ0FBQyxDQUFDNVosRUFBSW1PLENBQUksSUFBTSxrQkFBa0IsV0FBV25PLENBQUUsQ0FBQyxLQUFLLFdBQVdtTyxFQUFLLE1BQVFuTyxDQUFFLENBQUMsV0FBVyxFQUMvRixLQUFLLEVBQUUsRUFDTjJaLEdBQVkvbEIsRUFBSytsQixDQUFRLElBQUd6QixFQUF1QixNQUFReUIsRUFDakUsQ0FFQSxlQUFlRSxHQUFjLENBQzNCLEdBQUksQ0FBQzFCLEdBQWUsQ0FBQ0QsRUFBd0IsT0FDN0MsTUFBTWpPLEVBQWNpTyxFQUF1QixNQUMzQyxHQUFJLENBQUNqTyxFQUFhLENBQ2hCa08sRUFBWSxVQUFZLGlHQUN4QixNQUNGLENBQ0EsTUFBTTJCLEVBQVUsS0FBSyxJQUFJLEVBQ25CQyxFQUFZRCxFQUFVeEIsRUFBVUQsQ0FBWSxFQUNsREYsRUFBWSxVQUFZLHdGQUV4QixHQUFJLENBRUYsTUFBTXZrQixFQUFPLE1BREQsTUFBTSxNQUFNLDhCQUE4QixtQkFBbUJxVyxDQUFXLENBQUMsY0FBYzhQLENBQVMsWUFBWUQsQ0FBTyxFQUFFLEdBQzFHLEtBQUssRUFDNUIsR0FBSSxDQUFDbG1CLEVBQUssUUFBUyxNQUFNLElBQUksTUFBTUEsRUFBSyxPQUFTLHdCQUF3QixFQUV6RSxNQUFNK2tCLEVBQVUva0IsRUFBSyxTQUFXLENBQUMsRUFDM0I2a0IsRUFBTzdrQixFQUFLLE1BQVEsTUFFMUIsR0FBSStrQixFQUFRLFNBQVcsRUFBRyxDQUN4QlIsRUFBWSxVQUFZLDBGQUFtRkUsQ0FBWSxXQUFXRyxFQUFVQyxDQUFJLENBQUMsVUFDakosTUFDRixDQUdBLE1BQU11QixFQUFRdkIsSUFBUyxNQUNqQndCLEVBQWNELEVBQVMvVixHQUFNQSxFQUFFLEtBQUssUUFBV0EsR0FBTUEsRUFBRSxLQUFLLElBQzVEaVcsRUFBY0YsRUFBUy9WLEdBQU1BLEVBQUUsUUFBUSxRQUFXQSxHQUFNQSxFQUFFLFFBQVEsV0FDbEVrVyxFQUFnQkgsRUFBUy9WLEdBQU9BLEVBQUUsU0FBUyxNQUFRLEVBQU1BLEdBQU9BLEVBQUUsU0FBUyxNQUFRLEVBQ25GbVcsRUFBZ0JKLEVBQVMvVixHQUFPQSxFQUFFLFNBQVMsTUFBUSxFQUFNQSxHQUFPQSxFQUFFLFNBQVMsTUFBUSxFQUV6RixJQUFJM04sRUFBTztBQUFBO0FBQUEsWUFFTHFpQixFQUFRLE1BQU0saUJBQWMsV0FBV0gsRUFBVUMsQ0FBSSxDQUFDLENBQUMsU0FBTSxJQUFJLEtBQUtzQixDQUFTLEVBQUUsZUFBZSxDQUFDLFdBQU0sSUFBSSxLQUFLRCxDQUFPLEVBQUUsZUFBZSxDQUFDO0FBQUE7QUFBQSxRQUcvSXhqQixHQUFRb2lCLEVBQWdCQyxFQUFTc0IsRUFBYSxVQUFXLE1BQU8sR0FBRyxFQUNuRTNqQixHQUFRb2lCLEVBQWdCQyxFQUFTdUIsRUFBYSxVQUFXLFNBQVUsR0FBRyxFQUN0RTVqQixHQUFRb2lCLEVBQWdCQyxFQUFTd0IsRUFBZSxVQUFXLGFBQWMsS0FBSyxFQUM5RTdqQixHQUFRb2lCLEVBQWdCQyxFQUFTeUIsRUFBZSxVQUFXLGFBQWMsS0FBSyxFQUU5RWpDLEVBQVksVUFBWTdoQixDQUMxQixPQUFTLEVBQUcsQ0FDVjZoQixFQUFZLFVBQVksZ0dBQXNGLFdBQVcsRUFBRSxPQUFPLENBQUMsUUFDckksQ0FDRixDQUVBQyxFQUFhLFFBQVFya0IsR0FBTyxDQUMxQkEsRUFBSSxpQkFBaUIsUUFBUyxJQUFNLENBQ2xDcWtCLEVBQWEsUUFBUXZlLEdBQUtBLEVBQUUsVUFBVSxPQUFPLFFBQVEsQ0FBQyxFQUN0RDlGLEVBQUksVUFBVSxJQUFJLFFBQVEsRUFDMUJza0IsRUFBZXRrQixFQUFJLFFBQVEsTUFDM0I4bEIsRUFBWSxDQUNkLENBQUMsQ0FDSCxDQUFDLEVBRUQzQixHQUF3QixpQkFBaUIsU0FBVTJCLENBQVcsRUFFOUQsU0FBUyxjQUFjLDhCQUE4QixHQUFHLGlCQUFpQixRQUFTLElBQU0sQ0FDdEZILEVBQStCLEVBQy9CRyxFQUFZLENBQ2QsQ0FBQyxDQUNILEdBQUcsR0FHRixVQUFXLENBRVYsWUFBWSxlQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBNEhyQixFQUVQLE1BQU0vZ0IsRUFBUSxTQUFTLGVBQWUsY0FBYyxFQUM5Q3VULEVBQVUsU0FBUyxlQUFlLGtCQUFrQixFQUNwRDlLLEVBQVksU0FBUyxlQUFlLGVBQWUsRUFDbkQ2RCxFQUFhLFNBQVMsZUFBZSxvQkFBb0IsRUFDekRpVixFQUFrQixTQUFTLGVBQWUseUJBQXlCLEVBQ25FQyxFQUFxQixTQUFTLGVBQWUsNEJBQTRCLEVBQ3pFQyxFQUFrQixTQUFTLGVBQWUseUJBQXlCLEVBQ25FM0UsRUFBaUIsU0FBUyxlQUFlLG9CQUFvQixFQUM3RDRFLEVBQVMsU0FBUyxlQUFlLGdCQUFnQixFQUNqREMsRUFBUyxTQUFTLGVBQWUsb0JBQW9CLEVBQ3JEQyxFQUFZLFNBQVMsZUFBZSxtQkFBbUIsRUFDdkRDLEVBQWEsU0FBUyxlQUFlLG9CQUFvQixFQUN6REMsRUFBVyxTQUFTLGVBQWUsa0JBQWtCLEVBR3JEQyxFQUFzQiw0QkFDdEJDLEVBQWtCLENBQUUsY0FBZSxHQUFJLGdCQUFpQixHQUFJLHFCQUFzQixHQUFJLHFCQUFzQixJQUFLLG1CQUFvQixFQUFHLEVBQ3hJQyxFQUFnQixTQUFTLGVBQWUsb0JBQW9CLEVBQzVEQyxFQUFpQixTQUFTLGVBQWUscUJBQXFCLEVBQzlEQyxFQUFtQixTQUFTLGVBQWUsc0JBQXNCLEVBQ2pFQyxFQUFpQixTQUFTLGVBQWUsMEJBQTBCLEVBQ25FQyxFQUFnQixTQUFTLGVBQWUseUJBQXlCLEVBQ2pFQyxFQUFxQixTQUFTLGVBQWUsK0JBQStCLEVBQzVFQyxFQUFrQixTQUFTLGVBQWUsNEJBQTRCLEVBQ3RFQyxFQUFxQixTQUFTLGVBQWUsK0JBQStCLEVBRWxGLFNBQVNDLEdBQXFCLENBQzVCLEdBQUksQ0FDRixNQUFNQyxFQUFNLFFBQVFYLENBQW1CLEVBQ2pDWSxFQUFRRCxFQUFNLEtBQUssTUFBTUEsQ0FBRyxFQUFJLENBQUMsRUFDdkMsT0FBTyxPQUFPLE9BQU8sQ0FBQyxFQUFHVixFQUFpQlcsQ0FBSyxDQUNqRCxNQUFZLENBQ1YsT0FBTyxPQUFPLE9BQU8sQ0FBQyxFQUFHWCxDQUFlLENBQzFDLENBQ0YsQ0FFQSxTQUFTWSxHQUEwQixDQUNqQyxNQUFNelgsRUFBSXNYLEVBQW1CLEVBQ3pCTCxJQUFnQkEsRUFBZSxNQUFRalgsRUFBRSxlQUN6Q2tYLElBQWVBLEVBQWMsTUFBUWxYLEVBQUUsaUJBQ3ZDbVgsSUFBb0JBLEVBQW1CLE1BQVFuWCxFQUFFLHNCQUNqRG9YLElBQWlCQSxFQUFnQixNQUFRcFgsRUFBRSxzQkFDM0NxWCxJQUFvQkEsRUFBbUIsTUFBUXJYLEVBQUUsbUJBQ3ZELENBRUEsU0FBUzBYLEdBQXFCLENBQzVCLE1BQU1DLEVBQVcsQ0FDZixjQUFlLEtBQUssSUFBSSxFQUFHLEtBQUssSUFBSSxLQUFNLFNBQVNWLEdBQWdCLEtBQUssR0FBS0osRUFBZ0IsYUFBYSxDQUFDLEVBQzNHLGdCQUFpQixLQUFLLElBQUksRUFBRyxLQUFLLElBQUksS0FBTSxTQUFTSyxHQUFlLEtBQUssR0FBS0wsRUFBZ0IsZUFBZSxDQUFDLEVBQzlHLHFCQUFzQixLQUFLLElBQUksRUFBRyxLQUFLLElBQUksS0FBTSxTQUFTTSxHQUFvQixLQUFLLEdBQUtOLEVBQWdCLG9CQUFvQixDQUFDLEVBQzdILHFCQUFzQixLQUFLLElBQUksR0FBSSxLQUFLLElBQUksSUFBUSxTQUFTTyxHQUFpQixLQUFLLEdBQUtQLEVBQWdCLG9CQUFvQixDQUFDLEVBQzdILG1CQUFvQixLQUFLLElBQUksR0FBSSxLQUFLLElBQUksR0FBSSxTQUFTUSxHQUFvQixLQUFLLEdBQUtSLEVBQWdCLGtCQUFrQixDQUFDLENBQzFILEVBQ0EsR0FBSSxDQUNGLFFBQVFELEVBQXFCLEtBQUssVUFBVWUsQ0FBUSxDQUFDLEVBQ3JERixFQUF3QixFQUNwQlQsSUFDRkEsRUFBaUIsWUFBYyxlQUMvQkEsRUFBaUIsTUFBTSxNQUFRLGVBQy9CLFdBQVcsSUFBTSxDQUFNQSxJQUFrQkEsRUFBaUIsWUFBYyxHQUFJLEVBQUcsSUFBSSxHQUVqRixPQUFPLGtCQUFxQixZQUFZLGlCQUFpQiwrQkFBZ0MsU0FBUyxDQUN4RyxPQUFTdG5CLEVBQUcsQ0FDTnNuQixJQUFvQkEsRUFBaUIsWUFBYyxjQUFlQSxFQUFpQixNQUFNLE1BQVEsaUJBQ2pHLE9BQU8sa0JBQXFCLFlBQVksaUJBQWlCLDRCQUE4QnRuQixFQUFFLFFBQVMsT0FBTyxDQUMvRyxDQUNGLENBRUEsU0FBU2tvQixHQUFzQixDQUM3QixHQUFJLENBQ0YsUUFBUWhCLEVBQXFCLEtBQUssVUFBVUMsQ0FBZSxDQUFDLENBQzlELE1BQVksQ0FBZSxDQUMzQlksRUFBd0IsRUFDcEJULElBQ0ZBLEVBQWlCLFlBQWMsMkJBQy9CQSxFQUFpQixNQUFNLE1BQVEsZUFDL0IsV0FBVyxJQUFNLENBQU1BLElBQWtCQSxFQUFpQixZQUFjLEdBQUksRUFBRyxJQUFJLEVBRXZGLENBRUFTLEVBQXdCLEVBQ3hCWCxHQUFlLGlCQUFpQixRQUFTWSxDQUFrQixFQUMzRFgsR0FBZ0IsaUJBQWlCLFFBQVNhLENBQW1CLEVBRzdELElBQUlDLEVBQVksS0FFaEIsU0FBU0MsRUFBWUMsRUFBSyxDQUN4QixPQUFJQSxHQUFPLEtBQWEsZUFDcEJBLEdBQU8sR0FBVyxVQUNmLGVBQ1QsQ0FFQSxTQUFTQyxFQUFjQyxFQUFLLENBQzFCLE1BQU1sTyxFQUFTLENBQUUsU0FBVSxnQkFBaUIsS0FBTSxVQUFXLE9BQVEsVUFBVyxJQUFLLGNBQWUsRUFDcEcsTUFBTyxzRkFBc0ZBLEVBQU9rTyxDQUFHLEdBQUssY0FBYyxjQUFjbE8sRUFBT2tPLENBQUcsR0FBSyxjQUFjLE1BQU1BLENBQUcsU0FDaEwsQ0FFQSxlQUFlQyxHQUFhLENBQzFCLEdBQUksQ0FFRixNQUFNdm9CLEVBQU8sTUFERCxNQUFNLE1BQU0sOEJBQThCLEdBQy9CLEtBQUssRUFDNUIsR0FBSSxDQUFDQSxFQUFLLFNBQVcsQ0FBQ0EsRUFBSyxRQUFVLE9BQU8sS0FBS0EsRUFBSyxNQUFNLEVBQUUsU0FBVyxFQUFHLENBQzFFeW1CLEVBQWdCLFVBQVksZ0pBQzVCLE1BQ0YsQ0FDQSxNQUFNN0wsRUFBVyxPQUFPLE9BQU81YSxFQUFLLE1BQU0sRUFDMUMsSUFBSTBDLEVBQU8sOEVBQ1hBLEdBQVEsOEZBQ1JBLEdBQVEsOEVBQ1JBLEdBQVEsb0ZBQ1JBLEdBQVEsNEZBQ1IsVUFBVzJOLEtBQUt1SyxFQUFVLENBQ3hCLE1BQU00TixFQUFPblksRUFBRSxTQUFXLEtBQ3BCb1ksRUFBV0QsRUFBTyxnQkFBa0IsaUJBQ3BDRSxFQUFNclksRUFBRSxTQUFTLEtBQUssR0FBSyxJQUMzQnNZLEVBQU10WSxFQUFFLFNBQVMsSUFBSSxHQUFLLElBQzFCdVksRUFBUXZZLEVBQUUsaUJBQW1CLEtBQU8sS0FBSyxNQUFNQSxFQUFFLGVBQWUsRUFBSSxLQUFPLElBQzNFd1ksRUFBWXhZLEVBQUUsVUFBWSxRQUFRQSxFQUFFLFNBQVMsRUFBSSxJQUN2RDNOLEdBQVEsd0ZBQXdGLFdBQVcyTixFQUFFLFNBQVMsQ0FBQyxLQUN2SDNOLEdBQVEsK0NBQStDLFdBQVcyTixFQUFFLE1BQVFBLEVBQUUsU0FBUyxDQUFDLFFBQ3hGM04sR0FBUSwwSEFBMEgrbEIsQ0FBUSxnQ0FBZ0NELEVBQU8sS0FBTyxNQUFNLFFBQzlMOWxCLEdBQVEsbUNBQW1DLE9BQU9nbUIsR0FBUSxTQUFXUCxFQUFZTyxDQUFHLEVBQUksY0FBYyxNQUFNLE9BQU9BLEdBQVEsU0FBV0EsRUFBSSxRQUFRLENBQUMsRUFBSSxJQUFNQSxDQUFHLFFBQ2hLaG1CLEdBQVEsbUNBQW1DLE9BQU9pbUIsR0FBUSxTQUFXUixFQUFZUSxDQUFHLEVBQUksY0FBYyxNQUFNLE9BQU9BLEdBQVEsU0FBV0EsRUFBSSxRQUFRLENBQUMsRUFBSSxJQUFNQSxDQUFHLFFBQ2hLam1CLEdBQVEsNkJBQTZCa21CLENBQUssUUFDMUNsbUIsR0FBUSxrREFBa0RtbUIsQ0FBUyxRQUNuRW5tQixHQUFRLFFBQ1JBLEdBQVEseUJBQXlCLFdBQVcyTixFQUFFLFNBQVMsQ0FBQyxnT0FDMUQsQ0FDQTNOLEdBQVEsV0FDUitqQixFQUFnQixVQUFZL2pCLEVBQzVCc2YsRUFBZSxZQUFjLFdBQWEsSUFBSSxLQUFLLEVBQUUsbUJBQW1CLEVBR3hFeUUsRUFBZ0IsaUJBQWlCLG9CQUFvQixFQUFFLFFBQVExYyxHQUFPLENBQ3BFQSxFQUFJLGlCQUFpQixRQUFTLFNBQVksQ0FDeEMsTUFBTXFDLEVBQUtyQyxFQUFJLFFBQVEsU0FDakIrZSxFQUFZLFNBQVMsZUFBZSxpQkFBbUIxYyxDQUFFLEVBQy9ELEdBQUswYyxFQUNMLElBQUlBLEVBQVUsTUFBTSxVQUFZLE9BQVEsQ0FDdENBLEVBQVUsTUFBTSxRQUFVLE9BQzFCLE1BQ0YsQ0FDQUEsRUFBVSxNQUFNLFFBQVUsR0FDMUIsR0FBSSxDQUVGLE1BQU1yVyxFQUFJLE1BREEsTUFBTSxNQUFNLHlCQUF5QnJHLENBQUUsaUJBQWlCLEdBQ2hELEtBQUssRUFDdkIsR0FBSXFHLEVBQUUsU0FBV0EsRUFBRSxNQUFPLENBQ3hCLE1BQU15SixFQUFLekosRUFBRSxNQUNQc1csRUFBSzdNLEVBQUcsY0FBZ0IsQ0FBQyxFQUMvQjRNLEVBQVUsY0FBYyxJQUFJLEVBQUUsVUFBWTtBQUFBO0FBQUEsMkZBRW1DNU0sRUFBRyxhQUFlLENBQUM7QUFBQSxtR0FDWGlNLEVBQVlqTSxFQUFHLFFBQVUsQ0FBQyxDQUFDLE9BQU9BLEVBQUcsUUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQUEsMkZBQ3BFLEtBQUssTUFBTTZNLEVBQUcsS0FBTyxDQUFDLENBQUM7QUFBQSx3RkFDMUIsS0FBSyxNQUFNQSxFQUFHLEtBQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNQSxFQUFHLEtBQU8sQ0FBQyxDQUFDO0FBQUEsMkZBQ25ELEtBQUssTUFBTUEsRUFBRyxLQUFPLENBQUMsQ0FBQztBQUFBLDJGQUN2QixLQUFLLE1BQU1BLEVBQUcsS0FBTyxDQUFDLENBQUM7QUFBQSxxSEFDRzdNLEVBQUcsVUFBWSxDQUFDO0FBQUEsd0hBQ2JBLEVBQUcsWUFBYyxDQUFDO0FBQUEsdUJBRTlILE1BQ0U0TSxFQUFVLGNBQWMsSUFBSSxFQUFFLFVBQVksNkVBRTlDLE9BQVMvb0IsRUFBRyxDQUNWK29CLEVBQVUsY0FBYyxJQUFJLEVBQUUsVUFBWSxrRUFBa0UsV0FBVy9vQixFQUFFLE9BQU8sQ0FBQyxRQUNuSSxFQUNGLENBQUMsQ0FDSCxDQUFDLENBQ0gsT0FBU0EsRUFBRyxDQUNWMG1CLEVBQWdCLFVBQVksd0ZBQXdGLFdBQVcxbUIsRUFBRSxPQUFPLENBQUMsUUFDM0ksQ0FDRixDQUVBLGVBQWVpcEIsR0FBZ0IsQ0FDN0IsR0FBSSxDQUNGLEtBQU0sQ0FBQ0MsRUFBU0MsQ0FBTyxFQUFJLE1BQU0sUUFBUSxJQUFJLENBQzNDLE1BQU0saUNBQWlDLEVBQ3ZDLE1BQU0sa0RBQWtELENBQzFELENBQUMsRUFDS0MsRUFBVyxNQUFNRixFQUFRLEtBQUssRUFDOUJHLEVBQVcsTUFBTUYsRUFBUSxLQUFLLEVBQ3BDLElBQUl4bUIsRUFBTyxHQUdYLE1BQU0ybUIsRUFBUUYsRUFBUyxTQUFXQSxFQUFTLFVBQWFBLEVBQVMsVUFBWSxDQUFDLEVBQzlFLEdBQUlFLEVBQUssT0FBUyxFQUFHLENBQ25CM21CLEdBQVEsd0dBQTBHMm1CLEVBQUssT0FBUyxTQUNoSSxVQUFXQyxLQUFPRCxFQUNoQjNtQixHQUFRO0FBQUE7QUFBQSxnREFFOEIsV0FBVzRtQixFQUFJLFNBQVMsQ0FBQztBQUFBLHNCQUNuRGpCLEVBQWNpQixFQUFJLFFBQVEsQ0FBQztBQUFBO0FBQUEscUZBRW9DLFdBQVdBLEVBQUksT0FBTyxDQUFDO0FBQUEsNkZBQ2YsUUFBUUEsRUFBSSxTQUFTLENBQUMsU0FBTUEsRUFBSSxhQUFlLENBQUM7QUFBQSxrQkFHckk1bUIsR0FBUSxRQUNWLE1BQ0VBLEdBQVEsdVBBSVYsTUFBTTZtQixFQUFXSCxFQUFTLFNBQVdBLEVBQVMsUUFBV0EsRUFBUyxRQUFVLENBQUMsRUFDN0UsR0FBSUcsRUFBUSxPQUFTLEVBQUcsQ0FDdEI3bUIsR0FBUSwwRUFDUkEsR0FBUSw4RUFDUkEsR0FBUSw0WkFDUixVQUFXNG1CLEtBQU9DLEVBQVMsQ0FDekIsTUFBTUMsRUFBV0YsRUFBSSxTQUFXLFdBQzFCRyxFQUFNRCxHQUFZRixFQUFJLFNBQVlBLEVBQUksU0FBVyxJQUFRLEtBQUssTUFBTUEsRUFBSSxTQUFXLEdBQUksRUFBSSxJQUFNLEtBQUssTUFBTUEsRUFBSSxTQUFXLEdBQUssRUFBSSxJQUFPLElBQ2pKNW1CLEdBQVEsdURBQ1JBLEdBQVEsNkJBQTZCLFdBQVc0bUIsRUFBSSxTQUFTLENBQUMsUUFDOUQ1bUIsR0FBUSw2QkFBNkIsV0FBVzRtQixFQUFJLElBQUksQ0FBQyxRQUN6RDVtQixHQUFRLDZCQUE2QjJsQixFQUFjaUIsRUFBSSxRQUFRLENBQUMsUUFDaEU1bUIsR0FBUSxpREFBaUQ4bUIsRUFBVyxlQUFpQixlQUFlLE1BQU1GLEVBQUksTUFBTSxlQUNwSDVtQixHQUFRLDZCQUE2QittQixDQUFHLFFBQ3hDL21CLEdBQVEsa0RBQWtELFFBQVE0bUIsRUFBSSxTQUFTLENBQUMsUUFDaEY1bUIsR0FBUSxPQUNWLENBQ0FBLEdBQVEsVUFDVixDQUVBZ2tCLEVBQW1CLFVBQVloa0IsR0FBUSxvR0FDekMsT0FBUzNDLEVBQUcsQ0FDVjJtQixFQUFtQixVQUFZLGtFQUFrRSxXQUFXM21CLEVBQUUsT0FBTyxDQUFDLFFBQ3hILENBQ0YsQ0FFQSxlQUFlMnBCLEdBQWEsQ0FDMUIsR0FBSSxDQUVGLE1BQU0xcEIsRUFBTyxNQURELE1BQU0sTUFBTSw4QkFBOEIsR0FDL0IsS0FBSyxFQUN0QjRhLEVBQVc1YSxFQUFLLFNBQVdBLEVBQUssT0FBUyxPQUFPLE9BQU9BLEVBQUssTUFBTSxFQUFJLENBQUMsRUFDN0UsR0FBSTRhLEVBQVMsU0FBVyxFQUFHLENBQ3pCK0wsRUFBZ0IsVUFBWSw4SUFDNUIsTUFDRixDQUNBLElBQUlqa0IsRUFBTyw4RUFDWEEsR0FBUSxvVEFDUixVQUFXMk4sS0FBS3VLLEVBQVUsQ0FDeEIsTUFBTTROLEVBQU9uWSxFQUFFLFNBQVcsS0FDMUIzTixHQUFRLHVEQUNSQSxHQUFRLCtDQUErQyxXQUFXMk4sRUFBRSxNQUFRQSxFQUFFLFNBQVMsQ0FBQyxRQUN4RjNOLEdBQVEsbUNBQW1DOGxCLEVBQU8sZUFBaUIsZUFBZSxNQUFNQSxFQUFPLEtBQU8sTUFBTSxRQUM1RzlsQixHQUFRLDZCQUE2QjJOLEVBQUUsS0FBSyxPQUFTQSxFQUFFLElBQUksT0FBUyxJQUFNLEdBQUcsUUFDN0UzTixHQUFRLGdEQUNSQSxHQUFRLDZEQUE2RCxXQUFXMk4sRUFBRSxTQUFTLENBQUMsb0ZBQzVGM04sR0FBUSwrREFBK0QsV0FBVzJOLEVBQUUsU0FBUyxDQUFDLHNIQUM5RjNOLEdBQVEsWUFDVixDQUNBQSxHQUFRLFdBQ1Jpa0IsRUFBZ0IsVUFBWWprQixFQUc1QmlrQixFQUFnQixpQkFBaUIsc0JBQXNCLEVBQUUsUUFBU3htQixHQUFRLENBQ3hFQSxFQUFJLGlCQUFpQixRQUFTLElBQU0sQ0FDbEMsU0FBUyxjQUFjLElBQUksWUFBWUEsRUFBSSxRQUFRLGFBQWMsQ0FBRSxPQUFRQSxFQUFJLFFBQVEsU0FBVSxDQUFDLENBQUMsQ0FDckcsQ0FBQyxDQUNILENBQUMsQ0FDSCxPQUFTSixFQUFHLENBQ1Y0bUIsRUFBZ0IsVUFBWSxrRUFBa0UsV0FBVzVtQixFQUFFLE9BQU8sQ0FBQyxRQUNySCxDQUNGLENBRUEsU0FBUzRwQixFQUFTdmQsRUFBSTJNLEVBQU1sTyxFQUFLK2UsRUFBU0MsRUFBT0MsRUFBS0MsRUFBTSxDQUMxRDdCLEVBQVk5YixHQUFNLEtBQ2xCMGEsRUFBVSxZQUFjMWEsRUFBSyxvQkFBc0IsbUJBQ25ELFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxNQUFRQSxHQUFNLEdBQ3hELFNBQVMsZUFBZSxnQkFBZ0IsRUFBRSxTQUFXLENBQUMsQ0FBQ0EsRUFDdkQsU0FBUyxlQUFlLGtCQUFrQixFQUFFLE1BQVEyTSxHQUFRLEdBQzVELFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFRbE8sR0FBTyxHQUMxRCxTQUFTLGVBQWUscUJBQXFCLEVBQUUsTUFBUStlLEdBQVcsSUFDbEUsU0FBUyxlQUFlLG1CQUFtQixFQUFFLE1BQVFDLEdBQVMsTUFDOUQsU0FBUyxlQUFlLGlCQUFpQixFQUFFLE1BQVFDLEdBQU8sS0FDMUQsU0FBUyxlQUFlLGtCQUFrQixFQUFFLE1BQVFDLEdBQVEsSUFDNURsRCxFQUFPLE1BQU0sUUFBVSxHQUN2QkQsRUFBTyxNQUFNLFFBQVUsTUFDekIsQ0FFQSxTQUFTb0QsR0FBVyxDQUNsQm5ELEVBQU8sTUFBTSxRQUFVLE9BQ3ZCRCxFQUFPLE1BQU0sUUFBVSxHQUN2QnNCLEVBQVksSUFDZCxDQUVBdEIsR0FBUSxpQkFBaUIsUUFBUyxJQUFNK0MsRUFBUyxHQUFJLEdBQUksR0FBSSxJQUFPLE1BQU8sS0FBTSxHQUFJLENBQUMsRUFDdEY1QyxHQUFZLGlCQUFpQixRQUFTaUQsQ0FBUSxFQUU5Q2hELEdBQVUsaUJBQWlCLFFBQVMsU0FBWSxDQUM5QyxNQUFNNWEsRUFBSzhiLEdBQWEsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSyxFQUM3RSxHQUFJLENBQUM5YixFQUFJLE9BQU8saUJBQWlCLHlCQUEwQixTQUFTLEVBQ3BFLE1BQU12QixFQUFNLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxNQUFNLEtBQUssRUFDbEUsR0FBSSxDQUFDQSxFQUFLLE9BQU8saUJBQWlCLGtCQUFtQixTQUFTLEVBRTlELE1BQU1nZixFQUFRLFNBQVMsZUFBZSxtQkFBbUIsRUFBRSxNQUFNLE1BQU0sR0FBRyxFQUFFLElBQUluYSxHQUFLLFNBQVNBLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLE9BQU8sRUFDakh1YSxFQUFPLENBQ1gsS0FBTSxTQUFTLGVBQWUsa0JBQWtCLEVBQUUsTUFBTSxLQUFLLEdBQUs3ZCxFQUNsRSxJQUFBdkIsRUFDQSxRQUFTLFNBQVMsU0FBUyxlQUFlLHFCQUFxQixFQUFFLEtBQUssR0FBSyxJQUMzRSxvQkFBcUJnZixFQUFNLE9BQVNBLEVBQVEsQ0FBQyxHQUFHLEVBQ2hELElBQUssQ0FBRSxPQUFRLFdBQVcsU0FBUyxlQUFlLGlCQUFpQixFQUFFLEtBQUssR0FBSyxJQUFLLEVBQ3BGLHNCQUF1QixTQUFTLFNBQVMsZUFBZSxrQkFBa0IsRUFBRSxLQUFLLEdBQUssR0FDeEYsRUFFQSxHQUFJLENBQ0Y3QyxFQUFTLFlBQWMsWUFDdkJBLEVBQVMsU0FBVyxHQU1wQixNQUFNaG5CLEVBQU8sTUFMRCxNQUFNLFlBQVkseUJBQXlCLG1CQUFtQm9NLENBQUUsQ0FBQyxhQUFjLENBQ3pGLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVNmQsQ0FBSSxDQUMzQixDQUFDLEdBQ3NCLEtBQUssRUFDNUIsR0FBSSxDQUFDanFCLEVBQUssUUFBUyxNQUFNLElBQUksTUFBTUEsRUFBSyxPQUFTLGFBQWEsRUFDOURncUIsRUFBUyxFQUNUTixFQUFXLEVBQ1huQixFQUFXLENBQ2IsT0FBU3hvQixFQUFHLENBQ1YsaUJBQWlCLFVBQVlBLEVBQUUsUUFBUyxPQUFPLENBQ2pELFFBQUUsQ0FDQWluQixFQUFTLFlBQWMsT0FDdkJBLEVBQVMsU0FBVyxFQUN0QixDQUNGLENBQUMsRUFFRCxTQUFTLGlCQUFpQixjQUFlLE1BQU9qbkIsR0FBTSxDQUNwRCxNQUFNcU0sRUFBS3JNLEVBQUUsT0FFYjRwQixFQUFTdmQsRUFBSSxHQUFJLEdBQUksSUFBTyxNQUFPLEtBQU0sR0FBSSxDQUMvQyxDQUFDLEVBRUQsU0FBUyxpQkFBaUIsZ0JBQWlCLE1BQU9yTSxHQUFNLENBQ3RELE1BQU1xTSxFQUFLck0sRUFBRSxPQUNiLEdBQUssUUFBUSw0QkFBNEJxTSxDQUFFLElBQUksRUFDL0MsR0FBSSxDQUVGLE1BQU1wTSxFQUFPLE1BREQsTUFBTSxZQUFZLHlCQUF5QixtQkFBbUJvTSxDQUFFLENBQUMsYUFBYyxDQUFFLE9BQVEsUUFBUyxDQUFDLEdBQ3hGLEtBQUssRUFDNUIsR0FBSSxDQUFDcE0sRUFBSyxRQUFTLE1BQU0sSUFBSSxNQUFNQSxFQUFLLEtBQUssRUFDN0MwcEIsRUFBVyxFQUNYbkIsRUFBVyxDQUNiLE9BQVNuWSxFQUFLLENBQ1osaUJBQWlCLFVBQVlBLEVBQUksUUFBUyxPQUFPLENBQ25ELENBQ0YsQ0FBQyxFQUVEcUksR0FBUyxpQkFBaUIsUUFBUyxJQUFNLENBQ3ZDdlQsR0FBTyxVQUFVLElBQUksTUFBTSxFQUMzQnFqQixFQUFXLENBQ2IsQ0FBQyxFQUNELFVBQVVyakIsRUFBT3lJLENBQVMsRUFDMUI2RCxHQUFZLGlCQUFpQixRQUFTK1csQ0FBVSxFQUdoRCxTQUFTLGNBQWMsaUNBQWlDLEdBQUcsaUJBQWlCLFFBQVNTLENBQWEsRUFDbEcsU0FBUyxjQUFjLDhCQUE4QixHQUFHLGlCQUFpQixRQUFTVSxDQUFVLENBQzlGLEdBQUcsR0FHRixVQUFXLENBRVYsWUFBWSxnQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBMEV0QixFQUVQLE1BQU14a0IsRUFBUSxTQUFTLGVBQWUsZUFBZSxFQUMvQ3VULEVBQVUsU0FBUyxlQUFlLGFBQWEsRUFDL0M5SyxFQUFZLFNBQVMsZUFBZSxnQkFBZ0IsRUFDcER1YyxFQUFXLFNBQVMsZUFBZSxtQkFBbUIsRUFDdERDLEVBQXFCLFNBQVMsZUFBZSw2QkFBNkIsRUFDMUV0TCxFQUFtQixTQUFTLGVBQWUsMkJBQTJCLEVBQ3RFdUwsRUFBZ0IsU0FBUyxlQUFlLHdCQUF3QixFQUNoRUMsRUFBZ0IsU0FBUyxlQUFlLG9CQUFvQixFQUVsRSxlQUFlQyxHQUFnQixDQUM3QixHQUFJLENBRUYsTUFBTXRxQixFQUFPLE1BREQsTUFBTSxNQUFNLDJCQUEyQixHQUM1QixLQUFLLEVBQzVCLEdBQUksQ0FBQ0EsRUFBSyxRQUFTLE1BQU0sSUFBSSxNQUFNQSxFQUFLLEtBQUssRUFFN0MsTUFBTW1nQixFQUFVbmdCLEVBQUssU0FBVyxDQUFDLEVBQ2pDLEdBQUltZ0IsRUFBUSxTQUFXLEVBQUcsQ0FDeEJnSyxFQUFtQixVQUFZLHNHQUMvQkUsRUFBYyxZQUFjLEdBQzVCLFNBQVMsZUFBZSx3QkFBd0IsRUFBRSxNQUFNLFFBQVUsT0FDbEUsU0FBUyxlQUFlLHFCQUFxQixFQUFFLE1BQU0sUUFBVSxPQUMvRCxPQUFPLGdCQUFrQixDQUFDLEVBQzFCLE1BQ0YsQ0FFQSxJQUFJM25CLEVBQU8sOEVBQ1hBLEdBQVEseVdBQ1IsVUFBVzZuQixLQUFLcEssRUFBUyxDQUV2QixNQUFNeGEsR0FBUyxJQUFNLENBQ25CLE1BQU1JLEVBQU8sT0FBTyxNQUFRLENBQUMsRUFDN0IsVUFBV0MsS0FBS0QsRUFDZCxHQUFJQyxFQUFFLGNBQWdCdWtCLEVBQUUsYUFBZXZrQixFQUFFLE9BQVN1a0IsRUFBRSxlQUFpQnZrQixFQUFFLEtBQU91a0IsRUFBRSxjQUFlLE9BQU92a0IsRUFBRSxHQUUxRyxPQUFPdWtCLEVBQUUsYUFDWCxHQUFHLEVBQ0g3bkIsR0FBUSxvQkFBb0IsV0FBV2lELENBQUssQ0FBQyxxREFDN0NqRCxHQUFRLCtDQUErQyxXQUFXNm5CLEVBQUUsYUFBYSxDQUFDLFFBQ2xGN25CLEdBQVEsa0RBQWtELFdBQVc2bkIsRUFBRSxTQUFTLENBQUMsUUFDakY3bkIsR0FBUSw0SEFBNEgsV0FBVzZuQixFQUFFLGFBQWEsQ0FBQyxlQUMvSjduQixHQUFRLG9KQUFvSixXQUFXNm5CLEVBQUUsWUFBWSxDQUFDLGVBQ3RMN25CLEdBQVEsZ0RBQ1JBLEdBQVEsMkNBQTJDLFdBQVc2bkIsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLFdBQVdBLEVBQUUsYUFBYSxDQUFDLGdLQUN2SDduQixHQUFRLHlDQUF5QyxXQUFXNm5CLEVBQUUsV0FBVyxDQUFDLGdCQUFnQixXQUFXQSxFQUFFLGFBQWEsQ0FBQyxxRUFDckg3bkIsR0FBUSxZQUNWLENBQ0FBLEdBQVEsV0FDUnluQixFQUFtQixVQUFZem5CLEVBQy9CMm5CLEVBQWMsWUFBY2xLLEVBQVEsT0FBUyx1QkFHN0MsTUFBTXFLLEVBQWEsU0FBUyxlQUFlLHFCQUFxQixFQUMxREMsRUFBZSxTQUFTLGVBQWUsd0JBQXdCLEVBQ2pFRCxJQUNGQSxFQUFXLFlBQWNySyxFQUFRLE9BQVMsV0FDMUNxSyxFQUFXLE1BQU0sUUFBVSxJQUV6QkMsR0FBZ0J0SyxFQUFRLE9BQVMsSUFDbkNzSyxFQUFhLE1BQU0sUUFBVSxJQUkvQixPQUFPLGdCQUFrQnRLLEVBR3pCZ0ssRUFBbUIsaUJBQWlCLGlCQUFpQixFQUFFLFFBQVFocUIsR0FBTyxDQUNwRUEsRUFBSSxpQkFBaUIsUUFBUyxTQUFZLENBQ3hDLE1BQU1pTSxFQUFLak0sRUFBSSxRQUFRLEdBQ2pCNFksRUFBTzVZLEVBQUksUUFBUSxLQUN6QixHQUFLLFFBQVEsV0FBVzRZLENBQUksc0RBQXNELEVBQ2xGLENBQUE1WSxFQUFJLFlBQWMsY0FDbEJBLEVBQUksU0FBVyxHQUNmLEdBQUksQ0FNRixNQUFNc1MsRUFBSSxNQUxBLE1BQU0sWUFBWSwwQkFBMEIsbUJBQW1CckcsQ0FBRSxDQUFDLEdBQUksQ0FDOUUsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxhQUFjLEVBQUssQ0FBQyxDQUM3QyxDQUFDLEdBQ2lCLEtBQUssRUFDdkIsR0FBSXFHLEVBQUUsUUFDSnRTLEVBQUksWUFBYyxRQUNsQkEsRUFBSSxNQUFNLFdBQWEsZUFDdkIsV0FBVyxJQUFNbXFCLEVBQWMsRUFBRyxHQUFJLE1BRXRDLE9BQU0sSUFBSSxNQUFNN1gsRUFBRSxPQUFTLGVBQWUsQ0FFOUMsT0FBUzFTLEVBQUcsQ0FDVkksRUFBSSxZQUFjLFNBQ2xCQSxFQUFJLE1BQU0sTUFBUSxnQkFDbEIsaUJBQWlCLGlCQUFtQkosRUFBRSxRQUFTLE9BQU8sRUFDdEQsV0FBVyxJQUFNLENBQUVJLEVBQUksWUFBYyxTQUFVQSxFQUFJLFNBQVcsR0FBT0EsRUFBSSxNQUFNLE1BQVEsR0FBSUEsRUFBSSxNQUFNLFdBQWEsRUFBSSxFQUFHLEdBQUksQ0FDL0gsRUFDRixDQUFDLENBQ0gsQ0FBQyxFQUdEZ3FCLEVBQW1CLGlCQUFpQixlQUFlLEVBQUUsUUFBUWhxQixHQUFPLENBQ2xFQSxFQUFJLGlCQUFpQixRQUFTLFNBQVksQ0FDeEMsTUFBTWlNLEVBQUtqTSxFQUFJLFFBQVEsR0FDakI0WSxFQUFPNVksRUFBSSxRQUFRLEtBQ3pCLEdBQUssUUFBUSxhQUFhNFksQ0FBSSw0QkFBNEIsRUFDMUQsQ0FBQTVZLEVBQUksWUFBYyxrQkFDbEJBLEVBQUksU0FBVyxHQUNmLEdBQUksQ0FFRixNQUFNc1MsRUFBSSxNQURBLE1BQU0sWUFBWSw0QkFBNEIsbUJBQW1CckcsQ0FBRSxDQUFDLEdBQUksQ0FBRSxPQUFRLE1BQU8sQ0FBQyxHQUNsRixLQUFLLEVBQ3ZCLEdBQUlxRyxFQUFFLFFBQ0p0UyxFQUFJLFlBQWMsZUFDbEIsV0FBVyxJQUFNbXFCLEVBQWMsRUFBRyxHQUFJLE1BRXRDLE9BQU0sSUFBSSxNQUFNN1gsRUFBRSxPQUFTLGlCQUFpQixDQUVoRCxPQUFTMVMsRUFBRyxDQUNWSSxFQUFJLFlBQWMsU0FDbEIsaUJBQWlCLG1CQUFxQkosRUFBRSxRQUFTLE9BQU8sRUFDeEQsV0FBVyxJQUFNLENBQUVJLEVBQUksWUFBYyxXQUFZQSxFQUFJLFNBQVcsRUFBTyxFQUFHLEdBQUksQ0FDaEYsRUFDRixDQUFDLENBQ0gsQ0FBQyxDQUNILE9BQVNKLEVBQUcsQ0FDVm9xQixFQUFtQixVQUFZLGtFQUFrRSxXQUFXcHFCLEVBQUUsT0FBTyxDQUFDLFFBQ3hILENBQ0YsQ0FHQSxlQUFlMnFCLEdBQXNCLENBQ25DLE1BQU12SyxFQUFVLE9BQU8saUJBQW1CLENBQUMsRUFDM0MsR0FBSSxDQUFDQSxFQUFRLE9BQVEsT0FDckIsTUFBTWhnQixFQUFNLFNBQVMsZUFBZSx3QkFBd0IsRUFDNUQsR0FBSSxDQUFDLFFBQVEsY0FBY2dnQixFQUFRLE1BQU0saUNBQWlDLEVBQUcsT0FDN0VoZ0IsRUFBSSxZQUFjLHFCQUNsQkEsRUFBSSxTQUFXLEdBQ2YsSUFBSXdxQixFQUFVLEVBQUdDLEVBQVMsRUFDMUIsVUFBV0wsS0FBS3BLLEVBQ2QsR0FBSSxFQU1RLE1BTEEsTUFBTSxZQUFZLDBCQUEwQixtQkFBbUJvSyxFQUFFLFdBQVcsQ0FBQyxHQUFJLENBQ3pGLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsYUFBYyxFQUFLLENBQUMsQ0FDN0MsQ0FBQyxHQUNpQixLQUFLLEdBQ2pCLFFBQVNJLElBQ1ZDLEdBQ1AsTUFBWSxDQUFFQSxHQUFVLENBRTFCenFCLEVBQUksWUFBYyxjQUNsQixpQkFBaUIsZUFBZXdxQixDQUFPLGVBQWVDLENBQU0sV0FBWUQsRUFBVSxHQUFLQyxJQUFXLEVBQUksVUFBWSxPQUFPLEVBQ3pILFdBQVcsSUFBTSxDQUNmenFCLEVBQUksWUFBYywwQkFDbEJBLEVBQUksU0FBVyxHQUNmbXFCLEVBQWMsQ0FDaEIsRUFBRyxHQUFJLENBQ1QsQ0FFQSxTQUFTLGVBQWUsd0JBQXdCLEdBQUcsaUJBQWlCLFFBQVNJLENBQW1CLEVBRWhHLGVBQWVHLEdBQWtCLENBQy9CWCxFQUFTLFlBQWMsd0JBQ3ZCQSxFQUFTLFNBQVcsR0FDcEIsR0FBSSxDQUVGLE1BQU1scUIsRUFBTyxNQURELE1BQU0sWUFBWSx3QkFBeUIsQ0FBRSxPQUFRLE1BQU8sQ0FBQyxHQUNsRCxLQUFLLEVBQzVCLEdBQUksQ0FBQ0EsRUFBSyxRQUFTLE1BQU0sSUFBSSxNQUFNQSxFQUFLLEtBQUssRUFDN0NrcUIsRUFBUyxZQUFjLGVBQ3ZCLE1BQU1JLEVBQWMsQ0FDdEIsT0FBU3ZxQixFQUFHLENBQ1ZtcUIsRUFBUyxZQUFjLGdCQUN2QixpQkFBaUIsZ0JBQWtCbnFCLEVBQUUsUUFBUyxPQUFPLENBQ3ZELENBQ0EsV0FBVyxJQUFNLENBQUVtcUIsRUFBUyxZQUFjLDhCQUF3QkEsRUFBUyxTQUFXLEVBQU8sRUFBRyxHQUFJLENBQ3RHLENBRUEsZUFBZWpFLEdBQWMsQ0FDM0IsR0FBSSxDQUNGcEgsRUFBaUIsVUFBWSxnRkFFN0IsTUFBTTdlLEVBQU8sTUFERCxNQUFNLE1BQU0sa0NBQWtDLEdBQ25DLEtBQUssRUFDdEJ1cEIsRUFBVXZwQixFQUFLLFNBQVdBLEVBQUssUUFBVUEsRUFBSyxRQUFVLENBQUMsRUFDL0QsR0FBSXVwQixFQUFRLFNBQVcsRUFBRyxDQUN4QjFLLEVBQWlCLFVBQVksaUdBQzdCLE1BQ0YsQ0FDQSxJQUFJbmMsRUFBTyw4RUFDWEEsR0FBUSxzV0FDUixVQUFXNGlCLEtBQUtpRSxFQUFTLENBQ3ZCLE1BQU11QixFQUFLeEYsRUFBRSxTQUFXLFVBQ2xCbUUsRUFBTW5FLEVBQUUsU0FBWUEsRUFBRSxTQUFXLElBQU9BLEVBQUUsU0FBVyxLQUFPLEtBQUssTUFBTUEsRUFBRSxTQUFXLEdBQUksRUFBSSxJQUFPLElBQ3pHNWlCLEdBQVEsdURBQ1JBLEdBQVEsa0RBQWtELFFBQVE0aUIsRUFBRSxTQUFTLENBQUMsUUFDOUU1aUIsR0FBUSwrQ0FBK0MsV0FBVzRpQixFQUFFLGFBQWEsQ0FBQyxRQUNsRjVpQixHQUFRLGtEQUFrRCxXQUFXNGlCLEVBQUUsU0FBUyxDQUFDLFFBQ2pGNWlCLEdBQVEsNkJBQTZCK21CLENBQUcsUUFDeEMvbUIsR0FBUSxpREFBaURvb0IsRUFBSyxlQUFpQixlQUFlLE1BQU1BLEVBQUssaUJBQWMsZUFBVSxlQUNqSXBvQixHQUFRLFFBQ0osQ0FBQ29vQixHQUFNeEYsRUFBRSxRQUNYNWlCLEdBQVEsK0ZBQStGLFdBQVc0aUIsRUFBRSxLQUFLLENBQUMsYUFFOUgsQ0FDQTVpQixHQUFRLFdBQ1JtYyxFQUFpQixVQUFZbmMsQ0FDL0IsT0FBUzNDLEVBQUcsQ0FDVjhlLEVBQWlCLFVBQVksa0VBQWtFLFdBQVc5ZSxFQUFFLE9BQU8sQ0FBQyxRQUN0SCxDQUNGLENBRUEsZUFBZWdyQixHQUFpQixDQUM5QixHQUFJLENBQ0ZYLEVBQWMsVUFBWSxnRkFHMUIsS0FBTSxDQUFDWSxFQUFlQyxDQUFTLEVBQUksTUFBTSxRQUFRLElBQUksQ0FDbkQsTUFBTSwwQkFBMEIsRUFDaEMsTUFBTSw2QkFBNkIsQ0FDckMsQ0FBQyxFQUNLQyxFQUFpQixNQUFNRixFQUFjLEtBQUssRUFDMUNHLEVBQWEsTUFBTUYsRUFBVSxLQUFLLEVBRWxDL1UsRUFBYWdWLEVBQWUsU0FBV0EsRUFBZSxNQUFRQSxFQUFlLE1BQVEsQ0FBQyxFQUN0RkUsRUFBY0QsRUFBVyxTQUFXQSxFQUFXLE9BQVNBLEVBQVcsT0FBUyxDQUFDLEVBRW5GLEdBQUlqVixFQUFXLFNBQVcsRUFBRyxDQUMzQmtVLEVBQWMsVUFBWSx1R0FDMUIsTUFDRixDQUVBLElBQUkxbkIsRUFBTyw2TUFDWEEsR0FBUSw4RUFDUkEsR0FBUSxzYUFDUixVQUFXZ04sS0FBS3dHLEVBQVksQ0FDMUIsTUFBTTZDLEVBQU9ySixFQUFFLE1BQVFBLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxNQUFPLEVBQUUsR0FBS0EsRUFBRSxJQUFJLFVBQVUsRUFBRyxFQUFFLEVBQzFFMmIsRUFBTTNiLEVBQUUsYUFBZUEsRUFBRSxHQUN6Qm1ZLEVBQVF1RCxFQUFZQyxDQUFHLEdBQUssQ0FBQyxFQUM3QkMsRUFBY3pELEVBQU0sUUFBV0EsRUFBTSxVQUFZLFNBQVksR0FDN0QwRCxFQUFjMUQsRUFBTSxlQUFpQixHQUNyQzJELEVBQVkzRCxFQUFNLG1CQUFxQixHQUN2QzRELEVBQVU1RCxFQUFNLGVBQWlCLFFBQVFBLEVBQU0sY0FBYyxFQUFJLFFBRXZFbmxCLEdBQVEsMEVBQTBFLFdBQVcyb0IsQ0FBRyxDQUFDLEtBQ2pHM29CLEdBQVEsK0NBQStDLFdBQVdxVyxDQUFJLENBQUMsUUFDdkVyVyxHQUFRO0FBQUEsbURBQ21DLFdBQVcyb0IsQ0FBRyxDQUFDO0FBQUEsOEJBQ25DQyxFQUE0QixHQUFkLFdBQWdCO0FBQUEsbUNBQzFCQSxJQUFnQixRQUFVLFlBQWMsRUFBRTtBQUFBLG9DQUN6Q0EsSUFBZ0IsU0FBVyxZQUFjLEVBQUU7QUFBQSxxQ0FDMUNBLElBQWdCLFVBQVksWUFBYyxFQUFFO0FBQUEsMEJBRXpFNW9CLEdBQVEsNkVBQTZFLFdBQVcyb0IsQ0FBRyxDQUFDLFlBQVksV0FBV0csQ0FBUyxDQUFDLCtMQUNySTlvQixHQUFRLG1GQUFtRixXQUFXMm9CLENBQUcsQ0FBQyxJQUFJRSxFQUFjLFdBQWEsRUFBRSxXQUMzSTdvQixHQUFRLHNFQUFzRStvQixDQUFPLFFBQ3JGL29CLEdBQVEsdUZBQXVGLFdBQVcyb0IsQ0FBRyxDQUFDLGdCQUFnQixXQUFXdFMsQ0FBSSxDQUFDLHNFQUM5SXJXLEdBQVEsT0FDVixDQUNBQSxHQUFRLFdBQ1IwbkIsRUFBYyxVQUFZMW5CLEVBRzFCMG5CLEVBQWMsaUJBQWlCLGdCQUFnQixFQUFFLFFBQVFqcUIsR0FBTyxDQUM5REEsRUFBSSxpQkFBaUIsUUFBUyxTQUFZLENBQ3hDLE1BQU1pTSxFQUFLak0sRUFBSSxRQUFRLEdBQ2pCNEosRUFBTTVKLEVBQUksUUFBUSxJQUFJLEVBQ3RCdXJCLEVBQVczaEIsRUFBSSxjQUFjLGdCQUFnQixFQUFFLE1BQy9DNGhCLEVBQVc1aEIsRUFBSSxjQUFjLGdCQUFnQixFQUFFLFFBQy9DNmhCLEVBQVM3aEIsRUFBSSxjQUFjLGNBQWMsRUFBRSxNQUFNLEtBQUssRUFDNUQ1SixFQUFJLFlBQWMsWUFDbEJBLEVBQUksU0FBVyxHQUNmLEdBQUksQ0FNRixNQUFNc1MsRUFBSSxNQUxBLE1BQU0sWUFBWSwrQkFBK0IsbUJBQW1CckcsQ0FBRSxDQUFDLEdBQUksQ0FDbkYsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxRQUFTLENBQUMsQ0FBQ3NmLEVBQVUsU0FBVUEsR0FBWSxTQUFVLGFBQWNDLEVBQVUsa0JBQW1CQyxHQUFVLE1BQVUsQ0FBQyxDQUM5SSxDQUFDLEdBQ2lCLEtBQUssRUFDdkIsR0FBSW5aLEVBQUUsUUFDSnRTLEVBQUksWUFBYyxtQkFFbEIsT0FBTSxJQUFJLE1BQU1zUyxFQUFFLEtBQUssQ0FFM0IsT0FBUzFTLEVBQUcsQ0FDVkksRUFBSSxZQUFjLGVBQ2xCLGlCQUFpQixlQUFpQkosRUFBRSxRQUFTLE9BQU8sQ0FDdEQsQ0FDQSxXQUFXLElBQU0sQ0FBRUksRUFBSSxZQUFjLE9BQVFBLEVBQUksU0FBVyxFQUFPLEVBQUcsR0FBSSxDQUM1RSxDQUFDLENBQ0gsQ0FBQyxDQUNILE9BQVNKLEVBQUcsQ0FDVnFxQixFQUFjLFVBQVksa0VBQWtFLFdBQVdycUIsRUFBRSxPQUFPLENBQUMsUUFDbkgsQ0FDRixDQUlBLE1BQU04ckIsRUFBZ0IsU0FBUyxlQUFlLDJCQUEyQixFQUNuRUMsRUFBZ0IsU0FBUyxlQUFlLHdCQUF3QixFQUNoRUMsRUFBa0IsU0FBUyxlQUFlLDBCQUEwQixFQUNwRUMsRUFBZSxTQUFTLGVBQWUsdUJBQXVCLEVBQzlEQyxFQUFjLFNBQVMsZUFBZSxxQkFBcUIsRUFDM0RDLEVBQWEsU0FBUyxlQUFlLHFCQUFxQixFQUMxREMsRUFBYSxTQUFTLGVBQWUscUJBQXFCLEVBQzFEQyxFQUFnQixTQUFTLGVBQWUsd0JBQXdCLEVBQ2hFQyxFQUFjLFNBQVMsZUFBZSxzQkFBc0IsRUFDNURDLEVBQXFCLFNBQVMsZUFBZSw2QkFBNkIsRUFFaEYsSUFBSUMsRUFBYyxLQUVsQixTQUFTQyxFQUFhN1ksRUFBSzhZLEVBQU0sQ0FDMUJKLElBQ0xBLEVBQVksTUFBTSxRQUFVLFFBQzVCQSxFQUFZLE1BQU0sV0FBYUksSUFBUyxRQUFVLGdCQUFrQkEsSUFBUyxVQUFZLGVBQWlCLFlBQzFHSixFQUFZLE1BQU0sTUFBUUksSUFBUyxRQUFVLGdCQUFrQkEsSUFBUyxVQUFZLGVBQWlCLFlBQ3JHSixFQUFZLFlBQWMxWSxFQUM1QixDQUVBLGVBQWUrWSxHQUFnQixDQUM3QixHQUFJLENBRUYsTUFBTTFzQixFQUFPLE1BREQsTUFBTSxNQUFNLHdCQUF3QixHQUN6QixLQUFLLEVBQzVCLEdBQUlBLEVBQUssUUFBUyxDQUNoQixNQUFNMnNCLEVBQVMzc0IsRUFBSyxRQUFVQSxFQUFLLFNBQVcsVUFBWUEsRUFBSyxPQUFTLEtBQ3hFNnJCLEVBQWMsWUFBYyxJQUFNN3JCLEVBQUssU0FBVzJzQixFQUFTLEtBQU9BLEVBQU8sVUFBVSxFQUFHLENBQUMsRUFBSSxJQUFNLEdBQ25HLENBQ0YsTUFBWSxDQUNWZCxFQUFjLFlBQWMseUJBQzlCLENBQ0YsQ0FFQSxlQUFlZSxFQUFpQkMsRUFBUSxDQUNqQ0EsSUFDSFYsRUFBVyxZQUFjLGNBQ3pCQSxFQUFXLFNBQVcsSUFFeEIsR0FBSSxDQUVGLE1BQU1uc0IsRUFBTyxNQURELE1BQU0sTUFBTSw2QkFBNkIsR0FDOUIsS0FBSyxFQUc1QixHQUZBdXNCLEVBQWN2c0IsRUFFVkEsRUFBSyxTQUFXQSxFQUFLLFdBQWFBLEVBQUssT0FBUSxDQUNqRDhyQixFQUFjLE1BQU0sUUFBVSxHQUM5QkMsRUFBZ0IsTUFBTSxRQUFVLEdBQ2hDQyxFQUFhLFlBQWMsSUFBTWhzQixFQUFLLE9BQU8sUUFDN0Npc0IsRUFBWSxZQUFjanNCLEVBQUssT0FBTyxXQUFhLDBCQUduRCxNQUFNOHNCLEVBQWEsU0FBUyxlQUFlLGFBQWEsRUFDeEQsR0FBSUEsR0FBYyxDQUFDQSxFQUFXLGNBQWMsYUFBYSxFQUFHLENBQzFELE1BQU1DLEVBQU0sU0FBUyxjQUFjLE1BQU0sRUFDekNBLEVBQUksVUFBWSxhQUNoQkEsRUFBSSxNQUFNLFFBQVUsdUdBQ3BCRCxFQUFXLE1BQU0sU0FBVyxXQUM1QkEsRUFBVyxZQUFZQyxDQUFHLENBQzVCLENBRUEsTUFBTUMsRUFBUSxTQUFTLGVBQWUsdUJBQXVCLEVBQzdELEdBQUlBLEdBQVMsQ0FBQ0EsRUFBTSxjQUFjLGFBQWEsRUFBRyxDQUNoRCxNQUFNRCxFQUFNLFNBQVMsY0FBYyxNQUFNLEVBQ3pDQSxFQUFJLFVBQVksYUFDaEJBLEVBQUksTUFBTSxRQUFVLDhIQUNwQkMsRUFBTSxZQUFZRCxDQUFHLENBQ3ZCLENBQ0YsTUFDRWpCLEVBQWMsTUFBTSxRQUFVLE9BQzlCQyxFQUFnQixNQUFNLFFBQVUsT0FDaEMsTUFBTVcsRUFBYyxFQUNmRyxHQUFRTCxFQUFhLHNDQUF1QyxTQUFTLEVBR3ZFSyxJQUNIVixFQUFXLFlBQWMsb0JBQ3pCQSxFQUFXLFNBQVcsR0FFMUIsT0FBUyxFQUFHLENBQ0xVLElBQ0hMLEVBQWEsb0JBQXNCLEVBQUUsUUFBUyxPQUFPLEVBQ3JETCxFQUFXLFlBQWMsb0JBQ3pCQSxFQUFXLFNBQVcsR0FFMUIsQ0FDRixDQUVBLGVBQWVjLEdBQWdCLENBQzdCLEdBQUksQ0FBQyxRQUFRLHlEQUF5RCxFQUFHLE1BQU8sR0FDaEZmLEVBQVcsWUFBYyxjQUN6QkEsRUFBVyxTQUFXLEdBQ3RCTSxFQUFhLHFDQUFzQyxNQUFNLEVBQ3pELEdBQUksQ0FFRixNQUFNeHNCLEVBQU8sTUFERCxNQUFNLFlBQVksOEJBQStCLENBQUUsT0FBUSxNQUFPLENBQUMsR0FDeEQsS0FBSyxFQUM1QixHQUFJQSxFQUFLLFFBQ1AsT0FBQXdzQixFQUFhLHVCQUF5QnhzQixFQUFLLGFBQWUsS0FBTyxhQUFVQSxFQUFLLFdBQWEsS0FBTyx3Q0FBeUMsU0FBUyxFQUN0SmtzQixFQUFXLFlBQWMsV0FFekIsU0FBUyxpQkFBaUIsYUFBYSxFQUFFLFFBQVF6WixHQUFLQSxFQUFFLE9BQU8sQ0FBQyxFQUN6RCxHQUVQLE1BQU0sSUFBSSxNQUFNelMsRUFBSyxPQUFTLGVBQWUsQ0FFakQsT0FBU0QsRUFBRyxDQUNWLE1BQUF5c0IsRUFBYSxrQkFBb0J6c0IsRUFBRSxRQUFTLE9BQU8sRUFDbkRtc0IsRUFBVyxZQUFjLGFBQ3pCQSxFQUFXLFNBQVcsR0FDaEJuc0IsQ0FDUixDQUNGLENBRUEsZUFBZW10QixHQUFnQixDQUM3QixHQUFJLENBRUYsTUFBTWx0QixFQUFPLE1BREQsTUFBTSxNQUFNLCtCQUErQixHQUNoQyxLQUFLLEVBQ3RCdXBCLEVBQVV2cEIsRUFBSyxTQUFXQSxFQUFLLFFBQVVBLEVBQUssUUFBVSxDQUFDLEVBQy9ELEdBQUl1cEIsRUFBUSxTQUFXLEVBQUcsQ0FDeEIrQyxFQUFtQixVQUFZLGtHQUMvQixNQUNGLENBQ0EsSUFBSTVwQixFQUFPLDhFQUNYQSxHQUFRLDBTQUNSLFVBQVc0aUIsS0FBS2lFLEVBQVMsQ0FDdkIsTUFBTXJOLEVBQUtvSixFQUFFLFNBQVcsVUFBWSxpQkFBY0EsRUFBRSxTQUFXLFVBQVksaUJBQWNBLEVBQUUsU0FBVyxVQUFZLGlCQUFjLFVBQU9BLEVBQUUsT0FDbkk2SCxFQUFVN0gsRUFBRSxTQUFXLFVBQVksZUFBaUJBLEVBQUUsU0FBVyxVQUFZLGVBQWlCLGdCQUNwRzVpQixHQUFRLHVEQUNSQSxHQUFRLGtEQUFvRCxRQUFRNGlCLEVBQUUsU0FBUyxFQUFJLFFBQ25GNWlCLEdBQVEsZ0RBQWtELFdBQVc0aUIsRUFBRSxPQUFPLEdBQUtBLEVBQUUsU0FBVyxjQUFnQixJQUFNLFFBQ3RINWlCLEdBQVEsbURBQXFELFdBQVc0aUIsRUFBRSxhQUFlLEdBQUcsRUFBSSxRQUNoRzVpQixHQUFRLGlEQUFtRHlxQixFQUFVLE1BQVFqUixFQUFLLGVBQ2xGeFosR0FBUSxRQUNKNGlCLEVBQUUsUUFDSjVpQixHQUFRLCtGQUFpRyxXQUFXNGlCLEVBQUUsS0FBSyxFQUFJLGNBRTdIQSxFQUFFLE9BQ0o1aUIsR0FBUSw4RkFBZ0csV0FBVzRpQixFQUFFLElBQUksRUFBSSxhQUVqSSxDQUNBNWlCLEdBQVEsV0FDUjRwQixFQUFtQixVQUFZNXBCLENBQ2pDLE9BQVMzQyxFQUFHLENBQ1Z1c0IsRUFBbUIsVUFBWSxrRUFBb0UsV0FBV3ZzQixFQUFFLE9BQU8sRUFBSSxRQUM3SCxDQUNGLENBRUEsZUFBZXF0QixHQUFpQixDQUM5QixHQUFJLENBRUYsTUFBTXB0QixFQUFPLE1BREQsTUFBTSxNQUFNLGtDQUFrQyxHQUNuQyxLQUFLLEVBQ3RCcXRCLEVBQVdydEIsRUFBSyxTQUFXQSxFQUFLLFNBQVdBLEVBQUssU0FBVyxDQUFDLEVBQ2xFLEdBQUlxdEIsRUFBUyxTQUFXLEVBQUcsQ0FDekIsaUJBQWlCLGtDQUFtQyxNQUFNLEVBQzFELE1BQ0YsQ0FDQSxNQUFNNVMsRUFBVSxPQUFPO0FBQUEsRUFBbUM0UyxFQUFTLEtBQUs7QUFBQSxDQUFJLEVBQUk7QUFBQTtBQUFBLDhCQUFtQyxFQUNuSCxHQUFJLENBQUM1UyxFQUFTLE9BQ2QsR0FBSSxDQUFDNFMsRUFBUyxTQUFTNVMsQ0FBTyxFQUFHLENBQy9CLGlCQUFpQixvQkFBc0JBLEVBQVMsT0FBTyxFQUN2RCxNQUNGLENBQ0EsR0FBSSxDQUFDLFFBQVEsMEJBQTRCQSxFQUFVLCtCQUErQixFQUFHLE9BQ3JGK1IsRUFBYSxvQkFBc0IvUixFQUFVLE1BQU8sTUFBTSxFQU0xRCxNQUFNaEksRUFBSSxNQUxBLE1BQU0sWUFBWSwwQkFBMkIsQ0FDckQsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxRQUFBZ0ksQ0FBUSxDQUFDLENBQ2xDLENBQUMsR0FDaUIsS0FBSyxFQUN2QixHQUFJaEksRUFBRSxRQUNKK1osRUFBYSxnQkFBa0IvUixFQUFVLHNDQUF1QyxTQUFTLE1BRXpGLE9BQU0sSUFBSSxNQUFNaEksRUFBRSxPQUFTLGlCQUFpQixDQUVoRCxPQUFTMVMsRUFBRyxDQUNWeXNCLEVBQWEsb0JBQXNCenNCLEVBQUUsUUFBUyxPQUFPLENBQ3ZELENBQ0YsQ0FFQW9zQixHQUFZLGlCQUFpQixRQUFTLElBQU1TLEVBQWlCLEVBQUssQ0FBQyxFQUNuRVYsR0FBWSxpQkFBaUIsUUFBUyxJQUFNZSxFQUFjLEVBQUUsTUFBTSxJQUFNLENBQUMsQ0FBQyxDQUFDLEVBQzNFYixHQUFlLGlCQUFpQixRQUFTZ0IsQ0FBYyxFQUV2RGxELEdBQVUsaUJBQWlCLFFBQVNXLENBQWUsRUFDbkRwUyxHQUFTLGlCQUFpQixRQUFTLElBQU0sQ0FDdkN2VCxHQUFPLFVBQVUsSUFBSSxNQUFNLEVBQzNCb2xCLEVBQWMsQ0FDaEIsQ0FBQyxFQUNELFVBQVVwbEIsRUFBT3lJLENBQVMsRUFHMUIsT0FBTyxnQkFBa0IsU0FBU2hJLEVBQU8sQ0FDdkNULEdBQU8sVUFBVSxJQUFJLE1BQU0sRUFDM0JvbEIsRUFBYyxFQUFFLEtBQUssSUFBTSxDQUN6QixHQUFJLENBQUMza0IsRUFBTyxPQUVaLE1BQU1vRSxFQUFNb2dCLEVBQW1CLGNBQWMsaUJBQWlCeGtCLENBQUssSUFBSSxFQUNuRW9FLElBQ0ZBLEVBQUksZUFBZSxDQUFFLFNBQVUsU0FBVSxNQUFPLFFBQVMsQ0FBQyxFQUMxREEsRUFBSSxNQUFNLFdBQWEsd0JBQ3ZCLFdBQVcsSUFBTSxDQUFFQSxFQUFJLE1BQU0sV0FBYSxFQUFJLEVBQUcsR0FBSSxFQUV6RCxDQUFDLENBQ0gsRUFHQSxTQUFTLGNBQWMsZ0NBQWdDLEdBQUcsaUJBQWlCLFFBQVNrYyxDQUFXLEVBQy9GLFNBQVMsY0FBYyw2QkFBNkIsR0FBRyxpQkFBaUIsUUFBUzhFLENBQWMsRUFDL0YsU0FBUyxjQUFjLGtDQUFrQyxHQUFHLGlCQUFpQixRQUFTLElBQU0sQ0FDMUYyQixFQUFjLEVBQ2RRLEVBQWMsRUFDVFgsR0FBYUssRUFBaUIsRUFBSSxDQUN6QyxDQUFDLEVBRUQsT0FBTyxjQUFnQkssRUFDdkIsT0FBTyxpQkFBbUJMLEVBRzFCLFdBQVcsSUFBTUEsRUFBaUIsRUFBSSxFQUFHLEdBQUksQ0FDL0MsR0FBRyxHQUdGLFVBQVcsQ0FDVixZQUFZLHlCQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBaUQvQixFQUVQLE1BQU0xbkIsRUFBUSxTQUFTLGVBQWUsd0JBQXdCLEVBQ3hEdVQsRUFBVSxTQUFTLGVBQWUsc0JBQXNCLEVBQ3hEL0csRUFBVyxTQUFTLGVBQWUsVUFBVSxFQUVuRCxTQUFTNGIsRUFBU2xMLEVBQU8sQ0FDdkIsR0FBSSxDQUFDQSxHQUFTQSxJQUFVLEVBQUcsTUFBTyxNQUNsQyxNQUFNbUwsRUFBUSxDQUFDLElBQUssS0FBTSxLQUFNLEtBQU0sSUFBSSxFQUNwQzNqQixFQUFJLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxJQUFJd1ksQ0FBSyxDQUFDLEVBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxFQUMvRCxPQUFRQSxFQUFRLEtBQUssSUFBSSxLQUFNeFksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFJLElBQU0yakIsRUFBTTNqQixDQUFDLENBQy9ELENBR0EsZUFBZTRqQixHQUFjLENBQzNCLE1BQU03bEIsRUFBWSxTQUFTLGVBQWUsYUFBYSxFQUN2RCxHQUFJLENBRUYsTUFBTThsQixHQURPLE1BQU0sUUFBUSx3QkFBd0IsR0FDakMsU0FBVyxDQUFDLEVBQzlCLEdBQUlBLEVBQUssU0FBVyxFQUFHLENBQ3JCOWxCLEVBQVUsVUFBWSw0RkFDdEIsTUFDRixDQUNBLElBQUlqRixFQUFPLDhFQUNYQSxHQUFRLHdRQUNSLFVBQVdnSCxLQUFLK2pCLEVBQU0sQ0FDcEIsTUFBTUMsRUFBV2hrQixFQUFFLE9BQVMsWUFBY0EsRUFBRSxLQUFLLFNBQVcsR0FDNURoSCxHQUFRLHVEQUNSQSxHQUFRLHdJQUF3SSxXQUFXZ0gsRUFBRSxJQUFJLENBQUMsS0FBSyxXQUFXQSxFQUFFLEtBQUssT0FBUyxHQUFLQSxFQUFFLEtBQUssVUFBVSxFQUFHLEVBQUUsRUFBSSxNQUFRQSxFQUFFLElBQUksQ0FBQyxRQUNoUGhILEdBQVEsc0VBQXNFLFdBQVdnSCxFQUFFLE1BQU0sQ0FBQyxRQUNsR2hILEdBQVEsc0VBQXNFLFdBQVdnSCxFQUFFLEtBQUssQ0FBQyxRQUNqR2hILEdBQVEsZ0RBQ0hnckIsSUFDSGhyQixHQUFRLHlDQUF5QyxXQUFXZ0gsRUFBRSxJQUFJLENBQUMseUZBRXJFaEgsR0FBUSxZQUNWLENBQ0FBLEdBQVEsV0FDUmlGLEVBQVUsVUFBWWpGLEVBRXRCaUYsRUFBVSxpQkFBaUIsYUFBYSxFQUFFLFFBQVF4SCxHQUFPLENBQ3ZEQSxFQUFJLGlCQUFpQixRQUFTLFNBQVksQ0FDeEMsR0FBSyxRQUFRLGtCQUFrQkEsRUFBSSxRQUFRLElBQUksdUJBQXVCLEVBQ3RFLENBQUFBLEVBQUksWUFBYyxNQUNsQkEsRUFBSSxTQUFXLEdBQ2YsR0FBSSxDQUNGLE1BQU0sVUFBVSwwQkFBMEIsbUJBQW1CQSxFQUFJLFFBQVEsSUFBSSxDQUFDLGFBQWEsRUFDM0ZxdEIsRUFBWSxDQUNkLE9BQVN6dEIsRUFBRyxDQUNWLGlCQUFpQixrQkFBb0JBLEVBQUUsUUFBUyxPQUFPLEVBQ3ZESSxFQUFJLFlBQWMsU0FDbEJBLEVBQUksU0FBVyxFQUNqQixFQUNGLENBQUMsQ0FDSCxDQUFDLENBQ0gsT0FBU0osRUFBRyxDQUNWNEgsRUFBVSxVQUFZLGtFQUFrRSxXQUFXNUgsRUFBRSxPQUFPLENBQUMsUUFDL0csQ0FDRixDQUVBLFNBQVMsZUFBZSxlQUFlLEdBQUcsaUJBQWlCLFFBQVMsU0FBWSxDQUM5RSxNQUFNNHRCLEVBQVksU0FBUyxlQUFlLGFBQWEsRUFDakQ1VSxFQUFPNFUsRUFBVSxNQUFNLEtBQUssRUFDbEMsR0FBSSxDQUFDNVUsRUFBTSxDQUFFLGlCQUFpQixzQkFBdUIsU0FBUyxFQUFHLE1BQVEsQ0FDekUsR0FBSSxDQUNGLE1BQU0sU0FBUyx5QkFBMEIsQ0FBRSxLQUFBQSxDQUFLLENBQUMsRUFDakQ0VSxFQUFVLE1BQVEsR0FDbEIsaUJBQWlCLFdBQVc1VSxDQUFJLFlBQWEsU0FBUyxFQUN0RHlVLEVBQVksQ0FDZCxPQUFTenRCLEVBQUcsQ0FDVixpQkFBaUIsa0JBQW9CQSxFQUFFLFFBQVMsT0FBTyxDQUN6RCxDQUNGLENBQUMsRUFHRCxlQUFlNnRCLEdBQWUsQ0FDNUIsTUFBTWptQixFQUFZLFNBQVMsZUFBZSxhQUFhLEVBQ3ZELEdBQUksQ0FFRixNQUFNa21CLEdBRE8sTUFBTSxRQUFRLHlCQUF5QixHQUNsQyxVQUFZLENBQUMsRUFDL0IsR0FBSUEsRUFBSyxTQUFXLEVBQUcsQ0FDckJsbUIsRUFBVSxVQUFZLDZGQUN0QixNQUNGLENBQ0EsSUFBSWpGLEVBQU8sOEVBQ1hBLEdBQVEsaVRBQ1IsVUFBV29yQixLQUFLRCxFQUFNLENBQ3BCLE1BQU1ILEVBQVcsQ0FBQyxTQUFVLE9BQVEsTUFBTSxFQUFFLFNBQVNJLEVBQUUsSUFBSSxFQUMzRHByQixHQUFRLHVEQUNSQSxHQUFRLCtDQUErQyxXQUFXb3JCLEVBQUUsSUFBSSxDQUFDLFFBQ3pFcHJCLEdBQVEsc0VBQXNFLFdBQVdvckIsRUFBRSxNQUFNLENBQUMsUUFDbEdwckIsR0FBUSxzRUFBc0UsV0FBV29yQixFQUFFLEtBQUssQ0FBQyxRQUNqR3ByQixHQUFRLGlEQUFpRG9yQixFQUFFLFVBQVUsUUFDckVwckIsR0FBUSxnREFDSGdyQixJQUNIaHJCLEdBQVEsdUNBQXVDLFdBQVdvckIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLFdBQVdBLEVBQUUsSUFBSSxDQUFDLHlGQUVuR3ByQixHQUFRLFlBQ1YsQ0FDQUEsR0FBUSxXQUNSaUYsRUFBVSxVQUFZakYsRUFFdEJpRixFQUFVLGlCQUFpQixhQUFhLEVBQUUsUUFBUXhILEdBQU8sQ0FDdkRBLEVBQUksaUJBQWlCLFFBQVMsU0FBWSxDQUN4QyxHQUFLLFFBQVEsbUJBQW1CQSxFQUFJLFFBQVEsSUFBSSxJQUFJLEVBQ3BELENBQUFBLEVBQUksWUFBYyxNQUNsQkEsRUFBSSxTQUFXLEdBQ2YsR0FBSSxDQUNGLE1BQU0sVUFBVSwyQkFBMkIsbUJBQW1CQSxFQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDL0V5dEIsRUFBYSxDQUNmLE9BQVM3dEIsRUFBRyxDQUNWLGlCQUFpQixrQkFBb0JBLEVBQUUsUUFBUyxPQUFPLEVBQ3ZESSxFQUFJLFlBQWMsU0FDbEJBLEVBQUksU0FBVyxFQUNqQixFQUNGLENBQUMsQ0FDSCxDQUFDLENBQ0gsT0FBU0osRUFBRyxDQUNWNEgsRUFBVSxVQUFZLGtFQUFrRSxXQUFXNUgsRUFBRSxPQUFPLENBQUMsUUFDL0csQ0FDRixDQUVBLFNBQVMsZUFBZSxlQUFlLEdBQUcsaUJBQWlCLFFBQVMsU0FBWSxDQUM5RSxNQUFNNHRCLEVBQVksU0FBUyxlQUFlLGFBQWEsRUFDakRJLEVBQWUsU0FBUyxlQUFlLGVBQWUsRUFDdERoVixFQUFPNFUsRUFBVSxNQUFNLEtBQUssRUFDbEMsR0FBSSxDQUFDNVUsRUFBTSxDQUFFLGlCQUFpQix1QkFBd0IsU0FBUyxFQUFHLE1BQVEsQ0FDMUUsR0FBSSxDQUNGLE1BQU0sU0FBUywwQkFBMkIsQ0FBRSxLQUFBQSxFQUFNLE9BQVFnVixFQUFhLEtBQU0sQ0FBQyxFQUM5RUosRUFBVSxNQUFRLEdBQ2xCLGlCQUFpQixZQUFZNVUsQ0FBSSxZQUFhLFNBQVMsRUFDdkQ2VSxFQUFhLENBQ2YsT0FBUzd0QixFQUFHLENBQ1YsaUJBQWlCLGtCQUFvQkEsRUFBRSxRQUFTLE9BQU8sQ0FDekQsQ0FDRixDQUFDLEVBR0QsZUFBZWl1QixHQUFnQixDQUM3QixNQUFNcm1CLEVBQVksU0FBUyxlQUFlLGlCQUFpQixFQUMzRCxHQUFJLENBQ0YsTUFBTTNILEVBQU8sTUFBTSxRQUFRLDJCQUEyQixFQUNoRGl1QixFQUFXLENBQ2YsQ0FBRSxNQUFPLFNBQVUsS0FBTSxZQUFNLE1BQU9qdUIsRUFBSyxPQUFPLE1BQU8sS0FBTUEsRUFBSyxPQUFPLEtBQU0sWUFBYUEsRUFBSyxPQUFPLFdBQVksRUFDdEgsQ0FBRSxNQUFPLGFBQWMsS0FBTSxZQUFNLE1BQU9BLEVBQUssV0FBVyxNQUFPLEtBQU1BLEVBQUssV0FBVyxLQUFNLE1BQU8sR0FBR0EsRUFBSyxXQUFXLE9BQU8sVUFBVyxFQUN6SSxDQUFFLE1BQU8sVUFBVyxLQUFNLFlBQU0sTUFBT0EsRUFBSyxRQUFRLE1BQU8sS0FBTUEsRUFBSyxRQUFRLEtBQU0sWUFBYUEsRUFBSyxRQUFRLFdBQVksRUFDMUgsQ0FBRSxNQUFPLGNBQWUsS0FBTSxZQUFNLE1BQU9BLEVBQUssV0FBVyxNQUFPLEtBQU1BLEVBQUssV0FBVyxLQUFNLFlBQWFBLEVBQUssV0FBVyxXQUFZLENBQ3pJLEVBRUEsSUFBSTBDLEVBQU8saUZBQWlGNHFCLEVBQVN0dEIsRUFBSyxTQUFTLENBQUMsU0FDcEgwQyxHQUFRLDBFQUNSLFVBQVcyTixLQUFLNGQsRUFDZHZyQixHQUFRLDJHQUNSQSxHQUFRLHNEQUFzRDJOLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEtBQUssOEVBQThFQSxFQUFFLEtBQUssaUJBQ3BLM04sR0FBUSwyRUFBMkU0cUIsRUFBU2pkLEVBQUUsSUFBSSxDQUFDLFNBQy9GQSxFQUFFLFlBQWMsSUFBRzNOLEdBQVEsc0VBQXNFNHFCLEVBQVNqZCxFQUFFLFdBQVcsQ0FBQyxVQUN4SEEsRUFBRSxRQUFPM04sR0FBUSx5REFBeUQyTixFQUFFLEtBQUssVUFDckYzTixHQUFRLFNBRVZBLEdBQVEsU0FDUmlGLEVBQVUsVUFBWWpGLENBQ3hCLE9BQVMzQyxFQUFHLENBQ1Y0SCxFQUFVLFVBQVksa0VBQWtFLFdBQVc1SCxFQUFFLE9BQU8sQ0FBQyxRQUMvRyxDQUNGLENBR0EwWSxHQUFTLGlCQUFpQixRQUFTLElBQU0sQ0FDdkN2VCxHQUFPLFVBQVUsSUFBSSxNQUFNLEVBQzNCc29CLEVBQVksQ0FDZCxDQUFDLEVBQ0QsVUFBVXRvQixFQUFPd00sQ0FBUSxFQUd6QixTQUFTLGNBQWMsNEJBQTRCLEdBQUcsaUJBQWlCLFFBQVNrYyxDQUFZLEVBQzVGLFNBQVMsY0FBYyx3QkFBd0IsR0FBRyxpQkFBaUIsUUFBU0ksQ0FBYSxDQUMzRixHQUFHLEdBR0YsVUFBVyxDQUNWLFlBQVksdUJBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQXlDN0IsRUFFUCxNQUFNOW9CLEVBQVEsU0FBUyxlQUFlLHNCQUFzQixFQUN0RHVULEVBQVUsU0FBUyxlQUFlLG9CQUFvQixFQUN0RDlLLEVBQVksU0FBUyxlQUFlLGdCQUFnQixFQUUxRCxVQUFVekksRUFBT3lJLENBQVMsRUFFMUIsSUFBSXVnQixFQUFhLEtBRWpCLFNBQVM5ckIsRUFBU0UsRUFBTSxDQUN0QixTQUFTLGVBQWUsb0JBQW9CLEVBQUUsTUFBTSxRQUFVQSxJQUFTLFFBQVUsR0FBSyxPQUN0RixTQUFTLGVBQWUsc0JBQXNCLEVBQUUsTUFBTSxRQUFVQSxJQUFTLFVBQVksR0FBSyxPQUMxRixTQUFTLGVBQWUsdUJBQXVCLEVBQUUsTUFBTSxRQUFVQSxJQUFTLFdBQWEsR0FBSyxNQUM5RixDQUVBbVcsR0FBUyxpQkFBaUIsUUFBUyxJQUFNLENBQ3ZDclcsRUFBUyxPQUFPLEVBQ2hCOHJCLEVBQWEsS0FDYixTQUFTLGVBQWUsY0FBYyxFQUFFLE1BQVEsR0FDaEQsU0FBUyxlQUFlLG9CQUFvQixFQUFFLE1BQVEsR0FDdERocEIsR0FBTyxVQUFVLElBQUksTUFBTSxDQUM3QixDQUFDLEVBR0QsU0FBUyxlQUFlLHFCQUFxQixHQUFHLGlCQUFpQixTQUFXbkYsR0FBTSxDQUNoRixNQUFNSCxFQUFPRyxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQzdCLEdBQUksQ0FBQ0gsRUFBTSxPQUNYLE1BQU1FLEVBQVMsSUFBSSxXQUNuQkEsRUFBTyxPQUFTLElBQU0sQ0FBRSxTQUFTLGVBQWUsY0FBYyxFQUFFLE1BQVFBLEVBQU8sTUFBUSxFQUN2RkEsRUFBTyxXQUFXRixDQUFJLENBQ3hCLENBQUMsRUFHRCxTQUFTLGVBQWUsbUJBQW1CLEdBQUcsaUJBQWlCLFFBQVMsU0FBWSxDQUNsRixNQUFNdXVCLEVBQVUsU0FBUyxlQUFlLGNBQWMsRUFBRSxNQUFNLEtBQUssRUFDN0RDLEVBQVksU0FBUyxlQUFlLG9CQUFvQixFQUFFLE1BQU0sS0FBSyxHQUFLLFFBQ2hGLEdBQUksQ0FBQ0QsRUFBUyxDQUFFLGlCQUFpQiw2QkFBOEIsU0FBUyxFQUFHLE1BQVEsQ0FFbkYsTUFBTWh1QixFQUFNLFNBQVMsZUFBZSxtQkFBbUIsRUFDakRrdUIsRUFBV2x1QixFQUFJLFlBQ3JCQSxFQUFJLFlBQWMsYUFDbEJBLEVBQUksU0FBVyxHQUVmLEdBQUksQ0FDRixNQUFNSCxFQUFPLE1BQU0sU0FBUyw4QkFBK0IsQ0FBRSxLQUFNbXVCLEVBQVMsVUFBQUMsQ0FBVSxDQUFDLEVBQ3ZGRixFQUFhbHVCLEVBQ2JrdUIsRUFBVyxVQUFZRSxFQUN2QkUsRUFBY3R1QixDQUFJLEVBQ2xCb0MsRUFBUyxTQUFTLENBQ3BCLE9BQVNyQyxFQUFHLENBQ1YsaUJBQWlCLGlCQUFtQkEsRUFBRSxRQUFTLE9BQU8sQ0FDeEQsUUFBRSxDQUNBSSxFQUFJLFlBQWNrdUIsRUFDbEJsdUIsRUFBSSxTQUFXLEVBQ2pCLENBQ0YsQ0FBQyxFQUVELFNBQVNtdUIsRUFBY3R1QixFQUFNLENBQzNCLE1BQU0ySCxFQUFZLFNBQVMsZUFBZSx5QkFBeUIsRUFDbkUsSUFBSWpGLEVBQU8sR0FFUDFDLEVBQUssVUFBWUEsRUFBSyxTQUFTLE9BQVMsSUFDMUMwQyxHQUFRLHdGQUF3RjFDLEVBQUssU0FBUyxJQUFJOHRCLEdBQUssU0FBUyxXQUFXQSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxDQUFDLFVBRWhLOXRCLEVBQUssU0FBV0EsRUFBSyxRQUFRLE9BQVMsSUFDeEMwQyxHQUFRLHVGQUF1RjFDLEVBQUssUUFBUSxJQUFJMEosR0FBSyxTQUFTLFdBQVdBLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLENBQUMsVUFHbEtoSCxHQUFRLHNEQUFzRDFDLEVBQUssU0FBUyxNQUFNLG9CQUNsRjBDLEdBQVEsNERBRVIsVUFBVzRYLEtBQU90YSxFQUFLLFNBQVUsQ0FDL0IsTUFBTXV1QixFQUFjalUsRUFBSSxLQUFPLGdCQUFrQixnQkFNakQsR0FMQTVYLEdBQVEscURBQXFENnJCLENBQVcscUVBQ3hFN3JCLEdBQVEscURBQXFELFdBQVc0WCxFQUFJLElBQUksQ0FBQyxHQUM3RUEsRUFBSSxPQUFNNVgsR0FBUSw4RkFBeUYsV0FBVzRYLEVBQUksTUFBTSxDQUFDLFdBQ3JJNVgsR0FBUSxTQUVKLENBQUM0WCxFQUFJLE9BQ1A1WCxHQUFRLHNGQUFzRixXQUFXNFgsRUFBSSxLQUFLLENBQUMsZ0JBQy9HQSxFQUFJLE9BQU8sU0FBUTVYLEdBQVEsK0RBQStENFgsRUFBSSxNQUFNLElBQUluUixHQUFLLEdBQUdBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQ25KbVIsRUFBSSxTQUFTLFNBQVE1WCxHQUFRLGlFQUFpRTRYLEVBQUksUUFBUSxNQUFNLFVBQ2hILE9BQU8sS0FBS0EsRUFBSSxhQUFlLENBQUMsQ0FBQyxFQUFFLFNBQVE1WCxHQUFRLGtFQUFrRSxPQUFPLEtBQUs0WCxFQUFJLFdBQVcsRUFBRSxNQUFNLFVBQ3hKQSxFQUFJLGlCQUFnQjVYLEdBQVEsaUVBQTRELFdBQVc0WCxFQUFJLGNBQWMsQ0FBQyxVQUN0SEEsRUFBSSxXQUFXLE1BQVFBLEVBQUksV0FBVyxRQUFRLENBQ2hELE1BQU1rVSxFQUFRLENBQUMsRUFDWGxVLEVBQUksVUFBVSxNQUFNa1UsRUFBTSxLQUFLLFFBQVFsVSxFQUFJLFVBQVUsSUFBSSxFQUFFLEVBQzNEQSxFQUFJLFVBQVUsUUFBUWtVLEVBQU0sS0FBSyxRQUFRbFUsRUFBSSxVQUFVLE1BQU0sSUFBSSxFQUNyRTVYLEdBQVEsZ0VBQWdFOHJCLEVBQU0sS0FBSyxJQUFJLENBQUMsUUFDMUYsQ0FHRjlyQixHQUFRLFFBQ1YsQ0FDQUEsR0FBUSxTQUNSaUYsRUFBVSxVQUFZakYsQ0FDeEIsQ0FHQSxTQUFTLGVBQWUsa0JBQWtCLEdBQUcsaUJBQWlCLFFBQVMsSUFBTU4sRUFBUyxPQUFPLENBQUMsRUFHOUYsU0FBUyxlQUFlLG9CQUFvQixHQUFHLGlCQUFpQixRQUFTLFNBQVksQ0FDbkYsR0FBSSxDQUFDOHJCLEVBQVksT0FFakIsTUFBTS90QixFQUFNLFNBQVMsZUFBZSxvQkFBb0IsRUFDeERBLEVBQUksWUFBYyxlQUNsQkEsRUFBSSxTQUFXLEdBQ2ZpQyxFQUFTLFVBQVUsRUFFbkIsTUFBTXFzQixFQUFhLFNBQVMsZUFBZSwwQkFBMEIsRUFDckVBLEVBQVcsVUFBWSwyRkFFdkIsR0FBSSxDQUNGLE1BQU1wa0IsRUFBUyxNQUFNLFNBQVMsOEJBQStCLENBQzNELFNBQVU2akIsRUFBVyxTQUNyQixTQUFVQSxFQUFXLFNBQ3JCLFVBQVdBLEVBQVcsU0FDeEIsQ0FBQyxFQUVELElBQUl4ckIsRUFBTyw4REFBOEQsV0FBVzJILEVBQU8sU0FBUyxDQUFDLHFDQUNyRzNILEdBQVEsNERBRVIsVUFBV3lPLEtBQUs5RyxFQUFPLFFBQVMsQ0FDOUIsTUFBTStDLEVBQU8rRCxFQUFFLFNBQVcsWUFBY0EsRUFBRSxTQUFXLFVBQVksU0FBTUEsRUFBRSxTQUFXLFNBQVcsU0FBTUEsRUFBRSxTQUFXLFVBQVksU0FBTSxTQUNwSXpPLEdBQVEsK0ZBQ1JBLEdBQVEsR0FBRzBLLENBQUksWUFBWSxXQUFXK0QsRUFBRSxJQUFJLENBQUMsY0FBY0EsRUFBRSxJQUFJLFlBQU8sV0FBV0EsRUFBRSxNQUFNLENBQUMsR0FDeEZBLEVBQUUsUUFBT3pPLEdBQVEsd0NBQXdDLFdBQVd5TyxFQUFFLEtBQUssQ0FBQyxXQUM1RUEsRUFBRSxZQUFXek8sR0FBUSxpQkFBWSxXQUFXeU8sRUFBRSxTQUFTLENBQUMsV0FDeERBLEVBQUUsU0FBUXpPLEdBQVEsd0NBQXdDLFdBQVd5TyxFQUFFLE1BQU0sQ0FBQyxZQUNsRnpPLEdBQVEsUUFDVixDQUNBQSxHQUFRLFNBQ1JBLEdBQVEsa0lBRVIrckIsRUFBVyxVQUFZL3JCLEVBQ3ZCLFNBQVMsZUFBZSxrQkFBa0IsR0FBRyxpQkFBaUIsUUFBUyxJQUFNLENBQzNFd0MsR0FBTyxVQUFVLE9BQU8sTUFBTSxFQUMxQixPQUFPLE9BQU8sY0FBaUIsWUFBWSxPQUFPLGFBQWEsRUFBRSxLQUFLLElBQU0sQ0FBTSxPQUFPLE9BQU8sV0FBYyxZQUFZLE9BQU8sVUFBVSxDQUFHLENBQUMsQ0FDckosQ0FBQyxFQUVELGlCQUFpQixVQUFVbUYsRUFBTyxTQUFTLGFBQWMsU0FBUyxDQUNwRSxPQUFTdEssRUFBRyxDQUNWMHVCLEVBQVcsVUFBWSw2RUFBNkUsV0FBVzF1QixFQUFFLE9BQU8sQ0FBQztBQUFBLDBJQUV6SCxTQUFTLGVBQWUsbUJBQW1CLEdBQUcsaUJBQWlCLFFBQVMsSUFBTXFDLEVBQVMsT0FBTyxDQUFDLENBQ2pHLFFBQUUsQ0FDQWpDLEVBQUksWUFBYyxhQUNsQkEsRUFBSSxTQUFXLEVBQ2pCLENBQ0YsQ0FBQyxDQUNILEdBQUcsR0FHRixVQUFXLENBQ1YsWUFBWSxhQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQVFuQixFQUVQLE1BQU0rRSxFQUFRLFNBQVMsZUFBZSxZQUFZLEVBQzVDd3BCLEVBQVMsU0FBUyxlQUFlLGVBQWUsRUFDaERoZCxFQUFXLFNBQVMsZUFBZSxZQUFZLEVBRXJELElBQUlzRyxFQUFPLEtBQ1AyVyxFQUFLLEtBQ0xDLEVBQVcsS0FFZixTQUFTQyxHQUFVLENBQ2pCLEdBQUlGLEVBQUksQ0FBRSxHQUFJLENBQUVBLEVBQUcsTUFBTSxDQUFHLE1BQVksQ0FBQyxDQUFFQSxFQUFLLElBQU0sQ0FDdEQsR0FBSTNXLEVBQU0sQ0FBRSxHQUFJLENBQUVBLEVBQUssUUFBUSxDQUFHLE1BQVksQ0FBQyxDQUFFQSxFQUFPLElBQU0sQ0FDOUQ0VyxFQUFXLEtBQ1hGLEVBQU8sVUFBWSxFQUNyQixDQUVBLFNBQVNJLEVBQVN6WSxFQUFhTSxFQUFlLENBTzVDLEdBTkFrWSxFQUFRLEVBRVIsU0FBUyxlQUFlLFlBQVksRUFBRSxZQUFjLG1CQUFjbFksR0FBaUJOLENBQVcsR0FDOUZuUixHQUFPLFVBQVUsSUFBSSxNQUFNLEVBR3ZCLE9BQU8sU0FBYSxJQUFhLENBQ25Dd3BCLEVBQU8sVUFBWSw2RkFDbkIsTUFDRixDQUVBMVcsRUFBTyxJQUFJLFNBQVMsQ0FDbEIsWUFBYSxHQUNiLFNBQVUsR0FDVixXQUFZLHNEQUNaLE1BQU8sQ0FDTCxXQUFZLFVBQ1osV0FBWSxVQUNaLE9BQVEsVUFDUixvQkFBcUIsU0FDdkIsRUFDQSxXQUFZLEdBQ2QsQ0FBQyxFQUdHLE9BQU8sU0FBYSxNQUN0QjRXLEVBQVcsSUFBSSxTQUFTLFNBQ3hCNVcsRUFBSyxVQUFVNFcsQ0FBUSxHQUd6QjVXLEVBQUssS0FBSzBXLENBQU0sRUFDWkUsR0FFRixXQUFXLElBQU1BLEVBQVMsSUFBSSxFQUFHLEVBQUUsRUFJckMsTUFBTTlqQixFQUFXLFNBQVMsV0FBYSxTQUFXLE9BQVMsTUFDM0Q2akIsRUFBSyxJQUFJLFVBQVUsR0FBRzdqQixDQUFRLEtBQUssU0FBUyxJQUFJLFlBQVksbUJBQW1CdUwsQ0FBVyxDQUFDLEVBQUUsRUFDN0ZzWSxFQUFHLFdBQWEsY0FFaEJBLEVBQUcsT0FBUyxJQUFNLENBR2hCLEdBRkEzVyxFQUFLLFFBQVEsOEJBQThCLEVBRXZDNFcsRUFBVSxDQUNaLE1BQU1HLEVBQU9ILEVBQVMsa0JBQWtCLEVBQ3BDRyxHQUNGSixFQUFHLEtBQUssS0FBSyxVQUFVLENBQUUsS0FBTSxTQUFVLEtBQU1JLEVBQUssS0FBTSxLQUFNQSxFQUFLLElBQUssQ0FBQyxDQUFDLENBRWhGLENBQ0YsRUFFQUosRUFBRyxVQUFhNXVCLEdBQU0sQ0FDcEIsR0FBSSxPQUFPQSxFQUFFLE1BQVMsU0FBVSxDQUM5QixHQUFJLENBQ0YsTUFBTTRULEVBQU0sS0FBSyxNQUFNNVQsRUFBRSxJQUFJLEVBQzdCLEdBQUk0VCxFQUFJLE9BQVMsWUFBYSxDQUM1QnFFLEVBQUssUUFBUSxzQkFBc0JyRSxFQUFJLEtBQUs7QUFBQSxDQUFjLEVBQzFELE1BQ0YsQ0FDQSxHQUFJQSxFQUFJLE9BQVMsUUFBUyxDQUN4QnFFLEVBQUssUUFBUSxrQkFBa0JyRSxFQUFJLE9BQU8sU0FBUyxFQUNuRCxNQUNGLENBQ0EsR0FBSUEsRUFBSSxPQUFTLE9BQVEsQ0FDdkJxRSxFQUFLLFFBQVE7QUFBQSw4QkFBbUMsRUFDaEQsTUFDRixDQUNGLE1BQVksQ0FBQyxDQUViQSxFQUFLLE1BQU1qWSxFQUFFLElBQUksQ0FDbkIsTUFFRWlZLEVBQUssTUFBTSxJQUFJLFdBQVdqWSxFQUFFLElBQUksQ0FBQyxDQUVyQyxFQUVBNHVCLEVBQUcsUUFBVSxJQUFNLENBQ2IzVyxHQUFNQSxFQUFLLFFBQVE7QUFBQSw2QkFBa0MsQ0FDM0QsRUFFQTJXLEVBQUcsUUFBVSxJQUFNLENBQ2IzVyxHQUFNQSxFQUFLLFFBQVE7QUFBQSxpQ0FBc0MsQ0FDL0QsRUFHQUEsRUFBSyxPQUFRaFksR0FBUyxDQUNoQjJ1QixHQUFNQSxFQUFHLGFBQWUsVUFBVSxNQUNwQ0EsRUFBRyxLQUFLM3VCLENBQUksQ0FFaEIsQ0FBQyxFQUdEZ1ksRUFBSyxTQUFTLENBQUMsQ0FBRSxLQUFBZ1gsRUFBTSxLQUFBQyxDQUFLLElBQU0sQ0FDNUJOLEdBQU1BLEVBQUcsYUFBZSxVQUFVLE1BQ3BDQSxFQUFHLEtBQUssS0FBSyxVQUFVLENBQUUsS0FBTSxTQUFVLEtBQUFLLEVBQU0sS0FBQUMsQ0FBSyxDQUFDLENBQUMsQ0FFMUQsQ0FBQyxFQUdELE1BQU1DLEVBQWdCLElBQU0sQ0FBTU4sR0FBVUEsRUFBUyxJQUFJLENBQUcsRUFDNUQsT0FBTyxpQkFBaUIsU0FBVU0sQ0FBYSxFQUcvQ2hxQixFQUFNLGVBQWlCZ3FCLENBQ3pCLENBRUF4ZCxHQUFVLGlCQUFpQixRQUFTLElBQU0sQ0FDeENtZCxFQUFRLEVBQ0ozcEIsRUFBTSxnQkFDUixPQUFPLG9CQUFvQixTQUFVQSxFQUFNLGNBQWMsRUFFM0RBLEdBQU8sVUFBVSxPQUFPLE1BQU0sQ0FDaEMsQ0FBQyxFQUdEQSxHQUFPLGlCQUFpQixRQUFVbkYsR0FBTSxDQUNsQ0EsRUFBRSxTQUFXbUYsSUFDZjJwQixFQUFRLEVBQ0ozcEIsRUFBTSxnQkFDUixPQUFPLG9CQUFvQixTQUFVQSxFQUFNLGNBQWMsRUFFM0RBLEdBQU8sVUFBVSxPQUFPLE1BQU0sRUFFbEMsQ0FBQyxFQUdELE9BQU8sY0FBZ0I0cEIsQ0FDekIsR0FBRyxHQU1GLFVBQVcsQ0FFVixZQUFZLGNBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQThDcEIsRUFFUCxNQUFNNXBCLEVBQVEsU0FBUyxlQUFlLGFBQWEsRUFDN0N1VCxFQUFVLFNBQVMsZUFBZSxlQUFlLEVBQ2pEOUssRUFBWSxTQUFTLGVBQWUsY0FBYyxFQUNsRDZELEVBQWEsU0FBUyxlQUFlLG1CQUFtQixFQUN4REMsRUFBVyxTQUFTLGVBQWUsaUJBQWlCLEVBQ3BEMGQsRUFBZSxTQUFTLGVBQWUsY0FBYyxFQUNyREMsRUFBZ0IsU0FBUyxlQUFlLHNCQUFzQixFQUM5RHRkLEVBQWEsU0FBUyxlQUFlLGFBQWEsRUFDbERDLEVBQWEsU0FBUyxlQUFlLGFBQWEsRUFDbERwSyxFQUFZLFNBQVMsZUFBZSxxQkFBcUIsRUFDekRxSyxFQUFjLFNBQVMsZUFBZSxpQkFBaUIsRUFDN0QsSUFBSUcsRUFBZ0IsRUFDaEJDLEVBQVcsS0FDWEMsRUFBYyxFQUdsQixNQUFNSCxFQUFZLEdBSWxCLFNBQVNLLEVBQU1DLEVBQWMsQ0FDM0IsR0FBSSxDQUFDQSxFQUFjLE9BQU8sS0FJMUIsTUFBTUMsRUFBSSxJQUFJLEtBQUtELENBQVksRUFDL0IsT0FBSSxNQUFNQyxFQUFFLFFBQVEsQ0FBQyxFQUFVLEtBQ3hCQSxFQUFFLFlBQVksQ0FDdkIsQ0FFQSxlQUFlNGMsRUFBVW5jLEVBQVEsQ0FDL0IsR0FBSSxDQUNHQSxHQVNDZCxHQUFVQSxFQUFTLE1BQU0sRUFDN0JBLEVBQVcsSUFBSSxrQkFQWEEsR0FBVUEsRUFBUyxNQUFNLEVBQzdCQSxFQUFXLElBQUksZ0JBQ2ZELEVBQWdCLEVBQ2hCRSxJQUNBMUssRUFBVSxVQUFZLGlGQUt4QixNQUFNd0wsRUFBVWQsRUFDVlEsRUFBUyxJQUFJLGdCQUNuQkEsRUFBTyxJQUFJLFFBQVMsT0FBT1gsQ0FBUyxDQUFDLEVBQ3JDVyxFQUFPLElBQUksU0FBVSxPQUFPVixDQUFhLENBQUMsRUFDMUMsTUFBTW5CLEVBQVNtZSxFQUFhLE1BQ3RCRyxFQUFVRixFQUFjLE1BQ3hCdGMsRUFBUVAsRUFBTVQsRUFBVyxLQUFLLEVBQzlCaUIsRUFBUVIsRUFBTVIsRUFBVyxLQUFLLEVBQ2hDZixHQUFRNkIsRUFBTyxJQUFJLFNBQVU3QixDQUFNLEVBQ25Dc2UsR0FBU3pjLEVBQU8sSUFBSSxVQUFXeWMsQ0FBTyxFQUN0Q3hjLEdBQU9ELEVBQU8sSUFBSSxRQUFTQyxDQUFLLEVBQ2hDQyxHQUFPRixFQUFPLElBQUksUUFBU0UsQ0FBSyxFQUVwQyxNQUFNdlIsRUFBTSxNQUFNLE1BQU0sc0JBQXdCcVIsRUFBTyxTQUFTLEVBQUcsQ0FDakUsT0FBUVQsRUFBUyxNQUNuQixDQUFDLEVBSUQsR0FBSSxDQUFDNVEsRUFBSSxHQUFJLENBQ1htRyxFQUFVLFVBQVksdUVBQXVFbkcsRUFBSSxNQUFNLFNBQ3ZHd1EsRUFBWSxNQUFNLFFBQVUsT0FDNUIsTUFDRixDQUNBLE1BQU1oUyxFQUFPLE1BQU13QixFQUFJLEtBQUssRUFDNUIsR0FBSSxDQUFDeEIsRUFBSyxRQUFTLENBQ2pCMkgsRUFBVSxVQUFZLGtFQUFrRSxXQUFXM0gsRUFBSyxPQUFTLFNBQVMsQ0FBQyxTQUMzSGdTLEVBQVksTUFBTSxRQUFVLE9BQzVCLE1BQ0YsQ0FHQSxHQUFJLENBQUNrQixHQUFVQyxJQUFZZCxFQUFhLE9BQ3hDLE1BQU0yVCxFQUFVLE1BQU0sUUFBUWhtQixFQUFLLE9BQU8sRUFBSUEsRUFBSyxRQUFVLENBQUMsRUFFOUQsR0FBSWdtQixFQUFRLFNBQVcsR0FBSyxDQUFDOVMsRUFBUSxDQUNuQyxNQUFNRyxFQUFTclQsRUFBSyxVQUFZQSxFQUFLLFFBQVEsUUFBVUEsRUFBSyxRQUFRLFNBQVdBLEVBQUssUUFBUSxPQUFTQSxFQUFLLFFBQVEsT0FDOUcsaUNBQ0Esa0VBQ0oySCxFQUFVLFVBQVkscUVBQThELFdBQVcwTCxDQUFNLENBQUMsU0FDdEdyQixFQUFZLE1BQU0sUUFBVSxPQUM1QixNQUNGLENBRUEsSUFBSXRQLEVBQU8sR0FDTndRLElBQ0h4USxFQUFPLDhFQUNQQSxHQUFRLDRFQUNSQSxHQUFRLHdEQUNSQSxHQUFRLHlEQUNSQSxHQUFRLHNEQUNSQSxHQUFRLDBEQUNSQSxHQUFRLDREQUNSQSxHQUFRLDBEQUNSQSxHQUFRLFNBR1YsVUFBVzNDLEtBQUtpbUIsRUFBUyxDQUN2QixNQUFNOEUsRUFBSy9xQixFQUFFLFVBQVksVUFDbkJ3dkIsRUFBUUMsRUFBV3p2QixDQUFDLEVBQzFCMkMsR0FBUSwwRkFDUkEsR0FBUSx5REFBeUQsV0FBVzNDLEVBQUUsV0FBYSxFQUFFLENBQUMsS0FBSyxRQUFRQSxFQUFFLFNBQVMsQ0FBQyxRQUN2SDJDLEdBQVEsaURBQWlENnNCLENBQUssUUFDOUQ3c0IsR0FBUSx5RUFBeUUsV0FBVzNDLEVBQUUsSUFBTSxHQUFHLENBQUMsUUFDeEcyQyxHQUFRLCtDQUErQyxXQUFXM0MsRUFBRSxRQUFVLEdBQUcsQ0FBQyxRQUNsRjJDLEdBQVEsNkJBQTZCLFdBQVczQyxFQUFFLFVBQVksR0FBRyxDQUFDLFFBQ2xFMkMsR0FBUSxpREFBaURvb0IsRUFBSyxlQUFpQixlQUFlLE1BQU1BLEVBQUssU0FBTSxRQUFHLElBQUksV0FBVy9xQixFQUFFLFNBQVcsRUFBRSxDQUFDLGVBQ2pKMkMsR0FBUSxRQUNKM0MsRUFBRSxTQUFXLE9BQU8sS0FBS0EsRUFBRSxPQUFPLEVBQUUsT0FBUyxJQUMvQzJDLEdBQVEsa05BQWtOLFdBQVcsS0FBSyxVQUFVM0MsRUFBRSxRQUFTLEtBQU0sQ0FBQyxDQUFDLENBQUMsbUJBRTVRLENBRUEsR0FBSSxDQUFDbVQsRUFDSHhRLEdBQVEsV0FDUmlGLEVBQVUsVUFBWWpGLE1BQ2pCLENBQ0wsTUFBTWtSLEVBQVFqTSxFQUFVLGNBQWMsT0FBTyxFQUN6Q2lNLEdBQU9BLEVBQU0sbUJBQW1CLFlBQWFsUixDQUFJLENBQ3ZELENBRUF5UCxHQUFpQjZULEVBQVEsT0FHekJoVSxFQUFZLE1BQU0sUUFBVWhTLEVBQUssUUFBVSxHQUFLLE9BR2hEMkgsRUFBVSxpQkFBaUIsWUFBWSxFQUFFLFFBQVFvQyxHQUFPLENBQ2xEQSxFQUFJLFFBQVEsUUFDaEJBLEVBQUksUUFBUSxNQUFRLE9BQ3BCQSxFQUFJLGlCQUFpQixRQUFTLElBQU0sQ0FDbEMsTUFBTThKLEVBQVM5SixFQUFJLG1CQUNmOEosR0FBVUEsRUFBTyxVQUFVLFNBQVMsY0FBYyxJQUNwREEsRUFBTyxNQUFNLFFBQVVBLEVBQU8sTUFBTSxVQUFZLE9BQVMsR0FBSyxPQUVsRSxDQUFDLEVBQ0gsQ0FBQyxDQUNILE9BQVM5VCxFQUFHLENBS1YsR0FBSUEsR0FBS0EsRUFBRSxPQUFTLGFBQWMsT0FDbEM0SCxFQUFVLFVBQVksa0VBQWtFLFdBQVc1SCxFQUFFLE9BQU8sQ0FBQyxRQUMvRyxDQUNGLENBTUEsU0FBU3l2QixFQUFXcmpCLEVBQU8sQ0FDekIsTUFBTXNHLEVBQUl0RyxFQUFNLFNBQVcsQ0FBQyxFQUN0QmxKLEVBQVF3UCxFQUFFLFVBQ1ZyRyxFQUFLcUcsRUFBRSxPQUNQZ2QsRUFBT2hkLEVBQUUsU0FDVDhKLEVBQVc5SixFQUFFLFlBQ25CLEdBQUl4UCxFQUFPLENBQ1QsTUFBTXlzQixFQUFNRCxFQUFPLDREQUE0RCxXQUFXQSxDQUFJLENBQUMsR0FBR2xULEVBQVcsSUFBTSxXQUFXQSxDQUFRLEVBQUksRUFBRSxXQUFhLEdBQ3pKLE1BQU8sR0FBRyxXQUFXdFosQ0FBSyxDQUFDLEdBQUd5c0IsQ0FBRyxFQUNuQyxDQUNBLE9BQUl0akIsRUFBVyw4REFBOEQsV0FBV0EsQ0FBRSxDQUFDLFVBQ3RGRCxFQUFNLEdBQ0osaURBRGUsa0RBRXhCLENBRUFzTSxHQUFTLGlCQUFpQixRQUFTLElBQU0sQ0FDdkN2VCxHQUFPLFVBQVUsSUFBSSxNQUFNLEVBQzNCbXFCLEVBQVUsRUFBSyxDQUNqQixDQUFDLEVBQ0QsVUFBVW5xQixFQUFPeUksQ0FBUyxFQUMxQjZELEdBQVksaUJBQWlCLFFBQVMsSUFBTTZkLEVBQVUsRUFBSyxDQUFDLEVBQzVERixHQUFjLGlCQUFpQixTQUFVLElBQU1FLEVBQVUsRUFBSyxDQUFDLEVBQy9ERCxHQUFlLGlCQUFpQixTQUFVLElBQU1DLEVBQVUsRUFBSyxDQUFDLEVBR2hFLElBQUlwYixFQUNKLENBQUNuQyxFQUFZQyxDQUFVLEVBQUUsUUFBUy9LLEdBQU8sQ0FDdkNBLEdBQUksaUJBQWlCLFNBQVUsSUFBTSxDQUNuQyxhQUFhaU4sQ0FBWSxFQUN6QkEsRUFBZSxXQUFXLElBQU1vYixFQUFVLEVBQUssRUFBRyxHQUFHLENBQ3ZELENBQUMsQ0FDSCxDQUFDLEVBQ0RyZCxHQUFhLGlCQUFpQixRQUFTLElBQU1xZCxFQUFVLEVBQUksQ0FBQyxFQUU1RDVkLEdBQVUsaUJBQWlCLFFBQVMsU0FBWSxDQUM5QyxHQUFLLFFBQVEsb0RBQW9ELEVBQ2pFLEdBQUksQ0FNRixNQUFNelIsRUFBTyxNQUxELE1BQU0sWUFBWSxxQkFBc0IsQ0FDbEQsT0FBUSxTQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxRQUFTLE9BQVEsQ0FBQyxDQUMzQyxDQUFDLEdBQ3NCLEtBQUssRUFDeEJBLEVBQUssUUFBU3F2QixFQUFVLEVBQUssRUFDNUIsaUJBQWlCLFdBQWFydkIsRUFBSyxPQUFTLGdCQUFpQixPQUFPLENBQzNFLE9BQVNELEVBQUcsQ0FDVixpQkFBaUIsVUFBWUEsRUFBRSxRQUFTLE9BQU8sQ0FDakQsQ0FDRixDQUFDLENBQ0gsR0FBRyxHQVFGLFVBQVcsQ0FDVixZQUFZLGlCQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBK0V2QixFQUdQLE1BQU1tRixFQUFRLFNBQVMsZUFBZSxnQkFBZ0IsRUFDaER1VCxFQUFVLFNBQVMsZUFBZSxxQkFBcUIsRUFDdkQ5SyxFQUFZLFNBQVMsZUFBZSxZQUFZLEVBQ2hEZ2lCLEVBQU96cUIsRUFBTSxpQkFBaUIsVUFBVSxFQUN4QzBxQixFQUFTMXFCLEVBQU0saUJBQWlCLFlBQVksRUFFbEQsSUFBSTJxQixFQUFZLENBQUMsRUFDYkMsRUFBVyxDQUFDLEVBQ1pDLEVBQVksS0FHaEJKLEVBQUssUUFBUXpXLEdBQU8sQ0FDbEJBLEVBQUksaUJBQWlCLFFBQVMsSUFBTSxDQUNsQ3lXLEVBQUssUUFBUTl1QixHQUFLQSxFQUFFLFVBQVUsT0FBTyxTQUFVQSxJQUFNcVksQ0FBRyxDQUFDLEVBQ3pEMFcsRUFBTyxRQUFRem1CLEdBQUtBLEVBQUUsTUFBTSxRQUFVQSxFQUFFLFFBQVEsUUFBVStQLEVBQUksUUFBUSxJQUFNLEdBQUssTUFBTSxFQUNuRkEsRUFBSSxRQUFRLE1BQVEsWUFBWThXLEVBQWdCLEVBQ2hEOVcsRUFBSSxRQUFRLE1BQVEsVUFBVStXLEVBQWMsRUFDNUMvVyxFQUFJLFFBQVEsTUFBUSxTQUFTZ1gsRUFBYSxDQUNoRCxDQUFDLENBQ0gsQ0FBQyxFQUdHelgsR0FDRkEsRUFBUSxpQkFBaUIsUUFBUyxJQUFNLENBQ3RDdlQsRUFBTSxVQUFVLElBQUksTUFBTSxFQUMxQjhxQixFQUFnQixFQUNoQkcsRUFBYyxDQUNoQixDQUFDLEVBRUh4aUIsRUFBVSxpQkFBaUIsUUFBU3FKLENBQVUsRUFDOUM5UixFQUFNLGlCQUFpQixRQUFTbkYsR0FBSyxDQUFNQSxFQUFFLFNBQVdtRixHQUFPOFIsRUFBVyxDQUFHLENBQUMsRUFDOUUsU0FBU0EsR0FBYSxDQUNwQjlSLEVBQU0sVUFBVSxPQUFPLE1BQU0sRUFDN0JrckIsRUFBYSxDQUNmLENBR0EsU0FBU0QsR0FBZ0IsQ0FFdkIsR0FEQUMsRUFBYSxFQUNULEVBQUMsU0FBUyxlQUFlLGVBQWUsRUFBRSxTQUMxQyxTQUFPLFlBQWdCLEtBQzNCLEdBQUksQ0FDRkwsRUFBWSxJQUFJLFlBQVksZ0NBQWdDLEVBQzVEQSxFQUFVLGlCQUFpQixPQUFTaHdCLEdBQU0sQ0FDeEMsR0FBSSxDQUVGOHZCLEVBRGEsS0FBSyxNQUFNOXZCLEVBQUUsSUFBSSxFQUNiLFFBQVUsQ0FBQyxFQUM1QnN3QixFQUFhLENBQ2YsTUFBUSxDQUFDLENBQ1gsQ0FBQyxFQUNETixFQUFVLGlCQUFpQixXQUFhaHdCLEdBQU0sQ0FDNUMsR0FBSSxDQUNGLE1BQU11WSxFQUFLLEtBQUssTUFBTXZZLEVBQUUsSUFBSSxFQUM1Qjh2QixFQUFVLFFBQVF2WCxDQUFFLEVBQ2hCdVgsRUFBVSxPQUFTLE1BQUtBLEVBQVUsT0FBUyxLQUUvQyxNQUFNUyxFQUFTcHJCLEVBQU0sY0FBYyxpQkFBaUIsR0FBRyxTQUFTLElBQzVEb3JCLElBQVcsU0FBVUQsRUFBYSxFQUM3QkMsSUFBVyxZQUFZTixFQUFnQixDQUNsRCxNQUFRLENBQUMsQ0FDWCxDQUFDLEVBQ0RELEVBQVUsUUFBVSxJQUFNLENBQWdDLENBQzVELE9BQVNod0IsRUFBRyxDQUNWLFFBQVEsS0FBSyx5QkFBMEJBLEVBQUUsT0FBTyxDQUNsRCxDQUNGLENBQ0EsU0FBU3F3QixHQUFlLENBQ3RCLEdBQUlMLEVBQVcsQ0FBRSxHQUFJLENBQUVBLEVBQVUsTUFBTSxDQUFHLE1BQVEsQ0FBQyxDQUFFQSxFQUFZLElBQU0sQ0FDekUsQ0FDQSxTQUFTLGVBQWUsZUFBZSxFQUFFLGlCQUFpQixTQUFVLElBQU0sQ0FDcEU3cUIsRUFBTSxVQUFVLFNBQVMsTUFBTSxHQUFHaXJCLEVBQWMsQ0FDdEQsQ0FBQyxFQUdELGVBQWVILEdBQWtCLENBQy9CLEdBQUksQ0FDRixNQUFNbGQsRUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUksS0FBYSxFQUFFLFlBQVksRUFDekQsQ0FBQ3lkLEVBQVVDLEVBQVVDLENBQVMsRUFBSSxNQUFNLFFBQVEsSUFBSSxDQUN4RCxNQUFNLHVDQUF1QyxtQkFBbUIzZCxDQUFLLENBQUMsRUFBRSxFQUN4RSxNQUFNLHdCQUF3QixFQUM5QixNQUFNLHlDQUF5QyxtQkFBbUJBLENBQUssQ0FBQyxFQUFFLENBQzVFLENBQUMsRUFDSzRQLEdBQVMsTUFBTTZOLEVBQVMsS0FBSyxHQUFHLE1BQVEsQ0FBQyxFQUN6Q0csR0FBUyxNQUFNRixFQUFTLEtBQUssR0FBRyxNQUFNLE9BQVMsQ0FBQyxFQUNoREcsR0FBZSxNQUFNRixFQUFVLEtBQUssR0FBRyxNQUFNLE9BQVMsRUFFNUQsU0FBUyxjQUFjLCtCQUErQixFQUFFLFlBQWMsR0FBR0UsQ0FBVyxnQkFDcEYsU0FBUyxjQUFjLDhCQUE4QixFQUFFLFlBQWMsR0FBR2pPLEVBQU0sYUFBYSxNQUFRLENBQUMsWUFDcEcsU0FBUyxjQUFjLCtCQUErQixFQUFFLFlBQWMsR0FBR0EsRUFBTSxhQUFhLE9BQVMsQ0FBQyxVQUN0RyxTQUFTLGNBQWMsZ0NBQWdDLEVBQUUsWUFBYyxHQUFHQSxFQUFNLFlBQVksUUFBVSxDQUFDLFVBQ3ZHLFNBQVMsY0FBYywrQkFBK0IsRUFBRSxZQUFjLEdBQUdnTyxFQUFNLE1BQU0sU0FFckZFLEVBQWMsaUJBQWtCbE8sRUFBTSxZQUFjLENBQUMsQ0FBQyxFQUN0RGtPLEVBQWMsa0JBQW1CbE8sRUFBTSxhQUFlLENBQUMsQ0FBQyxDQUMxRCxPQUFTM2lCLEVBQUcsQ0FDVixRQUFRLEtBQUsscUNBQXNDQSxFQUFFLE9BQU8sQ0FDOUQsQ0FDRixDQUNBLFNBQVM2d0IsRUFBY3hrQixFQUFJeWtCLEVBQU8sQ0FDaEMsTUFBTTdwQixFQUFLLFNBQVMsZUFBZW9GLENBQUUsRUFDckMsR0FBSSxDQUFDeWtCLEVBQU0sT0FBUSxDQUFFN3BCLEVBQUcsVUFBWSx5Q0FBMEMsTUFBUSxDQUN0RkEsRUFBRyxVQUFZLGdEQUNiNnBCLEVBQU0sSUFBSUMsR0FBTSx1REFBdURyYixFQUFXLE9BQU9xYixFQUFHLEdBQUcsQ0FBQyxDQUFDLHlEQUF5REEsRUFBRyxLQUFLLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFDdkwsVUFDSixDQUdBLE1BQU1DLEVBQWUsU0FBUyxlQUFlLG1CQUFtQixFQUMxREMsRUFBaUIsU0FBUyxlQUFlLHFCQUFxQixFQUM5REMsRUFBYSxTQUFTLGVBQWUsaUJBQWlCLEVBQ3REQyxFQUFjLFNBQVMsZUFBZSxrQkFBa0IsRUFDeEQxZixFQUFhLFNBQVMsZUFBZSxpQkFBaUIsRUFFNUQsQ0FBQ3VmLEVBQWNDLEVBQWdCQyxDQUFVLEVBQUUsUUFBUWpxQixHQUFNQSxFQUFHLGlCQUFpQixTQUFVaXBCLENBQWEsQ0FBQyxFQUNyR2lCLEVBQVksaUJBQWlCLFFBQVNDLEVBQVNsQixFQUFlLEdBQUcsQ0FBQyxFQUNsRXplLEVBQVcsaUJBQWlCLFFBQVN5ZSxDQUFhLEVBRWxELGVBQWVBLEdBQWdCLENBQzdCLEdBQUksQ0FDRixNQUFNcGQsRUFBUyxJQUFJLGdCQUNuQkEsRUFBTyxJQUFJLFFBQVMsS0FBSyxFQUNyQmtlLEVBQWEsT0FBUWxlLEVBQU8sSUFBSSxjQUFla2UsRUFBYSxLQUFLLEVBQ2pFQyxFQUFlLE9BQU9uZSxFQUFPLElBQUksV0FBWW1lLEVBQWUsS0FBSyxFQUNqRUMsRUFBVyxPQUFVcGUsRUFBTyxJQUFJLGNBQWVvZSxFQUFXLEtBQUssRUFDL0RDLEVBQVksT0FBU3JlLEVBQU8sSUFBSSxlQUFnQnFlLEVBQVksS0FBSyxFQUlyRXJCLEdBRGMsTUFERixNQUFNLE1BQU0sMkJBQTJCaGQsQ0FBTSxFQUFFLEdBQ25DLEtBQUssR0FBRyxLQUNmLFFBQVUsQ0FBQyxFQUM1QndkLEVBQWEsR0FHVCxDQUFDWSxFQUFXLFFBQVEsUUFBVUEsRUFBVyxRQUFRLFNBQVcsSUFDOUQsTUFBTUcsRUFBa0IsQ0FFNUIsT0FBU3J4QixFQUFHLENBQ1YsU0FBUyxlQUFlLHNCQUFzQixFQUFFLFVBQVkseUNBQXlDMFYsRUFBVzFWLEVBQUUsT0FBTyxFQUFFLFFBQzdILENBQ0YsQ0FFQSxTQUFTc3dCLEdBQWUsQ0FDdEIsTUFBTXJwQixFQUFLLFNBQVMsZUFBZSxzQkFBc0IsRUFDekQsR0FBSSxDQUFDNm9CLEVBQVUsT0FBUSxDQUFFN29CLEVBQUcsVUFBWSwyQ0FBNEMsTUFBUSxDQUM1RkEsRUFBRyxVQUFZNm9CLEVBQVUsTUFBTSxFQUFHLEdBQUcsRUFBRSxJQUFJd0IsQ0FBYyxFQUFFLEtBQUssRUFBRSxDQUNwRSxDQUVBLFNBQVNBLEVBQWUvWSxFQUFJLENBQzFCLE1BQU1nUSxFQUFNaFEsRUFBRyxVQUFZLE9BQ3JCZ1osRUFBVyxDQUNmLFNBQVUsVUFBVyxNQUFPLFVBQVcsS0FBTSxVQUM3QyxPQUFRLFVBQVcsS0FBTSxTQUMzQixFQUFFaEosQ0FBRyxHQUFLLFVBQ0p4RSxFQUFPeEwsRUFBRyxHQUFLLElBQUksS0FBS0EsRUFBRyxFQUFFLEVBQUUsbUJBQW1CLEVBQUksR0FDdERrQyxFQUFTbEMsRUFBRyxhQUFlLEdBQzNCaVgsRUFBUWpYLEVBQUcsT0FBUyxTQUNwQmdGLEVBQVNoRixFQUFHLFFBQVUsR0FDdEJ0SCxFQUFTc0gsRUFBRyxRQUFVLEdBQ3RCZ1gsRUFBVWhYLEVBQUcsU0FBVyxHQUM5QixNQUFPO0FBQUEsMkJBQ2dCZ1osQ0FBUSxzQkFBc0I3YixFQUFXNlMsQ0FBRyxDQUFDO0FBQUEsNERBQ1o3UyxFQUFXK0UsQ0FBTSxDQUFDO0FBQUEscUJBQ3pEL0UsRUFBVzhaLENBQUssQ0FBQyx3RUFBd0U5WixFQUFXOFosQ0FBSyxDQUFDO0FBQUEscUJBQzFHOVosRUFBVzZILENBQU0sQ0FBQyx3RUFBd0U3SCxFQUFXekUsQ0FBTSxDQUFDLElBQUl5RSxFQUFXNkgsQ0FBTSxDQUFDO0FBQUEsNERBQzNGN0gsRUFBVzZaLENBQU8sQ0FBQztBQUFBLDZFQUNGN1osRUFBV3FPLENBQUksQ0FBQztBQUFBLFdBRTNGLENBRUEsZUFBZXNOLEdBQW9CLENBQ2pDLEdBQUksQ0FFRixNQUFNVixHQUFTLE1BREgsTUFBTSxNQUFNLHdCQUF3QixHQUN2QixLQUFLLEdBQUcsTUFBTSxPQUFTLENBQUMsRUFDM0NhLEVBQVVOLEVBQVcsTUFDM0JBLEVBQVcsVUFBWSxzQ0FDckJQLEVBQU0sSUFBSXBMLEdBQUssa0JBQWtCN1AsRUFBVzZQLEVBQUUsRUFBRSxDQUFDLEtBQUs3UCxFQUFXNlAsRUFBRSxPQUFTQSxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQ25HaU0sSUFBU04sRUFBVyxNQUFRTSxFQUNsQyxNQUFRLENBQUMsQ0FDWCxDQUdBLFNBQVMsZUFBZSx1QkFBdUIsRUFBRSxpQkFBaUIsUUFBU0MsQ0FBa0IsRUFDN0YsU0FBUyxlQUFlLG1CQUFtQixFQUFFLGlCQUFpQixRQUFTdEIsQ0FBWSxFQUVuRixlQUFlQSxHQUFlLENBQzVCLEdBQUksQ0FFRixNQUFNUSxHQUFTLE1BREgsTUFBTSxNQUFNLHdCQUF3QixHQUN2QixLQUFLLEdBQUcsTUFBTSxPQUFTLENBQUMsRUFDakRaLEVBQVdZLEVBQ1gsTUFBTTFwQixFQUFLLFNBQVMsZUFBZSxxQkFBcUIsRUFDeEQsR0FBSSxDQUFDMHBCLEVBQU0sT0FBUSxDQUFFMXBCLEVBQUcsVUFBWSw2RkFBeUYsTUFBUSxDQUNySUEsRUFBRyxVQUFZMHBCLEVBQU0sSUFBSXBMLEdBQUssQ0FDNUIsTUFBTS9VLEVBQVUrVSxFQUFFLFFBQ0ZBLEVBQUUsYUFDRixLQUFLLElBQUksRUFBSSxLQUFLLE1BQU1BLEVBQUUsWUFBWSxFQUFJLEtBQWMsa0JBQ3pELG1CQUZrQixvQkFETCxxQkFJNUIsTUFBTztBQUFBO0FBQUEsc0JBRU83UCxFQUFXNlAsRUFBRSxPQUFTQSxFQUFFLEVBQUUsQ0FBQztBQUFBLGlGQUNnQzdQLEVBQVc2UCxFQUFFLElBQUksQ0FBQztBQUFBO0FBQUEsb0JBRS9FN1AsRUFBVzZQLEVBQUUsRUFBRSxDQUFDO0FBQUEsMkJBQ1QsSUFBSSxLQUFLQSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQztBQUFBLDBCQUMvQ0EsRUFBRSxhQUFlLElBQUksS0FBS0EsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFJLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxpRUFJN0IvVSxDQUFNO0FBQUEsY0FDekQrVSxFQUFFLEtBQU8sT0FBUyxHQUFLLGdEQUFnRDdQLEVBQVc2UCxFQUFFLEVBQUUsQ0FBQyxnREFBZ0Q7QUFBQTtBQUFBLGVBRy9JLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFFVnRlLEVBQUcsaUJBQWlCLGVBQWUsRUFBRSxRQUFRN0csR0FBTyxDQUNsREEsRUFBSSxpQkFBaUIsUUFBUyxTQUFZLENBQ25DLFFBQVEsZUFBZUEsRUFBSSxRQUFRLEVBQUUscURBQXFELElBQy9GLE1BQU0sTUFBTSwwQkFBMEIsbUJBQW1CQSxFQUFJLFFBQVEsRUFBRSxDQUFDLEdBQUksQ0FBRSxPQUFRLFFBQVMsQ0FBQyxFQUNoRyt2QixFQUFhLEVBQ2YsQ0FBQyxDQUNILENBQUMsQ0FDSCxPQUFTbndCLEVBQUcsQ0FDVixTQUFTLGVBQWUscUJBQXFCLEVBQUUsVUFBWSx5Q0FBeUMwVixFQUFXMVYsRUFBRSxPQUFPLEVBQUUsUUFDNUgsQ0FDRixDQUVBLGVBQWV5eEIsR0FBcUIsQ0FDbEMsTUFBTXBsQixFQUFLLE9BQU8saUNBQWlDLEVBQ25ELEdBQUksQ0FBQ0EsRUFBSSxPQUNULE1BQU0yRSxFQUFRLE9BQU8saUJBQWtCM0UsQ0FBRSxHQUFLQSxFQUN4Q3FnQixFQUFRLE9BQU8sNkNBQThDLE9BQU8sR0FBSyxRQUMvRSxHQUFJLENBQ0YsTUFBTWpyQixFQUFNLE1BQU0sTUFBTSx5QkFBMEIsQ0FDaEQsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxHQUFBNEssRUFBSSxNQUFBMkUsRUFBTyxLQUFBMGIsQ0FBSyxDQUFDLENBQzFDLENBQUMsRUFDS3pzQixFQUFPLE1BQU13QixFQUFJLEtBQUssRUFDNUIsR0FBSSxDQUFDQSxFQUFJLEdBQUksQ0FBRSxNQUFNLFlBQWN4QixHQUFNLE9BQU8sU0FBV3dCLEVBQUksV0FBVyxFQUFHLE1BQVEsQ0FFckYsTUFBTTtBQUFBO0FBQUEsTUFBNkJ4QixFQUFLLEtBQUssS0FBSyxFQUFFO0FBQUEsU0FBWUEsRUFBSyxLQUFLLEtBQUssS0FBSztBQUFBLFFBQVdBLEVBQUssS0FBSyxLQUFLLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUE2REEsRUFBSyxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUEsa0VBQTBILEVBQzFUa3dCLEVBQWEsQ0FDZixPQUFTbndCLEVBQUcsQ0FDVixNQUFNLFdBQWFBLEVBQUUsT0FBTyxDQUM5QixDQUNGLENBR0EsU0FBUzBWLEVBQVdwRixFQUFHLENBQ3JCLE9BQU8sT0FBT0EsQ0FBQyxFQUFFLFFBQVEsV0FBWSxJQUFNLENBQUMsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksT0FBTyxHQUFFLENBQUMsQ0FBRSxDQUM3RyxDQUNBLFNBQVM4Z0IsRUFBU00sRUFBSUMsRUFBSSxDQUN4QixJQUFJN3dCLEVBQUcsT0FBTyxVQUFXLENBQUUsYUFBYUEsQ0FBQyxFQUFHQSxFQUFJLFdBQVcsSUFBTTR3QixFQUFHLE1BQU0sS0FBTSxTQUFTLEVBQUdDLENBQUUsQ0FBRyxDQUNuRyxDQUNGLEdBQUcsRUFhSCxPQUFPLHlCQUEyQixTQUFVQyxFQUFPQyxFQUFPLENBQ3hELElBQUk3eEIsRUFBSTZ4QixHQUFTLFNBQVV2aEIsRUFBRyxDQUM1QixPQUFPLE9BQU9BLENBQUMsRUFBRSxRQUFRLFdBQVksU0FBVVgsRUFBRyxDQUNoRCxNQUFPLENBQUUsSUFBSyxRQUFTLElBQUssT0FBUSxJQUFLLE9BQVEsSUFBSyxTQUFVLElBQUssT0FBUSxFQUFFQSxDQUFDLENBQ2xGLENBQUMsQ0FDSCxFQUNBLE1BQU8seURBQ0ppaUIsR0FBUyxDQUFDLEdBQUcsSUFBSSxTQUFVeGdCLEVBQUcsQ0FDN0IsTUFBTyxrQkFBb0JwUixFQUFFb1IsRUFBRSxHQUFHLEVBQUksY0FBZ0JwUixFQUFFb1IsRUFBRSxFQUFFLEVBQUksS0FDOURwUixFQUFFb1IsRUFBRSxTQUFTLEdBQUtBLEVBQUUsWUFBYyxXQUFRcFIsRUFBRW9SLEVBQUUsV0FBVyxFQUFJLElBQU0sV0FDdkUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUNkLEVBSUEsT0FBTyxxQkFBdUIsU0FBVTBnQixFQUFXQyxFQUFPLENBQ3hELEdBQUlELEVBQVcsTUFBTyxHQUN0QixJQUFJaHhCLEVBQUksT0FBT2l4QixHQUFTLEVBQUUsRUFBRSxLQUFLLEVBQ2pDLE9BQU9qeEIsR0FBSyxNQUNkLEdBRUMsVUFBWSxDQUNYLFlBQVksZ0JBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBb0Z0QixFQUVQLE1BQU1reEIsRUFBSzNsQixHQUFPLFNBQVMsZUFBZUEsQ0FBRSxFQUM1QyxJQUFJcU0sRUFBVSxLQUNWdVosRUFBYSxHQUVqQixTQUFTQyxFQUFJNWhCLEVBQUcsQ0FDZCxPQUFPLE9BQU8sV0FBYSxPQUFPLFdBQVcsT0FBT0EsQ0FBQyxDQUFDLEVBQUksT0FBT0EsQ0FBQyxFQUFFLFFBQVEsV0FBYVgsSUFBTyxDQUFDLElBQUksUUFBUSxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksU0FBUyxJQUFJLE9BQU8sR0FBRUEsQ0FBQyxDQUFFLENBQ2xLLENBRUEsZUFBZXdpQixFQUFJaGxCLEVBQU1pbEIsRUFBTSxDQUM3QixNQUFNaGhCLEVBQUksTUFBTSxNQUFNLGdDQUFrQ2pFLEVBQU0sT0FBTyxPQUFPLENBQUUsWUFBYSxTQUFVLEVBQUdpbEIsR0FBUSxDQUFDLENBQUMsQ0FBQyxFQUNuSCxJQUFJbEksRUFBTyxLQUNYLEdBQUksQ0FBRUEsRUFBTyxNQUFNOVksRUFBRSxLQUFLLENBQUcsTUFBWSxDQUFFOFksRUFBTyxDQUFFLFFBQVMsR0FBTyxNQUFPLG1CQUFvQixDQUFHLENBQ2xHLE1BQU8sQ0FBRSxPQUFROVksRUFBRSxPQUFRLEtBQUE4WSxDQUFLLENBQ2xDLENBRUEsU0FBU21JLEVBQVc1aEIsRUFBTSxDQUN4QixNQUFNeEosRUFBSytxQixFQUFFLFlBQVksRUFDekIvcUIsRUFBRyxNQUFNLFFBQVUsUUFDbkJBLEVBQUcsWUFBY3dKLEdBQVEsY0FDekJ4SixFQUFHLFVBQVlBLEVBQUcsWUFDcEIsQ0FFQSxlQUFlcXJCLEdBQWUsQ0FDNUIsTUFBTXJyQixFQUFLK3FCLEVBQUUsY0FBYyxFQUNyQixDQUFFLEtBQUE5SCxDQUFLLEVBQUksTUFBTWlJLEVBQUksV0FBVyxFQUN0QyxHQUFJLENBQUNqSSxFQUFLLFFBQVMsQ0FDakJqakIsRUFBRyxVQUFZLE9BQVNpckIsRUFBSWhJLEVBQUssT0FBUyxhQUFhLEVBQUksUUFDM0QsTUFDRixDQUNBLE1BQU1nRixFQUFPaEYsRUFBSyxVQUFZLENBQUMsRUFDL0IsR0FBSSxDQUFDZ0YsRUFBSyxPQUFRLENBQ2hCam9CLEVBQUcsVUFBWSxrREFDZixNQUNGLENBQ0FBLEVBQUcsVUFBWSxxSkFHYmlvQixFQUFLLElBQUs1ZSxHQUNSLG1CQUNpQjRoQixFQUFJNWhCLEVBQUUsSUFBSSxFQUFJLHFCQUN0QjRoQixFQUFJNWhCLEVBQUUsV0FBVyxFQUFJLFlBQ3JCNGhCLEVBQUk1aEIsRUFBRSxTQUFTLEVBQUksWUFDbkI0aEIsRUFBSTVoQixFQUFFLFVBQVUsRUFBSSxrRUFDa0M0aEIsRUFBSTVoQixFQUFFLElBQUksRUFBSSwyRUFDcEI0aEIsRUFBSTVoQixFQUFFLElBQUksRUFBSSw2QkFFekUsRUFBRSxLQUFLLEVBQUUsRUFBSSxrQkFDakIsQ0FFQSxlQUFlaWlCLEdBQVksQ0FDekIsTUFBTXhTLEVBQU1pUyxFQUFFLGlCQUFpQixFQUN6QixDQUFFLEtBQUE5SCxDQUFLLEVBQUksTUFBTWlJLEVBQUksUUFBUSxFQUNuQyxHQUFJLENBQUNqSSxFQUFLLFFBQVMsQ0FDakJuSyxFQUFJLFVBQVksV0FBYW1TLEVBQUloSSxFQUFLLE9BQVMsYUFBYSxFQUFJLFlBQ2hFLE1BQ0YsQ0FDQSxNQUFNMEgsRUFBUTFILEVBQUssT0FBUyxDQUFDLEVBQzdCbkssRUFBSSxVQUFZNlIsRUFBTSxPQUNsQkEsRUFBTSxJQUFLeGdCLEdBQU0sa0JBQW9COGdCLEVBQUk5Z0IsRUFBRSxHQUFHLEVBQUksS0FBTzhnQixFQUFJOWdCLEVBQUUsSUFBSSxFQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFDM0YsZ0VBQ04sQ0FFQSxlQUFlb2hCLEVBQVlsWCxFQUFTLENBQ2xDLE1BQU1yVSxFQUFLK3FCLEVBQUUsYUFBYSxFQUNwQlMsRUFBS25YLEVBQVUsWUFBYyxtQkFBbUJBLENBQU8sRUFBSSxHQUMzRCxDQUFFLEtBQUE0TyxDQUFLLEVBQUksTUFBTWlJLEVBQUksV0FBYU0sQ0FBRSxFQUNwQ3ZELEVBQVFoRixFQUFLLE1BQVEsQ0FBQyxFQUM1QixHQUFJLENBQUNnRixFQUFLLE9BQVEsQ0FDaEJqb0IsRUFBRyxVQUFZLDRCQUNmLE1BQ0YsQ0FDQUEsRUFBRyxVQUFZLHdKQUdiaW9CLEVBQUssSUFBSzlkLEdBQ1IsV0FBYThnQixFQUFJOWdCLEVBQUUsSUFBSSxFQUFJLFlBQWM4Z0IsRUFBSTlnQixFQUFFLE9BQU8sRUFBSSxZQUFjOGdCLEVBQUk5Z0IsRUFBRSxNQUFNLEVBQ3BGLFlBQWM4Z0IsRUFBSTlnQixFQUFFLEtBQUssRUFBSSxZQUFjOGdCLEVBQUk5Z0IsRUFBRSxVQUFZLFFBQUcsRUFBSSxZQUN0RSxFQUFFLEtBQUssRUFBRSxFQUFJLGtCQUNqQixDQUlBLGVBQWVzaEIsR0FBaUIsQ0FDOUIsTUFBTTNTLEVBQU0sU0FBUyxlQUFlLGNBQWMsRUFDNUM0UyxFQUFTLFNBQVMsZUFBZSxtQkFBbUIsRUFDcERDLEVBQVEsU0FBUyxlQUFlLG9CQUFvQixFQUNwREMsRUFBUyxTQUFTLGVBQWUsa0JBQWtCLEVBQ25EaHlCLEVBQVUsQ0FBQyxFQUlqQixHQUhJOHhCLEdBQVVBLEVBQU8sTUFBTSxLQUFLLElBQUc5eEIsRUFBUSxVQUFZLFdBQWE4eEIsRUFBTyxNQUFNLEtBQUssRUFBRSxRQUFRLGNBQWUsRUFBRSxHQUc3R0UsR0FBVUEsRUFBTyxRQUFTaHlCLEVBQVEsTUFBUSxPQUN6QyxDQUNILE1BQU1DLEVBQUksT0FBTyxxQkFBcUIsR0FBTzh4QixHQUFTQSxFQUFNLEtBQUssRUFDN0Q5eEIsSUFBTSxTQUFXRCxFQUFRLE1BQVFDLEVBQ3ZDLENBQ0EsR0FBSSxDQUNGLEtBQU0sQ0FBRSxPQUFBMFAsRUFBUSxLQUFBMFosQ0FBSyxFQUFJLE1BQU1pSSxFQUFJLGVBQWdCLENBQ2pELE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVdHhCLENBQU8sQ0FDOUIsQ0FBQyxFQUNELEdBQUksQ0FBQ3FwQixFQUFLLFNBQVcsRUFBRUEsRUFBSyxPQUFTLENBQUMsR0FBRyxPQUFRLENBQy9DbkssRUFBSSxVQUFZLG9CQUFzQm1TLEVBQUloSSxFQUFLLE9BQVMsZ0JBQWdCLEVBQUksWUFDNUUsTUFDRixDQUlBbkssRUFBSSxVQUFZLE9BQU8seUJBQXlCbUssRUFBSyxNQUFPZ0ksQ0FBRyxDQUNqRSxNQUFZLENBQ1ZuUyxFQUFJLFVBQVksdUNBQ2xCLENBQ0YsQ0FFQSxlQUFlK1MsR0FBYSxDQUMxQixNQUFNMXlCLEVBQU0sU0FBUyxlQUFlLFlBQVksRUFDMUMyeUIsRUFBVSxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQU0sS0FBSyxFQUMzRHpYLEdBQVcsU0FBUyxlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSyxHQUFLLElBQUksWUFBWSxFQUNyRjBYLEVBQVUsU0FBUyxlQUFlLGFBQWEsRUFBRSxNQUFNLEtBQUssRUFDbEUsR0FBSSxDQUFDRCxHQUFXLENBQUN6WCxFQUFTLENBQUUrVyxFQUFXLGlDQUFpQyxFQUFHLE1BQVEsQ0FDbkYsTUFBTVksRUFBT0QsRUFBVUEsRUFBUSxNQUFNLEtBQUssRUFBSSxDQUFDLEVBQy9DRSxFQUFRLEdBQU05eUIsRUFBSyxTQUFTLEVBQzVCaXlCLEVBQVcsY0FBZ0JVLEVBQVU7QUFBQSxtREFBc0QsRUFDM0YsR0FBSSxDQUNGLE1BQU1qQixFQUFZLENBQUMsRUFBRSxTQUFTLGVBQWUsa0JBQWtCLEdBQUssQ0FBQyxHQUFHLFFBQ2xFcUIsR0FBYyxTQUFTLGVBQWUsb0JBQW9CLEdBQUssQ0FBRSxNQUFPLEVBQUcsR0FBRyxNQUM5RUMsRUFBZSxPQUFPLHFCQUFxQnRCLEVBQVdxQixDQUFVLEVBQ2hFLENBQUUsT0FBQTNpQixFQUFRLEtBQUEwWixDQUFLLEVBQUksTUFBTWlJLEVBQUksV0FBWSxDQUM3QyxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLFNBQVVZLEVBQVMsUUFBQXpYLEVBQVMsS0FBQTJYLEVBQ2pELE1BQU9HLENBQWEsQ0FBQyxDQUN6QixDQUFDLEVBQ0QsR0FBSSxDQUFDbEosRUFBSyxRQUFTLENBQ2pCbUksR0FBWW5JLEVBQUssT0FBU0EsRUFBSyxPQUFTO0FBQUEsRUFBTyxJQUFNLFNBQVdBLEVBQUssT0FBVSxRQUFVMVosRUFBUSxFQUNqRzBpQixFQUFRLEdBQU85eUIsRUFBSyxTQUFTLEVBQzdCLE1BQ0YsQ0FDQSxNQUFNbWEsRUFBTTJQLEVBQUssU0FBVyxDQUFDLEVBRTdCLEdBQUksRUFEWSxPQUFPLE1BQVEsQ0FBQyxHQUFHLEtBQU1qa0IsR0FBTUEsRUFBRSxLQUFPc1UsRUFBSSxFQUFFLEVBQ2pELENBQ1gsTUFBTTFKLEVBQU8sQ0FBRSxHQUFJMEosRUFBSSxHQUFJLEtBQU1BLEVBQUksTUFBUUEsRUFBSSxHQUFJLElBQUtBLEVBQUksSUFBSyxLQUFNQSxFQUFJLEtBQU0sY0FBZSxHQUFNLFNBQVUsRUFBSyxFQUN2SCxHQUFJLENBQ0YsTUFBTSxNQUFNLGlDQUFrQyxDQUM1QyxPQUFRLE9BQ1IsWUFBYSxVQUNiLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUxSixDQUFJLENBQzNCLENBQUMsRUFDRCxPQUFPLEtBQUssS0FBS0EsQ0FBSSxFQUNqQixPQUFPLE9BQU8sWUFBZSxZQUFZLE9BQU8sV0FBVyxFQUMzRCxPQUFPLE9BQU8sWUFBZSxZQUFZLE9BQU8sV0FBVyxDQUNqRSxNQUFZLENBQXNDLENBQ3BELENBQ0F3aEIsRUFBVyxjQUFnQjlYLEVBQUksTUFBUUEsRUFBSSxJQUFNLFFBQVVBLEVBQUksZ0JBQWtCLEtBQU87QUFBQSxTQUN4RUEsRUFBSSxLQUFPLElBQ3pCO0FBQUEsR0FBUTJQLEVBQUssUUFBVSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQ3hDb0ksRUFBYSxDQUNmLE9BQVN0eUIsRUFBRyxDQUNWcXlCLEVBQVcsa0JBQW9CcnlCLEVBQUUsT0FBTyxDQUMxQyxDQUNBa3pCLEVBQVEsR0FBTzl5QixFQUFLLFNBQVMsQ0FDL0IsQ0FFQSxTQUFTOHlCLEVBQVFHLEVBQU1qekIsRUFBSzRRLEVBQU8sQ0FDNUI1USxJQUNMQSxFQUFJLFNBQVdpekIsRUFDWHJpQixJQUFPNVEsRUFBSSxZQUFjaXpCLEVBQU8sZ0JBQWFyaUIsR0FDbkQsQ0FFQSxlQUFlc2lCLEdBQVksQ0FDekIsTUFBTWx6QixFQUFNNHhCLEVBQUUsZ0JBQWdCLEVBQ3hCdUIsRUFBTXZCLEVBQUUsaUJBQWlCLEVBQUUsTUFDakMsR0FBS3VCLEVBQ0wsQ0FBQUwsRUFBUSxHQUFNOXlCLEVBQUssUUFBUSxFQUMzQml5QixFQUFXLGFBQWVrQixFQUFNO0FBQUEsNEJBQTBCLEVBQzFELEdBQUksQ0FDRixLQUFNLENBQUUsS0FBQXJKLENBQUssRUFBSSxNQUFNaUksRUFBSSxVQUFXLENBQ3BDLE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsSUFBQW9CLENBQUksQ0FBQyxDQUM5QixDQUFDLEVBQ0RsQixHQUFZbkksRUFBSyxRQUFVQSxFQUFLLE9BQVMsS0FBT0EsRUFBSyxRQUFVO0FBQUEsZ0JBQWdCO0FBQUEsZUFBYSxFQUM1Rm9JLEVBQWEsQ0FDZixPQUFTdHlCLEVBQUcsQ0FDVnF5QixFQUFXLGlCQUFtQnJ5QixFQUFFLE9BQU8sQ0FDekMsQ0FDQWt6QixFQUFRLEdBQU85eUIsRUFBSyxRQUFRLEVBQzlCLENBRUEsZUFBZW96QixFQUFZbFksRUFBU2xiLEVBQUssQ0FDdkMsR0FBSyxRQUFRLGFBQWVrYixFQUFVLDJCQUEyQixFQUNqRSxDQUFBNFgsRUFBUSxHQUFNOXlCLEVBQUssVUFBVSxFQUM3Qml5QixFQUFXLGdCQUFrQi9XLEVBQVUsUUFBRyxFQUMxQyxHQUFJLENBQ0YsS0FBTSxDQUFFLEtBQUE0TyxDQUFLLEVBQUksTUFBTWlJLEVBQUksWUFBYSxDQUN0QyxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVSxDQUFFLFFBQUE3VyxDQUFRLENBQUMsQ0FDbEMsQ0FBQyxFQUNEK1csR0FBWW5JLEVBQUssUUFBVUEsRUFBSyxPQUFTLEtBQU9BLEVBQUssUUFBVTtBQUFBLG9CQUFvQjtBQUFBLGVBQWEsRUFDaEdvSSxFQUFhLENBQ2YsT0FBU3R5QixFQUFHLENBQ1ZxeUIsRUFBVyxtQkFBcUJyeUIsRUFBRSxPQUFPLENBQzNDLENBQ0FrekIsRUFBUSxHQUFPOXlCLEVBQUssVUFBVSxFQUNoQyxDQUVBLGVBQWVxekIsRUFBVW5ZLEVBQVNsYixFQUFLLENBQ3JDOHlCLEVBQVEsR0FBTTl5QixFQUFLLFFBQVEsRUFDM0IsR0FBSSxDQUNGLEtBQU0sQ0FBRSxLQUFBOHBCLENBQUssRUFBSSxNQUFNaUksRUFBSSxtQkFBcUIsbUJBQW1CN1csQ0FBTyxDQUFDLEVBQzNFK1csRUFBV25JLEVBQUssUUFBVUEsRUFBSyxPQUFTLGFBQWEsQ0FDdkQsT0FBU2xxQixFQUFHLENBQ1ZxeUIsRUFBVyxpQkFBbUJyeUIsRUFBRSxPQUFPLENBQ3pDLENBQ0FrekIsRUFBUSxHQUFPOXlCLEVBQUssUUFBUSxDQUM5QixDQUVBLFNBQVNzekIsR0FBTyxDQUNkaGIsRUFBVSxTQUFTLGVBQWUsYUFBYSxFQUMxQ0EsSUFFTEEsRUFBUSxpQkFBaUIsUUFBUyxTQUFZLENBQzVDc1osRUFBRSxlQUFlLEVBQUUsVUFBVSxJQUFJLE1BQU0sRUFDbENDLElBQ0hBLEVBQWEsR0FDYkssRUFBYSxFQUNiQyxFQUFVLEVBQ1ZDLEVBQVksRUFBRSxFQUNkRSxFQUFlLEVBRW5CLENBQUMsRUFFRFYsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLFFBQVMsSUFBTSxDQUM3Q0EsRUFBRSxlQUFlLEVBQUUsVUFBVSxPQUFPLE1BQU0sQ0FDNUMsQ0FBQyxFQUdELFNBQVMsaUJBQWlCLFVBQVUsRUFBRSxRQUFTN1ksR0FBUSxDQUNyREEsRUFBSSxpQkFBaUIsUUFBUyxJQUFNLENBQ2xDLFNBQVMsaUJBQWlCLFVBQVUsRUFBRSxRQUFTclksR0FBTUEsRUFBRSxVQUFVLE9BQU8sUUFBUSxDQUFDLEVBQ2pGcVksRUFBSSxVQUFVLElBQUksUUFBUSxFQUMxQixTQUFTLGlCQUFpQiwyQkFBMkIsRUFBRSxRQUFTL1AsR0FBTSxDQUNwRUEsRUFBRSxNQUFNLFFBQVVBLEVBQUUsUUFBUSxRQUFVK1AsRUFBSSxRQUFRLElBQU0sUUFBVSxNQUNwRSxDQUFDLENBQ0gsQ0FBQyxDQUNILENBQUMsRUFFRDZZLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLFFBQVNzQixDQUFTLEVBQ3ZEdEIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLFFBQVNjLENBQVUsRUFDcEQsQ0FBQyxvQkFBcUIsb0JBQW9CLEVBQUUsUUFBU3ptQixHQUFPLENBQzFELE1BQU1wRixFQUFLLFNBQVMsZUFBZW9GLENBQUUsRUFDakNwRixHQUFJQSxFQUFHLGlCQUFpQixTQUFVLElBQU15ckIsRUFBZSxDQUFDLENBQzlELENBQUMsRUFDRCxTQUFTLGVBQWUsY0FBYyxFQUFFLGlCQUFpQixTQUFXMXlCLEdBQU0sQ0FDeEUsTUFBTTJKLEVBQUkzSixFQUFFLE9BQU8sTUFDbkIsR0FBSTJKLEVBQUcsQ0FDTCxTQUFTLGVBQWUsWUFBWSxFQUFFLE1BQVFBLEVBQzlDLE1BQU0zSCxFQUFNaEMsRUFBRSxPQUFPLGdCQUFnQixDQUFDLEVBQ2hDcU0sRUFBS3JLLEdBQU9BLEVBQUksUUFBVUEsRUFBSSxRQUFRLEdBQUssR0FDM0N1WSxFQUFNLFNBQVMsZUFBZSxnQkFBZ0IsRUFDaERsTyxHQUFNLENBQUNrTyxFQUFJLFFBQU9BLEVBQUksTUFBUWxPLEVBQ3BDLENBQ0YsQ0FBQyxFQUdEMmxCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLFFBQVMsSUFBTVEsRUFBWVIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQ3BHQSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixRQUFTLElBQU0sQ0FDbEQsTUFBTWhaLEVBQU9nWixFQUFFLGlCQUFpQixFQUFFLE1BQU0sS0FBSyxFQUN6Q2haLEdBQU15YSxFQUFVemEsQ0FBSSxDQUMxQixDQUFDLEVBR0RnWixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsUUFBVWh5QixHQUFNLENBQ2pELE1BQU0yekIsRUFBSzN6QixFQUFFLE9BQU8sUUFBUSxlQUFlLEVBQzNDLEdBQUkyekIsRUFBSSxPQUFPSCxFQUFZRyxFQUFHLFFBQVEsUUFBU0EsQ0FBRSxFQUNqRCxNQUFNQyxFQUFLNXpCLEVBQUUsT0FBTyxRQUFRLGFBQWEsRUFDekMsR0FBSTR6QixFQUFJLE9BQU9ILEVBQVVHLEVBQUcsUUFBUSxRQUFTQSxDQUFFLENBQ2pELENBQUMsRUFDSCxDQUVJLFNBQVMsYUFBZSxVQUMxQixTQUFTLGlCQUFpQixtQkFBb0JGLENBQUksRUFFbERBLEVBQUssQ0FFVCxHQUFHLEdBR0YsVUFBVyxDQUNWLE1BQU0zdUIsRUFBZSxJQUFJLGFBRXpCLFlBQVksZ0JBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw0SUFXNkcsRUFHMUksTUFBTTh1QixFQUFlLG1CQUNmQyxFQUFhLGNBQ2JDLEVBQWdCLGNBQ2hCQyxFQUFXLGVBR2IsQ0FBQyxRQUFRSCxDQUFZLEdBQUssUUFBUUMsQ0FBVSxHQUM5QyxRQUFRRCxFQUFjLFFBQVFDLENBQVUsQ0FBQyxFQUczQyxTQUFTRyxHQUFVLENBQ2pCLE9BQU8sUUFBUUQsQ0FBUSxHQUFLLFVBQzlCLENBRUEsU0FBU0UsR0FBcUIsQ0FDNUIsTUFBTyxDQUNMLEtBQU0sU0FBUyxjQUFjLGVBQWUsRUFDNUMsS0FBTSxTQUFTLGNBQWMsZUFBZSxFQUM1QyxVQUFXLFNBQVMsY0FBYyxvQkFBb0IsRUFDdEQsU0FBVSxTQUFTLGNBQWMsbUJBQW1CLEVBQ3BELEtBQU0sU0FBUyxjQUFjLGVBQWUsQ0FDOUMsQ0FDRixDQUdBLE1BQU1DLEVBQWtCLENBQ3RCLEVBQUcsWUFBYSxFQUFHLGVBQWdCLEVBQUcsZ0JBQWlCLEVBQUcsV0FDMUQsR0FBSSxNQUFPLEdBQUksV0FDZixHQUFJLGdCQUFpQixHQUFJLFVBQVcsR0FBSSxnQkFDeEMsR0FBSSxtQkFBb0IsR0FBSSx5QkFDNUIsR0FBSSxhQUFjLEdBQUksZ0JBQWlCLEdBQUksYUFDM0MsR0FBSSxzQkFBdUIsR0FBSSxzQkFDL0IsR0FBSSxhQUFjLEdBQUksZ0JBQWlCLEdBQUksYUFBYyxHQUFJLGNBQzdELEdBQUksZ0JBQWlCLEdBQUksbUJBQW9CLEdBQUksa0JBQ2pELEdBQUkscUJBQXNCLEdBQUkscUJBQzlCLEdBQUksZUFBZ0IsR0FBSSx5QkFBMEIsR0FBSSxxQkFDeEQsRUFFTUMsRUFBVyxDQUNmLEVBQUcsZUFBTSxFQUFHLGtCQUFPLEVBQUcsU0FBSyxFQUFHLGVBQzlCLEdBQUksa0JBQU8sR0FBSSxrQkFDZixHQUFJLGtCQUFPLEdBQUksa0JBQU8sR0FBSSxrQkFDMUIsR0FBSSxrQkFBTyxHQUFJLGtCQUNmLEdBQUksa0JBQU8sR0FBSSxrQkFBTyxHQUFJLGtCQUMxQixHQUFJLGtCQUFPLEdBQUksa0JBQ2YsR0FBSSxrQkFBTyxHQUFJLGVBQU0sR0FBSSxlQUFNLEdBQUksZUFDbkMsR0FBSSxrQkFBTyxHQUFJLGtCQUFPLEdBQUksa0JBQzFCLEdBQUksa0JBQU8sR0FBSSxlQUNmLEdBQUksZUFBTSxHQUFJLGVBQU0sR0FBSSxjQUMxQixFQUdNQyxFQUFXLENBQUMsSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssS0FBSyxFQUNyRyxTQUFTQyxFQUFTQyxFQUFLLENBQ3JCLE9BQU9GLEVBQVMsS0FBSyxNQUFNRSxFQUFNLElBQUksRUFBSSxFQUFFLENBQzdDLENBR0EsZUFBZUMsRUFBZ0JDLEVBQU8sQ0FDcEMsTUFBTUMsRUFBUyxRQUFRWCxDQUFhLEVBQ3BDLEdBQUlXLEVBQ0YsR0FBSSxDQUNGLE1BQU1DLEVBQU0sS0FBSyxNQUFNRCxDQUFNLEVBQzdCLEdBQUlDLEVBQUksUUFBVUYsRUFBTyxPQUFPRSxDQUNsQyxNQUFRLENBQUMsQ0FFWCxNQUFNM21CLEVBQU8sTUFBTSxNQUFNLHVEQUF1RCxtQkFBbUJ5bUIsQ0FBSyxDQUFDLGtDQUFrQyxFQUMzSSxHQUFJLENBQUN6bUIsRUFBSyxHQUFJLE1BQU0sSUFBSSxNQUFNLGtCQUFrQixFQUNoRCxNQUFNL04sRUFBTyxNQUFNK04sRUFBSyxLQUFLLEVBQzdCLEdBQUksQ0FBQy9OLEVBQUssU0FBVyxDQUFDQSxFQUFLLFFBQVEsT0FBUSxNQUFNLElBQUksTUFBTSxvQkFBb0IsRUFDL0UsTUFBTW1SLEVBQUluUixFQUFLLFFBQVEsQ0FBQyxFQUNsQjAwQixFQUFNLENBQ1YsTUFBQUYsRUFDQSxJQUFLcmpCLEVBQUUsU0FDUCxJQUFLQSxFQUFFLFVBQ1AsS0FBTUEsRUFBRSxLQUNSLE1BQU9BLEVBQUUsUUFBVSxHQUNuQixRQUFTQSxFQUFFLFNBQVcsR0FDdEIsWUFBYUEsRUFBRSxjQUFnQixFQUNqQyxFQUNBLGVBQVEyaUIsRUFBZSxLQUFLLFVBQVVZLENBQUcsQ0FBQyxFQUNuQ0EsQ0FDVCxDQUVBLFNBQVNDLEVBQWVELEVBQUssQ0FFM0IsT0FBSUEsRUFBSSxjQUFnQixNQUFRQSxFQUFJLE1BQzNCLEdBQUdBLEVBQUksSUFBSSxLQUFLQSxFQUFJLEtBQUssR0FFOUJBLEVBQUksUUFDQyxHQUFHQSxFQUFJLElBQUksS0FBS0EsRUFBSSxPQUFPLEdBRTdCQSxFQUFJLElBQ2IsQ0FFQSxlQUFlRSxFQUFhQyxFQUFVLENBQ3BDLEdBQUksQ0FDRixNQUFNSCxFQUFNLE1BQU1ILEVBQWdCTSxDQUFRLEVBQ3BDeGMsRUFBTzJiLEVBQVEsRUFDZmMsRUFBV3pjLElBQVMsU0FBVyxVQUFZLGFBQzNDMGMsRUFBVzFjLElBQVMsU0FBVyxNQUFRLE1BQ3ZDeE4sRUFBTSxtREFBbUQ2cEIsRUFBSSxHQUFHLGNBQWNBLEVBQUksR0FBRywyRkFBMkZJLENBQVEsb0JBQW9CQyxDQUFRLEdBQ3BOaG5CLEVBQU8sTUFBTSxNQUFNbEQsQ0FBRyxFQUM1QixHQUFJLENBQUNrRCxFQUFLLEdBQUksTUFBTSxJQUFJLE1BQU0sc0JBQXNCLEVBRXBELE1BQU0yQixHQURPLE1BQU0zQixFQUFLLEtBQUssR0FDZCxRQUNUaW5CLEVBQU90bEIsRUFBRSxhQUNmLE1BQU8sQ0FDTCxLQUFNLEtBQUssTUFBTUEsRUFBRSxjQUFjLEVBQ2pDLFVBQVd3a0IsRUFBZ0JjLENBQUksR0FBSyxVQUNwQyxLQUFNYixFQUFTYSxDQUFJLEdBQUssa0JBQ3hCLFlBQWFMLEVBQWVELENBQUcsRUFDL0IsVUFBVyxLQUFLLE1BQU1obEIsRUFBRSxjQUFjLEVBQ3RDLFFBQVMya0IsRUFBUzNrQixFQUFFLGtCQUFrQixFQUN0QyxLQUFBMkksQ0FDRixDQUNGLE9BQVM1WCxFQUFPLENBQ2QsZUFBUSxLQUFLLHdCQUF5QkEsQ0FBSyxFQUNwQyxJQUNULENBQ0YsQ0FFQSxlQUFldzBCLEdBQWdCLENBQzdCLE1BQU1DLEVBQWdCakIsRUFBbUIsRUFDekMsR0FBSSxDQUFDaUIsRUFBYyxNQUFRLENBQUNBLEVBQWMsTUFBUSxDQUFDQSxFQUFjLFdBQWEsQ0FBQ0EsRUFBYyxVQUFZLENBQUNBLEVBQWMsS0FBTSxDQUM1SCxRQUFRLEtBQUssbUNBQW1DLEVBQ2hELE1BQ0YsQ0FFQSxNQUFNTCxFQUFXLFFBQVFqQixDQUFZLEVBQ3JDLEdBQUksQ0FBQ2lCLEVBQVUsQ0FDYkssRUFBYyxTQUFTLFlBQWMsZUFDckNBLEVBQWMsS0FBSyxZQUFjLFNBQ2pDQSxFQUFjLFVBQVUsWUFBYyxrQ0FDdENBLEVBQWMsS0FBSyxZQUFjLEtBQ2pDQSxFQUFjLEtBQUssVUFBWSxxREFDL0IsTUFDRixDQUVBLEdBQUksQ0FDRixNQUFNQyxFQUFVLE1BQU1QLEVBQWFDLENBQVEsRUFDM0MsR0FBSU0sRUFBUyxDQUNYLE1BQU1DLEVBQWFELEVBQVEsT0FBUyxTQUFXLFFBQVksUUFDckRFLEVBQVlGLEVBQVEsT0FBUyxTQUFXLE9BQVMsTUFDdkRELEVBQWMsU0FBUyxZQUFjQyxFQUFRLFlBQzdDRCxFQUFjLEtBQUssWUFBYyxHQUFHQyxFQUFRLElBQUksR0FBR0MsQ0FBVSxHQUM3REYsRUFBYyxVQUFVLFlBQWNDLEVBQVEsVUFDOUNELEVBQWMsS0FBSyxZQUFjLFNBQVNDLEVBQVEsU0FBUyxJQUFJRSxDQUFTLElBQUlGLEVBQVEsT0FBTyxHQUMzRkQsRUFBYyxLQUFLLFVBQVksK0JBQStCLFdBQVdDLEVBQVEsSUFBSSxDQUFDLFNBQ3hGLENBQ0YsT0FBUzEwQixFQUFPLENBQ2RxRSxFQUFhLFNBQVMseUJBQTBCckUsRUFBTyxDQUFFLFNBQVUsZUFBZ0IsQ0FBQyxFQUNwRnkwQixFQUFjLFNBQVMsWUFBYyxnQkFDckNBLEVBQWMsS0FBSyxZQUFjLFFBQ2pDQSxFQUFjLFVBQVUsWUFBYyxpQkFDdENBLEVBQWMsS0FBSyxZQUFjLElBQ25DLENBQ0YsQ0FHQSxNQUFNaHdCLEVBQVEsU0FBUyxlQUFlLGVBQWUsRUFDL0Nvd0IsRUFBZ0IsU0FBUyxlQUFlLHdCQUF3QixFQUV0RSxTQUFTLGVBQWUsa0JBQWtCLEdBQUcsaUJBQWlCLFFBQVMsSUFBTSxDQUMzRUEsRUFBYyxNQUFRLFFBQVExQixDQUFZLEdBQUssR0FFL0MsTUFBTXZiLEVBQU8yYixFQUFRLEVBQ2YzdkIsRUFBUWEsRUFBTSxjQUFjLDJDQUEyQ21ULENBQUksSUFBSSxFQUNqRmhVLElBQU9BLEVBQU0sUUFBVSxJQUMzQmEsRUFBTSxVQUFVLElBQUksTUFBTSxFQUMxQm93QixFQUFjLE1BQU0sQ0FDdEIsQ0FBQyxFQUVELFNBQVMsZUFBZSxnQkFBZ0IsR0FBRyxpQkFBaUIsUUFBUyxJQUFNLENBQ3pFcHdCLEVBQU0sVUFBVSxPQUFPLE1BQU0sQ0FDL0IsQ0FBQyxFQUVELFNBQVMsZUFBZSxjQUFjLEdBQUcsaUJBQWlCLFFBQVMsSUFBTSxDQUN2RSxNQUFNcXdCLEVBQU1ELEVBQWMsTUFBTSxLQUFLLEVBQ3JDLEdBQUlDLEVBQUssQ0FFUSxRQUFRM0IsQ0FBWSxJQUNwQjJCLEdBQUssUUFBUXpCLEVBQWUsRUFBRSxFQUM3QyxRQUFRRixFQUFjMkIsQ0FBRyxFQUV6QixNQUFNQyxFQUFZdHdCLEVBQU0sY0FBYywwQ0FBMEMsRUFDMUV1d0IsRUFBVUQsRUFBWUEsRUFBVSxNQUFRLFdBQ3hDRSxFQUFVMUIsRUFBUSxFQUN4QixRQUFRRCxFQUFVMEIsQ0FBTyxFQUVyQkMsSUFBWUQsR0FBUyxRQUFRM0IsRUFBZSxFQUFFLEVBQ2xENXVCLEVBQU0sVUFBVSxPQUFPLE1BQU0sRUFDN0IrdkIsRUFBYyxDQUNoQixNQUNFLGlCQUFpQix5REFBMEQsU0FBUyxDQUV4RixDQUFDLEVBRUQsVUFBVS92QixDQUFLLEVBR2YsU0FBUyxpQkFBaUIsVUFBWW5GLEdBQU0sQ0FDdENBLEVBQUUsTUFBUSxVQUFZbUYsRUFBTSxVQUFVLFNBQVMsTUFBTSxHQUN2REEsRUFBTSxVQUFVLE9BQU8sTUFBTSxDQUVqQyxDQUFDLEVBR0QrdkIsRUFBYyxFQUVkLFlBQVlBLEVBQWUsR0FBRyxLQUFLLE9BQU8sQ0FDNUMsR0FBRyxHQUdGLFVBQVcsQ0FDVixNQUFNVSxFQUFTLFNBQVMsZUFBZSxjQUFjLEVBQy9DQyxFQUFTLFNBQVMsZUFBZSxjQUFjLEVBQ3JELEdBQUksQ0FBQ0QsR0FBVSxDQUFDQyxFQUFRLE9BRXhCLE1BQU1DLEVBQU8sQ0FBQyxTQUFTLFNBQVMsVUFBVSxZQUFZLFdBQVcsU0FBUyxVQUFVLEVBQzlFQyxFQUFTLENBQUMsVUFBVSxXQUFXLFFBQVEsUUFBUSxNQUFNLE9BQU8sT0FBTyxTQUFTLFlBQVksVUFBVSxXQUFXLFVBQVUsRUFDdkhDLEVBQVEsQ0FBQyxNQUFNLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLE1BQU0sT0FBTyxLQUFLLElBQUksSUFBSSxFQUU1RSxJQUFJQyxFQUFlLFFBQVEsYUFBYSxHQUFLLFVBQ3pDQyxFQUFnQixHQUNoQkMsRUFBZSxHQUNmQyxFQUFpQixHQUNqQkMsRUFBZSxHQUNmQyxFQUFjLEtBQ2RDLEVBQVksS0FHaEIsU0FBU0MsRUFBV3pZLEVBQU8sQ0FFekIsR0FESW9ZLEdBQ0EsUUFBUSxjQUFjLElBQU0sT0FBUSxPQUN4Q0EsRUFBZSxHQUNmLE1BQU12c0IsRUFBTSxTQUFTLFFBQVEsb0JBQW9CLEdBQUssS0FBTSxFQUFFLEVBQUksSUFDbEUsSUFBSUMsRUFBSSxFQUNSLFNBQVM0c0IsR0FBUyxDQUNoQixHQUFJNXNCLEdBQUtrVSxFQUFPLENBQUVvWSxFQUFlLEdBQU8sTUFBUSxDQUNoRCxNQUFNTyxFQUFPLElBQUksTUFBTSxnQ0FBZ0MsRUFDdkRBLEVBQUssT0FBUzlzQixFQUNkOHNCLEVBQUssS0FBSyxFQUFFLE1BQU0sSUFBTSxDQUFDLENBQUMsRUFDMUI3c0IsSUFDSUEsRUFBSWtVLEVBQU8sV0FBVzBZLEVBQVEsSUFBSSxFQUNqQyxXQUFXLElBQU0sQ0FBRU4sRUFBZSxFQUFPLEVBQUcsSUFBSSxDQUN2RCxDQUNBTSxFQUFPLENBQ1QsQ0FHQSxTQUFTaGhCLEVBQVFraEIsRUFBSyxDQUNwQixPQUFPYixFQUFLYSxFQUFJLE9BQU8sQ0FBQyxFQUFJLEtBQU9aLEVBQU9ZLEVBQUksU0FBUyxDQUFDLEVBQUksSUFBTUEsRUFBSSxRQUFRLEVBQUksS0FBT0EsRUFBSSxZQUFZLENBQzNHLENBRUEsU0FBU0MsR0FBb0IsQ0FDM0JQLEVBQWUsR0FDZkMsRUFBYyxJQUNoQixDQUVBLFNBQVNPLEdBQXNCLENBQzdCLE9BQUlSLElBQWlCLFlBQ25CUixFQUFPLFVBQ0wsa0tBRUZTLEVBQWMsQ0FDWixLQUFNVCxFQUFPLGNBQWMsYUFBYSxFQUN4QyxRQUFTQSxFQUFPLGNBQWMsZ0JBQWdCLEVBQzlDLEtBQU1BLEVBQU8sY0FBYyxhQUFhLEVBQ3hDLEtBQU1BLEVBQU8sY0FBYyxhQUFhLENBQzFDLEVBQ0FRLEVBQWUsV0FFVkMsQ0FDVCxDQUlBLFNBQVNRLEVBQWNILEVBQUssQ0FDMUIsTUFBTUksRUFBTUosRUFBSSxTQUFTLEVBQUczdEIsRUFBSTJ0QixFQUFJLFdBQVcsRUFBR3JtQixFQUFJcW1CLEVBQUksV0FBVyxFQUMvREssRUFBT0QsR0FBTyxHQUFLLEtBQU8sS0FDMUJ4UixFQUFJd1IsRUFBTSxJQUFNLEdBQ2hCRSxFQUFPSixFQUFvQixFQUNqQ0ksRUFBSyxLQUFLLFlBQWMsR0FBRzFSLENBQUMsSUFBSSxPQUFPdmMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FDekRpdUIsRUFBSyxRQUFRLFlBQWMsSUFBSSxPQUFPM21CLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQ3hEMm1CLEVBQUssS0FBSyxZQUFjRCxFQUN4QkMsRUFBSyxLQUFLLFlBQWN4aEIsRUFBUWtoQixDQUFHLENBQ3JDLENBRUEsU0FBU08sRUFBVVAsRUFBS1EsRUFBSyxDQUMzQixNQUFNSixFQUFNSixFQUFJLFNBQVMsRUFBRzN0QixFQUFJMnRCLEVBQUksV0FBVyxFQUFHcm1CLEVBQUlxbUIsRUFBSSxXQUFXLEVBQy9ESyxFQUFPRCxHQUFPLEdBQUssS0FBTyxLQUMxQnhSLEVBQUl3UixFQUFNLElBQU0sR0FDaEJFLEVBQU9KLEVBQW9CLEVBQ2pDSSxFQUFLLEtBQUssWUFBYyxHQUFHLE9BQU8xUixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE9BQU92YyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUNqRml1QixFQUFLLFFBQVEsWUFBYyxJQUFJLE9BQU8zbUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FDeEQybUIsRUFBSyxLQUFLLFlBQWNELEVBQ3hCQyxFQUFLLEtBQUssWUFBY3hoQixFQUFRa2hCLENBQUcsQ0FDckMsQ0FFQSxTQUFTUyxFQUFXVCxFQUFLLENBQ3ZCLE1BQU1JLEVBQU1KLEVBQUksU0FBUyxFQUFHM3RCLEVBQUkydEIsRUFBSSxXQUFXLEVBQUdybUIsRUFBSXFtQixFQUFJLFdBQVcsRUFDL0RLLEVBQU9ELEdBQU8sR0FBSyxLQUFPLEtBQzFCeFIsRUFBSXdSLEVBQU0sSUFBTSxHQUNoQk0sRUFBUyxPQUFPOVIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUksT0FBT3ZjLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFJLE9BQU9zSCxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFFL0YsSUFBSTNOLEVBQU8sK0JBbUJYLEdBakJBQSxHQUFRMjBCLEVBQVNELEVBQU8sQ0FBQyxFQUFHLENBQUMsRUFDN0IxMEIsR0FBUTIwQixFQUFTRCxFQUFPLENBQUMsRUFBRyxDQUFDLEVBQzdCMTBCLEdBQVEsb0NBRVJBLEdBQVEyMEIsRUFBU0QsRUFBTyxDQUFDLEVBQUcsQ0FBQyxFQUM3QjEwQixHQUFRMjBCLEVBQVNELEVBQU8sQ0FBQyxFQUFHLENBQUMsRUFDN0IxMEIsR0FBUSxvQ0FFUkEsR0FBUTIwQixFQUFTRCxFQUFPLENBQUMsRUFBRyxDQUFDLEVBQzdCMTBCLEdBQVEyMEIsRUFBU0QsRUFBTyxDQUFDLEVBQUcsQ0FBQyxFQUM3QjEwQixHQUFRLDJCQUEyQnEwQixDQUFJLFVBQ3ZDcjBCLEdBQVEsU0FDUkEsR0FBUSwyQkFBMkI4UyxFQUFRa2hCLENBQUcsQ0FBQyxTQUMvQ2QsRUFBTyxVQUFZbHpCLEVBQ25CMHpCLEVBQWUsT0FHWEQsR0FDRixRQUFTdnNCLEVBQUksRUFBR0EsRUFBSSxFQUFHQSxJQUNyQixHQUFJd3RCLEVBQU94dEIsQ0FBQyxJQUFNdXNCLEVBQWV2c0IsQ0FBQyxFQUFHLENBQ25DLE1BQU1nSCxFQUFPZ2xCLEVBQU8sY0FBYyx3QkFBd0Joc0IsQ0FBQyxJQUFJLEVBQzNEZ0gsR0FBTUEsRUFBSyxVQUFVLElBQUksVUFBVSxDQUN6QyxFQUdKdWxCLEVBQWlCaUIsQ0FDbkIsQ0FFQSxTQUFTQyxFQUFTQyxFQUFPbHVCLEVBQUssQ0FDNUIsTUFBTXFKLEVBQUk2a0IsSUFBVSxJQUFNLEdBQUtBLEVBQy9CLE1BQU8sb0NBQW9DbHVCLENBQUcsMkJBQTJCcUosQ0FBQyxrQ0FBa0NBLENBQUMsY0FDL0csQ0FFQSxTQUFTOGtCLEVBQWFiLEVBQUssQ0FDekIsTUFBTUksRUFBTUosRUFBSSxTQUFTLEVBQUczdEIsRUFBSTJ0QixFQUFJLFdBQVcsRUFBR3JtQixFQUFJcW1CLEVBQUksV0FBVyxFQUMvRHBSLEVBQUl3UixFQUFNLElBQU0sR0FDaEJDLEVBQU9ELEdBQU8sR0FBSyxLQUFPLEtBRTFCOUgsRUFBTyxDQUNYLEtBQUssTUFBTTFKLEVBQUksRUFBRSxFQUFHQSxFQUFJLEdBQ3hCLEtBQUssTUFBTXZjLEVBQUksRUFBRSxFQUFHQSxFQUFJLEdBQ3hCLEtBQUssTUFBTXNILEVBQUksRUFBRSxFQUFHQSxFQUFJLEVBQzFCLEVBRUEsSUFBSTNOLEVBQU8sNkJBRVhBLEdBQVEsd0hBRVIsUUFBUzgwQixFQUFNLEVBQUdBLEdBQU8sRUFBR0EsSUFBTyxDQUNqQzkwQixHQUFRLDJCQUNSLFFBQVMrMEIsRUFBTSxFQUFHQSxFQUFNLEVBQUdBLElBQU8sQ0FDaEMsTUFBTUMsRUFBTTFJLEVBQUt5SSxDQUFHLEdBQUtELEVBQU8sRUFDaEM5MEIsR0FBUSwwQkFBMEJnMUIsRUFBSyxLQUFPLEVBQUUsVUFDbEQsQ0FDQWgxQixHQUFRLFFBQ1YsQ0FFQUEsR0FBUSw4QkFDUixRQUFTKzBCLEVBQU0sRUFBR0EsRUFBTSxFQUFHQSxJQUN6Qi8wQixHQUFRLFNBQVNzc0IsRUFBS3lJLENBQUcsQ0FBQyxVQUU1Qi8wQixHQUFRLFNBQ1JBLEdBQVEsNEJBQTRCcTBCLENBQUksU0FDeENyMEIsR0FBUSxTQUNSQSxHQUFRLDJCQUEyQjhTLEVBQVFraEIsQ0FBRyxDQUFDLFNBQy9DZCxFQUFPLFVBQVlsekIsRUFDbkIwekIsRUFBZSxRQUNqQixDQUVBLFNBQVN1QixFQUFhakIsRUFBS2tCLEVBQVUsQ0FDbkMsTUFBTXRTLEVBQUlvUixFQUFJLFNBQVMsRUFBRzN0QixFQUFJMnRCLEVBQUksV0FBVyxFQUFHcm1CLEVBQUlxbUIsRUFBSSxXQUFXLEVBQzdEbUIsRUFBTyxJQUNQQyxFQUFLRCxFQUFPLEVBQUdFLEVBQUtGLEVBQU8sRUFHM0JHLEVBQVUzbkIsRUFBSSxHQUFNLElBQU0sR0FDMUI0bkIsR0FBV2x2QixFQUFJc0gsRUFBSSxJQUFNLEdBQU0sSUFBTSxHQUNyQzZuQixHQUFZNVMsRUFBSSxHQUFNdmMsRUFBSSxJQUFNLEdBQU0sSUFBTSxHQUdsRCxJQUFJb3ZCLEVBQVMsR0FDYixRQUFTdnVCLEVBQUksRUFBR0EsR0FBSyxHQUFJQSxJQUFLLENBQzVCLE1BQU13dUIsRUFBU3h1QixFQUFJLEdBQU0sRUFBSSxLQUFLLEdBQUssS0FBSyxHQUFLLEVBQzNDdUgsR0FBSSxHQUNKdVUsR0FBSW9TLEVBQUszbUIsR0FBSSxLQUFLLElBQUlpbkIsQ0FBSyxFQUMzQnpTLEdBQUlvUyxFQUFLNW1CLEdBQUksS0FBSyxJQUFJaW5CLENBQUssRUFDM0JybkIsRUFBUTZtQixFQUFXN0IsRUFBTW5zQixFQUFJLEVBQUUsRUFBSUEsRUFFekN1dUIsR0FBVSxZQUFZelMsRUFBQyxRQUFRQyxFQUFDLGtGQURyQmlTLEVBQVcsSUFBTSxHQUN3RiwrREFBK0Q3bUIsQ0FBSyxTQUMxTCxDQUdBLElBQUlzbkIsRUFBUSxHQUNaLFFBQVN6dUIsRUFBSSxFQUFHQSxFQUFJLEdBQUlBLElBQUssQ0FDM0IsTUFBTXd1QixFQUFTeHVCLEVBQUksR0FBTSxFQUFJLEtBQUssR0FBSyxLQUFLLEdBQUssRUFDM0MwdUIsR0FBUSxHQUNSQyxHQUFRM3VCLEVBQUksSUFBTSxFQUFJLEdBQUssR0FDM0I0dUIsR0FBS1YsRUFBS1MsR0FBUSxLQUFLLElBQUlILENBQUssRUFDaENLLEVBQUtWLEVBQUtRLEdBQVEsS0FBSyxJQUFJSCxDQUFLLEVBQ2hDTSxHQUFLWixFQUFLUSxHQUFRLEtBQUssSUFBSUYsQ0FBSyxFQUNoQ08sR0FBS1osRUFBS08sR0FBUSxLQUFLLElBQUlGLENBQUssRUFDaEMvUyxHQUFJemIsRUFBSSxJQUFNLEVBQUksSUFBTSxHQUM5Qnl1QixHQUFTLGFBQWFHLEVBQUUsU0FBU0MsQ0FBRSxTQUFTQyxFQUFFLFNBQVNDLEVBQUUseUNBQXlDdFQsRUFBQyw0QkFDckcsQ0FFQSxNQUFNdVQsRUFBTSw4Q0FBOENmLENBQUksSUFBSUEsQ0FBSSxZQUFZQSxDQUFJLGFBQWFBLENBQUk7QUFBQSxvQkFDdkZDLENBQUUsU0FBU0MsQ0FBRTtBQUFBLFFBQ3pCTSxDQUFLO0FBQUEsUUFDTEYsQ0FBTTtBQUFBLGtCQUNJTCxDQUFFLFNBQVNDLENBQUUsU0FBU0QsRUFBSyxHQUFLLEtBQUssSUFBSUksRUFBUyxLQUFLLEdBQUssR0FBRyxDQUFDLFNBQVNILEVBQUssR0FBSyxLQUFLLElBQUlHLEVBQVMsS0FBSyxHQUFLLEdBQUcsQ0FBQztBQUFBLGtCQUNuSEosQ0FBRSxTQUFTQyxDQUFFLFNBQVNELEVBQUssR0FBSyxLQUFLLElBQUlHLEVBQVMsS0FBSyxHQUFLLEdBQUcsQ0FBQyxTQUFTRixFQUFLLEdBQUssS0FBSyxJQUFJRSxFQUFTLEtBQUssR0FBSyxHQUFHLENBQUM7QUFBQSxrQkFDbkhILENBQUUsU0FBU0MsQ0FBRSxTQUFTRCxFQUFLLEdBQUssS0FBSyxJQUFJRSxFQUFTLEtBQUssR0FBSyxHQUFHLENBQUMsU0FBU0QsRUFBSyxHQUFLLEtBQUssSUFBSUMsRUFBUyxLQUFLLEdBQUssR0FBRyxDQUFDO0FBQUEsb0JBQ2pIRixDQUFFLFNBQVNDLENBQUU7QUFBQSxZQUd2QmhCLEVBQU9MLEVBQUksU0FBUyxHQUFLLEdBQUssS0FBTyxLQUMzQ2QsRUFBTyxVQUFZLGtDQUFrQ2dELENBQUcseURBQTBEbEMsRUFBSSxTQUFTLEVBQUksSUFBTSxFQUFHLElBQUksT0FBTzN0QixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJZ3VCLENBQUksdUNBQXVDdmhCLEVBQVFraEIsQ0FBRyxDQUFDLHNCQUNwT04sRUFBZSxRQUNqQixDQUdBLFNBQVN5QyxHQUFPLENBQ2QsTUFBTW5DLEVBQU0sSUFBSSxLQUNWcFIsRUFBSW9SLEVBQUksU0FBUyxFQUFJLElBQU0sR0FDM0IzdEIsRUFBSTJ0QixFQUFJLFdBQVcsRUFDbkJybUIsRUFBSXFtQixFQUFJLFdBQVcsRUFHbkJvQyxFQUFnQixnQkFBa0I5QyxJQUFpQixVQUFZLElBQU1BLEVBQWUsSUFLMUYsT0FKSUwsRUFBTyxZQUFjbUQsSUFDdkJuRCxFQUFPLFVBQVltRCxHQUdiOUMsRUFBYyxDQUNwQixJQUFLLE1BQU9pQixFQUFVUCxDQUFHLEVBQUcsTUFDNUIsSUFBSyxXQUFZTyxFQUFVUCxDQUFHLEVBQUcsTUFDakMsSUFBSyxZQUFhTyxFQUFVUCxDQUFHLEVBQUcsTUFDbEMsSUFBSyxZQUFhTyxFQUFVUCxDQUFHLEVBQUcsTUFDbEMsSUFBSyxXQUFZTyxFQUFVUCxDQUFHLEVBQUcsTUFDakMsSUFBSyxPQUFRUyxFQUFXVCxDQUFHLEVBQUcsTUFDOUIsSUFBSyxTQUFVYSxFQUFhYixDQUFHLEVBQUcsTUFDbEMsSUFBSyxTQUFVaUIsRUFBYWpCLEVBQUssRUFBSyxFQUFHLE1BQ3pDLElBQUssUUFBU2lCLEVBQWFqQixFQUFLLEVBQUksRUFBRyxNQUN2QyxRQUFTRyxFQUFjSCxDQUFHLENBQzVCLENBR0kzdEIsSUFBTSxHQUFLc0gsSUFBTSxHQUFLaVYsSUFBTTJRLElBQzlCQSxFQUFnQjNRLEVBQ2hCaVIsRUFBV2pSLENBQUMsR0FFVnZjLElBQU0sSUFBR2t0QixFQUFnQixHQUMvQixDQUVBLFNBQVM4QyxHQUFtQixDQUMxQixhQUFhekMsQ0FBUyxFQUN0QixNQUFNbFcsRUFBVyxTQUFTLE9BQVMsSUFBUSxJQUNyQzRZLEVBQVE1WSxFQUFZLEtBQUssSUFBSSxFQUFJQSxFQUFZLEdBQ25Ea1csRUFBWSxXQUFXLElBQU0sQ0FDM0J1QyxFQUFLLEVBQ0xFLEVBQWlCLENBQ25CLEVBQUdDLENBQUssQ0FDVixDQUVBLFNBQVMsaUJBQWlCLG1CQUFvQixJQUFNLENBQ2xEN0MsRUFBaUIsR0FDakJRLEVBQWtCLEVBQ2xCa0MsRUFBSyxFQUNMRSxFQUFpQixDQUNuQixDQUFDLEVBRURGLEVBQUssRUFDTEUsRUFBaUIsRUFHakIsTUFBTUUsRUFBUyxDQUNiLENBQUUsR0FBSSxVQUFXLE1BQU8sVUFBVyxLQUFNLFdBQUssRUFDOUMsQ0FBRSxHQUFJLE1BQU8sTUFBTyxZQUFhLEtBQU0sV0FBSyxFQUM1QyxDQUFFLEdBQUksV0FBWSxNQUFPLFdBQVksS0FBTSxXQUFLLEVBQ2hELENBQUUsR0FBSSxZQUFhLE1BQU8sWUFBYSxLQUFNLFdBQUssRUFDbEQsQ0FBRSxHQUFJLFlBQWEsTUFBTyxZQUFhLEtBQU0sV0FBSyxFQUNsRCxDQUFFLEdBQUksV0FBWSxNQUFPLFdBQVksS0FBTSxXQUFLLEVBQ2hELENBQUUsR0FBSSxPQUFRLE1BQU8sYUFBYyxLQUFNLFdBQUssRUFDOUMsQ0FBRSxHQUFJLFNBQVUsTUFBTyxTQUFVLEtBQU0sV0FBSyxFQUM1QyxDQUFFLEdBQUksU0FBVSxNQUFPLFNBQVUsS0FBTSxRQUFJLEVBQzNDLENBQUUsR0FBSSxRQUFTLE1BQU8sUUFBUyxLQUFNLGlCQUFNLENBQzdDLEVBRUEsSUFBSUMsRUFBbUIsaUNBQ3ZCRCxFQUFPLFFBQVE1b0IsR0FBSyxDQUNsQjZvQixHQUFvQjtBQUFBLDREQUNvQzdvQixFQUFFLEVBQUU7QUFBQSxzRUFDTUEsRUFBRSxJQUFJLDBDQUEwQ0EsRUFBRSxLQUFLO0FBQUEsYUFFM0gsQ0FBQyxFQUNENm9CLEdBQW9CLFNBRXBCLFlBQVksdUJBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUs1QkEsQ0FBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0F3QmpCLEVBRVAsTUFBTWgwQixFQUFRLFNBQVMsZUFBZSxzQkFBc0IsRUFDdERpMEIsRUFBZSxTQUFTLGVBQWUscUJBQXFCLEVBQzVEQyxFQUFlLFNBQVMsZUFBZSxvQkFBb0IsRUFDM0Q5dkIsRUFBZ0IsU0FBUyxlQUFlLHNCQUFzQixFQUVwRSxTQUFTK3ZCLEdBQWUsQ0FDdEIsTUFBTWpvQixFQUFRLFFBQVEsYUFBYSxHQUFLLFVBQ2xDL00sRUFBUWEsRUFBTSxjQUFjLGdCQUFnQmtNLENBQUssSUFBSSxFQUN2RC9NLElBQU9BLEVBQU0sUUFBVSxJQUMzQjgwQixFQUFhLFFBQVUsUUFBUSxjQUFjLElBQU0sT0FDbkRDLEVBQWEsTUFBUSxRQUFRLG9CQUFvQixHQUFLLEtBQ3REOXZCLEVBQWMsTUFBTSxRQUFVNnZCLEVBQWEsUUFBVSxJQUFNLEtBQzdELENBRUFBLEdBQWMsaUJBQWlCLFNBQVUsSUFBTSxDQUM3Qzd2QixFQUFjLE1BQU0sUUFBVTZ2QixFQUFhLFFBQVUsSUFBTSxLQUM3RCxDQUFDLEVBRUQsU0FBUyxlQUFlLGdCQUFnQixHQUFHLGlCQUFpQixRQUFTLElBQU0sQ0FDekVFLEVBQWEsRUFDYm4wQixFQUFNLFVBQVUsSUFBSSxNQUFNLENBQzVCLENBQUMsRUFFRCxTQUFTLGVBQWUsa0JBQWtCLEdBQUcsaUJBQWlCLFFBQVMsSUFBTSxDQUMzRSxNQUFNeUUsRUFBTSxTQUFTeXZCLEVBQWEsTUFBTyxFQUFFLEVBQUksSUFDekMzQyxFQUFPLElBQUksTUFBTSxnQ0FBZ0MsRUFDdkRBLEVBQUssT0FBUzlzQixFQUNkOHNCLEVBQUssS0FBSyxFQUFFLE1BQU0sSUFBTSxDQUFDLENBQUMsQ0FDNUIsQ0FBQyxFQUVELFNBQVMsZUFBZSxxQkFBcUIsR0FBRyxpQkFBaUIsUUFBUyxJQUFNLENBQzlFLE1BQU1weUIsRUFBUWEsRUFBTSxjQUFjLHlDQUF5QyxFQUNyRWtNLEVBQVEvTSxFQUFRQSxFQUFNLE1BQVEsVUFDcEMsUUFBUSxjQUFlK00sQ0FBSyxFQUM1QixRQUFRLGVBQWdCLE9BQU8rbkIsRUFBYSxPQUFPLENBQUMsRUFDcEQsUUFBUSxxQkFBc0JDLEVBQWEsS0FBSyxFQUNoRHBELEVBQWU1a0IsRUFDZitrQixFQUFpQixHQUNqQlEsRUFBa0IsRUFDbEJrQyxFQUFLLEVBQ0xFLEVBQWlCLEVBQ2pCN3pCLEVBQU0sVUFBVSxPQUFPLE1BQU0sRUFDN0IsaUJBQWlCLHVCQUF3QixVQUFXLEdBQUksQ0FDMUQsQ0FBQyxFQUVELFNBQVMsZUFBZSx1QkFBdUIsR0FBRyxpQkFBaUIsUUFBUyxJQUFNLENBQ2hGQSxFQUFNLFVBQVUsT0FBTyxNQUFNLENBQy9CLENBQUMsRUFFRCxVQUFVQSxDQUFLLEVBR2ZBLEdBQU8saUJBQWlCLGlDQUFpQyxFQUFFLFFBQVFiLEdBQVMsQ0FDMUVBLEVBQU0saUJBQWlCLFNBQVUsSUFBTSxDQUNyQzJ4QixFQUFlM3hCLEVBQU0sTUFDckI4eEIsRUFBaUIsR0FDakJRLEVBQWtCLEVBQ2xCa0MsRUFBSyxDQUNQLENBQUMsQ0FDSCxDQUFDLENBQ0gsR0FBRyxHQU9GLFVBQVksQ0FDWCxTQUFTUyxFQUFTaGhCLEVBQUksQ0FHcEIsTUFBTTdGLEVBQUksSUFBSSxLQUFLNkYsRUFBRyxLQUFLLEVBQ3JCaWhCLEVBQVcsTUFBTTltQixFQUFFLFFBQVEsQ0FBQyxFQUM5QixXQUFXNkYsRUFBRyxPQUFTLEtBQU8sT0FBUyxPQUFPQSxFQUFHLEtBQUssQ0FBQyxHQUN2RDdGLEVBQUUsWUFBWSxFQUNsQixPQUFPNkYsRUFBRyxJQUFNLEdBQUdBLEVBQUcsR0FBRyxJQUFJaWhCLENBQVEsR0FBSyxHQUFHQSxDQUFRLElBQUlqaEIsRUFBRyxPQUFTLEVBQUUsRUFDekUsQ0FFQSxTQUFTa2hCLEdBQWMsQ0FDckIsTUFBTUMsRUFBTSxJQUFJLElBQ2hCLE1BQU8sQ0FDTCxLQUFNLElBQU1BLEVBQUksS0FDaEIsTUFBTXhQLEVBQU10RixFQUFPLENBQ2pCLEdBQUlBLEVBQ0YsU0FBVyxDQUFDaFYsRUFBRzJJLENBQUUsSUFBS21oQixFQUFLLENBQ3pCLE1BQU01NEIsRUFBSSxJQUFJLEtBQUt5WCxFQUFHLEtBQUssRUFBRSxRQUFRLEVBQ2pDelgsR0FBSzhqQixFQUFNLE1BQU0sUUFBUSxHQUFLOWpCLEdBQUs4akIsRUFBTSxJQUFJLFFBQVEsR0FBRzhVLEVBQUksT0FBTzlwQixDQUFDLENBQzFFLENBRUYsVUFBVzJJLEtBQVEyUixHQUFRLE1BQU0sUUFBUUEsRUFBSyxNQUFNLEVBQUtBLEVBQUssT0FBUyxDQUFDLEVBQ3RFd1AsRUFBSSxJQUFJSCxFQUFTaGhCLENBQUUsRUFBR0EsQ0FBRSxFQUUxQixNQUFPLENBQUUsT0FBUSxDQUFDLEdBQUdtaEIsRUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUN6ekIsRUFBR0MsSUFBTSxJQUFJLEtBQUtELEVBQUUsS0FBSyxFQUFJLElBQUksS0FBS0MsRUFBRSxLQUFLLENBQUMsQ0FBRSxDQUMzRixDQUNGLENBQ0YsQ0FFQSxNQUFNaXNCLEVBQU0sQ0FBRSxTQUFBb0gsRUFBVSxZQUFBRSxDQUFZLEVBQ2hDLE9BQU8sT0FBVyxLQUFlLE9BQU8sVUFBUyxPQUFPLFFBQVV0SCxHQUNsRSxPQUFPLE9BQVcsTUFBYSxPQUFPLGNBQWdCQSxFQUM1RCxHQUFHLEdBZUYsVUFBVyxDQUNWLE1BQU1wdEIsRUFBZSxJQUFJLGFBRXpCLFlBQVksaUJBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBb0RmLEVBRWYsU0FBUzJRLEVBQVdwRixFQUFHLENBQ3JCLE9BQU8sT0FBT0EsR0FBWSxFQUFNLEVBQzdCLFFBQVEsS0FBTSxPQUFPLEVBQUUsUUFBUSxLQUFNLE1BQU0sRUFBRSxRQUFRLEtBQU0sTUFBTSxFQUNqRSxRQUFRLEtBQU0sUUFBUSxFQUFFLFFBQVEsS0FBTSxPQUFPLENBQ2xELENBRUEsTUFBTXFwQixFQUFZLEtBQU8sQ0FDdkIsS0FBTSxTQUFTLGNBQWMsdUJBQXVCLEVBQ3BELEtBQU0sU0FBUyxjQUFjLHVCQUF1QixDQUN0RCxHQUVBLFNBQVNDLEVBQVFDLEVBQU9DLEVBQVEsQ0FDOUIsTUFBTXBuQixFQUFJLElBQUksS0FBS21uQixDQUFLLEVBQ2xCRSxFQUFRLElBQUksS0FBUUEsRUFBTSxTQUFTLEVBQUcsRUFBRyxFQUFHLENBQUMsRUFDbkQsTUFBTUMsRUFBTSxJQUFJLEtBQUt0bkIsQ0FBQyxFQUFHc25CLEVBQUksU0FBUyxFQUFHLEVBQUcsRUFBRyxDQUFDLEVBQ2hELE1BQU1DLEVBQU8sS0FBSyxPQUFPRCxFQUFNRCxHQUFTLEtBQVEsRUFDMUNHLEVBQVdELElBQVMsRUFBSSxRQUFVQSxJQUFTLEVBQUksV0FDbkR2bkIsRUFBRSxtQkFBbUIsT0FBVyxDQUFFLFFBQVMsUUFBUyxNQUFPLFFBQVMsSUFBSyxTQUFVLENBQUMsRUFDaEZ5bkIsRUFBWUwsRUFBUyxVQUFZcG5CLEVBQUUsbUJBQW1CLE9BQVcsQ0FBRSxLQUFNLFVBQVcsT0FBUSxTQUFVLENBQUMsRUFDN0csTUFBTyxHQUFHd25CLENBQVEsSUFBSUMsQ0FBUyxFQUNqQyxDQUVBLFNBQVNDLEVBQVFQLEVBQU9DLEVBQVEsQ0FDOUIsT0FBSUEsRUFBZSxVQUNaLElBQUksS0FBS0QsQ0FBSyxFQUFFLG1CQUFtQixPQUFXLENBQUUsS0FBTSxVQUFXLE9BQVEsU0FBVSxDQUFDLENBQzdGLENBRUEsU0FBU1EsRUFBTzNuQixFQUFHLENBQ2pCLE1BQU8sR0FBR0EsRUFBRSxZQUFZLENBQUMsSUFBSSxPQUFPQSxFQUFFLFNBQVMsRUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsQ0FBQyxJQUFJLE9BQU9BLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsQ0FBQyxFQUNoSCxDQVNBLE1BQU00bkIsRUFBUyxPQUFPLE9BQVcsS0FBZSxPQUFPLGNBQ25ELE9BQU8sY0FBYyxZQUFZLEVBQUksS0FDekMsU0FBU0MsRUFBWXJRLEVBQU10RixFQUFPLENBQ2hDLE9BQUkwVixFQUFjQSxFQUFNLE1BQU1wUSxFQUFNdEYsQ0FBSyxFQUVsQ3NGLENBQ1QsQ0FPQSxJQUFJc1EsRUFBa0IsQ0FBQyxFQUN2QixTQUFTQyxFQUFVQyxFQUFNLENBR3ZCLE1BQU1DLEVBQU9ELEdBQVEsSUFBSSxLQUNuQmIsRUFBUSxJQUFJLEtBQUtjLEVBQUssWUFBWSxFQUFHQSxFQUFLLFNBQVMsRUFBSSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBQyxFQUN2RUMsRUFBTSxJQUFJLEtBQUtELEVBQUssWUFBWSxFQUFHQSxFQUFLLFNBQVMsRUFBSSxFQUFHLEVBQUcsR0FBSSxHQUFJLEdBQUksR0FBRyxFQUNoRixNQUFPLENBQUUsTUFBQWQsRUFBTyxJQUFBZSxDQUFJLENBQ3RCLENBQ0EsU0FBU0MsRUFBT2pXLEVBQU8sQ0FFckIsT0FBTzRWLEVBQWdCLEtBQUtNLEdBQzFCQSxFQUFHLE1BQU0sUUFBUSxHQUFLbFcsRUFBTSxNQUFNLFFBQVEsR0FDMUNrVyxFQUFHLElBQUksUUFBUSxHQUFLbFcsRUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUMzQyxDQUNBLFNBQVNtVyxFQUFXblcsRUFBTyxDQUV6QixNQUFNb1csRUFBTVIsRUFBZ0IsT0FBT00sR0FDakNBLEVBQUcsSUFBSSxRQUFRLEdBQUtsVyxFQUFNLE1BQU0sUUFBUSxHQUFLa1csRUFBRyxNQUFNLFFBQVEsR0FBS2xXLEVBQU0sSUFBSSxRQUFRLENBQUMsRUFDbEZxVyxFQUFPVCxFQUFnQixPQUFPTSxHQUFNLENBQUNFLEVBQUksU0FBU0YsQ0FBRSxDQUFDLEVBQ3ZERSxFQUFJLFNBQ05wVyxFQUFRLENBQ04sTUFBTyxJQUFJLEtBQUssS0FBSyxJQUFJQSxFQUFNLE1BQU0sUUFBUSxFQUFHLEdBQUdvVyxFQUFJLElBQUksR0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUNuRixJQUFLLElBQUksS0FBSyxLQUFLLElBQUlwVyxFQUFNLElBQUksUUFBUSxFQUFHLEdBQUdvVyxFQUFJLElBQUksR0FBSyxFQUFFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUMvRSxHQUVGUixFQUFrQlMsRUFBSyxPQUFPLENBQUNyVyxDQUFLLENBQUMsRUFBRSxLQUFLLENBQUMzZSxFQUFHQyxJQUFNRCxFQUFFLE1BQVFDLEVBQUUsS0FBSyxDQUN6RSxDQUNBLElBQUlnMUIsRUFBWSxLQUNaQyxFQUFhLENBQUUsT0FBUSxDQUFDLENBQUUsRUFDOUIsZUFBZUMsRUFBY0MsRUFBTyxDQUNsQyxNQUFNelcsRUFBUTZWLEVBQVVTLENBQVMsRUFDakMsR0FBSSxDQUFDRyxHQUFTUixFQUFPalcsQ0FBSyxFQUFHLE9BQU91VyxFQUNwQyxNQUFNbnRCLEVBQU8sTUFBTSxZQUFZLGlDQUFpQzRXLEVBQU0sTUFBTSxZQUFZLENBQUMsUUFBUUEsRUFBTSxJQUFJLFlBQVksQ0FBQyxHQUFJLENBQUUsTUFBTyxVQUFXLENBQUMsRUFDakosR0FBSTVXLEVBQUssU0FBVyxJQUFLLE1BQU8sQ0FBRSxjQUFlLEVBQUssRUFDdEQsR0FBSSxDQUFDQSxFQUFLLEdBQUksTUFBTSxJQUFJLE1BQU0scUJBQXFCQSxFQUFLLE1BQU0sRUFBRSxFQUNoRSxNQUFNa2MsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQzdCLE9BQUFtdEIsRUFBYVosRUFBWXJRLEVBQU10RixDQUFLLEVBQ3BDbVcsRUFBV25XLENBQUssRUFDVHVXLENBQ1QsQ0FFQSxTQUFTRyxFQUFhcFIsRUFBTSxDQUMxQixNQUFNcVIsRUFBTTVCLEVBQVUsRUFDdEIsR0FBSSxDQUFDNEIsRUFBSSxNQUFRLENBQUNBLEVBQUksS0FBTSxPQUM1QixNQUFNQyxFQUFXQyxFQUFjdlIsR0FBUSxNQUFNLFFBQVFBLEVBQUssTUFBTSxFQUFLQSxFQUFLLE9BQVMsQ0FBQyxDQUFDLEVBQ3JGLEdBQUksQ0FBQ3NSLEVBQVMsT0FBUSxDQUNwQkQsRUFBSSxLQUFLLFlBQWMsWUFDdkJBLEVBQUksS0FBSyxVQUFZLCtEQUNyQixNQUNGLENBQ0EsTUFBTUcsRUFBT0YsRUFBUyxDQUFDLEVBQ3ZCRCxFQUFJLEtBQUssWUFBY0csRUFBSyxPQUFTLGtCQUFRLFNBQzdDSCxFQUFJLEtBQUssVUFBWSxnQ0FBZ0M3bEIsRUFBV2dtQixFQUFLLE9BQVMsVUFBVSxDQUFDLDJDQUN0RGhtQixFQUFXa2tCLEVBQVE4QixFQUFLLE1BQU9BLEVBQUssTUFBTSxDQUFDLENBQUMsU0FDakYsQ0FHQSxTQUFTQyxFQUFTelIsRUFBTSxDQUN0QixNQUFNd1AsRUFBTSxDQUFDLEVBQ2IsVUFBV25oQixLQUFRMlIsR0FBUSxNQUFNLFFBQVFBLEVBQUssTUFBTSxFQUFLQSxFQUFLLE9BQVMsQ0FBQyxFQUFJLENBQzFFLE1BQU10YSxFQUFJeXFCLEVBQU8sSUFBSSxLQUFLOWhCLEVBQUcsS0FBSyxDQUFDLEdBQ2xDbWhCLEVBQUk5cEIsQ0FBQyxFQUFJOHBCLEVBQUk5cEIsQ0FBQyxHQUFLLENBQUMsR0FBRyxLQUFLMkksQ0FBRSxDQUNqQyxDQUNBLE9BQU9taEIsQ0FDVCxDQUVBLFNBQVNrQyxFQUFXMVIsRUFBTSxDQUN4QixNQUFNOWtCLEVBQU8sU0FBUyxlQUFlLFVBQVUsRUFDekM0TCxFQUFRLFNBQVMsZUFBZSxpQkFBaUIsRUFDdkQsR0FBSSxDQUFDNUwsR0FBUSxDQUFDNEwsRUFBTyxPQUNoQmtxQixJQUFhQSxFQUFZLElBQUksS0FBUUEsRUFBVSxRQUFRLENBQUMsR0FDN0QsTUFBTXRWLEVBQUlzVixFQUFVLFlBQVksRUFBR2x5QixFQUFJa3lCLEVBQVUsU0FBUyxFQUMxRGxxQixFQUFNLFlBQWNrcUIsRUFBVSxtQkFBbUIsT0FBVyxDQUFFLE1BQU8sT0FBUSxLQUFNLFNBQVUsQ0FBQyxFQUM5RixNQUFNVyxFQUFRRixFQUFTelIsQ0FBSSxFQUNyQjRSLEVBQVd6QixFQUFPLElBQUksSUFBTSxFQUM1QjBCLEVBQVcsSUFBSSxLQUFLblcsRUFBRzVjLEVBQUcsQ0FBQyxFQUFFLE9BQU8sRUFDcENnekIsRUFBUyxJQUFJLEtBQUtwVyxFQUFHNWMsRUFBSSxFQUFHLENBQUMsRUFBRSxRQUFRLEVBQzdDLElBQUlyRyxFQUFPLENBQUMsSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssR0FBRyxFQUFFLElBQUkrUCxHQUFLLHdCQUF3QkEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQ2xHLFFBQVM3SSxFQUFJLEVBQUdBLEVBQUlreUIsRUFBVWx5QixJQUFLbEgsR0FBUSxzQ0FDM0MsUUFBU3EzQixFQUFNLEVBQUdBLEdBQU9nQyxFQUFRaEMsSUFBTyxDQUN0QyxNQUFNbHpCLEVBQU0sR0FBRzhlLENBQUMsSUFBSSxPQUFPNWMsRUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsQ0FBQyxJQUFJLE9BQU9neEIsQ0FBRyxFQUFFLFNBQVMsRUFBRyxHQUFHLENBQUMsR0FDNUVpQyxFQUFZSixFQUFNLzBCLENBQUcsR0FBSyxDQUFDLEVBQzNCcXdCLEdBQU0sQ0FBQyxTQUFTLEVBQ2xCcndCLElBQVFnMUIsR0FBVTNFLEdBQUksS0FBSyxXQUFXLEVBQ3RDOEUsRUFBVSxRQUFROUUsR0FBSSxLQUFLLGdCQUFnQixFQUMvQyxNQUFNK0UsR0FBT0QsRUFBVSxNQUFNLEVBQUcsQ0FBQyxFQUFFLElBQUtqOEIsR0FDdEMsZ0NBQWdDMFYsRUFBVzBrQixFQUFRcDZCLEVBQUUsTUFBT0EsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQ3RGbThCLEdBQU1GLEVBQVUsSUFBSWo4QixHQUFLLEdBQUdvNkIsRUFBUXA2QixFQUFFLE1BQU9BLEVBQUUsTUFBTSxDQUFDLFdBQU1BLEVBQUUsT0FBUyxVQUFVLEVBQUUsRUFBRSxLQUFLO0FBQUEsQ0FBSSxFQUNwRzJDLEdBQVEsZUFBZXcwQixHQUFJLEtBQUssR0FBRyxDQUFDLFlBQVl6aEIsRUFBV3ltQixJQUFPcjFCLENBQUcsQ0FBQyw4QkFDeENrekIsQ0FBRyxVQUFVa0MsR0FBTywwQkFBMEJBLEVBQUksVUFBWSxFQUFFLFFBQ2hHLENBQ0E5MkIsRUFBSyxVQUFZekMsQ0FDbkIsQ0FFQSxTQUFTODRCLEVBQWFXLEVBQVEsQ0FDNUIsTUFBTXpGLEVBQU0sS0FBSyxJQUFJLEVBQ3JCLE9BQVEsTUFBTSxRQUFReUYsQ0FBTSxFQUFJQSxFQUFTLENBQUMsR0FDdkMsT0FBT3A4QixJQUNPQSxFQUFFLElBQU0sSUFBSSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUksSUFBSSxLQUFLQSxFQUFFLEtBQUssRUFBRSxRQUFRLElBQzVEMjJCLENBQ2hCLEVBQ0EsS0FBSyxDQUFDMXdCLEVBQUdDLElBQU0sSUFBSSxLQUFLRCxFQUFFLEtBQUssRUFBSSxJQUFJLEtBQUtDLEVBQUUsS0FBSyxDQUFDLENBQ3pELENBRUEsU0FBU20yQixFQUFlblMsRUFBTSxDQUM1QixNQUFNcmIsRUFBTyxTQUFTLGVBQWUsd0JBQXdCLEVBQzdELEdBQUksQ0FBQ0EsRUFBTSxPQUNYLE1BQU11dEIsRUFBU1gsRUFBY3ZSLEdBQVEsTUFBTSxRQUFRQSxFQUFLLE1BQU0sRUFBS0EsRUFBSyxPQUFTLENBQUMsQ0FBQyxFQUNuRixHQUFJLENBQUNrUyxFQUFPLE9BQVEsQ0FDbEJ2dEIsRUFBSyxVQUFZLHlEQUNqQixNQUNGLENBQ0FBLEVBQUssVUFBWXV0QixFQUFPLE1BQU0sRUFBRyxFQUFFLEVBQUUsSUFBSTdqQixHQUN2QztBQUFBLGtDQUM0QjdDLEVBQVdra0IsRUFBUXJoQixFQUFHLE1BQU9BLEVBQUcsTUFBTSxDQUFDLENBQUM7QUFBQSxxQ0FDckM3QyxFQUFXNkMsRUFBRyxPQUFTLFVBQVUsQ0FBQztBQUFBLFdBQzVEQSxFQUFHLFNBQVcseUJBQXlCN0MsRUFBVzZDLEVBQUcsUUFBUSxDQUFDLFVBQVksRUFBRTtBQUFBLGNBQ3pFLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBRUEsZUFBZStqQixHQUFnQixDQUM3QixNQUFNNWEsRUFBUyxTQUFTLGVBQWUsdUJBQXVCLEVBQzlELEdBQUksQ0FBQ0EsRUFBUSxPQUNiLElBQUk2YSxFQUFVLENBQUMsRUFDZixHQUFJLENBQ0YsTUFBTXZ1QixFQUFPLE1BQU0sWUFBWSwyQkFBNEIsQ0FBRSxNQUFPLFVBQVcsQ0FBQyxFQUNoRixHQUFJQSxFQUFLLEdBQUksQ0FDWCxNQUFNa2MsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQzdCdXVCLEVBQVdyUyxHQUFRLE1BQU0sUUFBUUEsRUFBSyxPQUFPLEVBQUtBLEVBQUssUUFDbEQsTUFBTSxRQUFRQSxDQUFJLEVBQUlBLEVBQU8sQ0FBQyxDQUNyQyxDQUNGLE1BQVksQ0FBMkIsQ0FDdkMsR0FBSSxDQUFDcVMsRUFBUSxPQUFRLENBQ25CN2EsRUFBTyxVQUFZLGlKQUNuQixNQUNGLENBQ0FBLEVBQU8sVUFBWTZhLEVBQVEsSUFBSWpzQixHQUFLO0FBQUE7QUFBQSxvQ0FFSm9GLEVBQVdwRixFQUFFLE1BQVFBLEVBQUUsRUFBRSxDQUFDO0FBQUEsdUNBQzFCb0YsRUFBV3BGLEVBQUUsSUFBSSxDQUFDLEdBQUdBLEVBQUUsZ0JBQWtCLG1CQUFrQixFQUFFO0FBQUEsMERBQ3ZDb0YsRUFBV3BGLEVBQUUsRUFBRSxDQUFDLG1CQUFtQkEsRUFBRSxVQUFZLEdBQVEsSUFBTSxHQUFHLEtBQUtBLEVBQUUsVUFBWSxHQUFRLFlBQVMsS0FBSztBQUFBLHNFQUMvRm9GLEVBQVdwRixFQUFFLEVBQUUsQ0FBQztBQUFBLGFBQ3pFLEVBQUUsS0FBSyxFQUFFLEVBQ2xCb1IsRUFBTyxpQkFBaUIsaUJBQWlCLEVBQUUsUUFBUXRoQixHQUFPQSxFQUFJLGlCQUFpQixRQUFTLFNBQVksQ0FDbEcsTUFBTWlNLEVBQUtqTSxFQUFJLFFBQVEsR0FDakJvOEIsRUFBU3A4QixFQUFJLFFBQVEsVUFBWSxJQUN2Q0EsRUFBSSxTQUFXLEdBQ2YsR0FBSSxDQUNGLE1BQU00TixFQUFPLE1BQU0sWUFBWSw0QkFBNEIsbUJBQW1CM0IsQ0FBRSxDQUFDLEdBQUksQ0FDbkYsT0FBUSxNQUFPLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDN0QsS0FBTSxLQUFLLFVBQVUsQ0FBRSxRQUFTbXdCLENBQU8sQ0FBQyxDQUMxQyxDQUFDLEVBQ0QsR0FBSSxDQUFDeHVCLEVBQUssR0FBSSxNQUFNLElBQUksTUFBTSxRQUFRQSxFQUFLLE1BQU0sRUFBRSxFQUNuRHN1QixFQUFjLEVBQUdHLEVBQVEsRUFBSSxDQUMvQixPQUFTejhCLEVBQUcsQ0FDVixpQkFBaUIsa0NBQWtDQSxFQUFFLE9BQU8sR0FBSSxPQUFPLENBQ3pFLFFBQUUsQ0FDQUksRUFBSSxTQUFXLEVBQ2pCLENBQ0YsQ0FBQyxDQUFDLEVBQ0ZzaEIsRUFBTyxpQkFBaUIsY0FBYyxFQUFFLFFBQVF0aEIsR0FBT0EsRUFBSSxpQkFBaUIsUUFBUyxTQUFZLENBQy9GLE1BQU1pTSxFQUFLak0sRUFBSSxRQUFRLEdBQ3ZCQSxFQUFJLFNBQVcsR0FDZixHQUFJLENBQ0YsTUFBTTROLEVBQU8sTUFBTSxZQUFZLDRCQUE0QixtQkFBbUIzQixDQUFFLENBQUMsR0FBSSxDQUFFLE9BQVEsUUFBUyxDQUFDLEVBQ3pHLEdBQUksQ0FBQzJCLEVBQUssR0FBSSxNQUFNLElBQUksTUFBTSxRQUFRQSxFQUFLLE1BQU0sRUFBRSxFQUNuRHN1QixFQUFjLEVBQUdHLEVBQVEsRUFBSSxDQUMvQixPQUFTejhCLEVBQUcsQ0FDVixpQkFBaUIsbUNBQW1DQSxFQUFFLE9BQU8sR0FBSSxPQUFPLENBQzFFLFFBQUUsQ0FDQUksRUFBSSxTQUFXLEVBQ2pCLENBQ0YsQ0FBQyxDQUFDLENBQ0osQ0FFQSxJQUFJczhCLEVBQVcsS0FDZixlQUFlRCxFQUFRcEIsRUFBTyxDQUk1QixHQUFJb0IsRUFBUSxVQUFXLENBQU1wQixJQUFPb0IsRUFBUSxjQUFnQixJQUFNLE1BQVEsQ0FDMUVBLEVBQVEsVUFBWSxHQUNwQixHQUFJLENBR0YsSUFBSXZTLEVBQU8sTUFBTWtSLEVBQWMsQ0FBQyxDQUFDQyxDQUFLLEVBQ3RDLEdBQUlBLEdBQVNILEVBQVcsQ0FLdEIsTUFBTXBULEVBQVFvVCxFQUNkQSxFQUFZLEtBQ1osTUFBTXlCLEVBQVUsTUFBTXZCLEVBQWMsRUFBSSxFQUN4Q0YsRUFBWXBULEVBQ1osTUFBTThVLEVBQVcsTUFBTXhCLEVBQWMsRUFBSSxFQUN6Q0UsRUFBYXFCLENBQU8sRUFDcEJmLEVBQVdnQixDQUFRLEVBQ25CUCxFQUFlTSxDQUFPLEVBQ3RCRCxFQUFXQyxFQUNYRixFQUFRLFVBQVksR0FDcEIsTUFDRixDQUNBLEdBQUl2QixFQUFXLENBR2IsTUFBTXBULEVBQVFvVCxFQUNkQSxFQUFZLEtBQ1osTUFBTXlCLEVBQVUsTUFBTXZCLEVBQWMsRUFBSyxFQUN6Q0YsRUFBWXBULEVBQ1osTUFBTThVLEVBQVcsTUFBTXhCLEVBQWMsRUFBSyxFQUMxQ0UsRUFBYXFCLENBQU8sRUFDcEJmLEVBQVdnQixDQUFRLEVBQ25CUCxFQUFlTSxDQUFPLEVBQ3RCRCxFQUFXQyxFQUNYRixFQUFRLFVBQVksR0FDcEIsTUFDRixDQUNBQyxFQUFXeFMsRUFDWG9SLEVBQWFwUixDQUFJLEVBQ2IsU0FBUyxlQUFlLGdCQUFnQixFQUFFLFVBQVUsU0FBUyxNQUFNLElBQ3JFMFIsRUFBVzFSLENBQUksRUFDZm1TLEVBQWVuUyxDQUFJLEVBRXZCLE9BQVNscUIsRUFBRyxDQUNWK0UsRUFBYSxTQUFTLGtCQUFtQi9FLENBQUMsRUFDMUMsTUFBTXU3QixFQUFNNUIsRUFBVSxFQUNsQjRCLEVBQUksT0FBTUEsRUFBSSxLQUFLLFVBQVksdURBQ3JDLFFBQUUsQ0FDQWtCLEVBQVEsVUFBWSxHQUNoQkEsRUFBUSxnQkFDVkEsRUFBUSxjQUFnQixHQUN4QkEsRUFBUSxFQUFJLEVBRWhCLENBQ0YsQ0FJQSxJQUFJSSxFQUFlLEtBQ25CLFNBQVMzakIsR0FBWSxDQUNuQjJqQixFQUFlLFNBQVMsY0FDVixTQUFTLGVBQWUsZ0JBQWdCLEVBQ2hELFVBQVUsSUFBSSxNQUFNLEVBQzFCakIsRUFBV2MsR0FBWSxDQUFFLE9BQVEsQ0FBQyxDQUFFLENBQUMsRUFDckNMLEVBQWVLLEdBQVksQ0FBRSxPQUFRLENBQUMsQ0FBRSxDQUFDLEVBQ3pDSixFQUFjLEVBR2RHLEVBQVEsRUFDUixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxDQUNsRCxDQUNBLFNBQVN4bEIsR0FBYSxDQUNwQixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsVUFBVSxPQUFPLE1BQU0sRUFDN0Q0bEIsR0FBZ0IsT0FBT0EsRUFBYSxPQUFVLFlBQVlBLEVBQWEsTUFBTSxDQUNuRixDQUVBLFNBQVNDLEdBQVksQ0FDbkIsTUFBTyxDQUNMLEtBQU0sU0FBUyxlQUFlLGNBQWMsRUFBRSxNQUM5QyxLQUFNLFNBQVMsZUFBZSxjQUFjLEVBQUUsTUFBTSxLQUFLLEVBQ3pELElBQUssU0FBUyxlQUFlLGFBQWEsRUFBRSxNQUFNLEtBQUssRUFDdkQsS0FBTSxTQUFTLGVBQWUsY0FBYyxFQUFFLE1BQU0sS0FBSyxFQUN6RCxLQUFNLFNBQVMsZUFBZSxjQUFjLEVBQUUsS0FDaEQsQ0FDRixDQUVBLFNBQVNDLEVBQVVucEIsRUFBSyxDQUN0QixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsWUFBY0EsQ0FDMUQsQ0FFQSxTQUFTLGVBQWUsY0FBYyxFQUFFLGlCQUFpQixRQUFTLFNBQVksQ0FDNUUsTUFBTStNLEVBQUltYyxFQUFVLEVBQ3BCLEdBQUksQ0FBQ25jLEVBQUUsSUFBSyxDQUFFb2MsRUFBVSxvQkFBb0IsRUFBRyxNQUFRLENBQ3ZEQSxFQUFVLGVBQVUsRUFDcEIsR0FBSSxDQUtGLE1BQU03UyxFQUFPLE1BSkEsTUFBTSxZQUFZLDRCQUE2QixDQUMxRCxPQUFRLE9BQVEsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5RCxLQUFNLEtBQUssVUFBVSxDQUFFLElBQUt2SixFQUFFLElBQUssS0FBTUEsRUFBRSxLQUFNLEtBQU1BLEVBQUUsSUFBSyxDQUFDLENBQ2pFLENBQUMsR0FDdUIsS0FBSyxFQUN2QnZYLEVBQUk4Z0IsR0FBUUEsRUFBSyxNQUNuQjlnQixHQUFLQSxFQUFFLEdBQUkyekIsRUFBVSxxQkFBZ0IzekIsRUFBRSxRQUFVLFFBQVEsSUFBSUEsRUFBRSxrQkFBb0IsZ0NBQTZCLEVBQUUsRUFBRSxFQUNuSDJ6QixFQUFVLFVBQUszekIsR0FBS0EsRUFBRSxNQUFRQSxFQUFFLE1BQVEsZUFBZSxFQUFFLENBQ2hFLE9BQVNwSixFQUFHLENBQ1YrOEIsRUFBVSxVQUFLLzhCLEVBQUUsT0FBTyxFQUFFLENBQzVCLENBQ0YsQ0FBQyxFQUVELFNBQVMsZUFBZSxjQUFjLEVBQUUsaUJBQWlCLFFBQVMsU0FBWSxDQUM1RSxNQUFNMmdCLEVBQUltYyxFQUFVLEVBQ3BCLEdBQUksQ0FBQ25jLEVBQUUsTUFBUSxDQUFDQSxFQUFFLElBQUssQ0FBRW9jLEVBQVUsNEJBQTRCLEVBQUcsTUFBUSxDQUMxRSxHQUFJLENBQ0YsTUFBTS91QixFQUFPLE1BQU0sWUFBWSwyQkFBNEIsQ0FDekQsT0FBUSxPQUFRLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUQsS0FBTSxLQUFLLFVBQVUsQ0FBRSxLQUFNMlMsRUFBRSxLQUFNLEtBQU1BLEVBQUUsS0FBTSxJQUFLQSxFQUFFLElBQUssS0FBTUEsRUFBRSxLQUFNLEtBQU1BLEVBQUUsSUFBSyxDQUFDLENBQzdGLENBQUMsRUFDRCxHQUFJLENBQUMzUyxFQUFLLEdBQUksQ0FDWixNQUFNa2MsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFPLENBQUMsRUFBRSxFQUMvQyt1QixFQUFVLFVBQUs3UyxFQUFLLE9BQVNBLEVBQUssU0FBVyxRQUFRbGMsRUFBSyxNQUFNLEVBQUUsRUFBRSxFQUNwRSxNQUNGLENBQ0ErdUIsRUFBVSxRQUFRLEVBQ2xCLFNBQVMsZUFBZSxpQkFBaUIsRUFBRSxLQUFPLEdBQ2xELENBQUMsZUFBZ0IsY0FBZSxlQUFnQixjQUFjLEVBQUUsUUFBUTF3QixHQUFNLENBQUUsU0FBUyxlQUFlQSxDQUFFLEVBQUUsTUFBUSxFQUFJLENBQUMsRUFDekhpd0IsRUFBYyxFQUFHRyxFQUFRLEVBQUksQ0FDL0IsT0FBU3o4QixFQUFHLENBQ1YrOEIsRUFBVSxVQUFLLzhCLEVBQUUsT0FBTyxFQUFFLENBQzVCLENBQ0YsQ0FBQyxFQUVELE1BQU1nOUIsRUFBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQ3BEQSxJQUNGQSxFQUFPLGlCQUFpQixRQUFTOWpCLENBQVMsRUFHMUM4akIsRUFBTyxpQkFBaUIsVUFBWWg5QixHQUFNLEVBQ3BDQSxFQUFFLE1BQVEsU0FBV0EsRUFBRSxNQUFRLEtBQU9BLEVBQUUsTUFBUSxjQUNsREEsRUFBRSxlQUFlLEVBQ2pCa1osRUFBVSxFQUVkLENBQUMsR0FFSCxNQUFNK2pCLEVBQWMsU0FBUyxlQUFlLG1CQUFtQixFQUMzREEsR0FBYUEsRUFBWSxpQkFBaUIsUUFBVWo5QixHQUFNLENBQUVBLEVBQUUsZ0JBQWdCLEVBQUdrWixFQUFVLENBQUcsQ0FBQyxFQUNuRyxNQUFNZ2tCLEVBQWEsU0FBUyxlQUFlLGdCQUFnQixFQUN2REEsSUFLRixTQUFTLGVBQWUsZ0JBQWdCLEVBQUUsaUJBQWlCLFFBQVNqbUIsQ0FBVSxFQUM5RWltQixFQUFXLGlCQUFpQixRQUFVbDlCLEdBQU0sQ0FBTUEsRUFBRSxTQUFXazlCLEdBQVlqbUIsRUFBVyxDQUFHLENBQUMsRUFDMUYsU0FBUyxpQkFBaUIsVUFBWWpYLEdBQU0sQ0FDdENBLEVBQUUsTUFBUSxVQUFZazlCLEVBQVcsVUFBVSxTQUFTLE1BQU0sR0FBR2ptQixFQUFXLENBQzlFLENBQUMsR0FFSCxlQUFla21CLEVBQVNDLEVBQU8sQ0FDeEJsQyxJQUFhQSxFQUFZLElBQUksS0FBUUEsRUFBVSxRQUFRLENBQUMsR0FDN0RBLEVBQVksSUFBSSxLQUFLQSxFQUFVLFlBQVksRUFBR0EsRUFBVSxTQUFTLEVBQUlrQyxFQUFPLENBQUMsRUFDN0UsTUFBTWxULEVBQU8sTUFBTWtSLEVBQWMsRUFBSyxFQUFFLE1BQU0sSUFBTXNCLENBQVEsRUFDNURkLEVBQVcxUixHQUFRLENBQUUsT0FBUSxDQUFDLENBQUUsQ0FBQyxDQUNuQyxDQUNBLE1BQU1tVCxFQUFVLFNBQVMsZUFBZSxVQUFVLEVBQzlDQSxHQUFTQSxFQUFRLGlCQUFpQixRQUFTLElBQU0sQ0FBRUYsRUFBUyxFQUFFLENBQUcsQ0FBQyxFQUN0RSxNQUFNRyxFQUFVLFNBQVMsZUFBZSxVQUFVLEVBQzlDQSxHQUFTQSxFQUFRLGlCQUFpQixRQUFTLElBQU0sQ0FBRUgsRUFBUyxDQUFDLENBQUcsQ0FBQyxFQUVyRSxPQUFPLHNCQUF3QlYsRUFFL0IsTUFBTWMsRUFBUSxPQUFPLEdBQU8sS0FBZSxHQUFHLE1BQVEsR0FBRyxLQUFLLFVBQWEsSUFFM0UsWUFBWSxJQUFNLENBQU8sU0FBUyxRQUFRZCxFQUFRLEVBQUksQ0FBRyxFQUFHYyxDQUFJLEVBQ2hFLFNBQVMsaUJBQWlCLG1CQUFvQixJQUFNLENBQU8sU0FBUyxRQUFRZCxFQUFRLEVBQUksQ0FBRyxDQUFDLEVBQzVGLFdBQVdBLEVBQVMsR0FBRyxDQUN6QixHQUFHLEdBT0YsVUFBVyxDQUNWLE1BQU0xM0IsRUFBZSxJQUFJLGFBRXpCLFlBQVksbUJBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQXNEakIsRUFFZixNQUFNaXRCLEVBQUszbEIsR0FBTyxTQUFTLGVBQWVBLENBQUUsRUFDNUMsSUFBSW1PLEVBQU8sS0FFWCxTQUFTdWlCLEVBQVVucEIsRUFBSyxDQUFFb2UsRUFBRSxlQUFlLEVBQUUsWUFBY3BlLENBQUssQ0FFaEUsZUFBZTRwQixHQUFXLENBQ3hCLEdBQUksQ0FDRixNQUFNeHZCLEVBQU8sTUFBTSxZQUFZLGtCQUFrQixFQUNqRCxHQUFJLENBQUNBLEVBQUssR0FBSSxNQUFNLElBQUksTUFBTSxRQUFRQSxFQUFLLE1BQU0sRUFBRSxFQUNuRCxNQUFNa2MsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQzdCd00sRUFBTzBQLEVBQ1A4SCxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBVSxRQUNyQ0EsRUFBRSxxQkFBcUIsRUFBRSxZQUFjOUgsRUFBSyxTQUM1QzhILEVBQUUsY0FBYyxFQUFFLFlBQWMsR0FBRzlILEVBQUssU0FBUyxtQkFBZ0JBLEVBQUssZUFBZSxvQkFBaUJBLEVBQUssYUFBYSxFQUMxSCxPQUFTbHFCLEVBQUcsQ0FDVitFLEVBQWEsSUFBSS9FLEVBQUcsaUJBQWlCLEVBQ3JDKzhCLEVBQVUseUNBQXlDLENBQ3JELENBQ0YsQ0FFQSxlQUFlVSxHQUFrQixDQUMvQixNQUFNL2IsRUFBU3NRLEVBQUUsb0JBQW9CLEVBQ3JDLEdBQUksQ0FFRixNQUFNOUgsRUFBTyxNQURBLE1BQU0sWUFBWSx5QkFBeUIsR0FDaEMsS0FBSyxFQUFFLE1BQU0sS0FBTyxDQUFDLEVBQUUsRUFDekN3VCxFQUFReFQsR0FBUSxNQUFNLFFBQVFBLEVBQUssV0FBVyxFQUFLQSxFQUFLLFlBQWMsQ0FBQyxFQUM3RSxHQUFJLENBQUN3VCxFQUFLLE9BQVEsQ0FDaEJoYyxFQUFPLFVBQVksK0dBQ25CLE1BQ0YsQ0FDQUEsRUFBTyxVQUFZZ2MsRUFBSyxJQUFJLEdBQUs7QUFBQTtBQUFBLGtDQUVMLFdBQVcsRUFBRSxJQUFJLENBQUM7QUFBQSxzREFDRCxFQUFFLFFBQVUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLGVBQVksWUFBWSxFQUFFLFdBQWEsSUFBSSxNQUFNLEVBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVcsbUJBQWtCLFdBQVcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUcsRUFBRSxDQUFDLEVBQUksRUFBRTtBQUFBLG1EQUNuSyxXQUFXLEVBQUUsRUFBRSxDQUFDO0FBQUEsZUFDcEQsRUFBRSxLQUFLLEVBQUUsRUFDbEJoYyxFQUFPLGlCQUFpQixnQkFBZ0IsRUFBRSxRQUFRdGhCLEdBQU9BLEVBQUksaUJBQWlCLFFBQVMsU0FBWSxDQUNqR0EsRUFBSSxTQUFXLEdBQ2YsR0FBSSxDQUNGLE1BQU00TixFQUFPLE1BQU0sWUFBWSxxQkFBcUIsbUJBQW1CNU4sRUFBSSxRQUFRLEVBQUUsQ0FBQyxHQUFJLENBQUUsT0FBUSxRQUFTLENBQUMsRUFDOUcsR0FBSTROLEVBQUssR0FBTSt1QixFQUFVLHFCQUFxQixFQUFHVSxFQUFnQixNQUM1RCxDQUFFLE1BQU12M0IsRUFBSSxNQUFNOEgsRUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFPLENBQUMsRUFBRSxFQUFHK3VCLEVBQVU3MkIsRUFBRSxPQUFTLGdCQUFnQixFQUFHOUYsRUFBSSxTQUFXLEVBQU8sQ0FDdEgsT0FBU0osRUFBRyxDQUFFKzhCLEVBQVUsa0JBQW9CLzhCLEVBQUUsT0FBTyxFQUFHSSxFQUFJLFNBQVcsRUFBTyxDQUNoRixDQUFDLENBQUMsQ0FDSixNQUFZLENBQ1ZzaEIsRUFBTyxVQUFZLHFGQUNyQixDQUNGLENBRUEsZUFBZWljLEVBQWlCQyxFQUFRLENBQ3RDYixFQUFVLFlBQVlhLENBQU0sbUJBQWMsRUFDMUMsR0FBSSxDQUNGLE1BQU01dkIsRUFBTyxNQUFNLFlBQVkscUJBQXNCLENBQ25ELE9BQVEsT0FDUixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsT0FBQTR2QixDQUFPLENBQUMsQ0FDakMsQ0FBQyxFQUNLMVQsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFPLENBQUMsRUFBRSxFQUMvQyxHQUFJLENBQUNBLEVBQUssSUFBTSxDQUFDa2MsRUFBSyxJQUFLLENBQ3pCNlMsRUFBVTdTLEVBQUssT0FBUyxnQkFBZ0JsYyxFQUFLLE1BQU0sR0FBRyxFQUN0RCxNQUNGLENBQ0Fna0IsRUFBRSxZQUFZLEVBQUUsWUFBYzlILEVBQUssSUFHbkMsTUFBTTJULEVBQVUzVCxFQUFLLFdBQWEsS0FBSyxVQUFVQSxFQUFLLFdBQVksS0FBTSxDQUFDLEVBQUksR0FDN0U4SCxFQUFFLGdCQUFnQixFQUFFLFlBQWM2TCxHQUFXLG1CQUM3QzdMLEVBQUUsb0JBQW9CLEVBQUUsWUFBYzlILEVBQUssTUFBUSxHQUNuRDhILEVBQUUscUJBQXFCLEVBQUUsWUFDdkI0TCxJQUFXLFVBQVksbUNBQXFDLGdDQUM5RDVMLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxRQUFVLE9BQ3RDQSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sUUFBVSxRQUN4QytLLEVBQVUsRUFBRSxFQUNaVSxFQUFnQixDQUNsQixPQUFTejlCLEVBQUcsQ0FDVitFLEVBQWEsSUFBSS9FLEVBQUcsbUJBQW1CLEVBQ3ZDKzhCLEVBQVUsV0FBYS84QixFQUFFLE9BQU8sQ0FDbEMsQ0FDRixDQUVBLFNBQVM4OUIsRUFBU3J0QixFQUFNc3RCLEVBQU8sQ0FDekIsVUFBVSxXQUFhLFVBQVUsVUFBVSxVQUM3QyxVQUFVLFVBQVUsVUFBVXR0QixDQUFJLEVBQUUsS0FBSyxJQUFNc3NCLEVBQVVnQixDQUFLLENBQUMsRUFBRSxNQUFNLElBQU1oQixFQUFVLHFDQUFnQyxDQUFDLEVBRXhIQSxFQUFVLCtDQUEwQyxDQUV4RCxDQUdBL0ssRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsUUFBUyxJQUFNLENBQ2xEQSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBVSxPQUN0Q0EsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFFBQVUsUUFDdENBLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFVLE9BQ3hDK0ssRUFBVSxFQUFFLEVBQ1pTLEVBQVMsRUFDVEMsRUFBZ0IsQ0FDbEIsQ0FBQyxFQUNEekwsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLFFBQVMsSUFBTSxDQUFFQSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBVSxNQUFRLENBQUMsRUFDbkdBLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixRQUFTLElBQU0sQ0FDL0NBLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFVLE9BQ3hDQSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBVSxPQUN4QyxDQUFDLEVBQ0QsU0FBUyxpQkFBaUIsb0JBQW9CLEVBQUUsUUFBUTV4QixHQUN0REEsRUFBSSxpQkFBaUIsUUFBUyxJQUFNdTlCLEVBQWlCdjlCLEVBQUksUUFBUSxNQUFNLENBQUMsQ0FBQyxFQUMzRTR4QixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixRQUFTLElBQU04TCxFQUFTOUwsRUFBRSxZQUFZLEVBQUUsWUFBYSw4Q0FBeUMsQ0FBQyxFQUNySUEsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsUUFBUyxJQUFNOEwsRUFBUzlMLEVBQUUsZ0JBQWdCLEVBQUUsWUFBYSxnQkFBZ0IsQ0FBQyxFQUNwSEEsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsUUFBUyxJQUFNOEwsRUFBU3RqQixFQUFPQSxFQUFLLFNBQVd3WCxFQUFFLHFCQUFxQixFQUFFLFlBQWEsa0JBQWtCLENBQUMsQ0FDckosR0FBRyxHQUdGLFVBQVcsQ0FFVixlQUFlZ00sR0FBb0IsQ0FDakMsR0FBSSxDQUVGLE1BQU0vOUIsRUFBTyxNQURELE1BQU0sTUFBTSw4QkFBOEIsR0FDL0IsS0FBSyxFQUM1QixHQUFJLENBQUNBLEVBQUssU0FBVyxDQUFDQSxFQUFLLE9BQVEsT0FFbkMsU0FBVyxDQUFDZytCLEVBQVcxakIsQ0FBRyxJQUFLLE9BQU8sUUFBUXRhLEVBQUssTUFBTSxFQUFHLENBQzFELE1BQU1pK0IsRUFBVyxTQUFTLGVBQWUsVUFBWUQsQ0FBUyxFQUN4REUsRUFBUSxTQUFTLGVBQWUsY0FBZ0JGLENBQVMsRUFDL0QsR0FBSSxDQUFDQyxFQUFVLFNBRWYsTUFBTUUsRUFBVzdqQixFQUFJLFNBQVMsS0FBSyxFQUNuQyxHQUE4QjZqQixHQUFhLEtBQU0sQ0FDL0MsTUFBTS9WLEVBQU0rVixFQUFTLFFBQVEsQ0FBQyxFQUM5QkYsRUFBUyxZQUFjLEdBQUc3VixDQUFHLFdBRTdCNlYsRUFBUyxVQUFZLGNBQ2pCRSxHQUFZLEtBQU1GLEVBQVMsVUFBVSxJQUFJLFdBQVcsRUFDL0NFLEdBQVksR0FBSUYsRUFBUyxVQUFVLElBQUksTUFBTSxFQUM3Q0UsR0FBWSxHQUFJRixFQUFTLFVBQVUsSUFBSSxVQUFVLEVBQ3JEQSxFQUFTLFVBQVUsSUFBSSxNQUFNLEVBRTlCQyxJQUFPQSxFQUFNLE1BQU0sTUFBUTlWLEVBQU0sSUFDdkMsQ0FDRixDQUNGLE1BQVksQ0FFVixRQUFRLEtBQUssNENBQTRDLENBQzNELENBQ0YsQ0FHQSxJQUFJZ1csRUFDSixHQUFJLENBQ0ZBLEVBQW1CLElBQUksSUFBSSxLQUFLLE1BQU0sZUFBZSxtQkFBbUIsR0FBSyxJQUFJLENBQUMsQ0FDcEYsTUFBWSxDQUVWQSxFQUFtQixJQUFJLEdBQ3pCLENBR0EsSUFBSUMsRUFBZSxDQUFDLEVBR3BCLGVBQWVDLEVBQW1CQyxFQUFXLENBQzNDLEdBQUksQ0FFRixNQUFNditCLEVBQU8sTUFERCxNQUFNLE1BQU0sMkJBQTJCLEdBQzVCLEtBQUssRUFDNUIsR0FBSSxDQUFDQSxFQUFLLFFBQVMsT0FHbkIsU0FBUyxpQkFBaUIseUJBQXlCLEVBQUUsUUFBUWdILEdBQU1BLEVBQUcsVUFBVSxPQUFPLFNBQVMsQ0FBQyxFQUVqRyxNQUFNbVosRUFBVW5nQixFQUFLLFNBQVcsQ0FBQyxFQUlqQyxHQUhBcStCLEVBQWVsZSxFQUdYb2UsR0FBYXBlLEVBQVEsT0FBUyxFQUFHLENBQ25DLE1BQU1xZSxFQUFPLE9BQU8sdUJBQXlCLEVBQ3pDQSxFQUFPLEdBQUtyZSxFQUFRLE9BQVNxZSxHQUMvQixpQkFBaUIsR0FBR3JlLEVBQVEsTUFBTSwyRUFBdUUsTUFBTSxFQUVqSCxPQUFPLHNCQUF3QkEsRUFBUSxNQUN6QyxDQUVBLEdBQUksQ0FBQ0EsRUFBUSxPQUFRLE9BRXJCLFVBQVdzZSxLQUFPdGUsRUFBUyxDQUV6QixNQUFNcGEsRUFBTyxPQUFPLE1BQVEsQ0FBQyxFQUM3QixVQUFXSyxLQUFPTCxFQUNoQixHQUFJSyxFQUFJLGNBQWdCcTRCLEVBQUksYUFBZXI0QixFQUFJLEtBQU9xNEIsRUFBSSxlQUFpQnI0QixFQUFJLE9BQVNxNEIsRUFBSSxjQUFlLENBRXpHLEdBQUlMLEVBQWlCLElBQUloNEIsRUFBSSxFQUFFLEVBQUcsTUFDbEMsTUFBTWEsRUFBUSxTQUFTLGVBQWUsZ0JBQWtCYixFQUFJLEVBQUUsRUFDeERzNEIsRUFBWSxTQUFTLGVBQWUsY0FBZ0J0NEIsRUFBSSxFQUFFLEVBQzVEYSxJQUNGQSxFQUFNLFVBQVUsSUFBSSxTQUFTLEVBQzdCQSxFQUFNLE1BQVEsMkRBQ2RBLEVBQU0sTUFBTSxPQUFTLFVBQ3JCQSxFQUFNLFFBQVdsSCxHQUFNLENBQ3JCQSxFQUFFLGdCQUFnQixFQUVkLE9BQU8saUJBQWlCLE9BQU8sZ0JBQWdCcUcsRUFBSSxFQUFFLENBQzNELEdBR0VzNEIsSUFDRkEsRUFBVSxNQUFNLFdBQWEsVUFDN0JBLEVBQVUsTUFBTSxZQUFjLFVBQzlCQSxFQUFVLE1BQU0sVUFBWSxvQkFDNUJBLEVBQVUsTUFBUSw0REFFcEIsS0FDRixDQUVKLENBQ0YsTUFBWSxDQUVWLFFBQVEsS0FBSyx1Q0FBdUMsQ0FDdEQsQ0FDRixDQUdBLFNBQVNDLEdBQTJCLENBRWxDLFdBQVcsSUFBTSxDQUNmWixFQUFrQixFQUNsQk8sRUFBbUIsQ0FDckIsRUFBRyxHQUFJLEVBR1AsWUFBWSxJQUFNLENBQ2hCUCxFQUFrQixFQUNsQk8sRUFBbUIsRUFBSSxDQUN6QixFQUFHLEdBQUssQ0FDVixDQUdBLE1BQU1NLEVBQWlCLE9BQU8sV0FDMUJBLElBQ0YsT0FBTyxXQUFhLGdCQUFpQixDQUNuQyxHQUFJLENBQ0YsTUFBTUEsRUFBZSxFQUVyQixXQUFXYixFQUFtQixHQUFJLENBQ3BDLE9BQVNoK0IsRUFBRyxDQUNWLFFBQVEsS0FBSywwQ0FBMkNBLEVBQUUsT0FBTyxDQUNuRSxDQUNGLEdBR0Y0K0IsRUFBeUIsQ0FDM0IsR0FBRyxHQUdGLFVBQVksQ0FDWCxJQUFJRSxFQUFxQixLQUNyQkMsRUFBYyxLQUNkQyxFQUFvQixDQUFDLEVBR3JCQyxFQUFlLENBQ2pCLEtBQU0sT0FDTixNQUFPLFFBQ1AsS0FBTSxPQUNOLE1BQU8sUUFDUCxLQUFNLE9BQ04sUUFBUyxVQUNULGlCQUFrQixpQkFDbEIsa0JBQW1CLGtCQUNuQixLQUFNLE9BQ04sTUFBTyxPQUNULEVBR0lDLEVBQVMsQ0FDWCxDQUFDLEtBQWlCLGFBQWlCLE1BQU0sRUFDekMsQ0FBQyxZQUFpQixPQUFpQixNQUFNLEVBQ3pDLENBQUMsS0FBaUIsT0FBaUIsTUFBTSxFQUN6QyxDQUFDLFFBQWlCLGFBQWlCLE1BQU0sRUFDekMsQ0FBQyxTQUFpQixTQUFpQixNQUFNLEVBQ3pDLENBQUMsU0FBaUIsU0FBaUIsUUFBUSxFQUMzQyxDQUFDLGdCQUFpQixnQkFBaUIsUUFBUSxFQUMzQyxDQUFDLFFBQWlCLGdCQUFpQixRQUFRLEVBQzNDLENBQUMsUUFBaUIsVUFBaUIsUUFBUSxFQUMzQyxDQUFDLFNBQWlCLFdBQWlCLFFBQVEsRUFDM0MsQ0FBQyxTQUFpQixhQUFpQixRQUFRLEVBQzNDLENBQUMsU0FBaUIsU0FBaUIsUUFBUSxFQUMzQyxDQUFDLFVBQWlCLFlBQWlCLFFBQVEsRUFDM0MsQ0FBQyxTQUFpQixhQUFpQixRQUFRLEVBQzNDLENBQUMsUUFBaUIsUUFBaUIsVUFBVSxFQUM3QyxDQUFDLGFBQWlCLGFBQWlCLFVBQVUsRUFDN0MsQ0FBQyxPQUFpQixjQUFpQixVQUFVLEVBQzdDLENBQUMsV0FBaUIsV0FBaUIsVUFBVSxFQUM3QyxDQUFDLFVBQWlCLFVBQWlCLFVBQVUsRUFDN0MsQ0FBQyxRQUFpQixRQUFpQixVQUFVLEVBQzdDLENBQUMsVUFBaUIsVUFBaUIsVUFBVSxDQUMvQyxFQUlJQyxFQUFXLFNBQVMsZUFBZSxPQUFPLEVBQzlDLEdBQUksQ0FBQ0EsRUFBVSxPQUNmLElBQUlDLEVBQWEsU0FBUyxlQUFlLGFBQWEsRUFFdEQsU0FBU0MsRUFBWXYrQixFQUFHLENBQ3RCLEdBQUltK0IsRUFBYW4rQixDQUFDLEVBQUcsT0FBT20rQixFQUFhbitCLENBQUMsRUFDMUMsSUFBSXcrQixFQUFhLFlBQVksT0FBTyxnQkFBaUIsQ0FBQyxDQUFDLEVBQ3ZELE9BQUlBLEVBQVd4K0IsQ0FBQyxHQUFVdytCLEVBQVd4K0IsQ0FBQyxFQUFFLE1BQVFBLENBRWxELENBRUEsU0FBU3krQixHQUFjLENBQ2pCSCxJQUFZQSxFQUFXLFlBQWNDLEVBQVksT0FBTyxlQUFlLENBQUMsRUFDOUUsQ0FFQUYsRUFBUyxpQkFBaUIsUUFBUyxVQUFZLENBQzdDLElBQUl0d0IsRUFBTyxPQUFPLE9BQU8sTUFBTSxFQUMzQjJpQixFQUFVLE9BQU8sZUFBZSxFQUNoQ25vQixFQUFNd0YsRUFBSyxRQUFRMmlCLENBQU8sRUFDMUJrSyxFQUFPN3NCLEdBQU14RixFQUFNLEdBQUt3RixFQUFLLE1BQU0sRUFDdkMsT0FBTyxXQUFXNnNCLENBQUksRUFDdEI2RCxFQUFZLENBQ2QsQ0FBQyxFQUVEQSxFQUFZLEVBSVosU0FBU0MsR0FBa0IsQ0FDekIsSUFBSXRSLEVBQVcsQ0FBRSxLQUFNLGNBQWUsT0FBUSxTQUFVLE9BQVEsU0FBVSxTQUFVLHlCQUEwQixFQUMxR3VSLEVBQVUsQ0FBQyxFQUNmUCxFQUFPLFFBQVEsU0FBVXZlLEVBQUcsQ0FDckI4ZSxFQUFROWUsRUFBRSxDQUFDLENBQUMsSUFBRzhlLEVBQVE5ZSxFQUFFLENBQUMsQ0FBQyxFQUFJLENBQUMsR0FDckM4ZSxFQUFROWUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLQSxDQUFDLENBQ3RCLENBQUMsRUFFRCxJQUFJaGUsRUFBTyxHQUNYLGNBQU8sS0FBS3VyQixDQUFRLEVBQUUsUUFBUSxTQUFVcG5CLEVBQUssQ0FDdkNBLElBQVEsWUFDVm5FLEdBQVEsbU5BQ1JBLEdBQVEseUZBRVJBLEdBQVEsc0NBRVZBLEdBQVEsNENBQThDdXJCLEVBQVNwbkIsQ0FBRyxFQUFJLFVBQ3JFMjRCLEVBQVEzNEIsQ0FBRyxHQUFLLENBQUMsR0FBRyxRQUFRLFNBQVU2WixFQUFHLENBQ3hDaGUsR0FBUSxvRUFDaUNnZSxFQUFFLENBQUMsRUFBSSxxRUFDa0JBLEVBQUUsQ0FBQyxFQUFJLEtBQU83WixJQUFRLFdBQWEscUJBQXVCLElBQU0sZ0VBQ2pGNlosRUFBRSxDQUFDLEVBQUksd0JBRTFELENBQUMsRUFDRGhlLEdBQVEsUUFDVixDQUFDLEVBQ01BLENBQ1QsQ0FFQSxTQUFTKzhCLEdBQXdCLENBQy9CLE9BQU8sT0FBTyxPQUFPLElBQUksU0FBVTUrQixFQUFHLENBQ3BDLE1BQU8sa0JBQW9CQSxFQUFJLEtBQU91K0IsRUFBWXYrQixDQUFDLEVBQUksV0FDekQsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUNaLENBRUEsSUFBSTYrQixFQUFZLDh1REE0QmRELEVBQXNCLEVBQ3RCLCtvQkFtQkFGLEVBQWdCLEVBRWhCLGlYQVFGLFlBQVksc0JBQXVCRyxDQUFTLEVBRTVDLElBQUl4NkIsRUFBUSxTQUFTLGVBQWUscUJBQXFCLEVBQ3JEeTZCLEVBQWMsU0FBUyxlQUFlLHFCQUFxQixFQUMzRGhTLEVBQVksU0FBUyxlQUFlLG9CQUFvQixFQUN4RGlTLEVBQWEsU0FBUyxlQUFlLDJCQUEyQixFQUNoRUMsRUFBa0IsU0FBUyxlQUFlLHdCQUF3QixFQUNsRUMsRUFBZSxTQUFTLGVBQWUsdUJBQXVCLEVBQzlEQyxFQUFVNzZCLEVBQU0saUJBQWlCLHNCQUFzQixFQUN2RDg2QixFQUFrQixTQUFTLGVBQWUsd0JBQXdCLEVBQ2xFQyxFQUFpQixTQUFTLGVBQWUsK0JBQStCLEVBQ3hFL2hCLEVBQVksU0FBUyxlQUFlLHNCQUFzQixFQUkxRGdpQixFQUFrQixHQUN0QkQsRUFBZSxpQkFBaUIsUUFBUyxVQUFZLENBQ25EQyxFQUFrQixDQUFDQSxFQUNuQkYsRUFBZ0IsTUFBTSxRQUFVRSxFQUFrQixHQUFLLE9BQ3ZERCxFQUFlLFVBQVlDLEVBQ3ZCLCtCQUNBLDhCQUNOLENBQUMsRUFJRCxTQUFTQyxHQUFtQixDQUMxQixJQUFJL2xCLEVBQVMsQ0FBQyxFQUNkLE9BQUEybEIsRUFBUSxRQUFRLFNBQVU1MkIsRUFBRyxDQUMzQmlSLEVBQU9qUixFQUFFLFFBQVEsSUFBSSxFQUFJQSxFQUFFLEtBQzdCLENBQUMsRUFDRGlSLEVBQU8sU0FBUyxFQUFJQSxFQUFPLFdBQVcsRUFDL0JBLENBQ1QsQ0FFQSxTQUFTZ21CLEdBQWdCLENBQ3ZCLElBQUlobUIsRUFBUyxDQUFDLEVBQ2QsT0FBQTJsQixFQUFRLFFBQVEsU0FBVTUyQixFQUFHLENBQ3RCQSxFQUFFLFFBQVEsV0FBVWlSLEVBQU9qUixFQUFFLFFBQVEsSUFBSSxFQUFJQSxFQUFFLE1BQ3RELENBQUMsRUFDRGlSLEVBQU8sU0FBUyxFQUFJQSxFQUFPLFdBQVcsRUFDbEMwbEIsRUFBYSxVQUFTMWxCLEVBQU8sUUFBVSxJQUNwQ0EsQ0FDVCxDQUVBLFNBQVNpbUIsR0FBNEIsQ0FDbkMsSUFBSTNGLEVBQU8wRixFQUFjLEVBQ3JCRSxFQUFVLE9BQU8scUJBQXVCLE9BQU8scUJBQXFCNUYsQ0FBSSxFQUFJLENBQUMsRUFDakZxRixFQUFRLFFBQVEsU0FBVTUyQixFQUFHLENBQzNCLEdBQUlBLEVBQUUsUUFBUSxVQUFZLENBQUM0MUIsRUFBa0I1MUIsRUFBRSxRQUFRLElBQUksRUFBRyxDQUM1RCxJQUFJdVUsRUFBTTRpQixFQUFRbjNCLEVBQUUsUUFBUSxJQUFJLEdBQUssVUFDckNBLEVBQUUsTUFBUXVVLEVBQ1YsSUFBSTZpQixFQUFNcjdCLEVBQU0sY0FBYyxjQUFnQmlFLEVBQUUsUUFBUSxLQUFPLElBQUksRUFDL0RvM0IsSUFBS0EsRUFBSSxZQUFjN2lCLEVBQUksWUFBWSxFQUM3QyxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVM4aUIsRUFBcUJDLEVBQVcsQ0FDdkMsSUFBSXJtQixFQUFTLE9BQU8sYUFBYXFtQixDQUFTLEVBQ3JDcm1CLElBQ0wya0IsRUFBb0IsQ0FBQyxFQUNyQmdCLEVBQVEsUUFBUSxTQUFVNTJCLEVBQUcsQ0FDM0IsSUFBSXVVLEVBQU10RCxFQUFPalIsRUFBRSxRQUFRLElBQUksR0FBSyxXQUNoQ3VVLEVBQUksV0FBVyxNQUFNLEdBQUtBLEVBQUksV0FBVyxXQUFXLEtBQUdBLEVBQU0sV0FDakV2VSxFQUFFLE1BQVF1VSxFQUNWLElBQUk2aUIsRUFBTXI3QixFQUFNLGNBQWMsY0FBZ0JpRSxFQUFFLFFBQVEsS0FBTyxJQUFJLEVBQy9EbzNCLElBQUtBLEVBQUksWUFBYzdpQixFQUFJLFlBQVksRUFDN0MsQ0FBQyxFQUNEb2lCLEVBQWEsUUFBVSxDQUFDLENBQUMxbEIsRUFBTyxRQUNoQ3NtQixFQUFjLEVBQ2hCLENBRUEsU0FBU0MsRUFBeUIxaUIsRUFBTSxDQUN0QyxJQUFJb2hCLEVBQWEsWUFBWSxPQUFPLGdCQUFpQixDQUFDLENBQUMsRUFDbkR1QixFQUFRdkIsRUFBV3BoQixDQUFJLEVBQ3RCMmlCLElBQ0w3QixFQUFvQixDQUFDLEVBQ3JCZ0IsRUFBUSxRQUFRLFNBQVU1MkIsRUFBRyxDQUMzQixJQUFJdVUsRUFBTWtqQixFQUFNejNCLEVBQUUsUUFBUSxJQUFJLEdBQUssVUFDbkNBLEVBQUUsTUFBUXVVLEVBQ1YsSUFBSTZpQixFQUFNcjdCLEVBQU0sY0FBYyxjQUFnQmlFLEVBQUUsUUFBUSxLQUFPLElBQUksRUFDL0RvM0IsSUFBS0EsRUFBSSxZQUFjN2lCLEVBQUksWUFBWSxHQUV2Q3ZVLEVBQUUsUUFBUSxVQUFZeTNCLEVBQU16M0IsRUFBRSxRQUFRLElBQUksSUFDNUM0MUIsRUFBa0I1MUIsRUFBRSxRQUFRLElBQUksRUFBSSxHQUV4QyxDQUFDLEVBQ0R3a0IsRUFBVSxNQUFRaVQsRUFBTSxNQUFRLEdBQ2hDZCxFQUFhLFFBQVUsQ0FBQyxDQUFDYyxFQUFNLFFBRS9CUCxFQUEwQixFQUMxQkssRUFBYyxFQUNoQixDQUVBLFNBQVNBLEdBQWdCLENBQ3ZCLElBQUloeEIsRUFBSXl3QixFQUFpQixFQUNyQi9nQixFQUFVLFNBQVMsZUFBZSx1QkFBdUIsRUFDekR4TyxFQUFPLFNBQVMsZUFBZSxvQkFBb0IsRUFDbkR2USxFQUFRdVEsRUFBSyxjQUFjLGdCQUFnQixFQUMzQ2l3QixFQUFRandCLEVBQUssY0FBYyxnQkFBZ0IsRUFDM0Nrd0IsRUFBVSxTQUFTLGVBQWUsa0JBQWtCLEVBQ3BEQyxFQUFXLFNBQVMsZUFBZSxtQkFBbUIsRUFDdERDLEVBQVEsU0FBUyxlQUFlLGdCQUFnQixFQUNoREMsRUFBUyxTQUFTLGVBQWUsaUJBQWlCLEVBQ2xEOWdDLEVBQU0sU0FBUyxlQUFlLG9CQUFvQixFQUNsRDg3QixFQUFPcnJCLEVBQUssY0FBYyxlQUFlLEVBRTdDd08sRUFBUSxNQUFNLFdBQWExUCxFQUFFLEdBQzdCa0IsRUFBSyxNQUFNLFdBQWFsQixFQUFFLFdBQVcsRUFDckNrQixFQUFLLE1BQU0sWUFBY2xCLEVBQUUsT0FDM0JyUCxFQUFNLE1BQU0sTUFBUXFQLEVBQUUsR0FDdEJteEIsRUFBTSxNQUFNLE1BQVFueEIsRUFBRSxNQUN0Qm94QixFQUFRLE1BQU0sV0FBYXB4QixFQUFFLE9BQU8sRUFDcENveEIsRUFBUSxNQUFNLE1BQVFweEIsRUFBRSxPQUFPLEVBQy9CcXhCLEVBQVMsTUFBTSxXQUFhcnhCLEVBQUUsUUFBUSxFQUN0Q3F4QixFQUFTLE1BQU0sTUFBUXJ4QixFQUFFLFFBQVEsRUFDakNzeEIsRUFBTSxNQUFNLFdBQWF0eEIsRUFBRSxRQUFRLEVBQ25DdXhCLEVBQU8sTUFBTSxXQUFhdnhCLEVBQUUsU0FBUyxFQUNyQ3VzQixFQUFLLE1BQU0sTUFBUXZzQixFQUFFLEdBQ3JCdlAsRUFBSSxNQUFNLFdBQWF1UCxFQUFFLE9BQ3pCdlAsRUFBSSxNQUFNLE1BQVF1UCxFQUFFLEVBQ3RCLENBRUEsU0FBU3d4QixFQUFnQjltQixFQUFRLENBRS9CLElBQUlrbUIsRUFBVSxPQUFPLHFCQUF1QixPQUFPLHFCQUFxQmxtQixDQUFNLEVBQUksQ0FBQyxFQUNuRixPQUFPLFlBQVksUUFBUSxTQUFVK21CLEVBQU0sQ0FDekMsSUFBSXpqQixFQUFNdEQsRUFBTyttQixDQUFJLEdBQUtiLEVBQVFhLENBQUksRUFDbEN6akIsR0FDRixTQUFTLGdCQUFnQixNQUFNLFlBQVksS0FBT3lqQixFQUFNempCLENBQUcsQ0FFL0QsQ0FBQyxDQUNILENBR0FxaUIsRUFBUSxRQUFRLFNBQVU1MkIsRUFBRyxDQUMzQkEsRUFBRSxpQkFBaUIsUUFBUyxVQUFZLENBQ3RDLElBQUlvM0IsRUFBTXI3QixFQUFNLGNBQWMsY0FBZ0JpRSxFQUFFLFFBQVEsS0FBTyxJQUFJLEVBQy9EbzNCLElBQUtBLEVBQUksWUFBY3AzQixFQUFFLE1BQU0sWUFBWSxHQUczQ0EsRUFBRSxRQUFRLFNBQ1o0MUIsRUFBa0I1MUIsRUFBRSxRQUFRLElBQUksRUFBSSxHQUdwQ2szQixFQUEwQixFQUc1QkssRUFBYyxFQUNkUSxFQUFnQmYsRUFBaUIsQ0FBQyxDQUNwQyxDQUFDLENBQ0gsQ0FBQyxFQUdETCxFQUFhLGlCQUFpQixTQUFVLFVBQVksQ0FDbERPLEVBQTBCLEVBQzFCSyxFQUFjLEVBQ2RRLEVBQWdCZixFQUFpQixDQUFDLENBQ3BDLENBQUMsRUFFRFIsRUFBWSxpQkFBaUIsU0FBVSxVQUFZLENBQ2pEWixFQUFvQixDQUFDLEVBQ3JCeUIsRUFBcUJiLEVBQVksS0FBSyxFQUN0Q3VCLEVBQWdCZixFQUFpQixDQUFDLENBQ3BDLENBQUMsRUFHRCxTQUFTaUIsR0FBc0IsQ0FDN0IsSUFBSS9CLEVBQWEsWUFBWSxPQUFPLGdCQUFpQixDQUFDLENBQUMsRUFDbkRnQyxFQUFRLE9BQU8sS0FBS2hDLENBQVUsRUFDbENPLEVBQVcsVUFBWSxvREFDdkJ5QixFQUFNLFFBQVEsU0FBVXBqQixFQUFNLENBQzVCLElBQUlsYyxFQUFNLFNBQVMsY0FBYyxRQUFRLEVBQ3pDQSxFQUFJLE1BQVFrYyxFQUNabGMsRUFBSSxZQUFjczlCLEVBQVdwaEIsQ0FBSSxFQUFFLE1BQVFBLEVBQzNDMmhCLEVBQVcsWUFBWTc5QixDQUFHLENBQzVCLENBQUMsRUFDRDg5QixFQUFnQixNQUFNLFFBQVV3QixFQUFNLE9BQVMsR0FBSyxNQUN0RCxDQUdBLFNBQVNDLEdBQW1CLENBQzFCM0IsRUFBWSxVQUFZRixFQUFzQixDQUNoRCxDQUdBRyxFQUFXLGlCQUFpQixTQUFVLFVBQVksQ0FDaEQsSUFBSTNoQixFQUFPLEtBQUssTUFDWkEsR0FDRjZnQixFQUFjN2dCLEVBQ2QwaUIsRUFBeUIxaUIsQ0FBSSxFQUM3QmlqQixFQUFnQmYsRUFBaUIsQ0FBQyxJQUVsQ3JCLEVBQWMsS0FDZEMsRUFBb0IsQ0FBQyxFQUNyQnBSLEVBQVUsTUFBUSxHQUNsQmdTLEVBQVksTUFBUSxPQUFPLGVBQWUsRUFDMUNhLEVBQXFCYixFQUFZLEtBQUssR0FFeEN6aEIsRUFBVSxNQUFNLFFBQVU0Z0IsRUFBYyxHQUFLLE1BQy9DLENBQUMsRUFFRCxTQUFTeUMsR0FBYyxDQUNyQjFDLEVBQXFCLE9BQU8sZUFBZSxFQUMzQ0MsRUFBYyxLQUNkQyxFQUFvQixDQUFDLEVBR3JCbUIsRUFBa0IsR0FDbEJGLEVBQWdCLE1BQU0sUUFBVSxPQUNoQ0MsRUFBZSxVQUFZLCtCQUUzQm1CLEVBQW9CLEVBQ3BCRSxFQUFpQixFQUVqQixJQUFJakMsRUFBYSxZQUFZLE9BQU8sZ0JBQWlCLENBQUMsQ0FBQyxFQUNuREEsRUFBV1IsQ0FBa0IsR0FFL0JlLEVBQVcsTUFBUWYsRUFDbkJDLEVBQWNELEVBQ2Q4QixFQUF5QjlCLENBQWtCLElBRTNDZSxFQUFXLE1BQVEsR0FDbkJqUyxFQUFVLE1BQVEsR0FDbEJnUyxFQUFZLE1BQVFkLEVBQ3BCMkIsRUFBcUIzQixDQUFrQixHQUd6QzNnQixFQUFVLE1BQU0sUUFBVTRnQixFQUFjLEdBQUssT0FDN0M1NUIsRUFBTSxVQUFVLElBQUksTUFBTSxDQUM1QixDQUVBLElBQUlzOEIsRUFBZSxTQUFTLGVBQWUscUJBQXFCLEVBQzVEQSxHQUNGQSxFQUFhLGlCQUFpQixRQUFTLFVBQVksQ0FBRUQsRUFBWSxDQUFHLENBQUMsRUFLdkUsU0FBUyxlQUFlLG9CQUFvQixFQUFFLGlCQUFpQixRQUFTLFVBQVksQ0FDbEYsSUFBSW5uQixFQUFTK2xCLEVBQWlCLEVBQzFCcG5CLEVBQU80VSxFQUFVLE1BQU0sS0FBSyxFQUNoQyxHQUFJLENBQUM1VSxFQUFNLENBQ1QsaUJBQWlCLDRCQUE2QixVQUFXLEdBQUksRUFDN0Q0VSxFQUFVLE1BQU0sRUFDaEIsTUFDRixDQUVBLElBQUkwUixFQUFhLFlBQVksT0FBTyxnQkFBaUIsQ0FBQyxDQUFDLEVBQ25EcGhCLEVBQ0F3akIsRUFBVSxLQUVkLEdBQUkzQyxFQUFhLENBQ2Y3Z0IsRUFBTzZnQixFQUVQLElBQUk0QyxFQUFVLE9BQU8saUJBQWlCM29CLEVBQU0rbEIsQ0FBVyxFQUN2RCxHQUFJNEMsSUFBWTVDLEVBQWEsQ0FDM0IyQyxFQUFVM0MsRUFDVixPQUFPTyxFQUFXUCxDQUFXLEVBQzdCLElBQUkxMUIsRUFBTSxPQUFPLE9BQU8sUUFBUTAxQixDQUFXLEVBQ3ZDMTFCLElBQVEsSUFBSSxPQUFPLE9BQU8sT0FBT0EsRUFBSyxDQUFDLEVBQzNDLE9BQU8sT0FBTyxhQUFhMDFCLENBQVcsRUFDdEM3Z0IsRUFBT3lqQixDQUNULENBQ0YsTUFDRXpqQixFQUFPLE9BQU8saUJBQWlCbEYsQ0FBSSxFQUlyQyxJQUFJNG9CLEVBQVksQ0FBRSxLQUFNNW9CLENBQUssRUFDekIrbUIsRUFBYSxVQUFTNkIsRUFBVSxRQUFVLElBQzlDLE9BQU8sWUFBWSxRQUFRLFNBQVV4NEIsRUFBRyxDQUNsQ2lSLEVBQU9qUixDQUFDLElBQUd3NEIsRUFBVXg0QixDQUFDLEVBQUlpUixFQUFPalIsQ0FBQyxFQUN4QyxDQUFDLEVBR0RrMkIsRUFBV3BoQixDQUFJLEVBQUkwakIsRUFDbkIsUUFBUSxPQUFPLGdCQUFpQixLQUFLLFVBQVV0QyxDQUFVLENBQUMsRUFHMUQsT0FBTyxzQkFBc0IsRUFHN0IsT0FBTyxzQkFBc0IsRUFDN0IsT0FBTyxXQUFXcGhCLENBQUksRUFDdEIvWSxFQUFNLFVBQVUsT0FBTyxNQUFNLEVBQzdCbzZCLEVBQVksRUFHWixJQUFJc0MsRUFBWSxDQUFDLEVBQ2pCLE9BQU8sWUFBWSxRQUFRLFNBQVV6NEIsRUFBRyxDQUFNaVIsRUFBT2pSLENBQUMsSUFBR3k0QixFQUFVejRCLENBQUMsRUFBSWlSLEVBQU9qUixDQUFDLEVBQUcsQ0FBQyxFQUdoRnM0QixHQUNGLFlBQVksa0JBQW9CQSxFQUFTLENBQUUsT0FBUSxRQUFTLENBQUMsRUFBRSxNQUFNLFVBQVksQ0FBQyxDQUFDLEVBR3JGLFlBQVksa0JBQW9CeGpCLEVBQU0sQ0FDcEMsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxLQUFNbEYsRUFBTSxPQUFRNm9CLEVBQVcsUUFBUzlCLEVBQWEsT0FBUSxDQUFDLENBQ3ZGLENBQUMsRUFBRSxLQUFLLFVBQVksQ0FDbEIsaUJBQWlCL21CLEVBQU8sZUFBZ0IsVUFBVyxHQUFJLENBQ3pELENBQUMsRUFBRSxNQUFNLFVBQVksQ0FDbkIsaUJBQWlCQSxFQUFPLDRDQUE2QyxVQUFXLEdBQUksQ0FDdEYsQ0FBQyxDQUNILENBQUMsRUFJRCxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsaUJBQWlCLFFBQVMsVUFBWSxDQUNwRjdULEVBQU0sVUFBVSxPQUFPLE1BQU0sRUFDN0IsT0FBTyxzQkFBc0IsRUFDekIyNUIsR0FDRixPQUFPLFdBQVdBLENBQWtCLENBRXhDLENBQUMsRUFJRCxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsaUJBQWlCLFFBQVMsVUFBWSxDQUNwRixHQUFLQyxFQUVMLEtBQUlPLEVBQWEsWUFBWSxPQUFPLGdCQUFpQixDQUFDLENBQUMsRUFDbkR0bUIsRUFBT3NtQixFQUFXUCxDQUFXLEVBQUlPLEVBQVdQLENBQVcsRUFBRSxLQUFPQSxFQUVwRSxHQUFLLFFBQVEsV0FBYS9sQixFQUFPLFVBQVUsRUFFM0MsS0FBSThvQixFQUFlL0MsRUFHbkIsT0FBT08sRUFBV3dDLENBQVksRUFDOUIsUUFBUSxPQUFPLGdCQUFpQixLQUFLLFVBQVV4QyxDQUFVLENBQUMsRUFHMUQsSUFBSWoyQixFQUFNLE9BQU8sT0FBTyxRQUFReTRCLENBQVksRUFDeEN6NEIsSUFBUSxJQUFJLE9BQU8sT0FBTyxPQUFPQSxFQUFLLENBQUMsRUFDM0MsT0FBTyxPQUFPLGFBQWF5NEIsQ0FBWSxFQUV2QyxPQUFPLHNCQUFzQixFQUM3QixPQUFPLHNCQUFzQixFQUU3QixJQUFJQyxFQUFXakQsR0FBc0JBLElBQXVCZ0QsRUFBZWhELEVBQXFCLE9BQ2hHLE9BQU8sV0FBV2lELENBQVEsRUFFMUJoRCxFQUFjLEtBQ2Q1NUIsRUFBTSxVQUFVLE9BQU8sTUFBTSxFQUM3Qm82QixFQUFZLEVBR1osWUFBWSxrQkFBb0J1QyxFQUFjLENBQUUsT0FBUSxRQUFTLENBQUMsRUFBRSxLQUFLLFVBQVksQ0FDbkYsaUJBQWlCOW9CLEVBQU8saUJBQWtCLFVBQVcsR0FBSSxDQUMzRCxDQUFDLEVBQUUsTUFBTSxVQUFZLENBQ25CLGlCQUFpQkEsRUFBTyw4Q0FBK0MsVUFBVyxHQUFJLENBQ3hGLENBQUMsR0FDSCxDQUFDLEVBSUQsU0FBUyxlQUFlLHNCQUFzQixFQUFFLGlCQUFpQixRQUFTLFVBQVksQ0FDcEYsR0FBSSxDQUFDK2xCLEVBQWEsQ0FDaEIsaUJBQWlCLG9DQUFxQyxVQUFXLEdBQUksRUFDckUsTUFDRixDQUNBLElBQUlPLEVBQWEsWUFBWSxPQUFPLGdCQUFpQixDQUFDLENBQUMsRUFDbkR1QixFQUFRdkIsRUFBV1AsQ0FBVyxFQUNsQyxHQUFLOEIsRUFFTCxLQUFJbUIsRUFBYSxDQUNmLGlCQUFrQixHQUNsQixRQUFTLE1BQ1QsV0FBWSxJQUFJLEtBQUssRUFBRSxZQUFZLEVBQ25DLEtBQU1qRCxFQUNOLEtBQU04QixFQUFNLEtBQ1osUUFBU0EsRUFBTSxTQUFXLEdBQzFCLE9BQVEsQ0FBQyxDQUNYLEVBQ0EsT0FBTyxZQUFZLFFBQVEsU0FBVXozQixFQUFHLENBQ2xDeTNCLEVBQU16M0IsQ0FBQyxJQUFHNDRCLEVBQVcsT0FBTzU0QixDQUFDLEVBQUl5M0IsRUFBTXozQixDQUFDLEVBQzlDLENBQUMsRUFFRCxJQUFJNE4sRUFBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLFVBQVVnckIsRUFBWSxLQUFNLENBQUMsQ0FBQyxFQUFHLENBQUUsS0FBTSxrQkFBbUIsQ0FBQyxFQUNuRmwzQixFQUFNLElBQUksZ0JBQWdCa00sQ0FBSSxFQUM5Qi9RLEVBQUksU0FBUyxjQUFjLEdBQUcsRUFDbENBLEVBQUUsS0FBTzZFLEVBQ1Q3RSxFQUFFLFNBQVc4NEIsRUFBYyxjQUMzQixTQUFTLEtBQUssWUFBWTk0QixDQUFDLEVBQzNCQSxFQUFFLE1BQU0sRUFDUixTQUFTLEtBQUssWUFBWUEsQ0FBQyxFQUMzQixJQUFJLGdCQUFnQjZFLENBQUcsRUFDdkIsaUJBQWlCLHFCQUF1QmkwQixFQUFjLGNBQWUsVUFBVyxHQUFJLEVBQ3RGLENBQUMsRUFJRCxTQUFTLGVBQWUsc0JBQXNCLEVBQUUsaUJBQWlCLFFBQVMsVUFBWSxDQUNwRixJQUFJOTBCLEVBQVEsU0FBUyxjQUFjLE9BQU8sRUFDMUNBLEVBQU0sS0FBTyxPQUNiQSxFQUFNLE9BQVMsUUFDZkEsRUFBTSxTQUFXLFNBQVVqSyxFQUFHLENBQzVCLElBQUlILEVBQU9HLEVBQUUsT0FBTyxNQUFNLENBQUMsRUFDM0IsR0FBS0gsRUFDTCxLQUFJRSxFQUFTLElBQUksV0FDakJBLEVBQU8sT0FBUyxTQUFVd1ksRUFBSSxDQUM1QixHQUFJLENBQ0YsSUFBSXRZLEVBQU8sS0FBSyxNQUFNc1ksRUFBRyxPQUFPLE1BQU0sRUFHbENtb0IsRUFBV3VCLEVBQWFDLEVBQzVCLEdBQUlqaUMsRUFBSyxrQkFBb0JBLEVBQUssT0FFaEN5Z0MsRUFBWXpnQyxFQUFLLE1BQVEsV0FDekJnaUMsRUFBY2hpQyxFQUFLLE9BQ25CaWlDLEVBQWVqaUMsRUFBSyxTQUFXLFdBQ3RCQSxFQUFLLE9BQVNBLEVBQUssSUFBTUEsRUFBSyxXQUFXLEdBRWxEeWdDLEVBQVl6Z0MsRUFBSyxLQUNqQmdpQyxFQUFjLENBQUMsRUFDZixPQUFPLFlBQVksUUFBUSxTQUFVNzRCLEVBQUcsQ0FBTW5KLEVBQUttSixDQUFDLElBQUc2NEIsRUFBWTc0QixDQUFDLEVBQUluSixFQUFLbUosQ0FBQyxFQUFHLENBQUMsRUFDbEY4NEIsRUFBZWppQyxFQUFLLFNBQVcsT0FFL0IsT0FBTSxJQUFJLE1BQU0sa0NBQWtDLEVBSXBEMnRCLEVBQVUsTUFBUThTLEVBQ2xCWCxFQUFhLFFBQVUsQ0FBQyxDQUFDbUMsRUFDekJuRCxFQUFjLEtBQ2RjLEVBQVcsTUFBUSxHQUNuQmIsRUFBb0IsQ0FBQyxFQUdyQmdCLEVBQVEsUUFBUSxTQUFVNTJCLEVBQUcsQ0FDM0IsSUFBSXVVLEVBQU1za0IsRUFBWTc0QixFQUFFLFFBQVEsSUFBSSxHQUFLLFVBQ3pDQSxFQUFFLE1BQVF1VSxFQUNWLElBQUk2aUIsRUFBTXI3QixFQUFNLGNBQWMsY0FBZ0JpRSxFQUFFLFFBQVEsS0FBTyxJQUFJLEVBQy9EbzNCLElBQUtBLEVBQUksWUFBYzdpQixFQUFJLFlBQVksR0FDdkN2VSxFQUFFLFFBQVEsVUFBWTY0QixFQUFZNzRCLEVBQUUsUUFBUSxJQUFJLElBQ2xENDFCLEVBQWtCNTFCLEVBQUUsUUFBUSxJQUFJLEVBQUksR0FFeEMsQ0FBQyxFQUdEazNCLEVBQTBCLEVBQzFCSyxFQUFjLEVBQ2RRLEVBQWdCZixFQUFpQixDQUFDLEVBQ2xDamlCLEVBQVUsTUFBTSxRQUFVLE9BQzFCLGlCQUFpQixJQUFNdWlCLEVBQVksZ0RBQWlELFVBQVcsR0FBSSxDQUNyRyxPQUFTcndCLEVBQUssQ0FDWixpQkFBaUIsa0JBQW9CQSxFQUFJLFFBQVMsUUFBUyxHQUFJLENBQ2pFLENBQ0YsRUFDQXRRLEVBQU8sV0FBV0YsQ0FBSSxFQUN4QixFQUNBb0ssRUFBTSxNQUFNLENBQ2QsQ0FBQyxFQUlELFVBQVU5RSxDQUFLLEVBRWZBLEVBQU0saUJBQWlCLFFBQVMsU0FBVW5GLEVBQUcsQ0FDdkNBLEVBQUUsU0FBV21GLElBQ2YsT0FBTyxzQkFBc0IsRUFDekIyNUIsR0FBb0IsT0FBTyxXQUFXQSxDQUFrQixFQUVoRSxDQUFDLENBQ0gsR0FBRyxHQUdGLFVBQVcsQ0FFVixZQUFZLGdCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBcUN0QixFQUVQLE1BQU0zNUIsRUFBUSxTQUFTLGVBQWUsZUFBZSxFQUMvQ2c5QixFQUFZLFNBQVMsZUFBZSxvQkFBb0IsRUFDeERDLEVBQWMsU0FBUyxlQUFlLGtCQUFrQixFQUN4REMsRUFBZ0IsU0FBUyxlQUFlLG9CQUFvQixFQUM1REMsRUFBVSxTQUFTLGVBQWUsZUFBZSxFQUNqREMsRUFBWSxTQUFTLGVBQWUsaUJBQWlCLEVBQ3JEQyxFQUFZLFNBQVMsZUFBZSxvQkFBb0IsRUFDeERDLEVBQVksU0FBUyxlQUFlLG9CQUFvQixFQUN4RHY3QixFQUFRLFNBQVMsZUFBZSxlQUFlLEVBQy9DdzdCLEVBQVksU0FBUyxlQUFlLGlCQUFpQixFQUNyREMsRUFBYyxTQUFTLGVBQWUsc0JBQXNCLEVBQzVEQyxFQUFrQixTQUFTLGVBQWUsMEJBQTBCLEVBRTFFLElBQUlDLEVBQWdCLEtBRXBCLFNBQVNDLEdBQWUsQ0FDdEJSLEVBQVEsTUFBTSxRQUFVLE9BQ3hCQyxFQUFVLE1BQU0sUUFBVSxNQUM1QixDQUVBLFNBQVNRLEVBQVVudkIsRUFBSyxDQUN0Qmt2QixFQUFhLEVBQ2JSLEVBQVEsWUFBYzF1QixFQUN0QjB1QixFQUFRLE1BQU0sUUFBVSxPQUMxQixDQUVBLFNBQVNVLEVBQVlwdkIsRUFBSyxDQUN4Qmt2QixFQUFhLEVBQ2JQLEVBQVUsWUFBYzN1QixFQUN4QjJ1QixFQUFVLE1BQU0sUUFBVSxPQUM1QixDQUVBLFNBQVNVLEVBQWF6eUIsRUFBUSxDQUc1QixHQUZBcXlCLEVBQWdCcnlCLEVBRVpBLEVBQU8sT0FBUSxDQUNqQnRKLEVBQU0sTUFBTSxXQUFhLHdCQUN6QkEsRUFBTSxNQUFNLE1BQVEsZUFDcEJzN0IsRUFBVSxZQUFjLFNBQ3hCQyxFQUFVLFlBQWMsaUJBQ3hCLE1BQU1TLEVBQWExeUIsRUFBTyxTQUN0QixnREFDQSx5QkFBeUIsSUFBSSxLQUFLQSxFQUFPLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjQSxFQUFPLGFBQWEseUJBQzlHa3lCLEVBQVUsVUFBWTtBQUFBLDJEQUMrQmx5QixFQUFPLE1BQVEsS0FBSztBQUFBLFVBQ3JFMHlCLENBQVU7QUFBQSxRQUVkTixFQUFnQixNQUFNLFFBQVUsT0FDaENSLEVBQVksTUFBTSxRQUFVLE9BQzVCQyxFQUFjLE1BQU0sUUFBVSxFQUNoQyxNQUNFbjdCLEVBQU0sTUFBTSxXQUFhLHlCQUN6QkEsRUFBTSxNQUFNLE1BQVEsZUFDcEJzN0IsRUFBVSxZQUFjLFNBQ3hCQyxFQUFVLFlBQWNqeUIsRUFBTyxRQUFVLGtCQUFvQixZQUM3RGt5QixFQUFVLFVBQVlseUIsRUFBTyxRQUN6QixrRUFDQSw4REFDSm95QixFQUFnQixNQUFNLFFBQVUsR0FDaENSLEVBQVksTUFBTSxRQUFVLEdBQzVCQyxFQUFjLE1BQU0sUUFBVSxPQUloQyxNQUFNYyxFQUFXM3lCLEVBQU8saUJBQW1CLENBQUMsRUFDdEM0eUIsRUFBaUIsSUFBSSxJQUFJNXlCLEVBQU8sVUFBWSxDQUFDLENBQUMsRUFDcERteUIsRUFBWSxVQUFZLE9BQU8sUUFBUVEsQ0FBUSxFQUFFLElBQUksQ0FBQyxDQUFDcjhCLEVBQUswVCxDQUFJLElBRXZEO0FBQUEsMkNBRFE0b0IsRUFBZSxJQUFJdDhCLENBQUcsRUFFUyxTQUFXLFdBQWM7QUFBQTtBQUFBLDhEQUVmMFQsRUFBSyxJQUFJO0FBQUEsa0VBQ0xBLEVBQUssV0FBVztBQUFBO0FBQUEsYUFHN0UsRUFBRSxLQUFLLEVBQUUsQ0FDWixDQUVBLGVBQWVnTyxHQUFhLENBQzFCLEdBQUksQ0FFRixNQUFNdm9CLEVBQU8sTUFEQSxNQUFNLE1BQU0sd0JBQXdCLEdBQ3pCLEtBQUssRUFDekJBLEVBQUssVUFDUGdqQyxFQUFhaGpDLEVBQUssT0FBTyxFQUN6Qm9qQyxFQUFrQnBqQyxFQUFLLE9BQU8sRUFFbEMsT0FBU0QsRUFBRyxDQUNWLFFBQVEsS0FBSyxpQ0FBa0NBLEVBQUUsT0FBTyxDQUMxRCxDQUNGLENBRUEsZUFBZXNqQyxHQUFrQixDQUMvQixNQUFNck8sRUFBT2tOLEVBQVUsTUFBTSxLQUFLLEVBQ2xDLEdBQUksQ0FBQ2xOLEVBQU0sQ0FDVDhOLEVBQVUsOEJBQThCLEVBQ3hDLE1BQ0YsQ0FFQUQsRUFBYSxFQUNiVixFQUFZLFNBQVcsR0FDdkJBLEVBQVksWUFBYyxnQkFFMUIsR0FBSSxDQU1GLE1BQU1uaUMsRUFBTyxNQUxBLE1BQU0sWUFBWSwyQkFBNEIsQ0FDekQsT0FBUSxPQUNSLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxLQUFBZzFCLENBQUssQ0FBQyxDQUMvQixDQUFDLEdBQ3VCLEtBQUssRUFFekJoMUIsRUFBSyxTQUNQK2lDLEVBQVkvaUMsRUFBSyxPQUFPLEVBQ3hCa2lDLEVBQVUsTUFBUSxHQUNsQmMsRUFBYWhqQyxFQUFLLE9BQU8sRUFDekIsaUJBQWlCLGdEQUFpRCxVQUFXLEdBQUksRUFDakZvakMsRUFBa0JwakMsRUFBSyxPQUFPLEdBRTlCOGlDLEVBQVU5aUMsRUFBSyxPQUFTLG1CQUFtQixDQUUvQyxPQUFTRCxFQUFHLENBQ1YraUMsRUFBVSxrQkFBb0IvaUMsRUFBRSxPQUFPLENBQ3pDLFFBQUUsQ0FDQW9pQyxFQUFZLFNBQVcsR0FDdkJBLEVBQVksWUFBYyxVQUM1QixDQUNGLENBRUEsZUFBZW1CLEdBQW9CLENBQ2pDLEdBQUssUUFBUSxxRUFBcUUsRUFFbEYsQ0FBQWxCLEVBQWMsU0FBVyxHQUN6QkEsRUFBYyxZQUFjLGtCQUU1QixHQUFJLENBRUYsTUFBTXBpQyxFQUFPLE1BREEsTUFBTSxZQUFZLDZCQUE4QixDQUFFLE9BQVEsTUFBTyxDQUFDLEdBQ3ZELEtBQUssRUFFekJBLEVBQUssU0FDUCtpQyxFQUFZL2lDLEVBQUssT0FBTyxFQUN4QixNQUFNdW9CLEVBQVcsRUFDakIsaUJBQWlCLHVCQUF3QixPQUFRLEdBQUksRUFDckQ2YSxFQUFrQixDQUFFLE9BQVEsRUFBTSxDQUFDLEdBRW5DTixFQUFVOWlDLEVBQUssT0FBUyxxQkFBcUIsQ0FFakQsT0FBU0QsRUFBRyxDQUNWK2lDLEVBQVUsa0JBQW9CL2lDLEVBQUUsT0FBTyxDQUN6QyxRQUFFLENBQ0FxaUMsRUFBYyxTQUFXLEdBQ3pCQSxFQUFjLFlBQWMsWUFDOUIsRUFDRixDQUVBLFNBQVNnQixFQUFrQjd5QixFQUFRLENBQ2pDLE1BQU1nekIsRUFBUyxTQUFTLGVBQWUsdUJBQXVCLEVBQ3hEQyxFQUFTLFNBQVMsZUFBZSxxQkFBcUIsRUFDdERDLEVBQVMsU0FBUyxlQUFlLHFCQUFxQixFQUN0REMsRUFBUyxTQUFTLGVBQWUscUJBQXFCLEVBQzVELEdBQUtILEVBSUwsR0FGQUEsRUFBTyxVQUFZLDBCQUE0Qmh6QixFQUFPLE9BQVMsVUFBWSxRQUV2RUEsRUFBTyxPQUdULEdBRkFpekIsRUFBTyxZQUFjLFNBQ3JCQyxFQUFPLFlBQWMsVUFDakJsekIsRUFBTyxTQUNUbXpCLEVBQU8sWUFBYyxvQkFDaEIsQ0FDTCxNQUFNMUosRUFBT3pwQixFQUFPLGNBQ3BCbXpCLEVBQU8sWUFBYzFKLEdBQVEsS0FBTyxRQUFZQSxFQUFPLGNBQWdCLEVBQ3pFLE1BRUF3SixFQUFPLFlBQWMsU0FDckJDLEVBQU8sWUFBY2x6QixFQUFPLFFBQVUsVUFBWSxZQUNsRG16QixFQUFPLFlBQWMsRUFFekIsQ0FFQSxTQUFTQyxHQUFtQixDQUMxQmQsRUFBYSxFQUNidGEsRUFBVyxFQUNYcmpCLEVBQU0sVUFBVSxJQUFJLE1BQU0sQ0FDNUIsQ0FHQWc5QixFQUFVLGlCQUFpQixRQUFTLFVBQVcsQ0FDN0MsSUFBSXhrQixFQUFNLEtBQUssTUFBTSxZQUFZLEVBQUUsUUFBUSxjQUFlLEVBQUUsRUFFNUQsR0FBSUEsRUFBSSxPQUFTLEtBQUssY0FDcEJBLEVBQU1BLEVBQUksUUFBUSxLQUFNLEVBQUUsRUFDdEJBLEVBQUksT0FBUyxHQUFLLENBQUNBLEVBQUksV0FBVyxJQUFJLElBQ3hDQSxFQUFNLEtBQU9BLEdBR1hBLEVBQUksV0FBVyxJQUFJLEdBQUtBLEVBQUksT0FBUyxHQUFHLENBQzFDLE1BQU04USxFQUFRLENBQUMsSUFBSSxFQUNid00sRUFBT3RkLEVBQUksVUFBVSxDQUFDLEVBQzVCLFFBQVM5VCxFQUFJLEVBQUdBLEVBQUlveEIsRUFBSyxPQUFRcHhCLEdBQUssRUFDcEM0a0IsRUFBTSxLQUFLd00sRUFBSyxVQUFVcHhCLEVBQUdBLEVBQUksQ0FBQyxDQUFDLEVBRXJDOFQsRUFBTThRLEVBQU0sS0FBSyxHQUFHLENBQ3RCLENBRUYsS0FBSyxZQUFjOVEsRUFBSSxPQUN2QixLQUFLLE1BQVFBLENBQ2YsQ0FBQyxFQUdEeWtCLEVBQVksaUJBQWlCLFFBQVNrQixDQUFlLEVBQ3JEakIsRUFBYyxpQkFBaUIsUUFBU2tCLENBQWlCLEVBQ3pEcEIsRUFBVSxpQkFBaUIsVUFBWW5pQyxHQUFNLENBQ3ZDQSxFQUFFLE1BQVEsU0FBU3NqQyxFQUFnQixDQUN6QyxDQUFDLEVBQ0QsVUFBVW4rQixFQUFPLFNBQVMsZUFBZSxnQkFBZ0IsQ0FBQyxFQUMxRCxNQUFNMCtCLEVBQVcsU0FBUyxlQUFlLHVCQUF1QixFQUM1REEsR0FBVUEsRUFBUyxpQkFBaUIsUUFBUyxJQUFNLE9BQU8sa0JBQW9CLE9BQU8saUJBQWlCLENBQUMsRUFHM0csT0FBTyxpQkFBbUJELEVBRzFCLE9BQU8sb0JBQXNCLGVBQWVFLEVBQVMsQ0FDbkQsR0FBSSxDQUdGLE9BRGEsTUFEQSxNQUFNLE1BQU0sMkJBQTJCQSxDQUFPLEVBQUUsR0FDckMsS0FBSyxHQUNqQixTQUNkLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixFQUdBdGIsRUFBVyxFQUFFLEtBQUtoWSxHQUFVLENBQ3RCcXlCLEdBQWVRLEVBQWtCUixDQUFhLENBQ3BELENBQUMsQ0FDSCxHQUFHLEdBb0JGLFVBQVcsQ0FDVixhQUVBLEdBQUksT0FBTyw0QkFBNkIsT0FDeEMsT0FBTyw0QkFBOEIsR0FFckMsTUFBTWtCLEVBQWMsQ0FDbEIsQ0FBRSxHQUFJLEtBQVUsSUFBTSxNQUFPLFFBQVMsRUFDdEMsQ0FBRSxHQUFJLEtBQVUsR0FBSyxJQUFNLE1BQU8sVUFBVyxFQUM3QyxDQUFFLEdBQUksTUFBYyxHQUFLLElBQU0sTUFBTyxRQUFTLENBQ2pELEVBRUEsWUFBWSxjQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FzQmZBLEVBQVksSUFBSUMsR0FBSyxrQkFBa0JBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQStDdkYsRUFFRCxNQUFNNytCLEVBQVEsU0FBUyxlQUFlLGFBQWEsRUFDN0M4K0IsRUFBZ0IsU0FBUyxlQUFlLDBCQUEwQixFQUNsRUMsRUFBVyxTQUFTLGVBQWUsY0FBYyxFQUNqREMsRUFBaUIsU0FBUyxlQUFlLGtCQUFrQixFQUMzREMsRUFBZ0IsU0FBUyxlQUFlLG1CQUFtQixFQUMzREMsRUFBZSxTQUFTLGVBQWUsbUJBQW1CLEVBQzFEL0IsRUFBVSxTQUFTLGVBQWUsYUFBYSxFQUMvQ0MsRUFBWSxTQUFTLGVBQWUsZUFBZSxFQUNuRCtCLEVBQW9CLFNBQVMsZUFBZSx3QkFBd0IsRUFDcEUxMkIsRUFBWSxTQUFTLGVBQWUsY0FBYyxFQUNsRDIyQixFQUFrQixTQUFTLGVBQWUscUJBQXFCLEVBQy9EQyxFQUFjLFNBQVMsZUFBZSxpQkFBaUIsRUFDdkRDLEVBQWUsU0FBUyxlQUFlLGdCQUFnQixFQUN2REMsRUFBa0IsU0FBUyxlQUFlLGtCQUFrQixFQUVsRSxJQUFJQyxFQUFpQixLQUNqQkMsRUFBWSxTQUVoQixTQUFTOUIsR0FBZSxDQUN0QlIsRUFBUSxNQUFNLFFBQVUsT0FDeEJDLEVBQVUsTUFBTSxRQUFVLE9BQzFCMkIsRUFBUyxNQUFNLFFBQVUsTUFDM0IsQ0FFQSxTQUFTbkIsRUFBVW52QixFQUFLLENBQ3RCMnVCLEVBQVUsTUFBTSxRQUFVLE9BQzFCMkIsRUFBUyxNQUFNLFFBQVUsT0FDekI1QixFQUFRLFlBQWMxdUIsRUFDdEIwdUIsRUFBUSxNQUFNLFFBQVUsT0FDMUIsQ0FFQSxTQUFTVSxFQUFZcHZCLEVBQUssQ0FDeEIwdUIsRUFBUSxNQUFNLFFBQVUsT0FDeEJDLEVBQVUsWUFBYzN1QixFQUN4QjJ1QixFQUFVLE1BQU0sUUFBVSxPQUM1QixDQUVBLFNBQVNzQyxHQUFrQixDQUt6QixPQUFPLE9BQU8sU0FBUyxNQUN6QixDQUVBLFNBQVNDLEVBQVFDLEVBQVMsQ0FDeEIsT0FBSUEsRUFBUSxXQUFXLE1BQU0sRUFBVUEsRUFDaENGLEVBQWdCLEVBQUlFLENBQzdCLENBRUEsU0FBU0MsRUFBY0MsRUFBSyxDQUMxQixHQUFJLENBQUNBLEVBQUssTUFBTyxHQUNqQixNQUFNdnlCLEVBQUksSUFBSSxLQUFLdXlCLENBQUcsRUFDdEIsT0FBSSxPQUFPLE1BQU12eUIsRUFBRSxRQUFRLENBQUMsRUFBVSxHQUMvQkEsRUFBRSxlQUFlLENBQzFCLENBRUEsU0FBU3d5QixFQUFpQnZULEVBQUksQ0FDNUIsR0FBSUEsR0FBTSxFQUFHLE1BQU8sVUFDcEIsTUFBTXBNLEVBQUksS0FBSyxNQUFNb00sRUFBSyxJQUFPLEVBQ2pDLEdBQUlwTSxHQUFLLEdBQUksTUFBTyxHQUFHLEtBQUssTUFBTUEsRUFBSSxFQUFFLENBQUMsS0FBS0EsRUFBSSxFQUFFLFNBQ3BELE1BQU12YyxFQUFJLEtBQUssTUFBTzJvQixFQUFLLEtBQVcsR0FBSyxFQUMzQyxNQUFPLEdBQUdwTSxDQUFDLEtBQUt2YyxDQUFDLFFBQ25CLENBRUEsU0FBU204QixFQUFhbnNCLEVBQU0sQ0FDMUI0ckIsRUFBWTVyQixFQUNaOHBCLEVBQWEsRUFDYjM5QixFQUFNLGlCQUFpQixZQUFZLEVBQUUsUUFBUS9FLEdBQU8sQ0FDbEQsTUFBTWdsQyxFQUFXaGxDLEVBQUksUUFBUSxNQUFRNFksRUFDckM1WSxFQUFJLFVBQVUsT0FBTyxTQUFVZ2xDLENBQVEsRUFDdkNobEMsRUFBSSxNQUFNLGtCQUFvQmdsQyxFQUFXLGdCQUFrQixjQUMzRGhsQyxFQUFJLE1BQU0sTUFBUWdsQyxFQUFXLFlBQWMsZUFDM0NobEMsRUFBSSxNQUFNLFdBQWFnbEMsRUFBVyxNQUFRLEtBQzVDLENBQUMsRUFDRGpnQyxFQUFNLGlCQUFpQixrQkFBa0IsRUFBRSxRQUFRaUUsR0FBSyxDQUN0REEsRUFBRSxNQUFNLFFBQVVBLEVBQUUsUUFBUSxRQUFVNFAsRUFBTyxHQUFLLE1BQ3BELENBQUMsQ0FDSCxDQUVBLGVBQWVxc0IsR0FBa0IsQ0FDL0JmLEVBQWtCLFVBQVksMERBQzlCLEdBQUksQ0FDRixNQUFNdDJCLEVBQU8sTUFBTSxNQUFNLGdCQUFpQixDQUFFLFlBQWEsYUFBYyxDQUFDLEVBQ3hFLEdBQUksQ0FBQ0EsRUFBSyxHQUFJLENBQ1pzMkIsRUFBa0IsVUFBWSw4REFDOUIsTUFDRixDQUNBLE1BQU1wYSxFQUFPLE1BQU1sYyxFQUFLLEtBQUssRUFFdkJrSyxHQURRZ1MsR0FBUUEsRUFBSyxNQUFTLENBQUMsR0FDZixPQUFPNVosR0FBS0EsRUFBRSxZQUFjcTBCLEVBQWUsRUFBRSxFQUNuRSxHQUFJenNCLEVBQVMsU0FBVyxFQUFHLENBQ3pCb3NCLEVBQWtCLFVBQVksb0ZBQzlCLE1BQ0YsQ0FDQUEsRUFBa0IsVUFBWXBzQixFQUFTLElBQUk1SCxHQUFLLENBQzlDLE1BQU1nMUIsRUFBWWgxQixFQUFFLFVBQVk0MEIsRUFBaUIsSUFBSSxLQUFLNTBCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBSSxLQUFLLElBQUksQ0FBQyxFQUFJLEdBQ2pHLE1BQU87QUFBQSxrREFDbUMsV0FBV0EsRUFBRSxFQUFFLENBQUM7QUFBQTtBQUFBO0FBQUEsd0JBRzFDQSxFQUFFLE9BQVMsWUFBYyxZQUFjLFFBQVE7QUFBQSxpRUFDVCxXQUFXMDBCLEVBQWMxMEIsRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLZzFCLENBQVM7QUFBQTtBQUFBLDBEQUV4RCxXQUFXaDFCLEVBQUUsRUFBRSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQU1wRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQ1ZnMEIsRUFBa0IsaUJBQWlCLGVBQWUsRUFBRSxRQUFRbGtDLEdBQU8sQ0FDakVBLEVBQUksaUJBQWlCLFFBQVMsSUFBTW1sQyxFQUFZbmxDLEVBQUksUUFBUSxPQUFPLENBQUMsQ0FDdEUsQ0FBQyxDQUNILE1BQVksQ0FDVmtrQyxFQUFrQixVQUFZLDhFQUNoQyxDQUNGLENBRUEsZUFBZWlCLEVBQVlsNUIsRUFBSSxDQUM3QixHQUFJLENBQ0YsTUFBTTJCLEVBQU8sTUFBTSxNQUFNLGlCQUFpQixtQkFBbUIzQixDQUFFLENBQUMsR0FBSSxDQUNsRSxPQUFRLFNBQ1IsWUFBYSxhQUNmLENBQUMsRUFDRCxHQUFJLENBQUMyQixFQUFLLEdBQUksQ0FDWixNQUFNa2MsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFPLENBQUMsRUFBRSxFQUMvQyswQixFQUFVN1ksR0FBUUEsRUFBSyxPQUFTLHVCQUF1QmxjLEVBQUssTUFBTSxJQUFJLEVBQ3RFLE1BQ0YsQ0FDQWcxQixFQUFZLGdCQUFnQixFQUM1QnFDLEVBQWdCLENBQ2xCLE1BQVksQ0FDVnRDLEVBQVUsK0JBQStCLENBQzNDLENBQ0YsQ0FFQSxlQUFleUMsR0FBYyxDQUMzQixHQUFJLENBQUNiLEVBQWdCLE9BQ3JCN0IsRUFBYSxFQUNieUIsRUFBZ0IsU0FBVyxHQUMzQixNQUFNa0IsRUFBV2xCLEVBQWdCLFlBQ2pDQSxFQUFnQixZQUFjLGlCQUM5QixHQUFJLENBQ0YsTUFBTW1CLEVBQVEsU0FBU2hCLEVBQWdCLE1BQU8sRUFBRSxFQUMxQzEyQixFQUFPLE1BQU0sTUFBTSxnQkFBaUIsQ0FDeEMsT0FBUSxPQUNSLFlBQWEsY0FDYixRQUFTLENBQUUsZUFBZ0Isa0JBQW1CLEVBQzlDLEtBQU0sS0FBSyxVQUFVLENBQUUsVUFBVzIyQixFQUFlLEdBQUksTUFBQWUsQ0FBTSxDQUFDLENBQzlELENBQUMsRUFDS3hiLEVBQU8sTUFBTWxjLEVBQUssS0FBSyxFQUFFLE1BQU0sS0FBTyxDQUFDLEVBQUUsRUFDL0MsR0FBSSxDQUFDQSxFQUFLLElBQU0sQ0FBQ2tjLEVBQUssUUFBUyxDQUM3QnliLEVBQWdCMzNCLEVBQUssT0FBUWtjLENBQUksRUFDakMsTUFDRixDQUNBLE1BQU02YSxFQUFVN2EsRUFBSyxLQUFLLFFBQzFCaWEsRUFBZSxNQUFRVyxFQUFRQyxDQUFPLEVBQ3RDVixFQUFhLFlBQWMsNEJBQXlCVyxFQUFjOWEsRUFBSyxLQUFLLFNBQVMsQ0FBQyxHQUN0RmdhLEVBQVMsTUFBTSxRQUFVLFFBQ3pCbEIsRUFBWSxxQkFBcUIsRUFDakNxQyxFQUFnQixDQUNsQixNQUFZLENBQ1Z0QyxFQUFVLHFDQUFxQyxDQUNqRCxRQUFFLENBQ0F3QixFQUFnQixTQUFXLEdBQzNCQSxFQUFnQixZQUFja0IsQ0FDaEMsQ0FDRixDQUVBLGVBQWVHLEdBQWlCLENBQzlCLEdBQUksQ0FBQ2pCLEVBQWdCLE9BQ3JCLE1BQU16aEMsR0FBU3VoQyxFQUFhLE9BQVMsSUFBSSxLQUFLLEVBQzlDLEdBQUksQ0FBQ3ZoQyxHQUFTLENBQUNBLEVBQU0sU0FBUyxHQUFHLEVBQUcsQ0FDbEM2L0IsRUFBVSxzQ0FBc0MsRUFDaEQsTUFDRixDQUNBRCxFQUFhLEVBQ2IwQixFQUFZLFNBQVcsR0FDdkIsTUFBTWlCLEVBQVdqQixFQUFZLFlBQzdCQSxFQUFZLFlBQWMsaUJBQzFCLEdBQUksQ0FDRixNQUFNeDJCLEVBQU8sTUFBTSxNQUFNLDBCQUEyQixDQUNsRCxPQUFRLE9BQ1IsWUFBYSxjQUNiLFFBQVMsQ0FBRSxlQUFnQixrQkFBbUIsRUFDOUMsS0FBTSxLQUFLLFVBQVUsQ0FBRSxVQUFXMjJCLEVBQWUsR0FBSSxNQUFBemhDLENBQU0sQ0FBQyxDQUM5RCxDQUFDLEVBQ0tnbkIsRUFBTyxNQUFNbGMsRUFBSyxLQUFLLEVBQUUsTUFBTSxLQUFPLENBQUMsRUFBRSxFQUMvQyxHQUFJLENBQUNBLEVBQUssSUFBTSxDQUFDa2MsRUFBSyxRQUFTLENBQzdCeWIsRUFBZ0IzM0IsRUFBSyxPQUFRa2MsQ0FBSSxFQUNqQyxNQUNGLENBSUEsTUFBTTZYLEVBQVc3WCxFQUFLLE1BQVFBLEVBQUssS0FBSyxRQUNwQzZYLEdBQ0ZvQyxFQUFlLE1BQVFXLEVBQVEvQyxDQUFRLEVBQ3ZDc0MsRUFBYSxZQUFjLG9DQUFpQ25oQyxDQUFLLG9EQUVqRWloQyxFQUFlLE1BQVEsR0FDdkJFLEVBQWEsWUFBYyw0QkFBNEJuaEMsQ0FBSyxLQUU5RGdoQyxFQUFTLE1BQU0sUUFBVSxRQUN6QmxCLEVBQVksMkJBQTJCLEVBQ3ZDeUIsRUFBYSxNQUFRLEdBQ3JCWSxFQUFnQixDQUNsQixNQUFZLENBQ1Z0QyxFQUFVLGdEQUFnRCxDQUM1RCxRQUFFLENBQ0F5QixFQUFZLFNBQVcsR0FDdkJBLEVBQVksWUFBY2lCLENBQzVCLENBQ0YsQ0FFQSxTQUFTRSxFQUFnQm4xQixFQUFRMFosRUFBTSxDQUNyQyxNQUFNN1osRUFBTzZaLEdBQVFBLEVBQUssT0FBVSxHQUNwQyxHQUFJMVosSUFBVyxJQUFLLENBQ2xCdXlCLEVBQVUsdURBQXVELEVBQ2pFLE1BQ0YsQ0FDQSxHQUFJdnlCLElBQVcsS0FBTyxhQUFhLEtBQUtILENBQUcsRUFBRyxDQUM1QzB5QixFQUFVLG9GQUFvRixFQUM5RixNQUNGLENBQ0EsR0FBSXZ5QixJQUFXLElBQUssQ0FDbEJ1eUIsRUFBVSwrQ0FBK0MsRUFDekQsTUFDRixDQUNBLEdBQUl2eUIsSUFBVyxJQUFLLENBQ2xCdXlCLEVBQVUsOENBQThDLEVBQ3hELE1BQ0YsQ0FDQUEsRUFBVTF5QixHQUFPLHdCQUF3QkcsQ0FBTSxJQUFJLENBQ3JELENBRUEsU0FBU3ExQixFQUFldnFCLEVBQVMsQ0FDM0IsQ0FBQ0EsR0FBVyxDQUFDQSxFQUFRLEtBQ3pCcXBCLEVBQWlCLENBQUUsR0FBSXJwQixFQUFRLEdBQUksS0FBTUEsRUFBUSxNQUFRQSxFQUFRLEVBQUcsRUFDcEUyb0IsRUFBYyxZQUFjVSxFQUFlLEtBQzNDN0IsRUFBYSxFQUNicUMsRUFBYSxRQUFRLEVBQ3JCVixFQUFhLE1BQVEsR0FDckJDLEVBQWdCLE1BQVEsT0FBT1gsRUFBWSxDQUFDLEVBQUUsRUFBRSxFQUNoRDUrQixFQUFNLFVBQVUsSUFBSSxNQUFNLEVBQzFCa2dDLEVBQWdCLEVBQ2xCLENBR0FsZ0MsRUFBTSxpQkFBaUIsWUFBWSxFQUFFLFFBQVEvRSxHQUFPLENBQ2xEQSxFQUFJLGlCQUFpQixRQUFTLElBQU0ra0MsRUFBYS9rQyxFQUFJLFFBQVEsR0FBRyxDQUFDLENBQ25FLENBQUMsRUFDRG1rQyxFQUFnQixpQkFBaUIsUUFBU2lCLENBQVcsRUFDckRoQixFQUFZLGlCQUFpQixRQUFTb0IsQ0FBYyxFQUNwRGg0QixFQUFVLGlCQUFpQixRQUFTLElBQU16SSxFQUFNLFVBQVUsT0FBTyxNQUFNLENBQUMsRUFDeEUsVUFBVUEsRUFBT3lJLENBQVMsRUFHMUJ3MkIsRUFBYyxpQkFBaUIsUUFBUyxTQUFZLENBQ2xELE1BQU10NUIsRUFBTXE1QixFQUFlLE1BQzNCLEdBQUtyNUIsRUFDTCxHQUFJLENBQ0UsVUFBVSxXQUFhLFVBQVUsVUFBVSxVQUM3QyxNQUFNLFVBQVUsVUFBVSxVQUFVQSxDQUFHLEdBR3ZDcTVCLEVBQWUsT0FBTyxFQUN0QixTQUFTLFlBQVksTUFBTSxHQUU3QixNQUFNc0IsRUFBV3JCLEVBQWMsWUFDL0JBLEVBQWMsWUFBYyxVQUM1QixXQUFXLElBQU0sQ0FBRUEsRUFBYyxZQUFjcUIsQ0FBVSxFQUFHLElBQUksQ0FDbEUsTUFBWSxDQUNWMUMsRUFBVSx1REFBdUQsQ0FDbkUsQ0FDRixDQUFDLEVBR0QsT0FBTyxlQUFpQjhDLENBQzFCLEdBQUciLAogICJuYW1lcyI6IFsibG9nb01vZGFsIiwgInByZXZpZXdEYXJrIiwgInByZXZpZXdMaWdodCIsICJsb2dvU3RhdHVzIiwgInNhbWVCb3RoQ2hlY2tib3giLCAiZHVhbFVwbG9hZHMiLCAic2luZ2xlVXBsb2FkIiwgInVwbG9hZERhcmsiLCAidXBsb2FkTGlnaHQiLCAidXBsb2FkU2luZ2xlIiwgImJyYW5kTG9nb0RhcmsiLCAiYnJhbmRMb2dvTGlnaHQiLCAidG9wUm93IiwgImRhc2hib2FyZFRpdGxlSW5wdXQiLCAiREVGQVVMVF9USVRMRSIsICJwZW5kaW5nRGFya0RhdGEiLCAicGVuZGluZ0xpZ2h0RGF0YSIsICJwZW5kaW5nU2luZ2xlRGF0YSIsICJjdXJyZW50UG9zaXRpb24iLCAiY3VycmVudFRpdGxlIiwgInJlYWRGaWxlQXNEYXRhVVJMIiwgImZpbGUiLCAiY2FsbGJhY2siLCAicmVhZGVyIiwgImUiLCAiZGF0YSIsICJhcHBseUxvZ29Qb3NpdGlvbiIsICJwb3MiLCAiYnRuIiwgImFwcGx5RGFzaGJvYXJkVGl0bGUiLCAidGl0bGUiLCAiaGVhZGVyVGl0bGUiLCAibG9hZEN1c3RvbUxvZ28iLCAicmVzcG9uc2UiLCAiZXJyb3IiLCAiaXNDdXN0b20iLCAibmV3VGl0bGUiLCAicGF5bG9hZCIsICJ0IiwgImZhdmljb25MaW5rIiwgImZhdmljb25QcmV2aWV3IiwgImZhdmljb25TdGF0dXMiLCAicGVuZGluZ0Zhdmljb25EYXRhIiwgImZhdmljb25VcGxvYWQiLCAiZmF2aWNvbkZhbGxiYWNrIiwgImxvYWRDdXN0b21GYXZpY29uIiwgImV2ZW50IiwgInNldHRpbmdzVHpTZWxlY3QiLCAiY3VycmVudFR6IiwgInJlcyIsICJ0eiIsICJjZmciLCAic2VsZWN0RWwiLCAic2VsZWN0ZWRUeiIsICJ0aW1lem9uZXMiLCAiZGV0ZWN0ZWQiLCAib3B0IiwgImN1cnJlbnRDb25maWdUeXBlIiwgInNlcnZlckNvbmZpZyIsICJjaGVja1NlcnZlckNvbmZpZyIsICJzZXR1cFR6U2VsZWN0IiwgInNob3dTdGVwIiwgInN0ZXBJZCIsICJzdGVwIiwgInRhcmdldFN0ZXAiLCAic2hvd1N1bW1hcnkiLCAic3VtbWFyeUNvbnRlbnQiLCAiaHRtbCIsICJ0bGQiLCAiY2FOYW1lIiwgImRuc0lQIiwgImRuc1BvcnQiLCAiaXAiLCAiZG9tYWluIiwgImVtYWlsIiwgInJvdXRpbmdNb2RlIiwgImV4YW1wbGVVcmxzIiwgInNhdmVDb25maWdUb1NlcnZlciIsICJjb25maWciLCAiZmluaXNoU2V0dXAiLCAic2VsZWN0ZWRQcm92aWRlciIsICJzYXZlZFRvU2VydmVyIiwgImNvbmZpZ05hbWUiLCAic2F2ZUxvY2F0aW9uIiwgInN0ZXAxTmV4dCIsICJzZWxlY3RlZCIsICJza2lwQnRuIiwgInRsZElucHV0IiwgInByZXZpZXcxIiwgInByZXZpZXcyIiwgImhvbWVsYWJCYWNrIiwgImhvbWVsYWJOZXh0IiwgInNpbXBsZUJhY2siLCAic2ltcGxlTmV4dCIsICJyYWRpbyIsICJub3RlIiwgInB1YmxpY0JhY2siLCAicHVibGljTmV4dCIsICJzdW1tYXJ5QmFjayIsICJzdW1tYXJ5TmV4dCIsICJkaXNrU2FmZXR5QmFjayIsICJmaW5pc2hCdG4iLCAiY29uZmlnU3RyIiwgImVycm9ySGFuZGxlciIsICJBUFBTX0tFWSIsICJhcGlUZW1wbGF0ZXMiLCAiYXBpQ2F0ZWdvcmllcyIsICJtb2RhbCIsICJncmlkIiwgImZldGNoQXBwVGVtcGxhdGVzIiwgImNoZWNrUG9ydEF2YWlsYWJpbGl0eSIsICJwb3J0IiwgImdldFN1Z2dlc3RlZFBvcnQiLCAiYmFzZVBvcnQiLCAiYnVpbGRBcHBTZWxlY3RvciIsICJieUNhdGVnb3J5IiwgImFwcElkIiwgInRlbXBsYXRlIiwgImNhdGVnb3J5IiwgImNhdGVnb3J5T3JkZXIiLCAiYXBwcyIsICJhIiwgImIiLCAiaGVhZGVyIiwgImNhdGVnb3J5SW5mbyIsICJhcHAiLCAib3B0aW9uIiwgImlzV2lkZ2V0IiwgIndpZGdldEVuYWJsZWQiLCAid2lkZ2V0QmFkZ2UiLCAiZGlmZmljdWx0eUJhZGdlIiwgInRvZ2dsZURhc2hib2FyZFdpZGdldCIsICJzaG93RGVwbG95Q29uZmlnIiwgIm9wdGlvbkVsIiwgImtleSIsICJuZXdTdGF0ZSIsICJzZWxlY3RvciIsICJlbCIsICJiYWRnZSIsICJhcHBUZW1wbGF0ZSIsICJkZXBsb3lNb2RhbCIsICJzdWJkb21haW5JbnB1dCIsICJ1cmxQcmV2aWV3IiwgImlwSW5wdXQiLCAicG9ydElucHV0IiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInRhaWxzY2FsZVN0YXR1cyIsICJjaGVja1Jlc3VsdCIsICJjb250YWluZXIiLCAiZGVmYXVsdFN1YmRvbWFpbiIsICJzdWJwYXRoV2FybmluZyIsICJzdXBwb3J0IiwgImNmZ0Ruc1R5cGUiLCAiY2ZnU3NsVHlwZSIsICJkbnNSYWRpbyIsICJzc2xSYWRpbyIsICJkbnNTZWN0aW9uIiwgImFkdmFuY2VkRGV0YWlscyIsICJhZHZhbmNlZENvbnRlbnQiLCAiZG5zU2VjdGlvbkVsIiwgInNzbFNlY3Rpb25FbCIsICJtZWRpYVBhdGhTZWN0aW9uIiwgIm1lZGlhUGF0aElucHV0IiwgIm1lZGlhUGF0aERlc2NyaXB0aW9uIiwgImRldGVjdGVkTW91bnRzQ29udGFpbmVyIiwgImRldGVjdGVkTW91bnRzTGlzdCIsICJtb3VudHNSZXN1bHQiLCAiYXV0b1BhdGhzIiwgIm0iLCAibW91bnQiLCAiaXNTZWxlY3RlZCIsICJjdXJyZW50UGF0aHMiLCAicCIsICJpZHgiLCAicGxleENsYWltU2VjdGlvbiIsICJ2b2x1bWVTZWN0aW9uIiwgInZvbHVtZUxpc3QiLCAibWVkaWFDb250YWluZXJQYXRoIiwgIm5vbk1lZGlhVm9sdW1lcyIsICJ2IiwgInZvbCIsICJpIiwgImhvc3REZWZhdWx0IiwgImNvbnRhaW5lclBhdGgiLCAicm93IiwgImlucHV0IiwgImRlZmF1bHRQb3J0IiwgInBvcnRTdGF0dXMiLCAiY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzIiwgInBvcnRUb0NoZWNrIiwgInJlc3VsdCIsICJzdWdnZXN0ZWRQb3J0IiwgInVzZUJ0biIsICJwb3J0Q2hlY2tUaW1lb3V0IiwgInVwZGF0ZVVybFByZXZpZXciLCAic3ViZG9tYWluIiwgImRuc1R5cGUiLCAic3NsVHlwZSIsICJ1cmwiLCAicHJvdG9jb2wiLCAiYWRkQXBwVG9HcmlkIiwgImRlcGxveUNvbmZpZyIsICJjdXN0b21BcHBzIiwgInVzaW5nRXhpc3RpbmciLCAiZXhpc3RpbmdBcHAiLCAiaW5kZXgiLCAicG9ydFRvVXNlIiwgInBvcnRDaGVjayIsICJhcGlEZXBsb3lDb25maWciLCAiY2F0YWxvZ1BheWxvYWQiLCAibmV3QXBwIiwgIm1lc3NhZ2UiLCAiY2hlY2tTU0xDZXJ0aWZpY2F0ZSIsICJpbnN0cnVjdGlvbnMiLCAiYXBwTmFtZSIsICJhdHRlbXB0cyIsICJtYXhBdHRlbXB0cyIsICJjaGVja0NlcnQiLCAibG9hZEN1c3RvbUFwcHMiLCAidGVtcGxhdGVJZCIsICJlbnRyeSIsICJpZCIsICJtZWRpYVBhdGgiLCAiY3VzdG9tVm9sdW1lcyIsICJmb2xkZXJCcm93c2VyTW9kYWwiLCAiZm9sZGVyQnJvd3NlclBhdGgiLCAiZm9sZGVyQnJvd3Nlckxpc3QiLCAiZm9sZGVyQnJvd3NlclNlbGVjdGVkIiwgImZvbGRlckJyb3dzZXJTZWxlY3RlZExpc3QiLCAiY3VycmVudEJyb3dzZXJQYXRoIiwgInNlbGVjdGVkRm9sZGVycyIsICJ0YXJnZXRNZWRpYUlucHV0IiwgIm1lZGlhSW5wdXQiLCAidXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSIsICJsb2FkRm9sZGVyQ29udGVudHMiLCAicGF0aCIsICJpdGVtIiwgImljb24iLCAic2VsZWN0ZWRTdHlsZSIsICJyZWNpcGVUZW1wbGF0ZXMiLCAicmVjaXBlQ2F0ZWdvcmllcyIsICJjdXJyZW50UmVjaXBlIiwgImN1cnJlbnRTdGVwIiwgImlzUHJlbWl1bSIsICJjYW5jZWxCdG4iLCAicHJldkJ0biIsICJuZXh0QnRuIiwgImZldGNoUmVjaXBlVGVtcGxhdGVzIiwgInJlc3AiLCAiY2hlY2tSZWNpcGVQcmVtaXVtIiwgInJlY2lwZXMiLCAiZ2V0UHJldmlld1JlY2lwZXMiLCAicmVjaXBlTGlzdCIsICJyZWNpcGUiLCAiY29tcG9uZW50QmFkZ2UiLCAibG9ja092ZXJsYXkiLCAib3BlblJlY2lwZURlcGxveVdpemFyZCIsICJhcHBTZWxlY3Rvck1vZGFsIiwgInVwZGF0ZVN0ZXBVSSIsICJyZW5kZXJTdGVwMSIsICJwYW5lbCIsICJsaXN0IiwgImNvbXBvbmVudHMiLCAiY29tcCIsICJpc1JlcXVpcmVkIiwgImlzSW50ZXJuYWwiLCAicmVuZGVyU3RlcDIiLCAic2hhcmVkVm9sdW1lcyIsICJyZW5kZXJTdGVwMyIsICJjb250ZW50IiwgInNlbGVjdGVkQ29tcG9uZW50cyIsICJnZXRTZWxlY3RlZENvbXBvbmVudHMiLCAidm9sdW1lSW5wdXRzIiwgInZvbHVtZXMiLCAidGFpbHNjYWxlIiwgImMiLCAiayIsICJjaGVja2JveGVzIiwgInNlbGVjdGVkSWRzIiwgImNiIiwgImV4ZWN1dGVEZXBsb3kiLCAicHJvZ3Jlc3NMaXN0IiwgInJlc3VsdEVsIiwgInVwZGF0ZVByb2dyZXNzSXRlbSIsICJkZXBsb3llZCIsICJlcnIiLCAicyIsICJjb21wb25lbnRJZCIsICJzdGF0dXMiLCAidGV4dCIsICJzdGF0dXNFbCIsICJjYXJkcyIsICJncm91cHMiLCAiY2FyZCIsICJyZWNpcGVJZCIsICJncm91cENhcmRzIiwgImxhYmVsIiwgImFjdGlvbiIsICJlbmRwb2ludCIsICJtZXRob2QiLCAiciIsICJzdHlsZSIsICJidXR0b24iLCAib3JpZ2luYWxUZXh0IiwgInZpZXdCdG4iLCAicmVmcmVzaEJ0biIsICJjbGVhckJ0biIsICJjbG9zZUJ0biIsICJsZXZlbFNlbCIsICJjb250ZXh0U2VsIiwgInNlYXJjaElucHV0IiwgInNpbmNlSW5wdXQiLCAidW50aWxJbnB1dCIsICJsb2FkTW9yZUJ0biIsICJ0b3RhbFNwYW4iLCAiUEFHRV9TSVpFIiwgImN1cnJlbnRPZmZzZXQiLCAiaW5mbGlnaHQiLCAiZmlsdGVyTm9uY2UiLCAia25vd25Db250ZXh0cyIsICJ0b0lzbyIsICJsb2NhbER0VmFsdWUiLCAiZCIsICJyZWZyZXNoQ29udGV4dHMiLCAiY3VycmVudFZhbHVlIiwgImJ1aWxkUXVlcnkiLCAicGFyYW1zIiwgInNpbmNlIiwgInVudGlsIiwgInNlYXJjaCIsICJsb2FkTG9ncyIsICJhcHBlbmQiLCAibXlOb25jZSIsICJsb2dzIiwgInJlYXNvbiIsICJsb2ciLCAibGV2ZWwiLCAibGV2ZWxDb2xvciIsICJ0cyIsICJjdHgiLCAibXNnIiwgInRhYmxlIiwgImRldGFpbCIsICJjbGVhckxvZ3MiLCAic2VhcmNoRGVib3VuY2UiLCAid2lyZUZpbHRlcnMiLCAiZGF0ZURlYm91bmNlIiwgImNvbnRhaW5lclNlbGVjdCIsICJsb2dDb250ZW50IiwgImxvZ1NlYXJjaCIsICJsb2dUYWlsIiwgInN0cmVhbUJ0biIsICJkb3dubG9hZEJ0biIsICJjbGVhclNlYXJjaEJ0biIsICJjbG9zZUJ0bjIiLCAic3RyZWFtU3RhdHVzIiwgInN0cmVhbUluZGljYXRvciIsICJzdHJlYW1UZXh0IiwgImxpbmVDb3VudCIsICJmaWx0ZXJDb3VudCIsICJpbWFnZUVsIiwgImNyZWF0ZWRFbCIsICJjdXJyZW50Q29udGFpbmVySWQiLCAiY3VycmVudExvZ3MiLCAiZmlsdGVyZWRMb2dzIiwgImV2ZW50U291cmNlIiwgImlzU3RyZWFtaW5nIiwgInNlYXJjaFRpbWVvdXQiLCAiZm9ybWF0RGF0ZSIsICJkYXRlU3RyIiwgImVzY2FwZUh0bWwiLCAic3RyIiwgImRpdiIsICJmb3JtYXRMb2dFbnRyeSIsICJzdHJlYW1DbGFzcyIsICJzdHJlYW1JY29uIiwgInJlbmRlckxvZ3MiLCAic2VhcmNoVGVybSIsICJsb2FkQ29udGFpbmVycyIsICJjb250YWluZXJzIiwgImN1cnJlbnRWYWwiLCAibG9hZENvbnRhaW5lckluZm8iLCAiY29udGFpbmVySWQiLCAic3RvcFN0cmVhbSIsICJ0YWlsIiwgInN0YXJ0U3RyZWFtIiwgImVudHJ5RGl2IiwgImRvd25sb2FkTG9ncyIsICJjb250YWluZXJOYW1lIiwgInRpbWVzdGFtcCIsICJmaWxlbmFtZSIsICJzdHJlYW0iLCAiYmxvYiIsICJjbG9zZU1vZGFsIiwgIlVOSVRfUFJFU0VUUyIsICJ1bml0U2VsZWN0IiwgInRhaWxJbnB1dCIsICJjbGVhclNlYXJjaCIsICJvdmVyZmxvd0hpbnQiLCAidW5pdERpc3BsYXkiLCAic3RyZWFtU3RhdGUiLCAiYXZhaWxhYmxlIiwgImxpbmVzIiwgInN0cmVhbWluZyIsICJzZWFyY2hUaW1lciIsICJzZXRBdmFpbGFibGUiLCAiaXNBdmFpbGFibGUiLCAicHJvYmVBdmFpbGFibGUiLCAicmVuZGVyTGluZXMiLCAidGVybSIsICJmaWx0ZXJlZCIsICJsIiwgImxpbmUiLCAibG9hZFRhaWwiLCAidW5pdCIsICJldiIsICJjbG9zZSIsICJvcGVuSm91cm5hbGRNb2RhbCIsICJvcGVuQnRuIiwgImRldGFpbHNEaXYiLCAiY3JlYXRlQnRuIiwgImNyZWF0ZVN0YXR1cyIsICJzaG93Q29udGFpbmVyRGV0YWlscyIsICJjcmVhdGVTbmFwc2hvdCIsICJuYW1lIiwgImxlYXZlUnVubmluZyIsICJvcGVuTW9kYWwiLCAidGFiIiwgImNvbm5lY3RCdG4iLCAicGhhc2VEZXRlY3QiLCAicGhhc2VDcmVkZW50aWFscyIsICJwaGFzZVByb2dyZXNzIiwgInBoYXNlUmVzdWx0cyIsICJkZXRlY3RSZXN1bHRzIiwgImNyZWRlbnRpYWxJbnB1dHMiLCAicHJvZ3Jlc3NTdGVwcyIsICJyZXN1bHRzQ29udGVudCIsICJwbGV4TGlicmFyaWVzIiwgInJldHJ5QnRuIiwgImRldGVjdGVkRGF0YSIsICJzZXJ2aWNlSWNvbnMiLCAic2VydmljZUxhYmVscyIsICJzaG93UGhhc2UiLCAicGhhc2UiLCAic3RhdHVzQmFkZ2UiLCAiY29sb3JzIiwgInNtYXJ0RGV0ZWN0IiwgInN2YyIsICJpbmZvIiwgInNvdXJjZSIsICJ2ZXJzaW9uIiwgImtleVNhdmVkIiwgImJ1aWxkQ3JlZGVudGlhbElucHV0cyIsICJzZXJ2aWNlcyIsICJhcnJTZXJ2aWNlcyIsICJpc0Nvbm5lY3RlZCIsICJwbGV4IiwgInBsZXhDb25uZWN0ZWQiLCAic2VlcnIiLCAic2VlcnJPayIsICJjb25maWd1cmVkSHRtbCIsICJjcyIsICJzZXJ2aWNlIiwgInVybElucHV0IiwgImtleUlucHV0IiwgInN0YXR1c1NwYW4iLCAiYXBpS2V5IiwgInNtYXJ0Q29ubmVjdCIsICJzdGVwc0h0bWwiLCAiZGV0YWlsQ29sb3IiLCAic2hvd1Jlc3VsdHMiLCAiYWxsR29vZCIsICJoZWFkZXJDb2xvciIsICJoZWFkZXJJY29uIiwgImhlYWRlclRleHQiLCAic3QiLCAiZmV0Y2hQbGV4TGlicmFyaWVzIiwgImxpYiIsICJ0eXBlSWNvbiIsICJzYXZlQnRuIiwgInByb3ZpZGVyIiwgImNoZWNrYm94IiwgImhlYWx0aENoZWNrRW5hYmxlZCIsICJoZWFsdGhDaGVja0NvbmZpZyIsICJsb2FkTm90aWZpY2F0aW9uQ29uZmlnIiwgImVtYWlsUGFzc0VsIiwgImxvYWROb3RpZmljYXRpb25IaXN0b3J5IiwgImRhdGUiLCAic2F2ZU5vdGlmaWNhdGlvbkNvbmZpZyIsICJ0ZXN0UHJvdmlkZXIiLCAibG9hZE5vdGlmaWNhdGlvblN0YXR1cyIsICJsYXN0U2VudEVsIiwgInBhbmVsSWQiLCAidGFiQmFyIiwgIm1vZGFsQ29udGVudCIsICJ0YXJnZXQiLCAiQlJPV1NFUl9TVEFURV9LRVlTIiwgImNvbGxlY3RCcm93c2VyU3RhdGUiLCAic3RhdGUiLCAidmFsIiwgImoiLCAicmVzdG9yZUJyb3dzZXJTdGF0ZSIsICJicm93c2VyU3RhdGUiLCAiY291bnQiLCAiaXNMZWdhY3lGb3JtYXQiLCAicmVzdG9yZUxlZ2FjeUZvcm1hdCIsICJzbHVnIiwgImV4cG9ydEJ0biIsICJzZWxlY3RGaWxlQnRuIiwgImZpbGVJbnB1dCIsICJmaWxlTmFtZURpdiIsICJwcmV2aWV3RGl2IiwgInByZXZpZXdDb250ZW50IiwgInJlc3RvcmVCdG4iLCAicmVzdWx0RGl2IiwgInNjaGVkdWxlQ29udGFpbmVyIiwgIndpcmVVcGdyYWRlQnV0dG9ucyIsICJyb290IiwgImhpc3RvcnlDb250YWluZXIiLCAiZGlza0NvbnRhaW5lciIsICJwb2ludGludGltZUNvbnRhaW5lciIsICJzZWxlY3RlZEJhY2t1cCIsICJzdGF0ZUNvdW50IiwgInRoZW1lQ291bnQiLCAiYmFja3VwIiwgInByZXZpZXciLCAicmVsb2FkQ2FkZHkiLCAiYnJvd3NlckNvdW50IiwgImxvYWRTY2hlZHVsZXNUYWIiLCAic2NoZWR1bGVzIiwgInNjaCIsICJuZXh0UnVuU3RyIiwgImxhc3RSdW5TdHIiLCAidG9nZ2xlIiwgInVwZGF0ZVNjaGVkdWxlIiwgInNlbCIsICJpbnAiLCAicnVuQmFja3VwTm93IiwgImRlbGV0ZVNjaGVkdWxlIiwgImFkZE5ld1NjaGVkdWxlIiwgInVwZGF0ZXMiLCAiaW50ZXJ2YWwiLCAicmV0ZW50aW9uIiwgImFwcElkSW5wdXQiLCAibG9hZERpc2tCYWNrdXBzIiwgImZpbGVzIiwgImJ5QXBwIiwgImYiLCAiYXBwSWRzIiwgImFwcEZpbGVzIiwgImNvbXBhcmVCYWNrdXBGaWxlIiwgInJlc3RvcmVCYWNrdXBGaWxlIiwgImxvYWRCYWNrdXBIaXN0b3J5IiwgImJrIiwgInNpemVNQiIsICJiYWNrdXBJZCIsICJsb2FkUG9pbnRJblRpbWVUYWIiLCAibGljZW5zZVJlcyIsICJsaWNlbnNlRGF0YSIsICJzZXJ2aWNlc1JlcyIsICJzZXJ2aWNlc0RhdGEiLCAibG9hZFBvaW50SW5UaW1lQmFja3VwcyIsICJsaXN0RWwiLCAiZGlmZiIsICJzdmNDaGFuZ2VkIiwgImNmZ0NoYW5nZWQiLCAiYXV0b1JlZnJlc2hDaGVja2JveCIsICJhZ2dyZWdhdGVkQ29udGFpbmVyIiwgImFsZXJ0c0NvbnRhaW5lciIsICJsYXN0VXBkYXRlU3BhbiIsICJyZWZyZXNoSW50ZXJ2YWwiLCAiY2FjaGVkTW9uaXRvcmluZ0RhdGEiLCAiZm9ybWF0Qnl0ZXMiLCAiYnl0ZXMiLCAic2l6ZXMiLCAiZ2V0Q3B1Q29sb3IiLCAicGVyY2VudCIsICJnZXRNZW1Db2xvciIsICJsb2FkU3RhdHMiLCAic3RhdHMiLCAiaXNOZXdBcGkiLCAiY3VyIiwgImNwdSIsICJtZW0iLCAiY3B1Q29sb3IiLCAibWVtQ29sb3IiLCAibWVtVXNlZCIsICJtZW1MaW1pdCIsICJuZXRSeCIsICJuZXRUeCIsICJhZ2ciLCAibG9hZEFnZ3JlZ2F0ZWQiLCAibG9hZEFsZXJ0cyIsICJhbGVydEhpc3RvcnkiLCAiaGQiLCAiYWxsQ29uZmlncyIsICJjZCIsICJjb250YWluZXJSb3dzIiwgImhpc3RvcnlSb3dzIiwgInRpbWUiLCAibm90aWZpZWRNYXJrIiwgImNvbmZpZ1NlY3Rpb24iLCAiY29uZmlncyIsICJjSWQiLCAic3RvcEF1dG9SZWZyZXNoIiwgIm9yaWciLCAic3RhcnRBdXRvUmVmcmVzaCIsICJoaXN0b3J5Q29udGFpbmVyU2VsZWN0IiwgImhpc3RvcnlBcmVhIiwgInJhbmdlQnV0dG9ucyIsICJjdXJyZW50UmFuZ2UiLCAicmFuZ2VUb01zIiwgInJhbmdlIiwgInRpZXJMYWJlbCIsICJ0aWVyIiwgInJlbmRlclNwYXJrbGluZSIsICJzYW1wbGVzIiwgImFjY2Vzc29yIiwgImNvbG9yIiwgInZhbHVlcyIsICJtYXgiLCAibWluIiwgInciLCAiaCIsICJwYWQiLCAic3RlcFgiLCAicG9pbnRzIiwgIngiLCAieSIsICJsYXN0IiwgImF2ZyIsICJwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QiLCAicHJldmlvdXMiLCAiZW50cmllcyIsICJsb2FkSGlzdG9yeSIsICJlbmRUaW1lIiwgInN0YXJ0VGltZSIsICJpc1JhdyIsICJjcHVBY2Nlc3NvciIsICJtZW1BY2Nlc3NvciIsICJuZXRSeEFjY2Vzc29yIiwgIm5ldFR4QWNjZXNzb3IiLCAic3RhdHVzQ29udGFpbmVyIiwgImluY2lkZW50c0NvbnRhaW5lciIsICJjb25maWdDb250YWluZXIiLCAiYWRkQnRuIiwgImZvcm1FbCIsICJmb3JtVGl0bGUiLCAiZm9ybUNhbmNlbCIsICJmb3JtU2F2ZSIsICJIRUFMVEhfU0VUVElOR1NfS0VZIiwgIkhFQUxUSF9ERUZBVUxUUyIsICJnbG9iYWxTYXZlQnRuIiwgImdsb2JhbFJlc2V0QnRuIiwgImdsb2JhbFN0YXR1c1NwYW4iLCAicmV0ZW50aW9uSW5wdXQiLCAiaW50ZXJ2YWxJbnB1dCIsICJzdGF0c0ludGVydmFsSW5wdXQiLCAibWF4RW50cmllc0lucHV0IiwgImRpc2tUaHJlc2hvbGRJbnB1dCIsICJsb2FkSGVhbHRoU2V0dGluZ3MiLCAicmF3IiwgInNhdmVkIiwgImFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJIiwgInNhdmVIZWFsdGhTZXR0aW5ncyIsICJzZXR0aW5ncyIsICJyZXNldEhlYWx0aFNldHRpbmdzIiwgImVkaXRpbmdJZCIsICJ1cHRpbWVDb2xvciIsICJwY3QiLCAic2V2ZXJpdHlCYWRnZSIsICJzZXYiLCAibG9hZFN0YXR1cyIsICJpc1VwIiwgImRvdENvbG9yIiwgInUyNCIsICJ1N2QiLCAiYXZnUnQiLCAibGFzdENoZWNrIiwgImRldGFpbFJvdyIsICJydCIsICJsb2FkSW5jaWRlbnRzIiwgIm9wZW5SZXMiLCAiaGlzdFJlcyIsICJvcGVuRGF0YSIsICJoaXN0RGF0YSIsICJvcGVuIiwgImluYyIsICJoaXN0b3J5IiwgInJlc29sdmVkIiwgImR1ciIsICJsb2FkQ29uZmlnIiwgInNob3dGb3JtIiwgInRpbWVvdXQiLCAiY29kZXMiLCAic2xhIiwgInNsb3ciLCAiaGlkZUZvcm0iLCAiYm9keSIsICJjaGVja0J0biIsICJhdmFpbGFibGVDb250YWluZXIiLCAiYXV0b0NvbnRhaW5lciIsICJsYXN0Q2hlY2tTcGFuIiwgImxvYWRBdmFpbGFibGUiLCAidSIsICJjb3VudEJhZGdlIiwgInVwZGF0ZUFsbEJ0biIsICJ1cGRhdGVBbGxDb250YWluZXJzIiwgInN1Y2Nlc3MiLCAiZmFpbGVkIiwgImNoZWNrRm9yVXBkYXRlcyIsICJvayIsICJsb2FkQXV0b0NvbmZpZyIsICJjb250YWluZXJzUmVzIiwgImNvbmZpZ1JlcyIsICJjb250YWluZXJzRGF0YSIsICJjb25maWdEYXRhIiwgInNhdmVkQ29uZmlnIiwgImNpZCIsICJzY2hlZHVsZVZhbCIsICJyb2xsYmFja1ZhbCIsICJ3aW5kb3dWYWwiLCAibGFzdFJ1biIsICJzY2hlZHVsZSIsICJyb2xsYmFjayIsICJ3aW5kb3ciLCAiZGNWZXJzaW9uSW5mbyIsICJkY1VwZGF0ZUJhZGdlIiwgImRjVXBkYXRlRGV0YWlscyIsICJkY05ld1ZlcnNpb24iLCAiZGNDaGFuZ2Vsb2ciLCAiZGNBcHBseUJ0biIsICJkY0NoZWNrQnRuIiwgImRjUm9sbGJhY2tCdG4iLCAiZGNTdGF0dXNCYXIiLCAiZGNIaXN0b3J5Q29udGFpbmVyIiwgImRjTGFzdENoZWNrIiwgImRjU2hvd1N0YXR1cyIsICJ0eXBlIiwgImRjTG9hZFZlcnNpb24iLCAiY29tbWl0IiwgImRjQ2hlY2tGb3JVcGRhdGUiLCAic2lsZW50IiwgInVwZGF0ZXNCdG4iLCAiZG90IiwgImRjVGFiIiwgImRjQXBwbHlVcGRhdGUiLCAiZGNMb2FkSGlzdG9yeSIsICJzdENvbG9yIiwgImRjU2hvd1JvbGxiYWNrIiwgInZlcnNpb25zIiwgImZtdEJ5dGVzIiwgInVuaXRzIiwgImxvYWRWb2x1bWVzIiwgInZvbHMiLCAiaXNTeXN0ZW0iLCAibmFtZUlucHV0IiwgImxvYWROZXR3b3JrcyIsICJuZXRzIiwgIm4iLCAiZHJpdmVyU2VsZWN0IiwgImxvYWREaXNrVXNhZ2UiLCAic2VjdGlvbnMiLCAicGFyc2VkRGF0YSIsICJ5YW1sU3RyIiwgInN0YWNrTmFtZSIsICJvcmlnVGV4dCIsICJyZW5kZXJQcmV2aWV3IiwgImJvcmRlckNvbG9yIiwgInBhcnRzIiwgInByb2dyZXNzRWwiLCAidGVybUVsIiwgIndzIiwgImZpdEFkZG9uIiwgImNsZWFudXAiLCAib3BlbkV4ZWMiLCAiZGltcyIsICJjb2xzIiwgInJvd3MiLCAicmVzaXplSGFuZGxlciIsICJmaWx0ZXJTZWxlY3QiLCAib3V0Y29tZVNlbGVjdCIsICJsb2FkQXVkaXQiLCAib3V0Y29tZSIsICJhY3RvciIsICJhY3RvckxhYmVsIiwgInJvbGUiLCAidGFnIiwgInRhYnMiLCAicGFuZWxzIiwgImFsbEV2ZW50cyIsICJhbGxIb3N0cyIsICJzc2VTb3VyY2UiLCAicmVmcmVzaE92ZXJ2aWV3IiwgInJlZnJlc2hFdmVudHMiLCAicmVmcmVzaEhvc3RzIiwgInN0YXJ0TGl2ZVRhaWwiLCAic3RvcExpdmVUYWlsIiwgInJlbmRlckV2ZW50cyIsICJhY3RpdmUiLCAic3RhdHNSZXMiLCAiaG9zdHNSZXMiLCAiZXZlbnRzUmVzIiwgImhvc3RzIiwgImV2ZW50c0NvdW50IiwgInJlbmRlclRvcExpc3QiLCAiaXRlbXMiLCAiaXQiLCAiZmlsdGVyU291cmNlIiwgImZpbHRlclNldmVyaXR5IiwgImZpbHRlckhvc3QiLCAiZmlsdGVyQWN0b3IiLCAiZGVib3VuY2UiLCAicmVmcmVzaEhvc3RGaWx0ZXIiLCAicmVuZGVyRXZlbnRSb3ciLCAic2V2Q29sb3IiLCAiY3VycmVudCIsICJyZWdpc3Rlckhvc3RQcm9tcHQiLCAiZm4iLCAibXMiLCAicmVwb3MiLCAiZXNjRm4iLCAiYW5vbnltb3VzIiwgInR5cGVkIiwgIiQiLCAibG9hZGVkT25jZSIsICJlc2MiLCAiYXBpIiwgIm9wdHMiLCAic2hvd091dHB1dCIsICJsb2FkU2VydmljZXMiLCAibG9hZFJlcG9zIiwgImxvYWRKb3VybmFsIiwgInFzIiwgImxvYWRHaXRlYVJlcG9zIiwgImhvc3RFbCIsICJ0b2tFbCIsICJhbm9uRWwiLCAicnVuSW5zdGFsbCIsICJyZXBvVXJsIiwgImFyZ3NSYXciLCAiYXJncyIsICJzZXRCdXN5IiwgInR5cGVkVG9rZW4iLCAicmVxdWVzdFRva2VuIiwgImJ1c3kiLCAicnVuRGVwbG95IiwgImRpciIsICJydW5Sb2xsYmFjayIsICJydW5TdGF0dXMiLCAid2lyZSIsICJyYiIsICJzYiIsICJMT0NBVElPTl9LRVkiLCAiTEVHQUNZX0tFWSIsICJHRU9fQ0FDSEVfS0VZIiwgIlVOSVRfS0VZIiwgImdldFVuaXQiLCAiZ2V0V2VhdGhlckVsZW1lbnRzIiwgIndtb0Rlc2NyaXB0aW9ucyIsICJ3bW9JY29ucyIsICJ3aW5kRGlycyIsICJkZWdUb0RpciIsICJkZWciLCAiZ2VvY29kZUxvY2F0aW9uIiwgInF1ZXJ5IiwgImNhY2hlZCIsICJnZW8iLCAiZm9ybWF0TG9jYXRpb24iLCAiZmV0Y2hXZWF0aGVyIiwgImxvY2F0aW9uIiwgInRlbXBVbml0IiwgIndpbmRVbml0IiwgImNvZGUiLCAidXBkYXRlV2VhdGhlciIsICJ3ZWF0aGVyV2lkZ2V0IiwgIndlYXRoZXIiLCAidGVtcFN1ZmZpeCIsICJ3aW5kTGFiZWwiLCAibG9jYXRpb25JbnB1dCIsICJsb2MiLCAidW5pdFJhZGlvIiwgIm5ld1VuaXQiLCAib2xkVW5pdCIsICJ3aWRnZXQiLCAicmVuZGVyIiwgIkRBWVMiLCAiTU9OVEhTIiwgIlJPTUFOIiwgImN1cnJlbnRTdHlsZSIsICJsYXN0Q2hpbWVIb3VyIiwgImNoaW1lUGxheWluZyIsICJwcmV2RmxpcERpZ2l0cyIsICJhY3RpdmVMYXlvdXQiLCAiZGlnaXRhbFJlZnMiLCAidGlja1RpbWVyIiwgInBsYXlDaGltZXMiLCAic3RyaWtlIiwgImJlbGwiLCAibm93IiwgInJlc2V0UmVuZGVyTGF5b3V0IiwgImVuc3VyZURpZ2l0YWxMYXlvdXQiLCAicmVuZGVyRGVmYXVsdCIsICJoMjQiLCAiYW1wbSIsICJyZWZzIiwgInJlbmRlckxjZCIsICJjbHMiLCAicmVuZGVyRmxpcCIsICJkaWdpdHMiLCAiZmxpcENhcmQiLCAiZGlnaXQiLCAicmVuZGVyQmluYXJ5IiwgImJpdCIsICJjb2wiLCAib24iLCAicmVuZGVyQW5hbG9nIiwgInVzZVJvbWFuIiwgInNpemUiLCAiY3giLCAiY3kiLCAic0FuZ2xlIiwgIm1BbmdsZSIsICJoQW5nbGUiLCAibGFiZWxzIiwgImFuZ2xlIiwgInRpY2tzIiwgIm91dGVyIiwgImlubmVyIiwgIngxIiwgInkxIiwgIngyIiwgInkyIiwgInN2ZyIsICJ0aWNrIiwgIm5leHRDbGFzc05hbWUiLCAic2NoZWR1bGVOZXh0VGljayIsICJkZWxheSIsICJTVFlMRVMiLCAic3R5bGVPcHRpb25zSHRtbCIsICJjaGltZXNUb2dnbGUiLCAidm9sdW1lU2xpZGVyIiwgImxvYWRTZXR0aW5ncyIsICJldmVudEtleSIsICJzdGFydElzbyIsICJjcmVhdGVDYWNoZSIsICJtYXAiLCAid2lkZ2V0RWxzIiwgImZtdFdoZW4iLCAic3RhcnQiLCAiYWxsRGF5IiwgInRvZGF5IiwgImRheSIsICJkYXlzIiwgImRheUxhYmVsIiwgInRpbWVMYWJlbCIsICJmbXRUaW1lIiwgImRheUtleSIsICJjYWNoZSIsICJtZXJnZUV2ZW50cyIsICJsb2FkZWRJbnRlcnZhbHMiLCAid2luZG93Rm9yIiwgInZpZXciLCAiYmFzZSIsICJlbmQiLCAiY292ZXJzIiwgIml2IiwgIm1lcmdlUmFuZ2UiLCAiaXZzIiwgInJlc3QiLCAidmlld01vbnRoIiwgImxhc3RDYWNoZWQiLCAiZmV0Y2hDYWxlbmRhciIsICJmb3JjZSIsICJyZW5kZXJXaWRnZXQiLCAiZWxzIiwgInVwY29taW5nIiwgInVwY29taW5nT25seSIsICJuZXh0IiwgImV2ZW50TWFwIiwgInJlbmRlckdyaWQiLCAiYnlEYXkiLCAidG9kYXlLZXkiLCAiZmlyc3REb3ciLCAiZGF5c0luIiwgImRheUV2ZW50cyIsICJkb3RzIiwgInRpcCIsICJldmVudHMiLCAicmVuZGVyVXBjb21pbmciLCAicmVuZGVyU291cmNlcyIsICJzb3VyY2VzIiwgImVuYWJsZSIsICJyZWZyZXNoIiwgImxhc3RCb2R5IiwgIm5vd0JvZHkiLCAidmlld0JvZHkiLCAiY2FsTGFzdEZvY3VzIiwgImZvcm1DcmVkcyIsICJzZXRTdGF0dXMiLCAiY2FsQnRuIiwgImNhbFNldHRpbmdzIiwgImNhbE1vZGFsRWwiLCAibmF2aWdhdGUiLCAiZGVsdGEiLCAiY2FsUHJldiIsICJjYWxOZXh0IiwgIlBPTEwiLCAibG9hZEluZm8iLCAibG9hZENvbm5lY3Rpb25zIiwgImtleXMiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJjbGllbnQiLCAic25pcHBldCIsICJjb3B5VGV4dCIsICJva01zZyIsICJyZWZyZXNoQ2FyZEhlYWx0aCIsICJzZXJ2aWNlSWQiLCAidXB0aW1lRWwiLCAiYmFyRWwiLCAidXB0aW1lMjQiLCAiZGlzbWlzc2VkVXBkYXRlcyIsICJrbm93blVwZGF0ZXMiLCAicmVmcmVzaENhcmRVcGRhdGVzIiwgIm5vdGlmeU5ldyIsICJwcmV2IiwgInVwZCIsICJ1cGRhdGVCdG4iLCAic2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzIiwgIm9yaWdSZWZyZXNoQWxsIiwgInRoZW1lQmVmb3JlQnVpbGRlciIsICJlZGl0aW5nU2x1ZyIsICJhZHZhbmNlZE92ZXJyaWRlcyIsICJUSEVNRV9MQUJFTFMiLCAiRklFTERTIiwgInRoZW1lQnRuIiwgInRoZW1lTGFiZWwiLCAiZ2V0TGFiZWxGb3IiLCAidXNlclRoZW1lcyIsICJ1cGRhdGVMYWJlbCIsICJidWlsZEZpZWxkc0hUTUwiLCAiZ3JvdXBlZCIsICJidWlsZFN0YXJ0RnJvbU9wdGlvbnMiLCAibW9kYWxIVE1MIiwgInN0YXJ0U2VsZWN0IiwgImVkaXRTZWxlY3QiLCAiZXhpc3RpbmdTZWN0aW9uIiwgImxpZ2h0QmdDaGVjayIsICJwaWNrZXJzIiwgImFkdmFuY2VkU2VjdGlvbiIsICJhZHZhbmNlZFRvZ2dsZSIsICJhZHZhbmNlZFZpc2libGUiLCAiZ2V0Q3VycmVudENvbG9ycyIsICJnZXRCYXNlQ29sb3JzIiwgInVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQiLCAiZGVyaXZlZCIsICJoZXgiLCAibG9hZFRoZW1lSW50b1BpY2tlcnMiLCAidGhlbWVOYW1lIiwgInVwZGF0ZVByZXZpZXciLCAibG9hZFVzZXJUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lIiwgIm11dGVkIiwgImJhZGdlT2siLCAiYmFkZ2VCYWQiLCAiZG90T2siLCAiZG90QmFkIiwgImFwcGx5Q29sb3JzTGl2ZSIsICJwcm9wIiwgInJlZnJlc2hFZGl0RHJvcGRvd24iLCAic2x1Z3MiLCAicmVmcmVzaFN0YXJ0RnJvbSIsICJvcGVuQnVpbGRlciIsICJjdXN0b21pemVCdG4iLCAib2xkU2x1ZyIsICJuZXdTbHVnIiwgInRoZW1lRGF0YSIsICJhcGlDb2xvcnMiLCAic2x1Z1RvRGVsZXRlIiwgImZhbGxiYWNrIiwgImV4cG9ydERhdGEiLCAidGhlbWVDb2xvcnMiLCAidGhlbWVMaWdodEJnIiwgImNvZGVJbnB1dCIsICJhY3RpdmF0ZUJ0biIsICJkZWFjdGl2YXRlQnRuIiwgImVycm9yRWwiLCAic3VjY2Vzc0VsIiwgImJhZGdlSWNvbiIsICJiYWRnZVRleHQiLCAiZGV0YWlsc0VsIiwgImZlYXR1cmVMaXN0IiwgImFjdGl2YXRlU2VjdGlvbiIsICJjdXJyZW50U3RhdHVzIiwgImhpZGVNZXNzYWdlcyIsICJzaG93RXJyb3IiLCAic2hvd1N1Y2Nlc3MiLCAicmVuZGVyU3RhdHVzIiwgImV4cGlyeUxpbmUiLCAiZmVhdHVyZXMiLCAiYWN0aXZlRmVhdHVyZXMiLCAidXBkYXRlSGVhZGVyQmFkZ2UiLCAiYWN0aXZhdGVMaWNlbnNlIiwgImRlYWN0aXZhdGVMaWNlbnNlIiwgInRvcGJhciIsICJpY29uRWwiLCAidGV4dEVsIiwgInRpbWVFbCIsICJvcGVuTGljZW5zZU1vZGFsIiwgInRvcGJhckVsIiwgImZlYXR1cmUiLCAiVFRMX09QVElPTlMiLCAibyIsICJzZXJ2aWNlTmFtZUVsIiwgImlzc3VlZEVsIiwgImlzc3VlZFVybElucHV0IiwgImlzc3VlZENvcHlCdG4iLCAiaXNzdWVkTWV0YUVsIiwgIm91dHN0YW5kaW5nTGlzdEVsIiwgInB1YmxpY0NyZWF0ZUJ0biIsICJ0c0NyZWF0ZUJ0biIsICJ0c0VtYWlsSW5wdXQiLCAicHVibGljVHRsU2VsZWN0IiwgImN1cnJlbnRTZXJ2aWNlIiwgImFjdGl2ZVRhYiIsICJfb3JpZ2luRnJvbVBhZ2UiLCAiX2Fic1VybCIsICJ1cmxQYXRoIiwgIl9mb3JtYXRFeHBpcnkiLCAiaXNvIiwgIl9mb3JtYXRSZW1haW5pbmciLCAic2V0QWN0aXZlVGFiIiwgImlzQWN0aXZlIiwgImxvYWRPdXRzdGFuZGluZyIsICJyZW1haW5pbmciLCAicmV2b2tlU2hhcmUiLCAiaXNzdWVQdWJsaWMiLCAib3JpZ2luYWwiLCAidHRsTXMiLCAiX3JlbmRlckFwaUVycm9yIiwgImlzc3VlVGFpbHNjYWxlIiwgIm9wZW5TaGFyZU1vZGFsIl0KfQo=