User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper/redirect-helper.ts
"use strict";(()=>{var b=class g extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){Object.assign(g.prototype,OO.ui.mixin.LookupElement.prototype),super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();t||i.resolve([]);let e=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:e?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(a=>{if(a?.query?.pages){let r=a.query.pages.filter(s=>!s.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(s=>{let o=s.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",r),i.resolve(r)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};var T=class g extends OO.ui.ProcessDialog{api=new mw.Api;constructor(t){Object.assign(g.prototype,OO.ui.ProcessDialog.prototype),super(t),g.static.name="ShowChangesDialog",g.static.title="Changes to be made",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>{let[t,i]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{let a=e.compare.body,r=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),s=new OO.ui.PanelLayout({padded:!0,expanded:!1});s.$element.append(a?`
<table class="diff diff-editfont-monospace">
<colgroup>
<col class="diff-marker">
<col class="diff-content">
<col class="diff-marker">
<col class="diff-content">
</colgroup>
<tbody>
${a}
</tbody>
</table>`:r.$element[0]),this.$body.append(s.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};var x=class g extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){Object.assign(g.prototype,OO.ui.ProcessDialog.prototype),super(t),this.pageTitleParsed=i,g.static.name="OutputPreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{let i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};var O=class g extends OO.ui.TextInputWidget{api=new mw.Api;pageTitleParsed;constructor(t,i){Object.assign(g.prototype,OO.ui.mixin.LookupElement.prototype),super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let r=a.parse.sections.filter(s=>s.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(r.map(s=>({data:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?i.resolve(a.query?.pages?a.query.pages.filter(r=>r.title!==this.pageTitleParsed.toString()).map(r=>({data:r.title,label:new OO.ui.HtmlSnippet(`${r.title}${r.pageprops&&"disambiguation"in r.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in r?" <i>(redirect)</i>":""}`)})):[]):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};var y=class{api=new mw.Api;redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},r){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=r}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
margin-right: auto;
margin-bottom: 25px !important;
margin-left: auto;
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
color: #202122;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-redirect-possibilities::after {
content: " (redirect with possibilities)";
font-style: italic;
}
.redirect-helper-template-parameters-container,
.redirect-helper-template-parameters-container details {
margin-block: 10px;
border-radius: 5px;
background-color: #e2e2e2;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
margin-block: 5px;
background-color: #d1cece;
}
#redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
margin-top: 15px;
border-top: 1px solid gray;
padding-top: 10px;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}
.redirect-helper-autofix-button {
margin-left: 5px;
font-size: 12px;
}
.redirect-helper-autofix-button a {
padding: 3px 4px !important;
min-height: unset !important;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element?.[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){let t=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{let i=this.redirectRegex.exec(t)?.[1];if(!i)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.toString()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new O({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};let r=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:r}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{let e=this.tagSelect.getValue().sort((r,s)=>r.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let r of this.templateEditorsInfo)r.details.style.display="none";let a=0;for(let r of this.tagSelect.getValue()){let s=this.templateEditorsInfo.find(o=>o.name===r);s&&(s.details.style.display="block",a++)}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,i.style.display=a>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let r=Object.entries(a.parameters);if(r.length===0)continue;let s=document.createElement("details");s.style.display="none";let o=document.createElement("summary");o.textContent=e,s.append(o);let n={name:e,details:s,parameters:[]};for(let[u,l]of r){let m=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});m.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let p=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${u}${!l.label||u.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});s.append(p.$element[0]),n.parameters.push({name:u,aliases:l.aliases,editor:m})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(n)}let i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{let e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;let r=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(r+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let r of["An","A","The"])if(a.startsWith(r+" ")){a=a.slice(r.length+1)+", "+r;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new b({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(let a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{let e=this.categorySelect.getValue().sort((a,r)=>a.toLowerCase().localeCompare(r.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());let i=new x({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});let e=new T({size:"large"});t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){let t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await mw.user.getRights()).includes("patrol"))return!1;let e=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u)),r=!1;if(this.oldRedirectTagData){let u=Object.entries(this.redirectTemplates).filter(([,l])=>Object.entries(l.parameters).length>0);for(let[l,m]of u){if(!this.oldRedirectTags.includes(l)||!this.tagSelect.getValue().includes(l))continue;let c=this.oldRedirectTagData[l]??Object.entries(m.parameters).map(([d])=>[d,""]),h=this.templateEditorsInfo.find(d=>d.name===l);for(let d of h.parameters){let f=c.find(v=>v[0]===d.name)?.[1]??"",w=d.editor.getValue().trim();if(f!==w){r=!0;break}}if(r)break}}let s=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),n=[];e&&n.push(`retarget to [[${t}]]`),a&&n.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),r&&n.push("change categorization template arguments"),s&&n.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),o&&n.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),n.length===0&&n.push("perform redirect cleanup"),n[0]=n[0][0].toUpperCase()+n[0].slice(1),n.length>1&&(n[n.length-1]=`and ${n.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=n.join(n.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));let t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([o,n])=>[o,...n.aliases].includes(i))?.[0];if(!e?.[1])return null;let s=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[u,l]=o.split("=");return[u.trim(),l.trim()]});return[a,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2)?.trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(i=>i.slice(11,-2))??[],this.oldStrayText=[/{{short description\|.*?}}/i.exec(this.pageContent)?.[0],/{{DISPLAYTITLE:.*?}}/.exec(this.pageContent)?.[0],/{{italic title\|?.*?}}/i.exec(this.pageContent)?.[0],/{{title language\|.*?}}/.exec(this.pageContent)?.[0],/{{authority control(\|.*?)?}}/i.exec(this.pageContent)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(r=>r.name===i);if(a)for(let[r,s]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(r));o&&o.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(p=>(p==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${p})!`}),null)),r=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(r.parse.redirects?.[0]){let p=r.parse.redirects[0].to+(r.parse.redirects[0].tofragment?`#${r.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(p)}" target="_blank">${p}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:p}]})}if(i.split("#").length>1)if(r.parse.sections.find(c=>c.line.replaceAll(/<\/?i>/g,"")===i.split("#")[1]))e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{let c=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...c.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(d=>d.split("|").map(f=>f.trim()))?.flat()??[],...c.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(d=>d.split("|").map(f=>f.trim()).filter(f=>!/^text\s*?=/.test(f)))?.flat()??[],...c.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(d=>d.trim())??[],...c.match(/EpisodeNumber += +\d+/g)?.map(d=>`ep${d.split("=")[1].trim()}`)??[]].includes(i.split("#")[1])?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:i.split("#")[0]}]})}if(i.split("#").length===1)for(let p of["R to section","R to anchor"])e.includes(p)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${p}}}</code>!`,autoFixes:[{type:"remove",tag:p}]});let s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(p=>p.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],l=n.some(p=>e.includes(p)),m=u.some(p=>e.includes(p));s&&!l&&!m&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!s&&((!o&&(l||m)||o&&l)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...u].map(p=>({type:"remove",tag:p}))}),o&&!m&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(let p of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(p)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${p}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:p}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(let p of e){let c=this.redirectTemplates[p];if(c)for(let[h,d]of Object.entries(c.parameters)){let f=this.templateEditorsInfo.find(w=>w.name===p)?.parameters.find(w=>[w.name,...w.aliases].includes(h));f&&d.required&&!f.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${p}}}</code> but it is missing the required parameter <code>${h}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(let s of t)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){for(let s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(let{title:s,message:o,autoFixes:n}of i){let u=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${o} Click again without making changes to submit anyway.`),l=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:u});if(n){let m=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});m.on("click",()=>{let p=this.tagSelect.getValue();for(let c of n)c.type==="add"&&!p.includes(c.tag)&&this.tagSelect.addTag(c.tag,c.tag),c.type==="remove"&&p.includes(c.tag)&&this.tagSelect.removeTagByData(c.tag),c.type==="change-target"&&this.redirectInput.setValue(c.target);l.$element[0].style.textDecoration="line-through 2px black",m.$element[0].remove()}),l.$element[0].querySelector(".oo-ui-labelElement-label").append(m.$element[0])}this.editorBox.$element[0].append(l.$element[0])}for(let s of t)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);let e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptAdvert;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");let s=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let s=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((u,l)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${l?.error.info??"Unknown error"} (${u})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):o?(o.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.href=mw.util.getUrl(this.pageTitle,{redirect:"no"})}}createOutput(t,i,e,a,r){let s=mw.Title.newFromText(t),o=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);let n=i.map(u=>{let l=this.templateEditorsInfo.find(c=>c.name===u);if(!l)return`{{${u}}}`;let m=l.parameters.findLastIndex((c,h)=>c.name===(h+1).toString()&&c.editor.getValue().trim()),p=l.parameters.map((c,h)=>{let d=c.editor.getValue().trim();return!d&&h>m?null:`|${c.name===(h+1).toString()?"":`${c.name}=`}${d}`}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,r.length>0?r.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(t){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:t})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(t,i,e){return await this.api.edit(t,()=>({text:i,summary:e})).catch((a,r)=>a==="nocreate-missing"?this.api.create(t,{summary:e},i).catch((s,o)=>{mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${t}: ${r?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}};var P=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(P,()=>{class g{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){let i=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),e={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(i.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);let a=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});a.on("click",()=>{a.$element[0].remove(),new y(e,!1).load()}),this.contentText.prepend(a.$element[0])}else if(i.query.pages[0].redirect)new y(e,!0).load();else{let a=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");a.addEventListener("click",r=>{r.preventDefault(),new y(e,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),a.remove()})}}}new g().run()});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL2NoYW5nZXMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL291dHB1dC1wcmV2aWV3LWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgY2F0ZWdvcmllcz86IHsgdGl0bGU6IHN0cmluZyB9W10gfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBzaG93aW5nIGNoYW5nZXMgdG8gYmUgbWFkZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhbmdlc0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKENoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICBDaGFuZ2VzRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1Nob3dDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbb2xkVGV4dCwgbmV3VGV4dF0gPSB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dmVyc2lvbic6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3Rvc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBwcmV2aWV3aW5nIHRlbXBsYXRlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3V0cHV0UHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oT3V0cHV0UHJldmlld0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnT3V0cHV0UHJldmlld0RpYWxvZyc7XG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcyBwcmV2aWV3JztcbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IFsndGV4dCcsICdjYXRlZ29yaWVzaHRtbCddLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWREYigpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyB0ZXh0OiBzdHJpbmcgfSB9KS5wYXJzZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyBjYXRlZ29yaWVzaHRtbDogc3RyaW5nIH0gfSkucGFyc2UuY2F0ZWdvcmllc2h0bWw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRhZ3NDb250ZW50LCBjYXRlZ29yaWVzQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgUGFnZVBhcnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCcjJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHsgYWN0aW9uOiAncGFyc2UnLCBwYWdlOiB0aXRsZSwgcHJvcDogJ3NlY3Rpb25zJywgcmVkaXJlY3RzOiB0cnVlIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFBhZ2VQYXJzZVJlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHZhbHVlLnNwbGl0KCcjJylbMV0udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2luZm8nLCAncGFnZXByb3BzJ10sXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wczogeyBkaXNhbWJpZ3VhdGlvbj86IHN0cmluZyB9OyByZWRpcmVjdD86IHN0cmluZyB9W10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5Py5wYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHBhZ2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFnZS50aXRsZX0ke3BhZ2UucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gcGFnZS5wYWdlcHJvcHMgPyAnIDxpPihkaXNhbWJpZ3VhdGlvbik8L2k+JyA6ICcnfSR7J3JlZGlyZWN0JyBpbiBwYWdlID8gJyA8aT4ocmVkaXJlY3QpPC9pPicgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7XG4gICAgQXBpUGFyc2VQYXJhbXMsXG4gICAgQXBpUXVlcnlJbmZvUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlUmV2aXNpb25zUmVzdWx0LFxuICAgIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2UsXG4gICAgUGFnZXByb3BzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IENhdGVnb3J5SW5wdXRXaWRnZXQgZnJvbSAnLi9jYXRlZ29yeS1pbnB1dC13aWRnZXQnO1xuaW1wb3J0IENoYW5nZXNEaWFsb2cgZnJvbSAnLi9jaGFuZ2VzLWRpYWxvZyc7XG5pbXBvcnQgT3V0cHV0UHJldmlld0RpYWxvZyBmcm9tICcuL291dHB1dC1wcmV2aWV3LWRpYWxvZyc7XG5pbXBvcnQgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBmcm9tICcuL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG5leHBvcnQgdHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcmVkaXJlY3Q/OiB0cnVlOyBwYXJhbWV0ZXJzOiBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczsgYWxpYXNlczogc3RyaW5nW10gfT47XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHBhcmFtZXRlcnM6IHsgbmFtZTogc3RyaW5nOyBhbGlhc2VzOiBzdHJpbmdbXTsgZWRpdG9yOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQgfVtdO1xufVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGlhbG9nIHBvcnRpb24gb2YgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG4gICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jcmVkaXJlY3Q6P1xccypcXFtcXFtcXHMqOj8oW15bXFxde3x9XSs/KVxccyooPzpcXHxbXltcXF17fH1dKz8pP11dXFxzKi9pO1xuICAgIHByaXZhdGUgc2NyaXB0QWR2ZXJ0ID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyfHJlZGlyZWN0LWhlbHBlcl1dKSc7XG5cbiAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgIHByaXZhdGUgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgcGFnZVRpdGxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgcHJpdmF0ZSBleGlzdHM6IGJvb2xlYW47XG5cbiAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgc3luY1dpdGhNYWluQnV0dG9uPzogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWRpcmVjdElucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciE6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0SW5wdXQhOiBDYXRlZ29yeUlucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3VtbWFyeUlucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHNob3dQcmV2aWV3QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgcHJpdmF0ZSB0YWxrRGF0YT86IFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgcHJpdmF0ZSBwYWdlQ29udGVudCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFncz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW11bXT47XG4gICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZENhdGVnb3JpZXM/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFN0cmF5VGV4dD86IHN0cmluZztcblxuICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICBjb250ZW50VGV4dCxcbiAgICAgICAgICAgIHBhZ2VUaXRsZSxcbiAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgfTogeyByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7IGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDsgcGFnZVRpdGxlOiBzdHJpbmc7IHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUgfSxcbiAgICAgICAgZXhpc3RzOiBib29sZWFuLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIHRoaXMuZXhpc3RzID0gZXhpc3RzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSByZWRpcmVjdC1oZWxwZXIgZGlhbG9nIGludG8gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItYm94IHtcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgbWFyZ2luLWJvdHRvbTogMjVweCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XG4gICAgd2lkdGg6IDcwMHB4O1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTBweCk7XG4gICAgY29sb3I6ICMyMDIxMjI7XG59XG5cbi5yZWRpcmVjdC1pbnB1dC1sYXlvdXQgbGFiZWwge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXM6OmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiAocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKVwiO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcixcbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgbWFyZ2luLWJsb2NrOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QxY2VjZTtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5O1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCA+ICoge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItd2FybmluZyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiBhIHtcbiAgICBwYWRkaW5nOiAzcHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogdW5zZXQgIWltcG9ydGFudDtcbn1gKTtcblxuICAgICAgICBtdy5sb2FkZXIuYWRkTGlua1RhZygnaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93L2xvYWQucGhwP21vZHVsZXM9bWVkaWF3aWtpLmRpZmYuc3R5bGVzJm9ubHk9c3R5bGVzJyk7XG5cbiAgICAgICAgLyogTG9hZCBlbGVtZW50cyAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgY29uc3QgbWFpblBhZ2VEYXRhID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBpZiAobWFpblBhZ2VEYXRhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBhd2FpdCB0aGlzLmxvYWRTeW5jV2l0aE1haW5CdXR0b24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3VibWl0RWxlbWVudHMoKTtcblxuICAgICAgICAvKiBBZGQgZWxlbWVudHMgdG8gc2NyZWVuIGFuZCBsb2FkIGRhdGEgKGlmIGFwcGxpY2FibGUpICovXG4gICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZChcbiAgICAgICAgICAgIC4uLihbXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24/LiRlbGVtZW50Py5bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgSFRNTEVsZW1lbnRbXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMubG9hZEV4aXN0aW5nRGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBcIlN5bmMgd2l0aCBtYWluIHBhZ2VcIiBidXR0b25cIiBvbiB0YWxrIHBhZ2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpIHtcbiAgICAgICAgY29uc3QgbWFpblBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSk7XG5cbiAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggbWFpbiBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlZGlyZWN0UmVnZXguZXhlYyhtYWluUGFnZUNvbnRlbnQpPy5bMV07XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIG1haW4gcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk/LmdldFRhbGtQYWdlKCk/LnRvU3RyaW5nKCkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSBbJ1IgZnJvbSBtb3ZlJywgLi4udGhpcy5yZWRpcmVjdFRlbXBsYXRlc1snUiBmcm9tIG1vdmUnXS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICBtYWluUGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAvKiBSZWRpcmVjdCB0YXJnZXQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgc2VsZWN0aW9uICovXG4gICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJyZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICAvKiBERUZBVUxUU09SVCBpbnB1dCAqL1xuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh2YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWNvbjogJ3JvYm90JywgbGFiZWw6ICdTdWdnZXN0JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC8gXFwoLipcXCkkLywgJycpOyAvLyBSZW1vdmUgZGlzYW1iaWd1YXRpb25cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBiaXJ0aCBuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBmaWN0aW9uYWwgY2hhcmFjdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBiYW5kIG1lbWJlcicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBwZXJzb24nLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbmFsIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHJlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBzcG91c2UnLFxuICAgICAgICAgICAgICAgIF0uc29tZSgodGFnKSA9PiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGluZyBpcyBtb2RpZmllZCBmcm9tIGV2YWQzNydzIFwiUmF0ZXJcIlxuXG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0aW9uYWxTdWZmaXggPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoLyAoPzpbSlNdci4/fFtJVlhdKykkLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25hbFN1ZmZpeCA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpIHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLywkLywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9PJy8sICdPJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJOYW1lcyA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShsYXN0TmFtZSArICcsICcgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBuYW1lLnJlcGxhY2VBbGwoJ01yLicsICdNaXN0ZXInKS5yZXBsYWNlQWxsKCcmJywgJ0FuZCcpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZWFkaW5nQXJ0aWNsZSBvZiBbJ0FuJywgJ0EnLCAnVGhlJ10pXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lLnN0YXJ0c1dpdGgobGVhZGluZ0FydGljbGUgKyAnICcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gbmV3TmFtZS5zbGljZShsZWFkaW5nQXJ0aWNsZS5sZW5ndGggKyAxKSArICcsICcgKyBsZWFkaW5nQXJ0aWNsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3TmFtZSA9PT0gbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFwicmVkaXJlY3QtaGVscGVyIHdhc24ndCBhYmxlIHRvIGRldGVybWluZSBhIHNvcnQga2V5IGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdGl0bGUhXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobmV3TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5BY3Rpb25GaWVsZExheW91dCh0aGlzLmRlZmF1bHRTb3J0SW5wdXQsIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLCB7XG4gICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgIGBEZWZhdWx0IHNvcnQga2V5IChERUZBVUxUU09SVCkgKHNlZSA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnV2lraXBlZGlhOkNhdGVnb3JpemF0aW9uI1NvcnQga2V5cycpfVwiIHRhcmdldD1cIl9ibGFua1wiPmd1aWRlbGluZTwvYT4pOmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5jYXRlZ29yeVNlbGVjdCwge1xuICAgICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzOicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTdW1tYXJ5IGlucHV0ICovXG4gICAgICAgIHRoaXMuc3VtbWFyeUlucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgZG91YmxlIHJlZGlyZWN0JyB9LCAvL1xuICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgc2VsZiByZWRpcmVjdCcgfSxcbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZW1vdmUgaW5jb3JyZWN0IHJjYXRzJyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zdW1tYXJ5SW5wdXQsIHtcbiAgICAgICAgICAgIGlkOiAncmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0JyxcbiAgICAgICAgICAgIGxhYmVsOiAnU3VtbWFyeTonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGVsZW1lbnRzIGluIHRoZSBzdWJtaXQgYnV0dG9uIHJvdy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTdWJtaXRFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIC8qIFNldHVwIHN1Ym1pdCBidXR0b24gKi9cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTdWJtaXQnLCBkaXNhYmxlZDogdHJ1ZSwgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVTdWJtaXRCdXR0b25DbGljaygpKTtcblxuICAgICAgICAvKiBTZXR1cCBzaG93IHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBPdXRwdXRQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgcHJldmlldycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTZXR1cCBzaG93IGNoYW5nZXMgYnV0dG9uICovXG4gICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IENoYW5nZXNEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0pO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dDaGFuZ2VzRGlhbG9nXSk7XG5cbiAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgY2hhbmdlcycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5zZXREYXRhKFtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTZXR1cCBzeW5jIHRhbGsgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFsa0RhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zeW5jVGFsa0NoZWNrYm94LCB7IGxhYmVsOiAnU3luYyB0YWxrIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXR1cCBwYXRyb2wgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucGF0cm9sQ2hlY2tib3gsIHsgbGFiZWw6ICdNYXJrIGFzIHBhdHJvbGxlZCcsIGFsaWduOiAnaW5saW5lJyB9KV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNldHVwIGxheW91dCAqL1xuICAgICAgICB0aGlzLnN1Ym1pdExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcbiAgICAgICAgICAgIGlkOiAncmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQnLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gcGF0cm9sIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VUcmlhZ2VNYXJrQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PignI213ZS1wdC1tYXJrIC5td2UtcHQtdG9vbC1pY29uJyk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXVucmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IG13LnVzZXIuZ2V0UmlnaHRzKCk7XG4gICAgICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdwYWdldHJpYWdlbGlzdCcsXG4gICAgICAgICAgICAgICAgcGFnZV9pZDogbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcykpIGFzIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2U7XG5cbiAgICAgICAgICAgIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8udXNlcl9uYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnJlc3VsdCAhPT0gJ3N1Y2Nlc3MnIHx8IHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gIU51bWJlci5wYXJzZUludChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8ucGF0cm9sX3N0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlU3VtbWFyeSgpIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RWYWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXJlZGlyZWN0VmFsdWUpICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgbGV0IG9sZFRhcmdldCA9IHRoaXMub2xkUmVkaXJlY3RUYXJnZXQ/LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgaWYgKG9sZFRhcmdldCkgb2xkVGFyZ2V0ID0gb2xkVGFyZ2V0WzBdLnRvVXBwZXJDYXNlKCkgKyBvbGRUYXJnZXQuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldENoYW5nZWQgPSByZWRpcmVjdFZhbHVlICE9PSBvbGRUYXJnZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ3NDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKHRhZykgPT4gIXRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyEuc29tZSgodGFnKSA9PiAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKTtcblxuICAgICAgICAgICAgbGV0IHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoUGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKFssIGRhdGFdKSA9PiBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhZywgZGF0YV0gb2YgdGFnc1dpdGhQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1dhc1NlbGVjdGVkID0gdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnV2FzU2VsZWN0ZWQgfHwgIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkVGFnRGF0YSA9IHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhW3RhZ10gPz8gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5tYXAoKFtuYW1lXSkgPT4gW25hbWUsICcnXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRUYWdFZGl0b3JEYXRhID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSB0YWcpITtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBmb3VuZFRhZ0VkaXRvckRhdGEucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQXJndW1lbnQgPSBvbGRUYWdEYXRhLmZpbmQoKGFyZ3VtZW50KSA9PiBhcmd1bWVudFswXSA9PT0gcGFyYW1ldGVyLm5hbWUpPy5bMV0gPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBcmd1bWVudCA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRBcmd1bWVudCAhPT0gbmV3QXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdBcmd1bWVudHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLm9sZENhdGVnb3JpZXMhLmluY2x1ZGVzKGNhdGVnb3J5IGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goYHJldGFyZ2V0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYCk7XG4gICAgICAgICAgICBpZiAodGFnc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlc2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMnKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0U29ydENoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGRlZmF1bHQgc29ydCBrZXlgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2F0ZWdvcmllc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZENhdGVnb3JpZXMhLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcmllc2AsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSBjaGFuZ2VzLnB1c2goJ3BlcmZvcm0gcmVkaXJlY3QgY2xlYW51cCcpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDEpIGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXSA9IGBhbmQgJHtjaGFuZ2VzLmF0KC0xKX1gO1xuXG4gICAgICAgICAgICAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBjaGFuZ2VzLmpvaW4oY2hhbmdlcy5sZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXhpc3RpbmdEYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcblxuICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyA9IChcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgLm1hcCgoW3RhZywgdGFnRGF0YV0pID0+XG4gICAgICAgICAgICAgICAgICAgIFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gICAgICAgICkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWRpcmVjdFRhZ3MgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgLmZsYXRNYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PiBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdKVxuICAgICAgICAgICAgLm1hcCgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gdGFnT3JSZWRpcmVjdFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgb3JpZ2luYWxSZWRpcmVjdFRhZ3NcbiAgICAgICAgICAgICAgICAubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZSwgLi4udGFnRGF0YS5hbGlhc2VzXS5pbmNsdWRlcyh0YWcpLFxuICAgICAgICAgICAgICAgICAgICApPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBcmd1bWVudHMgPSBtYXRjaD8uWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQXJndW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LmluY2x1ZGVzKCc9JykpIHJldHVybiBbKGluZGV4ICsgMSkudG9TdHJpbmcoKSwgYXJndW1lbnQudHJpbSgpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGFyZ3VtZW50LnNwbGl0KCc9Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmV3VGFnLCBmb3JtYXR0ZWRBcmd1bWVudHNdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBbc3RyaW5nLCBzdHJpbmdbXVtdXVtdLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudFxuICAgICAgICAgICAgICAgIC5tYXRjaCgve3tERUZBVUxUU09SVDouKj99fS9nKVxuICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgPy5zbGljZSgxNCwgLTIpXG4gICAgICAgICAgICAgICAgPy50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXFxbXFxbW0NjXWF0ZWdvcnk6Lis/XV0vZyk/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnNsaWNlKDExLCAtMikpID8/IFtdO1xuXG4gICAgICAgIHRoaXMub2xkU3RyYXlUZXh0ID0gW1xuICAgICAgICAgICAgL3t7c2hvcnQgZGVzY3JpcHRpb25cXHwuKj99fS9pLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIC97e0RJU1BMQVlUSVRMRTouKj99fS8uZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7aXRhbGljIHRpdGxlXFx8Py4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7dGl0bGUgbGFuZ3VhZ2VcXHwuKj99fS8uZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7YXV0aG9yaXR5IGNvbnRyb2woXFx8Lio/KT99fS9pLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIGVsc2UgbXcubm90aWZ5KCdDb3VsZCBub3QgZmluZCByZWRpcmVjdCB0YXJnZXQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYWdzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRUZW1wbGF0ZUVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRlbXBsYXRlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kVGVtcGxhdGVFZGl0b3IpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyRWRpdG9yID0gZm91bmRUZW1wbGF0ZUVkaXRvci5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT5cbiAgICAgICAgICAgICAgICAgICAgW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFBhcmFtZXRlckVkaXRvcikgZm91bmRQYXJhbWV0ZXJFZGl0b3IuZWRpdG9yLnNldFZhbHVlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9sZERlZmF1bHRTb3J0KSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGREZWZhdWx0U29ydCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLm9sZENhdGVnb3JpZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGNhdGVnb3J5KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgY2hlY2tzIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFuZCByZXR1cm5zIHRoZSBlcnJvcnMgKGlmIGFueSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yczoge1xuICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRvRml4ZXM/OiAoeyB0eXBlOiAnYWRkJyB8ICdyZW1vdmUnOyB0YWc6IHN0cmluZyB9IHwgeyB0eXBlOiAnY2hhbmdlLXRhcmdldCc7IHRhcmdldDogc3RyaW5nIH0pW107XG4gICAgICAgIH1bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgaWYgKCEvXlxccypbXltcXF17fH1dK1xccyokLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24/LnRvU3RyaW5nKCkgPT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2Nhbm5vdCByZWRpcmVjdCB0byBpdHNlbGYhJyB9KTtcblxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogWydwYWdlcHJvcHMnLCAnY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgIHRpdGxlczogZGVzdGluYXRpb24sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcylcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAvKiBOb25leGlzdGVudCBkZXN0aW5hdGlvbiAqLyBpZiAoZXJyb3JDb2RlID09PSAnbWlzc2luZ3RpdGxlJylcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdkb2VzIG5vdCBleGlzdCEnIH0pO1xuICAgICAgICAgICAgICAgIC8qIE90aGVyIEFQSSBlcnJvciAqLyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiBgd2FzIG5vdCBhYmxlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgQVBJICgke2Vycm9yQ29kZX0pIWAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KSkgYXMgKFBhZ2Vwcm9wc1Jlc3VsdCAmIENhdGVnb3JpZXNSZXN1bHQpIHwgbnVsbDtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXJzZVJlc3VsdCA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgcGFnZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICBwcm9wOiAnc2VjdGlvbnMnLFxuICAgICAgICAgICAgcmVkaXJlY3RzOiB0cnVlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcykpIGFzIFBhZ2VQYXJzZVJlc3VsdDtcblxuICAgICAgICAvKiBEb3VibGUgcmVkaXJlY3RzICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0cz8uWzBdKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50byArXG4gICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnQgPyBgIyR7ZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICApfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb25SZWRpcmVjdH08L2E+LiBSZXRhcmdldCB0byB0aGF0IHBhZ2UgaW5zdGVhZCwgYXMgZG91YmxlIHJlZGlyZWN0cyBhcmVuJ3QgYWxsb3dlZC5gLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2NoYW5nZS10YXJnZXQnLCB0YXJnZXQ6IGRlc3RpbmF0aW9uUmVkaXJlY3QgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE5vbmV4aXN0ZW50IHNlY3Rpb24gKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRTZWN0aW9uID0gZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5zZWN0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgIChzZWN0aW9uKSA9PiBzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJykgPT09IGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/W0FhXSg/Om5jaG9ycz98bmNob3IgZm9yIHJlZGlyZWN0fG5rZXJ8TkNIT1J8bmMpXFxzKj9cXHwpLis/KD89fX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2csXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvRXBpc29kZU51bWJlciArPSArXFxkKy9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYGVwJHthbmNob3Iuc3BsaXQoJz0nKVsxXS50cmltKCl9YCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIFtdKSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluY2x1ZGVzKGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhbiBhbmNob3IhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzBdIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKFxuICAgICAgICAgICAgZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISFkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAhdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UpIHtcbiAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UgKi9cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoIXRhcmdldElzU3VybmFtZUxpc3QgJiYgKHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSB8fCB0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCkpIHx8XG4gICAgICAgICAgICAgICAgKHRhcmdldElzU3VybmFtZUxpc3QgJiYgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIG5vdCBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbLi4udG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLCAuLi50b1N1cm5hbWVMaXN0VGFnc10ubWFwKCh0YWcpID0+ICh7IHR5cGU6ICdyZW1vdmUnLCB0YWcgfSkpLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBzdXJuYW1lIGxpc3Qgd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldElzU3VybmFtZUxpc3QgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiB7e1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZX19IHdpdGhvdXQgXCIgKGRpc2FtYmlndWF0aW9uKVwiIGF0IGVuZCBvZiB0aXRsZSAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJlxuICAgICAgICAgICAgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiZcbiAgICAgICAgICAgICF0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLmVuZHNXaXRoKCcgKGRpc2FtYmlndWF0aW9uKScpXG4gICAgICAgIClcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fTwvY29kZT4sIGJ1dCB0aGlzIHRpdGxlIGRvZXMgbm90IGVuZCB3aXRoIFwiIChkaXNhbWJpZ3VhdGlvbilcIi4gVXNlIDxjb2RlPnt7UiBmcm9tIGFtYmlndW91cyB0ZXJtfX08L2NvZGU+IG9yIGEgc2ltaWxhciBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkIScsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIFsnUiBwcm90ZWN0ZWQnLCAnUiBzZW1pLXByb3RlY3RlZCcsICdSIGV4dGVuZGVkLXByb3RlY3RlZCcsICdSIHRlbXBsYXRlLXByb3RlY3RlZCcsICdSIGZ1bGx5IHByb3RlY3RlZCddKVxuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogdGVtcGxhdGUgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSB3aXRob3V0IGJlaW5nIHRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSAqL1xuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiaXMgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSBidXQgaXQgaXNuJ3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiFcIixcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5yZWRpcmVjdFRlbXBsYXRlc1t0YWddO1xuICAgICAgICAgICAgaWYgKCF0YWdEYXRhKSBjb250aW51ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFnRGF0YS5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IGl0IGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciA8Y29kZT4ke3BhcmFtZXRlck5hbWV9PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ubWlzc2luZyAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdleGlzdHMsIGJ1dCBpcyBub3QgYSByZWRpcmVjdCEnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdWJtaXRCdXR0b25DbGljaygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdCxcbiAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94LFxuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKHRydWUpO1xuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICBsZXQgZXJyb3JzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uPj4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMubmVlZHNDaGVjaykgZXJyb3JzID0gYXdhaXQgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24oKTtcbiAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZWRpcmVjdC1oZWxwZXItd2FybmluZycpKSBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlLCBhdXRvRml4ZXMgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci13YXJuaW5nJ10sXG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGVyZm9ybSBhdXRvLWZpeCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24nXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeCBvZiBhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnYWRkJyAmJiAhdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LmFkZFRhZyhhdXRvRml4LnRhZywgYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ3JlbW92ZScgJiYgdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LnJlbW92ZVRhZ0J5RGF0YShhdXRvRml4LnRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnY2hhbmdlLXRhcmdldCcpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShhdXRvRml4LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCAycHggYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbCcpIS5hcHBlbmQoYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCBhbnl3YXknKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKiBFZGl0L2NyZWF0ZSByZWRpcmVjdCAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPVxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LmdldFZhbHVlKCkgfHwgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyKSArIHRoaXMuc2NyaXB0QWR2ZXJ0O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgIG13Lm5vdGlmeShgUmVkaXJlY3QgJHt0aGlzLmV4aXN0cyA/ICdlZGl0ZWQnIDogJ2NyZWF0ZWQnfSBzdWNjZXNzZnVsbHkhYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdFZGl0aW5nIHRhbGsgcGFnZS4uLicpO1xuXG4gICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIGZyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10sXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgJ1N5bmNpbmcgcmVkaXJlY3QgZnJvbSBtYWluIHBhZ2UnICsgdGhpcy5zY3JpcHRBZHZlcnQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCF0YWxrUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgIG13Lm5vdGlmeSgnVGFsayBwYWdlIHN5bmNlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBQYXRyb2wgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICBpZiAodGhpcy5wYXRyb2xDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnUGF0cm9sbGluZyByZWRpcmVjdC4uLicpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXRyb2xMaW5rOiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluayBhJyk7XG4gICAgICAgICAgICBjb25zdCBtYXJrUmV2aWV3ZWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpO1xuXG4gICAgICAgICAgICBpZiAocGF0cm9sTGluaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXN1bHQpIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgbWFya1Jldmlld2VkQnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ29tcGxldGUsIHJlbG9hZGluZy4uLicpO1xuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU91dHB1dChcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgICAgICBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgID8gYCR7cGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDE0ID8gJzonIDogJyd9JHtwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCl9JHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKSA/IGAjJHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKX1gIDogJyd9YFxuICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkXG4gICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsXG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDAgPyBge3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19XFxuYCA6IG51bGwsXG4gICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKSA6IG51bGwsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gcGFnZS5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRzIG9yIGNyZWF0ZXMgYSBwYWdlIHdpdGggZ2l2ZW4gdGV4dC5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHBhZ2UgdGl0bGUuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHBhZ2UgdGV4dC5cbiAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZWRpdE9yQ3JlYXRlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5IH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5SW5mb1BhcmFtcywgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VJbmZvUmVzdWx0LCBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCBSZWRpcmVjdEhlbHBlckRpYWxvZywgeyB0eXBlIFJlZGlyZWN0VGVtcGxhdGVEYXRhIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZW50aXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXIge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIHByaXZhdGUgY29udGVudFRleHQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkITogbXcuVGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIHJlZGlyZWN0IGhlbHBlci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXNzZXNQcmVDaGVja3MoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gYXdhaXQgdGhpcy5mZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignI213LWNvbnRlbnQtdGV4dCcpITtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucGFnZVRpdGxlKSE7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhZ2VBbmRMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYWdlIHBhc3NlcyBwcmUgY2hlY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPj0gMCwgLy8gSXMgbm90IHZpcnR1YWwgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNBcnRpY2xlJyksIC8vIFZpZXdpbmcgdGhlIGNvbnRlbnQgb2YgYSBwYWdlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnLCAvLyBWaWV3aW5nIHRoZSBwYWdlIChub3QgZWRpdGluZylcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksIC8vIFZpZXdpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICAgICAgICAgICAgICAhbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSwgLy8gTm90IHZpZXdpbmcgYSBkaWZmXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaGVzIHRoZSByZWRpcmVjdCB0ZW1wbGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZm8gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0luZm8gPSB7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXM6IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQ6IHRoaXMuY29udGVudFRleHQsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGVQYXJzZWQ6IHRoaXMucGFnZVRpdGxlUGFyc2VkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NyZWF0ZSByZWRpcmVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdhcnRpY2xlUmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlKS5sb2FkKCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAnIycsXG4gICAgICAgICAgICAgICAgICAgICdSZWRpcmVjdCBwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3JlZGlyZWN0LWhlbHBlcicsXG4gICAgICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICAgICAgcG9ydGxldExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UpLmxvYWQoKTtcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7bUJBTUEsSUFBcUJBLEVBQXJCLE1BQXFCQyxVQUE0QixHQUFHLEdBQUcsZUFBZ0IsQ0FFM0QsSUFBTSxJQUFJLEdBQUcsSUFFckIsWUFBWUMsRUFBNkIsQ0FDckMsT0FBTyxPQUFPRCxFQUFvQixVQUFXLEdBQUcsR0FBRyxNQUFNLGNBQWMsU0FBUyxFQUVoRixNQUFNQyxDQUFNLEVBRVosR0FBRyxHQUFHLE1BQU0sY0FBYyxLQUFLLEtBQThDQSxDQUFNLENBQ3ZGLENBRUEsaUJBQW1CLElBQU0sQ0FDckIsSUFBTUMsRUFBUSxLQUFLLFNBQVMsRUFDdEJDLEVBQVcsRUFBRSxTQUFTLEVBRXZCRCxHQUFPQyxFQUFT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TSxJQUFNLFVBQVksT0FBUyxhQUMvQyxJQUNBLGdCQUNBLGlCQUNKLEVBQ0FBLEVBQVksaUJBQWlCLFFBQVVDLEdBQVUsQ0FDN0NBLEVBQU0sZUFBZSxFQUVyQixJQUFJRixFQUFxQkYsRUFBWSxFQUFLLEVBQUUsS0FBSyxFQUVqRCxPQUFPLFNBQVMsQ0FBRSxJQUFLLEVBQUcsU0FBVSxRQUFTLENBQUMsRUFFOUNHLEVBQVksT0FBTyxDQUN2QixDQUFDLENBQ0wsQ0FDSixDQUNKLENBRUEsSUFBSUwsRUFBZSxFQUFFLElBQUksQ0FDN0IsQ0FBQyIsCiAgIm5hbWVzIjogWyJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgIl9DYXRlZ29yeUlucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJDaGFuZ2VzRGlhbG9nIiwgIl9DaGFuZ2VzRGlhbG9nIiwgImNvbmZpZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAicmVzdWx0IiwgImNvbXBhcmlzb24iLCAibm9DaGFuZ2VzRWxlbWVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJfT3V0cHV0UHJldmlld0RpYWxvZyIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInJlc3VsdCIsICJ0YWdzQ29udGVudCIsICJjYXRlZ29yaWVzQ29udGVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJfUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInRpdGxlIiwgInJlc3VsdCIsICJtYXRjaGVkU2VjdGlvbnMiLCAic2VjdGlvbiIsICJwYXJzZWRUaXRsZSIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJleGlzdHMiLCAibWFpblBhZ2VDb250ZW50IiwgInRhcmdldCIsICJ0YWdPclJlZGlyZWN0IiwgIlJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQiLCAidmFsdWUiLCAidGFnIiwgInJlZGlyZWN0IiwgImxhYmVsIiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgInBhZ2VzIiwgInBhZ2UiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJzaG93Q2hhbmdlc0RpYWxvZyIsICJDaGFuZ2VzRGlhbG9nIiwgInBhZ2VUcmlhZ2VNYXJrQnV0dG9uIiwgInBhdHJvbFJlc3BvbnNlIiwgInJlZGlyZWN0VmFsdWUiLCAib2xkVGFyZ2V0IiwgInRhcmdldENoYW5nZWQiLCAidGFnc0NoYW5nZWQiLCAidGFnQXJndW1lbnRzQ2hhbmdlZCIsICJ0YWdzV2l0aFBhcmFtZXRlcnMiLCAiZGF0YSIsICJvbGRUYWdEYXRhIiwgImZvdW5kVGFnRWRpdG9yRGF0YSIsICJ0ZW1wbGF0ZSIsICJwYXJhbWV0ZXIiLCAib2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAibmV3QXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNhdGVnb3J5IiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAic2VjdGlvbiIsICJkZXN0aW5hdGlvbkNvbnRlbnQiLCAiYW5jaG9yIiwgInBhcnQiLCAidGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFyZ2V0SXNTdXJuYW1lTGlzdCIsICJ0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MiLCAidG9TdXJuYW1lTGlzdFRhZ3MiLCAidGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0IiwgImZvdW5kUGFyYW1ldGVyIiwgImVsZW1lbnRzVG9EaXNhYmxlIiwgImVsZW1lbnQiLCAidGl0bGUiLCAibWVzc2FnZSIsICJhdXRvRml4ZXMiLCAid2FybmluZ01lc3NhZ2UiLCAiYXV0b0ZpeEJ1dHRvbiIsICJhdXRvRml4IiwgIm91dHB1dCIsICJmcm9tTW92ZSIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0IiwgImRlcGVuZGVuY2llcyIsICJSZWRpcmVjdEhlbHBlciIsICJwYWdlSW5mbyIsICJkaWFsb2dJbmZvIiwgImJ1dHRvbiIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJwb3J0bGV0TGluayIsICJldmVudCJdCn0K