Jump to content

User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 03:16, 12 March 2025 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper/afcrc-helper.ts

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

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

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvc2hvdy1hY3Rpb25zLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9oZWxwZXItZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlci50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdHMtZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL2NhdGVnb3J5LWlucHV0LXdpZGdldC50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9wYWdlLWlucHV0LXdpZGdldC50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yaWVzLWRpYWxvZy50cyIsICIuLi9zdHlsZXMvYWZjcmMtaGVscGVyLmNzcyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBhY3Rpb24gZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgY2xvc2VCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWN0aW9uc0RpYWxvZyc7XG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1JlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgIHJlbG9hZEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oQWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpRWRpdFBhZ2VQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBNZWRpYVdpa2lEYXRhRXJyb3IsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kOiBXYXRjaE1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIE9PLnVpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlPyBBbGwgY2hhbmdlcyB3aWxsIGJlIGRpc2NhcmRlZC4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGNvbmZpcm1lZCkgPT4gKGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSBwYWdlUmV2aXNpb24ucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKTtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IC97e2FmYy1jXFx8L2kudGVzdChzZWN0aW9uVGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dCwgc2VjdGlvbkhlYWRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTaXplID0gNTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKykgdGhpcy5sb2FkU3VidHlwZUVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnbm90aWNlJywgbGFiZWw6ICdObyB2YWxpZCByZXF1ZXN0cyB0byBoYW5kbGUhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBzaG93QWN0aW9uc0RpYWxvZyA9IG5ldyBBY3Rpb25zRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0FjdGlvbnNEaWFsb2ddKTtcbiAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cub3BlbigpO1xuXG4gICAgICAgIGNvbnN0IGNvdW50cyA9IHsgJ2FjY2VwdGVkJzogMCwgJ2RlbmllZCc6IDAsICdjb21tZW50ZWQgb24nOiAwLCAnY2xvc2VkJzogMCB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgICAgIGNvbnN0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5IS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybVN1YnR5cGVBY3Rpb25zKHNob3dBY3Rpb25zRGlhbG9nLCBjb3VudHMsIG5ld1BhZ2VUZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGEgcmVxdWVzdCBkZW5pYWwgcmVhc29uIHRvIGEge3tzdWJzdDpBZkMgcmVkaXJlY3QvY2F0ZWdvcnl9fSBjYWxsLlxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0byBmb3JtYXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdERlbmllZFJlYXNvbihyZWFzb246IHN0cmluZykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtZXRlcnMgPSByZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgPyAvYXV0b2ZpbGw6KFxcdyspLy5leGVjKHJlYXNvbikhWzFdIDogYGRlY2xpbmV8Mj0ke3JlYXNvbn1gO1xuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZWFzb25pbmcgPVxuICAgICAgICAgICAgcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpICYmIHJlYXNvbi5pbmNsdWRlcygnLCcpID8gJyAnICsgcmVhc29uLnNsaWNlKHJlYXNvbi5pbmRleE9mKCcsJykgKyAxKS50cmltKCkgOiAnJztcblxuICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAqIEBwYXJhbSBkZW5pZWRQYWdlcyBUaGUgcGFnZXMgdG8gbWFwLlxuICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGRlbmllZFBhZ2VzWzBdWzFdKX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgcmVhc29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgaWYgKCEocmVhc29uIGluIHJlYXNvbnMpKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbil9JHtyZWFzb25zQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICBjb25zdCBjb21tZW50TWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIShjb21tZW50IGluIGNvbW1lbnRNZXNzYWdlcykpIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSR7Y29tbWVudHNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBwcmVwZW5kaW5nIGFuZCBhcHBlbmRpbmcgdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1vZGlmeVNlY3Rpb25EYXRhKFxuICAgICAgICBzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBSZXF1ZXN0QWN0aW9uWydvcmlnaW5hbFRleHQnXSxcbiAgICAgICAgeyBwcmVwZW5kLCBhcHBlbmQgfTogeyBwcmVwZW5kPzogc3RyaW5nOyBhcHBlbmQ/OiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBmdWxsU2VjdGlvblRleHQ6IG9sZEZ1bGxTZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IG9sZFNlY3Rpb25UZXh0IH0gPSBzZWN0aW9uRGF0YTtcblxuICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0ID0gc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0LnJlcGxhY2Uob2xkU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0KTtcblxuICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBsb2cgdGhlIHJlc3VsdHMgdG8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIG1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYWN0aW9uXSBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgYXBpRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgIGFjdGlvbi50eXBlID09PSAnZWRpdCdcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmFwaS5lZGl0KGFjdGlvbi50aXRsZSwgYWN0aW9uLnRyYW5zZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmFwaS5jcmVhdGUoYWN0aW9uLnRpdGxlLCB7IHN1bW1hcnk6IGFjdGlvbi5zdW1tYXJ5LCB3YXRjaGxpc3Q6IHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCB9LCBhY3Rpb24udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYWN0aW9uLnRpdGxlLCAnaXNSZWRpcmVjdCcgaW4gYWN0aW9uICYmIGFjdGlvbi5pc1JlZGlyZWN0ID8geyByZWRpcmVjdDogJ25vJyB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gYWN0aW9uLnRpdGxlO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25SZXN1bHRFbGVtZW50SWQgPSBgYWZjcmMtaGVscGVyLWFjdGlvbi1yZXN1bHQtJHtpbmRleH1gO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICBgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9Li4uIDxzcGFuIGlkPVwiJHthY3Rpb25SZXN1bHRFbGVtZW50SWR9XCI+PC9zcGFuPmAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSAnU3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgnbm9jaGFuZ2UnIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTcGVjaWFsOkRpZmYvJHtyZXN1bHQub2xkcmV2aWQgPyBgJHtyZXN1bHQub2xkcmV2aWR9L2AgOiAnJ30ke3Jlc3VsdC5uZXdyZXZpZH1gLCAvLyBvbGRyZXZpZCBpcyAwIG9uIHBhZ2UgY3JlYXRpb25zLCBhbmQgaXMgdGh1cyB1bm5lZWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSAnZGlmZic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvblJlc3VsdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHthY3Rpb25SZXN1bHRFbGVtZW50SWR9YCkhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQpIGFjdGlvblJlc3VsdEVsZW1lbnQuYXBwZW5kKCcoZG9uZSwgc2VlICcsIGxpbmtFbGVtZW50LCAnKScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBhY3Rpb25SZXN1bHRFbGVtZW50LnRleHRDb250ZW50ID0gJyhkb25lLCBubyBjaGFuZ2VzKSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ3JhdGVsaW1pdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFJhdGUgbGltaXRlZC4gV2FpdGluZyBmb3IgNzAgc2Vjb25kcy4uLiAocmVzdW1pbmcgYXQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgNzBfMDAwKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzBfMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdDb250aW51aW5nLi4uJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSkuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBwYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dDogc3RyaW5nLCBzZWN0aW9uSGVhZGVyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdFxuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoZGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKEhlbHBlckRpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RBY3Rpb25UeXBlIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCB0eXBlIFJlZGlyZWN0c0RpYWxvZyBmcm9tICcuL3JlZGlyZWN0cy1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdEFjdGlvbiB9IGZyb20gJy4vcmVkaXJlY3RzLWRpYWxvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIge1xuICAgIHByaXZhdGUgdGl0bGVJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgdGl0bGU6IHN0cmluZztcbiAgICBwcml2YXRlIGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZXNwb25kZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIGRpYWxvZzogUmVkaXJlY3RzRGlhbG9nO1xuXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3I/OiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG5cbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb21tZW50SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG5cbiAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgZGVueVJlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY2xvc2luZ1JlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY29tbWVudExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRpdGxlSW5kZXg6IG51bWJlcixcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCxcbiAgICAgICAgcmVzcG9uZGVyRWxlbWVudDogSFRNTERpdkVsZW1lbnQsXG4gICAgICAgIGRpYWxvZzogUmVkaXJlY3RzRGlhbG9nLFxuICAgICkge1xuICAgICAgICB0aGlzLnRpdGxlSW5kZXggPSB0aXRsZUluZGV4O1xuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuZGV0YWlsc0VsZW1lbnQgPSBkZXRhaWxzRWxlbWVudDtcbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50ID0gcmVzcG9uZGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgcmVxdWVzdCBoYW5kbGVyLCBsb2FkaW5nIGVsZW1lbnRzIGludG8gdGhlIERPTS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXAoKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gdGhpcy50aXRsZTtcbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGxhYmVsKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuXG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvYWRDb21tZW50TGF5b3V0KCk7XG5cbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50LmFwcGVuZChyZXF1ZXN0ZWRUaXRsZURpdik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3Igc2VsZWN0ZWQgYWN0aW9uIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHNlbGVjdGVkIFRoZSBuZXcgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQWN0aW9uQ2hhbmdlKHNlbGVjdGVkOiBPTy51aS5PcHRpb25XaWRnZXQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpYWxvZy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IChzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpIGFzIFJlcXVlc3RBY3Rpb25UeXBlO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGFjdGlvbjogb3B0aW9uIH0pO1xuXG4gICAgICAgIHRoaXMuZGlhbG9nLnVwZGF0ZVJlcXVlc3RDb2xvcih0aGlzLmRldGFpbHNFbGVtZW50LCB0aGlzLnRpdGxlSW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhZ1NlbGVjdExheW91dCkgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVueVJlYXNvbkxheW91dCkgdGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCkgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50YWdTZWxlY3RMYXlvdXQgfHwgIXRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKSB0aGlzLmxvYWRUYWdTZWxlY3RBbmRQYXJhbWV0ZXJzRWRpdG9yKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yIS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVueVJlYXNvbkxheW91dCkgdGhpcy5sb2FkRGVueVJlYXNvbkxheW91dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0KSB0aGlzLmxvYWRDbG9zaW5nUmVhc29uTGF5b3V0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQhLiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFsnYWNjZXB0JywgJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5jb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50IH0pO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgdGFnIHNlbGVjdCBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyBlZGl0b3JzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZFRhZ1NlbGVjdEFuZFBhcmFtZXRlcnNFZGl0b3IoKSB7XG4gICAgICAgIGNvbnN0IHRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBjbGFzcz1cImFmY3JjLWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzXCI+JHt0YWd9PC9zcGFuPmApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbCB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAodGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSBzZWxlY3RlZFRhZ3MudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUYWdzLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICB0YWdTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkVGFncy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHNvcnRlZFRhZ3MgfSk7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNUYWdTZWxlY3RlZCA9IHNvcnRlZFRhZ3MuaW5jbHVkZXMoZWRpdG9ySW5mby5uYW1lKTtcblxuICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gaXNUYWdTZWxlY3RlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUYWdTZWxlY3RlZCkgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGFnU2VsZWN0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzOiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8gfSk7XG5cbiAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGRlbnkgcmVhc29uIGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWREZW55UmVhc29uTGF5b3V0KCkge1xuICAgICAgICBjb25zdCBkZW55UmVhc29uSW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBwYWdlcyddLFxuICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGFyZ2V0JywgJ25vbmV4aXN0ZW50IG9yIG5vIHByb3ZpZGVkIHRhcmdldCddLFxuICAgICAgICAgICAgICAgIFsnbm90aXRsZScsICdubyB0aXRsZSBwcm92aWRlZCddLFxuICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAndW5saWtlbHkgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgWyd1bnJlbGF0ZWQnLCAnYXBwYXJlbnRseSB1bnJlbGF0ZWQgdGl0bGVzJ10sXG4gICAgICAgICAgICAgICAgWydub3RyZWRpcmVjdCcsICdhcnRpY2xlIGNyZWF0aW9uIHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydleHRlcm5hbGxpbmsnLCAnZXh0ZXJuYWwgbGluayByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICBbJ2VkaXRyZXF1ZXN0JywgJ2VkaXQgcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbnlSZWFzb25JbnB1dC5vbignY2hhbmdlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBkZW55UmVhc29uOiB2YWx1ZSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZW55UmVhc29uSW5wdXQuc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgIGRlbnlSZWFzb25JbnB1dC5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICB0aGlzLmRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbklucHV0LCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY2xvc2luZyByZWFzb24gbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENsb3NpbmdSZWFzb25MYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25Ecm9wZG93biA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ3InKTtcblxuICAgICAgICBjbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNsb3NpbmdSZWFzb246IHsgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nIH0gfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLnVwZGF0ZVJlcXVlc3RDb2xvcih0aGlzLmRldGFpbHNFbGVtZW50LCB0aGlzLnRpdGxlSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbkRyb3Bkb3duLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY29tbWVudCBsYXlvdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkQ29tbWVudExheW91dCgpIHtcbiAgICAgICAgdGhpcy5jb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50SW5wdXQub24oJ2NoYW5nZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQgfSk7XG4gICAgICAgICAgICBlbHNlIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY29tbWVudElucHV0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ29tbWVudDonLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgcmVxdWVzdCdzIGFjdGlvbnMgZGF0YS5cbiAgICAgKiBAcGFyYW0gdXBkYXRlIFRoZSB1cGRhdGVzIHRvIG1ha2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVBY3Rpb25zVG9UYWtlKHVwZGF0ZTogUGFydGlhbDxSZWRpcmVjdEFjdGlvbj4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRpYWxvZy5hY3Rpb25zVG9UYWtlW3RoaXMudGl0bGVJbmRleF0ucmVxdWVzdHNbdGhpcy50aXRsZV0sIHVwZGF0ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSwgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB9IGZyb20gJy4uL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcbmltcG9ydCBIZWxwZXJEaWFsb2csIHsgdHlwZSBSZXF1ZXN0QWN0aW9uLCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIgZnJvbSAnLi9yZWRpcmVjdC1yZXF1ZXN0LWhhbmRsZXInO1xuaW1wb3J0IHR5cGUgQWN0aW9uc0RpYWxvZyBmcm9tICcuL3Nob3ctYWN0aW9ucy1kaWFsb2cnO1xuXG5pbnRlcmZhY2UgUmVkaXJlY3RSZXF1ZXN0RGF0YSB7XG4gICAgcGFnZXM6IHN0cmluZ1tdO1xuICAgIHRhcmdldDogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdFJlcXVlc3Rlcjtcbn1cblxuZXhwb3J0IHR5cGUgUmVkaXJlY3RBY3Rpb24gPSBSZXF1ZXN0QWN0aW9uICYgeyByZWRpcmVjdFRlbXBsYXRlcz86IHN0cmluZ1tdOyByZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycz86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSB9O1xuXG50eXBlIFJlZGlyZWN0QWN0aW9ucyA9IHsgdGFyZ2V0OiBzdHJpbmc7IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4gfVtdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdHNEaWFsb2cgZXh0ZW5kcyBIZWxwZXJEaWFsb2cge1xuICAgIHB1YmxpYyByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgcHJvdGVjdGVkIHBhcnNlZFJlcXVlc3RzOiBSZWRpcmVjdFJlcXVlc3REYXRhW10gPSBbXTtcbiAgICBwdWJsaWMgYWN0aW9uc1RvVGFrZTogUmVkaXJlY3RBY3Rpb25zID0gW107XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGVsZW1lbnRzIGluIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlLnF1ZXJ5IS5wYWdlc1swXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICAgICAgdm9pZCBzdXBlci5sb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlZGlyZWN0IHJlcXVlc3RzIGZyb20gc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uSGVhZGVyIFRoZSBzZWN0aW9uIGhlYWRlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQ6IHN0cmluZywgc2VjdGlvbkhlYWRlcjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhZ2VzID0gc2VjdGlvbkhlYWRlclxuICAgICAgICAgICAgLm1hdGNoQWxsKC9cXFtcXFsoLio/KV1dL2cpXG4gICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgaWYgKHJlcXVlc3RlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEucGFnZXMgPSByZXF1ZXN0ZWRQYWdlcztcblxuICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSAvVGFyZ2V0IG9mIHJlZGlyZWN0OiA/XFxbXFxbKC4qPyldXS8uZXhlYyhzZWN0aW9uVGV4dCk/LlsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgIGlmICghcGFyc2VkVGFyZ2V0KSByZXR1cm47XG5cbiAgICAgICAgcGFyc2VkRGF0YS50YXJnZXQgPSBwYXJzZWRUYXJnZXQ7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZWFzb24gPSAvcmVhc29uOiA/KC4qPylcXCpzb3VyY2UoPzogXFwoaWYgYXBwbGljYWJsZVxcKSk/Oi9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICBwYXJzZWREYXRhLnNvdXJjZSA9IC9zb3VyY2UoPzogXFwoaWYgYXBwbGljYWJsZVxcKSk/OiA/KC4qPykoPzo8cmVmZXJlbmNlcyBcXC8+fFxcblxcbikvaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyID0gc2VjdGlvblRleHRcbiAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dC5pbmNsdWRlcygnPHJlZmVyZW5jZXMgLz4nKVxuICAgICAgICAgICAgICAgICAgICA/IC88cmVmZXJlbmNlcyBcXC8+XFxuKyguKikvXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCg/OjxyZWZlcmVuY2VzIFxcXFwvPiR7cGFyc2VkRGF0YS5zb3VyY2UgPyBgfCR7cGFyc2VkRGF0YS5zb3VyY2UucmVwbGFjZUFsbCgvW1xccyMkKCkqKywuP1tcXFxcXFxdXnt8fS1dL2csICdcXFxcJCYnKX1gIDogJyd9KVxcbisoLiopYCxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKT8uWzFdXG4gICAgICAgICAgICAudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IG5hbWUgPSByZXF1ZXN0ZXIgPyAvKD86U3BlY2lhbDpDb250cmlidXRpb25zXFwvfFVzZXIoPzogdGFsayk/OikoLio/KVxcfC8uZXhlYyhyZXF1ZXN0ZXIpPy5bMV0udHJpbSgpIDogbnVsbDtcblxuICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9IHJlcXVlc3RlciAmJiBuYW1lID8geyB0eXBlOiAvXFxbXFxbVXNlciggdGFsayk/Oi8udGVzdChyZXF1ZXN0ZXIpID8gJ3VzZXInIDogJ2lwJywgbmFtZSB9IDogbnVsbDtcblxuICAgICAgICB0aGlzLnBhcnNlZFJlcXVlc3RzLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBwYXJzZWREYXRhLnRhcmdldCxcbiAgICAgICAgICAgIHJlcXVlc3RzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkUGFnZXMubWFwKChwYWdlKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxTZWN0aW9uVGV4dDogc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBnaXZlbiByZWRpcmVjdCByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRTdWJ0eXBlRWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF07XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSByZXF1ZXN0LnBhZ2VzLm1hcCgocGFnZSkgPT4gYDxiPiR7cGFnZX08L2I+YCkuam9pbignLCAnKSArICcgXHUyMTkyICc7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8udGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBldmVudC5rZXkgPT09ICcgJykgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0RWRpdG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3InKTtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JlcXVlc3QudGFyZ2V0Lmxlbmd0aH1jaGA7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUgPSByZXF1ZXN0LnRhcmdldDtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5sZW5ndGh9Y2hgO1xuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLnRhcmdldCA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWU7XG5cbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybCh0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKHRhcmdldEVkaXRvckVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHJlcXVlc3QudGFyZ2V0KTtcbiAgICAgICAgbGlua0VsZW1lbnQuaW5uZXJIVE1MID0gYFxuPHN2ZyB2aWV3Ym94PVwiMCAwIDQ4IDQ4XCI+XG48cGF0aCBkPVwiTTM2IDI0Yy0xLjIgMC0yIDAuOC0yIDJ2MTJjMCAxLjItMC44IDItMiAyaC0yMmMtMS4yXG4gICAgMC0yLTAuOC0yLTJ2LTIyYzAtMS4yIDAuOC0yIDItMmgxMmMxLjIgMCAyLTAuOCAyLTJzLTAuOC0yLTItMmgtMTJjLTMuNFxuICAgIDAtNiAyLjYtNiA2djIyYzAgMy40IDIuNiA2IDYgNmgyMmMzLjQgMCA2LTIuNlxuICAgIDYtNnYtMTJjMC0xLjItMC44LTItMi0yelwiPjwvcGF0aD5cbjxwYXRoIGQ9XCJNNDMuOCA1LjJjLTAuMi0wLjQtMC42LTAuOC0xLTEtMC4yLTAuMi0wLjYtMC4yLTAuOC0wLjJoLTEyYy0xLjJcbiAgICAwLTIgMC44LTIgMnMwLjggMiAyIDJoNy4ybC0xOC42IDE4LjZjLTAuOCAwLjgtMC44IDIgMCAyLjggMC40IDAuNCAwLjhcbiAgICAwLjYgMS40IDAuNnMxLTAuMiAxLjQtMC42bDE4LjYtMTguNnY3LjJjMCAxLjIgMC44IDIgMiAyczItMC44XG4gICAgMi0ydi0xMmMwLTAuMiAwLTAuNi0wLjItMC44elwiPjwvcGF0aD5cbjwvc3ZnPmA7XG5cbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICBjb25zdCByZWFzb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZWFzb25MYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVhc29uTGFiZWwudGV4dENvbnRlbnQgPSAnUmVhc29uOiAnO1xuICAgICAgICByZWFzb25EaXYuYXBwZW5kKHJlYXNvbkxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZWFzb24pIHJlYXNvbkRpdi5hcHBlbmQocmVxdWVzdC5yZWFzb24pO1xuICAgICAgICBlbHNlIHJlYXNvbkRpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlYXNvbkRpdik7XG5cbiAgICAgICAgY29uc3Qgc291cmNlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHNvdXJjZUxhYmVsLnRleHRDb250ZW50ID0gJ1NvdXJjZTogJztcbiAgICAgICAgc291cmNlRGl2LmFwcGVuZChzb3VyY2VMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Quc291cmNlKSBzb3VyY2VEaXYuYXBwZW5kKHJlcXVlc3Quc291cmNlKTtcbiAgICAgICAgZWxzZSBzb3VyY2VEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChzb3VyY2VEaXYpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWRUaXRsZSBvZiByZXF1ZXN0LnBhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoaW5kZXgsIHJlcXVlc3RlZFRpdGxlLCBkZXRhaWxzRWxlbWVudCwgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQsIHRoaXMpO1xuXG4gICAgICAgICAgICBoYW5kbGVyLnNldFVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29sb3Igb2YgYSBkZXRhaWxzIGVsZW1lbnQgYmFzZWQgb24gdGhlIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0cyBpbnNpZGUuXG4gICAgICogQHBhcmFtIGRldGFpbHNFbGVtZW50IFRoZSBkZXRhaWxzIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uc1RvVGFrZSA9IE9iamVjdC52YWx1ZXModGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5yZXF1ZXN0cyk7XG5cbiAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gYWN0aW9uc1RvVGFrZS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KFxuICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGRlbmllZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChhY2NlcHRlZENvdW50ID4gMCAmJiBkZW5pZWRDb3VudCA+IDApIGJhY2tncm91bmRDb2xvciA9ICcjZmZmMTdlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGFjY2VwdGVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFjdGlvbnMgb24gYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBzaG93QWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGFkZCBtZXNzYWdlcyB0by5cbiAgICAgKiBAcGFyYW0gY291bnRzIFRoZSBjb3VudCBvYmplY3QgdXNlZCB0byB0cmFjayByZXF1ZXN0cyBmb3IgdGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKiBAcGFyYW0gbmV3UGFnZVRleHQgVGhlIG5ldyBwYWdlIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhzaG93QWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZywgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LCBuZXdQYWdlVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGFueVJlcXVlc3RIYW5kbGVkID0gdGhpcy5hY3Rpb25zVG9UYWtlLnNvbWUoKGFjdGlvbkRhdGEpID0+XG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGFjdGlvbkRhdGEucmVxdWVzdHMpLnNvbWUoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiAhPT0gJ25vbmUnKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YXJnZXQsIHJlcXVlc3RzIH0gb2YgdGhpcy5hY3Rpb25zVG9UYWtlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbW91bnRPZlBhZ2VzID0gT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RzKSlcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiB3aWxsIGJlIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRQYWdlcy5wdXNoKHJlcXVlc3RlZFRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWRQYWdlcy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmRlbnlSZWFzb24hXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgXHUyMTkyIFwiJHt0YXJnZXR9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgY2xvc2VkIHdpdGggdGhlIHNhbWUgcmVhc29uLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLk9iamVjdC52YWx1ZXMocmVxdWVzdHMpWzBdLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiB0aGlzLm1hcENvbW1lbnRzKGNvbW1lbnRzLCBhbW91bnRPZlBhZ2VzID09PSAxLCBjb21tZW50cy5sZW5ndGggPT09IGFtb3VudE9mUGFnZXMpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zaW5nSWQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwICYmIGRlbmllZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdwJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlc01lc3NhZ2UgPSBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdH19ICgke2FjY2VwdGVkUGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSkgfn5+fmA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlc01lc3NhZ2UgPSB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCR7YWNjZXB0ZWRQYWdlc01lc3NhZ2V9XFxuJHtkZW5pZWRQYWdlc01lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2EnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0JHthY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDEgPyAnfGFsbCcgOiAnJ319fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2QnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiBge3tBZkMtY3wke2Nsb3NpbmdJZH19fWAsIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7Zmlyc3RDbG9zZVJlYXNvbn19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIChwYWdlIGNvbnRlbnQgaWRlbnRpY2FsKSEnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgIC5tYXAoKFthY3Rpb24sIGNvdW50XSkgPT4gYCR7YWN0aW9ufSAke2NvdW50fWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IG5ld1BhZ2VUZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIHJlZGlyZWN0IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuc2hvd1JlbG9hZCgpO1xuICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgcmVkaXJlY3QgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZTogc3RyaW5nLCBkYXRhOiBSZWRpcmVjdEFjdGlvbiwgdGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPVxuICAgICAgICAgICAgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcyAmJiBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gZGF0YS5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycz8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVyLCBpbmRleCkgPT4gcGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgJiYgcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZSkhO1xuXG4gICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBgI1JFRElSRUNUIFtbJHt0YXJnZXR9XV0ke3RhZ3NXaXRoQXJndW1lbnRzID8gYFxcblxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyByZWRpcmVjdCB0byBbWyR7dGFyZ2V0fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9SXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgQ2F0ZWdvcmllc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJpdmF0ZSBzdXBwb3J0c1NvcnRLZXk6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgdmFsaWRDYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcsIHN1cHBvcnRzU29ydEtleSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLnN1cHBvcnRzU29ydEtleSA9IHN1cHBvcnRzU29ydEtleTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKS5zcGxpdCgnfCcpWzBdO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c1NvcnRLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVsxXTtcblxuICAgICAgICAgICAgaWYgKHNvcnRLZXkgJiYgdGhpcy52YWxpZENhdGVnb3JpZXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgZGF0YTogYCR7dmFsdWV9fCR7c29ydEtleX1gLCBsYWJlbDogYCR7dmFsdWV9ICh3aXRoIHNvcnQga2V5IFwiJHtzb3J0S2V5fVwiKWAgfV07XG5cbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogQ2F0ZWdvcmllc1Jlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzU29ydEtleSkgdGhpcy52YWxpZENhdGVnb3JpZXMuYWRkKHRpdGxlV2l0aG91dE5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHBhZ2UgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeT86IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IGRhdGE6IHBhZ2UudGl0bGUsIGxhYmVsOiBwYWdlLnRpdGxlIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihQYWdlSW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IENhdGVnb3J5SW5wdXRXaWRnZXQgZnJvbSAnLi9jYXRlZ29yeS1pbnB1dC13aWRnZXQnO1xuaW1wb3J0IEhlbHBlckRpYWxvZywgeyB0eXBlIFJlcXVlc3RBY3Rpb24sIHR5cGUgUmVxdWVzdEFjdGlvblR5cGUsIHR5cGUgUmVxdWVzdFJlcXVlc3RlciB9IGZyb20gJy4vaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgUGFnZUlucHV0V2lkZ2V0IGZyb20gJy4vcGFnZS1pbnB1dC13aWRnZXQnO1xuaW1wb3J0IHR5cGUgQWN0aW9uc0RpYWxvZyBmcm9tICcuL3Nob3ctYWN0aW9ucy1kaWFsb2cnO1xuXG5pbnRlcmZhY2UgQ2F0ZWdvcnlSZXF1ZXN0RGF0YSB7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICBleGFtcGxlczogc3RyaW5nW107XG4gICAgcGFyZW50czogc3RyaW5nW107XG4gICAgcmVxdWVzdGVyOiBSZXF1ZXN0UmVxdWVzdGVyO1xufVxuXG50eXBlIENhdGVnb3J5QWN0aW9uID0gUmVxdWVzdEFjdGlvbiAmIHsgY2F0ZWdvcnk6IHN0cmluZzsgY2F0ZWdvcml6ZWRQYWdlczogc3RyaW5nW107IHBhcmVudHM6IHN0cmluZ1tdOyBjYXRlZ29yaWVzVG9SZW1vdmU6IHN0cmluZ1tdIH07XG5cbnR5cGUgQ2F0ZWdvcnlBY3Rpb25zID0gQ2F0ZWdvcnlBY3Rpb25bXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2F0ZWdvcmllc0RpYWxvZyBleHRlbmRzIEhlbHBlckRpYWxvZyB7XG4gICAgcHJvdGVjdGVkIHBhcnNlZFJlcXVlc3RzOiBDYXRlZ29yeVJlcXVlc3REYXRhW10gPSBbXTtcbiAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IENhdGVnb3J5QWN0aW9ucyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlZGlyZWN0IHJlcXVlc3RzIGZyb20gc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uSGVhZGVyIFRoZSBzZWN0aW9uIGhlYWRlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQ6IHN0cmluZywgc2VjdGlvbkhlYWRlcjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBDYXRlZ29yeVJlcXVlc3REYXRhO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kQ2F0ZWdvcnkgPSAvOj9DYXRlZ29yeTooLio/KShdXXwkKS8uZXhlYyhzZWN0aW9uSGVhZGVyKT8uWzFdLnRyaW0oKTtcbiAgICAgICAgaWYgKCFmb3VuZENhdGVnb3J5KSByZXR1cm47XG5cbiAgICAgICAgcGFyc2VkRGF0YS5jYXRlZ29yeSA9IGZvdW5kQ2F0ZWdvcnkucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5leGFtcGxlcyA9IFtcbiAgICAgICAgICAgIC4uLihcbiAgICAgICAgICAgICAgICAvZXhhbXBsZSBwYWdlcyB3aGljaCBiZWxvbmcgdG8gdGhpcyBjYXRlZ29yeTooLio/KShwYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgKT8uWzFdID8/ICcnXG4gICAgICAgICAgICApLm1hdGNoQWxsKC9cXCpcXHMqKD86XFxbXFxbKT8oLio/KShcXHx8XV18XFxzKj9cXG4pL2cpLFxuICAgICAgICBdXG4gICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBwYXJzZWREYXRhLnBhcmVudHMgPSBbXG4gICAgICAgICAgICAuLi4oL3BhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6KC4qPykoXFxuXFxufFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdID8/ICcnKS5tYXRjaEFsbChcbiAgICAgICAgICAgICAgICAvKD88IVxcfCkjPzo/Q2F0ZWdvcnk6KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgY29uc3QgZmlyc3RVc2VySW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXI6Jyk7XG4gICAgICAgIGNvbnN0IGZpcnN0VXNlclRhbGtJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlciB0YWxrOicpO1xuICAgICAgICBjb25zdCBmaXJzdElwSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8nKTtcblxuICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gTWF0aC5taW4oLi4uW2ZpcnN0VXNlckluZGV4LCBmaXJzdFVzZXJUYWxrSW5kZXgsIGZpcnN0SXBJbmRleF0uZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKSk7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPVxuICAgICAgICAgICAgZmlyc3RJbmRleCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiBmaXJzdEluZGV4ID09PSBmaXJzdElwSW5kZXhcbiAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAnaXAnLCBuYW1lOiAvXFxbXFxbU3BlY2lhbDpDb250cmlidXRpb25zXFwvKC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9XG4gICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3VzZXInLCBuYW1lOiAvXFxbXFxbVXNlcig/OiB0YWxrKT86KC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9O1xuICAgICAgICBpZiAoIXBhcnNlZERhdGEucmVxdWVzdGVyPy5uYW1lKSBwYXJzZWREYXRhLnJlcXVlc3RlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYXJzZWRSZXF1ZXN0cy5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZS5wdXNoKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWREYXRhLmNhdGVnb3J5LFxuICAgICAgICAgICAgY2F0ZWdvcml6ZWRQYWdlczogcGFyc2VkRGF0YS5leGFtcGxlcyxcbiAgICAgICAgICAgIHBhcmVudHM6IHBhcnNlZERhdGEucGFyZW50cyxcbiAgICAgICAgICAgIGNhdGVnb3JpZXNUb1JlbW92ZTogWy4uLnBhcnNlZERhdGEucGFyZW50c10sXG4gICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sXG4gICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRTdWJ0eXBlRWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF07XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSBgPGI+Q2F0ZWdvcnk6JHtyZXF1ZXN0LmNhdGVnb3J5fTwvYj5gO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICBjb25zdCBleGFtcGxlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGV4YW1wbGVzTGFiZWwudGV4dENvbnRlbnQgPSAnRXhhbXBsZXM6ICc7XG4gICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChleGFtcGxlc0xhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5leGFtcGxlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGV4YW1wbGVdIG9mIHJlcXVlc3QuZXhhbXBsZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGV4YW1wbGUpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gZXhhbXBsZTtcblxuICAgICAgICAgICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoIC0gMSkgZXhhbXBsZXNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIGV4YW1wbGVzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoZXhhbXBsZXNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHBhcmVudHNMYWJlbC50ZXh0Q29udGVudCA9ICdQYXJlbnRzOiAnO1xuICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChwYXJlbnRzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnBhcmVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJlbnRdIG9mIHJlcXVlc3QucGFyZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYENhdGVnb3J5OiR7cGFyZW50fWApO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gcGFyZW50O1xuXG4gICAgICAgICAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LnBhcmVudHMubGVuZ3RoIC0gMSkgcGFyZW50c0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgcGFyZW50c0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHBhcmVudHNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoXG4gICAgICAgICAgICAgICAgKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nXG4gICAgICAgICAgICApLnRvTG93ZXJDYXNlKCkgYXMgUmVxdWVzdEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICBpZiAoWydjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RJbnB1dCA9IG5ldyBQYWdlSW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBwYWdlcyBoZXJlJyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYWdlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYWdlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogcGFnZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFnZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkUGFnZXMgPSBzZWxlY3RlZFBhZ2VzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUGFnZXMuam9pbignOycpICE9PSBzb3J0ZWRQYWdlcy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBwYWdlU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFBhZ2VzLmluZGV4T2YobGFzdEVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNhdGVnb3JpemVkUGFnZXMgPSBzb3J0ZWRQYWdlcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBjYXRlZ29yaXplZFBhZ2VzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBjYXRlZ29yaXplZFBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlKTtcbiAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShjYXRlZ29yaXplZFBhZ2VzKTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHBhZ2VTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ1BhZ2VzIHRvIGNhdGVnb3JpemU6JyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYXJlbnRDYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZW1vdmVTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkQ2F0ZWdvcmllcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENhdGVnb3JpZXMuam9pbignOycpICE9PSBzb3J0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZENhdGVnb3JpZXMuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2F0ZWdvcmllc1RvUmVtb3ZlID0gc29ydGVkQ2F0ZWdvcmllcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBwYXJlbnRzOiBwYXJlbnRDYXRlZ29yaWVzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudENhdGVnb3JpZXMpIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYXJlbnQpO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRDYXRlZ29yaWVzKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjYXRlZ29yeVJlbW92ZVNlbGVjdCwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzIHRvIHJlbW92ZSBmcm9tIHBhZ2VzIHRvIGNhdGVnb3JpemU6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0sIHRydWUpO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHBhcmVudENhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRDYXRlZ29yaWVzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2F0ZWdvcmllcy5qb2luKCc7JykgIT09IHNvcnRlZENhdGVnb3JpZXMuam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkQ2F0ZWdvcmllcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5wYXJlbnRzID0gc29ydGVkQ2F0ZWdvcmllcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRDYXRlZ29yeSBvZiBwYXJlbnRDYXRlZ29yaWVzKSB7XG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFyZW50Q2F0ZWdvcnkpO1xuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC52YWxpZENhdGVnb3JpZXMuYWRkKHBhcmVudENhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRDYXRlZ29yaWVzKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYXJlbnRDYXRlZ29yeVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFyZW50IGNhdGVnb3JpZXM6JyB9KTtcbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAnY2F0ZWdvcmllcyB0aGF0IGFyZSB1bmxpa2VseSB0byBoYXZlIGVub3VnaCBwYWdlcyddLFxuICAgICAgICAgICAgICAgIFsnbm90Y2F0ZWdvcnknLCAncGFnZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24ub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbi5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZWxlY3RlZC5nZXRMYWJlbCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9O1xuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICBjb21tZW50SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb21tZW50SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY29tbWVudElucHV0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ29tbWVudDonLFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgKTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29sb3Igb2YgYSBkZXRhaWxzIGVsZW1lbnQgYmFzZWQgb24gdGhlIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0cyBpbnNpZGUuXG4gICAgICogQHBhcmFtIGRldGFpbHNFbGVtZW50IFRoZSBkZXRhaWxzIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1zd2l0Y2hcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnZGVueScpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2xvc2UnKVxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uPy5pZCA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWN0aW9ucyBvbiBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gYWRkIG1lc3NhZ2VzIHRvLlxuICAgICAqIEBwYXJhbSBjb3VudHMgVGhlIGNvdW50IG9iamVjdCB1c2VkIHRvIHRyYWNrIHJlcXVlc3RzIGZvciB0aGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqIEBwYXJhbSBuZXdQYWdlVGV4dCBUaGUgbmV3IHBhZ2UgdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSB0aGlzLmFjdGlvbnNUb1Rha2Uuc29tZSgoYWN0aW9uRGF0YSkgPT4gYWN0aW9uRGF0YS5hY3Rpb24gIT09ICdub25lJyk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbkRhdGEgb2YgdGhpcy5hY3Rpb25zVG9UYWtlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGF9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAnKiB7e3N1YnN0OkFmQyBjYXRlZ29yeX19IH5+fn5cXG57e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NlcHRlZENhdGVnb3J5KGFjdGlvbkRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGR9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGFjdGlvbkRhdGEuZGVueVJlYXNvbiEpfSB+fn5+XFxue3tBZkMtY3xifX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25EYXRhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7YWN0aW9uRGF0YS5jYXRlZ29yeX1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiBge3tBZkMtY3wke2FjdGlvbkRhdGEuY2xvc2luZ1JlYXNvbiEuaWR9fX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogKGFjdGlvbkRhdGEuY29tbWVudCA/IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCA6ICcnKSArICdcXG57e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dCkge1xuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyBjYXRlZ29yeSByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBjYXRlZ29yeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShkYXRhOiBDYXRlZ29yeUFjdGlvbikge1xuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLnBhcmVudHMubWFwKChwYXJlbnQpID0+IGBbW0NhdGVnb3J5OiR7cGFyZW50fV1dYCkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5IHRhbGs6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmRhdGEuY2F0ZWdvcml6ZWRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwYWdlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKHsgY29udGVudCB9OiB7IGNvbnRlbnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWRSZXBsYWNlQ2F0ZWdvcnkgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8oKFxcW1xcWzo/W0NjXWF0ZWdvcnk6Lis/XV1cXG4/KSspLywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRSZXBsYWNlQ2F0ZWdvcnkgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaEVuZHNXaXRoTmV3bGluZSA9IG1hdGNoLmVuZHNXaXRoKCdcXG4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke21hdGNofSR7bWF0Y2hFbmRzV2l0aE5ld2xpbmUgPyAnJyA6ICdcXG4nfVtbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dJHttYXRjaEVuZHNXaXRoTmV3bGluZSA/ICdcXG4nIDogJyd9YDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRSZXBsYWNlQ2F0ZWdvcnkpIGNvbnRlbnQgKz0gYFxcbltbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dYDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBkYXRhLmNhdGVnb3JpZXNUb1JlbW92ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwobmV3IFJlZ0V4cChgXFxcXFtcXFxcWzo/W0NjXWF0ZWdvcnk6JHtjYXRlZ29yeX0oXFxcXHwuKj8pXFxcXF1cXFxcXVxcbj9gLCAnZ2knKSwgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBwYWdlIHRvIFtbOkNhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJib2R5LmFmY3JjLWhlbHBlci1vcGVuICNtdy10ZWxlcG9ydC10YXJnZXR7ei1pbmRleDo1MDB9LmFmY3JjLWhlbHBlci1yZXF1ZXN0e21hcmdpbjoxMHB4O2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQtY29sb3I6I2VlZTtwYWRkaW5nOjVweDtjb2xvcjojMjAyMTIyfS5hZmNyYy1oZWxwZXItcmVxdWVzdCBzdW1tYXJ5e2N1cnNvcjpwb2ludGVyfS5hZmNyYy1oZWxwZXItdGFyZ2V0LWVkaXRvcnttaW4td2lkdGg6MWNoO21heC13aWR0aDpjYWxjKDEwMCUgLSA0Y2gpO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmt7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fS5hZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGluayBzdmd7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MWVtO2hlaWdodDoxZW07ZmlsbDpjdXJyZW50Y29sb3J9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8sLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcnttYXJnaW46NXB4fS5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvPmRpdiwuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyPmRpdnttYXJnaW4tdG9wOjhweDttYXJnaW4tYm90dG9tOjhweH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyPmRpdjpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTowfS5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0e21hcmdpbi1sZWZ0OjhweH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dC1oZWFkZXJ7d2lkdGg6LW1vei1tYXgtY29udGVudDt3aWR0aDptYXgtY29udGVudH0uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpb3ttYXJnaW4tdG9wOjhweH0uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXR7ZGlzcGxheTppbmxpbmU7cGFkZGluZzo4cHh9LmFmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0LC5hZmNyYy1jb21tZW50LWlucHV0e21heC13aWR0aDo1MCV9LmFmY3JjLWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOmFmdGVye2NvbnRlbnQ6XCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtmb250LXN0eWxlOml0YWxpY30uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLC5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlsc3ttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2JvcmRlcjoxcHggc29saWQgI2EyYTliMTtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cGFkZGluZzo1cHh9LmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcnttYXJnaW4tbGVmdDo4cHh9LmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjcwMH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHN7bWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbTo1cHg7YmFja2dyb3VuZC1jb2xvcjojZTJlMmUyfSNhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2V7cGFkZGluZzo1cHh9LmFmY3JjLWhlbHBlci1hY3Rpb25zLWNvbnRhaW5lciBkaXZ7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9XG4iLCAiaW1wb3J0IGNzc0NvbnRlbnQgZnJvbSAnLi4vLi4vc3R5bGVzL2FmY3JjLWhlbHBlci5jc3MnIHdpdGggeyB0eXBlOiAnY3NzJyB9O1xuXG5leHBvcnQgdHlwZSBXYXRjaE1ldGhvZCA9ICdub2NoYW5nZScgfCAncHJlZmVyZW5jZXMnIHwgJ3Vud2F0Y2gnIHwgJ3dhdGNoJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBhZmNyY0NvbmZpZ3VyYXRpb24/OiB7IGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RzRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vcmVkaXJlY3RzLWRpYWxvZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIGNvbnN0IHsgZGVmYXVsdDogQ2F0ZWdvcmllc0RpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KCcuL2NhdGVnb3JpZXMtZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICBjb25zdCBwYWdlTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgIGNvbnN0IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9SZWRpcmVjdHMnO1xuICAgIGNvbnN0IGlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9DYXRlZ29yaWVzJztcblxuICAgIGlmICghaXNSZWRpcmVjdFJlcXVlc3RQYWdlICYmICFpc0NhdGVnb3J5UmVxdWVzdFBhZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHJlcXVlc3RQYWdlVHlwZSA9IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA/ICdyZWRpcmVjdCcgOiAnY2F0ZWdvcnknO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAnIycsXG4gICAgICAgIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCxcbiAgICAgICAgJ2FmY3JjLWhlbHBlcicsXG4gICAgKSE7XG5cbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbXcudXRpbC5hZGRDU1MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGNvbnN0IGhlbHBlciA9IHJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0JyA/IFJlZGlyZWN0c0RpYWxvZyA6IENhdGVnb3JpZXNEaWFsb2c7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgaGVscGVyKHJlcXVlc3RQYWdlVHlwZSwgcGFnZU5hbWUsIHdpbmRvdy5hZmNyY0NvbmZpZ3VyYXRpb24/LmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QpO1xuXG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWZjcmNIZWxwZXJEaWFsb2ddKTtcblxuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5vcGVuKCk7XG4gICAgICAgIHZvaWQgYWZjcmNIZWxwZXJEaWFsb2cubG9hZCgpO1xuICAgIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7a0pBQUEsSUFH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S0FBTUgsRUFDTixRQUFTLDhCQUE4QkQsRUFBSyxRQUFRLGtDQUFrQyxLQUFLLGFBQWEsRUFDNUcsQ0FDSixDQUNKLEVBQUUsQ0FDTixDQUNKLENBQ0osSUMva0JBLElBQUFLLEVBQUE7RUNVQSxHQUFHLE9BQU8sTUFBTSxDQUFDLGlCQUFrQixlQUFnQixrQkFBbUIsaUJBQWlCLEVBQUcsU0FBWSxDQUNsRyxHQUFNLENBQUUsUUFBU0MsQ0FBZ0IsRUFBSSxLQUFNLHFDQUNyQyxDQUFFLFFBQVNDLENBQWlCLEVBQUksS0FBTSx1Q0FFdENDLEVBQVcsR0FBRyxPQUFPLElBQUksWUFBWSxFQUFFLFdBQVcsSUFBSyxHQUFHLEVBRTFEQyxFQUF3QkQsSUFBYSw0Q0FHM0MsR0FBSSxDQUFDQyxHQUF5QixFQUZBRCxJQUFhLDhDQUVXLE9BRXRELElBQU1FLEVBQWtCRCxFQUF3QixXQUFhLFdBRWhELEdBQUcsS0FBSyxlQUNqQixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsVUFBVUMsQ0FBZSxxQkFDekIsY0FDSixFQUVLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsR0FBRyxLQUFLLE9BQU9DLENBQVUsRUFFekIsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFOUMsSUFBTUMsRUFBU0osSUFBb0IsV0FBYUosRUFBa0JDLEVBRTVEUSxFQUFvQixJQUFJRCxFQUFPSixFQUFpQkYsRUFBVSxPQUFPLG9CQUFvQixzQkFBc0IsRUFFakhLLEVBQWMsV0FBVyxDQUFDRSxDQUFpQixDQUFDLEVBRTVDQSxFQUFrQixLQUFLLEVBQ2xCQSxFQUFrQixLQUFLLENBQ2hDLENBQUMsQ0FDTCxDQUFDIiwKICAibmFtZXMiOiBbIkFjdGlvbnNEaWFsb2ciLCAiaW5pdF9zaG93X2FjdGlvbnNfZGlhbG9nIiwgIl9fZXNtTWluIiwgIl9BY3Rpb25zRGlhbG9nIiwgIm1lc3NhZ2UiLCAidHlwZSIsICJtZXNzYWdlV2lkZ2V0IiwgInJlbG9hZEJ1dHRvbiIsICJIZWxwZXJEaWFsb2ciLCAiaW5pdF9oZWxwZXJfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfc2hvd19hY3Rpb25zX2RpYWxvZyIsICJfSGVscGVyRGlhbG9nIiwgInJlcXVlc3RQYWdlVHlwZSIsICJwYWdlVGl0bGUiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImFjdGlvbiIsICJjb25maXJtZWQiLCAicGFnZVJldmlzaW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAiaW5kZXgiLCAiaGFuZGxlIiwgImVuZEluZGV4IiwgInN1YkluZGV4IiwgIm1lc3NhZ2VXaWRnZXQiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJ3aW5kb3dNYW5hZ2VyIiwgInNob3dBY3Rpb25zRGlhbG9nIiwgIkFjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgInJlYXNvbiIsICJ0ZW1wbGF0ZVBhcmFtZXRlcnMiLCAiYWRkaXRpb25hbFJlYXNvbmluZyIsICJkZW5pZWRQYWdlcyIsICJzaW5ndWxhclJlcXVlc3QiLCAiYWxsUmVxdWVzdHMiLCAicmVhc29ucyIsICJwYWdlIiwgInJlYXNvbnNBcnJheSIsICJwYWdlcyIsICJjb21tZW50cyIsICJjb21tZW50TWVzc2FnZXMiLCAiY29tbWVudCIsICJjb21tZW50c0FycmF5IiwgInNlY3Rpb25EYXRhIiwgInByZXBlbmQiLCAiYXBwZW5kIiwgIm9sZEZ1bGxTZWN0aW9uVGV4dCIsICJvbGRTZWN0aW9uVGV4dCIsICJhcGlGdW5jdGlvbiIsICJsaW5rRWxlbWVudCIsICJhY3Rpb25SZXN1bHRFbGVtZW50SWQiLCAicmVzdWx0IiwgImFjdGlvblJlc3VsdEVsZW1lbnQiLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyIsICJyZXNvbHZlIiwgImRldGFpbHNFbGVtZW50IiwgImRpYWxvZyIsICJSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIiwgImluaXRfcmVkaXJlY3RfcmVxdWVzdF9oYW5kbGVyIiwgIl9fZXNtTWluIiwgInRpdGxlSW5kZXgiLCAidGl0bGUiLCAiZGV0YWlsc0VsZW1lbnQiLCAicmVzcG9uZGVyRWxlbWVudCIsICJkaWFsb2ciLCAicmVxdWVzdGVkVGl0bGVEaXYiLCAibGFiZWwiLCAiYWN0aW9uUmFkaW9JbnB1dCIsICJzZWxlY3RlZCIsICJvcHRpb24iLCAiY29tbWVudCIsICJ0YWdTZWxlY3QiLCAidGFnIiwgInJlZGlyZWN0IiwgInNlbGVjdGVkRWxlbWVudHMiLCAic2VsZWN0ZWRUYWdzIiwgImVsZW1lbnQiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAibGFzdEVsZW1lbnQiLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAiZWRpdG9ySW5mbyIsICJpc1RhZ1NlbGVjdGVkIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJkZW55UmVhc29uSW5wdXQiLCAidmFsdWUiLCAiY2xvc2luZ1JlYXNvbkRyb3Bkb3duIiwgImlkIiwgInVwZGF0ZSIsICJyZWRpcmVjdHNfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RzRGlhbG9nIiwgImluaXRfcmVkaXJlY3RzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiSGVscGVyRGlhbG9nIiwgInJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAicmVxdWVzdGVkUGFnZXMiLCAibWF0Y2giLCAicGFyc2VkVGFyZ2V0IiwgInJlcXVlc3RlciIsICJuYW1lIiwgInBhZ2UiLCAiaW5kZXgiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJldmVudCIsICJ0YXJnZXRFZGl0b3JFbGVtZW50IiwgImxpbmtFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJyZWFzb25EaXYiLCAicmVhc29uTGFiZWwiLCAic291cmNlRGl2IiwgInNvdXJjZUxhYmVsIiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgInJlcXVlc3RlZFRpdGxlIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiYWN0aW9uc1RvVGFrZSIsICJhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkIiwgImFjdGlvbiIsICJmaXJzdENsb3NlUmVhc29uIiwgImFsbFJlcXVlc3RzQ2xvc2VkIiwgImJhY2tncm91bmRDb2xvciIsICJhY2NlcHRlZENvdW50IiwgImRlbmllZENvdW50IiwgInNob3dBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInRhcmdldCIsICJyZXF1ZXN0cyIsICJzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkIiwgImFjY2VwdGVkUGFnZXMiLCAiZGVuaWVkUGFnZXMiLCAiY29tbWVudHMiLCAiYW1vdW50T2ZQYWdlcyIsICJzZWN0aW9uRGF0YSIsICJjbG9zaW5nSWQiLCAiYWNjZXB0ZWRQYWdlc01lc3NhZ2UiLCAiZGVuaWVkUGFnZXNNZXNzYWdlIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJkYXRhIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgInRhZyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgImVkaXRvckluZm8iLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgInBhcmFtZXRlciIsICJtYXBwZWRBcmd1bWVudHMiLCAidmFsdWUiLCAidGl0bGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAic3VwcG9ydHNTb3J0S2V5IiwgInZhbHVlIiwgImRlZmVycmVkIiwgInNvcnRLZXkiLCAicmVzcG9uc2UiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgImRhdGEiLCAibGFiZWwiLCAiUGFnZUlucHV0V2lkZ2V0IiwgImluaXRfcGFnZV9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInBhcnNlZFRpdGxlIiwgInJlc3VsdCIsICJwYWdlcyIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiY2F0ZWdvcmllc19kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJDYXRlZ29yaWVzRGlhbG9nIiwgImluaXRfY2F0ZWdvcmllc19kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiaW5pdF9oZWxwZXJfZGlhbG9nIiwgImluaXRfcGFnZV9pbnB1dF93aWRnZXQiLCAiSGVscGVyRGlhbG9nIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJmb3VuZENhdGVnb3J5IiwgIm1hdGNoIiwgImZpcnN0VXNlckluZGV4IiwgImZpcnN0VXNlclRhbGtJbmRleCIsICJmaXJzdElwSW5kZXgiLCAiZmlyc3RJbmRleCIsICJpbmRleCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJleGFtcGxlc0RpdiIsICJleGFtcGxlc0xhYmVsIiwgImV4YW1wbGUiLCAibGlua0VsZW1lbnQiLCAicGFyZW50c0RpdiIsICJwYXJlbnRzTGFiZWwiLCAicGFyZW50IiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgImFjdGlvblJhZGlvSW5wdXQiLCAibGFiZWwiLCAib3B0aW9uIiwgImNvbW1lbnRJbnB1dExheW91dCIsICJjb21tZW50IiwgImNvbW1lbnRJbnB1dCIsICJwYWdlU2VsZWN0TGF5b3V0IiwgImNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0IiwgInBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0IiwgImRlbnlSZWFzb25MYXlvdXQiLCAiY2xvc2luZ1JlYXNvbkxheW91dCIsICJwYWdlU2VsZWN0SW5wdXQiLCAiUGFnZUlucHV0V2lkZ2V0IiwgInZhbHVlIiwgInBhZ2VzIiwgInBhZ2UiLCAicGFnZVNlbGVjdCIsICJzZWxlY3RlZEVsZW1lbnRzIiwgInNlbGVjdGVkUGFnZXMiLCAiZWxlbWVudCIsICJzb3J0ZWRQYWdlcyIsICJhIiwgImIiLCAibGFzdEVsZW1lbnQiLCAiY2F0ZWdvcml6ZWRQYWdlcyIsICJjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0IiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3QiLCAiY2F0ZWdvcnlSZW1vdmVTZWxlY3QiLCAic2VsZWN0ZWRDYXRlZ29yaWVzIiwgInNvcnRlZENhdGVnb3JpZXMiLCAicGFyZW50Q2F0ZWdvcmllcyIsICJwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0IiwgInBhcmVudENhdGVnb3J5IiwgImRlbnlSZWFzb24iLCAiY2xvc2luZ1JlYXNvbiIsICJ0aXRsZSIsICJpZCIsICJzZWxlY3RlZCIsICJhY3Rpb24iLCAiYmFja2dyb3VuZENvbG9yIiwgInNob3dBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInNlY3Rpb25EYXRhIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJkYXRhIiwgImNvbnRlbnQiLCAiZGlkUmVwbGFjZUNhdGVnb3J5IiwgIm1hdGNoRW5kc1dpdGhOZXdsaW5lIiwgImNhdGVnb3J5IiwgImFmY3JjX2hlbHBlcl9kZWZhdWx0IiwgIlJlZGlyZWN0c0RpYWxvZyIsICJDYXRlZ29yaWVzRGlhbG9nIiwgInBhZ2VOYW1lIiwgImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJyZXF1ZXN0UGFnZVR5cGUiLCAiZXZlbnQiLCAiYWZjcmNfaGVscGVyX2RlZmF1bHQiLCAid2luZG93TWFuYWdlciIsICJoZWxwZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciXQp9Cg==