User:Eejit43/scripts/afcrc-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/afcrc-helper. |
// <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 N=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),e=$.Deferred();t||e.resolve([]);let a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(o=>{if(o?.query?.pages){let i=o.query.pages.filter(c=>!c.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(c=>{let n=c.title.split(":")[1];return{data:n,label:n}});this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}))};Object.assign(N.prototype,OO.ui.mixin.LookupElement.prototype);var V=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),e=$.Deferred();t||e.resolve([]);let a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:a?.getNamespaceId()??0,gapprefix:a?.getMainText()??t,generator:"allpages"}).catch(()=>null).then(o=>{if(o?.query?.pages){let i=o.query.pages.map(c=>({data:c.title,label:c.title}));this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}))};Object.assign(V.prototype,OO.ui.mixin.LookupElement.prototype);var U=class T extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),T.static.name="ShowActionsDialog",T.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(t,e="notice"){let a=new OO.ui.MessageWidget({type:e,inline:!0,label:new OO.ui.HtmlSnippet(t)});this.logOutput.append(a.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();let t=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});t.on("click",()=>window.location.reload()),this.contentLayout.$element.append(t.$element)}};Object.assign(U.prototype,OO.ui.Dialog.prototype);var F=class T extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;redirectTemplates;beforeText;pageContent;parsedRequests=[];actionsToTake=[];editsCreationsToMake=[];constructor(t,e,a){super({size:"large"}),T.static.name="AfcrcHelperDialog",T.static.title="afcrc-helper",T.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=e,this.requestPageType=t,this.createdPageWatchMethod=a&&["nochange","preferences","unwatch","watch"].includes(a)?a:"preferences",mw.util.addCSS(`
.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=t=>t==="cancel"?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):t==="save"?new OO.ui.Process(()=>{this.performActions()}):T.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>T.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});async load(){let t=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(t.query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}");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 t=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(e=>e[0]);for(let e of t){if(/{{afc-c\|/i.test(e))continue;let o=/^==(.*?)==$/m.exec(e)[1].trim();if(this.requestPageType==="redirect"){let i={},c=[...o.matchAll(/\[\[(.*?)]]/g)].map(d=>d[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(c.length===0)continue;i.pages=c;let n=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!n)continue;i.target=n,i.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",i.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let r=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${i.source?`|${i.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),h=r?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(r)?.[1].trim():null;i.requester=r&&h?{type:/\[\[User( talk)?:/.test(r)?"user":"ip",name:h}:null,this.parsedRequests.push(i),this.actionsToTake.push({target:i.target,requests:Object.fromEntries(c.map(d=>[d,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}else{let i={},c=/:?Category:(.*?)(]]|$)/.exec(o)?.[1].trim();if(!c)continue;i.category=c.replaceAll("_"," "),i.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(f=>f[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],i.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(f=>f[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];let n=e.indexOf("[[User:"),r=e.indexOf("[[User talk:"),h=e.indexOf("[[Special:Contributions/"),d=Math.min(...[n,r,h].filter(f=>f!==-1));i.requester=d===Number.POSITIVE_INFINITY?null:d===h?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[1].trim()},i.requester?.name||(i.requester=null),this.parsedRequests.push(i),this.actionsToTake.push({category:i.category,examples:i.examples,parents:i.parents,originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}}}loadInputElements(){if(this.parsedRequests.length>0){let t=0,e=()=>{let o=Math.min(t+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${t+1}-${o}/${this.parsedRequests.length} requests)`);for(let i=t;i<o;i++)this.requestPageType==="redirect"?this.loadRedirectRequestElements(i):this.loadCategoryRequestElements(i);o<this.parsedRequests.length?(t=o,setTimeout(e,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};e()}else{let t=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),e=new OO.ui.PanelLayout({padded:!0,expanded:!1});e.$element.append(t.$element),this.$body.append(e.$element),this.updateSize()}}loadRedirectRequestElements(t){let e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let o=document.createElement("summary");o.innerHTML=e.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",o.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});let i=document.createElement("input");i.classList.add("afcrc-helper-target-editor"),i.style.width=`${e.target.length}ch`,i.value=e.target,i.addEventListener("input",()=>{i.value=i.value.replaceAll("_"," "),i.style.width=`${i.value.length}ch`,this.actionsToTake[t].target=i.value,c.href=mw.util.getUrl(i.value)}),o.append(i);let c=document.createElement("a");c.classList.add("afcrc-helper-external-link"),c.target="_blank",c.href=mw.util.getUrl(e.target),c.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>`,o.append(c),a.append(o);let n=document.createElement("div");n.classList.add("afcrc-helper-request-info");let r=document.createElement("span");r.style.color="dimgray",r.textContent="None";let h=document.createElement("span");h.style.color="dimgray",h.textContent="Unknown";let d=document.createElement("div"),f=document.createElement("b");f.textContent="Reason: ",d.append(f),e.reason?d.append(e.reason):d.append(r.cloneNode(!0)),n.append(d);let w=document.createElement("div"),O=document.createElement("b");O.textContent="Source: ",w.append(O),e.source?w.append(e.source):w.append(r.cloneNode(!0)),n.append(w);let C=document.createElement("div"),b=document.createElement("b");if(b.textContent="Requester: ",C.append(b),e.requester){let l=document.createElement("a");l.target="_blank",l.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),l.textContent=e.requester.name,C.append(l)}else C.append(h.cloneNode(!0));n.append(C),a.append(n),a.append(document.createElement("hr"));let k=document.createElement("div");k.classList.add("afcrc-helper-request-responder");for(let l of e.pages){let u=document.createElement("div"),g=document.createElement("b");g.textContent=l,u.append(g);let R,m,j=[],P=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}))});P.selectItemByLabel("None"),P.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let s=P.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].requests[l].action=s,!R||!m){let p=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([v,{redirect:I}])=>{if(!I)return{data:v,label:v};let E=new OO.ui.HtmlSnippet(`${v} <i>(redirect with possibilities)</i>`);return{data:v,label:E}})});p.getMenu().filterMode="substring",p.on("change",()=>{let v=p.getValue().sort((E,L)=>E.toLowerCase().localeCompare(L.toLowerCase()));p.getValue().join(";")!==v.join(";")&&p.setValue(v),this.actionsToTake[t].requests[l].redirectTemplates=v;for(let E of j)E.details.style.display="none";let I=0;for(let E of p.getValue()){let L=j.find(H=>H.name===E);L&&(L.details.style.display="block",I++)}y.textContent=`Template parameters (${I>0?`for ${I} template${I>1?"s":""}`:"none to show"})`,B.style.display=I>0?"none":"block"}),R=new OO.ui.FieldLayout(p,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),x.$element[0].before(R.$element[0]),m=document.createElement("details"),m.classList.add("afcrc-helper-template-parameters-container");let y=document.createElement("summary");y.textContent="Template parameters (none to show)",m.append(y);for(let[v,I]of Object.entries(this.redirectTemplates)){let E=Object.entries(I.parameters);if(E.length===0)continue;let L=document.createElement("details");L.style.display="none";let H=document.createElement("summary");H.textContent=v,L.append(H);let Q={name:v,details:L,parameters:[]};for(let[z,q]of E){let _=new OO.ui.TextInputWidget({placeholder:q.default?.toString(),required:q.required}),J=new OO.ui.FieldLayout(_,{label:new OO.ui.HtmlSnippet(`${z}${!q.label||z.toLowerCase()===q.label?.toLowerCase()?"":` (${q.label})`}${q.description?` (${q.description})`:""} (type: ${q.type}) ${q.suggested?" (suggested)":""}${q.example?` (example: "${q.example}")`:""}`),align:"inline"});L.append(J.$element[0]),Q.parameters.push({name:z,aliases:q.aliases,editor:_})}m.append(L),j.push(Q)}this.actionsToTake[t].requests[l].redirectTemplateParameters=j;let B=document.createElement("div");B.id="afcrc-helper-no-templates-message",B.textContent="No templates with parameters to display!",m.append(B),x.$element[0].before(m)}if(["accept","comment","close"].includes(s)){x.$element.show();let p=D.getValue().trim();p?this.actionsToTake[t].requests[l].comment=p:delete this.actionsToTake[t].requests[l].comment}else x.$element.hide(),delete this.actionsToTake[t].requests[l].comment;switch(this.updateRequestColor(a,t),R.$element.hide(),m.style.display="none",M.$element.hide(),S.$element.hide(),s){case"accept":{R.$element.show(),m.style.display="block";break}case"deny":{M.$element.show();break}case"close":{S.$element.show();break}}});let A=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(([s,p])=>({data:`autofill:${s}`,label:`Autofilled text for ${p}`}))});A.on("change",()=>{this.actionsToTake[t].requests[l].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(([s,p])=>new OO.ui.MenuOptionWidget({data:p,label:s}))}});W.getMenu().on("choose",()=>{let s=W.getMenu().findSelectedItem();this.actionsToTake[t].requests[l].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),W.getMenu().selectItemByData("r"),this.actionsToTake[t].requests[l].closingReason={name:"No response",id:"r"};let S=new OO.ui.FieldLayout(W,{align:"inline",label:"Closing reason:"});S.$element.hide();let D=new OO.ui.TextInputWidget;D.on("change",()=>{let s=D.getValue().trim();s?this.actionsToTake[t].requests[l].comment=s:delete this.actionsToTake[t].requests[l].comment});let x=new OO.ui.FieldLayout(D,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});x.$element.hide(),u.append(P.$element[0],M.$element[0],S.$element[0],x.$element[0]),k.append(u)}a.append(k),this.$body.append(a),this.updateSize()}loadCategoryRequestElements(t){let e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let o=document.createElement("summary");o.innerHTML=`<b>Category:${e.category}</b>`,a.append(o);let i=document.createElement("div");i.classList.add("afcrc-helper-request-info");let c=document.createElement("span");c.style.color="dimgray",c.textContent="None";let n=document.createElement("span");n.style.color="dimgray",n.textContent="Unknown";let r=document.createElement("div"),h=document.createElement("b");if(h.textContent="Examples: ",r.append(h),e.examples.length>0)for(let[s,p]of e.examples.entries()){let y=document.createElement("a");y.target="_blank",y.href=mw.util.getUrl(p),y.textContent=p,r.append(y),s!==e.examples.length-1&&r.append(", ")}else r.append(c.cloneNode(!0));i.append(r);let d=document.createElement("div"),f=document.createElement("b");if(f.textContent="Parents: ",d.append(f),e.parents.length>0)for(let[s,p]of e.parents.entries()){let y=document.createElement("a");y.target="_blank",y.href=mw.util.getUrl(`Category:${p}`),y.textContent=p,d.append(y),s!==e.parents.length-1&&d.append(", ")}else d.append(c.cloneNode(!0));i.append(d);let w=document.createElement("div"),O=document.createElement("b");if(O.textContent="Requester: ",w.append(O),e.requester){let s=document.createElement("a");s.target="_blank",s.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),s.textContent=e.requester.name,w.append(s)}else w.append(n.cloneNode(!0));i.append(w),a.append(i),a.append(document.createElement("hr"));let C=document.createElement("div");C.classList.add("afcrc-helper-request-responder");let b=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}))});b.selectItemByLabel("None"),b.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let s=b.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].action=s,["comment","close"].includes(s)){x.$element.show();let p=D.getValue().trim();p?this.actionsToTake[t].comment=p:delete this.actionsToTake[t].comment}else x.$element.hide(),delete this.actionsToTake[t].comment;switch(this.updateRequestColor(a,t),g.$element.hide(),P.$element.hide(),M.$element.hide(),S.$element.hide(),s){case"accept":{g.$element.show(),P.$element.show();break}case"deny":{M.$element.show();break}case"close":{S.$element.show();break}}});let k=new V({placeholder:"Add pages here"});k.on("change",()=>{let s=k.getValue();s=s.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),s=s.replace(/^:/,""),s.length>0&&k.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),k.on("showing-values",s=>{for(let p of s)l.addAllowedValue(p.data)});let l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:k});l.on("change",()=>{let s=l.getValue().sort((p,y)=>p.toLowerCase().localeCompare(y.toLowerCase()));l.getValue().join(";")!==s.join(";")&&l.setValue(s),this.actionsToTake[t].examples=s});let{examples:u}=this.actionsToTake[t];for(let s of u)l.addAllowedValue(s);l.setValue(u);let g=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});g.$element.hide();let R=new N({placeholder:"Add categories here"});R.on("change",()=>{let s=R.getValue();s=s.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),s=s.replace(/^Category:/,""),s.length>0&&R.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),R.on("showing-values",s=>{for(let p of s)m.addAllowedValue(p.data)});let m=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:R});m.on("change",()=>{let s=m.getValue().sort((p,y)=>p.toLowerCase().localeCompare(y.toLowerCase()));m.getValue().join(";")!==s.join(";")&&m.setValue(s),this.actionsToTake[t].parents=s});let{parents:j}=this.actionsToTake[t];for(let s of j)m.addAllowedValue(s);m.setValue(j);let P=new OO.ui.FieldLayout(m,{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(([s,p])=>({data:`autofill:${s}`,label:`Autofilled text for ${p}`}))});A.on("change",()=>{this.actionsToTake[t].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(([s,p])=>new OO.ui.MenuOptionWidget({data:p,label:s}))}});W.getMenu().on("choose",()=>{let s=W.getMenu().findSelectedItem();this.actionsToTake[t].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),W.getMenu().selectItemByData("r"),this.actionsToTake[t].closingReason={name:"No response",id:"r"};let S=new OO.ui.FieldLayout(W,{align:"inline",label:"Closing reason:"});S.$element.hide();let D=new OO.ui.TextInputWidget;D.on("change",()=>{let s=D.getValue().trim();s?this.actionsToTake[t].comment=s:delete this.actionsToTake[t].comment});let x=new OO.ui.FieldLayout(D,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});x.$element.hide(),C.append(b.$element[0],g.$element[0],P.$element[0],M.$element[0],S.$element[0],x.$element[0]),a.append(C),this.$body.append(a),this.updateSize()}updateRequestColor(t,e){if(this.requestPageType==="redirect"){let a=Object.values(this.actionsToTake[e].requests),o=a.every(r=>r.action==="accept"||r.action==="deny"),i=a.find(r=>r.action==="close")?.closingReason?.id,c=a.every(r=>r.action==="close"&&r.closingReason?.id===i),n="";if(o){let r=a.filter(d=>d.action==="accept").length,h=a.filter(d=>d.action==="deny").length;r>0&&h>0?n="#fff17e":r>0?n="#a0ffa0":n="#ffcece"}else c&&(i==="r"?n="#ffcece":i==="s"?n="#90c090":n="#b8b8b8");t.style.backgroundColor=n}else{let{action:a}=this.actionsToTake[e],o="";a==="accept"?o="#a0ffa0":a==="deny"?o="#ffcece":a==="close"&&(this.actionsToTake[e].closingReason?.id==="r"?o="#ffcece":this.actionsToTake[e].closingReason?.id==="s"?o="#90c090":o="#b8b8b8"),t.style.backgroundColor=o}}async performActions(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]);let e=new U;t.addWindows([e]),e.open();let a={accepted:0,denied:0,"commented on":0,closed:0},o=(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();if(this.requestPageType==="redirect")if(this.actionsToTake.some(c=>Object.values(c.requests).some(n=>n.action!=="none"))){for(let{target:n,requests:r}of this.actionsToTake){let h=Object.values(r).some(u=>u.action==="accept"||u.action==="deny"),d=Object.values(r).every(u=>u.action==="accept"||u.action==="deny"),f=Object.values(r).find(u=>u.action==="close")?.closingReason?.id,w=Object.values(r).every(u=>u.action==="close"&&u.closingReason?.id===f),O=[],C=[],b=[],k=Object.keys(r).length;for(let[u,g]of Object.entries(r))switch(g.action){case"accept":{h&&!d?e.addLogEntry(`Not all requests to "${n}" were accepted or denied, the handling of "${u}" will be ignored.`,"warning"):(O.push(u),g.comment&&b.push([u,g.comment]),a.accepted++);break}case"deny":{h&&!d?e.addLogEntry(`Not all requests to "${n}" were accepted or denied, the handling of "${u}" is being ignored.`,"warning"):(C.push([u,g.denyReason]),a.denied++);break}case"comment":{g.comment?(b.push([u,g.comment]),a["commented on"]++):e.addLogEntry(`The request to create "${u}" \u2192 "${n}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{w?(g.comment&&b.push([u,g.comment]),a.closed++):e.addLogEntry(`Not all requests to "${n}" were closed with the same reason, the handling of "${u}" is being ignored.`,"warning");break}}let l={pageText:o,...Object.values(r)[0].originalText};if(b.length>0&&(l=this.modifySectionData(l,{append:this.mapComments(b,k===1,b.length===k)})),d){let u;if(O.length>0&&C.length>0){u="p";let g=`* {{subst:AfC redirect}} (${O.map(m=>`[[${m}]]`).join(", ")}) ~~~~`,R=this.mapDeniedReasons(C,!1,!1);for(let m of O)this.handleAcceptedRedirect(m,r[m],n);l=this.modifySectionData(l,{append:`${g}
${R}`})}else if(O.length>0){u="a";for(let g of O)this.handleAcceptedRedirect(g,r[g],n);l=this.modifySectionData(l,{append:`* {{subst:AfC redirect${O.length>1?"|all":""}}} ~~~~`})}else u="d",l=this.modifySectionData(l,{append:this.mapDeniedReasons(C,k===1,!0)});l=this.modifySectionData(l,{prepend:`{{AfC-c|${u}}}`,append:"{{AfC-c|b}}"})}else w&&(l=this.modifySectionData(l,{prepend:`{{AfC-c|${f}}}`,append:"{{AfC-c|b}}"}));o=l.pageText}if(this.beforeText+this.pageContent===o)return e.addLogEntry("No requests have been handled (page content identical)!");let c=Object.entries(a).filter(([,n])=>n>0).map(([n,r])=>`${n} ${r}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:o,summary:`Handling AfC redirect requests (${c})${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!");else if(this.actionsToTake.some(c=>c.action!=="none")){for(let n of this.actionsToTake){let r={pageText:o,...n.originalText};switch(n.action){case"accept":{r=this.modifySectionData(r,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(n),a.accepted++;break}case"deny":{r=this.modifySectionData(r,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(n.denyReason)} ~~~~
{{AfC-c|b}}`}),a.denied++;break}case"comment":{n.comment?(r=this.modifySectionData(r,{append:`* {{AfC comment|1=${n.comment}}} ~~~~`}),a["commented on"]++):e.addLogEntry(`The request to create "${n.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{r=this.modifySectionData(r,{prepend:`{{AfC-c|${n.closingReason.id}}}`,append:(n.comment?`* {{AfC comment|1=${n.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),a.closed++;break}}o=r.pageText}if(this.beforeText+this.pageContent===o)return e.addLogEntry("No requests have been handled (page content identical)!");let c=Object.entries(a).filter(([,n])=>n>0).map(([n,r])=>`${n} ${r}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:o,summary:`Handling AfC category requests (${c})${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!")}formatDeniedReason(t){let e=t.startsWith("autofill:")?/autofill:(\w+)/.exec(t)[1]:`decline|2=${t}`,a=t.includes(",")?" "+t.slice(t.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${e}}}${a}`}mapDeniedReasons(t,e,a){if(e)return`* ${this.formatDeniedReason(t[0][1])} ~~~~`;let o={};for(let[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);let i=Object.entries(o);return i.map(([c,n])=>`* ${this.formatDeniedReason(c)}${i.length>1||!a?` (${n.map(r=>`[[${r}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(t,e,a){if(e)return`* {{AfC comment|1=${t[0][1]}}} ~~~~`;let o={};for(let[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);let i=Object.entries(o);return i.map(([c,n])=>`* {{AfC comment|1=${c}}}${i.length>1||!a?` (${n.map(r=>`[[${r}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(t,{prepend:e,append:a}){let{fullSectionText:o,sectionText:i}=t;return e&&(t.sectionText=e+`
`+t.sectionText),a&&(t.sectionText+=`
`+a),t.fullSectionText=t.fullSectionText.replace(i,t.sectionText),t.pageText=t.pageText.replace(o,t.fullSectionText),t}handleAcceptedRedirect(t,e,a){let o=e.redirectTemplates&&e.redirectTemplates.length>0?e.redirectTemplates.map(c=>{let n=e.redirectTemplateParameters?.find(d=>d.name===c);if(!n)return`{{${c}}}`;let r=n.parameters.findLastIndex((d,f)=>d.name===(f+1).toString()&&d.editor.getValue().trim()),h=n.parameters.map((d,f)=>{let w=d.editor.getValue().trim();return!w&&f>r?null:`|${d.name===(f+1).toString()?"":`${d.name}=`}${w}`}).filter(Boolean).join("");return`{{${c}${h}}}`}):null,i=mw.Title.newFromText(t);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:i.getPrefixedText(),text:`#REDIRECT [[${a}]]${o?`
{{Redirect category shell|
${o.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${a}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:i.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}`})}handleAcceptedCategory(t){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${t.category}`,text:t.parents.map(e=>`[[Category:${e}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${t.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}`},...t.examples.map(e=>({type:"edit",title:e,transform:({content:a})=>({text:`${a}
[[Category:${t.category}]]`,summary:`Adding page to [[:Category:${t.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}async makeAllEditsCreations(t){for(let e of this.editsCreationsToMake){let a=e.type==="edit"?this.api.edit(e.title,e.transform):this.api.create(e.title,{summary:e.summary,watchlist:this.createdPageWatchMethod},e.text),o=document.createElement("a");o.target="_blank",o.href=mw.util.getUrl(e.title,"isRedirect"in e&&e.isRedirect?{redirect:"no"}:void 0),o.textContent=e.title,t.addLogEntry(`${e.type==="edit"?"Editing":"Creating"} ${o.outerHTML}...`),await a.catch(async(i,c)=>{i==="ratelimited"?(t.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(n=>setTimeout(n,7e4)),t.addLogEntry("Continuing...","success"),await a.catch((n,r)=>{t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${r?.error.info??"Unknown error"} (${n}).`,"error")})):t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${c?.error.info??"Unknown error"} (${i}).`,"error")})}}};Object.assign(F.prototype,OO.ui.ProcessDialog.prototype);mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{let T=mw.config.get("wgPageName").replaceAll("_"," "),t=T==="Wikipedia:Articles for creation/Redirects";if(!t&&!(T==="Wikipedia:Articles for creation/Categories"))return;let a=t?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${a} creation requests`,"afcrc-helper").addEventListener("click",i=>{i.preventDefault();let c=new OO.ui.WindowManager;document.body.append(c.$element[0]);let n=new F(a,T,window.afcrcConfiguration?.createdPageWatchMethod);c.addWindows([n]),n.open(),n.load()})});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3BhZ2UtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3Nob3ctYWN0aW9ucy1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWZjcmMtaGVscGVyLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgY2F0ZWdvcmllcz86IHsgdGl0bGU6IHN0cmluZyB9W10gfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBwYWdlIGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlSW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IGRhdGE6IHBhZ2UudGl0bGUsIGxhYmVsOiBwYWdlLnRpdGxlIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihQYWdlSW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFuIGFjdGlvbiBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNob3dBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgY2xvc2VCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIFNob3dBY3Rpb25zRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1Nob3dBY3Rpb25zRGlhbG9nJztcbiAgICAgICAgU2hvd0FjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG5tYXJnaW4tYmxvY2s6IDhweDtcbn1gKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1JlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgIHJlbG9hZEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oU2hvd0FjdGlvbnNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5EaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVkaXRQYWdlUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgTWVkaWFXaWtpRGF0YUVycm9yLCBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RUZW1wbGF0ZURhdGEsIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXInO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBQYWdlSW5wdXRXaWRnZXQgZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5pbXBvcnQgU2hvd0FjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxudHlwZSBSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuaW50ZXJmYWNlIFJlZGlyZWN0UmVxdWVzdERhdGEge1xuICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3Rlcjtcbn1cblxuaW50ZXJmYWNlIENhdGVnb3J5UmVxdWVzdERhdGEge1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgZXhhbXBsZXM6IHN0cmluZ1tdO1xuICAgIHBhcmVudHM6IHN0cmluZ1tdO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdGVyO1xufVxuXG50eXBlIEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmludGVyZmFjZSBBY3Rpb24ge1xuICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHN0cmluZzsgc2VjdGlvblRleHQ6IHN0cmluZyB9O1xuICAgIGFjdGlvbjogQWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbnR5cGUgUmVkaXJlY3RBY3Rpb24gPSBBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbnR5cGUgQ2F0ZWdvcnlBY3Rpb24gPSBBY3Rpb24gJiB7IGNhdGVnb3J5OiBzdHJpbmc7IGV4YW1wbGVzOiBzdHJpbmdbXTsgcGFyZW50czogc3RyaW5nW10gfTtcblxudHlwZSBSZWRpcmVjdEFjdGlvbnMgPSB7IHRhcmdldDogc3RyaW5nOyByZXF1ZXN0czogUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+IH1bXTtcblxudHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBoYW5kbGVzIHJlZGlyZWN0IGFuZCBjYXRlZ29yeSByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWZjcmNIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIHByaXZhdGUgc2NyaXB0TWVzc2FnZSA9ICcgKFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvYWZjcmMtaGVscGVyfGFmY3JjLWhlbHBlcl1dKSc7XG5cbiAgICBwcml2YXRlIHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeSc7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kO1xuXG4gICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgcHJpdmF0ZSBiZWZvcmVUZXh0ITogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBhcnNlZFJlcXVlc3RzOiBSZWRpcmVjdFJlcXVlc3REYXRhW10gfCBDYXRlZ29yeVJlcXVlc3REYXRhW10gPSBbXTtcbiAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyB8IENhdGVnb3J5QWN0aW9ucyA9IFtdO1xuICAgIHByaXZhdGUgZWRpdHNDcmVhdGlvbnNUb01ha2U6IChcbiAgICAgICAgfCB7IHR5cGU6ICdlZGl0JzsgdGl0bGU6IHN0cmluZzsgdHJhbnNmb3JtOiAoZGF0YTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gQXBpRWRpdFBhZ2VQYXJhbXMgfVxuICAgICAgICB8IHsgdHlwZTogJ2NyZWF0ZSc7IGlzUmVkaXJlY3Q6IGJvb2xlYW47IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nIH1cbiAgICApW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeScsIHBhZ2VUaXRsZTogc3RyaW5nLCBjcmVhdGVkV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWZjcmNIZWxwZXJEaWFsb2cnO1xuICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMudGl0bGUgPSAnYWZjcmMtaGVscGVyJztcbiAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbi5hZmNyYy1oZWxwZXItcmVxdWVzdCB7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBjb2xvcjogIzIwMjEyMjtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmFmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yIHtcbiAgICBtaW4td2lkdGg6IDFjaDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDRjaCk7XG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbn1cblxuLmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rIHN2ZyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbyxcbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIge1xuICAgIG1hcmdpbjogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbyA+IGRpdixcbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXYge1xuICAgIG1hcmdpbi1ibG9jazogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyID4gZGl2Omxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQge1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0LWhlYWRlciB7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXQge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5hZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCxcbi5hZmNyYy1jb21tZW50LWlucHV0IHtcbiAgICBtYXgtd2lkdGg6IDUwJTtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcixcbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhMmE5YjE7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgbWFyZ2luLWJsb2NrOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbn1cblxuI2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufWApO1xuICAgIH1cblxuICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NhdmUnKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSByZXR1cm4gQWZjcmNIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBBZmNyY0hlbHBlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQ7XG5cbiAgICAgICAgdGhpcy5wYWdlQ29udGVudCA9IHBhZ2VSZXZpc2lvbi5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZXF1ZXN0cyBmcm9tIHRoZSBwYWdlIGNvbnRlbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RzKCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRleHQgPSAvXiguKj8pPT0vcy5leGVjKHRoaXMucGFnZUNvbnRlbnQpIVsxXTtcblxuICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbLi4udGhpcy5wYWdlQ29udGVudC5tYXRjaEFsbCgvXj09Lio/PT0kKFxccyooPyE9PVtePV0pLiopKi9naW0pXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFswXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uVGV4dCBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IC9ePT0oLio/KT09JC9tLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkUGFnZXMgPSBbLi4uc2VjdGlvbkhlYWRlci5tYXRjaEFsbCgvXFxbXFxbKC4qPyldXS9nKV1cbiAgICAgICAgICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdPy50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnBhZ2VzID0gcmVxdWVzdGVkUGFnZXM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSAvVGFyZ2V0IG9mIHJlZGlyZWN0OiA/XFxbXFxbKC4qPyldXS9cbiAgICAgICAgICAgICAgICAgICAgLmV4ZWMoc2VjdGlvblRleHQpPy5bMV1cbiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXjovLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkVGFyZ2V0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZWFzb24gPSAvcmVhc29uOiA/KC4qPylcXCpzb3VyY2UoPzogXFwoaWYgYXBwbGljYWJsZVxcKSk/Oi9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEuc291cmNlID0gL3NvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86ID8oLio/KSg/OjxyZWZlcmVuY2VzIFxcLz58XFxuXFxuKS9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LmluY2x1ZGVzKCc8cmVmZXJlbmNlcyAvPicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbisoLiopL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKT8uWzFdXG4gICAgICAgICAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvLmV4ZWMocmVxdWVzdGVyKT8uWzFdLnRyaW0oKSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9IHJlcXVlc3RlciAmJiBuYW1lID8geyB0eXBlOiAvXFxbXFxbVXNlciggdGFsayk/Oi8udGVzdChyZXF1ZXN0ZXIpID8gJ3VzZXInIDogJ2lwJywgbmFtZSB9IDogbnVsbDtcblxuICAgICAgICAgICAgICAgICh0aGlzLnBhcnNlZFJlcXVlc3RzIGFzIFJlZGlyZWN0UmVxdWVzdERhdGFbXSkucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBwYXJzZWREYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxTZWN0aW9uVGV4dDogc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENhdGVnb3J5ID0gLzo/Q2F0ZWdvcnk6KC4qPykoXV18JCkvLmV4ZWMoc2VjdGlvbkhlYWRlcik/LlsxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZENhdGVnb3J5KSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEuY2F0ZWdvcnkgPSBmb3VuZENhdGVnb3J5LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5leGFtcGxlcyA9XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvZXhhbXBsZSBwYWdlcyB3aGljaCBiZWxvbmcgdG8gdGhpcyBjYXRlZ29yeTooLio/KShwYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKT8uWzFdID8/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApLm1hdGNoQWxsKC9cXCpcXHMqKD86XFxbXFxbKT8oLio/KShcXHx8XV18XFxzKj9cXG4pL2cpLFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSA/PyBbXTtcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucGFyZW50cyA9XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczooLio/KShcXG5cXG58XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0gPz8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICkubWF0Y2hBbGwoLyg/PCFcXHwpIz86P0NhdGVnb3J5OiguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSA/PyBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlckluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlclRhbGtJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlciB0YWxrOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXBJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbU3BlY2lhbDpDb250cmlidXRpb25zLycpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IE1hdGgubWluKC4uLltmaXJzdFVzZXJJbmRleCwgZmlyc3RVc2VyVGFsa0luZGV4LCBmaXJzdElwSW5kZXhdLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSkpO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaXJzdEluZGV4ID09PSBmaXJzdElwSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6ICdpcCcsIG5hbWU6IC9cXFtcXFtTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC8oLio/KShcXHx8XV0pLy5leGVjKHNlY3Rpb25UZXh0KSFbMV0udHJpbSgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICd1c2VyJywgbmFtZTogL1xcW1xcW1VzZXIoPzogdGFsayk/OiguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZERhdGEucmVxdWVzdGVyPy5uYW1lKSBwYXJzZWREYXRhLnJlcXVlc3RlciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5wYXJzZWRSZXF1ZXN0cyBhcyBDYXRlZ29yeVJlcXVlc3REYXRhW10pLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucykucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWREYXRhLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBleGFtcGxlczogcGFyc2VkRGF0YS5leGFtcGxlcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50czogcGFyc2VkRGF0YS5wYXJlbnRzLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihpbmRleCArIGJhdGNoU2l6ZSwgdGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKGxvYWRpbmcgJHtpbmRleCArIDF9LSR7ZW5kSW5kZXh9LyR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzKWAsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YkluZGV4ID0gaW5kZXg7IHN1YkluZGV4IDwgZW5kSW5kZXg7IHN1YkluZGV4KyspXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0JykgdGhpcy5sb2FkUmVkaXJlY3RSZXF1ZXN0RWxlbWVudHMoc3ViSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMubG9hZENhdGVnb3J5UmVxdWVzdEVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnbm90aWNlJywgbGFiZWw6ICdObyB2YWxpZCByZXF1ZXN0cyB0byBoYW5kbGUhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIGdpdmVuIHJlZGlyZWN0IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRSZWRpcmVjdFJlcXVlc3RFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZXZlbnQua2V5ID09PSAnICcpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldEVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yJyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gcmVxdWVzdC50YXJnZXQ7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RhcmdldEVkaXRvckVsZW1lbnQudmFsdWUubGVuZ3RofWNoYDtcblxuICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS50YXJnZXQgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZCh0YXJnZXRFZGl0b3JFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlubmVySFRNTCA9IGBcbjxzdmcgdmlld2JveD1cIjAgMCA0OCA0OFwiPlxuPHBhdGggZD1cIk0zNiAyNGMtMS4yIDAtMiAwLjgtMiAydjEyYzAgMS4yLTAuOCAyLTIgMmgtMjJjLTEuMlxuICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAwLTYgMi42LTYgNnYyMmMwIDMuNCAyLjYgNiA2IDZoMjJjMy40IDAgNi0yLjZcbiAgICA2LTZ2LTEyYzAtMS4yLTAuOC0yLTItMnpcIj48L3BhdGg+XG48cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgMC0yIDAuOC0yIDJzMC44IDIgMiAyaDcuMmwtMTguNiAxOC42Yy0wLjggMC44LTAuOCAyIDAgMi44IDAuNCAwLjQgMC44XG4gICAgMC42IDEuNCAwLjZzMS0wLjIgMS40LTAuNmwxOC42LTE4LjZ2Ny4yYzAgMS4yIDAuOCAyIDIgMnMyLTAuOFxuICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgcmVhc29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlYXNvbkxhYmVsLnRleHRDb250ZW50ID0gJ1JlYXNvbjogJztcbiAgICAgICAgcmVhc29uRGl2LmFwcGVuZChyZWFzb25MYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgZWxzZSByZWFzb25EaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZWFzb25EaXYpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBzb3VyY2VMYWJlbC50ZXh0Q29udGVudCA9ICdTb3VyY2U6ICc7XG4gICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnNvdXJjZSkgc291cmNlRGl2LmFwcGVuZChyZXF1ZXN0LnNvdXJjZSk7XG4gICAgICAgIGVsc2Ugc291cmNlRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkVGl0bGUgb2YgcmVxdWVzdC5wYWdlcykge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkVGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHJlcXVlc3RlZFRpdGxlO1xuICAgICAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGxhYmVsKTtcblxuICAgICAgICAgICAgbGV0IHRhZ1NlbGVjdExheW91dDogT08udWkuRmllbGRMYXlvdXQsIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcjogSFRNTERldGFpbHNFbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uUmFkaW9JbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuUmFkaW9PcHRpb25XaWRnZXQpLmdldERhdGEoKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICApLnRvTG93ZXJDYXNlKCkgYXMgQWN0aW9uVHlwZTtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmFjdGlvbiA9IG9wdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmICghdGFnU2VsZWN0TGF5b3V0IHx8ICF0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgJHt0YWd9IDxpPihyZWRpcmVjdCB3aXRoIHBvc3NpYmlsaXRpZXMpPC9pPmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAodGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLnJlZGlyZWN0VGVtcGxhdGVzID0gc29ydGVkVGFncztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRlbXBsYXRlRWRpdG9yc0luZm8pIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JJbmZvID0gdGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGFnU2VsZWN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRWRpdG9yc0luZm87XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoWydhY2NlcHQnLCAnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgdGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBwYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90YXJnZXQnLCAnbm9uZXhpc3RlbnQgb3Igbm8gcHJvdmlkZWQgdGFyZ2V0J10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90aXRsZScsICdubyB0aXRsZSBwcm92aWRlZCddLFxuICAgICAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ3VubGlrZWx5IHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgICAgICBbJ25vdHJlZGlyZWN0JywgJ2FydGljbGUgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydleHRlcm5hbGxpbmsnLCAnZXh0ZXJuYWwgbGluayByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbnlSZWFzb24ub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5kZW55UmVhc29uID1cbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbi5nZXRWYWx1ZSgpIHx8ICdhdXRvZmlsbDp1bmxpa2VseSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgICAgICBkZW55UmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuTWVudU9wdGlvbldpZGdldDtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdDb21tZW50OicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChcbiAgICAgICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQocmVxdWVzdGVkVGl0bGVEaXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENhdGVnb3J5UmVxdWVzdEVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdIGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSBgPGI+Q2F0ZWdvcnk6JHtyZXF1ZXN0LmNhdGVnb3J5fTwvYj5gO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICBjb25zdCBleGFtcGxlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGV4YW1wbGVzTGFiZWwudGV4dENvbnRlbnQgPSAnRXhhbXBsZXM6ICc7XG4gICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChleGFtcGxlc0xhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5leGFtcGxlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGV4YW1wbGVdIG9mIHJlcXVlc3QuZXhhbXBsZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGV4YW1wbGUpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gZXhhbXBsZTtcblxuICAgICAgICAgICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoIC0gMSkgZXhhbXBsZXNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIGV4YW1wbGVzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoZXhhbXBsZXNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHBhcmVudHNMYWJlbC50ZXh0Q29udGVudCA9ICdQYXJlbnRzOiAnO1xuICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChwYXJlbnRzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnBhcmVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJlbnRdIG9mIHJlcXVlc3QucGFyZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYENhdGVnb3J5OiR7cGFyZW50fWApO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gcGFyZW50O1xuXG4gICAgICAgICAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LnBhcmVudHMubGVuZ3RoIC0gMSkgcGFyZW50c0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgcGFyZW50c0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHBhcmVudHNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoXG4gICAgICAgICAgICAgICAgKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nXG4gICAgICAgICAgICApLnRvTG93ZXJDYXNlKCkgYXMgQWN0aW9uVHlwZTtcblxuICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5hY3Rpb24gPSBvcHRpb247XG5cbiAgICAgICAgICAgIGlmIChbJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcblxuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RJbnB1dCA9IG5ldyBQYWdlSW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBwYWdlcyBoZXJlJyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYWdlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYWdlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogcGFnZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKHBhZ2VTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgcGFnZVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5leGFtcGxlcyA9IHNvcnRlZFRhZ3M7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgZXhhbXBsZXMgfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGV4YW1wbGVzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShleGFtcGxlKTtcbiAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShleGFtcGxlcyk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYWdlU2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdQYWdlcyB0byBjYXRlZ29yaXplOicgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIGNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKGNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKGNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIGNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLnBhcmVudHMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IHBhcmVudHMgfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudCk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHBhcmVudHMpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNhdGVnb3J5U2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDYXRlZ29yaWVzOicgfSk7XG4gICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ2NhdGVnb3JpZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gaGF2ZSBlbm91Z2ggcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGNhdGVnb3J5JywgJ3BhZ2UgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmRlbnlSZWFzb24gPSBkZW55UmVhc29uLmdldFZhbHVlKCkgfHwgJ2F1dG9maWxsOnVubGlrZWx5JztcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChkZW55UmVhc29uLCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0O1xuXG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICApO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gT2JqZWN0LnZhbHVlcygodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzKTtcblxuICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IGFjdGlvbnNUb1Rha2UuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoXG4gICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChhY2NlcHRlZENvdW50ID4gMCAmJiBkZW5pZWRDb3VudCA+IDApIGJhY2tncm91bmRDb2xvciA9ICcjZmZmMTdlJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2NlcHRlZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWN0aW9uIH0gPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdO1xuXG4gICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1zd2l0Y2hcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdhY2NlcHQnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZW55JykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2xvc2UnKVxuICAgICAgICAgICAgICAgIGlmICgodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BY3Rpb25zKCkge1xuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2hvd0FjdGlvbnNEaWFsb2cgPSBuZXcgU2hvd0FjdGlvbnNEaWFsb2coKTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93QWN0aW9uc0RpYWxvZ10pO1xuICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5vcGVuKCk7XG5cbiAgICAgICAgY29uc3QgY291bnRzID0geyAnYWNjZXB0ZWQnOiAwLCAnZGVuaWVkJzogMCwgJ2NvbW1lbnRlZCBvbic6IDAsICdjbG9zZWQnOiAwIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICAgICAgbGV0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucykuc29tZSgoYWN0aW9uRGF0YSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGFjdGlvbkRhdGEucmVxdWVzdHMpLnNvbWUoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiAhPT0gJ25vbmUnKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YXJnZXQsIHJlcXVlc3RzIH0gb2YgdGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbW91bnRPZlBhZ2VzID0gT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiB3aWxsIGJlIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkUGFnZXMucHVzaChyZXF1ZXN0ZWRUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbmllZFBhZ2VzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uZGVueVJlYXNvbiFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgY2xvc2VkIHdpdGggdGhlIHNhbWUgcmVhc29uLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLk9iamVjdC52YWx1ZXMocmVxdWVzdHMpWzBdLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiB0aGlzLm1hcENvbW1lbnRzKGNvbW1lbnRzLCBhbW91bnRPZlBhZ2VzID09PSAxLCBjb21tZW50cy5sZW5ndGggPT09IGFtb3VudE9mUGFnZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zaW5nSWQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCAmJiBkZW5pZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ3AnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlc01lc3NhZ2UgPSBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdH19ICgke2FjY2VwdGVkUGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSkgfn5+fmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXNNZXNzYWdlID0gdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAke2FjY2VwdGVkUGFnZXNNZXNzYWdlfVxcbiR7ZGVuaWVkUGFnZXNNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdCR7YWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAxID8gJ3xhbGwnIDogJyd9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiBge3tBZkMtY3wke2Nsb3NpbmdJZH19fWAsIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7Zmlyc3RDbG9zZVJlYXNvbn19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAne3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIHJlZGlyZWN0IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucykuc29tZSgoYWN0aW9uRGF0YSkgPT4gYWN0aW9uRGF0YS5hY3Rpb24gIT09ICdub25lJyk7XG5cbiAgICAgICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uRGF0YSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5hY3Rpb25EYXRhLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8YX19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAnKiB7e3N1YnN0OkFmQyBjYXRlZ29yeX19IH5+fn5cXG57e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8ZH19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGFjdGlvbkRhdGEuZGVueVJlYXNvbiEpfSB+fn5+XFxue3tBZkMtY3xifX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25EYXRhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke2FjdGlvbkRhdGEuY2F0ZWdvcnl9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7YWN0aW9uRGF0YS5jbG9zaW5nUmVhc29uIS5pZH19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogKGFjdGlvbkRhdGEuY29tbWVudCA/IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCA6ICcnKSArICdcXG57e0FmQy1jfGJ9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIGNhdGVnb3J5IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIHJlcXVlc3QgZGVuaWFsIHJlYXNvbiB0byBhIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gY2FsbC5cbiAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gdG8gZm9ybWF0LlxuICAgICAqL1xuICAgIHByaXZhdGUgZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGFyYW1ldGVycyA9IHJlYXNvbi5zdGFydHNXaXRoKCdhdXRvZmlsbDonKSA/IC9hdXRvZmlsbDooXFx3KykvLmV4ZWMocmVhc29uKSFbMV0gOiBgZGVjbGluZXwyPSR7cmVhc29ufWA7XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlYXNvbmluZyA9IHJlYXNvbi5pbmNsdWRlcygnLCcpID8gJyAnICsgcmVhc29uLnNsaWNlKHJlYXNvbi5pbmRleE9mKCcsJykgKyAxKS50cmltKCkgOiAnJztcblxuICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAqIEBwYXJhbSBkZW5pZWRQYWdlcyBUaGUgcGFnZXMgdG8gbWFwLlxuICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgbWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlczogc3RyaW5nW11bXSwgc2luZ3VsYXJSZXF1ZXN0OiBib29sZWFuLCBhbGxSZXF1ZXN0czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihkZW5pZWRQYWdlc1swXVsxXSl9IH5+fn5gO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIHJlYXNvbl0gb2YgZGVuaWVkUGFnZXMpIHtcbiAgICAgICAgICAgIGlmICghcmVhc29uc1tyZWFzb25dKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbil9JHtyZWFzb25zQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBDb21tZW50cyhjb21tZW50czogc3RyaW5nW11bXSwgc2luZ3VsYXJSZXF1ZXN0OiBib29sZWFuLCBhbGxSZXF1ZXN0czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudHNbMF1bMV19fX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgY29tbWVudE1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtwYWdlLCBjb21tZW50XSBvZiBjb21tZW50cykge1xuICAgICAgICAgICAgaWYgKCFjb21tZW50TWVzc2FnZXNbY29tbWVudF0pIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSR7Y29tbWVudHNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBwcmVwZW5kaW5nIGFuZCBhcHBlbmRpbmcgdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBtb2RpZnlTZWN0aW9uRGF0YShcbiAgICAgICAgc2VjdGlvbkRhdGE6IHsgcGFnZVRleHQ6IHN0cmluZyB9ICYgQWN0aW9uWydvcmlnaW5hbFRleHQnXSxcbiAgICAgICAgeyBwcmVwZW5kLCBhcHBlbmQgfTogeyBwcmVwZW5kPzogc3RyaW5nOyBhcHBlbmQ/OiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBmdWxsU2VjdGlvblRleHQ6IG9sZEZ1bGxTZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IG9sZFNlY3Rpb25UZXh0IH0gPSBzZWN0aW9uRGF0YTtcblxuICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0ID0gc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0LnJlcGxhY2Uob2xkU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0KTtcblxuICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlOiBzdHJpbmcsIGRhdGE6IFJlZGlyZWN0QWN0aW9uLCB0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9XG4gICAgICAgICAgICBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzICYmIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSBkYXRhLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPy5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZEFyZ3VtZW50RWRpdG9yKSByZXR1cm4gYHt7JHt0YWd9fX1gO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdE51bWJlclBhcmFtZXRlckluZGV4ID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzLmZpbmRMYXN0SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBpbmRleCA+IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHt7JHt0YWd9JHttYXBwZWRBcmd1bWVudHN9fX1gO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChwYWdlKSE7XG5cbiAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IGAjUkVESVJFQ1QgW1ske3RhcmdldH1dXSR7dGFnc1dpdGhBcmd1bWVudHMgPyBgXFxuXFxue3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19YCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIHJlZGlyZWN0IHRvIFtbJHt0YXJnZXR9XV0gYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL1JdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBge3tXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGx8XFxue3tXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258dHM9e3tzdWJzdDpMT0NBTFRJTUVTVEFNUH19fHJldmlld2VyPSR7bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpfX19XFxufX1gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGNhdGVnb3J5LlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShkYXRhOiBDYXRlZ29yeUFjdGlvbikge1xuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLnBhcmVudHMubWFwKChwYXJlbnQpID0+IGBbW0NhdGVnb3J5OiR7cGFyZW50fV1dYCkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5IHRhbGs6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmRhdGEuZXhhbXBsZXMubWFwKChleGFtcGxlKSA9PiAoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICB0aXRsZTogZXhhbXBsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh7IGNvbnRlbnQgfTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYCR7Y29udGVudH1cXG5bW0NhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgcGFnZSB0byBbWzpDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV0gYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYWxsIGVkaXRzIGFuZCBjcmVhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIG1hZGUuXG4gICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gbG9nIHRoZSByZXN1bHRzIHRvLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBTaG93QWN0aW9uc0RpYWxvZykge1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlKSB7XG4gICAgICAgICAgICBjb25zdCBhcGlGdW5jdGlvbiA9XG4gICAgICAgICAgICAgICAgYWN0aW9uLnR5cGUgPT09ICdlZGl0J1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYXBpLmVkaXQoYWN0aW9uLnRpdGxlLCBhY3Rpb24udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuYXBpLmNyZWF0ZShhY3Rpb24udGl0bGUsIHsgc3VtbWFyeTogYWN0aW9uLnN1bW1hcnksIHdhdGNobGlzdDogdGhpcy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kIH0sIGFjdGlvbi50ZXh0KTtcblxuICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChhY3Rpb24udGl0bGUsICdpc1JlZGlyZWN0JyBpbiBhY3Rpb24gJiYgYWN0aW9uLmlzUmVkaXJlY3QgPyB7IHJlZGlyZWN0OiAnbm8nIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBhY3Rpb24udGl0bGU7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH0uLi5gKTtcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKGFzeW5jIChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAncmF0ZWxpbWl0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYFJhdGUgbGltaXRlZC4gV2FpdGluZyBmb3IgNzAgc2Vjb25kcy4uLiAocmVzdW1pbmcgYXQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgNzBfMDAwKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzBfMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0NvbnRpbnVpbmcuLi4nLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSkuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKEFmY3JjSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCBBZmNyY0hlbHBlckRpYWxvZyBmcm9tICcuL2FmY3JjLWhlbHBlci1kaWFsb2cnO1xuXG5leHBvcnQgdHlwZSBXYXRjaE1ldGhvZCA9ICdub2NoYW5nZScgfCAncHJlZmVyZW5jZXMnIHwgJ3Vud2F0Y2gnIHwgJ3dhdGNoJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBhZmNyY0NvbmZpZ3VyYXRpb24/OiB7IGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgKCkgPT4ge1xuICAgIGNvbnN0IHBhZ2VOYW1lID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgY29uc3QgaXNSZWRpcmVjdFJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL1JlZGlyZWN0cyc7XG4gICAgY29uc3QgaXNDYXRlZ29yeVJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL0NhdGVnb3JpZXMnO1xuXG4gICAgaWYgKCFpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgJiYgIWlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhZ2VUeXBlID0gaXNSZWRpcmVjdFJlcXVlc3RQYWdlID8gJ3JlZGlyZWN0JyA6ICdjYXRlZ29yeSc7XG5cbiAgICBjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICcjJyxcbiAgICAgICAgYEhhbmRsZSAke3JlcXVlc3RQYWdlVHlwZX0gY3JlYXRpb24gcmVxdWVzdHNgLFxuICAgICAgICAnYWZjcmMtaGVscGVyJyxcbiAgICApITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgQWZjcmNIZWxwZXJEaWFsb2cocmVxdWVzdFBhZ2VUeXBlLCBwYWdlTmFtZSwgd2luZG93LmFmY3JjQ29uZmlndXJhdGlvbj8uY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCk7XG5cbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFthZmNyY0hlbHBlckRpYWxvZ10pO1xuXG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgYWZjcmNIZWxwZXJEaWFsb2cubG9hZCgpO1xuICAgIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7bUJBTUEsSUFBcUJBLEVBQXJCLGNBQWlELEdBQUcsR0FBRyxl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LE1BQVEsZUFBZSxLQUFLRCxDQUFTLEtBQzVJLE9BQ0osQ0FDUixDQUFDLENBQ0wsQ0FDSixDQUNKLEVBRUEsT0FBTyxPQUFPcEosRUFBa0IsVUFBVyxHQUFHLEdBQUcsY0FBYyxTQUFTLEVDM2hEeEUsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsSUFBTXVKLEVBQVcsR0FBRyxPQUFPLElBQUksWUFBWSxFQUFFLFdBQVcsSUFBSyxHQUFHLEVBRTFEQyxFQUF3QkQsSUFBYSw0Q0FHM0MsR0FBSSxDQUFDQyxHQUF5QixFQUZBRCxJQUFhLDhDQUVXLE9BRXRELElBQU1FLEVBQWtCRCxFQUF3QixXQUFhLFdBRWhELEdBQUcsS0FBSyxlQUNqQixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsVUFBVUMsQ0FBZSxxQkFDekIsY0FDSixFQUVLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFOUMsSUFBTUMsRUFBb0IsSUFBSUMsRUFBa0JKLEVBQWlCRixFQUFVLE9BQU8sb0JBQW9CLHNCQUFzQixFQUU1SEksRUFBYyxXQUFXLENBQUNDLENBQWlCLENBQUMsRUFFNUNBLEVBQWtCLEtBQUssRUFDdkJBLEVBQWtCLEtBQUssQ0FDM0IsQ0FBQyxDQUNMLENBQUMiLAogICJuYW1lcyI6IFsiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiUGFnZUlucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgIlNob3dBY3Rpb25zRGlhbG9nIiwgIl9TaG93QWN0aW9uc0RpYWxvZyIsICJtZXNzYWdlIiwgInR5cGUiLCAibWVzc2FnZVdpZGdldCIsICJyZWxvYWRCdXR0b24iLCAiQWZjcmNIZWxwZXJEaWFsb2ciLCAiX0FmY3JjSGVscGVyRGlhbG9nIiwgInJlcXVlc3RQYWdlVHlwZSIsICJwYWdlVGl0bGUiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImFjdGlvbiIsICJyZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UiLCAicGFnZVJldmlzaW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgIm5hbWUiLCAicGFnZSIsICJmb3VuZENhdGVnb3J5IiwgImZpcnN0VXNlckluZGV4IiwgImZpcnN0VXNlclRhbGtJbmRleCIsICJmaXJzdElwSW5kZXgiLCAiZmlyc3RJbmRleCIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldCIsICJtZXNzYWdlV2lkZ2V0TGF5b3V0IiwgInJlcXVlc3QiLCAiZGV0YWlsc0VsZW1lbnQiLCAic3VtbWFyeUVsZW1lbnQiLCAiZXZlbnQiLCAidGFyZ2V0RWRpdG9yRWxlbWVudCIsICJsaW5rRWxlbWVudCIsICJyZXF1ZXN0SW5mb0VsZW1lbnQiLCAibm9uZUVsZW1lbnQiLCAidW5rbm93bkVsZW1lbnQiLCAicmVhc29uRGl2IiwgInJlYXNvbkxhYmVsIiwgInNvdXJjZURpdiIsICJzb3VyY2VMYWJlbCIsICJyZXF1ZXN0ZXJEaXYiLCAicmVxdWVzdGVyTGFiZWwiLCAicmVxdWVzdGVyTGluayIsICJyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCIsICJyZXF1ZXN0ZWRUaXRsZSIsICJyZXF1ZXN0ZWRUaXRsZURpdiIsICJsYWJlbCIsICJ0YWdTZWxlY3RMYXlvdXQiLCAidGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yIiwgInRlbXBsYXRlRWRpdG9yc0luZm8iLCAiYWN0aW9uUmFkaW9JbnB1dCIsICJvcHRpb24iLCAidGFnU2VsZWN0IiwgInRhZyIsICJyZWRpcmVjdCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJjb21tZW50SW5wdXRMYXlvdXQiLCAidGVtcGxhdGVOYW1lIiwgInRlbXBsYXRlRGF0YSIsICJwYXJhbWV0ZXJzIiwgImRldGFpbHMiLCAic3VtbWFyeSIsICJlbGVtZW50RGF0YSIsICJwYXJhbWV0ZXJOYW1lIiwgInBhcmFtZXRlckRhdGEiLCAiaW5wdXQiLCAiaW5wdXRMYXlvdXQiLCAiY29tbWVudCIsICJjb21tZW50SW5wdXQiLCAiZGVueVJlYXNvbkxheW91dCIsICJjbG9zaW5nUmVhc29uTGF5b3V0IiwgImRlbnlSZWFzb24iLCAidmFsdWUiLCAiY2xvc2luZ1JlYXNvbiIsICJ0aXRsZSIsICJpZCIsICJzZWxlY3RlZCIsICJleGFtcGxlc0RpdiIsICJleGFtcGxlc0xhYmVsIiwgImV4YW1wbGUiLCAicGFyZW50c0RpdiIsICJwYXJlbnRzTGFiZWwiLCAicGFyZW50IiwgInBhZ2VTZWxlY3RMYXlvdXQiLCAiY2F0ZWdvcnlTZWxlY3RMYXlvdXQiLCAicGFnZVNlbGVjdElucHV0IiwgIlBhZ2VJbnB1dFdpZGdldCIsICJwYWdlcyIsICJwYWdlU2VsZWN0IiwgImV4YW1wbGVzIiwgImNhdGVnb3J5U2VsZWN0SW5wdXQiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJjYXRlZ29yeVNlbGVjdCIsICJwYXJlbnRzIiwgImFjdGlvbnNUb1Rha2UiLCAiYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCIsICJmaXJzdENsb3NlUmVhc29uIiwgImFsbFJlcXVlc3RzQ2xvc2VkIiwgImJhY2tncm91bmRDb2xvciIsICJhY2NlcHRlZENvdW50IiwgImRlbmllZENvdW50IiwgIndpbmRvd01hbmFnZXIiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiU2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAidGFyZ2V0IiwgInJlcXVlc3RzIiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWNjZXB0ZWRQYWdlcyIsICJkZW5pZWRQYWdlcyIsICJjb21tZW50cyIsICJhbW91bnRPZlBhZ2VzIiwgInNlY3Rpb25EYXRhIiwgImNsb3NpbmdJZCIsICJhY2NlcHRlZFBhZ2VzTWVzc2FnZSIsICJkZW5pZWRQYWdlc01lc3NhZ2UiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgInJlYXNvbiIsICJ0ZW1wbGF0ZVBhcmFtZXRlcnMiLCAiYWRkaXRpb25hbFJlYXNvbmluZyIsICJzaW5ndWxhclJlcXVlc3QiLCAiYWxsUmVxdWVzdHMiLCAicmVhc29ucyIsICJyZWFzb25zQXJyYXkiLCAiY29tbWVudE1lc3NhZ2VzIiwgImNvbW1lbnRzQXJyYXkiLCAicHJlcGVuZCIsICJhcHBlbmQiLCAib2xkRnVsbFNlY3Rpb25UZXh0IiwgIm9sZFNlY3Rpb25UZXh0IiwgImRhdGEiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgiLCAicGFyYW1ldGVyIiwgIm1hcHBlZEFyZ3VtZW50cyIsICJjb250ZW50IiwgImFwaUZ1bmN0aW9uIiwgImVycm9yQ29kZSIsICJlcnJvckluZm8iLCAicmVzb2x2ZSIsICJwYWdlTmFtZSIsICJpc1JlZGlyZWN0UmVxdWVzdFBhZ2UiLCAicmVxdWVzdFBhZ2VUeXBlIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciLCAiQWZjcmNIZWxwZXJEaWFsb2ciXQp9Cg==