[go: up one dir, main page]

Jump to content

User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper/afcrc-helper.ts

"use strict";(()=>{var X=Object.defineProperty;var C=(h,e)=>()=>(h&&(e=h(h=0)),e);var F=(h,e)=>{for(var t in e)X(h,t,{get:e[t],enumerable:!0})};var L,B=C(()=>{"use strict";L=class h extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),h.static.name="ActionsDialog",h.static.title="Actions"}initialize=()=>(OO.ui.Dialog.prototype.initialize.apply(this),mw.util.addCSS(`
.afcrc-helper-actions-container div {
margin-block: 8px;
}`),this.contentLayout=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.$body.append(this.contentLayout.$element),this.logOutput=document.createElement("div"),this.logOutput.classList.add("afcrc-helper-actions-container"),this.closeButton=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]}),this.closeButton.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,this.closeButton.$element),this);addLogEntry(e,t="notice"){let n=new OO.ui.MessageWidget({type:t,inline:!0,label:new OO.ui.HtmlSnippet(e)});this.logOutput.append(n.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();let e=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});e.on("click",()=>window.location.reload()),this.contentLayout.$element.append(e.$element)}};Object.assign(L.prototype,OO.ui.Dialog.prototype)});var E,V=C(()=>{"use strict";B();E=class h extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;beforeText;pageContent;parsedRequests;editsCreationsToMake=[];constructor(e,t,n){super({size:"large"}),h.static.name="AfcrcHelperDialog",h.static.title="afcrc-helper",h.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=t,this.requestPageType=e,this.createdPageWatchMethod=n&&["nochange","preferences","unwatch","watch"].includes(n)?n:"preferences",document.body.classList.add("afcrc-helper-open"),mw.util.addCSS(`
body.afcrc-helper-open #mw-teleport-target {
    z-index: 500;
}

.afcrc-helper-request {
    margin: 10px;
    border-radius: 5px;
    background-color: #eee;
    padding: 5px;
    color: #202122;
}

.afcrc-helper-request summary {
    cursor: pointer;
}

.afcrc-helper-target-editor {
    min-width: 1ch;
    max-width: calc(100% - 4ch);
    font-family: monospace;
}

.afcrc-helper-external-link {
    text-decoration: none !important;
}

.afcrc-helper-external-link svg {
    display: inline-block;
    width: 1em;
    height: 1em;
    fill: currentColor;
}

.afcrc-helper-request-info,
.afcrc-helper-request-responder {
    margin: 5px;
}

.afcrc-helper-request-info > div,
.afcrc-helper-request-responder > div {
    margin-block: 8px;
}

.afcrc-helper-request-responder > div:last-of-type {
    margin-bottom: 0;
}

.afcrc-helper-request-responder .oo-ui-fieldLayout {
    margin-left: 8px;
}

.afcrc-helper-request-responder .oo-ui-fieldLayout-header {
    width: max-content;
}

.afcrc-helper-action-radio {
    margin-top: 8px;
}

.afcrc-helper-action-radio .oo-ui-radioOptionWidget {
    display: inline;
    padding: 8px;
}

.afcrc-closing-reason-input,
.afcrc-comment-input {
    max-width: 50%;
}

.afcrc-helper-template-parameters-container,
.afcrc-helper-template-parameters-container details {
    margin-block: 10px;
    border: 1px solid #a2a9b1;
    border-radius: 2px;
    background-color: white;
    padding: 5px;
}

.afcrc-helper-template-parameters-container {
    margin-left: 8px;
}

.afcrc-helper-template-parameters-container summary {
    cursor: pointer;
    font-weight: bold;
}

.afcrc-helper-template-parameters-container details {
    margin-block: 5px;
    background-color: #e2e2e2;
}

#afcrc-helper-no-templates-message {
    padding: 5px;
}`)}getActionProcess=e=>!e||e==="cancel"?new OO.ui.Process(()=>{this.parsedRequests.length>0?OO.ui.confirm("Are you sure you want to close? All changes will be discarded.").then(t=>t?this.close():null):this.close()}):e==="save"?new OO.ui.Process(()=>{this.performActions()}):h.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>h.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty(),document.body.classList.remove("afcrc-helper-open")});async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle});this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()}parseRequests(){this.beforeText=/^(.*?)==/s.exec(this.pageContent)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");let e=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(t=>t[0]);for(let t of e){if(/{{afc-c\|/i.test(t))continue;let s=/^==(.*?)==$/m.exec(t)[1].trim();this.parseSubtypeRequests(t,s)}}loadInputElements(){if(this.parsedRequests.length>0){let e=0,t=()=>{let s=Math.min(e+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${e+1}-${s}/${this.parsedRequests.length} requests)`);for(let o=e;o<s;o++)this.loadSubtypeElements(o);s<this.parsedRequests.length?(e=s,setTimeout(t,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};t()}else{let e=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),t=new OO.ui.PanelLayout({padded:!0,expanded:!1});t.$element.append(e.$element),this.$body.append(t.$element),this.updateSize()}}async performActions(){let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let t=new L;e.addWindows([t]),t.open();let n={accepted:0,denied:0,"commented on":0,closed:0},s=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle})).query.pages[0].revisions[0].slots.main.content.trim();this.performSubtypeActions(t,n,s)}formatDeniedReason(e){let t=e.startsWith("autofill:")?/autofill:(\w+)/.exec(e)[1]:`decline|2=${e}`,n=e.startsWith("autofill:")&&e.includes(",")?" "+e.slice(e.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${t}}}${n}`}mapDeniedReasons(e,t,n){if(t)return`* ${this.formatDeniedReason(e[0][1])} ~~~~`;let s={};for(let[i,a]of e)s[a]||(s[a]=[]),s[a].push(i);let o=Object.entries(s);return o.map(([i,a])=>`* ${this.formatDeniedReason(i)}${o.length>1||!n?` (${a.map(c=>`[[${c}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(e,t,n){if(t)return`* {{AfC comment|1=${e[0][1]}}} ~~~~`;let s={};for(let[i,a]of e)s[a]||(s[a]=[]),s[a].push(i);let o=Object.entries(s);return o.map(([i,a])=>`* {{AfC comment|1=${i}}}${o.length>1||!n?` (${a.map(c=>`[[${c}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(e,{prepend:t,append:n}){let{fullSectionText:s,sectionText:o}=e;return t&&(e.sectionText=t+`
`+e.sectionText),n&&(e.sectionText+=`
`+n),e.fullSectionText=e.fullSectionText.replace(o,e.sectionText),e.pageText=e.pageText.replace(s,e.fullSectionText),e}async makeAllEditsCreations(e){for(let t of this.editsCreationsToMake){let n=t.type==="edit"?this.api.edit(t.title,t.transform):this.api.create(t.title,{summary:t.summary,watchlist:this.createdPageWatchMethod},t.text),s=document.createElement("a");s.target="_blank",s.href=mw.util.getUrl(t.title,"isRedirect"in t&&t.isRedirect?{redirect:"no"}:void 0),s.textContent=t.title,e.addLogEntry(`${t.type==="edit"?"Editing":"Creating"} ${s.outerHTML}...`),await n.catch(async(o,i)=>{o==="ratelimited"?(e.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(a=>setTimeout(a,7e4)),e.addLogEntry("Continuing...","success"),await n.catch((a,c)=>{e.addLogEntry(`Error ${t.type==="edit"?"editing":"creating"} ${s.outerHTML}: ${c?.error.info??"Unknown error"} (${a}).`,"error")})):e.addLogEntry(`Error ${t.type==="edit"?"editing":"creating"} ${s.outerHTML}: ${i?.error.info??"Unknown error"} (${o}).`,"error")})}}parseSubtypeRequests(e,t){throw new Error("Not implemented.")}loadSubtypeElements(e){throw new Error("Not implemented.")}updateRequestColor(e,t){throw new Error("Not implemented.")}async performSubtypeActions(e,t,n){throw new Error("Not implemented.")}};Object.assign(E.prototype,OO.ui.ProcessDialog.prototype)});var S,z=C(()=>{"use strict";S=class{titleIndex;title;detailsElement;responderElement;dialog;templateParametersEditor;templateEditorsInfo=[];commentInput;tagSelectLayout;denyReasonLayout;closingReasonLayout;commentLayout;constructor(e,t,n,s,o){this.titleIndex=e,this.title=t,this.detailsElement=n,this.responderElement=s,this.dialog=o}setup(){let e=document.createElement("div"),t=document.createElement("b");t.textContent=this.title,e.append(t);let n=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(s=>new OO.ui.RadioOptionWidget({data:s,label:s}))});n.selectItemByLabel("None"),n.on("choose",s=>this.handleActionChange(s)),this.loadCommentLayout(),e.append(n.$element[0],this.commentLayout.$element[0]),this.responderElement.append(e)}handleActionChange(e){setTimeout(()=>this.dialog.updateSize(),0);let t=e.getData().toLowerCase();switch(this.updateActionsToTake({action:t}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex),this.tagSelectLayout&&this.tagSelectLayout.$element.hide(),this.templateParametersEditor&&(this.templateParametersEditor.style.display="none"),this.denyReasonLayout&&this.denyReasonLayout.$element.hide(),this.closingReasonLayout&&this.closingReasonLayout.$element.hide(),t){case"accept":{(!this.tagSelectLayout||!this.templateParametersEditor)&&this.loadTagSelectAndParametersEditor(),this.tagSelectLayout.$element.show(),this.templateParametersEditor.style.display="block";break}case"deny":{this.denyReasonLayout||this.loadDenyReasonLayout(),this.denyReasonLayout.$element.show();break}case"close":{this.closingReasonLayout||this.loadClosingReasonLayout(),this.closingReasonLayout.$element.show();break}}if(["accept","comment","close"].includes(t)){this.commentLayout.$element.show();let n=this.commentInput.getValue().trim();n?this.updateActionsToTake({comment:n}):this.updateActionsToTake({comment:void 0})}else this.commentLayout.$element.hide(),this.updateActionsToTake({comment:void 0})}loadTagSelectAndParametersEditor(){let e=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.dialog.redirectTemplates).map(([s,{redirect:o}])=>{if(!o)return{data:s,label:s};let i=new OO.ui.HtmlSnippet(`${s} <i>(redirect with possibilities)</i>`);return{data:s,label:i}})});e.getMenu().filterMode="substring",e.on("change",()=>{let s=e.getValue().sort((i,a)=>i.toLowerCase().localeCompare(a.toLowerCase()));e.getValue().join(";")!==s.join(";")&&e.setValue(s),this.updateActionsToTake({redirectTemplates:s});let o=0;for(let i of this.templateEditorsInfo){let a=s.includes(i.name);i.details.style.display=a?"block":"none",a&&o++}t.textContent=`Template parameters (${o>0?`for ${o} template${o>1?"s":""}`:"none to show"})`,n.style.display=o>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(e,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),this.commentLayout.$element[0].before(this.tagSelectLayout.$element[0]),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("afcrc-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[s,o]of Object.entries(this.dialog.redirectTemplates)){let i=Object.entries(o.parameters);if(i.length===0)continue;let a=document.createElement("details");a.style.display="none";let c=document.createElement("summary");c.textContent=s,a.append(c);let u={name:s,details:a,parameters:[]};for(let[p,d]of i){let m=new OO.ui.TextInputWidget({placeholder:d.default?.toString(),required:d.required}),T=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${p}${!d.label||p.toLowerCase()===d.label?.toLowerCase()?"":` (${d.label})`}${d.description?` (${d.description})`:""} (type: ${d.type}) ${d.suggested?" (suggested)":""}${d.example?` (example: "${d.example}")`:""}`),align:"inline"});a.append(T.$element[0]),u.parameters.push({name:p,aliases:d.aliases,editor:m})}this.templateParametersEditor.append(a),this.templateEditorsInfo.push(u)}this.updateActionsToTake({redirectTemplateParameters:this.templateEditorsInfo});let n=document.createElement("div");n.id="afcrc-helper-no-templates-message",n.textContent="No templates with parameters to display!",this.templateParametersEditor.append(n),this.commentLayout.$element[0].before(this.templateParametersEditor)}loadDenyReasonLayout(){let e=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing pages"],["empty","empty submissions"],["notarget","nonexistent or no provided target"],["notitle","no title provided"],["unlikely","unlikely redirects"],["notredirect","article creation requests"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([t,n])=>({data:`autofill:${t}`,label:`Autofilled text for ${n}`}))});e.on("change",t=>{this.updateActionsToTake({denyReason:t||"autofill:unlikely"})}),e.setValue("autofill:unlikely"),e.getMenu().selectItemByData("autofill:unlikely"),this.denyReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'}),this.denyReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.denyReasonLayout.$element[0])}loadClosingReasonLayout(){let e=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([t,n])=>new OO.ui.MenuOptionWidget({data:n,label:t}))}});e.getMenu().selectItemByData("r"),e.getMenu().on("choose",t=>{this.updateActionsToTake({closingReason:{name:t.getLabel(),id:t.getData()}}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex)}),this.closingReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Closing reason:"}),this.closingReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.closingReasonLayout.$element[0])}loadCommentLayout(){this.commentInput=new OO.ui.TextInputWidget,this.commentInput.on("change",e=>{let t=e.trim();t?this.updateActionsToTake({comment:t}):this.updateActionsToTake({comment:void 0})}),this.commentLayout=new OO.ui.FieldLayout(this.commentInput,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"}),this.commentLayout.$element.hide()}updateActionsToTake(e){Object.assign(this.dialog.actionsToTake[this.titleIndex].requests[this.title],e)}}});var Q={};F(Q,{default:()=>N});var N,_=C(()=>{"use strict";V();z();N=class extends E{redirectTemplates;parsedRequests=[];actionsToTake=[];async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"});this.redirectTemplates=JSON.parse(e.query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}"),super.load()}parseSubtypeRequests(e,t){let n={},s=[...t.matchAll(/\[\[(.*?)]]/g)].map(c=>c[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(s.length===0)return;n.pages=s;let o=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!o)return;n.target=o,n.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",n.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let i=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${n.source?`|${n.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),a=i?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(i)?.[1].trim():null;n.requester=i&&a?{type:/\[\[User( talk)?:/.test(i)?"user":"ip",name:a}:null,this.parsedRequests.push(n),this.actionsToTake.push({target:n.target,requests:Object.fromEntries(s.map(c=>[c,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=t.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",s.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});let o=document.createElement("input");o.classList.add("afcrc-helper-target-editor"),o.style.width=`${t.target.length}ch`,o.value=t.target,o.addEventListener("input",()=>{o.value=o.value.replaceAll("_"," "),o.style.width=`${o.value.length}ch`,this.actionsToTake[e].target=o.value,i.href=mw.util.getUrl(o.value)}),s.append(o);let i=document.createElement("a");i.classList.add("afcrc-helper-external-link"),i.target="_blank",i.href=mw.util.getUrl(t.target),i.innerHTML=`
<svg viewbox="0 0 48 48">
<path d="M36 24c-1.2 0-2 0.8-2 2v12c0 1.2-0.8 2-2 2h-22c-1.2
    0-2-0.8-2-2v-22c0-1.2 0.8-2 2-2h12c1.2 0 2-0.8 2-2s-0.8-2-2-2h-12c-3.4
    0-6 2.6-6 6v22c0 3.4 2.6 6 6 6h22c3.4 0 6-2.6
    6-6v-12c0-1.2-0.8-2-2-2z"></path>
<path d="M43.8 5.2c-0.2-0.4-0.6-0.8-1-1-0.2-0.2-0.6-0.2-0.8-0.2h-12c-1.2
    0-2 0.8-2 2s0.8 2 2 2h7.2l-18.6 18.6c-0.8 0.8-0.8 2 0 2.8 0.4 0.4 0.8
    0.6 1.4 0.6s1-0.2 1.4-0.6l18.6-18.6v7.2c0 1.2 0.8 2 2 2s2-0.8
    2-2v-12c0-0.2 0-0.6-0.2-0.8z"></path>
</svg>`,s.append(i),n.append(s);let a=document.createElement("div");a.classList.add("afcrc-helper-request-info");let c=document.createElement("span");c.style.color="dimgray",c.textContent="None";let u=document.createElement("span");u.style.color="dimgray",u.textContent="Unknown";let p=document.createElement("div"),d=document.createElement("b");d.textContent="Reason: ",p.append(d),t.reason?p.append(t.reason):p.append(c.cloneNode(!0)),a.append(p);let m=document.createElement("div"),T=document.createElement("b");T.textContent="Source: ",m.append(T),t.source?m.append(t.source):m.append(c.cloneNode(!0)),a.append(m);let b=document.createElement("div"),R=document.createElement("b");if(R.textContent="Requester: ",b.append(R),t.requester){let l=document.createElement("a");l.target="_blank",l.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),l.textContent=t.requester.name,b.append(l)}else b.append(u.cloneNode(!0));a.append(b),n.append(a),n.append(document.createElement("hr"));let g=document.createElement("div");g.classList.add("afcrc-helper-request-responder");for(let l of t.pages)new S(e,l,n,g,this).setup();n.append(g),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let n=Object.values(this.actionsToTake[t].requests),s=n.every(c=>c.action==="accept"||c.action==="deny"),o=n.find(c=>c.action==="close")?.closingReason?.id,i=n.every(c=>c.action==="close"&&c.closingReason?.id===o),a="";if(s){let c=n.filter(p=>p.action==="accept").length,u=n.filter(p=>p.action==="deny").length;c>0&&u>0?a="#fff17e":c>0?a="#a0ffa0":a="#ffcece"}else i&&(o==="r"?a="#ffcece":o==="s"?a="#90c090":a="#b8b8b8");e.style.backgroundColor=a}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>Object.values(o.requests).some(i=>i.action!=="none"))){for(let{target:i,requests:a}of this.actionsToTake){let c=Object.values(a).some(l=>l.action==="accept"||l.action==="deny"),u=Object.values(a).every(l=>l.action==="accept"||l.action==="deny"),p=Object.values(a).find(l=>l.action==="close")?.closingReason?.id,d=Object.values(a).every(l=>l.action==="close"&&l.closingReason?.id===p),m=[],T=[],b=[],R=Object.keys(a).length;for(let[l,y]of Object.entries(a))switch(y.action){case"accept":{c&&!u?e.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${l}" will be ignored.`,"warning"):(m.push(l),y.comment&&b.push([l,y.comment]),t.accepted++);break}case"deny":{c&&!u?e.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${l}" is being ignored.`,"warning"):(T.push([l,y.denyReason]),t.denied++);break}case"comment":{y.comment?(b.push([l,y.comment]),t["commented on"]++):e.addLogEntry(`The request to create "${l}" \u2192 "${i}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{d?(y.comment&&b.push([l,y.comment]),t.closed++):e.addLogEntry(`Not all requests to "${i}" were closed with the same reason, the handling of "${l}" is being ignored.`,"warning");break}}let g={pageText:n,...Object.values(a)[0].originalText};if(b.length>0&&(g=this.modifySectionData(g,{append:this.mapComments(b,R===1,b.length===R)})),u){let l;if(m.length>0&&T.length>0){l="p";let y=`* {{subst:AfC redirect}} (${m.map(O=>`[[${O}]]`).join(", ")}) ~~~~`,q=this.mapDeniedReasons(T,!1,!1);for(let O of m)this.handleAcceptedRedirect(O,a[O],i);g=this.modifySectionData(g,{append:`${y}
${q}`})}else if(m.length>0){l="a";for(let y of m)this.handleAcceptedRedirect(y,a[y],i);g=this.modifySectionData(g,{append:`* {{subst:AfC redirect${m.length>1?"|all":""}}} ~~~~`})}else l="d",g=this.modifySectionData(g,{append:this.mapDeniedReasons(T,R===1,!0)});g=this.modifySectionData(g,{prepend:`{{AfC-c|${l}}}`,append:"{{AfC-c|b}}"})}else d&&(g=this.modifySectionData(g,{prepend:`{{AfC-c|${p}}}`,append:"{{AfC-c|b}}"}));n=g.pageText}if(this.beforeText+this.pageContent===n)return e.addLogEntry("No requests have been handled (page content identical)!");let o=Object.entries(t).filter(([,i])=>i>0).map(([i,a])=>`${i} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC redirect requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedRedirect(e,t,n){let s=t.redirectTemplates&&t.redirectTemplates.length>0?t.redirectTemplates.map(i=>{let a=t.redirectTemplateParameters?.find(p=>p.name===i);if(!a)return`{{${i}}}`;let c=a.parameters.findLastIndex((p,d)=>p.name===(d+1).toString()&&p.editor.getValue().trim()),u=a.parameters.map((p,d)=>{let m=p.editor.getValue().trim();return!m&&d>c?null:`|${p.name===(d+1).toString()?"":`${p.name}=`}${m}`}).filter(Boolean).join("");return`{{${i}${u}}}`}):null,o=mw.Title.newFromText(e);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:o.getPrefixedText(),text:`#REDIRECT [[${n}]]${s?`

{{Redirect category shell|
${s.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${n}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:o.getTalkPage().getPrefixedText(),text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`})}}});var x,J=C(()=>{"use strict";x=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:n?.getMainText()??e,generator:"allpages",prop:"categories"}).catch(()=>null).then(s=>{if(s?.query?.pages){let o=s.query.pages.filter(i=>!i.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(i=>{let a=i.title.split(":")[1];return{data:a,label:a}});this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(x.prototype,OO.ui.mixin.LookupElement.prototype)});var v,G=C(()=>{"use strict";v=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:n?.getNamespaceId()??0,gapprefix:n?.getMainText()??e,generator:"allpages"}).catch(()=>null).then(s=>{if(s?.query?.pages){let o=s.query.pages.map(i=>({data:i.title,label:i.title}));this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(v.prototype,OO.ui.mixin.LookupElement.prototype)});var Y={};F(Y,{default:()=>U});var U,K=C(()=>{"use strict";J();V();G();U=class extends E{parsedRequests=[];actionsToTake=[];parseSubtypeRequests(e,t){let n={},s=/:?Category:(.*?)(]]|$)/.exec(t)?.[1].trim();if(!s)return;n.category=s.replaceAll("_"," "),n.examples=[...(/example pages which belong to this category:(.*?)(parent category\/categories:|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(u=>u[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],n.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(u=>u[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];let o=e.indexOf("[[User:"),i=e.indexOf("[[User talk:"),a=e.indexOf("[[Special:Contributions/"),c=Math.min(...[o,i,a].filter(u=>u!==-1));n.requester=c===Number.POSITIVE_INFINITY?null:c===a?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[1].trim()},n.requester?.name||(n.requester=null),this.parsedRequests.push(n),this.actionsToTake.push({category:n.category,examples:n.examples,parents:n.parents,originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=`<b>Category:${t.category}</b>`,n.append(s);let o=document.createElement("div");o.classList.add("afcrc-helper-request-info");let i=document.createElement("span");i.style.color="dimgray",i.textContent="None";let a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";let c=document.createElement("div"),u=document.createElement("b");if(u.textContent="Examples: ",c.append(u),t.examples.length>0)for(let[r,f]of t.examples.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(f),w.textContent=f,c.append(w),r!==t.examples.length-1&&c.append(", ")}else c.append(i.cloneNode(!0));o.append(c);let p=document.createElement("div"),d=document.createElement("b");if(d.textContent="Parents: ",p.append(d),t.parents.length>0)for(let[r,f]of t.parents.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(`Category:${f}`),w.textContent=f,p.append(w),r!==t.parents.length-1&&p.append(", ")}else p.append(i.cloneNode(!0));o.append(p);let m=document.createElement("div"),T=document.createElement("b");if(T.textContent="Requester: ",m.append(T),t.requester){let r=document.createElement("a");r.target="_blank",r.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),r.textContent=t.requester.name,m.append(r)}else m.append(a.cloneNode(!0));o.append(m),n.append(o),n.append(document.createElement("hr"));let b=document.createElement("div");b.classList.add("afcrc-helper-request-responder");let R=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(r=>new OO.ui.RadioOptionWidget({data:r,label:r}))});R.selectItemByLabel("None"),R.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let r=R.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[e].action=r,["comment","close"].includes(r)){j.$element.show();let f=I.getValue().trim();f?this.actionsToTake[e].comment=f:delete this.actionsToTake[e].comment}else j.$element.hide(),delete this.actionsToTake[e].comment;switch(this.updateRequestColor(n,e),q.$element.hide(),P.$element.hide(),M.$element.hide(),D.$element.hide(),r){case"accept":{q.$element.show(),P.$element.show();break}case"deny":{M.$element.show();break}case"close":{D.$element.show();break}}});let g=new v({placeholder:"Add pages here"});g.on("change",()=>{let r=g.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^:/,""),r.length>0&&g.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),g.on("showing-values",r=>{for(let f of r)l.addAllowedValue(f.data)});let l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:g});l.on("change",()=>{let r=l.getValue().sort((f,w)=>f.toLowerCase().localeCompare(w.toLowerCase()));l.getValue().join(";")!==r.join(";")&&l.setValue(r),this.actionsToTake[e].examples=r});let{examples:y}=this.actionsToTake[e];for(let r of y)l.addAllowedValue(r);l.setValue(y);let q=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});q.$element.hide();let O=new x({placeholder:"Add categories here"});O.on("change",()=>{let r=O.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&O.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),O.on("showing-values",r=>{for(let f of r)k.addAllowedValue(f.data)});let k=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:O});k.on("change",()=>{let r=k.getValue().sort((f,w)=>f.toLowerCase().localeCompare(w.toLowerCase()));k.getValue().join(";")!==r.join(";")&&k.setValue(r),this.actionsToTake[e].parents=r});let{parents:H}=this.actionsToTake[e];for(let r of H)k.addAllowedValue(r);k.setValue(H);let P=new OO.ui.FieldLayout(k,{align:"inline",label:"Categories:"});P.$element.hide();let A=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing categories"],["empty","empty submissions"],["unlikely","categories that are unlikely to have enough pages"],["notcategory","page creation requests"],["notenglish","requests not in English"]].map(([r,f])=>({data:`autofill:${r}`,label:`Autofilled text for ${f}`}))});A.on("change",()=>{this.actionsToTake[e].denyReason=A.getValue()||"autofill:unlikely"}),A.setValue("autofill:unlikely"),A.getMenu().selectItemByData("autofill:unlikely");let M=new OO.ui.FieldLayout(A,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});M.$element.hide();let W=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([r,f])=>new OO.ui.MenuOptionWidget({data:f,label:r}))}});W.getMenu().on("choose",()=>{let r=W.getMenu().findSelectedItem();this.actionsToTake[e].closingReason={name:r.getLabel(),id:r.getData()},this.updateRequestColor(n,e)}),W.getMenu().selectItemByData("r"),this.actionsToTake[e].closingReason={name:"No response",id:"r"};let D=new OO.ui.FieldLayout(W,{align:"inline",label:"Closing reason:"});D.$element.hide();let I=new OO.ui.TextInputWidget;I.on("change",()=>{let r=I.getValue().trim();r?this.actionsToTake[e].comment=r:delete this.actionsToTake[e].comment});let j=new OO.ui.FieldLayout(I,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});j.$element.hide(),b.append(R.$element[0],q.$element[0],P.$element[0],M.$element[0],D.$element[0],j.$element[0]),n.append(b),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let{action:n}=this.actionsToTake[t],s="";n==="accept"?s="#a0ffa0":n==="deny"?s="#ffcece":n==="close"&&(this.actionsToTake[t].closingReason?.id==="r"?s="#ffcece":this.actionsToTake[t].closingReason?.id==="s"?s="#90c090":s="#b8b8b8"),e.style.backgroundColor=s}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>o.action!=="none")){for(let i of this.actionsToTake){let a={pageText:n,...i.originalText};switch(i.action){case"accept":{a=this.modifySectionData(a,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(i),t.accepted++;break}case"deny":{a=this.modifySectionData(a,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(i.denyReason)} ~~~~
{{AfC-c|b}}`}),t.denied++;break}case"comment":{i.comment?(a=this.modifySectionData(a,{append:`* {{AfC comment|1=${i.comment}}} ~~~~`}),t["commented on"]++):e.addLogEntry(`The request to create "${i.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{a=this.modifySectionData(a,{prepend:`{{AfC-c|${i.closingReason.id}}}`,append:(i.comment?`* {{AfC comment|1=${i.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),t.closed++;break}}n=a.pageText}if(this.beforeText+this.pageContent===n)return e.addLogEntry("No requests have been handled (page content identical)!");let o=Object.entries(t).filter(([,i])=>i>0).map(([i,a])=>`${i} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC category requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedCategory(e){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${e.category}`,text:e.parents.map(t=>`[[Category:${t}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${e.category}`,text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`},...e.examples.map(t=>({type:"edit",title:t,transform:({content:n})=>({text:`${n}
[[Category:${e.category}]]`,summary:`Adding page to [[:Category:${e.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}}});mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],async()=>{let{default:h}=await Promise.resolve().then(()=>(_(),Q)),{default:e}=await Promise.resolve().then(()=>(K(),Y)),t=mw.config.get("wgPageName").replaceAll("_"," "),n=t==="Wikipedia:Articles for creation/Redirects";if(!n&&!(t==="Wikipedia:Articles for creation/Categories"))return;let o=n?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${o} creation requests`,"afcrc-helper").addEventListener("click",a=>{a.preventDefault();let c=new OO.ui.WindowManager;document.body.append(c.$element[0]);let u=o==="redirect"?h:e,p=new u(o,t,window.afcrcConfiguration?.createdPageWatchMethod);c.addWindows([p]),p.open(),p.load()})});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvc2hvdy1hY3Rpb25zLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9oZWxwZXItZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlci50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdHMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL2NhdGVnb3J5LWlucHV0LXdpZGdldC50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9wYWdlLWlucHV0LXdpZGdldC50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yaWVzLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBhY3Rpb24gZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgY2xvc2VCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWN0aW9uc0RpYWxvZyc7XG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG5tYXJnaW4tYmxvY2s6IDhweDtcbn1gKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1JlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgIHJlbG9hZEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oQWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpRWRpdFBhZ2VQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBNZWRpYVdpa2lEYXRhRXJyb3IsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kOiBXYXRjaE1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLW9wZW4nKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhgXG5ib2R5LmFmY3JjLWhlbHBlci1vcGVuICNtdy10ZWxlcG9ydC10YXJnZXQge1xuICAgIHotaW5kZXg6IDUwMDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3Ige1xuICAgIG1pbi13aWR0aDogMWNoO1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNGNoKTtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3ZnIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciB7XG4gICAgbWFyZ2luOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvID4gZGl2LFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciA+IGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXY6bGFzdC1vZi10eXBlIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dCB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQtaGVhZGVyIHtcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIC5vby11aS1yYWRpb09wdGlvbldpZGdldCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIHBhZGRpbmc6IDhweDtcbn1cblxuLmFmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0LFxuLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLFxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2EyYTliMTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xufVxuXG4jYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlIHtcbiAgICBwYWRkaW5nOiA1cHg7XG59YCk7XG4gICAgfVxuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24gPT09ICdjYW5jZWwnKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBPTy51aVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZT8gQWxsIGNoYW5nZXMgd2lsbCBiZSBkaXNjYXJkZWQuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChjb25maXJtZWQpID0+IChjb25maXJtZWQgPyB0aGlzLmNsb3NlKCkgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnc2F2ZScpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUFjdGlvbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIHJldHVybiBIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdhZmNyYy1oZWxwZXItb3BlbicpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQ7XG5cbiAgICAgICAgdGhpcy5wYWdlQ29udGVudCA9IHBhZ2VSZXZpc2lvbi5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZXF1ZXN0cyBmcm9tIHRoZSBwYWdlIGNvbnRlbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RzKCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRleHQgPSAvXiguKj8pPT0vcy5leGVjKHRoaXMucGFnZUNvbnRlbnQpIVsxXTtcblxuICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbLi4udGhpcy5wYWdlQ29udGVudC5tYXRjaEFsbCgvXj09Lio/PT0kKFxccyooPyE9PVtePV0pLiopKi9naW0pXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFswXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uVGV4dCBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IC9ePT0oLio/KT09JC9tLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgIHRoaXMucGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQsIHNlY3Rpb25IZWFkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihpbmRleCArIGJhdGNoU2l6ZSwgdGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKGxvYWRpbmcgJHtpbmRleCArIDF9LSR7ZW5kSW5kZXh9LyR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzKWAsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YkluZGV4ID0gaW5kZXg7IHN1YkluZGV4IDwgZW5kSW5kZXg7IHN1YkluZGV4KyspIHRoaXMubG9hZFN1YnR5cGVFbGVtZW50cyhzdWJJbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZSwgMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBgYWZjcmMtaGVscGVyICgke3RoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RofSByZXF1ZXN0cyBsb2FkZWQpYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGhhbmRsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ25vdGljZScsIGxhYmVsOiAnTm8gdmFsaWQgcmVxdWVzdHMgdG8gaGFuZGxlIScgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIG1lc3NhZ2VXaWRnZXRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQobWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BY3Rpb25zKCkge1xuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2hvd0FjdGlvbnNEaWFsb2cgPSBuZXcgQWN0aW9uc0RpYWxvZygpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dBY3Rpb25zRGlhbG9nXSk7XG4gICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLm9wZW4oKTtcblxuICAgICAgICBjb25zdCBjb3VudHMgPSB7ICdhY2NlcHRlZCc6IDAsICdkZW5pZWQnOiAwLCAnY29tbWVudGVkIG9uJzogMCwgJ2Nsb3NlZCc6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICBjb25zdCBuZXdQYWdlVGV4dCA9IChcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB0aGlzLnBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhzaG93QWN0aW9uc0RpYWxvZywgY291bnRzLCBuZXdQYWdlVGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIHJlcXVlc3QgZGVuaWFsIHJlYXNvbiB0byBhIHt7c3Vic3Q6QWZDIHJlZGlyZWN0L2NhdGVnb3J5fX0gY2FsbC5cbiAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gdG8gZm9ybWF0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmb3JtYXREZW5pZWRSZWFzb24ocmVhc29uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJhbWV0ZXJzID0gcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpID8gL2F1dG9maWxsOihcXHcrKS8uZXhlYyhyZWFzb24pIVsxXSA6IGBkZWNsaW5lfDI9JHtyZWFzb259YDtcblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVhc29uaW5nID1cbiAgICAgICAgICAgIHJlYXNvbi5zdGFydHNXaXRoKCdhdXRvZmlsbDonKSAmJiByZWFzb24uaW5jbHVkZXMoJywnKSA/ICcgJyArIHJlYXNvbi5zbGljZShyZWFzb24uaW5kZXhPZignLCcpICsgMSkudHJpbSgpIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIGB7e3N1YnN0OkFmQyAke3RoaXMucmVxdWVzdFBhZ2VUeXBlfXwke3RlbXBsYXRlUGFyYW1ldGVyc319fSR7YWRkaXRpb25hbFJlYXNvbmluZ31gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgYSBncm91cCBvZiBkZW5pZWQgcmVhc29ucy5cbiAgICAgKiBAcGFyYW0gZGVuaWVkUGFnZXMgVGhlIHBhZ2VzIHRvIG1hcC5cbiAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYWxsUmVxdWVzdHMgV2hldGhlciBhbGwgcmVxdWVzdHMgYXJlIGJlaW5nIG1hcHBlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlczogc3RyaW5nW11bXSwgc2luZ3VsYXJSZXF1ZXN0OiBib29sZWFuLCBhbGxSZXF1ZXN0czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihkZW5pZWRQYWdlc1swXVsxXSl9IH5+fn5gO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIHJlYXNvbl0gb2YgZGVuaWVkUGFnZXMpIHtcbiAgICAgICAgICAgIGlmICghcmVhc29uc1tyZWFzb25dKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbil9JHtyZWFzb25zQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICBjb25zdCBjb21tZW50TWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSkgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdID0gW107XG4gICAgICAgICAgICBjb21tZW50TWVzc2FnZXNbY29tbWVudF0ucHVzaChwYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjb21tZW50TWVzc2FnZXMpO1xuXG4gICAgICAgIHJldHVybiBjb21tZW50c0FycmF5XG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChbY29tbWVudCwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50fX19JHtjb21tZW50c0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgYSBnaXZlbiBzZWN0aW9uIHRleHQgd2l0aCBwcmVwZW5kZWQgYW5kIGFwcGVuZGVkIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25EYXRhIFRoZSBzZWN0aW9uIGRhdGEuXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLnByZXBlbmQgVGhlIHRleHQgdG8gcHJlcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLmFwcGVuZCBUaGUgdGV4dCB0byBhcHBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbW9kaWZ5U2VjdGlvbkRhdGEoXG4gICAgICAgIHNlY3Rpb25EYXRhOiB7IHBhZ2VUZXh0OiBzdHJpbmcgfSAmIFJlcXVlc3RBY3Rpb25bJ29yaWdpbmFsVGV4dCddLFxuICAgICAgICB7IHByZXBlbmQsIGFwcGVuZCB9OiB7IHByZXBlbmQ/OiBzdHJpbmc7IGFwcGVuZD86IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgICBjb25zdCB7IGZ1bGxTZWN0aW9uVGV4dDogb2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogb2xkU2VjdGlvblRleHQgfSA9IHNlY3Rpb25EYXRhO1xuXG4gICAgICAgIGlmIChwcmVwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCA9IHByZXBlbmQgKyAnXFxuJyArIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0O1xuICAgICAgICBpZiAoYXBwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCArPSAnXFxuJyArIGFwcGVuZDtcblxuICAgICAgICBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQgPSBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQucmVwbGFjZShvbGRTZWN0aW9uVGV4dCwgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQpO1xuXG4gICAgICAgIHNlY3Rpb25EYXRhLnBhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQucmVwbGFjZShvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHNlY3Rpb25EYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGFsbCBlZGl0cyBhbmQgY3JlYXRpb25zIHRoYXQgbmVlZCB0byBiZSBtYWRlLlxuICAgICAqIEBwYXJhbSBzaG93QWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGxvZyB0aGUgcmVzdWx0cyB0by5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBBY3Rpb25zRGlhbG9nKSB7XG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwaUZ1bmN0aW9uID1cbiAgICAgICAgICAgICAgICBhY3Rpb24udHlwZSA9PT0gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5hcGkuZWRpdChhY3Rpb24udGl0bGUsIGFjdGlvbi50cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5hcGkuY3JlYXRlKGFjdGlvbi50aXRsZSwgeyBzdW1tYXJ5OiBhY3Rpb24uc3VtbWFyeSwgd2F0Y2hsaXN0OiB0aGlzLmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QgfSwgYWN0aW9uLnRleHQpO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGFjdGlvbi50aXRsZSwgJ2lzUmVkaXJlY3QnIGluIGFjdGlvbiAmJiBhY3Rpb24uaXNSZWRpcmVjdCA/IHsgcmVkaXJlY3Q6ICdubycgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGFjdGlvbi50aXRsZTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoYCR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfS4uLmApO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goYXN5bmMgKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdyYXRlbGltaXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUmF0ZSBsaW1pdGVkLiBXYWl0aW5nIGZvciA3MCBzZWNvbmRzLi4uIChyZXN1bWluZyBhdCAke25ldyBEYXRlKERhdGUubm93KCkgKyA3MF8wMDApLnRvTG9jYWxlVGltZVN0cmluZygpfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA3MF8wMDApKTtcblxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQ29udGludWluZy4uLicsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGxvYWRTdWJ0eXBlRWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0XG4gICAgcHJvdGVjdGVkIGFzeW5jIHBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhkaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB9IGZyb20gJy4uL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFjdGlvblR5cGUgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgUmVkaXJlY3RzRGlhbG9nIGZyb20gJy4vcmVkaXJlY3RzLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0QWN0aW9uIH0gZnJvbSAnLi9yZWRpcmVjdHMtZGlhbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciB7XG4gICAgcHJpdmF0ZSB0aXRsZUluZGV4OiBudW1iZXI7XG4gICAgcHJpdmF0ZSB0aXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHJlc3BvbmRlckVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgZGlhbG9nOiBSZWRpcmVjdHNEaWFsb2c7XG5cbiAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcj86IEhUTUxEZXRhaWxzRWxlbWVudDtcblxuICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG5cbiAgICBwcml2YXRlIGNvbW1lbnRJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcblxuICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBkZW55UmVhc29uTGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBjbG9zaW5nUmVhc29uTGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBjb21tZW50TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdGl0bGVJbmRleDogbnVtYmVyLFxuICAgICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgICBkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LFxuICAgICAgICByZXNwb25kZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICAgICAgZGlhbG9nOiBSZWRpcmVjdHNEaWFsb2csXG4gICAgKSB7XG4gICAgICAgIHRoaXMudGl0bGVJbmRleCA9IHRpdGxlSW5kZXg7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5kZXRhaWxzRWxlbWVudCA9IGRldGFpbHNFbGVtZW50O1xuICAgICAgICB0aGlzLnJlc3BvbmRlckVsZW1lbnQgPSByZXNwb25kZXJFbGVtZW50O1xuICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSByZXF1ZXN0IGhhbmRsZXIsIGxvYWRpbmcgZWxlbWVudHMgaW50byB0aGUgRE9NLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXR1cCgpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkVGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlO1xuICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQobGFiZWwpO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbCwgbGFiZWwgfSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG5cbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKHNlbGVjdGVkKSA9PiB0aGlzLmhhbmRsZUFjdGlvbkNoYW5nZShzZWxlY3RlZCkpO1xuXG4gICAgICAgIHRoaXMubG9hZENvbW1lbnRMYXlvdXQoKTtcblxuICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQoYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSwgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICB0aGlzLnJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKHJlcXVlc3RlZFRpdGxlRGl2KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciBzZWxlY3RlZCBhY3Rpb24gY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWQgVGhlIG5ldyBzZWxlY3RlZCBvcHRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVBY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQ6IE9PLnVpLk9wdGlvbldpZGdldCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlhbG9nLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gKHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkgYXMgUmVxdWVzdEFjdGlvblR5cGU7XG5cbiAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgYWN0aW9uOiBvcHRpb24gfSk7XG5cbiAgICAgICAgdGhpcy5kaWFsb2cudXBkYXRlUmVxdWVzdENvbG9yKHRoaXMuZGV0YWlsc0VsZW1lbnQsIHRoaXMudGl0bGVJbmRleCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFnU2VsZWN0TGF5b3V0KSB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcikgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICBpZiAodGhpcy5kZW55UmVhc29uTGF5b3V0KSB0aGlzLmRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0KSB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRhZ1NlbGVjdExheW91dCB8fCAhdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHRoaXMubG9hZFRhZ1NlbGVjdEFuZFBhcmFtZXRlcnNFZGl0b3IoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZW55UmVhc29uTGF5b3V0KSB0aGlzLmxvYWREZW55UmVhc29uTGF5b3V0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlbnlSZWFzb25MYXlvdXQhLiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQpIHRoaXMubG9hZENsb3NpbmdSZWFzb25MYXlvdXQoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoWydhY2NlcHQnLCAnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQgfSk7XG4gICAgICAgICAgICBlbHNlIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSB0YWcgc2VsZWN0IGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGVkaXRvcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkVGFnU2VsZWN0QW5kUGFyYW1ldGVyc0VkaXRvcigpIHtcbiAgICAgICAgY29uc3QgdGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5kaWFsb2cucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgoW3RhZywgeyByZWRpcmVjdCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3QpIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoYCR7dGFnfSA8aT4ocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKTwvaT5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgIHRhZ1NlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgodGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHNvcnRlZFRhZ3MgfSk7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNUYWdTZWxlY3RlZCA9IHNvcnRlZFRhZ3MuaW5jbHVkZXMoZWRpdG9ySW5mby5uYW1lKTtcblxuICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gaXNUYWdTZWxlY3RlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUYWdTZWxlY3RlZCkgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGFnU2VsZWN0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyByZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczogdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvIH0pO1xuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAnYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBkZW55IHJlYXNvbiBsYXlvdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkRGVueVJlYXNvbkxheW91dCgpIHtcbiAgICAgICAgY29uc3QgZGVueVJlYXNvbklucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgWydub3RhcmdldCcsICdub25leGlzdGVudCBvciBubyBwcm92aWRlZCB0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGl0bGUnLCAnbm8gdGl0bGUgcHJvdmlkZWQnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ3VubGlrZWx5IHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90cmVkaXJlY3QnLCAnYXJ0aWNsZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnZXh0ZXJuYWxsaW5rJywgJ2V4dGVybmFsIGxpbmsgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICBkZW55UmVhc29uSW5wdXQub24oJ2NoYW5nZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgZGVueVJlYXNvbjogdmFsdWUgfHwgJ2F1dG9maWxsOnVubGlrZWx5JyB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVueVJlYXNvbklucHV0LnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICBkZW55UmVhc29uSW5wdXQuZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb25JbnB1dCwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNsb3NpbmcgcmVhc29uIGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRDbG9zaW5nUmVhc29uTGF5b3V0KCkge1xuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uRHJvcGRvd24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG5cbiAgICAgICAgY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5vbignY2hvb3NlJywgKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjbG9zaW5nUmVhc29uOiB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9IH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy51cGRhdGVSZXF1ZXN0Q29sb3IodGhpcy5kZXRhaWxzRWxlbWVudCwgdGhpcy50aXRsZUluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb25Ecm9wZG93biwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNvbW1lbnQgbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENvbW1lbnRMYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50IH0pO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHJlcXVlc3QncyBhY3Rpb25zIGRhdGEuXG4gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgdXBkYXRlcyB0byBtYWtlLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlQWN0aW9uc1RvVGFrZSh1cGRhdGU6IFBhcnRpYWw8UmVkaXJlY3RBY3Rpb24+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kaWFsb2cuYWN0aW9uc1RvVGFrZVt0aGlzLnRpdGxlSW5kZXhdLnJlcXVlc3RzW3RoaXMudGl0bGVdLCB1cGRhdGUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RUZW1wbGF0ZURhdGEsIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgSGVscGVyRGlhbG9nLCB7IHR5cGUgUmVxdWVzdEFjdGlvbiwgdHlwZSBSZXF1ZXN0UmVxdWVzdGVyIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIGZyb20gJy4vcmVkaXJlY3QtcmVxdWVzdC1oYW5kbGVyJztcbmltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxuaW50ZXJmYWNlIFJlZGlyZWN0UmVxdWVzdERhdGEge1xuICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3RSZXF1ZXN0ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFJlZGlyZWN0QWN0aW9uID0gUmVxdWVzdEFjdGlvbiAmIHsgcmVkaXJlY3RUZW1wbGF0ZXM/OiBzdHJpbmdbXTsgcmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/OiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gfTtcblxudHlwZSBSZWRpcmVjdEFjdGlvbnMgPSB7IHRhcmdldDogc3RyaW5nOyByZXF1ZXN0czogUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+IH1bXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RzRGlhbG9nIGV4dGVuZHMgSGVscGVyRGlhbG9nIHtcbiAgICBwdWJsaWMgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogUmVkaXJlY3RSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHVibGljIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgICAgICBzdXBlci5sb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlZGlyZWN0IHJlcXVlc3RzIGZyb20gc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uSGVhZGVyIFRoZSBzZWN0aW9uIGhlYWRlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQ6IHN0cmluZywgc2VjdGlvbkhlYWRlcjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhZ2VzID0gWy4uLnNlY3Rpb25IZWFkZXIubWF0Y2hBbGwoL1xcW1xcWyguKj8pXV0vZyldXG4gICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0/LnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRQYWdlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLnBhZ2VzID0gcmVxdWVzdGVkUGFnZXM7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gL1RhcmdldCBvZiByZWRpcmVjdDogP1xcW1xcWyguKj8pXV0vLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICBpZiAoIXBhcnNlZFRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5zb3VyY2UgPSAvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG5cXG4pL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbisoLiopL1xuICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoPzo8cmVmZXJlbmNlcyBcXFxcLz4ke3BhcnNlZERhdGEuc291cmNlID8gYHwke3BhcnNlZERhdGEuc291cmNlLnJlcGxhY2VBbGwoL1tcXHMjJCgpKissLj9bXFxcXFxcXV57fH0tXS9nLCAnXFxcXCQmJyl9YCA6ICcnfSlcXG4rKC4qKWAsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvLmV4ZWMocmVxdWVzdGVyKT8uWzFdLnRyaW0oKSA6IG51bGw7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSByZXF1ZXN0ZXIgJiYgbmFtZSA/IHsgdHlwZTogL1xcW1xcW1VzZXIoIHRhbGspPzovLnRlc3QocmVxdWVzdGVyKSA/ICd1c2VyJyA6ICdpcCcsIG5hbWUgfSA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYXJzZWRSZXF1ZXN0cy5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZS5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogcGFyc2VkRGF0YS50YXJnZXQsXG4gICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gcmVkaXJlY3QgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZXZlbnQua2V5ID09PSAnICcpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldEVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yJyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gcmVxdWVzdC50YXJnZXQ7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RhcmdldEVkaXRvckVsZW1lbnQudmFsdWUubGVuZ3RofWNoYDtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS50YXJnZXQgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZCh0YXJnZXRFZGl0b3JFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlubmVySFRNTCA9IGBcbjxzdmcgdmlld2JveD1cIjAgMCA0OCA0OFwiPlxuPHBhdGggZD1cIk0zNiAyNGMtMS4yIDAtMiAwLjgtMiAydjEyYzAgMS4yLTAuOCAyLTIgMmgtMjJjLTEuMlxuICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAwLTYgMi42LTYgNnYyMmMwIDMuNCAyLjYgNiA2IDZoMjJjMy40IDAgNi0yLjZcbiAgICA2LTZ2LTEyYzAtMS4yLTAuOC0yLTItMnpcIj48L3BhdGg+XG48cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgMC0yIDAuOC0yIDJzMC44IDIgMiAyaDcuMmwtMTguNiAxOC42Yy0wLjggMC44LTAuOCAyIDAgMi44IDAuNCAwLjQgMC44XG4gICAgMC42IDEuNCAwLjZzMS0wLjIgMS40LTAuNmwxOC42LTE4LjZ2Ny4yYzAgMS4yIDAuOCAyIDIgMnMyLTAuOFxuICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgcmVhc29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlYXNvbkxhYmVsLnRleHRDb250ZW50ID0gJ1JlYXNvbjogJztcbiAgICAgICAgcmVhc29uRGl2LmFwcGVuZChyZWFzb25MYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgZWxzZSByZWFzb25EaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZWFzb25EaXYpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBzb3VyY2VMYWJlbC50ZXh0Q29udGVudCA9ICdTb3VyY2U6ICc7XG4gICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnNvdXJjZSkgc291cmNlRGl2LmFwcGVuZChyZXF1ZXN0LnNvdXJjZSk7XG4gICAgICAgIGVsc2Ugc291cmNlRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkVGl0bGUgb2YgcmVxdWVzdC5wYWdlcykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyKGluZGV4LCByZXF1ZXN0ZWRUaXRsZSwgZGV0YWlsc0VsZW1lbnQsIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LCB0aGlzKTtcblxuICAgICAgICAgICAgaGFuZGxlci5zZXR1cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnNUb1Rha2UgPSBPYmplY3QudmFsdWVzKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0ucmVxdWVzdHMpO1xuXG4gICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55Jyk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IGFjdGlvbnNUb1Rha2UuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gYWN0aW9uc1RvVGFrZS5ldmVyeShcbiAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBkZW5pZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JykubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoYWNjZXB0ZWRDb3VudCA+IDAgJiYgZGVuaWVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZjE3ZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChhY2NlcHRlZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpXG4gICAgICAgICAgICBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhY3Rpb25zIG9uIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBhZGQgbWVzc2FnZXMgdG8uXG4gICAgICogQHBhcmFtIGNvdW50cyBUaGUgY291bnQgb2JqZWN0IHVzZWQgdG8gdHJhY2sgcmVxdWVzdHMgZm9yIHRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICogQHBhcmFtIG5ld1BhZ2VUZXh0IFRoZSBuZXcgcGFnZSB0ZXh0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9IHRoaXMuYWN0aW9uc1RvVGFrZS5zb21lKChhY3Rpb25EYXRhKSA9PlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhY3Rpb25EYXRhLnJlcXVlc3RzKS5zb21lKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gIT09ICdub25lJyksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGFyZ2V0LCByZXF1ZXN0cyB9IG9mIHRoaXMuYWN0aW9uc1RvVGFrZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZQYWdlcyA9IE9iamVjdC5rZXlzKHJlcXVlc3RzKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykpXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgd2lsbCBiZSBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkUGFnZXMucHVzaChyZXF1ZXN0ZWRUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkUGFnZXMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5kZW55UmVhc29uIV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGNsb3NlZCB3aXRoIHRoZSBzYW1lIHJlYXNvbiwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5PYmplY3QudmFsdWVzKHJlcXVlc3RzKVswXS5vcmlnaW5hbFRleHQgfTtcblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBDb21tZW50cyhjb21tZW50cywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgY29tbWVudHMubGVuZ3RoID09PSBhbW91bnRPZlBhZ2VzKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2luZ0lkOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCAmJiBkZW5pZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAncCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXNNZXNzYWdlID0gYCoge3tzdWJzdDpBZkMgcmVkaXJlY3R9fSAoJHthY2NlcHRlZFBhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pIH5+fn5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXNNZXNzYWdlID0gdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAke2FjY2VwdGVkUGFnZXNNZXNzYWdlfVxcbiR7ZGVuaWVkUGFnZXNNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdCR7YWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAxID8gJ3xhbGwnIDogJyd9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGFtb3VudE9mUGFnZXMgPT09IDEsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgcHJlcGVuZDogYHt7QWZDLWN8JHtjbG9zaW5nSWR9fX1gLCBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiBge3tBZkMtY3wke2ZpcnN0Q2xvc2VSZWFzb259fX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAne3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIChwYWdlIGNvbnRlbnQgaWRlbnRpY2FsKSEnKTtcblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgIC5tYXAoKFthY3Rpb24sIGNvdW50XSkgPT4gYCR7YWN0aW9ufSAke2NvdW50fWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IG5ld1BhZ2VUZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIHJlZGlyZWN0IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuc2hvd1JlbG9hZCgpO1xuICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgcmVkaXJlY3QgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZTogc3RyaW5nLCBkYXRhOiBSZWRpcmVjdEFjdGlvbiwgdGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPVxuICAgICAgICAgICAgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcyAmJiBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gZGF0YS5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycz8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVyLCBpbmRleCkgPT4gcGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgJiYgcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZSkhO1xuXG4gICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBgI1JFRElSRUNUIFtbJHt0YXJnZXR9XV0ke3RhZ3NXaXRoQXJndW1lbnRzID8gYFxcblxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyByZWRpcmVjdCB0byBbWyR7dGFyZ2V0fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9SXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgY2F0ZWdvcmllcz86IHsgdGl0bGU6IHN0cmluZyB9W10gfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4uL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgcGFnZSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmcgfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMubWFwKChwYWdlKSA9PiAoeyBkYXRhOiBwYWdlLnRpdGxlLCBsYWJlbDogcGFnZS50aXRsZSB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUGFnZUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBIZWxwZXJEaWFsb2csIHsgdHlwZSBSZXF1ZXN0QWN0aW9uLCB0eXBlIFJlcXVlc3RBY3Rpb25UeXBlLCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IFBhZ2VJbnB1dFdpZGdldCBmcm9tICcuL3BhZ2UtaW5wdXQtd2lkZ2V0JztcbmltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxuaW50ZXJmYWNlIENhdGVnb3J5UmVxdWVzdERhdGEge1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgZXhhbXBsZXM6IHN0cmluZ1tdO1xuICAgIHBhcmVudHM6IHN0cmluZ1tdO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdFJlcXVlc3Rlcjtcbn1cblxuZXhwb3J0IHR5cGUgQ2F0ZWdvcnlBY3Rpb24gPSBSZXF1ZXN0QWN0aW9uICYgeyBjYXRlZ29yeTogc3RyaW5nOyBleGFtcGxlczogc3RyaW5nW107IHBhcmVudHM6IHN0cmluZ1tdIH07XG5cbmV4cG9ydCB0eXBlIENhdGVnb3J5QWN0aW9ucyA9IENhdGVnb3J5QWN0aW9uW107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGVnb3JpZXNEaWFsb2cgZXh0ZW5kcyBIZWxwZXJEaWFsb2cge1xuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHJpdmF0ZSBhY3Rpb25zVG9UYWtlOiBDYXRlZ29yeUFjdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCBmb3VuZENhdGVnb3J5ID0gLzo/Q2F0ZWdvcnk6KC4qPykoXV18JCkvLmV4ZWMoc2VjdGlvbkhlYWRlcik/LlsxXS50cmltKCk7XG4gICAgICAgIGlmICghZm91bmRDYXRlZ29yeSkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEuY2F0ZWdvcnkgPSBmb3VuZENhdGVnb3J5LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgIHBhcnNlZERhdGEuZXhhbXBsZXMgPVxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIC4uLihcbiAgICAgICAgICAgICAgICAgICAgL2V4YW1wbGUgcGFnZXMgd2hpY2ggYmVsb25nIHRvIHRoaXMgY2F0ZWdvcnk6KC4qPykocGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczp8XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgKT8uWzFdID8/ICcnXG4gICAgICAgICAgICAgICAgKS5tYXRjaEFsbCgvXFwqXFxzKig/OlxcW1xcWyk/KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nKSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW107XG5cbiAgICAgICAgcGFyc2VkRGF0YS5wYXJlbnRzID1cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAuLi4oXG4gICAgICAgICAgICAgICAgICAgIC9wYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOiguKj8pKFxcblxcbnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgICAgICkubWF0Y2hBbGwoLyg/PCFcXHwpIz86P0NhdGVnb3J5OiguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgPy5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSA/PyBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFVzZXJJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlcjonKTtcbiAgICAgICAgY29uc3QgZmlyc3RVc2VyVGFsa0luZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyIHRhbGs6Jyk7XG4gICAgICAgIGNvbnN0IGZpcnN0SXBJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbU3BlY2lhbDpDb250cmlidXRpb25zLycpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBNYXRoLm1pbiguLi5bZmlyc3RVc2VySW5kZXgsIGZpcnN0VXNlclRhbGtJbmRleCwgZmlyc3RJcEluZGV4XS5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCAhPT0gLTEpKTtcblxuICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9XG4gICAgICAgICAgICBmaXJzdEluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IGZpcnN0SW5kZXggPT09IGZpcnN0SXBJbmRleFxuICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6ICdpcCcsIG5hbWU6IC9cXFtcXFtTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC8oLio/KShcXHx8XV0pLy5leGVjKHNlY3Rpb25UZXh0KSFbMV0udHJpbSgpIH1cbiAgICAgICAgICAgICAgICAgIDogeyB0eXBlOiAndXNlcicsIG5hbWU6IC9cXFtcXFtVc2VyKD86IHRhbGspPzooLio/KShcXHx8XV0pLy5leGVjKHNlY3Rpb25UZXh0KSFbMV0udHJpbSgpIH07XG4gICAgICAgIGlmICghcGFyc2VkRGF0YS5yZXF1ZXN0ZXI/Lm5hbWUpIHBhcnNlZERhdGEucmVxdWVzdGVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBhcnNlZFJlcXVlc3RzLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlLnB1c2goe1xuICAgICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZERhdGEuY2F0ZWdvcnksXG4gICAgICAgICAgICBleGFtcGxlczogcGFyc2VkRGF0YS5leGFtcGxlcyxcbiAgICAgICAgICAgIHBhcmVudHM6IHBhcnNlZERhdGEucGFyZW50cyxcbiAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCkgfSxcbiAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XTtcblxuICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IGA8Yj5DYXRlZ29yeToke3JlcXVlc3QuY2F0ZWdvcnl9PC9iPmA7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZXNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgZXhhbXBsZXNMYWJlbC50ZXh0Q29udGVudCA9ICdFeGFtcGxlczogJztcbiAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGV4YW1wbGVzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZXhhbXBsZV0gb2YgcmVxdWVzdC5leGFtcGxlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoZXhhbXBsZSk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBleGFtcGxlO1xuXG4gICAgICAgICAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5leGFtcGxlcy5sZW5ndGggLSAxKSBleGFtcGxlc0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgZXhhbXBsZXNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChleGFtcGxlc0Rpdik7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcGFyZW50c0xhYmVsLnRleHRDb250ZW50ID0gJ1BhcmVudHM6ICc7XG4gICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKHBhcmVudHNMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucGFyZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHBhcmVudF0gb2YgcmVxdWVzdC5wYXJlbnRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChgQ2F0ZWdvcnk6JHtwYXJlbnR9YCk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QucGFyZW50cy5sZW5ndGggLSAxKSBwYXJlbnRzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBwYXJlbnRzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocGFyZW50c0Rpdik7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQuc2VsZWN0SXRlbUJ5TGFiZWwoJ05vbmUnKTtcbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IChcbiAgICAgICAgICAgICAgICAoYWN0aW9uUmFkaW9JbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuUmFkaW9PcHRpb25XaWRnZXQpLmdldERhdGEoKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKSBhcyBSZXF1ZXN0QWN0aW9uVHlwZTtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5hY3Rpb24gPSBvcHRpb247XG5cbiAgICAgICAgICAgIGlmIChbJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcblxuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RJbnB1dCA9IG5ldyBQYWdlSW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBwYWdlcyBoZXJlJyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYWdlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYWdlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogcGFnZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKHBhZ2VTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgcGFnZVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5leGFtcGxlcyA9IHNvcnRlZFRhZ3M7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgZXhhbXBsZXMgfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGV4YW1wbGVzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShleGFtcGxlKTtcbiAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShleGFtcGxlcyk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYWdlU2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdQYWdlcyB0byBjYXRlZ29yaXplOicgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIGNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKGNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKGNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIGNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLnBhcmVudHMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IHBhcmVudHMgfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudCk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHBhcmVudHMpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNhdGVnb3J5U2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDYXRlZ29yaWVzOicgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ2NhdGVnb3JpZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gaGF2ZSBlbm91Z2ggcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGNhdGVnb3J5JywgJ3BhZ2UgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmRlbnlSZWFzb24gPSBkZW55UmVhc29uLmdldFZhbHVlKCkgfHwgJ2F1dG9maWxsOnVubGlrZWx5JztcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChkZW55UmVhc29uLCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0O1xuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICApO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XTtcblxuICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLXN3aXRjaFxuICAgICAgICBpZiAoYWN0aW9uID09PSAnYWNjZXB0JykgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZW55JykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdjbG9zZScpXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uPy5pZCA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhY3Rpb25zIG9uIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBhZGQgbWVzc2FnZXMgdG8uXG4gICAgICogQHBhcmFtIGNvdW50cyBUaGUgY291bnQgb2JqZWN0IHVzZWQgdG8gdHJhY2sgcmVxdWVzdHMgZm9yIHRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICogQHBhcmFtIG5ld1BhZ2VUZXh0IFRoZSBuZXcgcGFnZSB0ZXh0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9IHRoaXMuYWN0aW9uc1RvVGFrZS5zb21lKChhY3Rpb25EYXRhKSA9PiBhY3Rpb25EYXRhLmFjdGlvbiAhPT0gJ25vbmUnKTtcblxuICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uRGF0YSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uYWN0aW9uRGF0YS5vcmlnaW5hbFRleHQgfTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8YX19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICcqIHt7c3Vic3Q6QWZDIGNhdGVnb3J5fX0gfn5+flxcbnt7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8ZH19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oYWN0aW9uRGF0YS5kZW55UmVhc29uISl9IH5+fn5cXG57e0FmQy1jfGJ9fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRhdGEuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1snY29tbWVudGVkIG9uJ10rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIHJlcXVlc3QgdG8gY3JlYXRlIFwiJHthY3Rpb25EYXRhLmNhdGVnb3J5fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7YWN0aW9uRGF0YS5jbG9zaW5nUmVhc29uIS5pZH19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAoYWN0aW9uRGF0YS5jb21tZW50ID8gYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gIDogJycpICsgJ1xcbnt7QWZDLWN8Yn0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyBjYXRlZ29yeSByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBjYXRlZ29yeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShkYXRhOiBDYXRlZ29yeUFjdGlvbikge1xuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLnBhcmVudHMubWFwKChwYXJlbnQpID0+IGBbW0NhdGVnb3J5OiR7cGFyZW50fV1dYCkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5IHRhbGs6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmRhdGEuZXhhbXBsZXMubWFwKChleGFtcGxlKSA9PiAoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICB0aXRsZTogZXhhbXBsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh7IGNvbnRlbnQgfTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYCR7Y29udGVudH1cXG5bW0NhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgcGFnZSB0byBbWzpDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV0gYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFdhdGNoTWV0aG9kID0gJ25vY2hhbmdlJyB8ICdwcmVmZXJlbmNlcycgfCAndW53YXRjaCcgfCAnd2F0Y2gnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGFmY3JjQ29uZmlndXJhdGlvbj86IHsgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZD86IFdhdGNoTWV0aG9kIH07XG4gICAgfVxufVxuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cyddLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBSZWRpcmVjdHNEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9yZWRpcmVjdHMtZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgY29uc3QgeyBkZWZhdWx0OiBDYXRlZ29yaWVzRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vY2F0ZWdvcmllcy1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgIGNvbnN0IHBhZ2VOYW1lID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgY29uc3QgaXNSZWRpcmVjdFJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL1JlZGlyZWN0cyc7XG4gICAgY29uc3QgaXNDYXRlZ29yeVJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL0NhdGVnb3JpZXMnO1xuXG4gICAgaWYgKCFpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgJiYgIWlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhZ2VUeXBlID0gaXNSZWRpcmVjdFJlcXVlc3RQYWdlID8gJ3JlZGlyZWN0JyA6ICdjYXRlZ29yeSc7XG5cbiAgICBjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICcjJyxcbiAgICAgICAgYEhhbmRsZSAke3JlcXVlc3RQYWdlVHlwZX0gY3JlYXRpb24gcmVxdWVzdHNgLFxuICAgICAgICAnYWZjcmMtaGVscGVyJyxcbiAgICApITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3QgaGVscGVyID0gcmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnID8gUmVkaXJlY3RzRGlhbG9nIDogQ2F0ZWdvcmllc0RpYWxvZztcblxuICAgICAgICBjb25zdCBhZmNyY0hlbHBlckRpYWxvZyA9IG5ldyBoZWxwZXIocmVxdWVzdFBhZ2VUeXBlLCBwYWdlTmFtZSwgd2luZG93LmFmY3JjQ29uZmlndXJhdGlvbj8uY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCk7XG5cbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFthZmNyY0hlbHBlckRpYWxvZ10pO1xuXG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgYWZjcmNIZWxwZXJEaWFsb2cubG9hZCgpO1xuICAgIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Z0pBQUEsSUFHcUJBLEVBSHJCQyxFQUFBQyxFQUFBLGtCQUdxQkYsRUFBckIsTUFBcUJHLFVBQXNCLEdBQUcsR0FBRyxNQUFPLENBQzVDLGNBQ0EsVUFDQSxZQUVSLGFBQWMsQ0FDVixNQUFNLENBQUUsS0FBTSxPQUFRLENBQUMsRUFFdkJBLEVBQWMsT0FBTyxLQUFPLGdCQUM1QkEsRUFBYyxPQUFPLE1BQVEsU0FDakMsQ0FFQSxXQUFhLEtB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b0IsV0FBYUosRUFBa0JDLEVBRTVETyxFQUFvQixJQUFJRCxFQUFPSCxFQUFpQkYsRUFBVSxPQUFPLG9CQUFvQixzQkFBc0IsRUFFakhJLEVBQWMsV0FBVyxDQUFDRSxDQUFpQixDQUFDLEVBRTVDQSxFQUFrQixLQUFLLEVBQ3ZCQSxFQUFrQixLQUFLLENBQzNCLENBQUMsQ0FDTCxDQUFDIiwKICAibmFtZXMiOiBbIkFjdGlvbnNEaWFsb2ciLCAiaW5pdF9zaG93X2FjdGlvbnNfZGlhbG9nIiwgIl9fZXNtTWluIiwgIl9BY3Rpb25zRGlhbG9nIiwgIm1lc3NhZ2UiLCAidHlwZSIsICJtZXNzYWdlV2lkZ2V0IiwgInJlbG9hZEJ1dHRvbiIsICJIZWxwZXJEaWFsb2ciLCAiaW5pdF9oZWxwZXJfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfc2hvd19hY3Rpb25zX2RpYWxvZyIsICJfSGVscGVyRGlhbG9nIiwgInJlcXVlc3RQYWdlVHlwZSIsICJwYWdlVGl0bGUiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImFjdGlvbiIsICJjb25maXJtZWQiLCAicGFnZVJldmlzaW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAiaW5kZXgiLCAiaGFuZGxlIiwgImVuZEluZGV4IiwgInN1YkluZGV4IiwgIm1lc3NhZ2VXaWRnZXQiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJ3aW5kb3dNYW5hZ2VyIiwgInNob3dBY3Rpb25zRGlhbG9nIiwgIkFjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgInJlYXNvbiIsICJ0ZW1wbGF0ZVBhcmFtZXRlcnMiLCAiYWRkaXRpb25hbFJlYXNvbmluZyIsICJkZW5pZWRQYWdlcyIsICJzaW5ndWxhclJlcXVlc3QiLCAiYWxsUmVxdWVzdHMiLCAicmVhc29ucyIsICJwYWdlIiwgInJlYXNvbnNBcnJheSIsICJwYWdlcyIsICJjb21tZW50cyIsICJjb21tZW50TWVzc2FnZXMiLCAiY29tbWVudCIsICJjb21tZW50c0FycmF5IiwgInNlY3Rpb25EYXRhIiwgInByZXBlbmQiLCAiYXBwZW5kIiwgIm9sZEZ1bGxTZWN0aW9uVGV4dCIsICJvbGRTZWN0aW9uVGV4dCIsICJhcGlGdW5jdGlvbiIsICJsaW5rRWxlbWVudCIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInJlc29sdmUiLCAiZGV0YWlsc0VsZW1lbnQiLCAiZGlhbG9nIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiX19lc21NaW4iLCAidGl0bGVJbmRleCIsICJ0aXRsZSIsICJkZXRhaWxzRWxlbWVudCIsICJyZXNwb25kZXJFbGVtZW50IiwgImRpYWxvZyIsICJyZXF1ZXN0ZWRUaXRsZURpdiIsICJsYWJlbCIsICJhY3Rpb25SYWRpb0lucHV0IiwgInNlbGVjdGVkIiwgIm9wdGlvbiIsICJjb21tZW50IiwgInRhZ1NlbGVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAiZWRpdG9ySW5mbyIsICJpc1RhZ1NlbGVjdGVkIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJkZW55UmVhc29uSW5wdXQiLCAidmFsdWUiLCAiY2xvc2luZ1JlYXNvbkRyb3Bkb3duIiwgImlkIiwgInVwZGF0ZSIsICJyZWRpcmVjdHNfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RzRGlhbG9nIiwgImluaXRfcmVkaXJlY3RzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiSGVscGVyRGlhbG9nIiwgInJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAicmVxdWVzdGVkUGFnZXMiLCAibWF0Y2giLCAicGFyc2VkVGFyZ2V0IiwgInJlcXVlc3RlciIsICJuYW1lIiwgInBhZ2UiLCAiaW5kZXgiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJldmVudCIsICJ0YXJnZXRFZGl0b3JFbGVtZW50IiwgImxpbmtFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJyZWFzb25EaXYiLCAicmVhc29uTGFiZWwiLCAic291cmNlRGl2IiwgInNvdXJjZUxhYmVsIiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgInJlcXVlc3RlZFRpdGxlIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiYWN0aW9uc1RvVGFrZSIsICJhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkIiwgImFjdGlvbiIsICJmaXJzdENsb3NlUmVhc29uIiwgImFsbFJlcXVlc3RzQ2xvc2VkIiwgImJhY2tncm91bmRDb2xvciIsICJhY2NlcHRlZENvdW50IiwgImRlbmllZENvdW50IiwgInNob3dBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInRhcmdldCIsICJyZXF1ZXN0cyIsICJzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkIiwgImFjY2VwdGVkUGFnZXMiLCAiZGVuaWVkUGFnZXMiLCAiY29tbWVudHMiLCAiYW1vdW50T2ZQYWdlcyIsICJzZWN0aW9uRGF0YSIsICJjbG9zaW5nSWQiLCAiYWNjZXB0ZWRQYWdlc01lc3NhZ2UiLCAiZGVuaWVkUGFnZXNNZXNzYWdlIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJkYXRhIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgInRhZyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgImVkaXRvckluZm8iLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgInBhcmFtZXRlciIsICJtYXBwZWRBcmd1bWVudHMiLCAidmFsdWUiLCAidGl0bGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiUGFnZUlucHV0V2lkZ2V0IiwgImluaXRfcGFnZV9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInBhcnNlZFRpdGxlIiwgInJlc3VsdCIsICJwYWdlcyIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiY2F0ZWdvcmllc19kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJDYXRlZ29yaWVzRGlhbG9nIiwgImluaXRfY2F0ZWdvcmllc19kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiaW5pdF9oZWxwZXJfZGlhbG9nIiwgImluaXRfcGFnZV9pbnB1dF93aWRnZXQiLCAiSGVscGVyRGlhbG9nIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJmb3VuZENhdGVnb3J5IiwgIm1hdGNoIiwgImZpcnN0VXNlckluZGV4IiwgImZpcnN0VXNlclRhbGtJbmRleCIsICJmaXJzdElwSW5kZXgiLCAiZmlyc3RJbmRleCIsICJpbmRleCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJleGFtcGxlc0RpdiIsICJleGFtcGxlc0xhYmVsIiwgImV4YW1wbGUiLCAibGlua0VsZW1lbnQiLCAicGFyZW50c0RpdiIsICJwYXJlbnRzTGFiZWwiLCAicGFyZW50IiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgImFjdGlvblJhZGlvSW5wdXQiLCAibGFiZWwiLCAib3B0aW9uIiwgImNvbW1lbnRJbnB1dExheW91dCIsICJjb21tZW50IiwgImNvbW1lbnRJbnB1dCIsICJwYWdlU2VsZWN0TGF5b3V0IiwgImNhdGVnb3J5U2VsZWN0TGF5b3V0IiwgImRlbnlSZWFzb25MYXlvdXQiLCAiY2xvc2luZ1JlYXNvbkxheW91dCIsICJwYWdlU2VsZWN0SW5wdXQiLCAiUGFnZUlucHV0V2lkZ2V0IiwgInZhbHVlIiwgInBhZ2VzIiwgInBhZ2UiLCAicGFnZVNlbGVjdCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJleGFtcGxlcyIsICJjYXRlZ29yeVNlbGVjdElucHV0IiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiY2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50cyIsICJkZW55UmVhc29uIiwgImNsb3NpbmdSZWFzb24iLCAidGl0bGUiLCAiaWQiLCAic2VsZWN0ZWQiLCAiYWN0aW9uIiwgImJhY2tncm91bmRDb2xvciIsICJzaG93QWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAiYWN0aW9uRGF0YSIsICJzZWN0aW9uRGF0YSIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiLCAiZGF0YSIsICJjb250ZW50IiwgIlJlZGlyZWN0c0RpYWxvZyIsICJDYXRlZ29yaWVzRGlhbG9nIiwgInBhZ2VOYW1lIiwgImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJyZXF1ZXN0UGFnZVR5cGUiLCAiZXZlbnQiLCAid2luZG93TWFuYWdlciIsICJoZWxwZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciXQp9Cg==