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.ts
"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{const z=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Redirects",Y=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Categories";if(!z&&!Y)return;const F=z?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${F} creation requests`,"afcrc-helper").addEventListener("click",B=>{B.preventDefault();const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new I(F,mw.config.get("wgPageName").replaceAll("_"," "),window.afcrcConfiguration?.createdPageWatchMethod);t.addWindows([e]),e.open(),e.load()});class N extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),N.static.name="ShowActionsDialog",N.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"){const 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();const t=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});t.on("click",()=>window.location.reload()),this.contentLayout.$element.append(t.$element)}}Object.assign(N.prototype,OO.ui.Dialog.prototype);class _ extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const 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){const 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(_.prototype,OO.ui.mixin.LookupElement.prototype);class Q extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const 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){const i=o.query.pages.filter(c=>!c.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(c=>{const 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(Q.prototype,OO.ui.mixin.LookupElement.prototype);class I 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"}),I.static.name="AfcrcHelperDialog",I.static.title="afcrc-helper",I.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 {
color: #202122;
background-color: #eee;
border-radius: 5px;
margin: 10px;
padding: 5px;
}
.afcrc-helper-request summary {
cursor: pointer;
}
.afcrc-helper-target-editor {
font-family: monospace;
min-width: 1ch;
max-width: calc(100% - 4ch);
}
.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 {
background-color: #fff;
border: 1px solid #a2a9b1;
border-radius: 2px;
margin-block: 10px;
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 {
background-color: #e2e2e2;
margin-block: 5px;
}
#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()}):I.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>I.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});async load(){const 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||"{}");const 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,"==");const t=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(e=>e[0]);for(const e of t){if(/{{afc-c\|/i.test(e))continue;const o=/^==(.*?)==$/m.exec(e)[1].trim();if(F==="redirect"){const i={},c=[...o.matchAll(/\[\[(.*?)]]/g)].map(d=>d[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(c.length===0)continue;i.pages=c;const 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()??"";const 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{const 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)??[];const 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;const e=()=>{const 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{const 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){const e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const 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()});const 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);const 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);const n=document.createElement("div");n.classList.add("afcrc-helper-request-info");const r=document.createElement("span");r.style.color="dimgray",r.textContent="None";const h=document.createElement("span");h.style.color="dimgray",h.textContent="Unknown";const 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);const w=document.createElement("div"),b=document.createElement("b");b.textContent="Source: ",w.append(b),e.source?w.append(e.source):w.append(r.cloneNode(!0)),n.append(w);const O=document.createElement("div"),T=document.createElement("b");if(T.textContent="Requester: ",O.append(T),e.requester){const 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,O.append(l)}else O.append(h.cloneNode(!0));n.append(O),a.append(n),a.append(document.createElement("hr"));const C=document.createElement("div");C.classList.add("afcrc-helper-request-responder");for(const l of e.pages){const u=document.createElement("div"),g=document.createElement("b");g.textContent=l,u.append(g);let k,m;const j=[],L=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}))});L.selectItemByLabel("None"),L.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const s=L.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].requests[l].action=s,!k||!m){const p=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([x,{redirect:D}])=>{if(!D)return{data:x,label:x};const v=new OO.ui.HtmlSnippet(`${x} <i>(redirect with possibilities)</i>`);return{data:x,label:v}})});p.getMenu().filterMode="substring",p.on("change",()=>{const x=p.getValue().sort((v,E)=>v.toLowerCase().localeCompare(E.toLowerCase()));p.getValue().join(";")!==x.join(";")&&p.setValue(x),this.actionsToTake[t].requests[l].redirectTemplates=x;for(const v of j)v.details.style.display="none";let D=0;for(const v of p.getValue()){const E=j.find(U=>U.name===v);E&&(E.details.style.display="block",D++)}y.textContent=`Template parameters (${D>0?`for ${D} template${D>1?"s":""}`:"none to show"})`,V.style.display=D>0?"none":"block"}),k=new OO.ui.FieldLayout(p,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),A.$element[0].before(k.$element[0]),m=document.createElement("details"),m.classList.add("afcrc-helper-template-parameters-container");const y=document.createElement("summary");y.textContent="Template parameters (none to show)",m.append(y);for(const[x,D]of Object.entries(this.redirectTemplates)){const v=Object.entries(D.parameters);if(v.length===0)continue;const E=document.createElement("details");E.style.display="none";const U=document.createElement("summary");U.textContent=x,E.append(U);const J={name:x,details:E,parameters:[]};for(const[H,R]of v){const G=new OO.ui.TextInputWidget({placeholder:R.default?.toString(),required:R.required}),K=new OO.ui.FieldLayout(G,{label:new OO.ui.HtmlSnippet(`${H}${!R.label||H.toLowerCase()===R.label?.toLowerCase()?"":` (${R.label})`}${R.description?` (${R.description})`:""} (type: ${R.type}) ${R.suggested?" (suggested)":""}${R.example?` (example: "${R.example}")`:""}`),align:"inline"});E.append(K.$element[0]),J.parameters.push({name:H,aliases:R.aliases,editor:G})}m.append(E),j.push(J)}this.actionsToTake[t].requests[l].redirectTemplateParameters=j;const V=document.createElement("div");V.id="afcrc-helper-no-templates-message",V.textContent="No templates with parameters to display!",m.append(V),A.$element[0].before(m)}if(["accept","comment","close"].includes(s)){A.$element.show();const p=S.getValue().trim();p?this.actionsToTake[t].requests[l].comment=p:delete this.actionsToTake[t].requests[l].comment}else A.$element.hide(),delete this.actionsToTake[t].requests[l].comment;switch(this.updateRequestColor(a,t),k.$element.hide(),m.style.display="none",P.$element.hide(),W.$element.hide(),s){case"accept":{k.$element.show(),m.style.display="block";break}case"deny":{P.$element.show();break}case"close":{W.$element.show();break}}});const q=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}`}))});q.on("change",()=>{this.actionsToTake[t].requests[l].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const M=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}))}});M.getMenu().on("choose",()=>{const s=M.getMenu().findSelectedItem();this.actionsToTake[t].requests[l].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),M.getMenu().selectItemByData("r"),this.actionsToTake[t].requests[l].closingReason={name:"No response",id:"r"};const W=new OO.ui.FieldLayout(M,{align:"inline",label:"Closing reason:"});W.$element.hide();const S=new OO.ui.TextInputWidget;S.on("change",()=>{const s=S.getValue().trim();s?this.actionsToTake[t].requests[l].comment=s:delete this.actionsToTake[t].requests[l].comment});const A=new OO.ui.FieldLayout(S,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),u.append(L.$element[0],P.$element[0],W.$element[0],A.$element[0]),C.append(u)}a.append(C),this.$body.append(a),this.updateSize()}loadCategoryRequestElements(t){const e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const o=document.createElement("summary");o.innerHTML=`<b>Category:${e.category}</b>`,a.append(o);const i=document.createElement("div");i.classList.add("afcrc-helper-request-info");const c=document.createElement("span");c.style.color="dimgray",c.textContent="None";const n=document.createElement("span");n.style.color="dimgray",n.textContent="Unknown";const r=document.createElement("div"),h=document.createElement("b");if(h.textContent="Examples: ",r.append(h),e.examples.length>0)for(const[s,p]of e.examples.entries()){const 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);const d=document.createElement("div"),f=document.createElement("b");if(f.textContent="Parents: ",d.append(f),e.parents.length>0)for(const[s,p]of e.parents.entries()){const 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);const w=document.createElement("div"),b=document.createElement("b");if(b.textContent="Requester: ",w.append(b),e.requester){const 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"));const O=document.createElement("div");O.classList.add("afcrc-helper-request-responder");const T=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}))});T.selectItemByLabel("None"),T.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const s=T.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].action=s,["comment","close"].includes(s)){A.$element.show();const p=S.getValue().trim();p?this.actionsToTake[t].comment=p:delete this.actionsToTake[t].comment}else A.$element.hide(),delete this.actionsToTake[t].comment;switch(this.updateRequestColor(a,t),g.$element.hide(),L.$element.hide(),P.$element.hide(),W.$element.hide(),s){case"accept":{g.$element.show(),L.$element.show();break}case"deny":{P.$element.show();break}case"close":{W.$element.show();break}}});const C=new _({placeholder:"Add pages here"});C.on("change",()=>{let s=C.getValue();s=s.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),s=s.replace(/^:/,""),s.length>0&&C.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),C.on("showing-values",s=>{for(const p of s)l.addAllowedValue(p.data)});const l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:C});l.on("change",()=>{const s=l.getValue().sort((p,y)=>p.toLowerCase().localeCompare(y.toLowerCase()));l.getValue().join(";")!==s.join(";")&&l.setValue(s),this.actionsToTake[t].examples=s});const{examples:u}=this.actionsToTake[t];for(const s of u)l.addAllowedValue(s);l.setValue(u);const g=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});g.$element.hide();const k=new Q({placeholder:"Add categories 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(/^Category:/,""),s.length>0&&k.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),k.on("showing-values",s=>{for(const p of s)m.addAllowedValue(p.data)});const m=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:k});m.on("change",()=>{const s=m.getValue().sort((p,y)=>p.toLowerCase().localeCompare(y.toLowerCase()));m.getValue().join(";")!==s.join(";")&&m.setValue(s),this.actionsToTake[t].parents=s});const{parents:j}=this.actionsToTake[t];for(const s of j)m.addAllowedValue(s);m.setValue(j);const L=new OO.ui.FieldLayout(m,{align:"inline",label:"Categories:"});L.$element.hide();const q=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}`}))});q.on("change",()=>{this.actionsToTake[t].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const M=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}))}});M.getMenu().on("choose",()=>{const s=M.getMenu().findSelectedItem();this.actionsToTake[t].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),M.getMenu().selectItemByData("r"),this.actionsToTake[t].closingReason={name:"No response",id:"r"};const W=new OO.ui.FieldLayout(M,{align:"inline",label:"Closing reason:"});W.$element.hide();const S=new OO.ui.TextInputWidget;S.on("change",()=>{const s=S.getValue().trim();s?this.actionsToTake[t].comment=s:delete this.actionsToTake[t].comment});const A=new OO.ui.FieldLayout(S,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),O.append(T.$element[0],g.$element[0],L.$element[0],P.$element[0],W.$element[0],A.$element[0]),a.append(O),this.$body.append(a),this.updateSize()}updateRequestColor(t,e){if(this.requestPageType==="redirect"){const 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);let n="";if(o){const 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{const{action:a}=this.actionsToTake[e];let 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(){const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new N;t.addWindows([e]),e.open();const a={accepted:0,denied:0,"commented on":0,closed:0};let 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(const{target:n,requests:r}of this.actionsToTake){const 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),b=[],O=[],T=[],C=Object.keys(r).length;for(const[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"):(b.push(u),g.comment&&T.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"):(O.push([u,g.denyReason]),a.denied++);break}case"comment":{g.comment?(T.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&&T.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(T.length>0&&(l=this.modifySectionData(l,{append:this.mapComments(T,C===1,T.length===C)})),d){let u;if(b.length>0&&O.length>0){u="p";const g=`* {{subst:AfC redirect}} (${b.map(m=>`[[${m}]]`).join(", ")}) ~~~~`,k=this.mapDeniedReasons(O,!1,!1);for(const m of b)this.handleAcceptedRedirect(m,r[m],n);l=this.modifySectionData(l,{append:`${g}
${k}`})}else if(b.length>0){u="a";for(const g of b)this.handleAcceptedRedirect(g,r[g],n);l=this.modifySectionData(l,{append:`* {{subst:AfC redirect${b.length>1?"|all":""}}} ~~~~`})}else u="d",l=this.modifySectionData(l,{append:this.mapDeniedReasons(O,C===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)!");const 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(const 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)!");const 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){const 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])} ~~~~`;const o={};for(const[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);const 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]}}} ~~~~`;const o={};for(const[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);const 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}){const{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){const o=e.redirectTemplates&&e.redirectTemplates.length>0?e.redirectTemplates.map(c=>{const n=e.redirectTemplateParameters?.find(d=>d.name===c);if(!n)return`{{${c}}}`;const r=n.parameters.findLastIndex((d,f)=>d.name===(f+1).toString()&&d.editor.getValue().trim()),h=n.parameters.map((d,f)=>{const 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(const e of this.editsCreationsToMake){const 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(I.prototype,OO.ui.ProcessDialog.prototype)});
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQXBpRWRpdFBhZ2VQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCBNZWRpYVdpa2lEYXRhRXJyb3IsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi9nbG9iYWwtdHlwZXMnOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhLCBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXInO1xuXG50eXBlIFdhdGNoTWV0aG9kID0gJ25vY2hhbmdlJyB8ICdwcmVmZXJlbmNlcycgfCAndW53YXRjaCcgfCAnd2F0Y2gnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGFmY3JjQ29uZmlndXJhdGlvbj86IHsgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2QgfTtcbiAgICB9XG59XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJ10sICgpID0+IHtcbiAgICBjb25zdCBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXNfZm9yX2NyZWF0aW9uL1JlZGlyZWN0cyc7XG4gICAgY29uc3QgaXNDYXRlZ29yeVJlcXVlc3RQYWdlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpID09PSAnV2lraXBlZGlhOkFydGljbGVzX2Zvcl9jcmVhdGlvbi9DYXRlZ29yaWVzJztcblxuICAgIGlmICghaXNSZWRpcmVjdFJlcXVlc3RQYWdlICYmICFpc0NhdGVnb3J5UmVxdWVzdFBhZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHJlcXVlc3RQYWdlVHlwZSA9IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA/ICdyZWRpcmVjdCcgOiAnY2F0ZWdvcnknO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAnIycsXG4gICAgICAgIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCxcbiAgICAgICAgJ2FmY3JjLWhlbHBlcicsXG4gICAgKSE7XG5cbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGNvbnN0IGFmY3JjSGVscGVyRGlhbG9nID0gbmV3IEFmY3JjSGVscGVyRGlhbG9nKFxuICAgICAgICAgICAgcmVxdWVzdFBhZ2VUeXBlLFxuICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnJlcGxhY2VBbGwoJ18nLCAnICcpLFxuICAgICAgICAgICAgd2luZG93LmFmY3JjQ29uZmlndXJhdGlvbj8uY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCxcbiAgICAgICAgKTtcblxuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW2FmY3JjSGVscGVyRGlhbG9nXSk7XG5cbiAgICAgICAgYWZjcmNIZWxwZXJEaWFsb2cub3BlbigpO1xuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5sb2FkKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFuIGFjdGlvbiBkaWFsb2cuXG4gICAgICovXG4gICAgY2xhc3MgU2hvd0FjdGlvbnNEaWFsb2cgZXh0ZW5kcyBPTy51aS5EaWFsb2cge1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBsb2dPdXRwdXQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBjbG9zZUJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcblxuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICAgICAgU2hvd0FjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnU2hvd0FjdGlvbnNEaWFsb2cnO1xuICAgICAgICAgICAgU2hvd0FjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuLmFmY3JjLWhlbHBlci1hY3Rpb25zLWNvbnRhaW5lciBkaXYge1xuICAgIG1hcmdpbi1ibG9jazogOHB4O1xufWApO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZCh0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ091dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9KTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgbG9nIGVudHJ5IHRvIHRoZSBkaWFsb2cuXG4gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC5cbiAgICAgICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBhZGRMb2dFbnRyeShtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IE9PLnVpLk1lc3NhZ2VXaWRnZXQuVHlwZSA9ICdub3RpY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nT3V0cHV0LmFwcGVuZChtZXNzYWdlV2lkZ2V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBzaG93UmVsb2FkKCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICAgICAgY29uc3QgcmVsb2FkQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnUmVsb2FkJywgZmxhZ3M6IFsncHJpbWFyeSddIH0pO1xuICAgICAgICAgICAgcmVsb2FkQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oU2hvd0FjdGlvbnNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5EaWFsb2cucHJvdG90eXBlKTtcblxuICAgIGludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHBhZ2UgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgUGFnZUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmcgfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IGRhdGE6IHBhZ2UudGl0bGUsIGxhYmVsOiBwYWdlLnRpdGxlIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFBhZ2VJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICBpbnRlcmZhY2UgUmVkaXJlY3RSZXF1ZXN0RGF0YSB7XG4gICAgICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgcmVxdWVzdGVyOiB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgQ2F0ZWdvcnlSZXF1ZXN0RGF0YSB7XG4gICAgICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgICAgIGV4YW1wbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgcGFyZW50czogc3RyaW5nW107XG4gICAgICAgIHJlcXVlc3RlcjogeyB0eXBlOiAndXNlcicgfCAnaXAnOyBuYW1lOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgfVxuXG4gICAgdHlwZSBBY3Rpb25UeXBlID0gJ2FjY2VwdCcgfCAnZGVueScgfCAnY29tbWVudCcgfCAnY2xvc2UnIHwgJ25vbmUnO1xuXG4gICAgaW50ZXJmYWNlIEFjdGlvbiB7XG4gICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHN0cmluZzsgc2VjdGlvblRleHQ6IHN0cmluZyB9O1xuICAgICAgICBhY3Rpb246IEFjdGlvblR5cGU7XG4gICAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIGNsb3NpbmdSZWFzb24/OiB7IG5hbWU6IHN0cmluZzsgaWQ6IHN0cmluZyB9O1xuICAgIH1cblxuICAgIHR5cGUgUmVkaXJlY3RBY3Rpb24gPSBBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbiAgICB0eXBlIENhdGVnb3J5QWN0aW9uID0gQWN0aW9uICYgeyBjYXRlZ29yeTogc3RyaW5nOyBleGFtcGxlczogc3RyaW5nW107IHBhcmVudHM6IHN0cmluZ1tdIH07XG5cbiAgICB0eXBlIFJlZGlyZWN0QWN0aW9ucyA9IHsgdGFyZ2V0OiBzdHJpbmc7IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4gfVtdO1xuXG4gICAgdHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICAgICAqL1xuICAgIGNsYXNzIEFmY3JjSGVscGVyRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIHByaXZhdGUgc2NyaXB0TWVzc2FnZSA9ICcgKFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvYWZjcmMtaGVscGVyfGFmY3JjLWhlbHBlcl1dKSc7XG5cbiAgICAgICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcblxuICAgICAgICBwcml2YXRlIGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kO1xuXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgICAgICBwcml2YXRlIGJlZm9yZVRleHQhOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICAgICAgcHJpdmF0ZSBwYXJzZWRSZXF1ZXN0czogUmVkaXJlY3RSZXF1ZXN0RGF0YVtdIHwgQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgICAgIHByaXZhdGUgYWN0aW9uc1RvVGFrZTogUmVkaXJlY3RBY3Rpb25zIHwgQ2F0ZWdvcnlBY3Rpb25zID0gW107XG4gICAgICAgIHByaXZhdGUgZWRpdHNDcmVhdGlvbnNUb01ha2U6IChcbiAgICAgICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgICAgIHwgeyB0eXBlOiAnY3JlYXRlJzsgaXNSZWRpcmVjdDogYm9vbGVhbjsgdGl0bGU6IHN0cmluZzsgdGV4dDogc3RyaW5nOyBzdW1tYXJ5OiBzdHJpbmcgfVxuICAgICAgICApW10gPSBbXTtcblxuICAgICAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kPzogV2F0Y2hNZXRob2QpIHtcbiAgICAgICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWZjcmNIZWxwZXJEaWFsb2cnO1xuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ2FmY3JjLWhlbHBlcic7XG4gICAgICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ3NhdmUnLCBsYWJlbDogJ1J1bicsIGZsYWdzOiBbJ3ByaW1hcnknLCAncHJvZ3Jlc3NpdmUnXSB9LFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RQYWdlVHlwZSA9IHJlcXVlc3RQYWdlVHlwZTtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kID1cbiAgICAgICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZWRXYXRjaE1ldGhvZFxuICAgICAgICAgICAgICAgICAgICA6ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbi5hZmNyYy1oZWxwZXItcmVxdWVzdCB7XG4gICAgY29sb3I6ICMyMDIxMjI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmFmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yIHtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIG1pbi13aWR0aDogMWNoO1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNGNoKTtcbn1cblxuLmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rIHN2ZyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbywgLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciB7XG4gICAgbWFyZ2luOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvID4gZGl2LCAuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyID4gZGl2IHtcbiAgICBtYXJnaW4tYmxvY2s6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciA+IGRpdjpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0IHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dC1oZWFkZXIge1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbn1cblxuLmFmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8ge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8gLm9vLXVpLXJhZGlvT3B0aW9uV2lkZ2V0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgcGFkZGluZzogOHB4O1xufVxuXG4uYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQsIC5hZmNyYy1jb21tZW50LWlucHV0IHtcbiAgICBtYXgtd2lkdGg6IDUwJTtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciwgLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhMmE5YjE7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIG1hcmdpbi1ibG9jazogMTBweDtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIge1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7XG4gICAgbWFyZ2luLWJsb2NrOiA1cHg7XG59XG5cbiNhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdjYW5jZWwnKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnc2F2ZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gQWZjcmNIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBBZmNyY0hlbHBlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkIGVsZW1lbnRzIGluIHRoZSB3aW5kb3cuXG4gICAgICAgICAqL1xuICAgICAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlLnF1ZXJ5LnBhZ2VzPy5bMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgICAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCA9IHBhZ2VSZXZpc2lvbi5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZVJlcXVlc3RzKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFyc2VSZXF1ZXN0cygpIHtcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gWy4uLnRoaXMucGFnZUNvbnRlbnQubWF0Y2hBbGwoL149PS4qPz09JChcXHMqKD8hPT1bXj1dKS4qKSovZ2ltKV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMF0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Nsb3NlZCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIFJlZGlyZWN0UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkUGFnZXMgPSBbLi4uc2VjdGlvbkhlYWRlci5tYXRjaEFsbCgvXFxbXFxbKC4qPyldXS9nKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXT8udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5wYWdlcyA9IHJlcXVlc3RlZFBhZ2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IC9UYXJnZXQgb2YgcmVkaXJlY3Q6ID9cXFtcXFsoLio/KV1dL1xuICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWMoc2VjdGlvblRleHQpPy5bMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eOi8sICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZFRhcmdldCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS50YXJnZXQgPSBwYXJzZWRUYXJnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZWFzb24gPSAvcmVhc29uOiA/KC4qPylcXCpzb3VyY2UoPzogXFwoaWYgYXBwbGljYWJsZVxcKSk/Oi9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG5cXG4pL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbisoLiopL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoPzo8cmVmZXJlbmNlcyBcXFxcLz4ke3BhcnNlZERhdGEuc291cmNlID8gYHwke3BhcnNlZERhdGEuc291cmNlLnJlcGxhY2VBbGwoL1tcXHMjJCgpKissLj9bXFxcXFxcXV57fH0tXS9nLCAnXFxcXCQmJyl9YCA6ICcnfSlcXG4rKC4qKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvLmV4ZWMocmVxdWVzdGVyKT8uWzFdLnRyaW0oKSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSByZXF1ZXN0ZXIgJiYgbmFtZSA/IHsgdHlwZTogL1xcW1xcW1VzZXIoIHRhbGspPzovLnRlc3QocmVxdWVzdGVyKSA/ICd1c2VyJyA6ICdpcCcsIG5hbWUgfSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMucGFyc2VkUmVxdWVzdHMgYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YVtdKS5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyc2VkRGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBDYXRlZ29yeVJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ2F0ZWdvcnkgPSAvOj9DYXRlZ29yeTooLio/KShdXXwkKS8uZXhlYyhzZWN0aW9uSGVhZGVyKT8uWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZENhdGVnb3J5KSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmNhdGVnb3J5ID0gZm91bmRDYXRlZ29yeS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmV4YW1wbGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9leGFtcGxlIHBhZ2VzIHdoaWNoIGJlbG9uZyB0byB0aGlzIGNhdGVnb3J5OiguKj8pKHBhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6fFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubWF0Y2hBbGwoL1xcKlxccyooPzpcXFtcXFspPyguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucGFyZW50cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczooLio/KShcXG5cXG58XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLm1hdGNoQWxsKC8oPzwhXFx8KSM/Oj9DYXRlZ29yeTooLio/KShcXHx8XV18XFxzKj9cXG4pL2cpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW107XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RVc2VySW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXI6Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlclRhbGtJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlciB0YWxrOicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdElwSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8nKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gTWF0aC5taW4oLi4uW2ZpcnN0VXNlckluZGV4LCBmaXJzdFVzZXJUYWxrSW5kZXgsIGZpcnN0SXBJbmRleF0uZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaXJzdEluZGV4ID09PSBmaXJzdElwSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAnaXAnLCBuYW1lOiAvXFxbXFxbU3BlY2lhbDpDb250cmlidXRpb25zXFwvKC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3VzZXInLCBuYW1lOiAvXFxbXFxbVXNlcig/OiB0YWxrKT86KC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZERhdGEucmVxdWVzdGVyPy5uYW1lKSBwYXJzZWREYXRhLnJlcXVlc3RlciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMucGFyc2VkUmVxdWVzdHMgYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdKS5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWREYXRhLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXM6IHBhcnNlZERhdGEuZXhhbXBsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cyBpbiB0aGUgZGlhbG9nLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFNpemUgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBgYWZjcmMtaGVscGVyIChsb2FkaW5nICR7aW5kZXggKyAxfS0ke2VuZEluZGV4fS8ke3RoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RofSByZXF1ZXN0cylgLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YkluZGV4ID0gaW5kZXg7IHN1YkluZGV4IDwgZW5kSW5kZXg7IHN1YkluZGV4KyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHRoaXMubG9hZFJlZGlyZWN0UmVxdWVzdEVsZW1lbnRzKHN1YkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5sb2FkQ2F0ZWdvcnlSZXF1ZXN0RWxlbWVudHMoc3ViSW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChoYW5kbGUsIDApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAoJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMgbG9hZGVkKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBoYW5kbGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ25vdGljZScsIGxhYmVsOiAnTm8gdmFsaWQgcmVxdWVzdHMgdG8gaGFuZGxlIScgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQobWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBhIGdpdmVuIHJlZGlyZWN0IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRSZWRpcmVjdFJlcXVlc3RFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF0gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8udGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBldmVudC5rZXkgPT09ICcgJykgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFZGl0b3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3InKTtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHJlcXVlc3QudGFyZ2V0O1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLmxlbmd0aH1jaGA7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnRhcmdldCA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKHRhcmdldEVkaXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rJyk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5pbm5lckhUTUwgPSBgXG48c3ZnIHZpZXdib3g9XCIwIDAgNDggNDhcIj5cbiAgICA8cGF0aCBkPVwiTTM2IDI0Yy0xLjIgMC0yIDAuOC0yIDJ2MTJjMCAxLjItMC44IDItMiAyaC0yMmMtMS4yXG4gICAgICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAgICAgMC02IDIuNi02IDZ2MjJjMCAzLjQgMi42IDYgNiA2aDIyYzMuNCAwIDYtMi42XG4gICAgICAgIDYtNnYtMTJjMC0xLjItMC44LTItMi0yelwiPjwvcGF0aD5cbiAgICA8cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgICAgIDAtMiAwLjgtMiAyczAuOCAyIDIgMmg3LjJsLTE4LjYgMTguNmMtMC44IDAuOC0wLjggMiAwIDIuOCAwLjQgMC40IDAuOFxuICAgICAgICAwLjYgMS40IDAuNnMxLTAuMiAxLjQtMC42bDE4LjYtMTguNnY3LjJjMCAxLjIgMC44IDIgMiAyczItMC44XG4gICAgICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgICAgICBjb25zdCByZWFzb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICByZWFzb25MYWJlbC50ZXh0Q29udGVudCA9ICdSZWFzb246ICc7XG4gICAgICAgICAgICByZWFzb25EaXYuYXBwZW5kKHJlYXNvbkxhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgICAgIGVsc2UgcmVhc29uRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlYXNvbkRpdik7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIHNvdXJjZUxhYmVsLnRleHRDb250ZW50ID0gJ1NvdXJjZTogJztcbiAgICAgICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2UpIHNvdXJjZURpdi5hcHBlbmQocmVxdWVzdC5zb3VyY2UpO1xuICAgICAgICAgICAgZWxzZSBzb3VyY2VEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWRUaXRsZSBvZiByZXF1ZXN0LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkVGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVxdWVzdGVkVGl0bGU7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGxhYmVsKTtcblxuICAgICAgICAgICAgICAgIGxldCB0YWdTZWxlY3RMYXlvdXQ6IE9PLnVpLkZpZWxkTGF5b3V0LCB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3I6IEhUTUxEZXRhaWxzRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uUmFkaW9JbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuUmFkaW9PcHRpb25XaWRnZXQpLmdldERhdGEoKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgKS50b0xvd2VyQ2FzZSgpIGFzIEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnU2VsZWN0TGF5b3V0IHx8ICF0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgoW3RhZywgeyByZWRpcmVjdCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgJHt0YWd9IDxpPihyZWRpcmVjdCB3aXRoIHBvc3NpYmlsaXRpZXMpPC9pPmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5yZWRpcmVjdFRlbXBsYXRlcyA9IHNvcnRlZFRhZ3M7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0YWdTZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRlbXBsYXRlczonLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVkaXRvcnNJbmZvO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ2FjY2VwdCcsICdjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkZW55UmVhc29uID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBwYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydub3RhcmdldCcsICdub25leGlzdGVudCBvciBubyBwcm92aWRlZCB0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnbm90aXRsZScsICdubyB0aXRsZSBwcm92aWRlZCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICd1bmxpa2VseSByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnbm90cmVkaXJlY3QnLCAnYXJ0aWNsZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydleHRlcm5hbGxpbmsnLCAnZXh0ZXJuYWwgbGluayByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnZWRpdHJlcXVlc3QnLCAnZWRpdCByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbi5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5kZW55UmVhc29uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbiA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDb21tZW50OicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQocmVxdWVzdGVkVGl0bGVEaXYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRDYXRlZ29yeVJlcXVlc3RFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF0gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gYDxiPkNhdGVnb3J5OiR7cmVxdWVzdC5jYXRlZ29yeX08L2I+YDtcbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgICAgIGNvbnN0IGV4YW1wbGVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGV4YW1wbGVzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICBleGFtcGxlc0xhYmVsLnRleHRDb250ZW50ID0gJ0V4YW1wbGVzOiAnO1xuICAgICAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGV4YW1wbGVzTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5leGFtcGxlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBleGFtcGxlXSBvZiByZXF1ZXN0LmV4YW1wbGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChleGFtcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBleGFtcGxlO1xuXG4gICAgICAgICAgICAgICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCAtIDEpIGV4YW1wbGVzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGV4YW1wbGVzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKGV4YW1wbGVzRGl2KTtcblxuICAgICAgICAgICAgY29uc3QgcGFyZW50c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICBwYXJlbnRzTGFiZWwudGV4dENvbnRlbnQgPSAnUGFyZW50czogJztcbiAgICAgICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKHBhcmVudHNMYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnBhcmVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGFyZW50XSBvZiByZXF1ZXN0LnBhcmVudHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGBDYXRlZ29yeToke3BhcmVudH1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5wYXJlbnRzLmxlbmd0aCAtIDEpIHBhcmVudHNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgcGFyZW50c0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChwYXJlbnRzRGl2KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uUmFkaW9JbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuUmFkaW9PcHRpb25XaWRnZXQpLmdldERhdGEoKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICApLnRvTG93ZXJDYXNlKCkgYXMgQWN0aW9uVHlwZTtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgaWYgKFsnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcGFnZVNlbGVjdElucHV0ID0gbmV3IFBhZ2VJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIHBhZ2VzIGhlcmUnIH0pO1xuICAgICAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFnZVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgcGFnZVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgICAgICBpbnB1dFdpZGdldDogcGFnZVNlbGVjdElucHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHBhZ2VTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmV4YW1wbGVzID0gc29ydGVkVGFncztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB7IGV4YW1wbGVzIH0gPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgZXhhbXBsZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGV4YW1wbGUpO1xuICAgICAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShleGFtcGxlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQocGFnZVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFnZXMgdG8gY2F0ZWdvcml6ZTonIH0pO1xuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBjYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IGNhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChjYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICgoY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLnBhcmVudHMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50cyB9ID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudCk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRzKTtcblxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2F0ZWdvcnlTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0NhdGVnb3JpZXM6JyB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICdjYXRlZ29yaWVzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGhhdmUgZW5vdWdoIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90Y2F0ZWdvcnknLCAncGFnZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5kZW55UmVhc29uID0gZGVueVJlYXNvbi5nZXRWYWx1ZSgpIHx8ICdhdXRvZmlsbDp1bmxpa2VseSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgICAgICBkZW55UmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuTWVudU9wdGlvbldpZGdldDtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLFxuICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgY29sb3Igb2YgYSBkZXRhaWxzIGVsZW1lbnQgYmFzZWQgb24gdGhlIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0cyBpbnNpZGUuXG4gICAgICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uc1RvVGFrZSA9IE9iamVjdC52YWx1ZXMoKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0cyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gYWN0aW9uc1RvVGFrZS5ldmVyeSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IGFjdGlvbnNUb1Rha2UuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkQ291bnQgPiAwICYmIGRlbmllZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNmZmYxN2UnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2NlcHRlZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItc3dpdGNoXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZW55JykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Nsb3NlJylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICBjb25zdCBzaG93QWN0aW9uc0RpYWxvZyA9IG5ldyBTaG93QWN0aW9uc0RpYWxvZygpO1xuICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93QWN0aW9uc0RpYWxvZ10pO1xuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cub3BlbigpO1xuXG4gICAgICAgICAgICBjb25zdCBjb3VudHMgPSB7ICdhY2NlcHRlZCc6IDAsICdkZW5pZWQnOiAwLCAnY29tbWVudGVkIG9uJzogMCwgJ2Nsb3NlZCc6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICAgICAgbGV0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGFjdGlvbkRhdGEucmVxdWVzdHMpLnNvbWUoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiAhPT0gJ25vbmUnKSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YXJnZXQsIHJlcXVlc3RzIH0gb2YgdGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudE9mUGFnZXMgPSBPYmplY3Qua2V5cyhyZXF1ZXN0cykubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkUGFnZXMucHVzaChyZXF1ZXN0ZWRUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWRQYWdlcy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmRlbnlSZWFzb24hXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBjbG9zZWQgd2l0aCB0aGUgc2FtZSByZWFzb24sIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cylbMF0ub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwQ29tbWVudHMoY29tbWVudHMsIGFtb3VudE9mUGFnZXMgPT09IDEsIGNvbW1lbnRzLmxlbmd0aCA9PT0gYW1vdW50T2ZQYWdlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCAmJiBkZW5pZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdwJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzTWVzc2FnZSA9IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gKCR7YWNjZXB0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXNNZXNzYWdlID0gdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAke2FjY2VwdGVkUGFnZXNNZXNzYWdlfVxcbiR7ZGVuaWVkUGFnZXNNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdCR7YWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAxID8gJ3xhbGwnIDogJyd9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBhbW91bnRPZlBhZ2VzID09PSAxLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Y2xvc2luZ0lkfX19YCwgYXBwZW5kOiAne3tBZkMtY3xifX0nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHtmaXJzdENsb3NlUmVhc29ufX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAne3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIHJlZGlyZWN0IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PiBhY3Rpb25EYXRhLmFjdGlvbiAhPT0gJ25vbmUnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbkRhdGEgb2YgdGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8YX19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogJyoge3tzdWJzdDpBZkMgY2F0ZWdvcnl9fSB+fn5+XFxue3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8ZH19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihhY3Rpb25EYXRhLmRlbnlSZWFzb24hKX0gfn5+flxcbnt7QWZDLWN8Yn19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uRGF0YS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7YWN0aW9uRGF0YS5jYXRlZ29yeX1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7YWN0aW9uRGF0YS5jbG9zaW5nUmVhc29uIS5pZH19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IChhY3Rpb25EYXRhLmNvbW1lbnQgPyBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAgOiAnJykgKyAnXFxue3tBZkMtY3xifScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIChwYWdlIGNvbnRlbnQgaWRlbnRpY2FsKSEnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFthY3Rpb24sIGNvdW50XSkgPT4gYCR7YWN0aW9ufSAke2NvdW50fWApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IG5ld1BhZ2VUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nKTtcblxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuc2hvd1JlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRm9ybWF0cyBhIHJlcXVlc3QgZGVuaWFsIHJlYXNvbiB0byBhIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gY2FsbC5cbiAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIHRvIGZvcm1hdC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbjogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtZXRlcnMgPSByZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgPyAvYXV0b2ZpbGw6KFxcdyspLy5leGVjKHJlYXNvbikhWzFdIDogYGRlY2xpbmV8Mj0ke3JlYXNvbn1gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVhc29uaW5nID0gcmVhc29uLmluY2x1ZGVzKCcsJykgPyAnICcgKyByZWFzb24uc2xpY2UocmVhc29uLmluZGV4T2YoJywnKSArIDEpLnRyaW0oKSA6ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAgICAgKiBAcGFyYW0gZGVuaWVkUGFnZXMgVGhlIHBhZ2VzIHRvIG1hcC5cbiAgICAgICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihkZW5pZWRQYWdlc1swXVsxXSl9IH5+fn5gO1xuXG4gICAgICAgICAgICBjb25zdCByZWFzb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgICAgIGlmICghcmVhc29uc1tyZWFzb25dKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgICAgICByZWFzb25zW3JlYXNvbl0ucHVzaChwYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgICAgIHJldHVybiByZWFzb25zQXJyYXlcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihyZWFzb24pfSR7cmVhc29uc0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICAgICAqIEBwYXJhbSBjb21tZW50cyBUaGUgY29tbWVudHMgdG8gbWFwLlxuICAgICAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudHNbMF1bMV19fX0gfn5+fmA7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21tZW50TWVzc2FnZXNbY29tbWVudF0pIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XS5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnRzQXJyYXlcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGAqIHt7QWZDIGNvbW1lbnR8MT0ke2NvbW1lbnR9fX0ke2NvbW1lbnRzQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gc2VjdGlvbkRhdGEgVGhlIHNlY3Rpb24gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgICAgICogQHBhcmFtIGNoYW5nZXMuYXBwZW5kIFRoZSB0ZXh0IHRvIGFwcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtb2RpZnlTZWN0aW9uRGF0YShcbiAgICAgICAgICAgIHNlY3Rpb25EYXRhOiB7IHBhZ2VUZXh0OiBzdHJpbmcgfSAmIEFjdGlvblsnb3JpZ2luYWxUZXh0J10sXG4gICAgICAgICAgICB7IHByZXBlbmQsIGFwcGVuZCB9OiB7IHByZXBlbmQ/OiBzdHJpbmc7IGFwcGVuZD86IHN0cmluZyB9LFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZnVsbFNlY3Rpb25UZXh0OiBvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25UZXh0OiBvbGRTZWN0aW9uVGV4dCB9ID0gc2VjdGlvbkRhdGE7XG5cbiAgICAgICAgICAgIGlmIChwcmVwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCA9IHByZXBlbmQgKyAnXFxuJyArIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0O1xuICAgICAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgICAgIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCA9IHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dC5yZXBsYWNlKG9sZFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgICAgIHNlY3Rpb25EYXRhLnBhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQucmVwbGFjZShvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICAgICAqIEBwYXJhbSBwYWdlIFRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9XG4gICAgICAgICAgICAgICAgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcyAmJiBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSBkYXRhLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPy5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZSkhO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgI1JFRElSRUNUIFtbJHt0YXJnZXR9XV0ke3RhZ3NXaXRoQXJndW1lbnRzID8gYFxcblxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGNhdGVnb3J5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZENhdGVnb3J5KGRhdGE6IENhdGVnb3J5QWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGRhdGEucGFyZW50cy5tYXAoKHBhcmVudCkgPT4gYFtbQ2F0ZWdvcnk6JHtwYXJlbnR9XV1gKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnkgdGFsazoke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLmRhdGEuZXhhbXBsZXMubWFwKChleGFtcGxlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBleGFtcGxlLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh7IGNvbnRlbnQgfTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGAke2NvbnRlbnR9XFxuW1tDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBwYWdlIHRvIFtbOkNhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gbG9nIHRoZSByZXN1bHRzIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBtYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IFNob3dBY3Rpb25zRGlhbG9nKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBpRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24udHlwZSA9PT0gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYXBpLmVkaXQoYWN0aW9uLnRpdGxlLCBhY3Rpb24udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmFwaS5jcmVhdGUoYWN0aW9uLnRpdGxlLCB7IHN1bW1hcnk6IGFjdGlvbi5zdW1tYXJ5LCB3YXRjaGxpc3Q6IHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCB9LCBhY3Rpb24udGV4dCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgJ2lzUmVkaXJlY3QnIGluIGFjdGlvbiAmJiBhY3Rpb24uaXNSZWRpcmVjdCA/IHsgcmVkaXJlY3Q6ICdubycgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gYWN0aW9uLnRpdGxlO1xuXG4gICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoYCR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfS4uLmApO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGlGdW5jdGlvbi5jYXRjaChhc3luYyAoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdyYXRlbGltaXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBSYXRlIGxpbWl0ZWQuIFdhaXRpbmcgZm9yIDcwIHNlY29uZHMuLi4gKHJlc3VtaW5nIGF0ICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIDcwXzAwMCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDcwXzAwMCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQ29udGludWluZy4uLicsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKEFmY3JjSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7YUFZQSxHQUFHLE9BQU8sTUFBTSxDQUFDLGlCQUFrQixlQUFnQixrQkFBbUIsaUJBQWlCLEVBQUcsSUFBTSxDQUM1RixNQUFNQSxFQUF3QixHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sNENBQ3hEQyxFQUF3QixHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sNkNBRTlELEdBQUksQ0FBQ0QsR0FBeUIsQ0FBQ0MsRUFBdUIsT0FFdEQsTUFBTUMsRUFBa0JGLEVBQXdCLFdBQWEsV0FFaEQsR0FBRyxLQUFLLGVBQ2pCLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBTSxVQUFZLE9BQVMsYUFDL0MsSUFDQSxVQUFVRSxDQUFlLHFCQUN6QixjQUNKLEVBRUssaUJBQWlCLFFBQVVDLEdBQVUsQ0FDdENBLEVBQU0sZUFBZSxFQUVyQixNQUFNQyxFQUFnQixJQUFJLEdBQUcsR0FBRyxjQUNoQyxTQUFTLEtBQUssT0FBT0EsRUFBYyxTQUFTLENBQUMsQ0FBQyxFQUU5QyxNQUFNQyxFQUFvQixJQUFJQyxFQUMxQkosRUFDQSxHQUFHLE9BQU8sSUFBSSxZQUFZLEVBQUUsV0FBVyxJQUFLLEdBQUcsRUFDL0MsT0FBTyxvQkFBb0Isc0JBQy9CLEVBRUFFLEVBQWMsV0FBVyxDQUFDQyxDQUFpQixDQUFDLEVBRTVDQSxFQUFrQixLQUFLLEVBQ3ZCQSxFQUFrQixLQUFLLENBQzNCLENBQUMsRUFLRCxNQUFNRSxVQUEwQixHQUFHLEdBQUcsTUFBTyxDQUNqQyxjQUNBLFVBQ0EsWUFFUixhQUFjLENBQ1YsTUFBTSxD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QyxDQUNMLENBQ0osQ0FDSixDQUVBLE9BQU8sT0FBTzFKLEVBQWtCLFVBQVcsR0FBRyxHQUFHLGNBQWMsU0FBUyxDQUM1RSxDQUFDIiwKICAibmFtZXMiOiBbImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJpc0NhdGVnb3J5UmVxdWVzdFBhZ2UiLCAicmVxdWVzdFBhZ2VUeXBlIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciLCAiQWZjcmNIZWxwZXJEaWFsb2ciLCAiU2hvd0FjdGlvbnNEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAicmVsb2FkQnV0dG9uIiwgIlBhZ2VJbnB1dFdpZGdldCIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJwYWdlVGl0bGUiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImFjdGlvbiIsICJyZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UiLCAicGFnZVJldmlzaW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgIm5hbWUiLCAiZm91bmRDYXRlZ29yeSIsICJmaXJzdFVzZXJJbmRleCIsICJmaXJzdFVzZXJUYWxrSW5kZXgiLCAiZmlyc3RJcEluZGV4IiwgImZpcnN0SW5kZXgiLCAiaW5kZXgiLCAiaGFuZGxlIiwgImVuZEluZGV4IiwgInN1YkluZGV4IiwgIm1lc3NhZ2VXaWRnZXRMYXlvdXQiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJ0YXJnZXRFZGl0b3JFbGVtZW50IiwgImxpbmtFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJyZWFzb25EaXYiLCAicmVhc29uTGFiZWwiLCAic291cmNlRGl2IiwgInNvdXJjZUxhYmVsIiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgInJlcXVlc3RlZFRpdGxlIiwgInJlcXVlc3RlZFRpdGxlRGl2IiwgInRhZ1NlbGVjdExheW91dCIsICJ0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IiLCAidGVtcGxhdGVFZGl0b3JzSW5mbyIsICJhY3Rpb25SYWRpb0lucHV0IiwgIm9wdGlvbiIsICJ0YWdTZWxlY3QiLCAidGFnIiwgInJlZGlyZWN0IiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgImNvbW1lbnRJbnB1dExheW91dCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJjb21tZW50IiwgImNvbW1lbnRJbnB1dCIsICJkZW55UmVhc29uTGF5b3V0IiwgImNsb3NpbmdSZWFzb25MYXlvdXQiLCAiZGVueVJlYXNvbiIsICJjbG9zaW5nUmVhc29uIiwgInRpdGxlIiwgImlkIiwgInNlbGVjdGVkIiwgImV4YW1wbGVzRGl2IiwgImV4YW1wbGVzTGFiZWwiLCAiZXhhbXBsZSIsICJwYXJlbnRzRGl2IiwgInBhcmVudHNMYWJlbCIsICJwYXJlbnQiLCAicGFnZVNlbGVjdExheW91dCIsICJjYXRlZ29yeVNlbGVjdExheW91dCIsICJwYWdlU2VsZWN0SW5wdXQiLCAicGFnZVNlbGVjdCIsICJleGFtcGxlcyIsICJjYXRlZ29yeVNlbGVjdElucHV0IiwgImNhdGVnb3J5U2VsZWN0IiwgInBhcmVudHMiLCAiYWN0aW9uc1RvVGFrZSIsICJhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkIiwgImZpcnN0Q2xvc2VSZWFzb24iLCAiYWxsUmVxdWVzdHNDbG9zZWQiLCAiYmFja2dyb3VuZENvbG9yIiwgImFjY2VwdGVkQ291bnQiLCAiZGVuaWVkQ291bnQiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAidGFyZ2V0IiwgInJlcXVlc3RzIiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWNjZXB0ZWRQYWdlcyIsICJkZW5pZWRQYWdlcyIsICJjb21tZW50cyIsICJhbW91bnRPZlBhZ2VzIiwgInNlY3Rpb25EYXRhIiwgImNsb3NpbmdJZCIsICJhY2NlcHRlZFBhZ2VzTWVzc2FnZSIsICJkZW5pZWRQYWdlc01lc3NhZ2UiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgInJlYXNvbiIsICJ0ZW1wbGF0ZVBhcmFtZXRlcnMiLCAiYWRkaXRpb25hbFJlYXNvbmluZyIsICJzaW5ndWxhclJlcXVlc3QiLCAiYWxsUmVxdWVzdHMiLCAicmVhc29ucyIsICJyZWFzb25zQXJyYXkiLCAiY29tbWVudE1lc3NhZ2VzIiwgImNvbW1lbnRzQXJyYXkiLCAicHJlcGVuZCIsICJhcHBlbmQiLCAib2xkRnVsbFNlY3Rpb25UZXh0IiwgIm9sZFNlY3Rpb25UZXh0IiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgInBhcmFtZXRlciIsICJtYXBwZWRBcmd1bWVudHMiLCAiY29udGVudCIsICJhcGlGdW5jdGlvbiIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInJlc29sdmUiXQp9Cg==