@citolab/qti-components 6.9.1-beta.61 → 6.9.1-beta.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-elements.json +155 -155
- package/dist/index.global.js +1 -1
- package/dist/index.js +1 -1
- package/dist/qti-components/index.d.ts +4 -4
- package/dist/qti-components/index.js +74 -74
- package/dist/qti-item/index.d.ts +1 -1
- package/dist/qti-loader/index.d.ts +1 -1
- package/dist/{qti-simple-choice-CFhbe77e.d.ts → qti-simple-choice-C_jJ4Bnp.d.ts} +2 -1
- package/package.json +1 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as
|
|
1
|
+
import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as q,c as n}from"../chunk-NYAUPIAG.js";import{provide as fr}from"@lit/context";import{LitElement as gr,html as br}from"lit";import{customElement as vr,property as K}from"lit/decorators.js";function x(c,s){let e=b({waitUntilFirstUpdate:!1},s);return(t,r)=>{let{update:i}=t,o=Array.isArray(c)?c:[c];t.update=function(a){o.forEach(l=>{let p=l;if(a.has(p)){let d=a.get(p),m=this[p];d!==m&&(!e.waitUntilFirstUpdate||this.hasUpdated)&&this[r](d,m)}}),i.call(this,a)}}}import{createContext as hr}from"@lit/context";var Lt=[{identifier:"completionStatus",cardinality:"single",baseType:"string",value:"unknown",type:"outcome"},{identifier:"numAttempts",cardinality:"single",baseType:"integer",value:"0",type:"response"}],E=hr(Symbol("item"));var w=class extends gr{constructor(){super();this.identifier="";this.adaptive="false";this.timeDependent=null;this._handleDisabledChange=(e,t)=>{this._interactionElements.forEach(r=>r.disabled=t)};this._handleReadonlyChange=(e,t)=>this._interactionElements.forEach(r=>r.readonly=t);this._context={identifier:this.getAttribute("identifier"),variables:Lt};this._initialContext=q(b({},this._context),{variables:this._context.variables});this._feedbackElements=[];this._interactionElements=[];this.addEventListener("qti-register-variable",e=>{this._context=q(b({},this._context),{variables:[...this._context.variables,e.detail.variable]}),this._initialContext=this._context,e.stopPropagation()}),this.addEventListener("qti-register-feedback",e=>{e.stopPropagation();let t=e.detail;this._feedbackElements.push(t),t.checkShowFeedback(t.outcomeIdentifier)}),this.addEventListener("qti-register-interaction",e=>{e.stopPropagation(),this._interactionElements.push(e.target)}),this.addEventListener("end-attempt",e=>{let{responseIdentifier:t,countAttempt:r}=e.detail;this.updateResponseVariable(t,"true"),this.processResponse(r)}),this.addEventListener("qti-set-outcome-value",e=>{let{outcomeIdentifier:t,value:r}=e.detail;this.updateOutcomeVariable(t,r),e.stopPropagation()}),this.addEventListener("qti-interaction-response",this.handleUpdateResponseVariable)}get variables(){return this._context.variables.map(e=>b({identifier:e.identifier,value:e.value,type:e.type},e.type==="outcome"&&e.identifier==="SCORE"?{externalScored:e.externalScored}:{}))}set variables(e){if(!Array.isArray(e)||e.some(t=>!("identifier"in t))){console.warn("variables property should be an array of VariableDeclaration");return}this._context=q(b({},this._context),{variables:this._context.variables.map(t=>{let r=e.find(i=>i.identifier===t.identifier);return r?b(b({},t),r):t})}),this._context.variables.forEach(t=>{if(t.type==="response"){let r=this._interactionElements.find(i=>i.responseIdentifier===t.identifier);r&&(r.value=t.value)}t.type==="outcome"&&this._feedbackElements.forEach(r=>r.checkShowFeedback(t.identifier))})}async connectedCallback(){super.connectedCallback(),await this.updateComplete,this._emit("qti-assessment-item-connected",this)}set responses(e){if(e)for(let t of e){this.getResponse(t.responseIdentifier)&&this.updateResponseVariable(t.responseIdentifier,t.response);let i=this._interactionElements.find(o=>o.getAttribute("response-identifier")===t.responseIdentifier);i&&(i.value=t.response)}}render(){return br`<slot></slot>`}showCorrectResponse(e){let r=this._context.variables.filter(i=>"correctResponse"in i&&i.correctResponse).map(i=>({responseIdentifier:i.identifier,response:i.correctResponse}));for(let i of r){let o=this._interactionElements.find(a=>a.getAttribute("response-identifier")===i.responseIdentifier);o&&(o.correctResponse=e?i.response:"")}}processResponse(e=!0){var r;let t=this.querySelector("qti-response-processing");return!t||!t.process?!1:(t.process(),this.adaptive==="false"&&this.updateOutcomeVariable("completionStatus",this._getCompletionStatus()),e&&this.updateOutcomeVariable("numAttempts",(+((r=this._context.variables.find(i=>i.identifier==="numAttempts"))==null?void 0:r.value)+1).toString()),this._emit("qti-response-processed"),!0)}resetResponses(){this._context=this._initialContext}getResponse(e){return this.getVariable(e)}getOutcome(e){return this.getVariable(e)}getVariable(e){return this._context.variables.find(t=>t.identifier===e)||null}handleUpdateResponseVariable(e){let{responseIdentifier:t,response:r}=e.detail;this.updateResponseVariable(t,r)}updateResponseVariable(e,t){this._context=q(b({},this._context),{variables:this._context.variables.map(r=>r.identifier!==e?r:q(b({},r),{value:t}))}),this._emit("qti-interaction-changed",{item:this.identifier,responseIdentifier:e,response:Array.isArray(t)?[...t]:t}),this.adaptive==="false"&&this.updateOutcomeVariable("completionStatus",this._getCompletionStatus())}updateOutcomeVariable(e,t){var i;let r=this.getOutcome(e);if(!r){console.warn(`Can not set qti-outcome-identifier: ${e}, it is not available`);return}this._context=q(b({},this._context),{variables:this._context.variables.map(o=>o.identifier!==e?o:q(b({},o),{value:r.cardinality==="single"?t:[...o.value,t]}))}),this._feedbackElements.forEach(o=>o.checkShowFeedback(e)),this._emit("qti-outcome-changed",{item:this.identifier,outcomeIdentifier:e,value:(i=this._context.variables.find(o=>o.identifier===e))==null?void 0:i.value})}_getCompletionStatus(){return this._interactionElements.every(e=>e.validate())?"completed":this._interactionElements.some(e=>e.validate())?"incomplete":"not_attempted"}_emit(e,t=null){this.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t}))}};n([K({type:String})],w.prototype,"title",2),n([K({type:String})],w.prototype,"identifier",2),n([K({type:String})],w.prototype,"adaptive",2),n([K({type:String})],w.prototype,"timeDependent",2),n([K({type:Boolean})],w.prototype,"disabled",2),n([x("disabled",{waitUntilFirstUpdate:!0})],w.prototype,"_handleDisabledChange",2),n([K({type:Boolean})],w.prototype,"readonly",2),n([x("readonly",{waitUntilFirstUpdate:!0})],w.prototype,"_handleReadonlyChange",2),n([fr({context:E})],w.prototype,"_context",2),w=n([vr("qti-assessment-item")],w);import{LitElement as yr}from"lit";import{customElement as xr,property as At}from"lit/decorators.js";var W=class extends yr{constructor(){super(...arguments);this.identifier="";this.href=""}async connectedCallback(){super.connectedCallback();let e=new Event("qti-assessment-stimulus-ref-connected",{cancelable:!0,bubbles:!0});if(this.dispatchEvent(e)){let i=this.closest("qti-assessment-item").querySelector(`[data-stimulus-idref=${this.identifier}]`);i?await this.updateStimulusRef(i):console.warn(`Stimulus with data-stimulus-idref ${this.identifier} not found`)}}async updateStimulusRef(e){let t=this.href.substring(0,this.href.lastIndexOf("/")),r=await Rt().load(this.href).then(i=>i.path(t).htmlDoc());if(r){let i=r.querySelectorAll("qti-stimulus-body, qti-stylesheet");e.innerHTML="",e.append(...i)}}};n([At({type:String})],W.prototype,"identifier",2),n([At({type:String})],W.prototype,"href",2),W=n([xr("qti-assessment-stimulus-ref")],W);import{html as Er}from"lit";import{property as Re}from"lit/decorators.js";var Dt={toAttribute:c=>c?"true":"false",fromAttribute:c=>c==="true"};function _(c,s){class e extends c{constructor(...i){super(...i);this.identifier="";this.tabIndex=0;this.disabled=!1;this.readonly=!1;this.internals=this.attachInternals()}handleDisabledChange(i,o){this.tabIndex=o?-1:0,o&&this.blur()}connectedCallback(){super.connectedCallback(),this.addEventListener("keyup",this._onKeyUp),this.addEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent(`register-${s}`,{bubbles:!0,composed:!0}))}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("keyup",this._onKeyUp),this.removeEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent(`unregister-${s}`,{bubbles:!0,composed:!0}))}_onKeyUp(i){i.altKey||i.code==="Space"&&(i.preventDefault(),this._activate())}_onClick(){this.disabled||this.readonly||(this.focus(),this._activate())}_activate(){this.disabled||this.readonly||this.dispatchEvent(new CustomEvent(`activate-${s}`,{bubbles:!0,composed:!0,detail:{identifier:this.identifier}}))}render(){return Er`<slot></slot>`}}return n([Re({type:String})],e.prototype,"identifier",2),n([Re({type:Number,reflect:!0,attribute:"tabindex"})],e.prototype,"tabIndex",2),n([Re({type:Boolean,reflect:!0,attribute:"aria-disabled",converter:Dt})],e.prototype,"disabled",2),n([Re({type:Boolean,reflect:!0,attribute:"aria-readonly",converter:Dt})],e.prototype,"readonly",2),n([x("disabled",{waitUntilFirstUpdate:!0})],e.prototype,"handleDisabledChange",1),e}import{customElement as qr}from"lit/decorators.js";import{html as wr,LitElement as Tr}from"lit";import{css as Cr}from"lit";var Vt=Cr`
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
}
|
|
5
|
-
`;var ne=class extends
|
|
5
|
+
`;var ne=class extends Tr{render(){return wr`<slot name="qti-rubric-block"></slot><slot></slot>`}};ne.styles=Vt,ne=n([qr("qti-item-body")],ne);import{html as Sr,LitElement as kr}from"lit";import{customElement as Mr}from"lit/decorators.js";var Le=class extends kr{render(){return Sr`<slot></slot>`}connectedCallback(){this.parentElement.tagName.endsWith("INTERACTION")&&this.setAttribute("slot","prompt")}};Le=n([Mr("qti-prompt")],Le);import{LitElement as _r}from"lit";import{customElement as Rr}from"lit/decorators.js";var Ae=class extends _r{constructor(){super(...arguments);this.styleElement=null}firstUpdated(e){super.firstUpdated(e);let t=this.getAttribute("href");if(t!==null&&fetch(t).then(r=>r.text()).then(r=>{let i=this.minifyCss(r);this.styleElement=document.createElement("style"),this.styleElement.media="screen",this.styleElement.textContent=`@scope {${i}}`,this.parentElement?this.parentElement.appendChild(this.styleElement):console.warn("No parent element to append the scoped stylesheet to.")}).catch(r=>{console.error("Failed to load stylesheet:",r)}),this.textContent!==null&&this.textContent.trim()!==""){let r=this.minifyCss(this.textContent);this.styleElement=document.createElement("style"),this.styleElement.media="screen",this.styleElement.textContent=`@scope {${r}}`,this.parentElement?this.parentElement.appendChild(this.styleElement):console.warn("No parent element to append the scoped stylesheet to.")}}minifyCss(e){return e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").replace(/\s*([{}:;])\s*/g,"$1").trim()}disconnectedCallback(){if(this.styleElement)try{this.styleElement.remove()}catch(e){console.error("Could not remove stylesheet:",e)}super.disconnectedCallback()}};Ae=n([Rr("qti-stylesheet")],Ae);import{consume as Vr}from"@lit/context";import{css as Hr,html as Nr}from"lit";import{customElement as $r,property as De,state as Ir}from"lit/decorators.js";import{html as Lr,LitElement as Ar}from"lit";import{customElement as Dr}from"lit/decorators.js";var O=class extends Ar{render(){return Lr`<slot></slot>`}defaultValues(s){let e=Array.from(this.querySelectorAll("qti-default-value > qti-value"));if(e.length===0)return null;let t=e.map(r=>r.innerHTML.trim());return t.length>1||s.cardinality==="multiple"||s.cardinality==="ordered"?t:t[0]}};O=n([Dr("qti-variabledeclaration")],O);var R=class extends O{constructor(){super(...arguments);this.externalScored=null}render(){var t,r;let e=(r=(t=this.itemContext)==null?void 0:t.variables.find(i=>i.identifier===this.identifier))==null?void 0:r.value;return Nr`${JSON.stringify(e,null,2)}`}get interpolationTable(){let e=this.querySelector("qti-interpolation-table");if(e){let t=new Map;for(let r of e.querySelectorAll("qti-interpolation-table-entry")){!r.getAttribute("source-value")&&r.getAttribute("target-value")&&console.error("source-value or target-value is missing in qti-interpolation-table-entry");let i=parseInt(r.getAttribute("source-value")),o=parseInt(r.getAttribute("target-value"));(isNaN(i)||isNaN(o))&&console.error("source-value or target-value is not a number in qti-interpolation-table-entry"),t.set(i,o)}return t}return null}connectedCallback(){super.connectedCallback();let e={identifier:this.identifier,cardinality:this.cardinality,baseType:this.baseType,type:"outcome",value:null,interpolationTable:this.interpolationTable,externalScored:this.externalScored};e.value=this.defaultValues(e),this.dispatchEvent(new CustomEvent("qti-register-variable",{bubbles:!0,composed:!0,detail:{variable:e}}))}};R.styles=[Hr`
|
|
6
6
|
:host {
|
|
7
7
|
display: none;
|
|
8
8
|
}
|
|
9
|
-
`],
|
|
9
|
+
`],n([De({type:String,attribute:"base-type"})],R.prototype,"baseType",2),n([De({type:String,attribute:"external-scored"})],R.prototype,"externalScored",2),n([De({type:String})],R.prototype,"identifier",2),n([De({type:String})],R.prototype,"cardinality",2),n([Vr({context:E,subscribe:!0}),Ir()],R.prototype,"itemContext",2),R=n([$r("qti-outcome-declaration")],R);import{consume as Pr}from"@lit/context";import{css as Or,html as Ur}from"lit";import{customElement as Fr,property as Je,state as Br}from"lit/decorators.js";var I=class extends O{render(){var e,t;let s=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return Ur`${JSON.stringify(s,null,2)}`}connectedCallback(){super.connectedCallback();let s={baseType:this.baseType,identifier:this.identifier,correctResponse:this.correctResponse,cardinality:this.cardinality||"single",mapping:this.mapping,value:null,type:"response",candidateResponse:null};s.value=this.defaultValues(s),this.dispatchEvent(new CustomEvent("qti-register-variable",{bubbles:!0,composed:!0,detail:{variable:s}}))}get correctResponse(){let s,e=this.querySelector("qti-correct-response");if(e){let t=e.querySelectorAll("qti-value");if(this.cardinality==="single"&&t.length>0)s=t[0].textContent,t[0].remove();else if(this.cardinality!=="single"){s=[];for(let r=0;r<t.length;r++)s.push(t[r].textContent),t[r].remove()}}return s}get mapping(){return this.querySelector("qti-mapping")}};I.styles=[Or`
|
|
10
10
|
:host {
|
|
11
11
|
display: none;
|
|
12
12
|
}
|
|
13
|
-
`],
|
|
13
|
+
`],n([Je({type:String,attribute:"base-type"})],I.prototype,"baseType",2),n([Je({type:String})],I.prototype,"identifier",2),n([Je({type:String})],I.prototype,"cardinality",2),n([Pr({context:E,subscribe:!0}),Br()],I.prototype,"itemContext",2),I=n([Fr("qti-response-declaration")],I);import{LitElement as Xr}from"lit";import{customElement as Yr}from"lit/decorators.js";var Ve=class extends Xr{};Ve=n([Yr("qti-companion-materials-info")],Ve);import{LitElement as jr,html as zr}from"lit";import{customElement as Kr}from"lit/decorators.js";var He=class extends jr{render(){return zr`<slot></slot>`}};He=n([Kr("qti-content-body")],He);import{LitElement as Wr,css as Zr,html as Jr}from"lit";import{customElement as Gr,property as Ne}from"lit/decorators.js";var L=class extends Wr{handleclassNamesChange(s,e){this.classNames.split(" ").forEach(r=>{switch(r){case"qti-rubric-discretionary-placement":this.setAttribute("slot","qti-rubric-block");break;case"qti-rubric-inline":this.setAttribute("slot","");break;default:break}})}render(){return Jr`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-rubric-block")}};L.styles=Zr`
|
|
14
14
|
:host {
|
|
15
15
|
display: block;
|
|
16
16
|
}
|
|
17
|
-
`,
|
|
17
|
+
`,n([Ne({type:String})],L.prototype,"id",2),n([Ne({type:String})],L.prototype,"use",2),n([Ne({type:String})],L.prototype,"view",2),n([Ne({type:String,attribute:"class"})],L.prototype,"classNames",2),n([x("classNames",{waitUntilFirstUpdate:!0})],L.prototype,"handleclassNamesChange",1),L=n([Gr("qti-rubric-block")],L);import{css as ii,html as si}from"lit";import{customElement as oi}from"lit/decorators.js";import{consume as ei}from"@lit/context";import{LitElement as ti}from"lit";import{property as $e,state as ri}from"lit/decorators.js";var Qr=()=>new Intl.NumberFormat().format(.1).replace(/\d/g,""),ae=c=>{if(typeof c=="string")return c;let s=Qr();return s==="."?c.toLocaleString():c.toString().replace(".","").replace(s,".")};function Ge(c){return c==null}function le(c){return c.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}var T=class extends ti{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-feedback",{bubbles:!0,composed:!0,detail:this}))}checkShowFeedback(s){let e=this._context.variables.find(r=>r.identifier===s)||null;if(this.outcomeIdentifier!==s||!e)return;let t=!1;Array.isArray(e.value)?t=e.value.includes(this.identifier):t=!Ge(this.identifier)&&!Ge(e==null?void 0:e.value)&&this.identifier===e.value||!1,this.showFeedback(t)}showFeedback(s){this.showStatus=s&&this.showHide==="show"||!s&&this.showHide==="hide"?"on":"off"}};n([$e({type:String,attribute:"show-hide"})],T.prototype,"showHide",2),n([$e({type:String,attribute:"outcome-identifier"})],T.prototype,"outcomeIdentifier",2),n([$e({type:String})],T.prototype,"identifier",2),n([$e({type:String,attribute:!1})],T.prototype,"showStatus",2),n([ei({context:E,subscribe:!0}),ri()],T.prototype,"_context",2);var ce=class extends T{render(){return si` <slot part="feedback" class="feedback ${this.showStatus}"></slot> `}firstUpdated(s){this.checkShowFeedback(this.outcomeIdentifier)}};ce.styles=ii`
|
|
18
18
|
:host {
|
|
19
19
|
display: block;
|
|
20
20
|
}
|
|
@@ -24,21 +24,21 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
24
24
|
.off {
|
|
25
25
|
display: none;
|
|
26
26
|
}
|
|
27
|
-
`,ce=
|
|
27
|
+
`,ce=n([oi("qti-feedback-block")],ce);import{css as ni,html as ai}from"lit";import{customElement as li}from"lit/decorators.js";var pe=class extends T{constructor(){super(...arguments);this.render=()=>ai` <slot part="feedback" class="${this.showStatus}"></slot> `}};pe.styles=ni`
|
|
28
28
|
.on {
|
|
29
29
|
display: inline-block;
|
|
30
30
|
}
|
|
31
31
|
.off {
|
|
32
32
|
display: none;
|
|
33
33
|
}
|
|
34
|
-
`,pe=
|
|
34
|
+
`,pe=n([li("qti-feedback-inline")],pe);import{css as ci,html as pi}from"lit";import{customElement as di}from"lit/decorators.js";var de=class extends T{constructor(){super(...arguments);this.render=()=>pi` <slot part="feedback" class="${this.showStatus}"></slot> `}};de.styles=ci`
|
|
35
35
|
.on {
|
|
36
36
|
display: inline-block;
|
|
37
37
|
}
|
|
38
38
|
.off {
|
|
39
39
|
display: none;
|
|
40
40
|
}
|
|
41
|
-
`,de=
|
|
41
|
+
`,de=n([di("qti-modal-feedback")],de);import{css as hi,html as fi}from"lit";import{ifDefined as gi}from"lit/directives/if-defined.js";import{property as Qe,state as ui}from"lit/decorators.js";import{LitElement as mi}from"lit";var u=class extends mi{constructor(){super();this.responseIdentifier="";this.disabled=!1;this.readonly=!1;this._correctResponse="";this._internals=this.attachInternals()}reportValidity(){return this._internals.reportValidity()}reset(){this.value=""}get correctResponse(){return this._correctResponse}set correctResponse(e){this._correctResponse=e}connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,cancelable:!1,composed:!0}))}saveResponse(e){this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,cancelable:!1,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:Array.isArray(e)?[...e]:e}}))}};u.formAssociated=!0,n([Qe({type:String,attribute:"response-identifier"})],u.prototype,"responseIdentifier",2),n([Qe({reflect:!0,type:Boolean})],u.prototype,"disabled",2),n([Qe({reflect:!0,type:Boolean})],u.prototype,"readonly",2),n([ui()],u.prototype,"_correctResponse",2);import{customElement as bi,property as ue,state as Ht}from"lit/decorators.js";var S=class extends u{constructor(){super(...arguments);this._rows=5;this._value=""}handleclassNamesChange(e,t){let r=t.split(" "),i=!1;if(r.forEach(o=>{if(o.startsWith("qti-height-lines-")){let a=o.replace("qti-height-lines-","");this._rows=parseInt(a),i=!0}}),!i&&this.expectedLength){let o=Math.ceil(this.expectedLength/50);this._rows=o}}get value(){return this._value}set value(e){if(typeof e=="string"){this._value=e;let t=new FormData;t.append(this.responseIdentifier,e),this._internals.setFormValue(t),this.validate()}else throw new Error("Value must be a string")}validate(){let e=this.shadowRoot.querySelector("textarea");if(!e)return!1;if(this.patternMask&&this.dataPatternmaskMessage){this._internals.setValidity({}),e.setCustomValidity("");let t=this.patternMask.startsWith("^")&&this.patternMask.endsWith("$")?this.patternMask:`^${this.patternMask}$`,r=new RegExp(t);e.checkValidity()&&r.test(e.value)||(this._internals.setValidity({customError:!0},this.dataPatternmaskMessage),e.setCustomValidity(this.dataPatternmaskMessage))}else{let t=e.checkValidity();this._internals.setValidity(t?{}:{customError:!1})}return this._value!==""&&e.checkValidity()}reportValidity(){let e=this.shadowRoot.querySelector("textarea");if(!e)return!1;let t=this.validate();return t||e.reportValidity(),t}static get styles(){return[hi`
|
|
42
42
|
/* PK: display host as block, else design will be collapsed */
|
|
43
43
|
:host {
|
|
44
44
|
display: block;
|
|
@@ -49,7 +49,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
49
49
|
height: 100%;
|
|
50
50
|
border: 0;
|
|
51
51
|
}
|
|
52
|
-
`]}render(){return
|
|
52
|
+
`]}render(){return fi`<slot name="prompt"></slot
|
|
53
53
|
><textarea
|
|
54
54
|
part="textarea"
|
|
55
55
|
name="${this.responseIdentifier}"
|
|
@@ -60,12 +60,12 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
60
60
|
@keyup="${this.textChanged}"
|
|
61
61
|
@change="${this.textChanged}"
|
|
62
62
|
@blur="${e=>{this.reportValidity()}}"
|
|
63
|
-
placeholder="${
|
|
63
|
+
placeholder="${gi(this.placeholderText?this.placeholderText:void 0)}"
|
|
64
64
|
rows="${this._rows}"
|
|
65
65
|
?disabled="${this.disabled}"
|
|
66
66
|
?readonly="${this.readonly}"
|
|
67
67
|
.value=${this._value}
|
|
68
|
-
></textarea>`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;if(this.setEmptyAttribute(t.value),this._value!==t.value){this.value=t.value;let r=this.validate();this.saveResponse(t.value)}}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};
|
|
68
|
+
></textarea>`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;if(this.setEmptyAttribute(t.value),this._value!==t.value){this.value=t.value;let r=this.validate();this.saveResponse(t.value)}}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};n([Ht()],S.prototype,"_rows",2),n([ue({type:Number,attribute:"expected-length"})],S.prototype,"expectedLength",2),n([ue({type:String,attribute:"pattern-mask"})],S.prototype,"patternMask",2),n([ue({type:String,attribute:"placeholder-text"})],S.prototype,"placeholderText",2),n([ue({type:String,attribute:"data-patternmask-message"})],S.prototype,"dataPatternmaskMessage",2),n([Ht()],S.prototype,"_value",2),n([ue({type:String,attribute:"class"})],S.prototype,"classNames",2),n([x("classNames")],S.prototype,"handleclassNamesChange",1),S=n([bi("qti-extended-text-interaction")],S);import{html as yi}from"lit";import{customElement as xi,property as Ie,state as Ei}from"lit/decorators.js";import{ifDefined as $t}from"lit/directives/if-defined.js";import{createRef as Ci}from"lit/directives/ref.js";import{css as vi}from"lit";var Nt=vi`
|
|
69
69
|
:host {
|
|
70
70
|
display: inline-block;
|
|
71
71
|
}
|
|
@@ -147,7 +147,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
147
147
|
width: 57rem;
|
|
148
148
|
min-width: 57rem;
|
|
149
149
|
}
|
|
150
|
-
`;var A=class extends u{constructor(){super(...arguments);this._value="";this.inputRef=
|
|
150
|
+
`;var A=class extends u{constructor(){super(...arguments);this._value="";this.inputRef=Ci()}get value(){return this._value}set value(e){if(typeof e=="string"){this._value=e;let t=new FormData;t.append(this.responseIdentifier,e),this._internals.setFormValue(t),this.validate()}else throw new Error("Value must be a string")}validate(){let e=this.shadowRoot.querySelector("input");if(!e)return!1;if(this.patternMask&&this.dataPatternmaskMessage)this._internals.setValidity({}),e.setCustomValidity(""),e.checkValidity()||(this._internals.setValidity({customError:!0},this.dataPatternmaskMessage),e.setCustomValidity(this.dataPatternmaskMessage));else{let t=e.checkValidity();this._internals.setValidity(t?{}:{customError:!1})}return this._value!==""&&e.checkValidity()}render(){return yi`
|
|
151
151
|
<input
|
|
152
152
|
part="input"
|
|
153
153
|
name="${this.responseIdentifier}"
|
|
@@ -166,7 +166,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
166
166
|
?readonly="${this.readonly}"
|
|
167
167
|
/>
|
|
168
168
|
<div part="correct">${this._correctResponse}</div>
|
|
169
|
-
`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;if(this.setEmptyAttribute(t.value),this._value!==t.value){this.value=t.value;let r=this.validate();this.saveResponse(t.value)}}reportValidity(){let e=this.shadowRoot.querySelector("input");if(!e)return!1;let t=this.validate();return t||e.reportValidity(),t}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};A.styles=Nt,
|
|
169
|
+
`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;if(this.setEmptyAttribute(t.value),this._value!==t.value){this.value=t.value;let r=this.validate();this.saveResponse(t.value)}}reportValidity(){let e=this.shadowRoot.querySelector("input");if(!e)return!1;let t=this.validate();return t||e.reportValidity(),t}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};A.styles=Nt,n([Ie({type:Number,attribute:"expected-length"})],A.prototype,"expectedLength",2),n([Ie({type:String,attribute:"pattern-mask"})],A.prototype,"patternMask",2),n([Ie({type:String,attribute:"placeholder-text"})],A.prototype,"placeholderText",2),n([Ie({type:String,attribute:"data-patternmask-message"})],A.prototype,"dataPatternmaskMessage",2),n([Ei()],A.prototype,"_value",2),A=n([xi("qti-text-entry-interaction")],A);import{html as wi}from"lit";import{customElement as Ti}from"lit/decorators.js";import{property as It,query as qi}from"lit/decorators.js";var U=(c,s)=>{class e extends c{constructor(){super(...arguments);this._choiceElements=[];this.minChoices=0;this.maxChoices=1;this._handleDisabledChange=(i,o)=>{this._choiceElements.forEach(a=>a.disabled=o)};this._handleReadonlyChange=(i,o)=>{this._choiceElements.forEach(a=>a.readonly=o)};this._value=""}_handleMaxChoicesChange(i,o){this._determineInputType()}get value(){return Array.isArray(this._value)?this._value.join(","):this._value}set value(i){if(this.maxChoices>1&&typeof i=="string"?this._value=i.split(","):this._value=i,Array.isArray(this._value)){let o=new FormData;this._value.forEach(a=>{o.append(this.responseIdentifier,a)}),this._internals.setFormValue(o)}else this._internals.setFormValue(this._value);this._updateChoiceSelection()}get correctResponse(){return this._correctResponse}set correctResponse(i){this._correctResponse=i;let o=Array.isArray(i)?i:[i];this._choiceElements.forEach(a=>{a.internals.states.delete("correct-response"),a.internals.states.delete("incorrect-response"),o.length>0&&(o.includes(a.identifier)?a.internals.states.add("correct-response"):a.internals.states.add("incorrect-response"))})}connectedCallback(){super.connectedCallback(),this.addEventListener(`register-${s}`,this._registerChoiceElement),this.addEventListener(`unregister-${s}`,this._unregisterChoiceElement),this.addEventListener(`activate-${s}`,this._choiceElementSelectedHandler)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`register-${s}`,this._registerChoiceElement),this.removeEventListener(`unregister-${s}`,this._unregisterChoiceElement),this.removeEventListener(`activate-${s}`,this._choiceElementSelectedHandler)}validate(){let i=this._choiceElements.filter(p=>this._getChoiceChecked(p)),o=i.length,a=!0,l="";return this.maxChoices!==0&&o>this.maxChoices?(a=!1,l=this.dataset.maxSelectionsMessage||`You can select at most ${this.maxChoices} choices.`):o<this.minChoices&&(a=!1,l=this.dataset.minSelectionsMessage||`You must select at least ${this.minChoices} choices.`),i.length>0&&this._internals.setValidity(a?{}:{customError:!0},l,i[o-1]||this._choiceElements[0]||this),this.reportValidity(),a}reportValidity(){return this._validationMessageElement&&(this._internals.validity.valid?(this._validationMessageElement.textContent="",this._validationMessageElement.style.display="none"):(this._validationMessageElement.textContent=this._internals.validationMessage,this._validationMessageElement.style.display="block")),this._internals.validity.valid}_registerChoiceElement(i){i.stopPropagation();let o=i.target;o.disabled=this.disabled,this._choiceElements.push(o),this._setInputType(o)}_unregisterChoiceElement(i){i.stopPropagation();let o=i.target;this._choiceElements=this._choiceElements.filter(a=>a!==o)}_determineInputType(){this._choiceElements.forEach(i=>{this._setInputType(i)})}_setInputType(i){i.internals.role=this.maxChoices===1?"radio":"checkbox",i.internals.states.add(i.internals.role)}_choiceElementSelectedHandler(i){this._toggleChoiceChecked(i.target),this.maxChoices===1&&this._choiceElements.forEach(o=>{o.identifier!==i.detail.identifier&&this._setChoiceChecked(o,!1)}),this._handleChoiceSelection()}_setChoiceChecked(i,o){var a;(a=i.internals)!=null&&a.states&&(o?(i.internals.states.add("--checked"),i.internals.ariaChecked="true"):(i.internals.states.delete("--checked"),i.internals.ariaChecked="false"))}_getChoiceChecked(i){return i.internals.states.has("--checked")}_toggleChoiceChecked(i){let o=this._getChoiceChecked(i);this._setChoiceChecked(i,!o)}_handleChoiceSelection(){let o=this._choiceElements.filter(a=>this._getChoiceChecked(a)).map(a=>a.identifier);this.value=this.maxChoices===1?o[0]||"":o,this.validate(),this.saveResponse(this._value)}_updateChoiceSelection(){let i=Array.isArray(this._value)?this._value:[this._value];this._choiceElements.forEach(o=>{let a=i.includes(o.identifier);this._setChoiceChecked(o,a)})}}return n([qi("#validationMessage")],e.prototype,"_validationMessageElement",2),n([It({type:Number,attribute:"min-choices"})],e.prototype,"minChoices",2),n([It({type:Number,attribute:"max-choices"})],e.prototype,"maxChoices",2),n([x("maxChoices",{waitUntilFirstUpdate:!0})],e.prototype,"_handleMaxChoicesChange",1),n([x("disabled",{waitUntilFirstUpdate:!0})],e.prototype,"_handleDisabledChange",2),n([x("readonly",{waitUntilFirstUpdate:!0})],e.prototype,"_handleReadonlyChange",2),e};var Pe=class extends U(u,"qti-hottext"){constructor(){super(...arguments);this.render=()=>wi`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("qti-hottext-interaction","")}};Pe=n([Ti("qti-hottext-interaction")],Pe);import{css as Si,html as Pt}from"lit";import{customElement as ki,property as Mi,state as Ot}from"lit/decorators.js";import{unsafeHTML as Ut}from"lit/directives/unsafe-html.js";var F=class extends u{constructor(){super(...arguments);this.options=[];this.correctOption="";this.dataPrompt="select"}static get styles(){return[Si`
|
|
170
170
|
:host {
|
|
171
171
|
display: inline-block;
|
|
172
172
|
}
|
|
@@ -196,7 +196,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
196
196
|
</select>
|
|
197
197
|
|
|
198
198
|
${Ut(this.correctOption)}
|
|
199
|
-
`}connectedCallback(){super.connectedCallback(),this.addEventListener("on-dropdown-selected",this.choiceSelected);let e=Array.from(this.querySelectorAll("qti-inline-choice"));this.options=[{textContent:this.dataPrompt,value:"",selected:!1},...e.map(t=>({textContent:t.innerHTML,value:t.getAttribute("identifier"),selected:!1}))]}disconnectedCallback(){this.removeEventListener("on-dropdown-selected",this.choiceSelected)}validate(){let e=this.options.find(t=>t.selected);return e?e.value!=="":!1}reset(){this.options=this.options.map((e,t)=>
|
|
199
|
+
`}connectedCallback(){super.connectedCallback(),this.addEventListener("on-dropdown-selected",this.choiceSelected);let e=Array.from(this.querySelectorAll("qti-inline-choice"));this.options=[{textContent:this.dataPrompt,value:"",selected:!1},...e.map(t=>({textContent:t.innerHTML,value:t.getAttribute("identifier"),selected:!1}))]}disconnectedCallback(){this.removeEventListener("on-dropdown-selected",this.choiceSelected)}validate(){let e=this.options.find(t=>t.selected);return e?e.value!=="":!1}reset(){this.options=this.options.map((e,t)=>q(b({},e),{selected:t===0}))}set value(e){this.options=this.options.map(t=>(e===t.value&&(t.selected=!0),t))}get value(){return this.options.find(e=>e.selected).value}set correctResponse(e){if(e===""){this.correctOption="";return}this.correctOption=`<span part="correct-option">${this.options.find(t=>e===t.value).textContent}</span>`}choiceSelected(e){let t=e.target.value;this.options=this.options.map(r=>q(b({},r),{selected:r.value===t})),this.saveResponse(t)}};F.inputWidthClass=["","qti-input-width-2","qti-input-width-1","qti-input-width-3","qti-input-width-4","qti-input-width-6","qti-input-width-10","qti-input-width-15","qti-input-width-20","qti-input-width-72"],n([Ot()],F.prototype,"options",2),n([Ot()],F.prototype,"correctOption",2),n([Mi({attribute:"data-prompt",type:String})],F.prototype,"dataPrompt",2),F=n([ki("qti-inline-choice-interaction")],F);import{html as Di}from"lit";import{customElement as Vi,property as Hi}from"lit/decorators.js";import{property as _i}from"lit/decorators.js";var Oe=(c,s)=>{class e extends c{constructor(){super(...arguments);this._shuffle=!1}set shuffle(i){let o=this._shuffle;this._shuffle=i,i?this._shuffleChoices():this._resetShuffleChoices(),this.requestUpdate("shuffle",o)}get shuffle(){return this._shuffle}connectedCallback(){super.connectedCallback(),this.shuffle?this._shuffleChoices():this._resetShuffleChoices()}_shuffleChoices(){let i=Array.from(this.querySelectorAll(s)),o=[],a=[];if(i.forEach((f,y)=>{f.hasAttribute("fixed")?o.push({element:f,index:y}):a.push(f)}),a.length<=1){console.warn("Shuffling is not possible with fewer than 2 non-fixed elements.");return}let l=!1,p=10,d=0,m=[...a];for(;!l&&d<p;){d++;for(let f=a.length-1;f>0;f--){let y=Math.floor(Math.random()*(f+1));[a[f],a[y]]=[a[y],a[f]]}if(l=!a.every((f,y)=>f===m[y]),l)break}l||console.warn("Failed to shuffle the choices after multiple attempts.");let g=1;i.forEach((f,y)=>{f.hasAttribute("fixed")?f.style.setProperty("order",String(g++)):a.shift().style.setProperty("order",String(g++))})}_resetShuffleChoices(){Array.from(this.querySelectorAll("qti-simple-choice")).forEach((o,a)=>{o.style.setProperty("order","initial")})}}return n([_i({type:String,reflect:!0,converter:Ri})],e.prototype,"shuffle",1),e},Ri={fromAttribute(c){return c==="true"},toAttribute(c){return c?"true":"false"}};import{property as Li}from"lit/decorators.js";var Ft=(c,s)=>{class e extends c{constructor(){super(...arguments);this._classes=[];this._allLabels=["qti-labels-decimal","qti-labels-lower-alpha","qti-labels-upper-alpha"];this._allLabelSuffixes=["qti-labels-suffix-period","qti-labels-suffix-parenthesis"]}set class(i){i&&(this._classes=i.split(" "),this._addLabels())}get class(){var i;return((i=this._classes)==null?void 0:i.join(" "))||""}updated(i){super.updated(i),i.has("shuffle")&&this._addLabels()}_addLabels(){let i=this._classes.some(a=>this._allLabels.includes(a)||this._allLabelSuffixes.includes(a)),o=a=>!isNaN(+a);if(i){let l=Array.from(this.querySelectorAll("qti-simple-choice")).map(p=>p).map((p,d)=>({el:p,order:o(p.style.order)?+p.style.order:d+1})).sort((p,d)=>p.order-d.order).map(p=>p.el);for(let p=0;p<l.length;p++)l[p].marker=this._getLabel(p+1)}}_getLabel(i){let o=this._classes.filter(p=>this._allLabels.includes(p)).pop(),a=this._classes.filter(p=>this._allLabelSuffixes.includes(p)).pop();!o&&a&&(o="qti-labels-upper-alpha");let l="";switch(o){case"qti-labels-decimal":l=`${i}`;break;case"qti-labels-lower-alpha":l=`${String.fromCharCode(97+i-1)}`;break;case"qti-labels-upper-alpha":l=`${String.fromCharCode(65+i-1)}`;break}return a==="qti-labels-suffix-period"?l+=".":a==="qti-labels-suffix-parenthesis"&&(l+=")"),l}}return n([Li({type:String,reflect:!0})],e.prototype,"class",1),e};import{css as Ai}from"lit";var Bt=Ai`
|
|
200
200
|
[part='slot'] {
|
|
201
201
|
display: flex;
|
|
202
202
|
flex-direction: column;
|
|
@@ -234,14 +234,14 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
234
234
|
:host([orientation='horizontal']) [part='slot'] {
|
|
235
235
|
flex-direction: row;
|
|
236
236
|
}
|
|
237
|
-
`;var Z=class extends Ft(Oe(U(u,"qti-simple-choice"),"qti-simple-choice"),"qti-simple-choice"){render(){return
|
|
237
|
+
`;var Z=class extends Ft(Oe(U(u,"qti-simple-choice"),"qti-simple-choice"),"qti-simple-choice"){render(){return Di`
|
|
238
238
|
<slot name="prompt"></slot><slot part="slot"></slot>
|
|
239
239
|
<div role="alert" id="validationMessage"></div>
|
|
240
|
-
`}};Z.styles=Bt,
|
|
240
|
+
`}};Z.styles=Bt,n([Hi({type:String})],Z.prototype,"orientation",2),Z=n([Vi("qti-choice-interaction")],Z);import{css as Ni,html as $i,LitElement as Ii}from"lit";import{customElement as Pi}from"lit/decorators.js";var me=class extends Ii{render(){return $i`<slot></slot>`}process(){let s=new et,e=[...this.children];s.process(e)}};me.styles=[Ni`
|
|
241
241
|
:host {
|
|
242
242
|
display: none;
|
|
243
243
|
}
|
|
244
|
-
`],me=
|
|
244
|
+
`],me=n([Pi("qti-outcome-processing")],me);var et=class{process(s){for(let e of s)e.process()}};import{css as Oi,html as Ui,LitElement as Fi}from"lit";import{customElement as Bi}from"lit/decorators.js";var Xt=`<qti-response-processing>
|
|
245
245
|
<qti-response-condition>
|
|
246
246
|
<qti-response-if>
|
|
247
247
|
<qti-match>
|
|
@@ -290,19 +290,19 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
290
290
|
</qti-set-outcome-value>
|
|
291
291
|
</qti-response-else>
|
|
292
292
|
</qti-response-condition>
|
|
293
|
-
</qti-response-processing>`;var z=class extends
|
|
293
|
+
</qti-response-processing>`;var z=class extends Fi{render(){return Ui`<slot></slot>`}process(){let s=[...this.children];for(let e of s)e.process()}firstUpdated(s){if(this.getAttribute("template")){let e=this.getAttribute("template").split("/"),t=e[e.length-1].replace(".xml","");switch(this.innerHTML="",t){case"map_response":{this.appendChild(this.fragmentFromString(Yt).firstElementChild.firstElementChild);break}case"map_response_point":{this.appendChild(this.fragmentFromString(jt).firstElementChild.firstElementChild);break}case"match_correct":this.appendChild(this.fragmentFromString(Xt).firstElementChild.firstElementChild);break}}}fragmentFromString(s){return document.createRange().createContextualFragment(s)}};z.styles=[Oi`
|
|
294
294
|
:host {
|
|
295
295
|
display: none;
|
|
296
296
|
}
|
|
297
|
-
`],z=
|
|
298
|
-
<slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}
|
|
297
|
+
`],z=n([Bi("qti-response-processing")],z);import{property as zi}from"lit/decorators.js";import{customElement as Xi}from"lit/decorators.js";import{html as Yi,LitElement as ji}from"lit";var D=class extends ji{render(){return Yi`<slot></slot>`}process(){throw new Error("Not implemented")}};D=n([Xi("qti-rule")],D);var Ue=class extends D{get childExpression(){return this.firstElementChild}process(){let s=this.getAttribute("identifier"),e=this.closest("qti-assessment-item").getVariable(s),t;return e.interpolationTable&&(t=e.interpolationTable.get(parseInt(this.childExpression.calculate()))),t==null?(console.warn("lookupOutcomeValue: value is null or undefined"),0):(this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:this.identifier,value:ae(t)}})),t)}};n([zi({type:String})],Ue.prototype,"identifier",2);customElements.define("qti-lookup-outcome-value",Ue);import{html as Ki}from"lit";var tt=class extends D{render(){return Ki`<slot></slot>`}process(){let s=[...this.children];for(let e=0;e<s.length;e++){let t=s[e];if(t.calculate()){t.process();return}}}};customElements.define("qti-response-condition",tt);var rt=class extends D{process(){let s=this.getAttribute("identifier"),e=this.firstElementChild,r=new it(e).process();this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:s,value:Array.isArray(r)?r.map(i=>ae(i)):ae(r)}}))}},it=class{constructor(s){this.expression=s}process(){let s=this.expression?this.expression.calculate():null;if(s==null){console.warn("setOutcomeValue: value is null or undefined");return}return s}};customElements.define("qti-set-outcome-value",rt);import{LitElement as Wi,html as Zi}from"lit";var he=class extends Wi{render(){return Zi`<slot></slot>`}calculate(){return!0}getSubRules(){return[...this.children]}process(){let s=this.getSubRules();for(let e=0;e<s.length;e++)s[e].process()}};customElements.define("qti-response-else",he);import{html as Ji}from"lit";var fe=class extends he{calculate(){return this.firstElementChild.calculate()}getSubRules(){let s=[];for(let e=1;e<this.children.length;e++)s.push(this.children[e]);return s}};customElements.define("qti-response-if",fe);var st=class extends fe{render(){return Ji`${super.render()}`}};customElements.define("qti-response-else-if",st);import{consume as Gi}from"@lit/context";import{css as Qi,html as es,LitElement as ts}from"lit";import{state as zt}from"lit/decorators.js";var h=class extends ts{constructor(){super(...arguments);this.getVariables=()=>Array.from(this.children).map(e=>{switch(e.tagName.toLowerCase()){case"qti-base-value":return{baseType:e.getAttribute("base-type"),value:e.textContent.trim(),cardinality:"single"};case"qti-variable":{let t=e.getAttribute("identifier")||"";return this.context.variables.find(i=>i.identifier===t)||null}case"qti-multiple":{let r=e.getResult();return r.length>0?{identifier:"",baseType:r[0].baseType,value:r.map(i=>i.value),cardinality:"multiple",type:"response"}:null}case"qti-correct":{let t=e.getAttribute("identifier")||"",r=this.context.variables.find(i=>i.identifier===t)||null;return{baseType:r.baseType,value:r.correctResponse,cardinality:r.cardinality}}default:{try{return{baseType:"integer",value:e.getResult().toString(),cardinality:"single"}}catch(t){console.warn("default not sufficient")}return null}}}).filter(e=>e!==null)}render(){return es`<pre>${JSON.stringify(this.result,null,2)}</pre>
|
|
298
|
+
<slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};h.styles=Qi`
|
|
299
299
|
slot {
|
|
300
300
|
display: none;
|
|
301
301
|
}
|
|
302
|
-
`,a([Gi()],h.prototype,"result",2);var S=class extends h{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Fe=class extends Qi(S){calculate(){return this.calculateChildren(Array.from(this.children))}};function Qi(c){return class extends c{calculateChildren(e){return e.map(r=>{let s=r;if(!s.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let o=s.calculate(),n=!1;if(typeof o=="string")if(o==="true")n=!0;else if(o==="false")n=!1;else return console.error("unexpected val in qti-or, expected boolean"),null;else typeof o=="boolean"&&(n=o);return n}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Fe);import{property as es}from"lit/decorators.js";var Be=class extends h{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent.trim()}};a([es({type:String,attribute:"base-type"})],Be.prototype,"baseType",2);customElements.define("qti-base-value",Be);var ot=class extends S{getResult(){let i=this.getVariables();if(this.children.length===2){let e=i[0],t=i[1];if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="multiple"){let r=e.value,s=t.value;return r.filter(l=>s.includes(l)).length>0}else if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="single"){let r=e.value;return t.value.includes(r)}else console.error("unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported")}else console.error("unexpected number of children in qti contains");return!1}};customElements.define("qti-contains",ot);var nt=class extends h{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let i=this.getAttribute("identifier")||"",e=this.closest("qti-assessment-item").getResponse(i);return e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",nt);import{property as ts}from"lit/decorators.js";var Xe=class extends h{constructor(){super(...arguments);this.roundingMode="significantFigures"}get figures(){if(!this.getAttribute("figures"))return console.error("figures attribute is missing"),null;let t=parseInt(this.getAttribute("figures")||"0");return isNaN(t)?(console.error("figures attribute is not a number"),null):t<0?(console.error("figures attribute is negative"),null):t<1&&this.roundingMode==="significantFigures"?(console.error("figures cannot be smaller than 1 for RoundingMode significantFigures"),null):t}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(this.roundingMode===null)return null;if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti equal"),!1;switch(e[0].baseType){case"integer":case"float":{let s=parseFloat(t.value),o=parseFloat(r.value);if(!isNaN(s)&&!isNaN(o))return this.roundingMode==="significantFigures"?s.toPrecision(this.figures)===o.toPrecision(this.figures):Math.round(s*Math.pow(10,this.figures))/Math.pow(10,this.figures)===Math.round(o*Math.pow(10,this.figures))/Math.pow(10,this.figures);console.error(`value cannot be casted to numeric value in equalRounded operator: ${s}, ${o}`);break}default:{console.error("values other than float and int cannot be used in equalRounded operator.");break}}return!1}return console.error("unexpected number of children in qti-equal-rounded"),null}};a([ts({type:String})],Xe.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Xe);import{property as rs}from"lit/decorators.js";var k=class{static compareSingleValues(i,e,t){switch(t){case"identifier":case"string":return i===e;case"integer":{let r=parseInt(i,10),s=parseInt(e,10);if(!isNaN(r)&&!isNaN(s))return r===s;console.error(`Cannot convert ${i} and/or ${e} to int.`);break}case"float":{let r=parseFloat(i),s=parseFloat(e);if(!isNaN(r)&&!isNaN(s))return r===s;console.error(`couldn't convert ${i} and/or ${e} to float.`);break}case"pair":case"directedPair":{let r=i.split(" ").sort(),s=e.split(" ").sort();if(r.length===2&&s.length===2)return t==="pair"&&(r.sort(),s.sort()),r.join(" ")===s.join(" ");console.error(`compared two pair but one of the values does not have 2 values: 1: ${i} 2: ${e}`);break}}return!1}};var Ye=class extends h{constructor(){super(...arguments);this.toleranceMode="exact"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];return this.toleranceMode!=="exact"?(console.error("toleranceMode is not supported yet"),!1):t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value)?(console.error("unexpected cardinality in qti equal"),!1):k.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};a([rs({type:String})],Ye.prototype,"toleranceMode",2);customElements.define("qti-equal",Ye);var at=class extends h{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value>+t.value;console.error("unexpected baseType or cardinality in qti gt")}return console.error("unexpected number of children in qt"),null}};customElements.define("qti-gt",at);var lt=class extends S{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value>=+t.value:(console.error("unexpected baseType or cardinality in qti gte"),null)}return console.log("unexpected number of children in qte"),null}};customElements.define("qti-gte",lt);var ct=class extends h{getResult(){if(this.children.length===1){let i=this.getVariables();if(!i)return!0;let e=i[0].value;return e==null||e==null||e===""}return console.error("unexpected number of children in qti Null"),null}};customElements.define("qti-is-null",ct);var pt=class extends h{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value<+t.value;console.error("unexpected baseType or cardinality in qti lt")}return console.error("unexpected number of children in lt"),null}};customElements.define("qti-lt",pt);var dt=class extends S{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value<=+t.value:(console.error("unexpected baseType or cardinality in qti lte"),null)}return console.log("unexpected number of children in lte"),null}};customElements.define("qti-lte",dt);import{property as is}from"lit/decorators.js";var je=class extends h{getResult(){let i=this.assessmentItem.getResponse(this.identifier);if(!i)return console.warn(`Response ${this.identifier} can not be found`),null;let e=i.mapping,t=Array.isArray(i.value)?i.value:[i.value],r=0;for(let s of t){let o=e.mapEntries.find(n=>k.compareSingleValues(n.mapKey,s,i.baseType));o==null||o.mappedValue==null?r+=e.defaultValue:r+=o.mappedValue}return e.lowerBound!=null&&(r=Math.max(e.lowerBound,r)),e.upperBound!=null&&(r=Math.min(e.upperBound,r)),r}};a([is({type:String})],je.prototype,"identifier",2);customElements.define("qti-map-response",je);import{property as ut}from"lit/decorators.js";import{LitElement as ss}from"lit";var J=class extends ss{constructor(){super(...arguments);this.defaultValue=0}get mapEntries(){return Array.from(this.querySelectorAll("qti-map-entry")).map(e=>({mapKey:e.getAttribute("map-key"),mappedValue:+e.getAttribute("mapped-value")}))}};a([ut({attribute:"default-value",type:Number})],J.prototype,"defaultValue",2),a([ut({attribute:"lower-bound",type:Number})],J.prototype,"lowerBound",2),a([ut({attribute:"upper-bound",type:Number})],J.prototype,"upperBound",2);customElements.define("qti-mapping",J);var mt=class c extends h{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return c.match(e,t)}return console.error("unexpected number of children in match"),null}static match(i,e){var t;switch(e.cardinality){case"single":return i.value===null?!1:Array.isArray(i.value)||Array.isArray(e.value)?(console.error("unexpected cardinality in qti match"),!1):k.compareSingleValues((t=i.value)==null?void 0:t.toString(),e.value.toString(),e.baseType);case"ordered":{if(!Array.isArray(i.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(i.value.length!==e.value.length)return!1;for(let r=0;r<i.value.length;r++)if(!k.compareSingleValues(e.value[r],i.value[r],e.baseType))return!1;return!0}case"multiple":{if(!Array.isArray(i.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(i.value.length!==e.value.length)return!1;let r=0;for(let s of e.value){let o=null,n=[...i.value];for(let l of n)if(k.compareSingleValues(s,l,e.baseType)){o=l;break}if(o!==null)n.splice(n.indexOf(o),1);else return!1;r++}return!0}default:return console.error("unexpected cardinality in qti match"),!1}}};customElements.define("qti-match",mt);var ht=class extends h{getResult(){let i=this.getVariables();this.children.length!==2&&console.warn("The member operator takes two sub-expressions");let[e,t]=i;if(e.baseType!==t.baseType&&console.warn("Which must both have the same base-type"),t.cardinality==="multiple"||t.cardinality==="ordered"||console.warn("and the second must be a multiple or ordered container"),(e.baseType==="float"||t.baseType==="float")&&console.warn("The member operator should not be used on sub-expressions with a base-type of float"),(e.baseType==="duration"||t.baseType==="duration")&&console.warn("It must not be used on sub-expressions with a base-type of duration"),e.value===null||t.value===null)return null;let r=e.value;return t.value.includes(r)}};customElements.define("qti-member",ht);var ft=class extends h{getResult(){let i=this.getVariables();if(i.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of i)if(e.cardinality!=="multiple"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti multiple"),[];return i}};customElements.define("qti-multiple",ft);import{html as os}from"lit";var gt=class extends h{render(){return os`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",gt);var bt=class extends S{getResult(){return Array.from(this.children).map(e=>{let t=e;if(!t.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let r=t.calculate(),s=!1;if(typeof r=="string")if(r==="true")s=!0;else if(r==="false")s=!1;else return console.error("unexpected val in qti-or, expected boolean"),null;else typeof r=="boolean"&&(s=r);return s}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",bt);var vt=class extends h{getResult(){let i=this.getVariables();if(i.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of i)if(e.cardinality!=="ordered"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti ordered"),[];return i}};customElements.define("qti-ordered",vt);import{consume as ns}from"@lit/context";import{LitElement as as,html as ls}from"lit";import{property as cs,state as ps}from"lit/decorators.js";var ge=class extends as{render(){var e,t;let i=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return ls`${JSON.stringify(i,null,2)}`}calculate(){let i=this.closest("qti-assessment-item"),e=this.identifier;return i.getVariable(e).value}};a([cs({type:String})],ge.prototype,"identifier",2),a([ns({context:M,subscribe:!0}),ps()],ge.prototype,"itemContext",2);customElements.define("qti-printed-variable",ge);var yt=class extends h{getResult(){return this.getVariables().reduce((t,r)=>{if(r.baseType=="float"||r.baseType=="integer")try{return t*parseInt(r.value.toString())}catch(s){console.warn("can not convert to number")}else console.warn(`has another baseType ${r.baseType}`);return t},1)}};customElements.define("qti-product",yt);import{property as ds}from"lit/decorators.js";var ze=class extends h{constructor(){super(...arguments);this.caseSensitive="true"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti string-match"),!1;let s=this.caseSensitive==="true"?t.value:t.value.toLowerCase(),o=this.caseSensitive==="true"?r.value:r.value.toLowerCase();return k.compareSingleValues(s,o,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};a([ds({type:String,attribute:"case-sensitive"})],ze.prototype,"caseSensitive",2);customElements.define("qti-string-match",ze);var xt=class extends h{constructor(){super(),this._expression=new Et(Array.from(this.children))}getResult(){return this._expression.calculate()}},Et=class{constructor(i){this.expressions=i}calculate(){return this.expressions.map(e=>{if(!e.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let t=e.calculate();return Number.isNaN(t)?(console.error("unexpected value in qti-sum, expected number"),null):Number(t)}).reduce((e,t)=>e+t,0)}};customElements.define("qti-sum",xt);var Ct=class extends h{getResult(){let i=this.getAttribute("identifier");return this.closest("qti-assessment-item").getVariable(i).value}};customElements.define("qti-variable",Ct);import{html as zt}from"lit";import{customElement as us,property as qt,state as ms}from"lit/decorators.js";var B=class extends u{constructor(){super(...arguments);this._errorMessage=null;this.loadConfig=async(e,t)=>{e=this.removeDoubleSlashes(e);try{let r=await fetch(e);if(r.ok){let o=await r.json();for(let n in o.paths)t&&(o.paths[n]=this.getResolvablePath(o.paths[n],t));return o}}catch(r){}return null};this.getResolvablePathString=(e,t)=>(e=e.replace(/\.js$/,""),e!=null&&e.toLocaleLowerCase().startsWith("http")||!t?e:this.removeDoubleSlashes(`${t}/${e}`));this.getResolvablePath=(e,t)=>Array.isArray(e)?e.map(r=>this.getResolvablePathString(r,t)):this.getResolvablePathString(e,t)}convertQtiVariableJSON(e){for(let t in e)if(e.hasOwnProperty(t)){let r=e[t];if(r){for(let s in r)if(r.hasOwnProperty(s)){let o=r[s];if(Array.isArray(o))return o.map(String);if(o!=null)return String(o)}}}return null}startChecking(){this.intervalId=setInterval(()=>{let e=this.pci.getResponse(),t=this.pci.getResponse(),r=JSON.stringify(e);if(r!==this.rawResponse){this.rawResponse=r;let s=this.convertQtiVariableJSON(t);this.value=s,this.saveResponse(s)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set value(e){}get value(){return this.rawResponse}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},s=n=>{let l={},p=n.getAttribute("key");if(p){let d=Array.from(n.children),m=d.map(f=>f.getAttribute("key"));m.length>0&&!m.find(f=>!Number.isInteger(+f))?l[p]=d.map(f=>o(f)):l[p]=n.textContent}return l},o=n=>{if(n){let l={};for(let p of n.children)l=b(b({},l),s(p));return l}};for(let n of t)return n.getAttribute("key")||(r=b(b({},r),o(n))),r;return console.log("Can not find qti-custom-interaction config"),null}register(e){this.pci=e;let t=this.parentElement.tagName==="QTI-CUSTOM-INTERACTION"?"TAO":"IMS",r=t=="IMS"?this.querySelector("qti-interaction-markup"):this.querySelector("markup");r.classList.add("qti-customInteraction"),t=="TAO"&&this.querySelector("properties")&&(this.querySelector("properties").style.display="none");let s=t=="IMS"?{properties:this.dataset,onready:()=>{console.log("onready")}}:this.getTAOConfig(this);t=="IMS"?e.getInstance(r,s,void 0):e.initialize(this.customInteractionTypeIdentifier,r.firstElementChild,s),t=="TAO"&&Array.from(this.querySelectorAll("link")).map(n=>n.getAttribute("href")).forEach(n=>{let l=document.createElement("link");l.rel="stylesheet",l.type="text/css",l.media="screen",l.href=n,r.appendChild(l)}),this.startChecking()}connectedCallback(){super.connectedCallback(),define("qtiCustomInteractionContext",()=>({register:r=>{this.register(r)},notifyReady:()=>{}}));let e=this.buildRequireConfig();requirejs.config(e)(["require"],r=>{r([this.module])})}disconnectedCallback(){super.disconnectedCallback(),requirejs.undef(this.customInteractionTypeIdentifier);let e=requirejs.s.contexts;delete e[this.customInteractionTypeIdentifier],this.stopChecking()}buildRequireConfig(){let e={context:this.customInteractionTypeIdentifier,catchError:!0,paths:window.requirePaths||{},shim:window.requireShim||{}};if(!globalThis.require)return this._errorMessage="RequireJS not found. Please load it via CDN: https://cdnjs.com/libraries/require.js",null;let t=this.getAttribute("data-base-url"),r=this.querySelector("qti-interaction-modules");if(r){let s=r.querySelectorAll("qti-interaction-module");for(let o of s){let n=o.getAttribute("id"),l=o.getAttribute("primary-path"),p=o.getAttribute("fallback-path");if(n&&l){let d=p?this.combineRequireResolvePaths(this.getResolvablePath(l,t),this.getResolvablePath(p,t)):this.getResolvablePath(l,t),m=e.paths[n]||[];e.paths[n]=this.combineRequireResolvePaths(m,d)}}}return e}combineRequireResolvePaths(e,t){let r=Array.isArray(e)?e:[e],s=Array.isArray(t)?t:[t];return r.concat(s)}removeDoubleSlashes(e){return e.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}render(){return zt`<slot></slot>${this._errorMessage&&zt`<div style="color:red">
|
|
302
|
+
`,n([zt()],h.prototype,"result",2),n([Gi({context:E,subscribe:!0}),zt()],h.prototype,"context",2);var k=class extends h{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Fe=class extends rs(k){calculate(){return this.calculateChildren(Array.from(this.children))}};function rs(c){return class extends c{calculateChildren(e){return e.map(r=>{let i=r;if(!i.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let o=i.calculate(),a=!1;if(typeof o=="string")if(o==="true")a=!0;else if(o==="false")a=!1;else return console.error("unexpected val in qti-or, expected boolean"),null;else typeof o=="boolean"&&(a=o);return a}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Fe);import{property as is}from"lit/decorators.js";var Be=class extends h{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent.trim()}};n([is({type:String,attribute:"base-type"})],Be.prototype,"baseType",2);customElements.define("qti-base-value",Be);var ot=class extends k{getResult(){let s=this.getVariables();if(this.children.length===2){let e=s[0],t=s[1];if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="multiple"){let r=e.value,i=t.value;return r.filter(l=>i.includes(l)).length>0}else if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="single"){let r=e.value;return t.value.includes(r)}else console.error("unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported")}else console.error("unexpected number of children in qti contains");return!1}};customElements.define("qti-contains",ot);var nt=class extends h{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let s=this.getAttribute("identifier")||"",e=this.context.variables.find(t=>t.identifier===s)||null;return e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",nt);import{property as ss}from"lit/decorators.js";var Xe=class extends h{constructor(){super(...arguments);this.roundingMode="significantFigures"}get figures(){if(!this.getAttribute("figures"))return console.error("figures attribute is missing"),null;let t=parseInt(this.getAttribute("figures")||"0");return isNaN(t)?(console.error("figures attribute is not a number"),null):t<0?(console.error("figures attribute is negative"),null):t<1&&this.roundingMode==="significantFigures"?(console.error("figures cannot be smaller than 1 for RoundingMode significantFigures"),null):t}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(this.roundingMode===null)return null;if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti equal"),!1;switch(e[0].baseType){case"integer":case"float":{let i=parseFloat(t.value),o=parseFloat(r.value);if(!isNaN(i)&&!isNaN(o))return this.roundingMode==="significantFigures"?i.toPrecision(this.figures)===o.toPrecision(this.figures):Math.round(i*Math.pow(10,this.figures))/Math.pow(10,this.figures)===Math.round(o*Math.pow(10,this.figures))/Math.pow(10,this.figures);console.error(`value cannot be casted to numeric value in equalRounded operator: ${i}, ${o}`);break}default:{console.error("values other than float and int cannot be used in equalRounded operator.");break}}return!1}return console.error("unexpected number of children in qti-equal-rounded"),null}};n([ss({type:String})],Xe.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Xe);import{property as os}from"lit/decorators.js";var M=class{static compareSingleValues(s,e,t){switch(t){case"identifier":case"string":return s===e;case"integer":{let r=parseInt(s,10),i=parseInt(e,10);if(!isNaN(r)&&!isNaN(i))return r===i;console.error(`Cannot convert ${s} and/or ${e} to int.`);break}case"float":{let r=parseFloat(s),i=parseFloat(e);if(!isNaN(r)&&!isNaN(i))return r===i;console.error(`couldn't convert ${s} and/or ${e} to float.`);break}case"pair":case"directedPair":{let r=s.split(" ").sort(),i=e.split(" ").sort();if(r.length===2&&i.length===2)return t==="pair"&&(r.sort(),i.sort()),r.join(" ")===i.join(" ");console.error(`compared two pair but one of the values does not have 2 values: 1: ${s} 2: ${e}`);break}}return!1}};var Ye=class extends h{constructor(){super(...arguments);this.toleranceMode="exact"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];return this.toleranceMode!=="exact"?(console.error("toleranceMode is not supported yet"),!1):t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value)?(console.error("unexpected cardinality in qti equal"),!1):M.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};n([os({type:String})],Ye.prototype,"toleranceMode",2);customElements.define("qti-equal",Ye);var at=class extends h{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value>+t.value;console.error("unexpected baseType or cardinality in qti gt")}return console.error("unexpected number of children in qt"),null}};customElements.define("qti-gt",at);var lt=class extends k{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value>=+t.value:(console.error("unexpected baseType or cardinality in qti gte"),null)}return console.log("unexpected number of children in qte"),null}};customElements.define("qti-gte",lt);var ct=class extends h{getResult(){if(this.children.length===1){let s=this.getVariables();if(!s)return!0;let e=s[0].value;return e==null||e==null||e===""}return console.error("unexpected number of children in qti Null"),null}};customElements.define("qti-is-null",ct);var pt=class extends h{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value<+t.value;console.error("unexpected baseType or cardinality in qti lt")}return console.error("unexpected number of children in lt"),null}};customElements.define("qti-lt",pt);var dt=class extends k{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value<=+t.value:(console.error("unexpected baseType or cardinality in qti lte"),null)}return console.log("unexpected number of children in lte"),null}};customElements.define("qti-lte",dt);import{property as ns}from"lit/decorators.js";var je=class extends h{getResult(){let s=this.context.variables.find(i=>i.identifier===this.identifier);if(!s)return console.warn(`Response ${this.identifier} can not be found`),null;let e=s.mapping,t=Array.isArray(s.value)?s.value:[s.value],r=0;for(let i of t){let o=e.mapEntries.find(a=>M.compareSingleValues(a.mapKey,i,s.baseType));o==null||o.mappedValue==null?r+=e.defaultValue:r+=o.mappedValue}return e.lowerBound!=null&&(r=Math.max(e.lowerBound,r)),e.upperBound!=null&&(r=Math.min(e.upperBound,r)),r}};n([ns({type:String})],je.prototype,"identifier",2);customElements.define("qti-map-response",je);import{property as ut}from"lit/decorators.js";import{LitElement as as}from"lit";var J=class extends as{constructor(){super(...arguments);this.defaultValue=0}get mapEntries(){return Array.from(this.querySelectorAll("qti-map-entry")).map(e=>({mapKey:e.getAttribute("map-key"),mappedValue:+e.getAttribute("mapped-value")}))}};n([ut({attribute:"default-value",type:Number})],J.prototype,"defaultValue",2),n([ut({attribute:"lower-bound",type:Number})],J.prototype,"lowerBound",2),n([ut({attribute:"upper-bound",type:Number})],J.prototype,"upperBound",2);customElements.define("qti-mapping",J);var mt=class c extends h{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return c.match(e,t)}return console.error("unexpected number of children in match"),null}static match(s,e){var t;switch(e.cardinality){case"single":return s.value===null?!1:Array.isArray(s.value)||Array.isArray(e.value)?(console.error("unexpected cardinality in qti match"),!1):M.compareSingleValues((t=s.value)==null?void 0:t.toString(),e.value.toString(),e.baseType);case"ordered":{if(!Array.isArray(s.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(s.value.length!==e.value.length)return!1;for(let r=0;r<s.value.length;r++)if(!M.compareSingleValues(e.value[r],s.value[r],e.baseType))return!1;return!0}case"multiple":{if(!Array.isArray(s.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(s.value.length!==e.value.length)return!1;let r=0;for(let i of e.value){let o=null,a=[...s.value];for(let l of a)if(M.compareSingleValues(i,l,e.baseType)){o=l;break}if(o!==null)a.splice(a.indexOf(o),1);else return!1;r++}return!0}default:return console.error("unexpected cardinality in qti match"),!1}}};customElements.define("qti-match",mt);var ht=class extends h{getResult(){let s=this.getVariables();this.children.length!==2&&console.warn("The member operator takes two sub-expressions");let[e,t]=s;if(e.baseType!==t.baseType&&console.warn("Which must both have the same base-type"),t.cardinality==="multiple"||t.cardinality==="ordered"||console.warn("and the second must be a multiple or ordered container"),(e.baseType==="float"||t.baseType==="float")&&console.warn("The member operator should not be used on sub-expressions with a base-type of float"),(e.baseType==="duration"||t.baseType==="duration")&&console.warn("It must not be used on sub-expressions with a base-type of duration"),e.value===null||t.value===null)return null;let r=e.value;return t.value.includes(r)}};customElements.define("qti-member",ht);var ft=class extends h{getResult(){let s=this.getVariables();if(s.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of s)if(e.cardinality!=="multiple"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti multiple"),[];return s}};customElements.define("qti-multiple",ft);import{html as ls}from"lit";var gt=class extends h{render(){return ls`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",gt);var bt=class extends k{getResult(){return Array.from(this.children).map(e=>{let t=e;if(!t.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let r=t.calculate(),i=!1;if(typeof r=="string")if(r==="true")i=!0;else if(r==="false")i=!1;else return console.error("unexpected val in qti-or, expected boolean"),null;else typeof r=="boolean"&&(i=r);return i}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",bt);var vt=class extends h{getResult(){let s=this.getVariables();if(s.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of s)if(e.cardinality!=="ordered"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti ordered"),[];return s}};customElements.define("qti-ordered",vt);import{consume as cs}from"@lit/context";import{LitElement as ps,html as ds}from"lit";import{property as us,state as ms}from"lit/decorators.js";var ge=class extends ps{render(){var e,t;let s=(t=(e=this.context)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return ds`${JSON.stringify(s,null,2)}`}calculate(){return this.context.variables.find(e=>e.identifier===this.identifier)||null}};n([us({type:String})],ge.prototype,"identifier",2),n([cs({context:E,subscribe:!0}),ms()],ge.prototype,"context",2);customElements.define("qti-printed-variable",ge);var yt=class extends h{getResult(){return this.getVariables().reduce((t,r)=>{if(r.baseType=="float"||r.baseType=="integer")try{return t*parseInt(r.value.toString())}catch(i){console.warn("can not convert to number")}else console.warn(`has another baseType ${r.baseType}`);return t},1)}};customElements.define("qti-product",yt);import{property as hs}from"lit/decorators.js";var ze=class extends h{constructor(){super(...arguments);this.caseSensitive="true"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti string-match"),!1;let i=this.caseSensitive==="true"?t.value:t.value.toLowerCase(),o=this.caseSensitive==="true"?r.value:r.value.toLowerCase();return M.compareSingleValues(i,o,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};n([hs({type:String,attribute:"case-sensitive"})],ze.prototype,"caseSensitive",2);customElements.define("qti-string-match",ze);var xt=class extends h{constructor(){super(),this._expression=new Et(Array.from(this.children))}getResult(){return this._expression.calculate()}},Et=class{constructor(s){this.expressions=s}calculate(){return this.expressions.map(e=>{if(!e.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let t=e.calculate();return Number.isNaN(t)?(console.error("unexpected value in qti-sum, expected number"),null):Number(t)}).reduce((e,t)=>e+t,0)}};customElements.define("qti-sum",xt);var Ct=class extends h{getResult(){let s=this.getAttribute("identifier");return this.context.variables.find(t=>t.identifier===s).value}};customElements.define("qti-variable",Ct);import{html as Kt}from"lit";import{customElement as fs,property as qt,state as gs}from"lit/decorators.js";var B=class extends u{constructor(){super(...arguments);this._errorMessage=null;this.loadConfig=async(e,t)=>{e=this.removeDoubleSlashes(e);try{let r=await fetch(e);if(r.ok){let o=await r.json();for(let a in o.paths)t&&(o.paths[a]=this.getResolvablePath(o.paths[a],t));return o}}catch(r){}return null};this.getResolvablePathString=(e,t)=>(e=e.replace(/\.js$/,""),e!=null&&e.toLocaleLowerCase().startsWith("http")||!t?e:this.removeDoubleSlashes(`${t}/${e}`));this.getResolvablePath=(e,t)=>Array.isArray(e)?e.map(r=>this.getResolvablePathString(r,t)):this.getResolvablePathString(e,t)}convertQtiVariableJSON(e){for(let t in e)if(e.hasOwnProperty(t)){let r=e[t];if(r){for(let i in r)if(r.hasOwnProperty(i)){let o=r[i];if(Array.isArray(o))return o.map(String);if(o!=null)return String(o)}}}return null}startChecking(){this.intervalId=setInterval(()=>{let e=this.pci.getResponse(),t=this.pci.getResponse(),r=JSON.stringify(e);if(r!==this.rawResponse){this.rawResponse=r;let i=this.convertQtiVariableJSON(t);this.value=i,this.saveResponse(i)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set value(e){}get value(){return this.rawResponse}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},i=a=>{let l={},p=a.getAttribute("key");if(p){let d=Array.from(a.children),m=d.map(f=>f.getAttribute("key"));m.length>0&&!m.find(f=>!Number.isInteger(+f))?l[p]=d.map(f=>o(f)):l[p]=a.textContent}return l},o=a=>{if(a){let l={};for(let p of a.children)l=b(b({},l),i(p));return l}};for(let a of t)return a.getAttribute("key")||(r=b(b({},r),o(a))),r;return console.log("Can not find qti-custom-interaction config"),null}register(e){this.pci=e;let t=this.parentElement.tagName==="QTI-CUSTOM-INTERACTION"?"TAO":"IMS",r=t=="IMS"?this.querySelector("qti-interaction-markup"):this.querySelector("markup");r.classList.add("qti-customInteraction"),t=="TAO"&&this.querySelector("properties")&&(this.querySelector("properties").style.display="none");let i=t=="IMS"?{properties:this.dataset,onready:()=>{console.log("onready")}}:this.getTAOConfig(this);t=="IMS"?e.getInstance(r,i,void 0):e.initialize(this.customInteractionTypeIdentifier,r.firstElementChild,i),t=="TAO"&&Array.from(this.querySelectorAll("link")).map(a=>a.getAttribute("href")).forEach(a=>{let l=document.createElement("link");l.rel="stylesheet",l.type="text/css",l.media="screen",l.href=a,r.appendChild(l)}),this.startChecking()}connectedCallback(){super.connectedCallback(),define("qtiCustomInteractionContext",()=>({register:r=>{this.register(r)},notifyReady:()=>{}}));let e=this.buildRequireConfig();requirejs.config(e)(["require"],r=>{r([this.module])})}disconnectedCallback(){super.disconnectedCallback(),requirejs.undef(this.customInteractionTypeIdentifier);let e=requirejs.s.contexts;delete e[this.customInteractionTypeIdentifier],this.stopChecking()}buildRequireConfig(){let e={context:this.customInteractionTypeIdentifier,catchError:!0,paths:window.requirePaths||{},shim:window.requireShim||{}};if(!globalThis.require)return this._errorMessage="RequireJS not found. Please load it via CDN: https://cdnjs.com/libraries/require.js",null;let t=this.getAttribute("data-base-url"),r=this.querySelector("qti-interaction-modules");if(r){let i=r.querySelectorAll("qti-interaction-module");for(let o of i){let a=o.getAttribute("id"),l=o.getAttribute("primary-path"),p=o.getAttribute("fallback-path");if(a&&l){let d=p?this.combineRequireResolvePaths(this.getResolvablePath(l,t),this.getResolvablePath(p,t)):this.getResolvablePath(l,t),m=e.paths[a]||[];e.paths[a]=this.combineRequireResolvePaths(m,d)}}}return e}combineRequireResolvePaths(e,t){let r=Array.isArray(e)?e:[e],i=Array.isArray(t)?t:[t];return r.concat(i)}removeDoubleSlashes(e){return e.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}render(){return Kt`<slot></slot>${this._errorMessage&&Kt`<div style="color:red">
|
|
303
303
|
<h1>Error</h1>
|
|
304
304
|
${this._errorMessage}
|
|
305
|
-
</div>`}`}};a([qt({type:String,attribute:"response-identifier"})],B.prototype,"responseIdentifier",2),a([qt({type:String,attribute:"module"})],B.prototype,"module",2),a([qt({type:String,attribute:"custom-interaction-type-identifier"})],B.prototype,"customInteractionTypeIdentifier",2),a([ms()],B.prototype,"_errorMessage",2),B=a([us("qti-portable-custom-interaction")],B);import{html as Gt}from"lit";import{customElement as gs,state as bs}from"lit/decorators.js";var Ke=class c{constructor(){this.touchStartTime=0;this.touchStartPoint=null;this.lastClickTime=0;this.isDraggable=!1;this.dragSource=null;this.dragClone=null;this.touchEndTriggered=!1;this.isDragging=!1;this.initialTransform="";this.hasDispatchedDragStart=!1;this.rootNode=null;this.focusedElement=null;this.focusableDropZones=[];this.currentDropZoneIndex=-1;this.dataTransfer={data:{},setData(i,e){this.data[i]=e},getData(i){return this.data[i]},effectAllowed:"move"};this.cloneOffset={x:0,y:0};this.lastTarget=null;this.currentDropTarget=null;this.allowClick=!0;this.copyStylesForDragClone=!0;this.dragOnClickEnabled=!1;this.useDragClone=!1;this.MIN_DRAG_DISTANCE=5;this.DRAG_CLONE_OPACITY=1;if(c.instance)return c.instance;c.instance=this,document.addEventListener("touchmove",this.handleTouchMove.bind(this),{passive:!1}),document.addEventListener("mousemove",this.handleTouchMove.bind(this),{passive:!1}),document.addEventListener("touchend",this.handleTouchEnd.bind(this),{passive:!1}),document.addEventListener("mouseup",this.handleTouchEnd.bind(this),{passive:!1}),document.addEventListener("touchcancel",this.handleTouchCancel.bind(this),{passive:!1}),document.addEventListener("keydown",this.handleKeyDown.bind(this)),document.addEventListener("keyup",this.handleKeyUp.bind(this))}addDraggableElements(i){i.forEach(e=>{e.setAttribute("tabindex","0"),e.addEventListener("focus",()=>this.focusedElement=e),e.addEventListener("blur",()=>this.focusedElement=null),e.addEventListener("touchstart",this.handleTouchStart.bind(this),{passive:!1}),e.addEventListener("mousedown",this.handleTouchStart.bind(this),{passive:!1})})}handleTouchStart(i){this.touchStartTime=Date.now();let{x:e,y:t}=this.getEventCoordinates(i);if(this.touchStartPoint={x:e,y:t},this.dragSource=i.currentTarget,this.isDraggable=!0,this.rootNode=this.dragSource.getRootNode(),this.dragOnClickEnabled&&(this.isDragging=!0,this.createDragClone(i,{clientX:e,clientY:t})),!this.useDragClone){let r=window.getComputedStyle(this.dragSource);this.initialTransform=r.transform==="none"?"":r.transform,this.initialTransition=r.transition||"",this.dragSource.style.transition="none";let s=this.dragSource.getBoundingClientRect();this.cloneOffset.x=e-s.left,this.cloneOffset.y=t-s.top,this.dragSource.style.zIndex="9999",this.dragSource.focus()}i.preventDefault()}handleTouchMove(i){if(this.isDraggable&&this.dragSource){let{x:e,y:t}=this.getEventCoordinates(i),r={clientX:e,clientY:t};this.calculateDragDistance(r)>=this.MIN_DRAG_DISTANCE&&(this.dragSource.style.pointerEvents="none",this.isDragging=!0),this.createDragClone(i,r),i.preventDefault()}}createDragClone(i,e){if(!this.isDragging)return;if(this.useDragClone){if(!this.dragClone){if(this.dragSource.style.opacity=this.DRAG_CLONE_OPACITY.toString(),this.dragClone=this.dragSource.cloneNode(!0),this.copyStylesForDragClone){let r=window.getComputedStyle(this.dragSource);for(let s of r)this.dragClone.style[s]=r.getPropertyValue(s)}this.rootNode instanceof ShadowRoot?this.rootNode.host.appendChild(this.dragClone):this.rootNode instanceof Document&&document.body.appendChild(this.dragClone),this.calculateClonePosition(e),this.setDragCloneStyles(e),this.dispatchCustomEvent(this.dragSource,"dragstart")}this.updateDragClonePosition(e)}else if(this.touchStartPoint){let r=e.clientX-this.touchStartPoint.x,s=e.clientY-this.touchStartPoint.y;this.dragSource.style.transform=`${this.initialTransform} translate(${r}px, ${s}px)`,this.hasDispatchedDragStart||(this.dispatchCustomEvent(this.dragSource,"dragstart"),this.hasDispatchedDragStart=!0)}let t=this.findDropTarget(i);t!==this.lastTarget&&(this.dispatchCustomEvent(t,"dragenter"),this.dispatchCustomEvent(this.lastTarget,"dragleave"),this.lastTarget=t),this.currentDropTarget=t,this.currentDropTarget&&this.dispatchCustomEvent(t,"dragover")}handleTouchEnd(i){var t;this.touchEndTriggered=!0,this.isDraggable=!1;let e=!1;if(this.currentDropTarget)this.dispatchCustomEvent(this.currentDropTarget,"drop"),this.dispatchCustomEvent(this.dragSource,"dragend"),e=!0;else if(this.isDragging){let r=new CustomEvent("dragend",{bubbles:!0,cancelable:!0});r.dataTransfer={dropEffect:"none"},(t=this.dragSource)==null||t.dispatchEvent(r)}this.resetDragState(e)}handleTouchCancel(i){this.resetDragState()}findDropTarget(i){let{x:e,y:t}=this.getEventCoordinates(i);return this.getDropTargetAtPoint(document,e,t)}getDropTargetAtPoint(i,e,t,r=0){if(r>2)return null;let o=i.elementFromPoint(e,t);if(!o)return null;if(o.hasAttribute("dropzone"))return o;let n=o.parentElement;for(;n;){if(n.hasAttribute("dropzone"))return n;n=n.parentElement}if(o.shadowRoot&&r<2){let l=this.getDropTargetAtPoint(o.shadowRoot,e,t,r+1);if(l)return l}return null}handleKeyDown(i){this.focusedElement&&(i.key===" "&&!this.isDragging?(i.preventDefault(),this.isDraggable=!0,this.dragSource=this.focusedElement,this.isDragging=!0,this.collectDropZones(),this.dispatchCustomEvent(this.dragSource,"dragstart")):i.key==="Tab"&&this.isDragging&&(i.preventDefault(),this.moveToNextDropZone()))}handleKeyUp(i){i.key===" "&&this.isDragging&&this.currentDropTarget&&(i.preventDefault(),this.dispatchCustomEvent(this.currentDropTarget,"drop"),this.dispatchCustomEvent(this.dragSource,"dragend"),this.resetDragState(!0))}collectDropZones(){this.focusableDropZones=Array.from(document.querySelectorAll("[dropzone]")),this.currentDropZoneIndex=-1}moveToNextDropZone(){if(this.focusableDropZones.length===0)return;this.currentDropZoneIndex=(this.currentDropZoneIndex+1)%this.focusableDropZones.length;let i=this.focusableDropZones[this.currentDropZoneIndex];i.focus(),this.currentDropTarget=i,this.dispatchCustomEvent(i,"dragenter")}getEventCoordinates(i,e=!1){let t=i.touches?i.touches[0]:i;return{x:e?t.pageX:t.clientX,y:e?t.pageY:t.clientY}}calculateClonePosition(i){let e=this.dragSource.getBoundingClientRect();this.cloneOffset.x=i.clientX-e.left,this.cloneOffset.y=i.clientY-e.top}setDragCloneStyles(i){this.dragClone.style.position="fixed",this.dragClone.style.top=`${i.clientY-this.cloneOffset.y}px`,this.dragClone.style.left=`${i.clientX-this.cloneOffset.x}px`,this.dragClone.style.pointerEvents="none",this.dragClone.style.zIndex="999999"}updateDragClonePosition(i){requestAnimationFrame(()=>{if(this.touchEndTriggered||!this.dragClone)return;let e=i.clientX-this.cloneOffset.x,t=i.clientY-this.cloneOffset.y,{newLeft:r,newTop:s}=this.applyBoundaries(e,t,this.dragClone);this.dragClone.style.left=`${r}px`,this.dragClone.style.top=`${s}px`})}applyTransformBoundaries(i,e){let t;this.rootNode instanceof ShadowRoot?t=this.rootNode.host.getBoundingClientRect():this.rootNode instanceof Document?t=document.documentElement.getBoundingClientRect():t=new DOMRect(0,0,window.innerWidth,window.innerHeight);let r=this.dragSource.getBoundingClientRect(),s=r.width,o=r.height,n=r.left+i,l=r.top+e,p=Math.max(t.left,Math.min(n,t.right-s)),d=Math.max(t.top,Math.min(l,t.bottom-o)),m=p-r.left,g=d-r.top;return{boundedDeltaX:m,boundedDeltaY:g}}applyBoundaries(i,e,t){let r;this.rootNode instanceof ShadowRoot?r=this.rootNode.host.getBoundingClientRect():this.rootNode instanceof Document?r=document.documentElement.getBoundingClientRect():r=new DOMRect(0,0,window.innerWidth,window.innerHeight);let s=t.getBoundingClientRect(),o=s.width,n=s.height,l=Math.max(r.left,Math.min(i,r.right-o)),p=Math.max(r.top,Math.min(e,r.bottom-n));return{newLeft:l,newTop:p}}calculateDragDistance(i){let e=Math.abs(i.clientX-this.touchStartPoint.x),t=Math.abs(i.clientY-this.touchStartPoint.y);return e+t}dispatchCustomEvent(i,e,t=!0){if(!i)return;let r=new CustomEvent(e,{bubbles:t,cancelable:!0});r.dataTransfer=this.dataTransfer,i.dispatchEvent(r)}resetDragState(i=!1){var e;this.isDragging&&(this.useDragClone?(this.dragSource.style.opacity="1.0",(e=this.dragClone)==null||e.parentElement.removeChild(this.dragClone)):(i||(this.dragSource.style.transform="translate(0, 0)"),this.dragSource.style.zIndex="",this.dragSource.style.pointerEvents="",this.dragSource.style.transition=this.initialTransition,this.initialTransition="")),this.isDragging=!1,this.dragSource=null,this.dragClone=null,this.isDraggable=!1,this.touchStartTime=0,this.touchStartPoint=null,this.touchEndTriggered=!1,this.dataTransfer={data:{},setData(t,r){this.data[t]=r},getData(t){return this.data[t]},effectAllowed:"move"},this.cloneOffset={x:0,y:0},this.lastTarget=null,this.currentDropTarget=null,this.allowClick=!0,this.initialTransform="",this.hasDispatchedDragStart=!1,this.rootNode=null}};import{property as hs}from"lit/decorators.js";var Kt=(c,i,e)=>{class t extends c{constructor(){super(...arguments);this.disabled=!1}firstUpdated(o){if(this.isMatchTabular())return;super.firstUpdated(o);let n=this.getDroppableElements();this.initializeEventHandlers(),n.forEach(l=>{this.prepareDroppable(l),this.observeDroppableAttributes(l)})}isMatchTabular(){return this.classList.contains("qti-match-tabular")}getDroppableElements(){return Array.from(i?this.shadowRoot.querySelectorAll(e):this.querySelectorAll(e))}initializeEventHandlers(){this.dragoverHandler=this.dragoverHandler.bind(this),this.dragleaveHandler=this.dragleaveHandler.bind(this),this.dragenterHandler=this.dragenterHandler.bind(this),this.dropHandler=this.dropHandler.bind(this)}prepareDroppable(o){o.setAttribute("dropzone","move"),o.addEventListener("dragleave",this.dragleaveHandler),this.attachEventListeners(o)}observeDroppableAttributes(o){this.observer=new MutationObserver(n=>{n.forEach(({attributeName:l})=>{l==="disabled"&&this.toggleDroppableHandlers(o)})}),this.observer.observe(o,{attributes:!0})}toggleDroppableHandlers(o){o.hasAttribute("disabled")?this.removeEventListeners(o):this.attachEventListeners(o)}attachEventListeners(o){o.addEventListener("dragover",this.dragoverHandler),o.addEventListener("dragenter",this.dragenterHandler),o.addEventListener("drop",this.dropHandler)}removeEventListeners(o){o.removeEventListener("dragover",this.dragoverHandler),o.removeEventListener("dragenter",this.dragenterHandler),o.removeEventListener("drop",this.dropHandler)}disconnectedCallback(){var o;this.isMatchTabular()||(super.disconnectedCallback(),(o=this.observer)==null||o.disconnect())}dragenterHandler(o){o.preventDefault()}dragoverHandler(o){return o.preventDefault(),this.activateDroppable(o.currentTarget),o.dataTransfer.dropEffect="move",!1}activateDroppable(o){o.setAttribute("active","")}async dropHandler(o){o.preventDefault();let n=o.currentTarget,l=o.dataTransfer.getData("text"),p=this.findDraggable(l);return p?p&&!this.isValidDrop(n,p)?(p.style.transform="translate(0, 0)",!1):(await this.moveDraggableToDroppable(p,n),this.deactivateDroppable(n),!1):!1}findDraggable(o){return o?this.querySelector(`[identifier=${o}]`)||this.shadowRoot.querySelector(`[identifier=${o}]`):null}isValidDrop(o,n){return n.parentElement.getAttribute("identifier")!==o.getAttribute("identifier")}async moveDraggableToDroppable(o,n){let l=()=>{o.style.transform="translate(0, 0)",n.appendChild(o),this.checkMaxAssociations(),this.saveResponse(null)};if(!document.startViewTransition){l();return}await document.startViewTransition(l).finished}deactivateDroppable(o){o.removeAttribute("active")}dragleaveHandler(o){return o.preventDefault(),this.deactivateDroppable(o.currentTarget),o.dataTransfer.dropEffect="none",!1}}return a([hs({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var Wt=(c,i,e)=>{class t extends c{}return t};import{property as wt}from"lit/decorators.js";function Zt(c,i){let e,t=b({},i);return(r,s)=>{let{connectedCallback:o,disconnectedCallback:n}=r;r.connectedCallback=function(){var d;o.call(this);let l=m=>{let g=Array.from(this.querySelectorAll(c));for(let f of m){let y=Array.from(f.addedNodes).map($=>$),v=Array.from(f.addedNodes).map($=>$);f.type==="childList"&&y.find($=>g.includes($))&&this[s](y,v)}};e=new MutationObserver(l),e.observe(this,{childList:!0,subtree:!0});let p=(d=this.querySelectorAll(c))!=null?d:[];this[s](Array.from(p),[])},r.disconnectedCallback=function(){n.call(this),e.disconnect()}}}var V=(c,i,e,t)=>{class r extends Wt(Kt(c,e,t),t,i){constructor(){super(...arguments);this.draggables=new Map;this.droppables=[];this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.minAssociations=1;this.maxAssociations=1;this.handleDragStart=n=>{let l=n.currentTarget;n.dataTransfer.setData("text",l.getAttribute("identifier")),l.setAttribute("dragging",""),this.activateDroppables()};this.handleDragEnd=async n=>{n.preventDefault(),this.deactivateDroppables();let l=n.currentTarget;l.removeAttribute("dragging"),await this.wasDropped(n)||this.configuration.dragCanBePlacedBack&&this.restoreInitialDraggablePosition(l)};this.checkForMoveTestItem=n=>n.dataTransfer.items?new Promise(l=>{let p=!1,d=Array.from(n.dataTransfer.items),m=d.length;if(m===0){l(!1);return}d.forEach(g=>{g.kind==="string"&&g.type==="text"?g.getAsString(f=>{f==="move-test"&&(p=!0),m===0&&l(p)}):m===0&&l(p)})}):Promise.resolve(!1)}handleDraggablesChange(n,l){if(this.isMatchTabular())return;let p=this.filterExistingDraggables(n);p.length>0&&this.addNewDraggables(p)}firstUpdated(n){super.firstUpdated(n),this.initializeDroppables()}connectedCallback(){super.connectedCallback(),this.initializeDragDropApi()}initializeDragDropApi(){this.dragDropApi=new Ke,this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0,detail:this}))}isMatchTabular(){return this.classList.contains("qti-match-tabular")}filterExistingDraggables(n){return n.filter(l=>!this.draggables.has(l))}addNewDraggables(n){this.dragDropApi.addDraggableElements(n),n.forEach(l=>this.storeDraggable(l))}storeDraggable(n){let l=Array.from(n.parentNode.children).indexOf(n);this.draggables.set(n,{parent:n.parentElement,index:l}),n.style.viewTransitionName=`drag-${l}-${this.getAttribute("identifier")||crypto.randomUUID()}`,n.setAttribute("qti-draggable","true"),n.addEventListener("dragstart",this.handleDragStart),n.addEventListener("dragend",this.handleDragEnd)}initializeDroppables(){this.droppables=Array.from(e?this.shadowRoot.querySelectorAll(t):this.querySelectorAll(t))}activateDroppables(){this.droppables.forEach(n=>n.setAttribute("enabled",""))}deactivateDroppables(){this.droppables.forEach(n=>n.removeAttribute("enabled"))}async wasDropped(n){let l=await this.checkForMoveTestItem(n);return n.dataTransfer.dropEffect!=="none"||l}wasMoved(n){return n.dataTransfer.dropEffect==="move"}async restoreInitialDraggablePosition(n){let{parent:l,index:p}=this.draggables.get(n),d=Math.min(p,l.children.length),m=(f,y,v)=>{let $=Math.min(v,y.children.length);y.insertBefore(f,y.children[$]),f.style.transform="translate(0, 0)",this.checkMaxAssociations()};if(!document.startViewTransition){m(n,l,p);return}let g=document.startViewTransition(()=>{n.style.transform="",m(n,l,p)})}checkMaxAssociations(){this.droppables.forEach((n,l)=>{let p=+(n.getAttribute("match-max")||1);n.querySelectorAll('[qti-draggable="true"]').length>=p?this.disableDroppable(n):this.enableDroppable(n)})}disableDroppable(n){n.setAttribute("disabled",""),n.removeAttribute("dropzone")}enableDroppable(n){n.removeAttribute("disabled"),n.setAttribute("dropzone","move")}get value(){return this.collectResponseData()}set value(n){this.isMatchTabular()||(this.resetDroppables(),n==null||n.forEach(l=>this.placeResponse(l)))}placeResponse(n){let[l,...p]=n.split(" ").reverse(),d=this.findDroppableById(l);p.forEach(m=>this.placeDraggableInDroppable(m,d))}findDroppableById(n){return this.droppables.find(l=>l.getAttribute("identifier")===n)}async placeDraggableInDroppable(n,l){let p=this.querySelector(`[identifier=${n}]`);if(!l||!p){console.error(`Cannot find draggable or droppable with the given identifier: ${n}`);return}let d=()=>{p.style.transform="translate(0, 0)",l.appendChild(p),this.checkMaxAssociations()};document.startViewTransition?await document.startViewTransition(d).finished:d()}validate(){let n=this.getValidAssociations();return this.minAssociations<=0||this.minAssociations<=n}getValidAssociations(){return this.droppables.filter(n=>n.childElementCount>0).length}saveResponse(){let n=this.collectResponseData();this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:n}}))}collectResponseData(){return this.droppables.map(l=>{let p=l.querySelectorAll('[qti-draggable="true"]'),d=Array.from(p).map(g=>g.getAttribute("identifier")),m=l.getAttribute("identifier");return d.map(g=>`${g} ${m}`)}).flat()}reset(n=!0){this.resetDroppables(),n&&this.saveResponse()}async resetDroppables(){let n=(p,d,m)=>{p.style.transform="translate(0, 0)";let g=Math.min(m,d.children.length);d.insertBefore(p,d.children[g])};if(!document.startViewTransition){this.draggables.forEach(({parent:p,index:d},m)=>{n(m,p,d)});return}await document.startViewTransition(()=>{this.draggables.forEach(({parent:p,index:d},m)=>{n(m,p,d)})}).finished}}return a([wt({attribute:!1,type:Object})],r.prototype,"configuration",2),a([wt({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),a([wt({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),a([Zt(i)],r.prototype,"handleDraggablesChange",1),r};import{css as fs}from"lit";var Jt=fs`
|
|
305
|
+
</div>`}`}};n([qt({type:String,attribute:"response-identifier"})],B.prototype,"responseIdentifier",2),n([qt({type:String,attribute:"module"})],B.prototype,"module",2),n([qt({type:String,attribute:"custom-interaction-type-identifier"})],B.prototype,"customInteractionTypeIdentifier",2),n([gs()],B.prototype,"_errorMessage",2),B=n([fs("qti-portable-custom-interaction")],B);import{html as Qt}from"lit";import{customElement as ys,state as xs}from"lit/decorators.js";var Ke=class c{constructor(){this.touchStartTime=0;this.touchStartPoint=null;this.lastClickTime=0;this.isDraggable=!1;this.dragSource=null;this.dragClone=null;this.touchEndTriggered=!1;this.isDragging=!1;this.initialTransform="";this.hasDispatchedDragStart=!1;this.rootNode=null;this.focusedElement=null;this.focusableDropZones=[];this.currentDropZoneIndex=-1;this.dataTransfer={data:{},setData(s,e){this.data[s]=e},getData(s){return this.data[s]},effectAllowed:"move"};this.cloneOffset={x:0,y:0};this.lastTarget=null;this.currentDropTarget=null;this.allowClick=!0;this.copyStylesForDragClone=!0;this.dragOnClickEnabled=!1;this.useDragClone=!1;this.MIN_DRAG_DISTANCE=5;this.DRAG_CLONE_OPACITY=1;if(c.instance)return c.instance;c.instance=this,document.addEventListener("touchmove",this.handleTouchMove.bind(this),{passive:!1}),document.addEventListener("mousemove",this.handleTouchMove.bind(this),{passive:!1}),document.addEventListener("touchend",this.handleTouchEnd.bind(this),{passive:!1}),document.addEventListener("mouseup",this.handleTouchEnd.bind(this),{passive:!1}),document.addEventListener("touchcancel",this.handleTouchCancel.bind(this),{passive:!1}),document.addEventListener("keydown",this.handleKeyDown.bind(this)),document.addEventListener("keyup",this.handleKeyUp.bind(this))}addDraggableElements(s){s.forEach(e=>{e.setAttribute("tabindex","0"),e.addEventListener("focus",()=>this.focusedElement=e),e.addEventListener("blur",()=>this.focusedElement=null),e.addEventListener("touchstart",this.handleTouchStart.bind(this),{passive:!1}),e.addEventListener("mousedown",this.handleTouchStart.bind(this),{passive:!1})})}handleTouchStart(s){this.touchStartTime=Date.now();let{x:e,y:t}=this.getEventCoordinates(s);if(this.touchStartPoint={x:e,y:t},this.dragSource=s.currentTarget,this.isDraggable=!0,this.rootNode=this.dragSource.getRootNode(),this.dragOnClickEnabled&&(this.isDragging=!0,this.createDragClone(s,{clientX:e,clientY:t})),!this.useDragClone){let r=window.getComputedStyle(this.dragSource);this.initialTransform=r.transform==="none"?"":r.transform,this.initialTransition=r.transition||"",this.dragSource.style.transition="none";let i=this.dragSource.getBoundingClientRect();this.cloneOffset.x=e-i.left,this.cloneOffset.y=t-i.top,this.dragSource.style.zIndex="9999",this.dragSource.focus()}s.preventDefault()}handleTouchMove(s){if(this.isDraggable&&this.dragSource){let{x:e,y:t}=this.getEventCoordinates(s),r={clientX:e,clientY:t};this.calculateDragDistance(r)>=this.MIN_DRAG_DISTANCE&&(this.dragSource.style.pointerEvents="none",this.isDragging=!0),this.createDragClone(s,r),s.preventDefault()}}createDragClone(s,e){if(!this.isDragging)return;if(this.useDragClone){if(!this.dragClone){if(this.dragSource.style.opacity=this.DRAG_CLONE_OPACITY.toString(),this.dragClone=this.dragSource.cloneNode(!0),this.copyStylesForDragClone){let r=window.getComputedStyle(this.dragSource);for(let i of r)this.dragClone.style[i]=r.getPropertyValue(i)}this.rootNode instanceof ShadowRoot?this.rootNode.host.appendChild(this.dragClone):this.rootNode instanceof Document&&document.body.appendChild(this.dragClone),this.calculateClonePosition(e),this.setDragCloneStyles(e),this.dispatchCustomEvent(this.dragSource,"dragstart")}this.updateDragClonePosition(e)}else if(this.touchStartPoint){let r=e.clientX-this.touchStartPoint.x,i=e.clientY-this.touchStartPoint.y;this.dragSource.style.transform=`${this.initialTransform} translate(${r}px, ${i}px)`,this.hasDispatchedDragStart||(this.dispatchCustomEvent(this.dragSource,"dragstart"),this.hasDispatchedDragStart=!0)}let t=this.findDropTarget(s);t!==this.lastTarget&&(this.dispatchCustomEvent(t,"dragenter"),this.dispatchCustomEvent(this.lastTarget,"dragleave"),this.lastTarget=t),this.currentDropTarget=t,this.currentDropTarget&&this.dispatchCustomEvent(t,"dragover")}handleTouchEnd(s){var t;this.touchEndTriggered=!0,this.isDraggable=!1;let e=!1;if(this.currentDropTarget)this.dispatchCustomEvent(this.currentDropTarget,"drop"),this.dispatchCustomEvent(this.dragSource,"dragend"),e=!0;else if(this.isDragging){let r=new CustomEvent("dragend",{bubbles:!0,cancelable:!0});r.dataTransfer={dropEffect:"none"},(t=this.dragSource)==null||t.dispatchEvent(r)}this.resetDragState(e)}handleTouchCancel(s){this.resetDragState()}findDropTarget(s){let{x:e,y:t}=this.getEventCoordinates(s);return this.getDropTargetAtPoint(document,e,t)}getDropTargetAtPoint(s,e,t,r=0){if(r>2)return null;let o=s.elementFromPoint(e,t);if(!o)return null;if(o.hasAttribute("dropzone"))return o;let a=o.parentElement;for(;a;){if(a.hasAttribute("dropzone"))return a;a=a.parentElement}if(o.shadowRoot&&r<2){let l=this.getDropTargetAtPoint(o.shadowRoot,e,t,r+1);if(l)return l}return null}handleKeyDown(s){this.focusedElement&&(s.key===" "&&!this.isDragging?(s.preventDefault(),this.isDraggable=!0,this.dragSource=this.focusedElement,this.isDragging=!0,this.collectDropZones(),this.dispatchCustomEvent(this.dragSource,"dragstart")):s.key==="Tab"&&this.isDragging&&(s.preventDefault(),this.moveToNextDropZone()))}handleKeyUp(s){s.key===" "&&this.isDragging&&this.currentDropTarget&&(s.preventDefault(),this.dispatchCustomEvent(this.currentDropTarget,"drop"),this.dispatchCustomEvent(this.dragSource,"dragend"),this.resetDragState(!0))}collectDropZones(){this.focusableDropZones=Array.from(document.querySelectorAll("[dropzone]")),this.currentDropZoneIndex=-1}moveToNextDropZone(){if(this.focusableDropZones.length===0)return;this.currentDropZoneIndex=(this.currentDropZoneIndex+1)%this.focusableDropZones.length;let s=this.focusableDropZones[this.currentDropZoneIndex];s.focus(),this.currentDropTarget=s,this.dispatchCustomEvent(s,"dragenter")}getEventCoordinates(s,e=!1){let t=s.touches?s.touches[0]:s;return{x:e?t.pageX:t.clientX,y:e?t.pageY:t.clientY}}calculateClonePosition(s){let e=this.dragSource.getBoundingClientRect();this.cloneOffset.x=s.clientX-e.left,this.cloneOffset.y=s.clientY-e.top}setDragCloneStyles(s){this.dragClone.style.position="fixed",this.dragClone.style.top=`${s.clientY-this.cloneOffset.y}px`,this.dragClone.style.left=`${s.clientX-this.cloneOffset.x}px`,this.dragClone.style.pointerEvents="none",this.dragClone.style.zIndex="999999"}updateDragClonePosition(s){requestAnimationFrame(()=>{if(this.touchEndTriggered||!this.dragClone)return;let e=s.clientX-this.cloneOffset.x,t=s.clientY-this.cloneOffset.y,{newLeft:r,newTop:i}=this.applyBoundaries(e,t,this.dragClone);this.dragClone.style.left=`${r}px`,this.dragClone.style.top=`${i}px`})}applyTransformBoundaries(s,e){let t;this.rootNode instanceof ShadowRoot?t=this.rootNode.host.getBoundingClientRect():this.rootNode instanceof Document?t=document.documentElement.getBoundingClientRect():t=new DOMRect(0,0,window.innerWidth,window.innerHeight);let r=this.dragSource.getBoundingClientRect(),i=r.width,o=r.height,a=r.left+s,l=r.top+e,p=Math.max(t.left,Math.min(a,t.right-i)),d=Math.max(t.top,Math.min(l,t.bottom-o)),m=p-r.left,g=d-r.top;return{boundedDeltaX:m,boundedDeltaY:g}}applyBoundaries(s,e,t){let r;this.rootNode instanceof ShadowRoot?r=this.rootNode.host.getBoundingClientRect():this.rootNode instanceof Document?r=document.documentElement.getBoundingClientRect():r=new DOMRect(0,0,window.innerWidth,window.innerHeight);let i=t.getBoundingClientRect(),o=i.width,a=i.height,l=Math.max(r.left,Math.min(s,r.right-o)),p=Math.max(r.top,Math.min(e,r.bottom-a));return{newLeft:l,newTop:p}}calculateDragDistance(s){let e=Math.abs(s.clientX-this.touchStartPoint.x),t=Math.abs(s.clientY-this.touchStartPoint.y);return e+t}dispatchCustomEvent(s,e,t=!0){if(!s)return;let r=new CustomEvent(e,{bubbles:t,cancelable:!0});r.dataTransfer=this.dataTransfer,s.dispatchEvent(r)}resetDragState(s=!1){var e;this.isDragging&&(this.useDragClone?(this.dragSource.style.opacity="1.0",(e=this.dragClone)==null||e.parentElement.removeChild(this.dragClone)):(s||(this.dragSource.style.transform="translate(0, 0)"),this.dragSource.style.zIndex="",this.dragSource.style.pointerEvents="",this.dragSource.style.transition=this.initialTransition,this.initialTransition="")),this.isDragging=!1,this.dragSource=null,this.dragClone=null,this.isDraggable=!1,this.touchStartTime=0,this.touchStartPoint=null,this.touchEndTriggered=!1,this.dataTransfer={data:{},setData(t,r){this.data[t]=r},getData(t){return this.data[t]},effectAllowed:"move"},this.cloneOffset={x:0,y:0},this.lastTarget=null,this.currentDropTarget=null,this.allowClick=!0,this.initialTransform="",this.hasDispatchedDragStart=!1,this.rootNode=null}};import{property as bs}from"lit/decorators.js";var Wt=(c,s,e)=>{class t extends c{constructor(){super(...arguments);this.disabled=!1}firstUpdated(o){if(this.isMatchTabular())return;super.firstUpdated(o);let a=this.getDroppableElements();this.initializeEventHandlers(),a.forEach(l=>{this.prepareDroppable(l),this.observeDroppableAttributes(l)})}isMatchTabular(){return this.classList.contains("qti-match-tabular")}getDroppableElements(){return Array.from(s?this.shadowRoot.querySelectorAll(e):this.querySelectorAll(e))}initializeEventHandlers(){this.dragoverHandler=this.dragoverHandler.bind(this),this.dragleaveHandler=this.dragleaveHandler.bind(this),this.dragenterHandler=this.dragenterHandler.bind(this),this.dropHandler=this.dropHandler.bind(this)}prepareDroppable(o){o.setAttribute("dropzone","move"),o.addEventListener("dragleave",this.dragleaveHandler),this.attachEventListeners(o)}observeDroppableAttributes(o){this.observer=new MutationObserver(a=>{a.forEach(({attributeName:l})=>{l==="disabled"&&this.toggleDroppableHandlers(o)})}),this.observer.observe(o,{attributes:!0})}toggleDroppableHandlers(o){o.hasAttribute("disabled")?this.removeEventListeners(o):this.attachEventListeners(o)}attachEventListeners(o){o.addEventListener("dragover",this.dragoverHandler),o.addEventListener("dragenter",this.dragenterHandler),o.addEventListener("drop",this.dropHandler)}removeEventListeners(o){o.removeEventListener("dragover",this.dragoverHandler),o.removeEventListener("dragenter",this.dragenterHandler),o.removeEventListener("drop",this.dropHandler)}disconnectedCallback(){var o;this.isMatchTabular()||(super.disconnectedCallback(),(o=this.observer)==null||o.disconnect())}dragenterHandler(o){o.preventDefault()}dragoverHandler(o){return o.preventDefault(),this.activateDroppable(o.currentTarget),o.dataTransfer.dropEffect="move",!1}activateDroppable(o){o.setAttribute("active","")}async dropHandler(o){o.preventDefault();let a=o.currentTarget,l=o.dataTransfer.getData("text"),p=this.findDraggable(l);return p?p&&!this.isValidDrop(a,p)?(p.style.transform="translate(0, 0)",!1):(await this.moveDraggableToDroppable(p,a),this.deactivateDroppable(a),!1):!1}findDraggable(o){return o?this.querySelector(`[identifier=${o}]`)||this.shadowRoot.querySelector(`[identifier=${o}]`):null}isValidDrop(o,a){return a.parentElement.getAttribute("identifier")!==o.getAttribute("identifier")}async moveDraggableToDroppable(o,a){let l=()=>{o.style.transform="translate(0, 0)",a.appendChild(o),this.checkMaxAssociations(),this.saveResponse(null)};if(!document.startViewTransition){l();return}await document.startViewTransition(l).finished}deactivateDroppable(o){o.removeAttribute("active")}dragleaveHandler(o){return o.preventDefault(),this.deactivateDroppable(o.currentTarget),o.dataTransfer.dropEffect="none",!1}}return n([bs({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var Zt=(c,s,e)=>{class t extends c{}return t};import{property as wt}from"lit/decorators.js";function Jt(c,s){let e,t=b({},s);return(r,i)=>{let{connectedCallback:o,disconnectedCallback:a}=r;r.connectedCallback=function(){var d;o.call(this);let l=m=>{let g=Array.from(this.querySelectorAll(c));for(let f of m){let y=Array.from(f.addedNodes).map($=>$),v=Array.from(f.addedNodes).map($=>$);f.type==="childList"&&y.find($=>g.includes($))&&this[i](y,v)}};e=new MutationObserver(l),e.observe(this,{childList:!0,subtree:!0});let p=(d=this.querySelectorAll(c))!=null?d:[];this[i](Array.from(p),[])},r.disconnectedCallback=function(){a.call(this),e.disconnect()}}}var V=(c,s,e,t)=>{class r extends Zt(Wt(c,e,t),t,s){constructor(){super(...arguments);this.draggables=new Map;this.droppables=[];this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.minAssociations=1;this.maxAssociations=1;this.handleDragStart=a=>{let l=a.currentTarget;a.dataTransfer.setData("text",l.getAttribute("identifier")),l.setAttribute("dragging",""),this.activateDroppables()};this.handleDragEnd=async a=>{a.preventDefault(),this.deactivateDroppables();let l=a.currentTarget;l.removeAttribute("dragging"),await this.wasDropped(a)||this.configuration.dragCanBePlacedBack&&this.restoreInitialDraggablePosition(l)};this.checkForMoveTestItem=a=>a.dataTransfer.items?new Promise(l=>{let p=!1,d=Array.from(a.dataTransfer.items),m=d.length;if(m===0){l(!1);return}d.forEach(g=>{g.kind==="string"&&g.type==="text"?g.getAsString(f=>{f==="move-test"&&(p=!0),m===0&&l(p)}):m===0&&l(p)})}):Promise.resolve(!1)}handleDraggablesChange(a,l){if(this.isMatchTabular())return;let p=this.filterExistingDraggables(a);p.length>0&&this.addNewDraggables(p)}firstUpdated(a){super.firstUpdated(a),this.initializeDroppables()}connectedCallback(){super.connectedCallback(),this.initializeDragDropApi()}initializeDragDropApi(){this.dragDropApi=new Ke,this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0,detail:this}))}isMatchTabular(){return this.classList.contains("qti-match-tabular")}filterExistingDraggables(a){return a.filter(l=>!this.draggables.has(l))}addNewDraggables(a){this.dragDropApi.addDraggableElements(a),a.forEach(l=>this.storeDraggable(l))}storeDraggable(a){let l=Array.from(a.parentNode.children).indexOf(a);this.draggables.set(a,{parent:a.parentElement,index:l}),a.style.viewTransitionName=`drag-${l}-${this.getAttribute("identifier")||crypto.randomUUID()}`,a.setAttribute("qti-draggable","true"),a.addEventListener("dragstart",this.handleDragStart),a.addEventListener("dragend",this.handleDragEnd)}initializeDroppables(){this.droppables=Array.from(e?this.shadowRoot.querySelectorAll(t):this.querySelectorAll(t))}activateDroppables(){this.droppables.forEach(a=>a.setAttribute("enabled",""))}deactivateDroppables(){this.droppables.forEach(a=>a.removeAttribute("enabled"))}async wasDropped(a){let l=await this.checkForMoveTestItem(a);return a.dataTransfer.dropEffect!=="none"||l}wasMoved(a){return a.dataTransfer.dropEffect==="move"}async restoreInitialDraggablePosition(a){let{parent:l,index:p}=this.draggables.get(a),d=Math.min(p,l.children.length),m=(f,y,v)=>{let $=Math.min(v,y.children.length);y.insertBefore(f,y.children[$]),f.style.transform="translate(0, 0)",this.checkMaxAssociations()};if(!document.startViewTransition){m(a,l,p);return}let g=document.startViewTransition(()=>{a.style.transform="",m(a,l,p)})}checkMaxAssociations(){this.droppables.forEach((a,l)=>{let p=+(a.getAttribute("match-max")||1);a.querySelectorAll('[qti-draggable="true"]').length>=p?this.disableDroppable(a):this.enableDroppable(a)})}disableDroppable(a){a.setAttribute("disabled",""),a.removeAttribute("dropzone")}enableDroppable(a){a.removeAttribute("disabled"),a.setAttribute("dropzone","move")}get value(){return this.collectResponseData()}set value(a){this.isMatchTabular()||(this.resetDroppables(),a==null||a.forEach(l=>this.placeResponse(l)))}placeResponse(a){let[l,...p]=a.split(" ").reverse(),d=this.findDroppableById(l);p.forEach(m=>this.placeDraggableInDroppable(m,d))}findDroppableById(a){return this.droppables.find(l=>l.getAttribute("identifier")===a)}async placeDraggableInDroppable(a,l){let p=this.querySelector(`[identifier=${a}]`);if(!l||!p){console.error(`Cannot find draggable or droppable with the given identifier: ${a}`);return}let d=()=>{p.style.transform="translate(0, 0)",l.appendChild(p),this.checkMaxAssociations()};document.startViewTransition?await document.startViewTransition(d).finished:d()}validate(){let a=this.getValidAssociations();return this.minAssociations<=0||this.minAssociations<=a}getValidAssociations(){return this.droppables.filter(a=>a.childElementCount>0).length}saveResponse(){let a=this.collectResponseData();this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:a}}))}collectResponseData(){return this.droppables.map(l=>{let p=l.querySelectorAll('[qti-draggable="true"]'),d=Array.from(p).map(g=>g.getAttribute("identifier")),m=l.getAttribute("identifier");return d.map(g=>`${g} ${m}`)}).flat()}reset(a=!0){this.resetDroppables(),a&&this.saveResponse()}async resetDroppables(){let a=(p,d,m)=>{p.style.transform="translate(0, 0)";let g=Math.min(m,d.children.length);d.insertBefore(p,d.children[g])};if(!document.startViewTransition){this.draggables.forEach(({parent:p,index:d},m)=>{a(m,p,d)});return}await document.startViewTransition(()=>{this.draggables.forEach(({parent:p,index:d},m)=>{a(m,p,d)})}).finished}}return n([wt({attribute:!1,type:Object})],r.prototype,"configuration",2),n([wt({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),n([wt({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),n([Jt(s)],r.prototype,"handleDraggablesChange",1),r};import{css as vs}from"lit";var Gt=vs`
|
|
306
306
|
:host {
|
|
307
307
|
display: block; /* necessary to calculate scaling position */
|
|
308
308
|
}
|
|
@@ -322,14 +322,14 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
322
322
|
rgb(0 0 0 / 0%) calc(50% + 1px)
|
|
323
323
|
);
|
|
324
324
|
}
|
|
325
|
-
`;var G=class extends V(u,"qti-simple-associable-choice",!0,".dl"){constructor(){super();this._childrenMap=[];this._registerChoiceHandler=this._registerChoice.bind(this),this.addEventListener("register-qti-simple-associable-choice",this._registerChoiceHandler)}_registerChoice(e){let t=e.target;this._childrenMap.push(t)}render(){return
|
|
325
|
+
`;var G=class extends V(u,"qti-simple-associable-choice",!0,".dl"){constructor(){super();this._childrenMap=[];this._registerChoiceHandler=this._registerChoice.bind(this),this.addEventListener("register-qti-simple-associable-choice",this._registerChoiceHandler)}_registerChoice(e){let t=e.target;this._childrenMap.push(t)}render(){return Qt` <slot name="prompt"></slot>
|
|
326
326
|
<slot name="qti-simple-associable-choice"></slot>
|
|
327
327
|
<div part="drop-container">
|
|
328
|
-
${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((e,t)=>
|
|
328
|
+
${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((e,t)=>Qt`<div part="associables-container">
|
|
329
329
|
<div name="left${t}" part="drop-list" class="dl" identifier="droplist${t}_left"></div>
|
|
330
330
|
<div name="right${t}" part="drop-list" class="dl" identifier="droplist${t}_right"></div>
|
|
331
331
|
</div>`)}
|
|
332
|
-
</div>`}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("register-qti-simple-associable-choice",this._registerChoiceHandler)}};G.styles=
|
|
332
|
+
</div>`}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("register-qti-simple-associable-choice",this._registerChoiceHandler)}};G.styles=Gt,n([xs()],G.prototype,"_childrenMap",2),G=n([ys("qti-associate-interaction")],G);import{html as er}from"lit";import{customElement as Es,property as be,state as Cs}from"lit/decorators.js";var H=class extends u{constructor(){super();this._errorMessage=null;this.handlePostMessage=this.handlePostMessage.bind(this)}connectedCallback(){super.connectedCallback();let e=this.data.startsWith("http")?this.data:le(this.baseItemUrl+"/"+this.data);fetch(e).then(t=>t.json()).then(t=>{this.manifest=t,this.setupCES()}).catch(t=>{this._errorMessage=t})}setupCES(){let e=this.shadowRoot.querySelector("#pciContainer"),t=e.contentWindow||e,r=e.contentDocument;window.addEventListener("message",this.handlePostMessage),r.open(),r.write(`
|
|
333
333
|
<html>
|
|
334
334
|
<head>
|
|
335
335
|
<link href='${le(`${this.baseRefUrl}/${this.manifest.style[0]}`)}' rel="stylesheet" />
|
|
@@ -337,7 +337,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
337
337
|
</head>
|
|
338
338
|
<body></body>
|
|
339
339
|
</html>
|
|
340
|
-
`),r.close()}getIFrames(){let e=this.shadowRoot.querySelectorAll("iframe"),t=this.querySelectorAll("iframe"),r=[...e,...t];for(let
|
|
340
|
+
`),r.close()}getIFrames(){let e=this.shadowRoot.querySelectorAll("iframe"),t=this.querySelectorAll("iframe"),r=[...e,...t];for(let i of r){let o=i.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let l=i.contentDocument||i.contentWindow.document;l&&this.getInnerIFrames(l,r)}catch(l){console.error("Error accessing nested iframe:",l)}}return r.forEach((i,o)=>{r.indexOf(i)!==o&&r.splice(o,1)}),r}getInnerIFrames(e,t=[]){return e.querySelectorAll("iframe").forEach(i=>{t.push(i);let o=i.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let l=i.contentDocument||i.contentWindow.document;this.getInnerIFrames(l,t)}catch(l){console.error("Error accessing nested iframe:",l)}else console.warn("Skipped cross-origin iframe:",o)}),t}postToWindowAndIframes(e,t){window.postMessage({type:e,data:t},"*");let r=this.getIFrames();for(let i of r)i.contentWindow&&i.contentWindow.postMessage({type:e,data:t},"*")}handlePostMessage(e){let{type:t,data:r}=e.data;switch(t){case"setResponse":this.rawResponse=r,this.saveResponse(r);break;case"getResponse":{this.postToWindowAndIframes("responseData",this.rawResponse);break}case"getMedia":{let i=this.manifest.media.map(o=>o.startsWith("http")?o:le(this.baseRefUrl+"/"+o));this.postToWindowAndIframes("mediaData",i);break}case"setStageHeight":console.log("setStageHeight not implemented");break}}validate(){return this.rawResponse!==""}get value(){return this.rawResponse}set value(e){if(typeof e=="string")this.rawResponse=e,this.saveResponse(e);else throw new Error("Value must be a string")}disconnectedCallback(){window.removeEventListener("message",this.handlePostMessage),super.disconnectedCallback()}render(){return er`<iframe
|
|
341
341
|
width=${this.getAttribute("width")}
|
|
342
342
|
height=${this.getAttribute("height")}
|
|
343
343
|
frameborder="0"
|
|
@@ -345,10 +345,10 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
345
345
|
id="pciContainer"
|
|
346
346
|
>
|
|
347
347
|
</iframe>
|
|
348
|
-
${this._errorMessage&&
|
|
348
|
+
${this._errorMessage&&er`<div style="color:red">
|
|
349
349
|
<h1>Error</h1>
|
|
350
350
|
${this._errorMessage}
|
|
351
|
-
</div>`}`}};
|
|
351
|
+
</div>`}`}};n([be({type:String,attribute:"response-identifier"})],H.prototype,"responseIdentifier",2),n([be({type:String,attribute:"data"})],H.prototype,"data",2),n([be({type:String,attribute:"data-base-item"})],H.prototype,"baseItemUrl",2),n([be({type:String,attribute:"data-base-ref"})],H.prototype,"baseRefUrl",2),n([be({type:String,attribute:"id"})],H.prototype,"id",2),n([Cs()],H.prototype,"_errorMessage",2),H=n([Es("qti-custom-interaction")],H);import{html as qs}from"lit";import{customElement as ws,property as tr}from"lit/decorators.js";var Q=class extends u{constructor(){super(...arguments);this.countAttempt="true"}validate(){return!0}get value(){return""}set value(e){}render(){return qs`<button ?disabled=${this.disabled} part="button" @click=${this.endAttempt}>${this.title}</button>`}endAttempt(e){this.dispatchEvent(new CustomEvent("end-attempt",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,countAttempt:this.countAttempt==="true"}}))}};n([tr({type:String,attribute:"count-attempt"})],Q.prototype,"countAttempt",2),n([tr({type:String})],Q.prototype,"title",2),Q=n([ws("qti-end-attempt-interaction")],Q);import{css as Ts,html as Ss}from"lit";import{customElement as ks}from"lit/decorators.js";var ve=class extends V(u,"qti-gap-text",!1,"qti-gap"){render(){return Ss`<slot name="prompt"> </slot><slot part="drags" name="qti-gap-text"></slot> <slot part="drops"></slot>`}set correctResponse(s){let e=[],t=Array.isArray(s)?s:[s];t&&(e=t.map(i=>{let o=i.split(" ");return{text:o[0],gap:o[1]}})),this.querySelectorAll("qti-gap").forEach((i,o)=>{var d,m,g,f;let a=i.getAttribute("identifier"),l=(d=e.find(y=>y.gap===a))==null?void 0:d.text,p=(m=this.querySelector(`qti-gap-text[identifier="${l}"]`))==null?void 0:m.textContent.trim();if(l&&p){if(!((g=i.nextElementSibling)!=null&&g.classList.contains("correct-option"))){let y=document.createElement("span");y.classList.add("correct-option"),y.textContent=p,i.insertAdjacentElement("afterend",y)}}else(f=i.nextElementSibling)!=null&&f.classList.contains("correct-option")&&i.nextElementSibling.remove()})}};ve.styles=[Ts`
|
|
352
352
|
:host {
|
|
353
353
|
display: flex;
|
|
354
354
|
align-items: flex-start;
|
|
@@ -375,14 +375,14 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
375
375
|
flex: 1;
|
|
376
376
|
gap: 0.5rem;
|
|
377
377
|
}
|
|
378
|
-
`],ve=
|
|
378
|
+
`],ve=n([ks("qti-gap-match-interaction")],ve);import{css as Ms,html as _s,svg as rr}from"lit";import{customElement as Rs,query as Ls,queryAssignedElements as As,state as Tt}from"lit/decorators.js";import{ifDefined as ir}from"lit/directives/if-defined.js";import{repeat as Ds}from"lit/directives/repeat.js";function ee(c,s,e,t){switch(c){case"circle":{let[r,i,o]=s,a=r/e.width*100,l=i/e.height*100,p=o/e.width*100;t.style.left=a-p+"%",t.style.top=l-p+"%",t.style.width=t.style.height=4*p+"px",t.style.borderRadius="9999px"}break;case"rect":{let[r,i,o,a]=s,l=r/e.width*100,p=i/e.height*100,d=o/e.width*100,m=a/e.height*100;t.style.left=l+"%",t.style.top=p+"%",t.style.width=d-l+"%",t.style.height=m-p+"%"}break;case"poly":{let r=s.reduce((v,$,_t,ur)=>{if(_t%2===1){let mr=v.pop();v[v.length]={x:mr,y:ur[_t]}}else v.push($);return v},[]),i=Math.min(...r.map(v=>v.x)),o=Math.max(...r.map(v=>v.x)),a=Math.min(...r.map(v=>v.y)),l=Math.max(...r.map(v=>v.y)),p=i/e.width*100,d=a/e.height*100,m=o/e.width*100,g=l/e.height*100;t.style.left=i/e.width*100+"%",t.style.top=a/e.height*100+"%",t.style.width=m-p+"%",t.style.height=g-d+"%";let y=r.map(v=>({x:(v.x-i)/(o-i)*100,y:(v.y-a)/(l-a)*100})).map(v=>Math.round(v.x)+"% "+Math.round(v.y)+"%").join(",");t.style.clipPath=`polygon(${y})`}break;default:break}}var N=class extends u{constructor(){super();this.startPoint=null;this.endPoint=null;this._lines=[];this.addEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}reset(){this._lines=[]}validate(){return this._lines.length>0}set value(e){Array.isArray(e)&&(this._lines=e)}get value(){return this._lines}render(){var e,t,r,i;return _s`<slot name="prompt"></slot>
|
|
379
379
|
<line-container>
|
|
380
380
|
<svg
|
|
381
|
-
width=${
|
|
382
|
-
height=${
|
|
383
|
-
viewbox="0 0 ${(r=this.grImage[0])==null?void 0:r.width} ${(
|
|
381
|
+
width=${ir((e=this.grImage[0])==null?void 0:e.width)}
|
|
382
|
+
height=${ir((t=this.grImage[0])==null?void 0:t.height)}
|
|
383
|
+
viewbox="0 0 ${(r=this.grImage[0])==null?void 0:r.width} ${(i=this.grImage[0])==null?void 0:i.height}"
|
|
384
384
|
>
|
|
385
|
-
${
|
|
385
|
+
${Ds(this._lines,o=>o,(o,a)=>rr`
|
|
386
386
|
<line
|
|
387
387
|
part="line"
|
|
388
388
|
x1=${parseInt(this.querySelector("[identifier="+o.split(" ")[0]+"]").style.left)}
|
|
@@ -391,10 +391,10 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
391
391
|
y2=${parseInt(this.querySelector("[identifier="+o.split(" ")[1]+"]").style.top)}
|
|
392
392
|
stroke="red"
|
|
393
393
|
stroke-width="3"
|
|
394
|
-
@click=${l=>{l.stopPropagation(),this._lines=this._lines.filter((p,d)=>d!==
|
|
394
|
+
@click=${l=>{l.stopPropagation(),this._lines=this._lines.filter((p,d)=>d!==a),this.saveResponse(this._lines)}}
|
|
395
395
|
/>
|
|
396
396
|
`)}
|
|
397
|
-
${this.startPoint&&
|
|
397
|
+
${this.startPoint&&rr`<line
|
|
398
398
|
part="point"
|
|
399
399
|
x1=${this.startCoord.x}
|
|
400
400
|
y1=${this.startCoord.y}
|
|
@@ -405,7 +405,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
405
405
|
/>`}
|
|
406
406
|
</svg>
|
|
407
407
|
<slot></slot>
|
|
408
|
-
</line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,
|
|
408
|
+
</line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,i=r.getAttribute("coords"),o=r.getAttribute("shape"),a=i.split(",").map(l=>parseInt(l));ee(o,a,t,r)}firstUpdated(e){super.firstUpdated(e),this.hotspots=this.querySelectorAll("qti-associable-hotspot"),document.addEventListener("mousemove",t=>{this.mouseCoord={x:t.clientX-this.grImage[0].getBoundingClientRect().left,y:t.clientY-this.grImage[0].getBoundingClientRect().top}}),this.hotspots.forEach(t=>{t.style.left=t.getAttribute("coords").split(",")[0]+"px",t.style.top=t.getAttribute("coords").split(",")[1]+"px",t.addEventListener("click",r=>{this.startPoint?this.endPoint||(this.endPoint=r.target,this._lines=[...this._lines,this.startPoint.getAttribute("identifier")+" "+this.endPoint.getAttribute("identifier")],this.saveResponse(this._lines),this.startPoint=null,this.endPoint=null):(this.startPoint=r.target,this.startCoord={x:this.startPoint.getAttribute("coords").split(",")[0],y:this.startPoint.getAttribute("coords").split(",")[1]})})})}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}};N.styles=[Ms`
|
|
409
409
|
slot:not([name='prompt']) {
|
|
410
410
|
// position: relative; /* qti-hotspot-choice relative to the slot */
|
|
411
411
|
display: block;
|
|
@@ -428,9 +428,9 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
428
428
|
top: 0px;
|
|
429
429
|
left: 0px;
|
|
430
430
|
}
|
|
431
|
-
`],
|
|
431
|
+
`],n([Tt()],N.prototype,"_lines",2),n([Tt()],N.prototype,"startCoord",2),n([Tt()],N.prototype,"mouseCoord",2),n([Ls("svg")],N.prototype,"svgContainer",2),n([As({selector:"img"})],N.prototype,"grImage",2),N=n([Rs("qti-graphic-associate-interaction")],N);import{css as Vs,html as Hs}from"lit";import{customElement as Ns}from"lit/decorators.js";var ye=class extends V(u,"qti-gap-img",!1,"qti-associable-hotspot"){render(){return Hs` <slot name="prompt"></slot>
|
|
432
432
|
<slot></slot>
|
|
433
|
-
<slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(
|
|
433
|
+
<slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),i=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));switch(i){case"circle":{let[a,l,p]=o;t.style.left=a-p+"px",t.style.top=l-p+"px",t.style.width=t.style.height=2*p+"px"}break;case"rect":{let[a,l,p,d]=o;t.style.left=a+"px",t.style.top=l+"px",t.style.width=p-a+"px",t.style.height=d-l+"px"}break;default:break}}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}};ye.styles=Vs`
|
|
434
434
|
:host {
|
|
435
435
|
display: inline-block;
|
|
436
436
|
position: relative;
|
|
@@ -439,12 +439,12 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
439
439
|
display: flex;
|
|
440
440
|
gap: 1rem;
|
|
441
441
|
}
|
|
442
|
-
`,ye=
|
|
442
|
+
`,ye=n([Ns("qti-graphic-gap-match-interaction")],ye);import{css as $s,html as Is}from"lit";import{customElement as Ps}from"lit/decorators.js";var xe=class extends U(u,"qti-hotspot-choice"){render(){return Is`
|
|
443
443
|
<slot name="prompt"></slot>
|
|
444
444
|
<!-- slot for the prompt -->
|
|
445
445
|
<slot></slot>
|
|
446
446
|
<!-- slot for the image and hotspots -->
|
|
447
|
-
`}setHotspotOrder(
|
|
447
|
+
`}setHotspotOrder(s){let{identifier:e}=s.detail,t=this._choiceElements.find(i=>i.getAttribute("identifier")===e),r=this._choiceElements.length;if(!this.choiceOrdering){if(this.choiceOrdering=!0,t.order==null){if(this._choiceElements.filter(i=>i.order>0).length>=r){this.choiceOrdering=!1;return}t.order=this._choiceElements.filter(i=>!!i.order).length+1,this.choiceOrdering=!1;return}else this._choiceElements.forEach(i=>(i.order>i.order&&i.order--,i)),t.order=null;this.choiceOrdering=!1}}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),i=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));ee(i,o,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("activate-qti-hotspot-choice",this.setHotspotOrder),this.addEventListener("register-qti-hotspot-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("activate-qti-hotspot-choice",this.setHotspotOrder),this.removeEventListener("register-qti-hotspot-choice",this.positionHotspotOnRegister)}};xe.styles=[$s`
|
|
448
448
|
slot:not([name='prompt']) {
|
|
449
449
|
position: relative; /* qti-hotspot-choice relative to the slot */
|
|
450
450
|
display: block;
|
|
@@ -455,12 +455,12 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
455
455
|
pointer-events: none;
|
|
456
456
|
user-select: none;
|
|
457
457
|
}
|
|
458
|
-
`],xe=
|
|
458
|
+
`],xe=n([Ps("qti-graphic-order-interaction")],xe);import{css as Os,html as Us}from"lit";import{customElement as Fs}from"lit/decorators.js";var Ee=class extends U(u,"qti-hotspot-choice"){render(){return Us`
|
|
459
459
|
<slot name="prompt"></slot>
|
|
460
460
|
<!-- slot for the prompt -->
|
|
461
461
|
<slot></slot>
|
|
462
462
|
<!-- slot for the image and hotspots -->
|
|
463
|
-
`}positionHotspotOnRegister(
|
|
463
|
+
`}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),i=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));ee(i,o,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-choice",this.positionHotspotOnRegister)}};Ee.styles=[Os`
|
|
464
464
|
slot:not([name='prompt']) {
|
|
465
465
|
position: relative; /* qti-hotspot-choice relative to the slot */
|
|
466
466
|
display: block;
|
|
@@ -472,10 +472,10 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
472
472
|
user-select: none;
|
|
473
473
|
/* width:100%; */
|
|
474
474
|
}
|
|
475
|
-
`],Ee=
|
|
475
|
+
`],Ee=n([Fs("qti-hotspot-interaction")],Ee);import{html as Ce}from"lit";import{customElement as Ks,property as Ws,state as or}from"lit/decorators.js";import{unsafeHTML as nr}from"lit/directives/unsafe-html.js";import{css as Bs,html as Xs,LitElement as Ys}from"lit";import{customElement as js,property as St}from"lit/decorators.js";var X=class extends _(Ys,"qti-simple-associable-choice"){constructor(){super(...arguments);this.matchMin=0;this.matchMax=1;this.fixed=!1}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-simple-associable-choice"),this.setAttribute("part","qti-simple-associable-choice")}render(){return Xs`
|
|
476
476
|
<slot part="slot"></slot>
|
|
477
477
|
<slot part="dropslot" name="qti-simple-associable-choice"></slot>
|
|
478
|
-
`}};X.styles=
|
|
478
|
+
`}};X.styles=Bs`
|
|
479
479
|
:host {
|
|
480
480
|
display: flex;
|
|
481
481
|
user-select: none;
|
|
@@ -487,7 +487,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
487
487
|
slot[name='qti-simple-associable-choice'] {
|
|
488
488
|
width: 100%;
|
|
489
489
|
}
|
|
490
|
-
`,
|
|
490
|
+
`,n([St({type:Number,attribute:"match-min"})],X.prototype,"matchMin",2),n([St({type:Number,attribute:"match-max"})],X.prototype,"matchMax",2),n([St({type:Boolean,attribute:"fixed"})],X.prototype,"fixed",2),X=n([js("qti-simple-associable-choice")],X);import{css as zs}from"lit";var sr=zs`
|
|
491
491
|
slot {
|
|
492
492
|
/* slot where the */
|
|
493
493
|
display: flex;
|
|
@@ -514,17 +514,17 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
514
514
|
/* Make sure the drag and drop container slots have the same width */
|
|
515
515
|
flex: 1;
|
|
516
516
|
}
|
|
517
|
-
`;var Y=class extends V(u,"qti-simple-match-set:first-of-type qti-simple-associable-choice",!1,"qti-simple-match-set:last-of-type qti-simple-associable-choice"){constructor(){super(...arguments);this.lastCheckedRadio=null;this._response=[];this.correctOptions=[];this.responseIdentifier="";this.handleRadioClick=e=>{let t=e.target;this.lastCheckedRadio===t?(t.checked=!1,this.lastCheckedRadio=null,this.handleRadioChange(e)):this.lastCheckedRadio=t};this.handleRadioChange=e=>{let t=e.target,r=t.value,
|
|
517
|
+
`;var Y=class extends V(u,"qti-simple-match-set:first-of-type qti-simple-associable-choice",!1,"qti-simple-match-set:last-of-type qti-simple-associable-choice"){constructor(){super(...arguments);this.lastCheckedRadio=null;this._response=[];this.correctOptions=[];this.responseIdentifier="";this.handleRadioClick=e=>{let t=e.target;this.lastCheckedRadio===t?(t.checked=!1,this.lastCheckedRadio=null,this.handleRadioChange(e)):this.lastCheckedRadio=t};this.handleRadioChange=e=>{let t=e.target,r=t.value,i=t.name,o=t.type;t.checked?(this.value?this.value.indexOf(r)===-1&&(o==="radio"&&(this.value=this.value.filter(a=>a.indexOf(i)===-1)),this.value=[...this.value,r]):this.value=[r],this.lastCheckedRadio=t):(this.value=this.value.filter(a=>a!==r),this.lastCheckedRadio=null),this.requestUpdate(),this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:Array.isArray(this.value)?[...this.value]:this.value}}))}}get value(){return this.classList.contains("qti-match-tabular")?this._response:super.value}set value(e){this.classList.contains("qti-match-tabular")?this._response=e:super.value=e}async connectedCallback(){super.connectedCallback(),this.rows=Array.from(this.querySelectorAll("qti-simple-match-set:first-of-type qti-simple-associable-choice")),this.cols=Array.from(this.querySelectorAll("qti-simple-match-set:last-of-type qti-simple-associable-choice")),this.value=[]}set correctResponse(e){if(e===""){this.correctOptions=[];return}else Array.isArray(e)&&(this.correctOptions=e)}render(){return this.classList.contains("qti-match-tabular")?Ce`
|
|
518
518
|
<slot name="prompt"></slot>
|
|
519
519
|
<table>
|
|
520
520
|
<tr>
|
|
521
521
|
<td></td>
|
|
522
|
-
${this.cols.map((e,t)=>Ce`<th part="r-header">${
|
|
522
|
+
${this.cols.map((e,t)=>Ce`<th part="r-header">${nr(e.innerHTML)}</th>`)}
|
|
523
523
|
</tr>
|
|
524
524
|
|
|
525
525
|
${this.rows.map((e,t)=>Ce`<tr>
|
|
526
|
-
<td part="c-header">${
|
|
527
|
-
${this.cols.map((r,
|
|
526
|
+
<td part="c-header">${nr(e.innerHTML)}</td>
|
|
527
|
+
${this.cols.map((r,i)=>{let o=e.getAttribute("identifier"),a=r.getAttribute("identifier"),l=`${o} ${a}`,p=this.value.filter(f=>f.split(" ")[0]===o).length||0,d=this.value.includes(l),m=`rb ${d?"rb-checked":""} ${this.correctOptions.includes(l)?"rb-correct":""}`,g=this.correctOptions.length>0?!0:e.matchMax===1?!1:p>=e.matchMax&&!d;return Ce`<td>
|
|
528
528
|
<input
|
|
529
529
|
type=${e.matchMax===1?"radio":"checkbox"}
|
|
530
530
|
part=${m}
|
|
@@ -537,14 +537,14 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
537
537
|
</td>`})}
|
|
538
538
|
</tr>`)}
|
|
539
539
|
</table>
|
|
540
|
-
`:Ce`<slot name="prompt"></slot> <slot></slot>`}};Y.styles=
|
|
541
|
-
<slot></slot>`}connectedCallback(){super.connectedCallback();let e=this.querySelector("audio")||this.querySelector("video")||this.querySelector("object");e&&e.addEventListener("ended",()=>{this._value++,this.saveResponse(this.value)})}};qe.styles=[
|
|
540
|
+
`:Ce`<slot name="prompt"></slot> <slot></slot>`}};Y.styles=sr,n([or()],Y.prototype,"_response",2),n([or()],Y.prototype,"correctOptions",2),n([Ws({type:String,attribute:"response-identifier"})],Y.prototype,"responseIdentifier",2),Y=n([Ks("qti-match-interaction")],Y);import{css as Zs,html as Js}from"lit";import{customElement as Gs}from"lit/decorators.js";var qe=class extends u{constructor(){super();this._value=0}reset(){}validate(){return!0}get value(){return this._value.toString()}set value(e){if(!isNaN(parseInt(e.toString())))this._value=parseInt(e.toString());else throw new Error("Value must be a number")}static get properties(){return q(b({},u.properties),{step:{type:Number,attribute:"step",default:10}})}render(){return Js` <slot name="prompt"></slot>
|
|
541
|
+
<slot></slot>`}connectedCallback(){super.connectedCallback();let e=this.querySelector("audio")||this.querySelector("video")||this.querySelector("object");e&&e.addEventListener("ended",()=>{this._value++,this.saveResponse(this.value)})}};qe.styles=[Zs``],qe=n([Gs("qti-media-interaction")],qe);import{css as Qs,html as ar}from"lit";import{customElement as eo,property as to,state as kt}from"lit/decorators.js";import{unsafeHTML as ro}from"lit/directives/unsafe-html.js";var P=class extends Oe(V(u,"qti-simple-choice",!0,"drop-list"),"qti-simple-choice"){constructor(){super(...arguments);this.nrChoices=0;this.correctResponses=[];this.showCorrectResponses=!1}render(){let e=Array.from(this.querySelectorAll("qti-simple-choice"));return this.nrChoices<e.length&&(this.nrChoices=e.length),ar` <slot name="prompt"> </slot>
|
|
542
542
|
<div part="container">
|
|
543
543
|
<slot part="drags"> </slot>
|
|
544
544
|
<div part="drops">
|
|
545
|
-
${Array.from(Array(this.nrChoices)).map((t,r)=>
|
|
545
|
+
${Array.from(Array(this.nrChoices)).map((t,r)=>ar`<drop-list part="drop-list" identifier="droplist${r}"></drop-list>${this.showCorrectResponses&&this.correctResponses.length>r?ro(`<span part='correct-response'>${this.correctResponses[r]}</span>`):""}`)}
|
|
546
546
|
</div>
|
|
547
|
-
</div>`}set correctResponse(e){if(e===""){this.showCorrectResponses=!1;return}this.correctResponses.length===0&&(Array.isArray(e)?e:[e]).forEach((r,
|
|
547
|
+
</div>`}set correctResponse(e){if(e===""){this.showCorrectResponses=!1;return}this.correctResponses.length===0&&(Array.isArray(e)?e:[e]).forEach((r,i)=>{let o=this.querySelector(`qti-simple-choice[identifier="${r}"]`);o||(o=this.shadowRoot.querySelector(`qti-simple-choice[identifier="${r}"]`));let a=o==null?void 0:o.textContent.trim();this.correctResponses=[...this.correctResponses,a]}),this.showCorrectResponses=!0}getResponse(){return Array.from(this.shadowRoot.querySelectorAll("drop-list")).map(r=>{let i=r.querySelectorAll('[qti-draggable="true"]');return[...Array.from(i).map(a=>a.getAttribute("identifier"))].join(" ")})}async firstUpdated(e){super.firstUpdated(e),this.childrenMap=Array.from(this.querySelectorAll("qti-simple-choice")),this.childrenMap.forEach(t=>t.setAttribute("part","qti-simple-choice"))}};P.styles=[Qs`
|
|
548
548
|
[part='drags'] {
|
|
549
549
|
display: flex;
|
|
550
550
|
align-items: flex-start;
|
|
@@ -592,7 +592,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
592
592
|
:host(.qti-choices-right) [part='container'] {
|
|
593
593
|
flex-direction: row-reverse;
|
|
594
594
|
}
|
|
595
|
-
`],
|
|
595
|
+
`],n([kt()],P.prototype,"nrChoices",2),n([kt()],P.prototype,"correctResponses",2),n([kt()],P.prototype,"showCorrectResponses",2),n([to({type:String})],P.prototype,"orientation",2),P=n([eo("qti-order-interaction")],P);import{LitElement as io,css as so,html as oo}from"lit";var We=class extends io{render(){return oo`<slot></slot>`}};We.styles=[so`
|
|
596
596
|
:host {
|
|
597
597
|
display: block;
|
|
598
598
|
}
|
|
@@ -603,23 +603,23 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
603
603
|
left: 50%;
|
|
604
604
|
transform: translateX(-50%);
|
|
605
605
|
}
|
|
606
|
-
`];customElements.define("qti-position-object-interaction",We);import{LitElement as
|
|
606
|
+
`];customElements.define("qti-position-object-interaction",We);import{LitElement as no,css as ao,html as lo}from"lit";import{customElement as co}from"lit/decorators.js";var we=class extends no{render(){return lo`<slot></slot>`}constructor(){super(),this.removeMoveListener=this.removeMoveListener.bind(this),this.dragElementHandler=this.dragElementHandler.bind(this)}dragElementHandler(s){s.preventDefault();let e=s.clientX-this.startX,t=s.clientY-this.startY;this.dragElement.style.left=this.dragElement.offsetLeft+e+"px",this.dragElement.style.top=this.dragElement.offsetTop+t+"px",this.startX=s.clientX,this.startY=s.clientY}firstUpdated(s){super.firstUpdated(s),this.dragElement=this.querySelector("qti-position-object-interaction>img"),this.startX=0,this.startY=0,this.dragElement.addEventListener("mousedown",e=>{this.startX=e.clientX,this.startY=e.clientY,document.addEventListener("mousemove",this.dragElementHandler,!0)}),document.addEventListener("mouseup",this.removeMoveListener)}removeMoveListener(s){document.removeEventListener("mousemove",this.dragElementHandler,!0)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("mousemove",this.dragElementHandler),document.removeEventListener("mouseup",this.removeMoveListener)}};we.styles=[ao`
|
|
607
607
|
:host {
|
|
608
608
|
display: inline-block;
|
|
609
609
|
position: relative;
|
|
610
610
|
}
|
|
611
|
-
`],we=
|
|
611
|
+
`],we=n([co("qti-position-object-stage")],we);import{css as po,html as lr}from"lit";import{customElement as uo,property as cr,state as mo}from"lit/decorators.js";import{repeat as ho}from"lit/directives/repeat.js";import{styleMap as fo}from"lit/directives/style-map.js";var j=class extends u{constructor(){super(...arguments);this.maxChoices=1/0;this.minChoices=0;this._points=[];this._imgElement=null;this._onImageClick=e=>{if(this._points.length<this.maxChoices){let t=e.offsetX,r=e.offsetY;this._points=[...this._points,`${t} ${r}`],this.saveResponse(this._points)}}}render(){return lr` <slot name="prompt"></slot>
|
|
612
612
|
<point-container>
|
|
613
|
-
${
|
|
613
|
+
${ho(this._points,e=>e,(e,t)=>lr`
|
|
614
614
|
<button
|
|
615
615
|
part="point"
|
|
616
|
-
style=${
|
|
616
|
+
style=${fo({position:"absolute",transform:"translate(-50%, -50%)",left:`${e.split(" ")[0]}px`,top:`${e.split(" ")[1]}px`})}
|
|
617
617
|
aria-label="Remove point at ${e}"
|
|
618
|
-
@click=${r=>{r.stopPropagation(),this._points=this._points.filter((
|
|
618
|
+
@click=${r=>{r.stopPropagation(),this._points=this._points.filter((i,o)=>o!==t),this.saveResponse(this._points)}}
|
|
619
619
|
></button>
|
|
620
620
|
`)}
|
|
621
621
|
<slot></slot>
|
|
622
|
-
</point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set value(e){this._points=Array.isArray(e)?e:[e]}get value(){return this._points}firstUpdated(){this._imgElement=this.querySelector("img"),this._imgElement?this._imgElement.addEventListener("click",this._onImageClick):console.warn("No <img> element found in <qti-select-point-interaction>")}disconnectedCallback(){super.disconnectedCallback(),this._imgElement&&this._imgElement.removeEventListener("click",this._onImageClick)}};j.styles=[
|
|
622
|
+
</point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set value(e){this._points=Array.isArray(e)?e:[e]}get value(){return this._points}firstUpdated(){this._imgElement=this.querySelector("img"),this._imgElement?this._imgElement.addEventListener("click",this._onImageClick):console.warn("No <img> element found in <qti-select-point-interaction>")}disconnectedCallback(){super.disconnectedCallback(),this._imgElement&&this._imgElement.removeEventListener("click",this._onImageClick)}};j.styles=[po`
|
|
623
623
|
:host {
|
|
624
624
|
display: block;
|
|
625
625
|
}
|
|
@@ -627,7 +627,7 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
627
627
|
display: block;
|
|
628
628
|
position: relative;
|
|
629
629
|
}
|
|
630
|
-
`],
|
|
630
|
+
`],n([cr({type:Number,attribute:"max-choices"})],j.prototype,"maxChoices",2),n([cr({type:Number,attribute:"min-choices"})],j.prototype,"minChoices",2),n([mo()],j.prototype,"_points",2),j=n([uo("qti-select-point-interaction")],j);import{css as go,html as Ze,nothing as Mt}from"lit";import{customElement as bo,property as Te,query as pr}from"lit/decorators.js";var C=class extends u{constructor(){super();this._value=0;this.stepLabel=!1;this.reverse=!1;this._handleDisabledChange=(e,t)=>{};this._handleReadonlyChange=(e,t)=>{};this.csLive=getComputedStyle(this)}set min(e){this._min=e,this._value=e,this.style.setProperty("--min",`${this._min}`)}get min(){return this._min}set max(e){this._max=e,this.style.setProperty("--max",`${this._max}`)}get max(){return this._max}set step(e){this._step=e,this.style.setProperty("--step",`${this._step}`)}get step(){return this._step}reset(){}validate(){return!0}get value(){return this._value.toString()}set value(e){if(!isNaN(parseInt(e.toString())))this._value=parseInt(e.toString());else throw new Error("Value must be a number")}set response(e){if(Array.isArray(e)){console.error("QtiSliderInteraction: response is an array, but should be a single value");return}let t=parseInt(e);if(Number.isNaN(t)){console.error("QtiSliderInteraction: response is not a number");return}this._value=t}render(){this._value<this.min&&(this._value=this.min),this._value>this.max&&(this._value=this.max);let e=(this._value-this.min)/(this.max-this.min)*100;return this.style.setProperty("--value-percentage",`${e}%`),this.setAttribute("aria-valuenow",this.value.toString()),Ze`<slot name="prompt"></slot>
|
|
631
631
|
<div id="slider" part="slider">
|
|
632
632
|
${this.csLive.getPropertyValue("--show-bounds")=="true"?Ze`<div id="bounds" part="bounds">
|
|
633
633
|
<div>${this._min}</div>
|
|
@@ -639,49 +639,49 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
639
639
|
${this.csLive.getPropertyValue("--show-value")=="true"?Ze`<div id="value" part="value">${this.value}</div>`:Mt}
|
|
640
640
|
</div>
|
|
641
641
|
</div>
|
|
642
|
-
</div>`}connectedCallback(){super.connectedCallback(),this.step=1,this.setAttribute("tabindex","0"),this.setAttribute("role","slider")}_onTouchMove(e){let t=
|
|
642
|
+
</div>`}connectedCallback(){super.connectedCallback(),this.step=1,this.setAttribute("tabindex","0"),this.setAttribute("role","slider")}_onTouchMove(e){let t=a=>{let{x:l}=this.getPositionFromEvent(a),p=l-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(p),a.stopPropagation()},r=()=>{document.removeEventListener("touchmove",t),document.removeEventListener("touchend",r),this.saveResponse(this.value.toString())};document.addEventListener("touchmove",t),document.addEventListener("touchend",r);let{x:i}=this.getPositionFromEvent(e),o=i-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(o),e.stopPropagation()}_onMouseDown(e){let t=o=>{let a=o.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(a),o.preventDefault(),o.stopPropagation()},r=()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",r),this.saveResponse(this.value.toString())};document.addEventListener("mousemove",t),document.addEventListener("mouseup",r);let i=e.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(i),e.preventDefault(),e.stopPropagation()}calculateValue(e){let t=this.min+(this.max-this.min)*e/this._rail.getBoundingClientRect().width,r=this.min+Math.round((t-this.min)/this._step)*this._step;this._value=r}getPositionFromEvent(e){let t;if(e.type=="touchstart"||e.type=="touchmove"||e.type=="touchend"||e.type=="touchcancel"){let r=typeof e.originalEvent=="undefined"?e:e.originalEvent,i=r.touches[0]||r.changedTouches[0];t={x:i.pageX,y:i.pageY}}else(e.type=="mousedown"||e.type=="mouseup"||e.type=="mousemove"||e.type=="mouseover"||e.type=="mouseout"||e.type=="mouseenter"||e.type=="mouseleave")&&(t={x:e.clientX,y:e.clientY});return t}};C.styles=[go``],n([pr("#knob")],C.prototype,"_knob",2),n([pr("#rail")],C.prototype,"_rail",2),n([Te({type:Boolean,attribute:"step-label"})],C.prototype,"stepLabel",2),n([Te({type:Boolean})],C.prototype,"reverse",2),n([Te({type:Number,attribute:"lower-bound"})],C.prototype,"min",1),n([Te({type:Number,attribute:"upper-bound"})],C.prototype,"max",1),n([Te({type:Number,attribute:"step"})],C.prototype,"step",1),n([x("disabled",{waitUntilFirstUpdate:!0})],C.prototype,"_handleDisabledChange",2),n([x("readonly",{waitUntilFirstUpdate:!0})],C.prototype,"_handleReadonlyChange",2),C=n([bo("qti-slider-interaction")],C);import{consume as vo}from"@lit/context";import{LitElement as yo,html as xo}from"lit";import{customElement as Eo,state as Co}from"lit/decorators.js";var Se=class extends yo{render(){return xo`<slot @slotchange=${this.handleSlotChange}></slot>`}handleSlotChange(s){var t,r,i;let e=Array.from((r=(t=this.firstElementChild)==null?void 0:t.childNodes)!=null?r:[]).find(o=>o.nodeType===Node.COMMENT_NODE);try{this.operatorFunction=new Function("context","fn","item",(i=e.textContent)!=null?i:"")}catch(o){console.error("custom-operator contains invalid javascript code",o)}}calculate(){let s={variable:t=>{var r,i,o;return(o=(i=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:i.value)!=null?o:""},correct:t=>{var r,i,o;return(o=(i=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:i.correctResponse)!=null?o:""}},e={getVariable:t=>{var r;return(r=this._context)==null?void 0:r.variables.find(i=>i.identifier===t)},updateOutcomeVariable:(t,r)=>{this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:t,value:r}}))},updateResponseVariable:(t,r)=>{this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:t,response:r}}))}};return this.operatorFunction(this._context,s,e)}};n([vo({context:E,subscribe:!0}),Co()],Se.prototype,"_context",2),Se=n([Eo("qti-custom-operator")],Se);import{LitElement as qo,css as wo,html as To}from"lit";import{customElement as So}from"lit/decorators.js";var ke=class extends qo{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-hotspot",{bubbles:!0,cancelable:!1,composed:!0}))}render(){return To` <slot name="qti-gap-img"></slot> `}};ke.styles=wo`
|
|
643
643
|
:host {
|
|
644
644
|
display: flex;
|
|
645
645
|
user-select: none;
|
|
646
646
|
position: absolute;
|
|
647
647
|
}
|
|
648
|
-
`,ke=
|
|
648
|
+
`,ke=n([So("qti-associable-hotspot")],ke);import{css as ko,html as Mo,LitElement as _o}from"lit";import{customElement as Ro,property as Lo}from"lit/decorators.js";var te=class extends _o{constructor(){super(...arguments);this.tabindex=0}render(){return Mo` <slot name="qti-gap-text"></slot>`}};te.styles=ko`
|
|
649
649
|
:host {
|
|
650
650
|
display: flex;
|
|
651
651
|
user-select: none;
|
|
652
652
|
}
|
|
653
|
-
`,
|
|
653
|
+
`,n([Lo({type:Number,reflect:!0})],te.prototype,"tabindex",2),te=n([Ro("qti-gap")],te);import{css as Ao,LitElement as Do}from"lit";import{customElement as Vo,property as Ho}from"lit/decorators.js";var re=class extends Do{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){this.setAttribute("slot","qti-gap-img")}};re.styles=Ao`
|
|
654
654
|
:host {
|
|
655
655
|
display: flex;
|
|
656
656
|
user-select: none;
|
|
657
657
|
}
|
|
658
|
-
`,
|
|
658
|
+
`,n([Ho({type:Number,reflect:!0})],re.prototype,"tabindex",2),re=n([Vo("qti-gap-img")],re);import{css as No,html as $o,LitElement as Io}from"lit";import{customElement as Po,property as Oo}from"lit/decorators.js";var ie=class extends _(Io,"qti-gap-text"){constructor(){super(...arguments);this.tabindex=0}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-gap-text")}render(){return $o`<slot></slot>`}};ie.styles=No`
|
|
659
659
|
:host {
|
|
660
660
|
display: inline-flex;
|
|
661
661
|
user-select: none;
|
|
662
662
|
}
|
|
663
|
-
`,
|
|
663
|
+
`,n([Oo({type:Number,reflect:!0})],ie.prototype,"tabindex",2),ie=n([Po("qti-gap-text")],ie);import{css as Uo,LitElement as Fo}from"lit";import{customElement as Bo,property as Xo}from"lit/decorators.js";var se=class extends _(Fo,"qti-hotspot-choice"){};se.styles=Uo`
|
|
664
664
|
:host {
|
|
665
665
|
display: flex;
|
|
666
666
|
user-select: none;
|
|
667
667
|
position: absolute;
|
|
668
668
|
}
|
|
669
|
-
`,
|
|
670
|
-
<slot></slot> `}};Me.styles=
|
|
669
|
+
`,n([Xo({attribute:"aria-ordervalue",type:Number,reflect:!0})],se.prototype,"order",2),se=n([Bo("qti-hotspot-choice")],se);import{css as Yo,html as jo,LitElement as zo}from"lit";import{customElement as Ko}from"lit/decorators.js";var Me=class extends _(zo,"qti-hottext"){render(){return jo`<div part="ch"><div part="cha"></div></div>
|
|
670
|
+
<slot></slot> `}};Me.styles=Yo`
|
|
671
671
|
:host {
|
|
672
672
|
display: flex;
|
|
673
673
|
user-select: none;
|
|
674
674
|
}
|
|
675
|
-
`,Me=
|
|
675
|
+
`,Me=n([Ko("qti-hottext")],Me);import{css as Wo,html as Zo,LitElement as Jo}from"lit";import{customElement as Go,property as Qo}from"lit/decorators.js";var _e=class extends Jo{static get styles(){return[Wo`
|
|
676
676
|
:host {
|
|
677
677
|
display: block;
|
|
678
678
|
cursor: pointer;
|
|
679
679
|
}
|
|
680
|
-
`]}connectedCallback(){super.connectedCallback(),this.addEventListener("click",this._onSelectInlineChoice),this.dispatchEvent(new CustomEvent("qti-inline-choice-register",{bubbles:!0,cancelable:!1,composed:!0}))}disconnectedCallback(){this.removeEventListener("click",this._onSelectInlineChoice)}render(){return
|
|
680
|
+
`]}connectedCallback(){super.connectedCallback(),this.addEventListener("click",this._onSelectInlineChoice),this.dispatchEvent(new CustomEvent("qti-inline-choice-register",{bubbles:!0,cancelable:!1,composed:!0}))}disconnectedCallback(){this.removeEventListener("click",this._onSelectInlineChoice)}render(){return Zo` <slot></slot> `}_onSelectInlineChoice(){this.dispatchEvent(new CustomEvent("qti-inline-choice-select",{bubbles:!0,cancelable:!1,composed:!0,detail:{identifier:this.identifier}}))}};n([Qo({type:String})],_e.prototype,"identifier",2),_e=n([Go("qti-inline-choice")],_e);import{css as en,html as dr,LitElement as tn,nothing as rn}from"lit";import{customElement as sn,property as on}from"lit/decorators.js";var oe=class extends _(tn,"qti-simple-choice"){get checked(){return this.internals.states.has("--checked")}render(){return dr`<div part="ch">
|
|
681
681
|
<div part="cha"></div>
|
|
682
682
|
</div>
|
|
683
|
-
${this.marker?
|
|
684
|
-
<slot part="slot"></slot> `}};oe.styles=
|
|
683
|
+
${this.marker?dr`<div id="label">${this.marker}</div>`:rn}
|
|
684
|
+
<slot part="slot"></slot> `}};oe.styles=en`
|
|
685
685
|
:host {
|
|
686
686
|
display: flex;
|
|
687
687
|
align-items: center;
|
|
@@ -698,5 +698,5 @@ import{a as Rt}from"../chunk-YY52I6U7.js";import{a as b,b as C,c as a}from"../ch
|
|
|
698
698
|
align-items: center;
|
|
699
699
|
justify-content: center;
|
|
700
700
|
}
|
|
701
|
-
`,
|
|
702
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1ydWxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWFwaS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJvcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZmxpcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHByb3ZpZGUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHMsIE91dGNvbWVDaGFuZ2VkRGV0YWlscyB9IGZyb20gJy4uL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVWYWx1ZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUsIFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2snO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFF0aVJlc3BvbnNlUHJvY2Vzc2luZyB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCwgaXRlbUNvbnRleHRWYXJpYWJsZXMgfSBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICBwcml2YXRlIF9jb250ZXh0OiBJdGVtQ29udGV4dCA9IHtcbiAgICBpZGVudGlmaWVyOiB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgIHZhcmlhYmxlczogaXRlbUNvbnRleHRWYXJpYWJsZXNcbiAgfTtcblxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh7XG4gICAgICBpZGVudGlmaWVyOiB2LmlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgIHR5cGU6IHYudHlwZSxcbiAgICAgIC8vIGFkZCBleHRlcm5hbHNjb3JlZCwgYSBmaXhlZCBwcm9wIHRvIHRoZSB0ZXN0LCBzbyB0aGUgdGVzdGNvbnRleHQgY2FuIHJlYWQgYW5kIGRlY2lkZSBob3cgdG8gc2NvcmUgdGhpcyBpdGVtXG4gICAgICAuLi4odi50eXBlID09PSAnb3V0Y29tZScgJiYgdi5pZGVudGlmaWVyID09PSAnU0NPUkUnXG4gICAgICAgID8geyBleHRlcm5hbFNjb3JlZDogKHYgYXMgT3V0Y29tZVZhcmlhYmxlKS5leHRlcm5hbFNjb3JlZCB9XG4gICAgICAgIDoge30pXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YXJpYWJsZXModmFsdWU6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5zb21lKHYgPT4gISgnaWRlbnRpZmllcicgaW4gdikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhcmlhYmxlcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgVmFyaWFibGVEZWNsYXJhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQudmFsdWUgPSB2YXJpYWJsZS52YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnZhbHVlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgZSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KHByb3RvOiBFbGVtQ2xhc3MsIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+KSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KCdpdGVtJyk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLnBhdGgocGF0aCkuaHRtbERvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHsgICAgICBcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN0aW11bHVzUmVmLmFwcGVuZCguLi5lbGVtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZic6IFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2V4dGVybmFsLXNjb3JlZCcgfSkgZXh0ZXJuYWxTY29yZWQ6ICdodW1hbicgfCAnZXh0ZXJuYWxNYWNoaW5lJyB8IG51bGwgPSBudWxsO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGU6IE91dGNvbWVWYXJpYWJsZSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5LFxuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICB0eXBlOiAnb3V0Y29tZScsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGludGVycG9sYXRpb25UYWJsZTogdGhpcy5pbnRlcnBvbGF0aW9uVGFibGUsXG4gICAgICBleHRlcm5hbFNjb3JlZDogdGhpcy5leHRlcm5hbFNjb3JlZFxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IG91dGNvbWVWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nOiBRdGlPdXRjb21lRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmFsdWVzKHZhcmlhYmxlOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4pIHtcbiAgICBjb25zdCBodG1sVmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1kZWZhdWx0LXZhbHVlID4gcXRpLXZhbHVlJykpO1xuXG4gICAgaWYgKGh0bWxWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gaHRtbFZhbHVlcy5tYXAobiA9PiBuLmlubmVySFRNTC50cmltKCkpO1xuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzWzBdO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJzogUXRpVmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgSXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLi9pbnRlcm5hbC91dGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlGZWVkYmFjayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Nob3ctaGlkZScgfSlcbiAgcHJvdGVjdGVkIHNob3dIaWRlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdvdXRjb21lLWlkZW50aWZpZXInIH0pXG4gIHB1YmxpYyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwcm90ZWN0ZWQgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2hvd1N0YXR1czogc3RyaW5nO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gKHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtKS5nZXRPdXRjb21lKG91dGNvbWVJZGVudGlmaWVyKTtcblxuICAgIGlmICh0aGlzLm91dGNvbWVJZGVudGlmaWVyICE9PSBvdXRjb21lSWRlbnRpZmllciB8fCAhb3V0Y29tZVZhcmlhYmxlKSByZXR1cm47XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRjb21lVmFyaWFibGUudmFsdWUpKSB7XG4gICAgICBpc0ZvdW5kID0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlLmluY2x1ZGVzKHRoaXMuaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRm91bmQgPVxuICAgICAgICAoIUlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAhSXNOdWxsT3JVbmRlZmluZWQob3V0Y29tZVZhcmlhYmxlPy52YWx1ZSkgJiZcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPT09IG91dGNvbWVWYXJpYWJsZS52YWx1ZSkgfHxcbiAgICAgICAgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZGJhY2soaXNGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikgeyAgICBcbiAgICB0aGlzLnNob3dTdGF0dXMgPSAodmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ3Nob3cnKSB8fCAoIXZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdoaWRlJykgPyAnb24nIDogJ29mZic7ICAgIFxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoMC4xKS5yZXBsYWNlKC9cXGQvZywgJycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0ID0gKG51bWJlcjogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gIC8vIGNoZWNrIGlmIHR5cGUgaXMgc3RyaW5nXG4gIGlmICh0eXBlb2YgbnVtYmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgY29uc3QgZFNlcCA9IGRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgaWYgKGRTZXAgPT09ICcuJykge1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKGRTZXAsICcuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBJc051bGxPclVuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWlubGluZScpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tJbmxpbmUgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWlubGluZSc6IFF0aUZlZWRiYWNrSW5saW5lO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbW9kYWwtZmVlZGJhY2snKVxuZXhwb3J0IGNsYXNzIFF0aU1vZGFsRmVlZGJhY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1vZGFsLWZlZWRiYWNrJzogUXRpTW9kYWxGZWVkYmFjaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcm93cyA9IDU7XG5cbiAgLyoqIGV4cGVjdGVkIGxlbmd0aCBpcyBtYXBwZWQgdG8gdGhlIHByb3BlcnR5IG1heGxlbmd0aCBvbiB0aGUgdGV4dGFyZWEgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgLyoqIHRleHQgYXBwZWFyaW5nIGluIHRoZSBleHRlbmRlZC10ZXh0LW50ZXJhY3Rpb24gaWYgaXQgaXMgZW1wdHkgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgbGV0IHJvd3NTZXQgPSBmYWxzZTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMtJykpIHtcbiAgICAgICAgY29uc3QgbnJSb3dzID0gY2xhc3NOYW1lLnJlcGxhY2UoJ3F0aS1oZWlnaHQtbGluZXMtJywgJycpO1xuICAgICAgICB0aGlzLl9yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgcm93c1NldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSWYgbm8gcXRpLWhlaWdodC1saW5lcyBjbGFzcyBpcyBzZXQsIGNhbGN1bGF0ZSByb3dzIGJhc2VkIG9uIGV4cGVjdGVkTGVuZ3RoXG4gICAgaWYgKCFyb3dzU2V0ICYmIHRoaXMuZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVzdGltYXRlZFJvd3MgPSBNYXRoLmNlaWwodGhpcy5leHBlY3RlZExlbmd0aCAvIDUwKTsgLy8gICc1MCcgYmFzZWQgb24gYW4gZXN0aW1hdGUgZm9yIGNoYXJhY3RlcnMgcGVyIHJvd1xuICAgICAgdGhpcy5fcm93cyA9IGVzdGltYXRlZFJvd3M7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaW5pdGlhbGx5XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgY29uc3QgcGF0dGVyblNvdXJjZSA9XG4gICAgICAgIHRoaXMucGF0dGVybk1hc2suc3RhcnRzV2l0aCgnXicpICYmIHRoaXMucGF0dGVybk1hc2suZW5kc1dpdGgoJyQnKSA/IHRoaXMucGF0dGVybk1hc2sgOiBgXiR7dGhpcy5wYXR0ZXJuTWFza30kYDtcblxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblNvdXJjZSk7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpICYmIHBhdHRlcm4udGVzdCh0ZXh0YXJlYS52YWx1ZSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRleHRhcmVhLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiJHs1MDAwfVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgcm93cz1cIiR7dGhpcy5fcm93c31cIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAgIC52YWx1ZT0ke3RoaXMuX3ZhbHVlfVxuICAgICAgPjwvdGV4dGFyZWE+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBJSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQgPSB0cnVlOyAvLyBFbmFibGUgZm9ybSBhc3NvY2lhdGlvblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllciA9ICcnO1xuICAvKiogZGlzYWJsZWQgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiByZWFkb25seSBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIF9jb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIHByb3RlY3RlZCBfaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgfVxuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW107XG4gIGFic3RyYWN0IHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgfVxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaWYgdGhlIGlucHV0IGlzIHZhbGlkXG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpOyAvLyBDbGVhciB0aGUgY3VzdG9tIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7IC8vIFNldCBjdXN0b20gbWVzc2FnZSBvbmx5IGlmIGludmFsaWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD0kezEwMDB9XG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb3JyZWN0XCI+JHt0aGlzLl9jb3JyZWN0UmVzcG9uc2V9PC9kaXY+XG4gICAgYDtcbiAgfVxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuICBbcGFydD0nY29ycmVjdCddIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEuMXJlbTtcbiAgICBtaW4td2lkdGg6IDEuMXJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyLjNyZW07XG4gICAgbWluLXdpZHRoOiAyLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMy4zcmVtO1xuICAgIG1pbi13aWR0aDogMy4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQuMnJlbTtcbiAgICBtaW4td2lkdGg6IDQuMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA2LjZyZW07XG4gICAgbWluLXdpZHRoOiA2LjZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDhyZW07XG4gICAgbWluLXdpZHRoOiA4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxMnJlbTtcbiAgICBtaW4td2lkdGg6IDEycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxN3JlbTtcbiAgICBtaW4td2lkdGg6IDE3cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBtaW4td2lkdGg6IDIwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyNHJlbTtcbiAgICBtaW4td2lkdGg6IDI0cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyOHJlbTtcbiAgICBtaW4td2lkdGg6IDI4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzMnJlbTtcbiAgICBtaW4td2lkdGg6IDMycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00NSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzNnJlbTtcbiAgICBtaW4td2lkdGg6IDM2cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC01MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0MHJlbTtcbiAgICBtaW4td2lkdGg6IDQwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC03MikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA1N3JlbTtcbiAgICBtaW4td2lkdGg6IDU3cmVtO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90dGV4dCcpIHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nLCAnJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYDxzbG90Pjwvc2xvdD5gO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dC1pbnRlcmFjdGlvbic6IFF0aUhvdHRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbmltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gJy4uL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IHR5cGUgQ2hvaWNlID0gSFRNTEVsZW1lbnQgJiBDaG9pY2VJbnRlcmZhY2UgJiB7IGludGVybmFsczogRWxlbWVudEludGVybmFscyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZXNJbnRlcmZhY2UgZXh0ZW5kcyBJSW50ZXJhY3Rpb24ge1xuICBfY2hvaWNlRWxlbWVudHM6IEFycmF5PENob2ljZT47XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHB1YmxpYyBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcXVlcnkoJyN2YWxpZGF0aW9uTWVzc2FnZScpXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtaW5DaG9pY2VzID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1heENob2ljZXMgPSAxO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlKF9vbGRWYWx1ZTogbnVtYmVyLCBfbmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgfVxuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgICB9O1xuXG4gICAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IChjaG9pY2UucmVhZG9ubHkgPSByZWFkb25seSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZS5qb2luKCcsJykgOiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1pbmcgdGhpcy52YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdGhpcy5fdmFsdWUuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGlzLnZhbHVlIGlzIG5vdCBhbiBhcnJheVxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGlmIChyZXNwb25zZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGg7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgdmFsaWRpdHlNZXNzYWdlID0gJyc7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzICE9PSAwICYmIHNlbGVjdGVkQ291bnQgPiB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWF4U2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBjYW4gc2VsZWN0IGF0IG1vc3QgJHt0aGlzLm1heENob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA8IHRoaXMubWluQ2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5taW5TZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0ICR7dGhpcy5taW5DaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoXG4gICAgICAgICAgaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogdHJ1ZSB9LFxuICAgICAgICAgIHZhbGlkaXR5TWVzc2FnZSxcbiAgICAgICAgICBzZWxlY3RlZENob2ljZXNbc2VsZWN0ZWRDb3VudCAtIDFdIHx8IHRoaXMuX2Nob2ljZUVsZW1lbnRzWzBdIHx8IHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX2ludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIGNob2ljZUVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG5cbiAgICAgIFxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMucHVzaChjaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gY2hvaWNlICE9PSBjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRlcm1pbmVJbnB1dFR5cGUoKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQ6IENob2ljZSkge1xuICAgICAgLy8gY2hvaWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94Jyk7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCc7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5zdGF0ZXMuYWRkKGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUpXG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmFyaWFSZWFkT25seSA9IHRoaXMucmVhZG9ubHkgPT0gdHJ1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9Pikge1xuICAgICAgdGhpcy5fdG9nZ2xlQ2hvaWNlQ2hlY2tlZChldmVudC50YXJnZXQgYXMgQ2hvaWNlKTtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICAgIGlmIChjaG9pY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UsIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChjaG9pY2UuaW50ZXJuYWxzPy5zdGF0ZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAndHJ1ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8ICcnIDogc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBjaG9pY2UgZWxlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZSA6IFt0aGlzLl92YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGlzU2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUNob2ljZUludGVyYWN0aW9uXG4gIGV4dGVuZHMgVm9jYWJ1bGFyeU1peGluKFxuICAgIFNodWZmbGVNaXhpbihDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktc2ltcGxlLWNob2ljZScpLCAncXRpLXNpbXBsZS1jaG9pY2UnKSxcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnXG4gIClcbiAgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlXG57XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCIgaWQ9XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBTaHVmZmxlSW50ZXJmYWNlIHt9XG5leHBvcnQgY29uc3QgU2h1ZmZsZU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2h1ZmZsZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9zaHVmZmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGNvbnZlcnRlcjogc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBzZXQgc2h1ZmZsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zaHVmZmxlO1xuICAgICAgdGhpcy5fc2h1ZmZsZSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoJ3NodWZmbGUnLCBvbGRWYWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IHNodWZmbGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc2h1ZmZsZTtcbiAgICB9XG5cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAvLyBDYWxsIF9yZXNldFNodWZmbGVDaG9pY2VzIGluaXRpYWxseSB0byBzZXQgdGhlIENTUyBvcmRlciB0byBpbml0aWFsLlxuICAgICAgLy8gSWYgc2h1ZmZsZSBpcyB0cnVlLCBfc2h1ZmZsZUNob2ljZXMgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIHNldHRlci5cbiAgICAgIGlmICh0aGlzLnNodWZmbGUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oc2VsZWN0b3IpKTtcbiAgICAgIGNvbnN0IGZpeGVkRWxlbWVudHM6IEFycmF5PHsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICAgIGNvbnN0IG5vbkZpeGVkRWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xuXG4gICAgICAvLyBTZXBhcmF0ZSBmaXhlZCBhbmQgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBmaXhlZEVsZW1lbnRzLnB1c2goeyBlbGVtZW50OiBjaG9pY2UsIGluZGV4OiBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub25GaXhlZEVsZW1lbnRzLnB1c2goY2hvaWNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSAxIG9yIGZld2VyIG5vbi1maXhlZCBlbGVtZW50cywgdGhyb3cgYW4gZXJyb3IgKG5vIHNodWZmbGUgcG9zc2libGUpXG4gICAgICBpZiAobm9uRml4ZWRFbGVtZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NodWZmbGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBmZXdlciB0aGFuIDIgbm9uLWZpeGVkIGVsZW1lbnRzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBpc1NodWZmbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEwOyAvLyBNYXggYXR0ZW1wdHMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuXG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcmRlciBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3Qgb3JpZ2luYWxPcmRlciA9IFsuLi5ub25GaXhlZEVsZW1lbnRzXTtcblxuICAgICAgLy8gU2h1ZmZsZSB1bnRpbCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCBvciBtYXhBdHRlbXB0cyBpcyByZWFjaGVkXG4gICAgICB3aGlsZSAoIWlzU2h1ZmZsZWQgJiYgYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF0dGVtcHQrKztcblxuICAgICAgICAvLyBTaHVmZmxlIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gbm9uRml4ZWRFbGVtZW50cy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIFtub25GaXhlZEVsZW1lbnRzW2ldLCBub25GaXhlZEVsZW1lbnRzW2pdXSA9IFtub25GaXhlZEVsZW1lbnRzW2pdLCBub25GaXhlZEVsZW1lbnRzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzaHVmZmxlZCByZXN1bHQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIG9yZGVyXG4gICAgICAgIGlzU2h1ZmZsZWQgPSAhbm9uRml4ZWRFbGVtZW50cy5ldmVyeSgoY2hvaWNlLCBpbmRleCkgPT4gY2hvaWNlID09PSBvcmlnaW5hbE9yZGVyW2luZGV4XSk7XG5cbiAgICAgICAgaWYgKGlzU2h1ZmZsZWQpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU2h1ZmZsZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2h1ZmZsZSB0aGUgY2hvaWNlcyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIG9yZGVyIHRvIGVhY2ggZWxlbWVudFxuICAgICAgbGV0IG9yZGVyID0gMTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBub25GaXhlZENob2ljZSA9IG5vbkZpeGVkRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgICBub25GaXhlZENob2ljZSEuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRTaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsICdpbml0aWFsJyk7IC8vIGNob2ljZS5zdHlsZS5vcmRlciA9ICdpbml0aWFsJztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2h1ZmZsZUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUO1xufTtcblxuY29uc3Qgc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyID0ge1xuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIH0sXG4gIHRvQXR0cmlidXRlKHZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG59O1xuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG50eXBlIExhYmVsVHlwZSA9ICdxdGktbGFiZWxzLWRlY2ltYWwnIHwgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnIHwgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xudHlwZSBMYWJlbFN1ZmZpeFR5cGUgPSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJyB8ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyc7XG5cbmRlY2xhcmUgY2xhc3MgVm9jYWJ1bGFyeUludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgVm9jYWJ1bGFyeU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgVm9jYWJ1bGFyeUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9jbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2FsbExhYmVscyA9IFsncXRpLWxhYmVscy1kZWNpbWFsJywgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnLCAncXRpLWxhYmVscy11cHBlci1hbHBoYSddO1xuICAgIHByaXZhdGUgX2FsbExhYmVsU3VmZml4ZXMgPSBbJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcsICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyddIGFzIExhYmVsU3VmZml4VHlwZVtdO1xuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlXG4gICAgfSlcbiAgICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2NsYXNzZXMuam9pbignICcpO1xuICAgICAgdGhpcy5fY2xhc3NlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgLy8gdGhpcy5yZXF1ZXN0VXBkYXRlKCdjbGFzcycsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fY2xhc3Nlcz8uam9pbignICcpIHx8ICcnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzaHVmZmxlJykpIHtcbiAgICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkTGFiZWxzKCkge1xuICAgICAgY29uc3QgY2xhc3NDb250YWluc0xhYmVsID0gdGhpcy5fY2xhc3Nlcy5zb21lKFxuICAgICAgICBjbHMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGNscykgfHwgdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjbHMgYXMgTGFiZWxTdWZmaXhUeXBlKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKCt2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgaWYgKGNsYXNzQ29udGFpbnNMYWJlbCkge1xuICAgICAgICBjb25zdCBjaG9pY2VFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoYyA9PiBjIGFzIFF0aVNpbXBsZUNob2ljZSk7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBjaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBlbDogY2hvaWNlLCBvcmRlcjogaXNOdW1iZXIoY2hvaWNlLnN0eWxlLm9yZGVyKSA/ICtjaG9pY2Uuc3R5bGUub3JkZXIgOiBpbmRleCArIDEgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcilcbiAgICAgICAgICAubWFwKGNob2ljZSA9PiBjaG9pY2UuZWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAoY2hvaWNlc1tpXSBhcyBRdGlTaW1wbGVDaG9pY2UpLm1hcmtlciA9IHRoaXMuX2dldExhYmVsKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9nZXRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgICBsZXQgbGFzdExhYmVsID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoYykpLnBvcCgpIGFzIExhYmVsVHlwZTtcbiAgICAgIGNvbnN0IGxhc3RMYWJlbFN1ZmZpeCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjIGFzIExhYmVsU3VmZml4VHlwZSkpLnBvcCgpO1xuXG4gICAgICBpZiAoIWxhc3RMYWJlbCAmJiBsYXN0TGFiZWxTdWZmaXgpIHtcbiAgICAgICAgLy8gYSBzdWZmaXggd2l0aG91dCBhIGxhYmVsIGlzIHN0cmFuZ2Ugc28gYWRkIHF0aS1sYWJlbHMtdXBwZXItYWxwaGFcbiAgICAgICAgbGFzdExhYmVsID0gJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xuICAgICAgfVxuICAgICAgbGV0IGxhYmVsID0gJyc7XG4gICAgICBzd2l0Y2ggKGxhc3RMYWJlbCkge1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWRlY2ltYWwnOlxuICAgICAgICAgIGxhYmVsID0gYCR7aW5kZXh9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1sb3dlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJykge1xuICAgICAgICBsYWJlbCArPSAnLic7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJykge1xuICAgICAgICBsYWJlbCArPSBgKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuICB9XG4gIHJldHVybiBWb2NhYnVsYXJ5RWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxWb2NhYnVsYXJ5SW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tcXRpLWdhcC1zaXplKTtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gIH1cblxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1jaG9pY2UpIHtcbiAgICBmbGV4OiAwIDBcbiAgICAgIGNhbGMoKDEwMCUgLSAodmFyKC0tcXRpLWdhcC1zaXplKSAqIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSkgLyB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkgIWltcG9ydGFudDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDE7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMikgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDI7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTMpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAzO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy00KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNDtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDU7XG4gIH1cbiAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBsb2dpYyA9IG5ldyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvcigpO1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgICBsb2dpYy5wcm9jZXNzKHJ1bGVzKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJzogUXRpT3V0Y29tZVByb2Nlc3Npbmc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yIHtcbiAgcHVibGljIHByb2Nlc3MocnVsZXM6IFF0aVJ1bGVCYXNlW10pIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBtYXBSZXNwb25zZSwgbWFwUmVzcG9uc2VQb2ludCwgbWF0Y2hDb3JyZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncyc7XG5pbXBvcnQgeyB0eXBlIFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykpIHtcbiAgICAgIGNvbnN0IHNwbGl0dGVkVGVtcGxhdGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykhLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBzcGxpdHRlZFRlbXBsYXRlTmFtZVtzcGxpdHRlZFRlbXBsYXRlTmFtZS5sZW5ndGggLSAxXS5yZXBsYWNlKCcueG1sJywgJycpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN3aXRjaCAodGVtcGxhdGVOYW1lKSB7XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZSc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlX3BvaW50Jzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2VQb2ludCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hdGNoX2NvcnJlY3QnOlxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWF0Y2hDb3JyZWN0KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmcmFnbWVudEZyb21TdHJpbmcoc3RySFRNTDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0ckhUTUwpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJzogUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG1hdGNoQ29ycmVjdCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLW1hdGNoPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgICA8cXRpLWNvcnJlY3QgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktY29ycmVjdD5cbiAgICAgIDwvcXRpLW1hdGNoPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MTwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wLjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+IDwvcXRpLW1hcC1yZXNwb25zZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlUG9pbnQgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UtcG9pbnQgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktbWFwLXJlc3BvbnNlLXBvaW50PlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuIiwgImltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJ0BjaXRvbGFiL3F0aS1jb21wb25lbnRzL3F0aS1jb21wb25lbnRzJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuLyoqXG4gKiBUaGUgbG9va3VwT3V0Y29tZVZhbHVlIHJ1bGUgc2V0cyB0aGUgdmFsdWUgb2YgYW4gb3V0Y29tZSB2YXJpYWJsZSB0byB0aGUgdmFsdWUgb2J0YWluZWRcbiAqIGJ5IGxvb2tpbmcgdXAgdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24gaW4gdGhlIGxvb2t1cFRhYmxlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIG91dGNvbWUncyBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIGdldCBjaGlsZEV4cHJlc3Npb24oKTogUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUpIHtcbiAgICAgIHZhbHVlID0gb3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZS5nZXQocGFyc2VJbnQodGhpcy5jaGlsZEV4cHJlc3Npb24uY2FsY3VsYXRlKCkpKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignbG9va3VwT3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJywgUXRpTG9va3VwT3V0Y29tZVZhbHVlKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJzogUXRpTG9va3VwT3V0Y29tZVZhbHVlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1bGUnKVxuZXhwb3J0IGNsYXNzIFF0aVJ1bGUgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpUnVsZUJhc2Uge1xuICBwcm9jZXNzKCk6IGFueTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1bGUnOiBRdGlSdWxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlQ29uZGl0aW9uIGV4dGVuZHMgUXRpUnVsZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGJyYW5jaGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aUV4cHJlc3Npb248YW55PltdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG5cbiAgICAgIGlmIChicmFuY2guY2FsY3VsYXRlKCkpIHtcbiAgICAgICAgKGJyYW5jaCBhcyB1bmtub3duIGFzIFF0aVJ1bGUpLnByb2Nlc3MoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWNvbmRpdGlvbicsIFF0aVJlc3BvbnNlQ29uZGl0aW9uKTtcbiIsICJpbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgb3V0Y29tZUlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlKGV4cHJlc3Npb24pO1xuICAgIGNvbnN0IHZhbHVlID0gcnVsZS5wcm9jZXNzKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWUubWFwKCh2OiBzdHJpbmcpID0+IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHYpKVxuICAgICAgICAgICAgOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlPFQ+IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb246IFF0aUV4cHJlc3Npb25CYXNlPFQ+KSB7fVxuXG4gIHByb2Nlc3MoKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbiA/IHRoaXMuZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSA6IG51bGw7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdzZXRPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIFF0aVNldE91dGNvbWVWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgc3ViUnVsZXMgPSB0aGlzLmdldFN1YlJ1bGVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJSdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViUnVsZSA9IHN1YlJ1bGVzW2ldO1xuICAgICAgc3ViUnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UnLCBRdGlSZXNwb25zZUVsc2UpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VJZiB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1pZic7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlSWYge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UtaWYnLCBRdGlSZXNwb25zZUVsc2VJZik7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi8uLi9xdGktcnVsZS9xdGktcnVsZSc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUVsc2UgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtZWxzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VFbHNlIHtcbiAgcHVibGljIG92ZXJyaWRlIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1pZicsIFF0aVJlc3BvbnNlSWYpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtO1xuICB9XG5cbiAgZ2V0VmFyaWFibGVzID0gKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W10gPT5cbiAgICAvLyBGSVhNRTogaWYgdGhpcyBpdHNlbGYgaXMgbXVsdGlwbGUsIHRoaXMgd2lsbCBuZXZlciBlbnRlciB0aGUgcXRpLW11bHRpcGxlIHN3aXRjaFxuICAgIC8vIFNlZSB0aGlzIGV4YW1wbGUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tLzFFZFRlY2gvcXRpLWV4YW1wbGVzL2Jsb2IvbWFzdGVyL3F0aXYzLWV4YW1wbGVzL3BhY2thZ2luZy9pdGVtcy9FeGFtcGxlMDUtZmVlZGJhY2tCbG9jay1hZGFwdGl2ZS54bWxcblxuICAgIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbilcbiAgICAgIC5tYXAoKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3F0aS1iYXNlLXZhbHVlJzoge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IGUuZ2V0QXR0cmlidXRlKCdiYXNlLXR5cGUnKSxcbiAgICAgICAgICAgICAgdmFsdWU6IGUudGV4dENvbnRlbnQudHJpbSgpLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLXZhcmlhYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5hc3Nlc3NtZW50SXRlbS5nZXRSZXNwb25zZShpZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoZSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgUXRpQW5kIH0gZnJvbSAnLi9xdGktYW5kJztcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWFuZCcsIFF0aUFuZCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFuZCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hbmQnOiBRdGlBbmQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlCYXNlVmFsdWUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlID0gJ3N0cmluZyc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0UmVzcG9uc2UoaWRlbnRpZmllcik7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmFzc2Vzc21lbnRJdGVtLmdldFJlc3BvbnNlKHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGNsYXNzIFF0aVByaW50ZWRWYXJpYWJsZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCBhc3Nlc3NtZW50SXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgY29uc3QgcmVzdWx0ID0gYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcikudmFsdWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gKHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKS52YWx1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXZhcmlhYmxlJywgUXRpVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJTVNwY2ksIE1vZHVsZVJlc29sdXRpb25Db25maWcsIFF0aVZhcmlhYmxlSlNPTiB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZGVjbGFyZSBjb25zdCByZXF1aXJlanM6IGFueTtcbmRlY2xhcmUgY29uc3QgZGVmaW5lOiBhbnk7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIGludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGNpOiBJTVNwY2k8dW5rbm93bj47XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvaW50ID0gbnVsbDsgLy8gUG9pbnQgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgbGFzdENsaWNrVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgcHJldmlvdXMgY2xpY2tcbiAgcHJpdmF0ZSBpc0RyYWdnYWJsZSA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZ2dhYmxlIGVsZW1lbnQgaXMgYWN0aXZlXG4gIHByaXZhdGUgZHJhZ1NvdXJjZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUaGUgc291cmNlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICBwcml2YXRlIGRyYWdDbG9uZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBDbG9uZSBvZiBkcmFnIHNvdXJjZSBmb3IgdmlzdWFsIGZlZWRiYWNrXG4gIHByaXZhdGUgdG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gRmxhZyBmb3IgdG91Y2hFbmQgZXZlbnRcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnIG9wZXJhdGlvbiBpcyBvbmdvaW5nXG4gIHByaXZhdGUgaW5pdGlhbFRyYW5zZm9ybSA9ICcnOyAvLyBPcmlnaW5hbCB0cmFuc2Zvcm0gc3R5bGVcbiAgcHJpdmF0ZSBoYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7IC8vIEZsYWcgdG8gZW5zdXJlIGRyYWdzdGFydCBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2VcbiAgcHJpdmF0ZSByb290Tm9kZTogTm9kZSA9IG51bGw7IC8vIFJvb3Qgbm9kZSBmb3IgYm91bmRhcnkgY2FsY3VsYXRpb25zXG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUbyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBkcmFnZ2FibGUgZWxlbWVudFxuICBwcml2YXRlIGZvY3VzYWJsZURyb3Bab25lczogSFRNTEVsZW1lbnRbXSA9IFtdOyAvLyBBbGwgZHJvcHpvbmVzIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gSW5kZXggZm9yIHRhYmJpbmcgdGhyb3VnaCBkcm9wIHpvbmVzXG5cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIGNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY2xvbmVcblxuICBwcml2YXRlIGxhc3RUYXJnZXQgPSBudWxsOyAvLyBMYXN0IHRvdWNoIHRhcmdldFxuICBwcml2YXRlIGN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsgLy8gQ3VycmVudCBkcm9wcGFibGUgZWxlbWVudFxuICBwcml2YXRlIGFsbG93Q2xpY2sgPSB0cnVlOyAvLyBGbGFnIHRvIGFsbG93IG9yIHByZXZlbnQgY2xpY2tcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0ZvckRyYWdDbG9uZSA9IHRydWU7XG4gIGRyYWdPbkNsaWNrRW5hYmxlZCA9IGZhbHNlO1xuICB1c2VEcmFnQ2xvbmUgPSBmYWxzZTsgLy8gU2V0IHRvIHRydWUgdG8gZHJhZyB3aXRoIGEgY2xvbmU7IHNldCB0byBmYWxzZSB0byBkcmFnIHRoZSBvcmlnaW5hbCBlbGVtZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRFJBR19ESVNUQU5DRSA9IDU7IC8vIE1pbmltdW0gcGl4ZWwgbW92ZW1lbnQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0NMT05FX09QQUNJVFkgPSAxOyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNsb25lIGVsZW1lbnRcbiAgaW5pdGlhbFRyYW5zaXRpb246IHN0cmluZztcbiAgLy8gZHJvcHBhYmxlczogRWxlbWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGREcm9wcGFibGVFbGVtZW50cyhkcm9wcGFibGVzOiBFbGVtZW50W10pIHtcbiAgLy8gICAvLyB0aGlzLmRyb3BwYWJsZXMgPSBkcm9wcGFibGVzO1xuICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gIC8vICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0geyB4LCB5IH07XG4gICAgdGhpcy5kcmFnU291cmNlID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSByb290IG5vZGVcbiAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5kcmFnU291cmNlLmdldFJvb3ROb2RlKCk7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGlja0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gU2F2ZSBpbml0aWFsIHRyYW5zZm9ybVxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybTtcblxuICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9IGNvbXB1dGVkU3R5bGUudHJhbnNpdGlvbiB8fCAnJztcblxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9uc1xuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9uZSBvZmZzZXRcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC55ID0geSAtIHJlY3QudG9wO1xuXG4gICAgICAvLyBTZXQgaGlnaGVyIHotaW5kZXggdG8gYnJpbmcgaXQgb24gdG9wXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJzk5OTknO1xuICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICB0aGlzLmRyYWdTb3VyY2UuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5kcmFnU291cmNlKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb3VjaCA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UoY3VycmVudFRvdWNoKSA+PSB0aGlzLk1JTl9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2gpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gRXhpc3RpbmcgY29kZSBmb3IgY3JlYXRpbmcgYW5kIGhhbmRsaW5nIHRoZSBkcmFnIGNsb25lXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5EUkFHX0NMT05FX09QQUNJVFkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRyYWdTb3VyY2UuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBjb21wdXRlZFN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGVbc3R5bGVdID0gY29tcHV0ZWRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgZHJhZyBjbG9uZSB0byB0aGUgcm9vdCBub2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IHJvb3RcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ0Nsb25lU3R5bGVzKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgZHJhZ2dpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgQ1NTIHRyYW5zZm9ybXNcbiAgICAgIGlmICh0aGlzLnRvdWNoU3RhcnRQb2ludCkge1xuICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50VG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50Lng7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueTtcblxuICAgICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICAgIC8vIGNvbnN0IHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9ID0gdGhpcy5hcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtib3VuZGVkRGVsdGFYfXB4LCAke2JvdW5kZWREZWx0YVl9cHgpYDtcblxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRyb3BUYXJnZXQgPSB0aGlzLmZpbmREcm9wVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGRyb3BUYXJnZXQgIT09IHRoaXMubGFzdFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmxhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgIHRoaXMubGFzdFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ292ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hFbmQoZSkge1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBsZXQgZHJvcEZvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZHJvcEZvdW5kJywgZHJvcEZvdW5kKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICBkcm9wRm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkcmFnRW5kRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdlbmQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICBkcmFnRW5kRXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZT8uZGlzcGF0Y2hFdmVudChkcmFnRW5kRXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZG9jdW1lbnQsIHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0QXRQb2ludChyb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlcHRoOiBudW1iZXIgPSAwKTogRWxlbWVudCB8IG51bGwge1xuICAgIC8vIExpbWl0IHRoZSByZWN1cnNpb24gZGVwdGhcbiAgICBjb25zdCBNQVhfREVQVEggPSAyO1xuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCBhbiBhbmNlc3RvciB3aXRoICdkcm9wem9uZScgYXR0cmlidXRlXG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgU2hhZG93IERPTSBhbmQgZGVwdGggbGltaXQgbm90IHJlYWNoZWQsIHRyYXZlcnNlIGl0XG4gICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCAmJiBkZXB0aCA8IE1BWF9ERVBUSCkge1xuICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZWxlbWVudC5zaGFkb3dSb290LCB4LCB5LCBkZXB0aCArIDEpO1xuICAgICAgaWYgKHNoYWRvd0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvd0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZWxlbWVudCB3aXRoICdkcm9wem9uZScgZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJyAnICYmICF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCB0byBzdGFydCBkcmFnZ2luZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2UgPSB0aGlzLmZvY3VzZWRFbGVtZW50O1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBkcm9wIHpvbmVzIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuY29sbGVjdERyb3Bab25lcygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBUYWIga2V5IHRvIG5hdmlnYXRlIHRocm91Z2ggZHJvcCB6b25lc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVRvTmV4dERyb3Bab25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5ID09PSAnICcgJiYgdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgYWdhaW4gdG8gZHJvcCB0aGUgZWxlbWVudFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgdGhpcy5yZXNldERyYWdTdGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REcm9wWm9uZXMoKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkcm9wem9uZSBhdHRyaWJ1dGVcbiAgICB0aGlzLmZvY3VzYWJsZURyb3Bab25lcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Ryb3B6b25lXScpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyBBcnJheS5mcm9tKHRoaXMuZHJvcHBhYmxlcyk7XG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBSZXNldCBuYXZpZ2F0aW9uIGluZGV4XG4gIH1cblxuICBwcml2YXRlIG1vdmVUb05leHREcm9wWm9uZSgpIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgaW5kZXggZm9yIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAodGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCArIDEpICUgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoO1xuXG4gICAgLy8gRm9jdXMgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgY29uc3QgbmV4dERyb3Bab25lID0gdGhpcy5mb2N1c2FibGVEcm9wWm9uZXNbdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleF07XG4gICAgbmV4dERyb3Bab25lLmZvY3VzKCk7XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBkcm9wIHRhcmdldFxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBuZXh0RHJvcFpvbmU7XG5cbiAgICAvLyBEaXNwYXRjaCBkcmFnZW50ZXIgZXZlbnRcbiAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQobmV4dERyb3Bab25lLCAnZHJhZ2VudGVyJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQsIHBhZ2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IHRvdWNoLnBhZ2VYIDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyB0b3VjaC5wYWdlWSA6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RHJhZ0Nsb25lU3R5bGVzKHRvdWNoKSB7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke3RvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnl9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHt0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b3VjaEVuZFRyaWdnZXJlZCB8fCAhdGhpcy5kcmFnQ2xvbmUpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3TGVmdCA9IHRvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lng7XG4gICAgICBjb25zdCBuZXdUb3AgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55O1xuXG4gICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfSA9IHRoaXMuYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQsIG5ld1RvcCwgdGhpcy5kcmFnQ2xvbmUpO1xuXG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym91bmRlZExlZnR9cHhgO1xuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7Ym91bmRlZFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG90ZW50aWFsIG5ldyBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0xlZnQgPSBlbGVtZW50UmVjdC5sZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IGVsZW1lbnRSZWN0LnRvcCArIGRlbHRhWTtcblxuICAgIC8vIExpbWl0IHRoZSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRlZCBkZWx0YSB2YWx1ZXNcbiAgICBjb25zdCBib3VuZGVkRGVsdGFYID0gYm91bmRlZExlZnQgLSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVkgPSBib3VuZGVkVG9wIC0gZWxlbWVudFJlY3QudG9wO1xuXG4gICAgcmV0dXJuIHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUJvdW5kYXJpZXMobmV3TGVmdDogbnVtYmVyLCBuZXdUb3A6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3TGVmdCBhbmQgbmV3VG9wIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4geyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0b3VjaCk6IG51bWJlciB7XG4gICAgY29uc3QgeERpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueCk7XG4gICAgY29uc3QgeURpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueSk7XG4gICAgcmV0dXJuIHhEaXN0ICsgeURpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoQ3VzdG9tRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLmRhdGFUcmFuc2ZlcjtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERyYWdTdGF0ZShkcm9wRm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZT8ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICBpZiAoIWRyb3BGb3VuZCkgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmluaXRpYWxUcmFuc2l0aW9uO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHByb3BlcnR5XG4gICAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZHJhZ0Nsb25lID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSBudWxsO1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGEodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5jbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMubGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdE5vZGUgPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgdXNlU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IHRoaXMuZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkcm9wcGFibGUgPT4ge1xuICAgICAgICB0aGlzLnByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERyb3BwYWJsZUVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdCA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG4gICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhdHRyaWJ1dGVOYW1lIH0pID0+IHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuXG4gICAgICAgIC8vIGNoZWNrTWF4QXNzb2NpYXRpb25zIGFuZCBzYXZlUmVzcG9uc2UgYXJlIGRlZmluZWQvb3ZlcnJpZGRlbiBpbiBhIG1peGluXG4gICAgICAgIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10obnVsbCk7IC8vXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuXG4gICAgICAvLyB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXM6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzLCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCB7IHBhcmVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSwgdHlwZTogT2JqZWN0IH0pIGNvbmZpZ3VyYXRpb246IEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IHRydWUsXG4gICAgICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiB0cnVlLFxuICAgICAgZHJhZ09uQ2xpY2s6IGZhbHNlXG4gICAgfTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBpZiAoZGlzYWJsZURyb3BwYWJsZSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIHZhbHVlPy5mb3JFYWNoKGVudHJ5ID0+IHRoaXMucGxhY2VSZXNwb25zZShlbnRyeSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gdGhpcy5maW5kRHJvcHBhYmxlQnlJZChkcm9wSWQpO1xuICAgICAgZHJhZ0lkcy5mb3JFYWNoKGRyYWdJZCA9PiB0aGlzLnBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkLCBkcm9wcGFibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcm9wcGFibGVCeUlkKGlkZW50aWZpZXI6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZDogc3RyaW5nLCBkcm9wcGFibGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgIGlmICghZHJvcHBhYmxlIHx8ICFkcmFnZ2FibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGZpbmQgZHJhZ2dhYmxlIG9yIGRyb3BwYWJsZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOiAke2RyYWdJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdmFsaWRBc3NvY2lhdGlvbnMgPSB0aGlzLmdldFZhbGlkQXNzb2NpYXRpb25zKCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSB2YWxpZEFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkQXNzb2NpYXRpb25zKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVSZXNwb25zZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlc3BvbnNlRGF0YSgpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZHJvcHBhYmxlc1xuICAgICAgICAubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgICAgY29uc3QgZHJhZ2dhYmxlc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnZ2FibGVzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzLm1hcChpZCA9PiBgJHtpZH0gJHtkcm9wcGFibGVJZGVudGlmaWVyfWApO1xuICAgICAgICB9KVxuICAgICAgICAuZmxhdCgpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgaWYgKHNhdmUpIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldERyb3BwYWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgfVxuICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiAwLjVyZW07XG4gIH1cblxuICA6aG9zdDo6cGFydChhc3NvY2lhYmxlcy1jb250YWluZXIpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAxODBkZWcsXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgLSAxcHgpLFxuICAgICAgdmFyKC0tcXRpLWJvcmRlci1jb2xvci1ncmF5KSBjYWxjKDUwJSksXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgKyAxcHgpXG4gICAgKTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEnIH0pXG4gIGRhdGE6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1pdGVtJyB9KVxuICBiYXNlSXRlbVVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLXJlZicgfSlcbiAgYmFzZVJlZlVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnaWQnIH0pXG4gIGlkOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuICBtYW5pZmVzdDoge1xuICAgIHNjcmlwdDogc3RyaW5nW107XG4gICAgc3R5bGU6IHN0cmluZ1tdO1xuICAgIG1lZGlhOiBzdHJpbmdbXTtcbiAgfTtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgdXJpVG9NYW5pZmVzdCA9IHRoaXMuZGF0YS5zdGFydHNXaXRoKCdodHRwJylcbiAgICAgID8gdGhpcy5kYXRhXG4gICAgICA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlSXRlbVVybCArICcvJyArIHRoaXMuZGF0YSk7XG4gICAgLy8gZmV0Y2ggdGhlIGpzb24gZmlsZSBsb2NhdGVkIGF0IHRoZSBkYXRhIGF0dHJpYnV0ZVxuICAgIGZldGNoKHVyaVRvTWFuaWZlc3QpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2V0dXBDRVMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBNSDogQ2hhbmdlZCB0aGUgZGVmYXVsdCBib290c3RyYXAuanMgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSVxuICAvLyBCZWNhdXNlIHRoZSBvbGQgb25lIHVzZXMgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHRoYXQgaXMgbm90IGFsbG93ZWQgdG8gYmUgYWNjZXNzZWQgd2hlbiB0aGUgQ0lcbiAgLy8gaXMgZW1iZWRkZWQgaW4gYW4gaWZyYW1lIGFuZCBjb21pbmcgZnJvbSBhbm90aGVyIGRvbWFpblxuICAvLyBUaGVyZWZvciB3ZSBuZWVkIHRvIHVzZSB0aGUgbmV3IENFUyBBUEkgdG8gY29tbXVuaWNhdGVzIHZpYSB0aGUgYnJvYWRjYXN0IEFQSVxuICBzZXR1cENFUygpIHtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3BjaUNvbnRhaW5lcicpIGFzIEhUTUxJRnJhbWVFbGVtZW50LFxuICAgICAgaWZyYW1lV2luID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLFxuICAgICAgaWZyYW1lRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgIC8vIGNvbnN0IGNoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnY2VzX2NoYW5uZWwnKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIGlmcmFtZURvYy5vcGVuKCk7XG4gICAgaWZyYW1lRG9jLndyaXRlKGBcbiAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICA8bGluayBocmVmPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc3R5bGVbMF19YCl9JyByZWw9XCJzdHlsZXNoZWV0XCIgLz5cbiAgICAgICAgICA8c2NyaXB0IHNyYz0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnNjcmlwdFswXX1gKX0nPjwvc2NyaXB0PlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5PjwvYm9keT5cbiAgICAgIDwvaHRtbD5cbiAgICAgIGApO1xuXG4gICAgaWZyYW1lRG9jLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldElGcmFtZXMoKSB7XG4gICAgY29uc3QgaWZyYW1lc0luU2hhZG93Um9vdCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY29uc3Qgb3V0ZXJJRnJhbWVzID0gWy4uLmlmcmFtZXNJblNoYWRvd1Jvb3QsIC4uLmlmcmFtZV07XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2Ygb3V0ZXJJRnJhbWVzKSB7XG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXJEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIGlmIChvdXRlckRvYykge1xuICAgICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMob3V0ZXJEb2MsIG91dGVySUZyYW1lcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2V0IG9ubHkgdW5pcXVlIGlmcmFtZXNcbiAgICBvdXRlcklGcmFtZXMuZm9yRWFjaCgoaWZyYW1lLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKG91dGVySUZyYW1lcy5pbmRleE9mKGlmcmFtZSkgIT09IGluZGV4KSB7XG4gICAgICAgIG91dGVySUZyYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvdXRlcklGcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIGdldElubmVySUZyYW1lcyhpZnJhbWVEb2N1bWVudDogRG9jdW1lbnQsIGlmcmFtZXMgPSBbXSkge1xuICAgIC8vIEdldCBhbGwgaWZyYW1lcyBpbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVzID0gaWZyYW1lRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjdXJyZW50SWZyYW1lcy5mb3JFYWNoKGlmcmFtZSA9PiB7XG4gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgaWZyYW1lIHRvIHRoZSBsaXN0XG4gICAgICBpZnJhbWVzLnB1c2goaWZyYW1lKTtcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgZ2V0IGlmcmFtZXMgd2l0aGluIHRoZSBjdXJyZW50IGlmcmFtZVxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlmcmFtZSBzcmMgaXMgZnJvbSB0aGUgc2FtZSBvcmlnaW5cbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcblxuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMobmVzdGVkRG9jLCBpZnJhbWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgY3Jvc3Mtb3JpZ2luIGlmcmFtZTonLCBpZnJhbWVTcmMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlmcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHBvc3RUb1dpbmRvd0FuZElmcmFtZXModHlwZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICB3aW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgY29uc3QgaWZyYW1lcyA9IHRoaXMuZ2V0SUZyYW1lcygpO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIGlmcmFtZXMpIHtcbiAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3N0TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgeyB0eXBlLCBkYXRhIH0gPSBldmVudC5kYXRhO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc2V0UmVzcG9uc2UnOlxuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZ2V0UmVzcG9uc2UnOiB7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygncmVzcG9uc2VEYXRhJywgdGhpcy5yYXdSZXNwb25zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZ2V0TWVkaWEnOiB7XG4gICAgICAgIGNvbnN0IG1lZGlhRGF0YSA9IHRoaXMubWFuaWZlc3QubWVkaWEubWFwKG1lZGlhID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBtZWRpYS5zdGFydHNXaXRoKCdodHRwJykgPyBtZWRpYSA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlUmVmVXJsICsgJy8nICsgbWVkaWEpO1xuICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ21lZGlhRGF0YScsIG1lZGlhRGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc2V0U3RhZ2VIZWlnaHQnOlxuICAgICAgICBjb25zb2xlLmxvZygnc2V0U3RhZ2VIZWlnaHQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlICE9PSAnJztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2U7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHZhbDtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8aWZyYW1lXG4gICAgICAgIHdpZHRoPSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyl9XG4gICAgICAgIGhlaWdodD0ke3RoaXMuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKX1cbiAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgdGl0bGU9XCJwY2lDb250YWluZXJcIlxuICAgICAgICBpZD1cInBjaUNvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICA8L2lmcmFtZT5cbiAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NvdW50LWF0dGVtcHQnIH0pXG4gIHB1YmxpYyBjb3VudEF0dGVtcHQ6IHN0cmluZyA9ICd0cnVlJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIHRpdGxlOiAnZW5kIGF0dGVtcHQnO1xuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxidXR0b24gP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0gcGFydD1cImJ1dHRvblwiIEBjbGljaz0ke3RoaXMuZW5kQXR0ZW1wdH0+JHt0aGlzLnRpdGxlfTwvYnV0dG9uPmA7XG4gIH1cbiAgcHVibGljIGVuZEF0dGVtcHQoZTogRXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2VuZC1hdHRlbXB0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdDogdGhpcy5jb3VudEF0dGVtcHQgPT09ICd0cnVlJyB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJzogUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1nYXAtdGV4dCcsIGZhbHNlLCAncXRpLWdhcCcpIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIC8qIFtwYXJ0PSdkcm9wcyddICwgKi9cbiAgICAgIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+PHNsb3QgcGFydD1cImRyYWdzXCIgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD4gPHNsb3QgcGFydD1cImRyb3BzXCI+PC9zbG90PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGxldCBtYXRjaGVzOiB7IHRleHQ6IHN0cmluZzsgZ2FwOiBzdHJpbmcgfVtdID0gW107XG4gICAgY29uc3QgcmVzcG9uc2UgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgbWF0Y2hlcyA9IHJlc3BvbnNlLm1hcCh4ID0+IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSB4LnNwbGl0KCcgJyk7XG4gICAgICAgIHJldHVybiB7IHRleHQ6IHNwbGl0WzBdLCBnYXA6IHNwbGl0WzFdIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXBzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZ2FwJyk7XG4gICAgZ2Fwcy5mb3JFYWNoKChnYXAsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZ2FwLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgY29uc3QgdGV4dElkZW50aWZpZXIgPSBtYXRjaGVzLmZpbmQoeCA9PiB4LmdhcCA9PT0gaWRlbnRpZmllcik/LnRleHQ7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktZ2FwLXRleHRbaWRlbnRpZmllcj1cIiR7dGV4dElkZW50aWZpZXJ9XCJdYCk/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgIGlmICh0ZXh0SWRlbnRpZmllciAmJiB0ZXh0KSB7XG4gICAgICAgIGlmICghZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGV4dFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHRpb24nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgZ2FwLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0ZXh0U3Bhbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgIGdhcC5uZXh0RWxlbWVudFNpYmxpbmcucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIHN2ZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBxdWVyeSwgcXVlcnlBc3NpZ25lZEVsZW1lbnRzLCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIGhvdHNwb3RzO1xuICBzdGFydFBvaW50ID0gbnVsbDtcbiAgZW5kUG9pbnQgPSBudWxsO1xuICBAc3RhdGUoKSBfbGluZXMgPSBbXTtcbiAgQHN0YXRlKCkgc3RhcnRDb29yZDogeyB4OiBhbnk7IHk6IGFueSB9O1xuICBAc3RhdGUoKSBtb3VzZUNvb3JkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIEBxdWVyeSgnc3ZnJykgc3ZnQ29udGFpbmVyO1xuICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2VsZWN0b3I6ICdpbWcnIH0pIGdySW1hZ2U7XG5cbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICAvLyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKHF0aS1hc3NvY2lhYmxlLWhvdHNwb3QpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG4gICAgICBsaW5lLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMHB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICB9XG4gICAgYFxuICBdO1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVzID0gW107XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0aGlzLl9saW5lcyA9IHZhbDtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXM7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxsaW5lLWNvbnRhaW5lcj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8ud2lkdGgpfVxuICAgICAgICAgIGhlaWdodD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LmhlaWdodCl9XG4gICAgICAgICAgdmlld2JveD1cIjAgMCAke3RoaXMuZ3JJbWFnZVswXT8ud2lkdGh9ICR7dGhpcy5nckltYWdlWzBdPy5oZWlnaHR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgICAgdGhpcy5fbGluZXMsXG4gICAgICAgICAgICBsaW5lID0+IGxpbmUsXG4gICAgICAgICAgICAobGluZSwgaW5kZXgpID0+IHN2Z2BcbiAgICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0PVwibGluZVwiXG4gICAgICAgICAgICAgICAgeDE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgeDI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saW5lcyA9IHRoaXMuX2xpbmVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgKX1cbiAgICAgICAgICAke3RoaXMuc3RhcnRQb2ludCAmJlxuICAgICAgICAgIHN2Z2A8bGluZVxuICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgIHgxPSR7dGhpcy5zdGFydENvb3JkLnh9XG4gICAgICAgICAgICB5MT0ke3RoaXMuc3RhcnRDb29yZC55fVxuICAgICAgICAgICAgeDI9JHt0aGlzLm1vdXNlQ29vcmQueH1cbiAgICAgICAgICAgIHkyPSR7dGhpcy5tb3VzZUNvb3JkLnl9XG4gICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgLz5gfVxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9saW5lLWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoZSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChlKTtcblxuICAgIHRoaXMuaG90c3BvdHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMubW91c2VDb29yZCA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuaG90c3BvdHMuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdICsgJ3B4JztcbiAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV0gKyAncHgnO1xuXG4gICAgICBob3RzcG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRQb2ludCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuc3RhcnRDb29yZCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0sXG4gICAgICAgICAgICB5OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICsgJyAnICsgdGhpcy5lbmRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKVxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkhvdHNwb3RzKFxuICBzaGFwZTogc3RyaW5nLFxuICBjb29yZHNOdW1iZXI6IG51bWJlcltdLFxuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIGhvdHNwb3Q6IFF0aUhvdHNwb3RDaG9pY2Vcbikge1xuICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGNlbnRlclhQZXIgPSAoY2VudGVyWCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGNlbnRlcllQZXIgPSAoY2VudGVyWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByYWRpdXNQZXIgPSAocmFkaXVzIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWFBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSA0ICogcmFkaXVzUGVyICsgJ3B4JztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgOTk5OXB4YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncmVjdCc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvbHknOlxuICAgICAge1xuICAgICAgICAvLyBmcm9tIGEsYixjLGQsZSxmID0+IFt7eDphLCB5OmJ9LHt4OmMsIHk6ZH0se3g6ZSwgeTpmfV1cbiAgICAgICAgY29uc3QgcG9seWNvb3JkcyA9IGNvb3Jkc051bWJlci5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIHBvbHlDKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWwgPSBhY2MucG9wKCk7XG4gICAgICAgICAgICBhY2NbYWNjLmxlbmd0aF0gPSB7IHg6IGxhc3RWYWwsIHk6IHBvbHlDW2N1cnJlbnRJbmRleF0gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBib3VuZGluZyBib3ggYnkgZmluZGluZyB0aGUgbWF4IGF4IG1pbiBjb29yZGluYXRlcyBvZiB4IGFuZCB5XG4gICAgICAgIGNvbnN0IGxlZnRYID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCByaWdodFggPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHRvcFkgPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVkgPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBjYXVzZSB3ZSB3YW50IHRvIHVzZSBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBob3RzcG90IG9uIHgseSBhbmQgc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuXG4gICAgICAgIC8vIGFsbCB0aGUgcG9seWdvbiBwb2ludHMgc2hvdWxkIGJlIGNvcnJlY3RlZCBjYXVzZWQgdGhleSBhcmUgZnJvbVxuICAgICAgICAvLyBpbWFnZSAwLDAgcG9pbnQsIGFuZCBzaG91bGQgYmUgZnJvbSB0aGUgaG90c3BvdCBwb2ludCB3aGljaCBhbHJlYWR5XG4gICAgICAgIC8vIGhhcyBiZWVuIG9mZnNldHRlZCBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgcHJldmlvdXMgZmV3IGxpbmVzIG9mIGNvZGVcbiAgICAgICAgLy8gYWxzbyB0aGUgcG9pbnRzIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgaW1hZ2UsIGJ1dCBub3cgaGF2ZVxuICAgICAgICAvLyB0byBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgd2lkdGggb2YgdGhlIGhvdHNwb3RcbiAgICAgICAgY29uc3QgcG9seWdvbkRhdGEgPSBwb2x5Y29vcmRzLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgIHg6ICgocG9pbnQueCAtIGxlZnRYKSAvIChyaWdodFggLSBsZWZ0WCkpICogMTAwLFxuICAgICAgICAgIHk6ICgocG9pbnQueSAtIHRvcFkpIC8gKGJvdHRvbVkgLSB0b3BZKSkgKiAxMDBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjbGlwIHBhdGggY29vcmRpbmF0ZSBzdHlsZSBpbiBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBwb2x5RCA9IHBvbHlnb25EYXRhLm1hcChwID0+IE1hdGgucm91bmQocC54KSArICclICcgKyBNYXRoLnJvdW5kKHAueSkgKyAnJScpLmpvaW4oJywnKTtcblxuICAgICAgICAvLyA1MCUgMCUsIDEwMCUgNTAlLCA1MCUgMTAwJSwgMCUgNTAlXG4gICAgICAgIGhvdHNwb3Quc3R5bGUuY2xpcFBhdGggPSBgcG9seWdvbigke3BvbHlEfSlgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLWdhcC1pbWcnLFxuICBmYWxzZSxcbiAgJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnXG4pIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLWdhcC1pbWcnXSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZ2FwOiAxcmVtO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIEhvdHNwb3RDaG9pY2UgPSBDaG9pY2UgJiB7IG9yZGVyOiBudW1iZXIgfTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG5cbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIb3RzcG90T3JkZXIoZTogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkZW50aWZpZXIgfSA9IGUuZGV0YWlsO1xuXG4gICAgY29uc3QgaG90c3BvdCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbmQoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpIGFzIEhvdHNwb3RDaG9pY2U7XG5cbiAgICBjb25zdCBtYXhTZWxlY3Rpb24gPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLmNob2ljZU9yZGVyaW5nKSB7XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChob3RzcG90Lm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+IGkub3JkZXIgPiAwKS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdXNlciBhbHJlYWR5IHNlbGVjdGVkIDUgaW1hZ2VzLlxuICAgICAgICB9XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiAhIWkub3JkZXIpLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgICAgICBpZiAoaG90c3BvdC5vcmRlciA+IGhvdHNwb3Qub3JkZXIpIHtcbiAgICAgICAgICAgIGhvdHNwb3Qub3JkZXItLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhvdHNwb3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBob3RzcG90Lm9yZGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90c3BvdEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICAvLyBkbyBub3Qgc2VsZWN0ICggaGlnaGxpZ2h0IGJsdWUsIHRoZSBpbWFnZSlcbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAvKiB3aWR0aDoxMDAlOyAqL1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nOiBRdGlIb3RzcG90SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyogXG5xdGktbWF0Y2gtaW50ZXJhY3Rpb25cbnF0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb25cbiovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4vLyB0c2xpbnQ6ZGlzYWJsZTogaW5kZW50XG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICBgO1xuXG4gIC8qKiB0aGUgbWluaW1hbCBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWluJ1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNaW46IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWF4J1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNYXg6IG51bWJlciA9IDE7XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2ZpeGVkJ1xuICB9KVxuICBwdWJsaWMgZml4ZWQgPSBmYWxzZTtcblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHRoZSBhc3NvY2lhdGUgaW50ZXJhY3Rpb24gdGhlcmUgaXMgYSBzcGVjaWFsIHNsb3QgZm9yIHRoZXNlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VzXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgfVxuXG4gIC8vIHBrOiBUaGlzIG5lZWRzIHNvbWUgZXhwbGFuYXRpb25cbiAgLy8gaW4gcXRpLW1hdGNoLWludGVyYWN0aW9uLCBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIHVzZWQgdG8gZGVub3RlIHRoZVxuICAvLyBkcmFnZ2FibGUsIGJ1dCBhbHNvIHRoZSBkcm9wcGFibGUuIFdFSVJELi4gYnV0IGxldHMgZGVhbCB3aXRoIGl0LlxuICAvLyBTbyB3ZSBoYXZlIGEgc2xvdCBmb3Igd2hlbmV2ZXIgYW5vdGhlciBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIGRyb3BwZWQgaW4gaGVyZS5cbiAgLy8gQW5kIHdlIGhhdmUgc2xvdCBmb3IgY29udGVudCBsaWtlIGluIHRoaXMgYXNzb2NpYXRlIGludGVyYWN0aW9uXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPHNsb3QgcGFydD1cImRyb3BzbG90XCIgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJzogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG4vLyBpbXBvcnQgY29tcG9uZW50U3R5bGVzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9zdHlsZXMvY29tcG9uZW50LnN0eWxlcyc7XG5cbi8qICR7Y29tcG9uZW50U3R5bGVzfSAqL1xuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBzbG90IHtcbiAgICAvKiBzbG90IHdoZXJlIHRoZSAqL1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDAuNXJlbTtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgLyogcHJldmVudHMgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmluZyB0aGUgc2FtZSBoZWlnaHQgKi9cbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgfVxuICBzbG90W25hbWU9J3Byb21wdCddIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1tYXRjaC1zZXQpIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmUgdGhlIHNhbWUgd2lkdGggKi9cbiAgICBmbGV4OiAxO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWVkaWEtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1lZGlhSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgX3ZhbHVlID0gMDtcbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICAgIC8vIG1heWJlIGNoZWNrIGlmIHRoZSBtZWRpYSBoYXMgYmVlbiBwbGF5ZWQ/XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uSW50ZXJhY3Rpb24ucHJvcGVydGllcyxcbiAgICAgIC4uLntcbiAgICAgICAgc3RlcDoge1xuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdzdGVwJyxcbiAgICAgICAgICBkZWZhdWx0OiAxMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gZ2V0IGF1ZGlvLCB2aWRlbyBvZiBvYmplY3QgdGFnLlxuICAgIGNvbnN0IG1lZGlhT2JqZWN0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndmlkZW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuICAgIGlmIChtZWRpYU9iamVjdCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGVuZGVkIGV2ZW50XG4gICAgICBtZWRpYU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcy52YWx1ZSBpcyBhIG51bWJlclxuICAgICAgICB0aGlzLl92YWx1ZSsrO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWVkaWEtaW50ZXJhY3Rpb24nOiBRdGlNZWRpYUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFNodWZmbGVNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbic7IC8vIEltcG9ydCB0aGUgbWl4aW5cbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgU2h1ZmZsZU1peGluKFxuICBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sIGBxdGktc2ltcGxlLWNob2ljZWAsIHRydWUsICdkcm9wLWxpc3QnKSxcbiAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuKSB7XG4gIGNoaWxkcmVuTWFwOiBFbGVtZW50W107XG5cbiAgQHN0YXRlKCkgbnJDaG9pY2VzOiBudW1iZXIgPSAwO1xuICBAc3RhdGUoKSBjb3JyZWN0UmVzcG9uc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBAc3RhdGUoKSBzaG93Q29ycmVjdFJlc3BvbnNlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGdyaWQtYXV0by1jb2x1bW5zOiAxZnI7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3AtbGlzdCddIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIGlmICh0aGlzLm5yQ2hvaWNlcyA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm5yQ2hvaWNlcyA9IGNob2ljZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD5cbiAgICAgIDxkaXYgcGFydD1cImNvbnRhaW5lclwiPlxuICAgICAgICA8c2xvdCBwYXJ0PVwiZHJhZ3NcIj4gPC9zbG90PlxuICAgICAgICA8ZGl2IHBhcnQ9XCJkcm9wc1wiPlxuICAgICAgICAgICR7QXJyYXkuZnJvbShBcnJheSh0aGlzLm5yQ2hvaWNlcykpLm1hcChcbiAgICAgICAgICAgIChfLCBpKSA9PlxuICAgICAgICAgICAgICBodG1sYDxkcm9wLWxpc3QgcGFydD1cImRyb3AtbGlzdFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aX1cIj48L2Ryb3AtbGlzdD4ke3RoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID4gaVxuICAgICAgICAgICAgICAgICAgPyB1bnNhZmVIVE1MKGA8c3BhbiBwYXJ0PSdjb3JyZWN0LXJlc3BvbnNlJz4ke3RoaXMuY29ycmVjdFJlc3BvbnNlc1tpXX08L3NwYW4+YClcbiAgICAgICAgICAgICAgICAgIDogJyd9YFxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgICAgcmVzcG9uc2VzLmZvckVhY2goKHJlc3BvbnNlLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2ltcGxlQ2hvaWNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgaWYgKCFzaW1wbGVDaG9pY2UpIHtcbiAgICAgICAgICBzaW1wbGVDaG9pY2UgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gc2ltcGxlQ2hvaWNlPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcyA9IFsuLi50aGlzLmNvcnJlY3RSZXNwb25zZXMsIHRleHRdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IHRydWU7XG4gIH1cblxuICAvLyBzb21lIGludGVyYWN0aW9ucyBoYXZlIGEgZGlmZmVyZW50IHdheSBvZiBnZXR0aW5nIHRoZSByZXNwb25zZVxuICAvLyB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBkcmFnIGFuZCBkcm9wIG1peGluIGNsYXNzXG4gIC8vIHlvdSBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBnZXRSZXNwb25zZSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3NcbiAgLy8gY2F1c2UgdGhleSBhcmUgZGlmZmVyZW50IGZvciBzb21lIGludGVyYWN0aW9ucy5cbiAgLy8gTUg6IGlzIHRoaXMgZnVuY3Rpb24gY2FsbGVkPyBTaG91bGRuJ3Qgd2UgdXNlIGdldFZhbHVlP1xuICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2UoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUNob2ljZT4odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Ryb3AtbGlzdCcpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZHJvcHBhYmxlcy5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ3NJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICByZXR1cm4gWy4uLmlkZW50aWZpZXJzXS5qb2luKCcgJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5jaGlsZHJlbk1hcC5mb3JFYWNoKGVsID0+IGVsLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbicsIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnKVxuZXhwb3J0IGNsYXNzIFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIHN0YXJ0WDogYW55O1xuICBzdGFydFk6IGFueTtcbiAgZHJhZ0VsZW1lbnQ6IGFueTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyID0gdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIERlZmluZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbW91c2Vtb3ZlIGV2ZW50IG9uIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICBkcmFnRWxlbWVudEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSB0aGUgbW91c2UgaGFzIG1vdmVkIHNpbmNlIHRoZSBsYXN0IGV2ZW50XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcmFnRWxlbWVudC5vZmZzZXRMZWZ0ICsgZGVsdGFYICsgJ3B4JztcbiAgICB0aGlzLmRyYWdFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0VG9wICsgZGVsdGFZICsgJ3B4JztcblxuICAgIC8vIFVwZGF0ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChhKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGEpO1xuXG4gICAgLy8gR2V0IHRoZSBkcmFnZ2FibGUgYW5kIGRyb3Agem9uZSBlbGVtZW50c1xuICAgIHRoaXMuZHJhZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24+aW1nJyk7XG4gICAgLy8gY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5zdGFydFggPSAwO1xuICAgIHRoaXMuc3RhcnRZID0gMDtcblxuICAgIC8vIEFkZCBhIG1vdXNlZG93biBldmVudCBsaXN0ZW5lciB0byB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLmRyYWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gU2F2ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICAgIC8vIEFkZCBhIG1vdXNlbW92ZSBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlTW92ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJzogUXRpUG9zaXRpb25PYmplY3RTdGFnZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICBwb2ludC1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1heENob2ljZXM6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gIHByaXZhdGUgX2ltZ0VsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHRyYWN0ZWQgY2xpY2sgaGFuZGxlciBtZXRob2RcbiAgcHJpdmF0ZSBfb25JbWFnZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuX3BvaW50cy5sZW5ndGggPCB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIGAke3h9ICR7eX1gXTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxwb2ludC1jb250YWluZXI+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIHRoaXMuX3BvaW50cyxcbiAgICAgICAgICBwb2ludCA9PiBwb2ludCxcbiAgICAgICAgICAocG9pbnQsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGAke3BvaW50LnNwbGl0KCcgJylbMF19cHhgLFxuICAgICAgICAgICAgICAgIHRvcDogYCR7cG9pbnQuc3BsaXQoJyAnKVsxXX1weGBcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgcG9pbnQgYXQgJHtwb2ludH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50cyA9IHRoaXMuX3BvaW50cy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9wb2ludC1jb250YWluZXI+YDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3BvaW50cyA9IFtdO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50cy5sZW5ndGggPj0gdGhpcy5taW5DaG9pY2VzICYmIHRoaXMuX3BvaW50cy5sZW5ndGggPD0gdGhpcy5tYXhDaG9pY2VzO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9wb2ludHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5faW1nRWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gQXR0YWNoIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gPGltZz4gZWxlbWVudCBmb3VuZCBpbiA8cXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbj4nKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nOiBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTbGlkZXJJbnRlcmFjdGlvbi5UeXBlIChxdGktc2xpZGVyLWludGVyYWN0aW9uKSBwcmVzZW50cyB0aGUgY2FuZGlkYXRlIHdpdGggYSBjb250cm9sIGZvciBzZWxlY3RpbmcgYSBudW1lcmljYWwgdmFsdWUgYmV0d2VlbiBhIGxvd2VyIGFuZCB1cHBlciBib3VuZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guczYxeGNyajRxY3lqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDYuMFxuICpcbiAqIEBldmVudCBxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24gLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIHdhbnRzIHRvIHJlZ2lzdGVyIGl0c2VsZlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1yZXNwb25zZSAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gY2hhbmdlc1xuICpcbiAqIEBjc3Nwcm9wIC0tc2hvdy12YWx1ZSAtIHNob3dzIHRoZSBjdXJyZW50IHZhbHVlIHdoaWxlIHNsaWRpbmdcbiAqIEBjc3Nwcm9wIC0tc2hvdy10aWNrcyAtIHNob3dzIHRoZSB0aWNrcyBhY2NvcmRpbmcgdG8gc3RlcHNcbiAqIEBjc3Nwcm9wIC0tc2hvdy1ib3VuZHMgLSBzaG93cyB2YWx1ZSBmb3IgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG4gKlxuICogQGNzc3BhcnQgc2xpZGVyIC0tIHNsaWRlciBpbmx1ZGluZywgYm91bmRzIGFuZCB0aWNrcyBhbmQgdmFsdWUsIHVzZSBpdCBmb3IgcGFkZGluZ3MgYW5kIG1hcmdpbnNcbiAqIEBjc3NwYXJ0IGJvdW5kcyAtLSBkaXYgZm9yIGJvdW5kcywgY29udGFpbmluZyB0d28gZGl2cyBmb3Igd2l0aCBtaW4sIGFuZCBtYXggYm91bmRzIHZhbHVlXG4gKiBAY3NzcGFydCB0aWNrcyAtLSBkaXYgZm9yIHRpY2tzLCB1c2UgbGluZWFpciBncmFkaWVudCBhbmQgZXhwb3NlZCBjc3MgdmFyaWFibGVzIGZvciBzdHlsaW5nXG4gKiBAY3NzcGFydCByYWlsIC0tIGRpdiBmb3IgcmFpbCwgc3R5bGUgYWNjb3JkaW5nIHRvIG5lZWRzXG4gKiBAY3NzcGFydCBrbm9iIC0tIGRpdiwgc2hvdWxkIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlXG4gKiBAY3NzcGFydCB2YWx1ZSAtLSBkaXYsIGNvbnRhaW5pbmcgdmFsdWVcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgPHF0aS1zaW1wbGUtY2hvaWNlPiBtdXN0IGJlIHBsYWNlZC5cbiAqIEBzbG90IHByb21wdCAtIHNsb3Qgd2hlcmUgdGhlIHByb21wdCBpcyBwbGFjZWQuXG4gKi9cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVNsaWRlckludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIGNzTGl2ZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcblxuICBAcXVlcnkoJyNrbm9iJylcbiAgcHJpdmF0ZSBfa25vYjogSFRNTEVsZW1lbnQ7XG5cbiAgQHF1ZXJ5KCcjcmFpbCcpXG4gIHByaXZhdGUgX3JhaWw6IEhUTUxFbGVtZW50O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3N0ZXAtbGFiZWwnIH0pIHN0ZXBMYWJlbCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJyB9KSBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWluJywgYCR7dGhpcy5fbWlufWApO1xuICB9XG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAndXBwZXItYm91bmQnIH0pIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4JywgYCR7dGhpcy5fbWF4fWApO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3N0ZXAnIH0pIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zdGVwJywgYCR7dGhpcy5fc3RlcH1gKTtcbiAgfVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG5cbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKG9sZCwgZGlzYWJsZWQpID0+IHt9O1xuXG4gIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChvbGQsIHJlYWRvbmx5KSA9PiB7fTtcblxuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7IC4uLkxpdEVsZW1lbnQuc2hhZG93Um9vdE9wdGlvbnMsIGRlbGVnYXRlc0ZvY3VzOiB0cnVlLCBtb2RlOiAnb3BlbicgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBhIGxpdmUgcHJvcGVydHksIHdlIHVzZSB0aGlzIHRvIGdldCBjc3MgdmFyaWFibGVzXG4gICAgc2VlIHJlbmRlciB0ZW1wbGF0ZSAqL1xuICAgIHRoaXMuY3NMaXZlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtcbiAgfVxuXG4gIHNldCByZXNwb25zZShteVJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG15UmVzcG9uc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgYSBzaW5nbGUgdmFsdWUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChteVJlc3BvbnNlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIC8vIGNvbnZlcnQgdGhlIHZhbHVlLCB3aGljaCBpcyB0aGUgcmVhbCBzbGlkZXIgdmFsdWUgdG8gYSBwZXJjZW50YWdlIGZvciB0aGUgZG9tLlxuICAgIGlmICh0aGlzLl92YWx1ZSA8IHRoaXMubWluKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgPiB0aGlzLm1heCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1heDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVQZXJjZW50YWdlID0gKCh0aGlzLl92YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12YWx1ZS1wZXJjZW50YWdlJywgYCR7dmFsdWVQZXJjZW50YWdlfSVgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGRpdiBpZD1cInNsaWRlclwiIHBhcnQ9XCJzbGlkZXJcIj5cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctYm91bmRzJykgPT0gJ3RydWUnXG4gICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJib3VuZHNcIiBwYXJ0PVwiYm91bmRzXCI+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9taW59PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9tYXh9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy10aWNrcycpID09ICd0cnVlJyA/IGh0bWxgPGRpdiBpZD1cInRpY2tzXCIgcGFydD1cInRpY2tzXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgaWQ9XCJyYWlsXCIgcGFydD1cInJhaWxcIiBAbW91c2Vkb3duPSR7dGhpcy5fb25Nb3VzZURvd259IEB0b3VjaHN0YXJ0PSR7dGhpcy5fb25Ub3VjaE1vdmV9PlxuICAgICAgICAgIDxkaXYgaWQ9XCJrbm9iXCIgcGFydD1cImtub2JcIj5cbiAgICAgICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXZhbHVlJykgPT0gJ3RydWUnXG4gICAgICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwidmFsdWVcIiBwYXJ0PVwidmFsdWVcIj4ke3RoaXMudmFsdWV9PC9kaXY+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdGVwID0gMTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaEVuZCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1vdXNlRG93bihldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiogY2FsY3VsYXRlVmFsdWUgZ2V0cyB4IHBvc2l0aW9uIGFuZCBjb21wYXJlcyB0aGlzIHdpdGggdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVZhbHVlKGRpZmZYOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZU5vdyA9IHRoaXMubWluICsgKCh0aGlzLm1heCAtIHRoaXMubWluKSAqIGRpZmZYKSAvIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3Qgcm91bmRlZFN0ZXBWYWx1ZSA9IHRoaXMubWluICsgTWF0aC5yb3VuZCgodmFsdWVOb3cgLSB0aGlzLm1pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXA7XG4gICAgdGhpcy5fdmFsdWUgPSByb3VuZGVkU3RlcFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbkZyb21FdmVudChlOiBhbnkpOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IF90b3VjaE1vdmU7XG4gICAgaWYgKGUudHlwZSA9PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09ICd0b3VjaG1vdmUnIHx8IGUudHlwZSA9PSAndG91Y2hlbmQnIHx8IGUudHlwZSA9PSAndG91Y2hjYW5jZWwnKSB7XG4gICAgICBjb25zdCBldnQgPSB0eXBlb2YgZS5vcmlnaW5hbEV2ZW50ID09PSAndW5kZWZpbmVkJyA/IGUgOiBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2dC50b3VjaGVzWzBdIHx8IGV2dC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxuICAgICAgICB5OiB0b3VjaC5wYWdlWVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS50eXBlID09ICdtb3VzZWRvd24nIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNldXAnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbW92ZScgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdmVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW91dCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VlbnRlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VsZWF2ZSdcbiAgICApIHtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IGUuY2xpZW50WCxcbiAgICAgICAgeTogZS5jbGllbnRZXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX3RvdWNoTW92ZTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2xpZGVyLWludGVyYWN0aW9uJzogUXRpU2xpZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDYWxjdWxhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHByaXZhdGUgb3BlcmF0b3JGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLmhhbmRsZVNsb3RDaGFuZ2V9Pjwvc2xvdD5gO1xuICB9XG5cbiAgaGFuZGxlU2xvdENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvLyBleHBlY3RpbmcgPFshQ0RBVEFbIC4uLiBdXT4gaXMgY29udmVydGVkIGludG8gPCEtLSAuLi4gLS0+IHdpdGggcXRpLXRyYW5zZm9ybTogY0RhdGFUb0NvbW1lbnRcbiAgICBjb25zdCBjb21tZW50Tm9kZSA9IEFycmF5LmZyb20odGhpcy5maXJzdEVsZW1lbnRDaGlsZD8uY2hpbGROb2RlcyA/PyBbXSkuZmluZChcbiAgICAgIG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9wZXJhdG9yRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAnZm4nLCAnaXRlbScsIGNvbW1lbnROb2RlLnRleHRDb250ZW50ID8/ICcnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdjdXN0b20tb3BlcmF0b3IgY29udGFpbnMgaW52YWxpZCBqYXZhc2NyaXB0IGNvZGUnLCBlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGZuID0ge1xuICAgICAgdmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcik/LnZhbHVlID8/ICcnLFxuICAgICAgY29ycmVjdDogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICAodGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZSlcbiAgICAgICAgICA/LmNvcnJlY3RSZXNwb25zZSA/PyAnJ1xuICAgIH07XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIGdldFZhcmlhYmxlOiAodmFyaWFibGVJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZUlkZW50aWZpZXIpLFxuICAgICAgdXBkYXRlT3V0Y29tZVZhcmlhYmxlOiAob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZzsgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYWJsZS1ob3RzcG90JzogUXRpQXNzb2NpYWJsZUhvdHNwb3Q7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwJylcbmV4cG9ydCBjbGFzcyBRdGlHYXAgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwJzogUXRpR2FwO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1pbWcnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcEltZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtaW1nJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1pbWcnOiBRdGlHYXBJbWc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtdGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwVGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWdhcC10ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhcmlhLW9yZGVydmFsdWUnLCB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgb3JkZXI6IG51bWJlcjtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtY2hvaWNlJzogUXRpSG90c3BvdENob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHRleHQnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj48ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj48L2Rpdj5cbiAgICAgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dCc6IFF0aUhvdHRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2UtcmVnaXN0ZXInLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3RJbmxpbmVDaG9pY2UoKSB7XG4gICAgLy8gaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW5saW5lLWNob2ljZS1zZWxlY3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UnOiBRdGlJbmxpbmVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyoqXG4gKiBxdGktb3JkZXItaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtY2hvaWNlJykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gICAgW3BhcnQ9J2NoJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgYDtcblxuICAvLyBwcm9wZXJ0eSBsYWJlbFxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIG1hcmtlcjogc3RyaW5nO1xuXG5cbiAgZ2V0IGNoZWNrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXNbJ2ludGVybmFscyddLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+XG4gICAgICAgIDxkaXYgcGFydD1cImNoYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke3RoaXMubWFya2VyID8gaHRtbGA8ZGl2IGlkPVwibGFiZWxcIj4ke3RoaXMubWFya2VyfTwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgPHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnOiBRdGlTaW1wbGVDaG9pY2U7XG4gIH1cbn1cbiIsICIvKiBvbmx5IGV4cG9ydGVkIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBmb3Igc3BlY2lmaWMgcHVycG9zZXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC9ldmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL3ZhcmlhYmxlcyc7XG4vKiBvbmx5IGV4cG9ydGVkIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBmb3Igc3BlY2lmaWMgcHVycG9zZXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1wcm9tcHQvcXRpLXByb21wdCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0Jztcbi8qIHN0YXJ0IHJlc3BvbnNlIGFuZCBvdXRjb21lICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJztcbi8qIGVuZCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcnVicmljLWJsb2NrL3F0aS1jb250ZW50LWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcnVicmljLWJsb2NrL3F0aS1ydWJyaWMtYmxvY2snO1xuLyogc3RhcnQgZmVlZGJhY2sgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2snO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2snO1xuLyogZW5kIGZlZWRiYWNrICovXG4vKiBzdGFydCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nO1xuLyogZW5kIHRleHRlbnRyeWludGVyYWN0aW9uICovXG4vKiBzdGFydCBob3R0ZXh0ICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbic7XG4vKiBlbmQgaG90dGV4dCAqL1xuLyogc3RhcnQgaW5saW5lY2hvaWNlICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgaW5saW5lY2hvaWNlICovXG4vKiBzdGFydCBjaG9pY2VpbnRlcmFjdGlvbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uJztcbi8qIGVuZCBjaG9pY2VpbnRlcmFjdGlvbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc7XG4vKiBzdGFydCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nO1xuLyogZW5kIGN1c3RvbSBpbnRlcmFjdGlvbnMgKi9cbi8qIHN0YXJ0IG9ubHkgcHJldmlldyBpdGVtcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uJztcbi8qIGVuZCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktY3VzdG9tLW9wZXJhdG9yL3F0aS1jdXN0b20tb3BlcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWFibGUtaG90c3BvdCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtaW1nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtdGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZSc7XG5cbmNvbnNvbGUubG9nKFxuICAnJWNDXHUwMEJGVE8lY0xhYiVjOiBxdGktY29tcG9uZW50cyBsb2FkZWQnLFxuICAnZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW4nLFxuICAnZm9udC1mYW1pbHk6IFwiUFQgU2Fuc1wiLCBmb250LXdlaWdodDpib2xkOyBjb2xvcjpncmVlbjsgZm9udC1zaXplOiBzbWFsbGVyO3ZlcnRpY2FsLWFsaWduOiBzdWInLFxuICAnZm9udC13ZWlnaHQ6dW5zZXQnXG4pO1xuXG4vLyBjc3MgZm9yIGZvbnQgcHQtc2FucyBhbmQgc3Vic2NyaXB0IGFuZCBncmVlblxuIl0sCiAgIm1hcHBpbmdzIjogImlHQUFBLE9BQVMsV0FBQUEsT0FBZSxlQUN4QixPQUFTLGNBQUFDLEdBQVksUUFBQUMsT0FBWSxNQUNqQyxPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLE1BQWdCLG9CQzJCakMsU0FBU0MsRUFBTUMsRUFBaUNDLEVBQXdCLENBQzdFLElBQU1DLEVBQTBDQyxFQUFBLENBQzlDLHFCQUFzQixJQUNuQkYsR0FFTCxNQUFPLENBQStCRyxFQUFrQkMsSUFBMEQsQ0FFaEgsR0FBTSxDQUFFLE9BQUFDLENBQU8sRUFBSUYsRUFDYkcsRUFBb0IsTUFBTSxRQUFRUCxDQUFZLEVBQUlBLEVBQWUsQ0FBQ0EsQ0FBWSxFQUdwRkksRUFBTSxPQUFTLFNBQTJCSSxFQUFnRSxDQUN4R0QsRUFBa0IsUUFBUUUsR0FBWSxDQUNwQyxJQUFNQyxFQUFNRCxFQUNaLEdBQUlELEVBQWEsSUFBSUUsQ0FBRyxFQUFHLENBQ3pCLElBQU1DLEVBQVdILEVBQWEsSUFBSUUsQ0FBRyxFQUMvQkUsRUFBVyxLQUFLRixDQUFHLEVBRXJCQyxJQUFhQyxJQUNYLENBQUNWLEVBQWdCLHNCQUF3QixLQUFLLGFBQy9DLEtBQUtHLENBQWUsRUFBK0JNLEVBQVVDLENBQVEsQ0FHNUUsQ0FDRixDQUFDLEVBRUROLEVBQU8sS0FBSyxLQUFNRSxDQUFZLENBQ2hDLENBQ0YsQ0FDRixDQzFEQSxPQUFTLGlCQUFBSyxPQUFxQixlQVN2QixJQUFNQyxHQUF1QixDQUNsQyxDQUNFLFdBQVksbUJBQ1osWUFBYSxTQUNiLFNBQVUsU0FDVixNQUFPLFVBQ1AsS0FBTSxTQUNSLEVBQ0EsQ0FDRSxXQUFZLGNBQ1osWUFBYSxTQUNiLFNBQVUsVUFDVixNQUFPLElBQ1AsS0FBTSxVQUNSLENBQ0YsRUFFYUMsRUFBY0YsR0FBMkIsTUFBTSxFRkly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VyxDQUNqRCxDQUVTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQTtBQUFBO0FBQUEsUUFHSCxLQUFLLE9BQVNBLHFCQUF1QixLQUFLLE1BQU0sU0FBV0MsRUFBTztBQUFBLGlDQUV4RSxDQUNGLEVBcENhSixHQUNKLE9BQVNLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXFCVEMsRUFBQSxDQUROQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsRUFBTSxDQUFDLEdBckJqQ1AsR0FzQkosc0JBdEJJQSxHQUFOTSxFQUFBLENBRE5FLEdBQWMsbUJBQW1CLEdBQ3JCUixJQytEYixRQUFRLElBQ04sMENBQ0EsZ0NBQ0EsZ0dBQ0EsbUJBQ0YiLAogICJuYW1lcyI6IFsicHJvdmlkZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm9wZXJ0eU5hbWUiLCAib3B0aW9ucyIsICJyZXNvbHZlZE9wdGlvbnMiLCAiX19zcHJlYWRWYWx1ZXMiLCAicHJvdG8iLCAiZGVjb3JhdGVkRm5OYW1lIiwgInVwZGF0ZSIsICJ3YXRjaGVkUHJvcGVydGllcyIsICJjaGFuZ2VkUHJvcHMiLCAicHJvcGVydHkiLCAia2V5IiwgIm9sZFZhbHVlIiwgIm5ld1ZhbHVlIiwgImNyZWF0ZUNvbnRleHQiLCAiaXRlbUNvbnRleHRWYXJpYWJsZXMiLCAiaXRlbUNvbnRleHQiLCAiUXRpQXNzZXNzbWVudEl0ZW0iLCAiTGl0RWxlbWVudCIsICJfIiwgImRpc2FibGVkIiwgImNoIiwgInJlYWRvbmx5IiwgIml0ZW1Db250ZXh0VmFyaWFibGVzIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAiZmVlZGJhY2tFbGVtZW50IiwgInJlc3BvbnNlSWRlbnRpZmllciIsICJjb3VudEF0dGVtcHQiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAidmFsdWUiLCAidiIsICJ2YXJpYWJsZSIsICJtYXRjaGluZ1ZhbHVlIiwgImludGVyYWN0aW9uRWxlbWVudCIsICJlbCIsICJmZSIsICJteVJlc3BvbnNlcyIsICJyZXNwb25zZSIsICJpbnRlcmFjdGlvbiIsICJpIiwgImh0bWwiLCAic2hvdyIsICJyZXNwb25zZXMiLCAidmFyaSIsICJjciIsICJjb3VudE51bUF0dGVtcHRzIiwgIl9hIiwgInJlc3BvbnNlUHJvY2Vzc29yIiwgImlkZW50aWZpZXIiLCAiZXZlbnQiLCAib3V0Y29tZVZhcmlhYmxlIiwgIm5hbWUiLCAiZGV0YWlsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm92aWRlIiwgIml0ZW1Db250ZXh0IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiIsICJMaXRFbGVtZW50IiwgImV2ZW50IiwgInN0aW11bHVzUmVmIiwgInBhdGgiLCAic3RpbXVsdXMiLCAicXRpVHJhbnNmb3JtSXRlbSIsICJhcGkiLCAiZWxlbWVudHMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJhcmlhQm9vbGVhbkNvbnZlcnRlciIsICJ2YWx1ZSIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiQmFzZSIsICJ0eXBlIiwgIlF0aUNob2ljZSIsICJhcmdzIiwgIl9vbGRWYWx1ZSIsICJkaXNhYmxlZCIsICJldmVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJRdGlJdGVtQm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQcm9tcHQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlTdHlsZXNoZWV0IiwgIkxpdEVsZW1lbnQiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgImxpbmsiLCAicmVzcG9uc2UiLCAiY3NzQ29udGVudCIsICJtaW5pZmllZENzcyIsICJlcnJvciIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpVmFyaWFibGVEZWNsYXJhdGlvbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAidmFyaWFibGUiLCAiaHRtbFZhbHVlcyIsICJkZWZhdWx0VmFsdWVzIiwgIm4iLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpT3V0Y29tZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInRhYmxlIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlVmFsdWUiLCAidGFyZ2V0VmFsdWUiLCAib3V0Y29tZVZhcmlhYmxlIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlSZXNwb25zZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInJlc3BvbnNlVmFyaWFibGUiLCAicmVzdWx0IiwgImNvcnJlY3RSZXNwb25zZSIsICJ2YWx1ZXMiLCAiaSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyIsICJMaXRFbGVtZW50IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUNvbnRlbnRCb2R5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpUnVicmljQmxvY2siLCAiTGl0RWxlbWVudCIsICJvbGQiLCAiZGlzYWJsZWQiLCAiY2xhc3NOYW1lIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJkZWNpbWFsU2VwYXJhdG9yIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIm51bWJlciIsICJkU2VwIiwgIklzTnVsbE9yVW5kZWZpbmVkIiwgInZhbHVlIiwgInJlbW92ZURvdWJsZVNsYXNoZXMiLCAic3RyIiwgIlF0aUZlZWRiYWNrIiwgIkxpdEVsZW1lbnQiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgImlzRm91bmQiLCAiSXNOdWxsT3JVbmRlZmluZWQiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aUZlZWRiYWNrQmxvY2siLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpRmVlZGJhY2tJbmxpbmUiLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNb2RhbEZlZWRiYWNrIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImlmRGVmaW5lZCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgIkludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAib2xkIiwgImNsYXNzZXMiLCAiY2xhc3NOYW1lcyIsICJyb3dzU2V0IiwgImNsYXNzTmFtZSIsICJuclJvd3MiLCAiZXN0aW1hdGVkUm93cyIsICJ2YWwiLCAiZm9ybURhdGEiLCAidGV4dGFyZWEiLCAicGF0dGVyblNvdXJjZSIsICJwYXR0ZXJuIiwgImlzVmFsaWQiLCAiY3NzIiwgImh0bWwiLCAiZXZlbnQiLCAiaWZEZWZpbmVkIiwgImlucHV0IiwgInRleHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJjcmVhdGVSZWYiLCAiY3NzIiwgInF0aV90ZXh0X2VudHJ5X2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aVRleHRFbnRyeUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImNyZWF0ZVJlZiIsICJ2YWwiLCAiZm9ybURhdGEiLCAiaW5wdXQiLCAiaXNWYWxpZCIsICJodG1sIiwgImV2ZW50IiwgImlmRGVmaW5lZCIsICJ0ZXh0IiwgInF0aV90ZXh0X2VudHJ5X2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJxdWVyeSIsICJDaG9pY2VzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJzZWxlY3RvciIsICJDaG9pY2VzTWl4aW5FbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiY2giLCAicmVhZG9ubHkiLCAiY2hvaWNlIiwgIl9vbGRWYWx1ZSIsICJfbmV3VmFsdWUiLCAidmFsIiwgImZvcm1EYXRhIiwgInJlc3BvbnNlIiwgInZhbHVlIiwgInJlc3BvbnNlQXJyYXkiLCAic2VsZWN0ZWRDaG9pY2VzIiwgInNlbGVjdGVkQ291bnQiLCAiaXNWYWxpZCIsICJ2YWxpZGl0eU1lc3NhZ2UiLCAiZXZlbnQiLCAiY2hvaWNlRWxlbWVudCIsICJjaGVja2VkIiwgIl9hIiwgInNlbGVjdGVkSWRlbnRpZmllcnMiLCAiaXNTZWxlY3RlZCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiUXRpSG90dGV4dEludGVyYWN0aW9uIiwgIkNob2ljZXNNaXhpbiIsICJJbnRlcmFjdGlvbiIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJjc3MiLCAiaHRtbCIsICJvcHRpb24iLCAidW5zYWZlSFRNTCIsICJjaG9pY2VzIiwgImNob2ljZSIsICJzZWxlY3RlZE9wdGlvbiIsICJpIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAidmFsdWUiLCAiZXZlbnQiLCAic2VsZWN0ZWRPcHRpb25WYWx1ZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2h1ZmZsZU1peGluIiwgInN1cGVyQ2xhc3MiLCAic2VsZWN0b3IiLCAiU2h1ZmZsZUVsZW1lbnQiLCAidmFsdWUiLCAib2xkVmFsdWUiLCAiY2hvaWNlcyIsICJmaXhlZEVsZW1lbnRzIiwgIm5vbkZpeGVkRWxlbWVudHMiLCAiY2hvaWNlIiwgImluZGV4IiwgImlzU2h1ZmZsZWQiLCAibWF4QXR0ZW1wdHMiLCAiYXR0ZW1wdCIsICJvcmlnaW5hbE9yZGVyIiwgImkiLCAiaiIsICJvcmRlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RyaW5nVG9Cb29sZWFuQ29udmVydGVyIiwgInByb3BlcnR5IiwgIlZvY2FidWxhcnlNaXhpbiIsICJzdXBlckNsYXNzIiwgInNlbGVjdG9yIiwgIlZvY2FidWxhcnlFbGVtZW50IiwgInZhbHVlIiwgIl9hIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJjbGFzc0NvbnRhaW5zTGFiZWwiLCAiY2xzIiwgImlzTnVtYmVyIiwgImNob2ljZXMiLCAiYyIsICJjaG9pY2UiLCAiaW5kZXgiLCAiYSIsICJiIiwgImkiLCAibGFzdExhYmVsIiwgImxhc3RMYWJlbFN1ZmZpeCIsICJsYWJlbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3NzIiwgInF0aV9jaG9pY2VfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiUXRpQ2hvaWNlSW50ZXJhY3Rpb24iLCAiVm9jYWJ1bGFyeU1peGluIiwgIlNodWZmbGVNaXhpbiIsICJDaG9pY2VzTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlPdXRjb21lUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibG9naWMiLCAiUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IiLCAicnVsZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInJ1bGUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIm1hdGNoQ29ycmVjdCIsICJtYXBSZXNwb25zZSIsICJtYXBSZXNwb25zZVBvaW50IiwgIlF0aVJlc3BvbnNlUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicnVsZXMiLCAicnVsZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAic3BsaXR0ZWRUZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVOYW1lIiwgIm1hcFJlc3BvbnNlIiwgIm1hcFJlc3BvbnNlUG9pbnQiLCAibWF0Y2hDb3JyZWN0IiwgInN0ckhUTUwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIlF0aVJ1bGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aUxvb2t1cE91dGNvbWVWYWx1ZSIsICJRdGlSdWxlIiwgImlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgInZhbHVlIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJodG1sIiwgIlF0aVJlc3BvbnNlQ29uZGl0aW9uIiwgIlF0aVJ1bGUiLCAiaHRtbCIsICJicmFuY2hlcyIsICJpIiwgImJyYW5jaCIsICJRdGlTZXRPdXRjb21lVmFsdWUiLCAiUXRpUnVsZSIsICJvdXRjb21lSWRlbnRpZmllciIsICJleHByZXNzaW9uIiwgInZhbHVlIiwgIlF0aVNldE91dGNvbWVWYWx1ZVJ1bGUiLCAidiIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiUXRpUmVzcG9uc2VFbHNlIiwgInN1YlJ1bGVzIiwgImkiLCAiaHRtbCIsICJRdGlSZXNwb25zZUlmIiwgIlF0aVJlc3BvbnNlRWxzZSIsICJyZXN1bHQiLCAiaSIsICJRdGlSZXNwb25zZUVsc2VJZiIsICJRdGlSZXNwb25zZUlmIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJRdGlFeHByZXNzaW9uIiwgIkxpdEVsZW1lbnQiLCAiaWRlbnRpZmllciIsICJ2YWx1ZXMiLCAidiIsICJyZXNwb25zZVZhcmlhYmxlIiwgImVycm9yIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpQW5kIiwgInF0aUFuZE1peGluIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiQmFzZSIsICJjaGlsZHJlbiIsICJjIiwgImNvbmRpdGlvbiIsICJ2YWx1ZSIsICJ2YWwiLCAiZSIsICJRdGlBbmQiLCAicHJvcGVydHkiLCAiUXRpQmFzZVZhbHVlIiwgIlF0aUV4cHJlc3Npb24iLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aUNvbnRhaW5zIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAicHJvamVjdGlvbjEiLCAicHJvamVjdGlvbjIiLCAieCIsICJRdGlDb3JyZWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiaWRlbnRpZmllciIsICJyZXNwb25zZVZhcmlhYmxlIiwgInByb3BlcnR5IiwgIlF0aUVxdWFsUm91bmRlZCIsICJRdGlFeHByZXNzaW9uIiwgImZpZ3VyZXMiLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiZmxvYXQxIiwgImZsb2F0MiIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2NvcmluZ0hlbHBlciIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgImJhc2VUeXBlIiwgImludDEiLCAiaW50MiIsICJmbG9hdDEiLCAiZmxvYXQyIiwgInBhaXIxIiwgInBhaXIyIiwgIlF0aUVxdWFsIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpR3QiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlHdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlJc051bGwiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFsdWUiLCAiUXRpTHQiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlMdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9wZXJ0eSIsICJRdGlNYXBSZXNwb25zZSIsICJRdGlFeHByZXNzaW9uIiwgInJlc3BvbnNlIiwgIm1hcHBpbmciLCAiY2FuZGlkYXRlUmVzcG9uc2VzIiwgInJlc3VsdCIsICJjYW5kaWRhdGVSZXNwb25zZSIsICJtYXBwZWRWYWx1ZSIsICJlbnRyeSIsICJTY29yaW5nSGVscGVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgIlF0aU1hcHBpbmciLCAiTGl0RWxlbWVudCIsICJlbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpTWF0Y2giLCAiX1F0aU1hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlVG9NYXAiLCAiY29ycmVjdFZhbHVlSW5mbyIsICJfYSIsICJTY29yaW5nSGVscGVyIiwgImkiLCAiYW5zd2VySW5kZXgiLCAiY29ycmVjdEFuc3dlciIsICJtYXRjaGluZ1ZhbHVlIiwgImFyciIsICJtdiIsICJRdGlNZW1iZXIiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9qZWN0aW9uMSIsICJRdGlNdWx0aXBsZSIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YXJpYWJsZSIsICJodG1sIiwgIlF0aU5vdCIsICJRdGlFeHByZXNzaW9uIiwgImh0bWwiLCAiUXRpT3IiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJjIiwgImNvbmRpdGlvbiIsICJ2YWx1ZSIsICJ2YWwiLCAiUXRpT3JkZXJlZCIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YXJpYWJsZSIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlQcmludGVkVmFyaWFibGUiLCAiTGl0RWxlbWVudCIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAiYXNzZXNzbWVudEl0ZW0iLCAiaWRlbnRpZmllciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJRdGlQcm9kdWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiYWNjdW11bGF0b3IiLCAiY3VycmVudFZhbHVlIiwgImVycm9yIiwgInByb3BlcnR5IiwgIlF0aVN0cmluZ01hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAidjEiLCAidjIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpU3VtIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpU3VtRXhwcmVzc2lvbiIsICJleHByZXNzaW9ucyIsICJjIiwgInZhbHVlIiwgImEiLCAiYiIsICJRdGlWYXJpYWJsZSIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidXJsIiwgImJhc2VVcmwiLCAicmVxdWlyZUNvbmZpZyIsICJtb2R1bGVDb25nIiwgIm1vZHVsZUlkIiwgImUiLCAicGF0aCIsICJiYXNlUGF0aCIsICJwIiwgImlucHV0IiwgInRvcExldmVsS2V5IiwgIm5lc3RlZE9iamVjdCIsICJuZXN0ZWRLZXkiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAibmV3UmVzcG9uc2UiLCAic3RyaW5naWZpZWQiLCAidmFsIiwgIm5vZGUiLCAiYSIsICJjb25maWciLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJlbCIsICJwcm9wZXJ0eSIsICJrZXkiLCAiY2hpbGRyZW4iLCAiYWxsS2V5IiwgImMiLCAiayIsICJnZXRDaGlsZFByb3BlcnRpZXMiLCAicHJvcGVydGllcyIsICJjaGlsZCIsICJfX3NwcmVhZFZhbHVlcyIsICJwY2kiLCAidHlwZSIsICJkb20iLCAiYWNjIiwgImxpbmsiLCAic3R5bGVzIiwgImN0eEEiLCAicmVxdWlyZSIsICJjb250ZXh0IiwgImludGVyYWN0aW9uTW9kdWxlcyIsICJtb2R1bGVzIiwgIm1vZHVsZSIsICJwcmltYXJ5UGF0aCIsICJmYWxsYmFja1BhdGgiLCAicGF0aHMiLCAiZXhpc3RpbmdQYXRoIiwgInBhdGgxIiwgInBhdGgyIiwgInBhdGgxQXJyYXkiLCAicGF0aDJBcnJheSIsICJzdHIiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiVG91Y2hEcmFnQW5kRHJvcCIsICJfVG91Y2hEcmFnQW5kRHJvcCIsICJ0eXBlIiwgInZhbCIsICJkcmFnZ2FibGVzIiwgImVsIiwgImUiLCAieCIsICJ5IiwgImNvbXB1dGVkU3R5bGUiLCAicmVjdCIsICJjdXJyZW50VG91Y2giLCAiY29tcHV0ZWRTdHlsZXMiLCAic3R5bGUiLCAiZGVsdGFYIiwgImRlbHRhWSIsICJkcm9wVGFyZ2V0IiwgIl9hIiwgImRyb3BGb3VuZCIsICJkcmFnRW5kRXZlbnQiLCAiZXZlbnQiLCAicm9vdCIsICJkZXB0aCIsICJlbGVtZW50IiwgImN1cnJlbnRFbGVtZW50IiwgInNoYWRvd0VsZW1lbnQiLCAibmV4dERyb3Bab25lIiwgInBhZ2UiLCAidG91Y2giLCAibmV3TGVmdCIsICJuZXdUb3AiLCAiYm91bmRlZExlZnQiLCAiYm91bmRlZFRvcCIsICJib3VuZGFyeVJlY3QiLCAiZWxlbWVudFJlY3QiLCAiZWxlbWVudFdpZHRoIiwgImVsZW1lbnRIZWlnaHQiLCAiYm91bmRlZERlbHRhWCIsICJib3VuZGVkRGVsdGFZIiwgInhEaXN0IiwgInlEaXN0IiwgImV2ZW50VHlwZSIsICJidWJibGUiLCAicHJvcGVydHkiLCAiRHJvcHBhYmxlc01peGluIiwgInN1cGVyQ2xhc3MiLCAidXNlU2hhZG93Um9vdCIsICJkcm9wcGFibGVzU2VsZWN0b3IiLCAiRHJvcHBhYmxlc0VsZW1lbnQiLCAiY2hhbmdlZFByb3BzIiwgImRyb3BwYWJsZXMiLCAiZHJvcHBhYmxlIiwgIm11dGF0aW9ucyIsICJhdHRyaWJ1dGVOYW1lIiwgIl9hIiwgImV2IiwgImlkZW50aWZpZXIiLCAiZHJhZ2dhYmxlIiwgIm1vdmVFbGVtZW50IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJGbGlwcGFibGVzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJkcm9wcGFibGVzU2VsIiwgImRyYWdnYWJsZXNTZWwiLCAiRmxpcHBhYmxlc0VsZW1lbnQiLCAicHJvcGVydHkiLCAibGl2ZVF1ZXJ5IiwgInF1ZXJ5U2VsZWN0b3IiLCAib3B0aW9ucyIsICJvYnNlcnZlciIsICJyZXNvbHZlZE9wdGlvbnMiLCAiX19zcHJlYWRWYWx1ZXMiLCAicHJvdG8iLCAiZGVjb3JhdGVkRm5OYW1lIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIl9hIiwgImNhbGxiYWNrIiwgIm11dGF0aW9uTGlzdCIsICJlbGVtZW50c1RvV2F0Y2giLCAibXV0YXRpb24iLCAiYWRkZWROb2RlcyIsICJlIiwgInJlbW92ZWROb2RlcyIsICJuIiwgImVsZW1lbnRzQWRkZWQiLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgInN1cGVyQ2xhc3MiLCAiZHJhZ2dhYmxlc1NlbGVjdG9yIiwgInVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzIiwgImRyb3BwYWJsZXNTZWxlY3RvciIsICJEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCIsICJGbGlwcGFibGVzTWl4aW4iLCAiRHJvcHBhYmxlc01peGluIiwgImV2IiwgInRhcmdldCIsICJkcmFnZ2FibGUiLCAicmVzb2x2ZSIsICJoYXNNb3ZlVGVzdEl0ZW0iLCAiaXRlbXMiLCAicGVuZGluZyIsICJpdGVtIiwgImRhdGEiLCAiZHJhZ3NBZGRlZCIsICJkcmFnc1JlbW92ZWQiLCAibmV3RHJhZ2dhYmxlcyIsICJjaGFuZ2VkUHJvcHMiLCAiVG91Y2hEcmFnQW5kRHJvcCIsICJkcmFnZ2FibGVzIiwgImQiLCAiaW5kZXgiLCAicGFyZW50IiwgInRhcmdldEluZGV4IiwgIm1vdmVEcmFnZ2FibGUiLCAidHJhbnNpdGlvbiIsICJtYXhNYXRjaCIsICJkcm9wcGFibGUiLCAidmFsdWUiLCAiZW50cnkiLCAicmVzcG9uc2UiLCAiZHJvcElkIiwgImRyYWdJZHMiLCAiZHJhZ0lkIiwgImlkZW50aWZpZXIiLCAiZHJvcCIsICJtb3ZlRWxlbWVudCIsICJ2YWxpZEFzc29jaWF0aW9ucyIsICJkcmFnZ2FibGVzSW5Ecm9wcGFibGUiLCAiaWRlbnRpZmllcnMiLCAiZHJvcHBhYmxlSWRlbnRpZmllciIsICJpZCIsICJzYXZlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJsaXZlUXVlcnkiLCAiY3NzIiwgInF0aV9hc3NvY2lhdGVfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkludGVyYWN0aW9uIiwgImV2ZW50IiwgImNob2ljZSIsICJodG1sIiwgIl8iLCAiaW5kZXgiLCAicXRpX2Fzc29jaWF0ZV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpQ3VzdG9tSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidXJpVG9NYW5pZmVzdCIsICJyZW1vdmVEb3VibGVTbGFzaGVzIiwgInJlc3BvbnNlIiwgImRhdGEiLCAiZXJyIiwgImlmcmFtZSIsICJpZnJhbWVXaW4iLCAiaWZyYW1lRG9jIiwgImlmcmFtZXNJblNoYWRvd1Jvb3QiLCAib3V0ZXJJRnJhbWVzIiwgImlmcmFtZVNyYyIsICJvdXRlckRvYyIsICJlIiwgImluZGV4IiwgImlmcmFtZURvY3VtZW50IiwgImlmcmFtZXMiLCAibmVzdGVkRG9jIiwgInR5cGUiLCAiZXZlbnQiLCAibWVkaWFEYXRhIiwgIm1lZGlhIiwgInZhbCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidmFsIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJJbnRlcmFjdGlvbiIsICJodG1sIiwgInZhbHVlIiwgIm1hdGNoZXMiLCAicmVzcG9uc2UiLCAieCIsICJzcGxpdCIsICJnYXAiLCAiaW5kZXgiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaWRlbnRpZmllciIsICJ0ZXh0SWRlbnRpZmllciIsICJ0ZXh0IiwgInRleHRTcGFuIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdmciLCAiY3VzdG9tRWxlbWVudCIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgInJlcGVhdCIsICJwb3NpdGlvbkhvdHNwb3RzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJpbWciLCAiaG90c3BvdCIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImNlbnRlclhQZXIiLCAiY2VudGVyWVBlciIsICJyYWRpdXNQZXIiLCAibGVmdFgiLCAidG9wWSIsICJyaWdodFgiLCAiYm90dG9tWSIsICJsZWZ0WFBlciIsICJ0b3BZUGVyIiwgInJpZ2h0WFBlciIsICJib3R0b21ZUGVyIiwgInBvbHljb29yZHMiLCAiYWNjIiwgImN1cnJlbnRWYWx1ZSIsICJjdXJyZW50SW5kZXgiLCAicG9seUMiLCAibGFzdFZhbCIsICJwb2ludCIsICJwb2x5RCIsICJwIiwgIlF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgImxpbmUiLCAiaW5kZXgiLCAic3ZnIiwgImUiLCAiXyIsICJpIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImV2ZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicXVlcnkiLCAicXVlcnlBc3NpZ25lZEVsZW1lbnRzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImxlZnRYIiwgInRvcFkiLCAicmlnaHRYIiwgImJvdHRvbVkiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24iLCAiQ2hvaWNlc01peGluIiwgIkludGVyYWN0aW9uIiwgImh0bWwiLCAiZSIsICJpZGVudGlmaWVyIiwgImhvdHNwb3QiLCAiZWwiLCAibWF4U2VsZWN0aW9uIiwgImkiLCAiaW1nIiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUhvdHNwb3RJbnRlcmFjdGlvbiIsICJDaG9pY2VzTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAicXRpX21hdGNoX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aU1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkludGVyYWN0aW9uIiwgInJhZGlvIiwgImNoZWNrYm94IiwgInZhbHVlIiwgIm5hbWUiLCAidHlwZSIsICJ2IiwgInZhbCIsICJyZXNwb25zZVZhbHVlIiwgImh0bWwiLCAiY29sIiwgImkiLCAidW5zYWZlSFRNTCIsICJyb3ciLCAickluZGV4IiwgImNJbmRleCIsICJyb3dJZCIsICJjb2xJZCIsICJzZWxlY3RlZEluUm93Q291bnQiLCAiY2hlY2tlZCIsICJwYXJ0IiwgImRpc2FibGUiLCAiZSIsICJxdGlfbWF0Y2hfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNZWRpYUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgImh0bWwiLCAibWVkaWFPYmplY3QiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJRdGlPcmRlckludGVyYWN0aW9uIiwgIlNodWZmbGVNaXhpbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiY2hvaWNlcyIsICJodG1sIiwgIl8iLCAiaSIsICJ1bnNhZmVIVE1MIiwgInZhbHVlIiwgInJlc3BvbnNlIiwgImluZGV4IiwgInNpbXBsZUNob2ljZSIsICJ0ZXh0IiwgImRyb3BwYWJsZSIsICJkcmFnc0luRHJvcHBhYmxlIiwgImQiLCAiY2hhbmdlZFByb3BzIiwgImVsIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgIlF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQb3NpdGlvbk9iamVjdFN0YWdlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJldmVudCIsICJkZWx0YVgiLCAiZGVsdGFZIiwgImEiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicmVwZWF0IiwgInN0eWxlTWFwIiwgIlF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiZXZlbnQiLCAieCIsICJ5IiwgImh0bWwiLCAicmVwZWF0IiwgInBvaW50IiwgImluZGV4IiwgInN0eWxlTWFwIiwgImUiLCAiXyIsICJpIiwgInZhbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAibm90aGluZyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInF1ZXJ5IiwgIlF0aVNsaWRlckludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgIm9sZCIsICJkaXNhYmxlZCIsICJyZWFkb25seSIsICJ2YWx1ZSIsICJ2YWwiLCAibXlSZXNwb25zZSIsICJ2YWx1ZVBlcmNlbnRhZ2UiLCAiaHRtbCIsICJub3RoaW5nIiwgImV2ZW50IiwgImhhbmRsZVRvdWNoTW92ZSIsICJ4IiwgImRpZmZYIiwgImhhbmRsZVRvdWNoRW5kIiwgImhhbmRsZU1vdXNlTW92ZSIsICJoYW5kbGVNb3VzZVVwIiwgInZhbHVlTm93IiwgInJvdW5kZWRTdGVwVmFsdWUiLCAiX3RvdWNoTW92ZSIsICJldnQiLCAidG91Y2giLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJxdWVyeSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiUXRpQ3VzdG9tT3BlcmF0b3IiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImV2ZW50IiwgIl9hIiwgIl9iIiwgIl9jIiwgImNvbW1lbnROb2RlIiwgIm5vZGUiLCAiZSIsICJmbiIsICJyZXNwb25zZUlkZW50aWZpZXIiLCAidiIsICJpdGVtIiwgInZhcmlhYmxlSWRlbnRpZmllciIsICJvdXRjb21lSWRlbnRpZmllciIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlBc3NvY2lhYmxlSG90c3BvdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXAiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUdhcEltZyIsICJMaXRFbGVtZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwVGV4dCIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUhvdHNwb3RDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3R0ZXh0IiwgIkFjdGl2ZUVsZW1lbnRNaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlJbmxpbmVDaG9pY2UiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlTaW1wbGVDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJub3RoaW5nIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K
|
|
701
|
+
`,n([on({type:String,attribute:!1})],oe.prototype,"marker",2),oe=n([sn("qti-simple-choice")],oe);console.log("%cC\xBFTO%cLab%c: qti-components loaded","font-weight:bold; color:green",'font-family: "PT Sans", font-weight:bold; color:green; font-size: smaller;vertical-align: sub',"font-weight:unset");export{_ as ActiveElementMixin,u as Interaction,Fe as QtiAnd,w as QtiAssessmentItem,W as QtiAssessmentStimulusRef,ke as QtiAssociableHotspot,G as QtiAssociateInteraction,Be as QtiBaseValue,Z as QtiChoiceInteraction,Ve as QtiCompanionMaterialsInfo,k as QtiConditionExpression,ot as QtiContains,He as QtiContentBody,nt as QtiCorrect,H as QtiCustomInteraction,Se as QtiCustomOperator,Q as QtiEndAttemptInteraction,Ye as QtiEqual,Xe as QtiEqualRounded,h as QtiExpression,S as QtiExtendedTextInteraction,ce as QtiFeedbackBlock,pe as QtiFeedbackInline,te as QtiGap,re as QtiGapImg,ve as QtiGapMatchInteraction,ie as QtiGapText,N as QtiGraphicAssociateInteraction,ye as QtiGraphicGapMatchInteraction,xe as QtiGraphicOrderInteraction,at as QtiGt,lt as QtiGte,se as QtiHotspotChoice,Ee as QtiHotspotInteraction,Me as QtiHottext,Pe as QtiHottextInteraction,_e as QtiInlineChoice,F as QtiInlineChoiceInteraction,ct as QtiIsNull,ne as QtiItemBody,Ue as QtiLookupOutcomeValue,pt as QtiLt,dt as QtiLte,je as QtiMapResponse,J as QtiMapping,mt as QtiMatch,Y as QtiMatchInteraction,qe as QtiMediaInteraction,ht as QtiMember,de as QtiModalFeedback,ft as QtiMultiple,gt as QtiNot,bt as QtiOr,P as QtiOrderInteraction,vt as QtiOrdered,R as QtiOutcomeDeclaration,me as QtiOutcomeProcessing,et as QtiOutcomeProcessingProcessor,B as QtiPortableCustomInteraction,we as QtiPositionObjectStage,ge as QtiPrintedVariable,yt as QtiProduct,Le as QtiPrompt,tt as QtiResponseCondition,I as QtiResponseDeclaration,he as QtiResponseElse,st as QtiResponseElseIf,fe as QtiResponseIf,z as QtiResponseProcessing,L as QtiRubricBlock,D as QtiRule,We as QtiSPositionObjectInteraction,j as QtiSelectPointInteraction,rt as QtiSetOutcomeValue,it as QtiSetOutcomeValueRule,X as QtiSimpleAssociableChoice,oe as QtiSimpleChoice,C as QtiSliderInteraction,ze as QtiStringMatch,Ae as QtiStylesheet,xt as QtiSum,Et as QtiSumExpression,A as QtiTextEntryInteraction,Ct as QtiVariable,E as itemContext,Lt as itemContextVariables,rs as qtiAndMixin};
|
|
702
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1ydWxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWFwaS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJvcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZmxpcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHByb3ZpZGUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHMsIE91dGNvbWVDaGFuZ2VkRGV0YWlscyB9IGZyb20gJy4uL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVWYWx1ZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUsIFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2snO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFF0aVJlc3BvbnNlUHJvY2Vzc2luZyB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCwgaXRlbUNvbnRleHRWYXJpYWJsZXMgfSBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICBwcml2YXRlIF9jb250ZXh0OiBJdGVtQ29udGV4dCA9IHtcbiAgICBpZGVudGlmaWVyOiB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgIHZhcmlhYmxlczogaXRlbUNvbnRleHRWYXJpYWJsZXNcbiAgfTtcblxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh7XG4gICAgICBpZGVudGlmaWVyOiB2LmlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgIHR5cGU6IHYudHlwZSxcbiAgICAgIC8vIGFkZCBleHRlcm5hbHNjb3JlZCwgYSBmaXhlZCBwcm9wIHRvIHRoZSB0ZXN0LCBzbyB0aGUgdGVzdGNvbnRleHQgY2FuIHJlYWQgYW5kIGRlY2lkZSBob3cgdG8gc2NvcmUgdGhpcyBpdGVtXG4gICAgICAuLi4odi50eXBlID09PSAnb3V0Y29tZScgJiYgdi5pZGVudGlmaWVyID09PSAnU0NPUkUnXG4gICAgICAgID8geyBleHRlcm5hbFNjb3JlZDogKHYgYXMgT3V0Y29tZVZhcmlhYmxlKS5leHRlcm5hbFNjb3JlZCB9XG4gICAgICAgIDoge30pXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YXJpYWJsZXModmFsdWU6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5zb21lKHYgPT4gISgnaWRlbnRpZmllcicgaW4gdikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhcmlhYmxlcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgVmFyaWFibGVEZWNsYXJhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQudmFsdWUgPSB2YXJpYWJsZS52YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnZhbHVlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgZSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KHByb3RvOiBFbGVtQ2xhc3MsIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+KSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KFN5bWJvbCgnaXRlbScpKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSB9IGZyb20gJy4uLy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjdXN0b20gZWxlbWVudCBmb3IgcmVmZXJlbmNpbmcgYW4gYXNzZXNzbWVudCBzdGltdWx1cy5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZicpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaHJlZiBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaHJlZiA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgaWYgdGhlICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJyBldmVudCBpcyBub3QgcHJldmVudGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBpc1ByZXZlbnRlZCA9IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcblxuICAgICAgY29uc3Qgc3RpbXVsdXNSZWYgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0aW11bHVzLWlkcmVmPSR7dGhpcy5pZGVudGlmaWVyfV1gKTtcbiAgICAgIGlmIChzdGltdWx1c1JlZikge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkucGF0aChwYXRoKS5odG1sRG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykgeyAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlciwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydGVyIHRvIGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMgZm9yIEFSSUEgcHJvcGVydGllcyxcbiAqIGVuc3VyaW5nIHRoZXkgYXJlIHNldCBhcyAndHJ1ZScgb3IgJ2ZhbHNlJyBzdHJpbmdzLlxuICovXG5jb25zdCBhcmlhQm9vbGVhbkNvbnZlcnRlcjogQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxib29sZWFuLCBib29sZWFuPiA9IHtcbiAgdG9BdHRyaWJ1dGU6ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJyksXG4gIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdmFsdWUgPT09ICd0cnVlJ1xufTtcblxuLyoqXG4gKiBBIG1peGluIHRoYXQgYWRkcyBjaG9pY2UgZnVuY3Rpb25hbGl0eSB0byBhIExpdEVsZW1lbnQtYmFzZWQgY2xhc3MuXG4gKiBJdCBkaXNwYXRjaGVzIGV2ZW50cyB3aXRoIGEgY3VzdG9tIGB0eXBlYCBhbmQgaGFuZGxlcyBzZWxlY3Rpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIEJhc2UgLSBUaGUgYmFzZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjaG9pY2UsIHVzZWQgaW4gZXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIG5ldyBjbGFzcyBleHRlbmRpbmcgdGhlIGJhc2UgY2xhc3Mgd2l0aCBjaG9pY2UgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHRhYkluZGV4OiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbiAgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBBY3RpdmVFbGVtZW50TWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihCYXNlOiBULCB0eXBlOiBzdHJpbmcpIHtcbiAgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGlkZW50aWZpZXIgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAndGFiaW5kZXgnIH0pXG4gICAgcHVibGljIHRhYkluZGV4ID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLXJlYWRvbmx5JyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyByZWFkb25seSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgaGFuZGxlRGlzYWJsZWRDaGFuZ2UoX29sZFZhbHVlOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgdGhpcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgdW5yZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX29uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FjdGl2YXRlKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9PihgYWN0aXZhdGUtJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUNob2ljZSBhcyBDb25zdHJ1Y3RvcjxBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2U+ICYgVDtcbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWl0ZW0tYm9keS5zdHlsZXMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1pdGVtLWJvZHkgbm9kZSBjb250YWlucyB0aGUgdGV4dCwgZ3JhcGhpY3MsIG1lZGlhIG9iamVjdHMgYW5kIGludGVyYWN0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBpdGVtJ3MgY29udGVudCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IGlzIHN0cnVjdHVyZWQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnNwaHBvNmx1NnpxaVxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAc2xvdCAtIGl0ZW0gYm9keSBjb250ZW50LlxuICogQHNsb3QgcXRpLXJ1YnJpYy1ibG9jayAtIHRoZSBxdGkgcnVicmljIGJsb2NrIGlzIHBsYWNlZCBhYm92ZSB0aGUgaXRlbVxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pdGVtLWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGlmIChpbkludGVyYWN0aW9uKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcm9tcHQnKTtcbiAgICB9XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgaWYgKGxpbmsgIT09IG51bGwpIHtcbiAgICAgIC8vIEZldGNoIHRoZSBzdHlsZXNoZWV0IGNvbnRlbnRcbiAgICAgIGZldGNoKGxpbmspXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oY3NzQ29udGVudCA9PiB7XG4gICAgICAgICAgLy8gTWluaWZ5IHRoZSBDU1MgY29udGVudCBieSByZW1vdmluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50c1xuICAgICAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIENTU1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBwYXJlbnQgZWxlbWVudCB0byBhcHBlbmQgdGhlIHNjb3BlZCBzdHlsZXNoZWV0IHRvLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzdHlsZXNoZWV0OicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQgIT09IG51bGwgJiYgdGhpcy50ZXh0Q29udGVudC50cmltKCkgIT09ICcnKSB7XG4gICAgICAvLyBNaW5pZnkgdGhlIGlubGluZSBDU1MgY29udGVudFxuICAgICAgY29uc3QgbWluaWZpZWRDc3MgPSB0aGlzLm1pbmlmeUNzcyh0aGlzLnRleHRDb250ZW50KTtcblxuICAgICAgLy8gRGlyZWN0bHkgY3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggdGhlIEBzY29wZSBzdXJyb3VuZGluZyB0aGUgbWluaWZpZWQgaW5saW5lIHN0eWxlc1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBwYXJlbnQgZWxlbWVudCB0byBhcHBlbmQgdGhlIHNjb3BlZCBzdHlsZXNoZWV0IHRvLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWluaWZ5Q3NzKGNzc0NvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlIGNvbW1lbnRzLCB3aGl0ZXNwYWNlLCBhbmQgbmV3bGluZSBjaGFyYWN0ZXJzXG4gICAgcmV0dXJuIGNzc0NvbnRlbnRcbiAgICAgIC5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKSAvLyBSZW1vdmUgY29tbWVudHNcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJykgLy8gQ29sbGFwc2Ugd2hpdGVzcGFjZVxuICAgICAgLnJlcGxhY2UoL1xccyooW3t9OjtdKVxccyovZywgJyQxJykgLy8gUmVtb3ZlIHNwYWNlcyBhcm91bmQge30sIDosIDtcbiAgICAgIC50cmltKCk7IC8vIFRyaW0gbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IHJlbW92ZSBzdHlsZXNoZWV0OicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc3R5bGVzaGVldCc6IFF0aVN0eWxlc2hlZXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MLnRyaW0oKSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMubGVuZ3RoID4gMSB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNbMF07XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nOiBRdGlWYXJpYWJsZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlNYXBwaW5nIH0gZnJvbSAnLi4vLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcHBpbmcvcXRpLW1hcHBpbmcnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHtcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY29ycmVjdFJlc3BvbnNlOiB0aGlzLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5IHx8ICdzaW5nbGUnLFxuICAgICAgbWFwcGluZzogdGhpcy5tYXBwaW5nLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgY2FuZGlkYXRlUmVzcG9uc2U6IG51bGxcbiAgICB9O1xuICAgIHJlc3BvbnNlVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMocmVzcG9uc2VWYXJpYWJsZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogcmVzcG9uc2VWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIGNvbnN0IGNvcnJlY3RSZXNwb25zZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICBpZiAoY29ycmVjdFJlc3BvbnNlKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBjb3JyZWN0UmVzcG9uc2UucXVlcnlTZWxlY3RvckFsbCgncXRpLXZhbHVlJyk7XG4gICAgICBpZiAodGhpcy5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdLnRleHRDb250ZW50O1xuICAgICAgICB2YWx1ZXNbMF0ucmVtb3ZlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlc1tpXS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgdmFsdWVzW2ldLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBtYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1tYXBwaW5nJykgYXMgUXRpTWFwcGluZztcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nOiBRdGlSZXNwb25zZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbycpXG5leHBvcnQgY2xhc3MgUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvLyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAvLyAgIHNsb3Qge1xuICAvLyAgICAgZGlzcGxheTogaGlkZGVuO1xuICAvLyAgIH1cbiAgLy8gYDtcbiAgLy8gb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAvLyAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+IGA7XG4gIC8vIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbyc6IFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm87XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29udGVudC1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlDb250ZW50Qm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb250ZW50LWJvZHknOiBRdGlDb250ZW50Qm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVicmljLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlSdWJyaWNCbG9jayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgb3ZlcnJpZGUgaWQ7IC8vID1cInF0aUFzcGVjdEluaG91ZFJ1YnJpY0Jsb2NrXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdXNlOiAnaW5zdHJ1Y3Rpb25zJyB8ICdzY29yaW5nJyB8ICduYXZpZ2F0aW9uJzsgLy8gID0gXCJzY29yaW5nXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdmlldzogJ2F1dGhvcicgfCAnY2FuZGlkYXRlJyB8ICdwcm9jdG9yJyB8ICdzY29yZXInIHwgJ3Rlc3RDb25zdHJ1Y3RvcicgfCAndHV0b3InO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuY2xhc3NOYW1lcy5zcGxpdCgnICcpO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtZGlzY3JldGlvbmFyeS1wbGFjZW1lbnQnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1pbmxpbmUnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBieSBkZWZhdWx0IHB1dCB0aGlzIGluIGEgc2xvdCBpbiB0aGUgaXRlbS1ib2R5XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWJyaWMtYmxvY2snOiBRdGlSdWJyaWNCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IFByb3BlcnR5VmFsdWVNYXAsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0Jsb2NrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub24ge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cImZlZWRiYWNrICR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1Nob3dGZWVkYmFjayh0aGlzLm91dGNvbWVJZGVudGlmaWVyKTtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWJsb2NrJzogUXRpRmVlZGJhY2tCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJc051bGxPclVuZGVmaW5lZCB9IGZyb20gJy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUZlZWRiYWNrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnc2hvdy1oaWRlJyB9KVxuICBwcm90ZWN0ZWQgc2hvd0hpZGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ291dGNvbWUtaWRlbnRpZmllcicgfSlcbiAgcHVibGljIG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHByb3RlY3RlZCBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzaG93U3RhdHVzOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nob3dGZWVkYmFjayhvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nKSB7ICAgIFxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IG91dGNvbWVJZGVudGlmaWVyKSB8fCBudWxsOztcblxuICAgIGlmICh0aGlzLm91dGNvbWVJZGVudGlmaWVyICE9PSBvdXRjb21lSWRlbnRpZmllciB8fCAhb3V0Y29tZVZhcmlhYmxlKSByZXR1cm47XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRjb21lVmFyaWFibGUudmFsdWUpKSB7XG4gICAgICBpc0ZvdW5kID0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlLmluY2x1ZGVzKHRoaXMuaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRm91bmQgPVxuICAgICAgICAoIUlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAhSXNOdWxsT3JVbmRlZmluZWQob3V0Y29tZVZhcmlhYmxlPy52YWx1ZSkgJiZcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPT09IG91dGNvbWVWYXJpYWJsZS52YWx1ZSkgfHxcbiAgICAgICAgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZGJhY2soaXNGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikgeyAgICBcbiAgICB0aGlzLnNob3dTdGF0dXMgPSAodmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ3Nob3cnKSB8fCAoIXZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdoaWRlJykgPyAnb24nIDogJ29mZic7ICAgIFxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoMC4xKS5yZXBsYWNlKC9cXGQvZywgJycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0ID0gKG51bWJlcjogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gIC8vIGNoZWNrIGlmIHR5cGUgaXMgc3RyaW5nXG4gIGlmICh0eXBlb2YgbnVtYmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgY29uc3QgZFNlcCA9IGRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgaWYgKGRTZXAgPT09ICcuJykge1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKGRTZXAsICcuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBJc051bGxPclVuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWlubGluZScpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tJbmxpbmUgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWlubGluZSc6IFF0aUZlZWRiYWNrSW5saW5lO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbW9kYWwtZmVlZGJhY2snKVxuZXhwb3J0IGNsYXNzIFF0aU1vZGFsRmVlZGJhY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1vZGFsLWZlZWRiYWNrJzogUXRpTW9kYWxGZWVkYmFjaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcm93cyA9IDU7XG5cbiAgLyoqIGV4cGVjdGVkIGxlbmd0aCBpcyBtYXBwZWQgdG8gdGhlIHByb3BlcnR5IG1heGxlbmd0aCBvbiB0aGUgdGV4dGFyZWEgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgLyoqIHRleHQgYXBwZWFyaW5nIGluIHRoZSBleHRlbmRlZC10ZXh0LW50ZXJhY3Rpb24gaWYgaXQgaXMgZW1wdHkgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgbGV0IHJvd3NTZXQgPSBmYWxzZTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMtJykpIHtcbiAgICAgICAgY29uc3QgbnJSb3dzID0gY2xhc3NOYW1lLnJlcGxhY2UoJ3F0aS1oZWlnaHQtbGluZXMtJywgJycpO1xuICAgICAgICB0aGlzLl9yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgcm93c1NldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSWYgbm8gcXRpLWhlaWdodC1saW5lcyBjbGFzcyBpcyBzZXQsIGNhbGN1bGF0ZSByb3dzIGJhc2VkIG9uIGV4cGVjdGVkTGVuZ3RoXG4gICAgaWYgKCFyb3dzU2V0ICYmIHRoaXMuZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVzdGltYXRlZFJvd3MgPSBNYXRoLmNlaWwodGhpcy5leHBlY3RlZExlbmd0aCAvIDUwKTsgLy8gICc1MCcgYmFzZWQgb24gYW4gZXN0aW1hdGUgZm9yIGNoYXJhY3RlcnMgcGVyIHJvd1xuICAgICAgdGhpcy5fcm93cyA9IGVzdGltYXRlZFJvd3M7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaW5pdGlhbGx5XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgY29uc3QgcGF0dGVyblNvdXJjZSA9XG4gICAgICAgIHRoaXMucGF0dGVybk1hc2suc3RhcnRzV2l0aCgnXicpICYmIHRoaXMucGF0dGVybk1hc2suZW5kc1dpdGgoJyQnKSA/IHRoaXMucGF0dGVybk1hc2sgOiBgXiR7dGhpcy5wYXR0ZXJuTWFza30kYDtcblxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblNvdXJjZSk7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpICYmIHBhdHRlcm4udGVzdCh0ZXh0YXJlYS52YWx1ZSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRleHRhcmVhLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiJHs1MDAwfVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgcm93cz1cIiR7dGhpcy5fcm93c31cIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAgIC52YWx1ZT0ke3RoaXMuX3ZhbHVlfVxuICAgICAgPjwvdGV4dGFyZWE+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBJSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQgPSB0cnVlOyAvLyBFbmFibGUgZm9ybSBhc3NvY2lhdGlvblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllciA9ICcnO1xuICAvKiogZGlzYWJsZWQgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiByZWFkb25seSBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIF9jb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIHByb3RlY3RlZCBfaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgfVxuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW107XG4gIGFic3RyYWN0IHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgfVxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaWYgdGhlIGlucHV0IGlzIHZhbGlkXG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpOyAvLyBDbGVhciB0aGUgY3VzdG9tIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7IC8vIFNldCBjdXN0b20gbWVzc2FnZSBvbmx5IGlmIGludmFsaWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD0kezEwMDB9XG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb3JyZWN0XCI+JHt0aGlzLl9jb3JyZWN0UmVzcG9uc2V9PC9kaXY+XG4gICAgYDtcbiAgfVxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuICBbcGFydD0nY29ycmVjdCddIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEuMXJlbTtcbiAgICBtaW4td2lkdGg6IDEuMXJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyLjNyZW07XG4gICAgbWluLXdpZHRoOiAyLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMy4zcmVtO1xuICAgIG1pbi13aWR0aDogMy4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQuMnJlbTtcbiAgICBtaW4td2lkdGg6IDQuMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA2LjZyZW07XG4gICAgbWluLXdpZHRoOiA2LjZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDhyZW07XG4gICAgbWluLXdpZHRoOiA4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxMnJlbTtcbiAgICBtaW4td2lkdGg6IDEycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxN3JlbTtcbiAgICBtaW4td2lkdGg6IDE3cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBtaW4td2lkdGg6IDIwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyNHJlbTtcbiAgICBtaW4td2lkdGg6IDI0cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyOHJlbTtcbiAgICBtaW4td2lkdGg6IDI4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzMnJlbTtcbiAgICBtaW4td2lkdGg6IDMycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00NSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzNnJlbTtcbiAgICBtaW4td2lkdGg6IDM2cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC01MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0MHJlbTtcbiAgICBtaW4td2lkdGg6IDQwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC03MikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA1N3JlbTtcbiAgICBtaW4td2lkdGg6IDU3cmVtO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90dGV4dCcpIHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nLCAnJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYDxzbG90Pjwvc2xvdD5gO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dC1pbnRlcmFjdGlvbic6IFF0aUhvdHRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbmltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gJy4uL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IHR5cGUgQ2hvaWNlID0gSFRNTEVsZW1lbnQgJiBDaG9pY2VJbnRlcmZhY2UgJiB7IGludGVybmFsczogRWxlbWVudEludGVybmFscyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZXNJbnRlcmZhY2UgZXh0ZW5kcyBJSW50ZXJhY3Rpb24ge1xuICBfY2hvaWNlRWxlbWVudHM6IEFycmF5PENob2ljZT47XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHB1YmxpYyBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcXVlcnkoJyN2YWxpZGF0aW9uTWVzc2FnZScpXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtaW5DaG9pY2VzID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1heENob2ljZXMgPSAxO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlKF9vbGRWYWx1ZTogbnVtYmVyLCBfbmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgfVxuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgICB9O1xuXG4gICAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IChjaG9pY2UucmVhZG9ubHkgPSByZWFkb25seSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZS5qb2luKCcsJykgOiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1pbmcgdGhpcy52YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdGhpcy5fdmFsdWUuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGlzLnZhbHVlIGlzIG5vdCBhbiBhcnJheVxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGlmIChyZXNwb25zZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGg7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgdmFsaWRpdHlNZXNzYWdlID0gJyc7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzICE9PSAwICYmIHNlbGVjdGVkQ291bnQgPiB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWF4U2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBjYW4gc2VsZWN0IGF0IG1vc3QgJHt0aGlzLm1heENob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA8IHRoaXMubWluQ2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5taW5TZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0ICR7dGhpcy5taW5DaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoXG4gICAgICAgICAgaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogdHJ1ZSB9LFxuICAgICAgICAgIHZhbGlkaXR5TWVzc2FnZSxcbiAgICAgICAgICBzZWxlY3RlZENob2ljZXNbc2VsZWN0ZWRDb3VudCAtIDFdIHx8IHRoaXMuX2Nob2ljZUVsZW1lbnRzWzBdIHx8IHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX2ludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIGNob2ljZUVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG5cbiAgICAgIFxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMucHVzaChjaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gY2hvaWNlICE9PSBjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRlcm1pbmVJbnB1dFR5cGUoKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQ6IENob2ljZSkge1xuICAgICAgLy8gY2hvaWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94Jyk7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCc7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5zdGF0ZXMuYWRkKGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUpXG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmFyaWFSZWFkT25seSA9IHRoaXMucmVhZG9ubHkgPT0gdHJ1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9Pikge1xuICAgICAgdGhpcy5fdG9nZ2xlQ2hvaWNlQ2hlY2tlZChldmVudC50YXJnZXQgYXMgQ2hvaWNlKTtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICAgIGlmIChjaG9pY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UsIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChjaG9pY2UuaW50ZXJuYWxzPy5zdGF0ZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAndHJ1ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8ICcnIDogc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBjaG9pY2UgZWxlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZSA6IFt0aGlzLl92YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGlzU2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUNob2ljZUludGVyYWN0aW9uXG4gIGV4dGVuZHMgVm9jYWJ1bGFyeU1peGluKFxuICAgIFNodWZmbGVNaXhpbihDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktc2ltcGxlLWNob2ljZScpLCAncXRpLXNpbXBsZS1jaG9pY2UnKSxcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnXG4gIClcbiAgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlXG57XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCIgaWQ9XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBTaHVmZmxlSW50ZXJmYWNlIHt9XG5leHBvcnQgY29uc3QgU2h1ZmZsZU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2h1ZmZsZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9zaHVmZmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGNvbnZlcnRlcjogc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBzZXQgc2h1ZmZsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zaHVmZmxlO1xuICAgICAgdGhpcy5fc2h1ZmZsZSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoJ3NodWZmbGUnLCBvbGRWYWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IHNodWZmbGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc2h1ZmZsZTtcbiAgICB9XG5cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAvLyBDYWxsIF9yZXNldFNodWZmbGVDaG9pY2VzIGluaXRpYWxseSB0byBzZXQgdGhlIENTUyBvcmRlciB0byBpbml0aWFsLlxuICAgICAgLy8gSWYgc2h1ZmZsZSBpcyB0cnVlLCBfc2h1ZmZsZUNob2ljZXMgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIHNldHRlci5cbiAgICAgIGlmICh0aGlzLnNodWZmbGUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oc2VsZWN0b3IpKTtcbiAgICAgIGNvbnN0IGZpeGVkRWxlbWVudHM6IEFycmF5PHsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICAgIGNvbnN0IG5vbkZpeGVkRWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xuXG4gICAgICAvLyBTZXBhcmF0ZSBmaXhlZCBhbmQgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBmaXhlZEVsZW1lbnRzLnB1c2goeyBlbGVtZW50OiBjaG9pY2UsIGluZGV4OiBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub25GaXhlZEVsZW1lbnRzLnB1c2goY2hvaWNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSAxIG9yIGZld2VyIG5vbi1maXhlZCBlbGVtZW50cywgdGhyb3cgYW4gZXJyb3IgKG5vIHNodWZmbGUgcG9zc2libGUpXG4gICAgICBpZiAobm9uRml4ZWRFbGVtZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NodWZmbGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBmZXdlciB0aGFuIDIgbm9uLWZpeGVkIGVsZW1lbnRzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBpc1NodWZmbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEwOyAvLyBNYXggYXR0ZW1wdHMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuXG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcmRlciBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3Qgb3JpZ2luYWxPcmRlciA9IFsuLi5ub25GaXhlZEVsZW1lbnRzXTtcblxuICAgICAgLy8gU2h1ZmZsZSB1bnRpbCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCBvciBtYXhBdHRlbXB0cyBpcyByZWFjaGVkXG4gICAgICB3aGlsZSAoIWlzU2h1ZmZsZWQgJiYgYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF0dGVtcHQrKztcblxuICAgICAgICAvLyBTaHVmZmxlIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gbm9uRml4ZWRFbGVtZW50cy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIFtub25GaXhlZEVsZW1lbnRzW2ldLCBub25GaXhlZEVsZW1lbnRzW2pdXSA9IFtub25GaXhlZEVsZW1lbnRzW2pdLCBub25GaXhlZEVsZW1lbnRzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzaHVmZmxlZCByZXN1bHQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIG9yZGVyXG4gICAgICAgIGlzU2h1ZmZsZWQgPSAhbm9uRml4ZWRFbGVtZW50cy5ldmVyeSgoY2hvaWNlLCBpbmRleCkgPT4gY2hvaWNlID09PSBvcmlnaW5hbE9yZGVyW2luZGV4XSk7XG5cbiAgICAgICAgaWYgKGlzU2h1ZmZsZWQpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU2h1ZmZsZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2h1ZmZsZSB0aGUgY2hvaWNlcyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIG9yZGVyIHRvIGVhY2ggZWxlbWVudFxuICAgICAgbGV0IG9yZGVyID0gMTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBub25GaXhlZENob2ljZSA9IG5vbkZpeGVkRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgICBub25GaXhlZENob2ljZSEuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRTaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsICdpbml0aWFsJyk7IC8vIGNob2ljZS5zdHlsZS5vcmRlciA9ICdpbml0aWFsJztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2h1ZmZsZUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUO1xufTtcblxuY29uc3Qgc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyID0ge1xuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIH0sXG4gIHRvQXR0cmlidXRlKHZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG59O1xuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG50eXBlIExhYmVsVHlwZSA9ICdxdGktbGFiZWxzLWRlY2ltYWwnIHwgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnIHwgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xudHlwZSBMYWJlbFN1ZmZpeFR5cGUgPSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJyB8ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyc7XG5cbmRlY2xhcmUgY2xhc3MgVm9jYWJ1bGFyeUludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgVm9jYWJ1bGFyeU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgVm9jYWJ1bGFyeUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9jbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2FsbExhYmVscyA9IFsncXRpLWxhYmVscy1kZWNpbWFsJywgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnLCAncXRpLWxhYmVscy11cHBlci1hbHBoYSddO1xuICAgIHByaXZhdGUgX2FsbExhYmVsU3VmZml4ZXMgPSBbJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcsICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyddIGFzIExhYmVsU3VmZml4VHlwZVtdO1xuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlXG4gICAgfSlcbiAgICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2NsYXNzZXMuam9pbignICcpO1xuICAgICAgdGhpcy5fY2xhc3NlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgLy8gdGhpcy5yZXF1ZXN0VXBkYXRlKCdjbGFzcycsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fY2xhc3Nlcz8uam9pbignICcpIHx8ICcnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzaHVmZmxlJykpIHtcbiAgICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkTGFiZWxzKCkge1xuICAgICAgY29uc3QgY2xhc3NDb250YWluc0xhYmVsID0gdGhpcy5fY2xhc3Nlcy5zb21lKFxuICAgICAgICBjbHMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGNscykgfHwgdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjbHMgYXMgTGFiZWxTdWZmaXhUeXBlKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKCt2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgaWYgKGNsYXNzQ29udGFpbnNMYWJlbCkge1xuICAgICAgICBjb25zdCBjaG9pY2VFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoYyA9PiBjIGFzIFF0aVNpbXBsZUNob2ljZSk7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBjaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBlbDogY2hvaWNlLCBvcmRlcjogaXNOdW1iZXIoY2hvaWNlLnN0eWxlLm9yZGVyKSA/ICtjaG9pY2Uuc3R5bGUub3JkZXIgOiBpbmRleCArIDEgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcilcbiAgICAgICAgICAubWFwKGNob2ljZSA9PiBjaG9pY2UuZWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAoY2hvaWNlc1tpXSBhcyBRdGlTaW1wbGVDaG9pY2UpLm1hcmtlciA9IHRoaXMuX2dldExhYmVsKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9nZXRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgICBsZXQgbGFzdExhYmVsID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoYykpLnBvcCgpIGFzIExhYmVsVHlwZTtcbiAgICAgIGNvbnN0IGxhc3RMYWJlbFN1ZmZpeCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjIGFzIExhYmVsU3VmZml4VHlwZSkpLnBvcCgpO1xuXG4gICAgICBpZiAoIWxhc3RMYWJlbCAmJiBsYXN0TGFiZWxTdWZmaXgpIHtcbiAgICAgICAgLy8gYSBzdWZmaXggd2l0aG91dCBhIGxhYmVsIGlzIHN0cmFuZ2Ugc28gYWRkIHF0aS1sYWJlbHMtdXBwZXItYWxwaGFcbiAgICAgICAgbGFzdExhYmVsID0gJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xuICAgICAgfVxuICAgICAgbGV0IGxhYmVsID0gJyc7XG4gICAgICBzd2l0Y2ggKGxhc3RMYWJlbCkge1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWRlY2ltYWwnOlxuICAgICAgICAgIGxhYmVsID0gYCR7aW5kZXh9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1sb3dlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJykge1xuICAgICAgICBsYWJlbCArPSAnLic7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJykge1xuICAgICAgICBsYWJlbCArPSBgKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuICB9XG4gIHJldHVybiBWb2NhYnVsYXJ5RWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxWb2NhYnVsYXJ5SW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tcXRpLWdhcC1zaXplKTtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gIH1cblxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1jaG9pY2UpIHtcbiAgICBmbGV4OiAwIDBcbiAgICAgIGNhbGMoKDEwMCUgLSAodmFyKC0tcXRpLWdhcC1zaXplKSAqIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSkgLyB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkgIWltcG9ydGFudDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDE7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMikgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDI7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTMpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAzO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy00KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNDtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDU7XG4gIH1cbiAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBsb2dpYyA9IG5ldyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvcigpO1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgICBsb2dpYy5wcm9jZXNzKHJ1bGVzKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJzogUXRpT3V0Y29tZVByb2Nlc3Npbmc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yIHtcbiAgcHVibGljIHByb2Nlc3MocnVsZXM6IFF0aVJ1bGVCYXNlW10pIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBtYXBSZXNwb25zZSwgbWFwUmVzcG9uc2VQb2ludCwgbWF0Y2hDb3JyZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncyc7XG5pbXBvcnQgeyB0eXBlIFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykpIHtcbiAgICAgIGNvbnN0IHNwbGl0dGVkVGVtcGxhdGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykhLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBzcGxpdHRlZFRlbXBsYXRlTmFtZVtzcGxpdHRlZFRlbXBsYXRlTmFtZS5sZW5ndGggLSAxXS5yZXBsYWNlKCcueG1sJywgJycpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN3aXRjaCAodGVtcGxhdGVOYW1lKSB7XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZSc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlX3BvaW50Jzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2VQb2ludCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hdGNoX2NvcnJlY3QnOlxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWF0Y2hDb3JyZWN0KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmcmFnbWVudEZyb21TdHJpbmcoc3RySFRNTDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0ckhUTUwpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJzogUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG1hdGNoQ29ycmVjdCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLW1hdGNoPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgICA8cXRpLWNvcnJlY3QgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktY29ycmVjdD5cbiAgICAgIDwvcXRpLW1hdGNoPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MTwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wLjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+IDwvcXRpLW1hcC1yZXNwb25zZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlUG9pbnQgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UtcG9pbnQgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktbWFwLXJlc3BvbnNlLXBvaW50PlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuIiwgImltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJ0BjaXRvbGFiL3F0aS1jb21wb25lbnRzL3F0aS1jb21wb25lbnRzJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuLyoqXG4gKiBUaGUgbG9va3VwT3V0Y29tZVZhbHVlIHJ1bGUgc2V0cyB0aGUgdmFsdWUgb2YgYW4gb3V0Y29tZSB2YXJpYWJsZSB0byB0aGUgdmFsdWUgb2J0YWluZWRcbiAqIGJ5IGxvb2tpbmcgdXAgdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24gaW4gdGhlIGxvb2t1cFRhYmxlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIG91dGNvbWUncyBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIGdldCBjaGlsZEV4cHJlc3Npb24oKTogUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUpIHtcbiAgICAgIHZhbHVlID0gb3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZS5nZXQocGFyc2VJbnQodGhpcy5jaGlsZEV4cHJlc3Npb24uY2FsY3VsYXRlKCkpKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignbG9va3VwT3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJywgUXRpTG9va3VwT3V0Y29tZVZhbHVlKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJzogUXRpTG9va3VwT3V0Y29tZVZhbHVlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1bGUnKVxuZXhwb3J0IGNsYXNzIFF0aVJ1bGUgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpUnVsZUJhc2Uge1xuICBwcm9jZXNzKCk6IGFueTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1bGUnOiBRdGlSdWxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlQ29uZGl0aW9uIGV4dGVuZHMgUXRpUnVsZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGJyYW5jaGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aUV4cHJlc3Npb248YW55PltdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG5cbiAgICAgIGlmIChicmFuY2guY2FsY3VsYXRlKCkpIHtcbiAgICAgICAgKGJyYW5jaCBhcyB1bmtub3duIGFzIFF0aVJ1bGUpLnByb2Nlc3MoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWNvbmRpdGlvbicsIFF0aVJlc3BvbnNlQ29uZGl0aW9uKTtcbiIsICJpbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgb3V0Y29tZUlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlKGV4cHJlc3Npb24pO1xuICAgIGNvbnN0IHZhbHVlID0gcnVsZS5wcm9jZXNzKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWUubWFwKCh2OiBzdHJpbmcpID0+IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHYpKVxuICAgICAgICAgICAgOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlPFQ+IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb246IFF0aUV4cHJlc3Npb25CYXNlPFQ+KSB7fVxuXG4gIHByb2Nlc3MoKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbiA/IHRoaXMuZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSA6IG51bGw7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdzZXRPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIFF0aVNldE91dGNvbWVWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgc3ViUnVsZXMgPSB0aGlzLmdldFN1YlJ1bGVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJSdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViUnVsZSA9IHN1YlJ1bGVzW2ldO1xuICAgICAgc3ViUnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UnLCBRdGlSZXNwb25zZUVsc2UpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VJZiB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1pZic7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlSWYge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UtaWYnLCBRdGlSZXNwb25zZUVsc2VJZik7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi8uLi9xdGktcnVsZS9xdGktcnVsZSc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUVsc2UgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtZWxzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VFbHNlIHtcbiAgcHVibGljIG92ZXJyaWRlIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1pZicsIFF0aVJlc3BvbnNlSWYpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBpdGVtQ29udGV4dCwgSXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlNdWx0aXBsZSB9IGZyb20gJy4vcXRpLW11bHRpcGxlL3F0aS1tdWx0aXBsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICAvLyBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW07XG5cbiAgLy8gZ2V0VmFyaWFibGVzKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W107XG4gIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUV4cHJlc3Npb248VD4gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgcmVzdWx0OiBhbnk7XG5cbiAgLy8gaGlkZSB0aGUgc2xvdCB3aXRoIGNzc1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIHNsb3Qge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxwcmU+JHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdCwgbnVsbCwgMil9PC9wcmU+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBjb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgZ2V0VmFyaWFibGVzID0gKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W10gPT5cbiAgICAvLyBGSVhNRTogaWYgdGhpcyBpdHNlbGYgaXMgbXVsdGlwbGUsIHRoaXMgd2lsbCBuZXZlciBlbnRlciB0aGUgcXRpLW11bHRpcGxlIHN3aXRjaFxuICAgIC8vIFNlZSB0aGlzIGV4YW1wbGUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tLzFFZFRlY2gvcXRpLWV4YW1wbGVzL2Jsb2IvbWFzdGVyL3F0aXYzLWV4YW1wbGVzL3BhY2thZ2luZy9pdGVtcy9FeGFtcGxlMDUtZmVlZGJhY2tCbG9jay1hZGFwdGl2ZS54bWxcblxuICAgIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbilcbiAgICAgIC5tYXAoKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3F0aS1iYXNlLXZhbHVlJzoge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IGUuZ2V0QXR0cmlidXRlKCdiYXNlLXR5cGUnKSxcbiAgICAgICAgICAgICAgdmFsdWU6IGUudGV4dENvbnRlbnQudHJpbSgpLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLXZhcmlhYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLW11bHRpcGxlJzoge1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGUgPSBlIGFzIFF0aU11bHRpcGxlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gbXVsdGlwbGUuZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnJyxcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogdmFsdWVzWzBdLmJhc2VUeXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXMubWFwKHYgPT4gdi52YWx1ZSksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdtdWx0aXBsZScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLWNvcnJlY3QnOiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogcmVzcG9uc2VWYXJpYWJsZS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogcmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eVxuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAvLyBhZGRlZCBmb3IgdXNlIG9mIHF0aS1lcXVhbC1yb3VuZGVkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gZSBhcyBRdGlFeHByZXNzaW9uPG51bWJlcj47XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXhwcmVzc2lvbi5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2RlZmF1bHQgbm90IHN1ZmZpY2llbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbn1cbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmV4cG9ydCBjbGFzcyBRdGlBbmQgZXh0ZW5kcyBxdGlBbmRNaXhpbihRdGlDb25kaXRpb25FeHByZXNzaW9uIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UXRpQ29uZGl0aW9uRXhwcmVzc2lvbj4pIHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVDaGlsZHJlbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uPGFueT5bXSkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE1vY2tRdGlFeHByZXNzaW9uPFQ+ID0geyBjYWxjdWxhdGU6ICgpID0+IFQgfTtcbnR5cGUgTW9ja0NvbnN0cnVjdG9yID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4ge307XG5leHBvcnQgZnVuY3Rpb24gcXRpQW5kTWl4aW48VEJhc2UgZXh0ZW5kcyBNb2NrQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gIHJldHVybiBjbGFzcyBNb2NrUXRpQW5kIGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIGNhbGN1bGF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBBcnJheTxNb2NrUXRpRXhwcmVzc2lvbjxhbnk+Pikge1xuICAgICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNoaWxkcmVuLm1hcChjID0+IHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBNb2NrUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpO1xuICAgICAgICBsZXQgdmFsID0gZmFsc2U7XG4gICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbCBpbiBxdGktb3IsIGV4cGVjdGVkIGJvb2xlYW4nKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGUgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7IFF0aUFuZCB9IGZyb20gJy4vcXRpLWFuZCc7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1hbmQnLCBRdGlBbmQpO1xuXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hbmQnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYW5kJzogUXRpQW5kO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpQmFzZVZhbHVlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZSA9ICdzdHJpbmcnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1iYXNlLXZhbHVlJywgUXRpQmFzZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlDb250YWlucyBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIGZvciBvdGhlciB0eXBlcyB0aGFuIGRpcmVjdGVkUGFpclxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBlbnVtZXJhYmxlID0gcHJvamVjdGlvbjEuZmlsdGVyKHggPT4gcHJvamVjdGlvbjIuaW5jbHVkZXMoeCkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVudW1lcmFibGUubGVuZ3RoID4gMDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ3Vuc3VwcG9ydGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBjb250YWlucywgb25seSBiYXNlVHlwZTogZGlyZWN0ZWRQYWlyIGFuZCBjYXJkaW5hbGl0eTogbXVsdGlwbGUgaXMgc3VwcG9ydGVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgY29udGFpbnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvbnRhaW5zJywgUXRpQ29udGFpbnMpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpQ29ycmVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgZ2V0IGludGVycHJldGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnaW50ZXJwcmV0YXRpb24nKSB8fCAnJztcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgIGlmIChyZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLmxlbmd0aCA+IDAgPyByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZVswXSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvcnJlY3QnLCBRdGlDb3JyZWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsUm91bmRlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgcm91bmRpbmdNb2RlOiAnZGVjaW1hbFBsYWNlcycgfCAnc2lnbmlmaWNhbnRGaWd1cmVzJyA9ICdzaWduaWZpY2FudEZpZ3VyZXMnO1xuXG4gIGdldCBmaWd1cmVzKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpO1xuICAgIGlmICghYXR0cikge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbWlzc2luZycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZpZ3VyZXMgPSBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpIHx8ICcwJyk7XG4gICAgaWYgKGlzTmFOKGZpZ3VyZXMpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5lZ2F0aXZlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAxICYmIHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEgZm9yIFJvdW5kaW5nTW9kZSBzaWduaWZpY2FudEZpZ3VyZXMnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlndXJlcztcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHZhbHVlc1swXS5iYXNlVHlwZSkge1xuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmbG9hdDEudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKSA9PT0gZmxvYXQyLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQxICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykgPT09XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDIgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZSBjYW5ub3QgYmUgY2FzdGVkIHRvIG51bWVyaWMgdmFsdWUgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yOiAke2Zsb2F0MX0sICR7ZmxvYXQyfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWVzIG90aGVyIHRoYW4gZmxvYXQgYW5kIGludCBjYW5ub3QgYmUgdXNlZCBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3IuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsLXJvdW5kZWQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbC1yb3VuZGVkJywgUXRpRXF1YWxSb3VuZGVkKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRvbGVyYW5jZU1vZGU6ICdleGFjdCcgfCAncmVsYXRpdmUnIHwgJ2Fic29sdXRlJyA9ICdleGFjdCc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMudG9sZXJhbmNlTW9kZSAhPT0gJ2V4YWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd0b2xlcmFuY2VNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsJywgUXRpRXF1YWwpO1xuIiwgImltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY2xhc3MgU2NvcmluZ0hlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTE6IFJlYWRvbmx5PHN0cmluZz4sIHZhbHVlMjogUmVhZG9ubHk8c3RyaW5nPiwgYmFzZVR5cGU6IEJhc2VUeXBlKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChiYXNlVHlwZSkge1xuICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTI7XG4gICAgICBjYXNlICdpbnRlZ2VyJzoge1xuICAgICAgICBjb25zdCBpbnQxID0gcGFyc2VJbnQodmFsdWUxLCAxMCk7XG4gICAgICAgIGNvbnN0IGludDIgPSBwYXJzZUludCh2YWx1ZTIsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnQxKSAmJiAhaXNOYU4oaW50MikpIHtcbiAgICAgICAgICByZXR1cm4gaW50MSA9PT0gaW50MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBpbnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEpO1xuICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMik7XG4gICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgIHJldHVybiBmbG9hdDEgPT09IGZsb2F0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb3VsZG4ndCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGZsb2F0LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncGFpcic6XG4gICAgICBjYXNlICdkaXJlY3RlZFBhaXInOiB7XG4gICAgICAgIGNvbnN0IHBhaXIxID0gdmFsdWUxLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBjb25zdCBwYWlyMiA9IHZhbHVlMi5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgaWYgKHBhaXIxLmxlbmd0aCA9PT0gMiAmJiBwYWlyMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAoYmFzZVR5cGUgPT09ICdwYWlyJykge1xuICAgICAgICAgICAgcGFpcjEuc29ydCgpO1xuICAgICAgICAgICAgcGFpcjIuc29ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFpcjEuam9pbignICcpID09PSBwYWlyMi5qb2luKCcgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY29tcGFyZWQgdHdvIHBhaXIgYnV0IG9uZSBvZiB0aGUgdmFsdWVzIGRvZXMgbm90IGhhdmUgMiB2YWx1ZXM6IDE6ICR7dmFsdWUxfSAyOiAke3ZhbHVlMn1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlHdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPiArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3QnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndCcsIFF0aUd0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlHdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID49ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndGUnLCBRdGlHdGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpSXNOdWxsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGlmICghdmFyaWFibGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZXNbMF0udmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgTnVsbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWlzLW51bGwnLCBRdGlJc051bGwpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUx0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0JywgUXRpTHQpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUx0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPD0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0ZScsIFF0aUx0ZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwUmVzcG9uc2UgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZChyID0+IHIuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKTtcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFJlc3BvbnNlICR7dGhpcy5pZGVudGlmaWVyfSBjYW4gbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IHJlc3BvbnNlLm1hcHBpbmc7XG4gICAgY29uc3QgY2FuZGlkYXRlUmVzcG9uc2VzID0gIUFycmF5LmlzQXJyYXkocmVzcG9uc2UudmFsdWUpID8gW3Jlc3BvbnNlLnZhbHVlXSA6IHJlc3BvbnNlLnZhbHVlO1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlUmVzcG9uc2Ugb2YgY2FuZGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IG1hcHBpbmcubWFwRW50cmllcy5maW5kKGVudHJ5ID0+IHtcbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhlbnRyeS5tYXBLZXksIGNhbmRpZGF0ZVJlc3BvbnNlLCByZXNwb25zZS5iYXNlVHlwZSk7XG4gICAgICB9KTtcbiAgICAgIGlmICghKG1hcHBlZFZhbHVlID09IG51bGwgfHwgbWFwcGVkVmFsdWUubWFwcGVkVmFsdWUgPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGVkVmFsdWUubWFwcGVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGluZy5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLmxvd2VyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5tYXgobWFwcGluZy5sb3dlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAobWFwcGluZy51cHBlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWluKG1hcHBpbmcudXBwZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXAtcmVzcG9uc2UnLCBRdGlNYXBSZXNwb25zZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcHBpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGVmYXVsdC12YWx1ZScsIHR5cGU6IE51bWJlciB9KSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDA7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndXBwZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgdXBwZXJCb3VuZDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgbWFwRW50cmllcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1tYXAtZW50cnknKSkubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hcEtleTogZWwuZ2V0QXR0cmlidXRlKCdtYXAta2V5JyksXG4gICAgICAgIG1hcHBlZFZhbHVlOiArZWwuZ2V0QXR0cmlidXRlKCdtYXBwZWQtdmFsdWUnKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXBwaW5nJywgUXRpTWFwcGluZyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICAvL1BLIDogRklYTUUuXG4gIC8vIFRoaXMgd2FzIGEgbGl0dGxlIGV4cGVyaW1lbnQgaWYgd2UgY291bGQgY2FsbCB0aGUgbWF0Y2ggZnVuY3Rpb24gYXMgYSBzdGF0aWMgZnVuY3Rpb24sXG4gIC8vIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFsbCBraW5kIG9mIHRoaW5ncywgYnV0IG5vdyBlc3BlY2lhbGx5IGZvciB1c2UgaW5cbiAgLy8gcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi1zY3JpcHRcbiAgLy8gaW4gd2hpY2ggd2UgcGFzcyB0aGUgZXhwcmVzc2lvbnMgYXMgcHVyZSBmdW5jdGlvbnMsIGFuZCBob3BlIGZvciB0aGUgYmVzdC5cbiAgLy8gU0FETFksIHRoZSBnZXRWYXJpYWJsZXMgdGhyb3dzIHJvZXQgaW4gZGUgZXRlbi4uIHdlZXQgbm9nIG5pZXQgcHJlY2llcyBob2UgZGV6ZSB3ZXJrdC5cbiAgLy8gTWFhciBpayBnYSBlcmluIGR1aWtlbi5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWVUb01hcCA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IGNvcnJlY3RWYWx1ZUluZm8gPSB2YWx1ZXNbMV07XG4gICAgICByZXR1cm4gUXRpTWF0Y2gubWF0Y2godmFsdWVUb01hcCwgY29ycmVjdFZhbHVlSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWF0Y2godmFsdWVUb01hcDogUmVzcG9uc2VWYXJpYWJsZSwgY29ycmVjdFZhbHVlSW5mbzogUmVzcG9uc2VWYXJpYWJsZSkge1xuICAgIHN3aXRjaCAoY29ycmVjdFZhbHVlSW5mby5jYXJkaW5hbGl0eSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzoge1xuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCBBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlPy50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ29yZGVyZWQnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZVtpXSxcbiAgICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWVbaV0sXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbXVsdGlwbGUnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFuc3dlckluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjb3JyZWN0QW5zd2VyIG9mIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hpbmdWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgY29uc3QgYXJyID0gWy4uLnZhbHVlVG9NYXAudmFsdWVdO1xuICAgICAgICAgIGZvciAoY29uc3QgbXYgb2YgYXJyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoY29ycmVjdEFuc3dlciwgbXYsIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICBtYXRjaGluZ1ZhbHVlID0gbXY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgKGFyciBhcyBzdHJpbmdbXSkuc3BsaWNlKGFyci5pbmRleE9mKG1hdGNoaW5nVmFsdWUpLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbnN3ZXJJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hdGNoJywgUXRpTWF0Y2gpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1lbWJlciBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbiB8IG51bGw+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcblxuICAgIGlmICghKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHRha2VzIHR3byBzdWItZXhwcmVzc2lvbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbdmFsdWUxLCB2YWx1ZTJdID0gdmFsdWVzO1xuXG4gICAgaWYgKCEodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1doaWNoIG11c3QgYm90aCBoYXZlIHRoZSBzYW1lIGJhc2UtdHlwZScpO1xuICAgIH1cbiAgICBpZiAoISh2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2FuZCB0aGUgc2Vjb25kIG11c3QgYmUgYSBtdWx0aXBsZSBvciBvcmRlcmVkIGNvbnRhaW5lcicpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHNob3VsZCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBmbG9hdCcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZHVyYXRpb24nIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKCdJdCBtdXN0IG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGR1cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIHN1Yi1leHByZXNzaW9uIGlzIE5VTEwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRvciBpcyBOVUxMXG4gICAgaWYgKHZhbHVlMS52YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZTIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSByZXN1bHQgaXMgYSBzaW5nbGUgYm9vbGVhbiB3aXRoIGEgdmFsdWUgb2YgJ3RydWUnIGlmIHRoZSB2YWx1ZSBnaXZlbiBieSB0aGUgZmlyc3Qgc3ViLWV4cHJlc3Npb24gaXMgaW4gdGhlIGNvbnRhaW5lciBkZWZpbmVkIGJ5IHRoZSBzZWNvbmQgc3ViLWV4cHJlc3Npb24uXG4gICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWVtYmVyJywgUXRpTWVtYmVyKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpTXVsdGlwbGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnbXVsdGlwbGUnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3QgdmFsdWVzID0gdmFyaWFibGVzLm1hcCh2ID0+IHYudmFsdWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKHZhcmlhYmxlcyk7XG4gICAgLy8gY29uc3QgZmxhdHRlbmVkQXJyYXkgPSB2YWx1ZXMucmVkdWNlKChhY2M6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAvLyAgIHJldHVybiBhY2MuY29uY2F0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlKTtcbiAgICAvLyB9LCBbXSk7XG4gICAgLy8gcmV0dXJuIGZsYXR0ZW5lZEFycmF5O1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tdWx0aXBsZScsIFF0aU11bHRpcGxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlOb3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuICFyZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbm90JywgUXRpTm90KTtcbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlPciBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5tYXAoYyA9PiB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIFF0aUV4cHJlc3Npb248YW55PjtcbiAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpO1xuICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbCBpbiBxdGktb3IsIGV4cGVjdGVkIGJvb2xlYW4nKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKGUgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcicsIFF0aU9yKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpT3JkZXJlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248UmVzcG9uc2VWYXJpYWJsZVtdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ29yZGVyZWQnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBvcmRlcmVkJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcmRlcmVkJywgUXRpT3JkZXJlZCk7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGNsYXNzIFF0aVByaW50ZWRWYXJpYWJsZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByaW50ZWQtdmFyaWFibGUnLCBRdGlQcmludGVkVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVByb2R1Y3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB2YWx1ZXMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdmbG9hdCcgfHwgY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciAqIHBhcnNlSW50KGN1cnJlbnRWYWx1ZS52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGNhbiBub3QgY29udmVydCB0byBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBoYXMgYW5vdGhlciBiYXNlVHlwZSAke2N1cnJlbnRWYWx1ZS5iYXNlVHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCAxKTtcbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcm9kdWN0JywgUXRpUHJvZHVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN0cmluZ01hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2FzZS1zZW5zaXRpdmUnIH0pIGNhc2VTZW5zaXRpdmUgPSAndHJ1ZSc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIHN0cmluZy1tYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB2MSA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUxLnZhbHVlIDogKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2MiA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUyLnZhbHVlIDogKHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHYxIGFzIHN0cmluZywgdjIgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktc3RyaW5nLW1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3RyaW5nLW1hdGNoJywgUXRpU3RyaW5nTWF0Y2gpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3VtIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogUXRpU3VtRXhwcmVzc2lvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9leHByZXNzaW9uID0gbmV3IFF0aVN1bUV4cHJlc3Npb24oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9leHByZXNzaW9uLmNhbGN1bGF0ZSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU3VtRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25zOiBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pIHt9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmV4cHJlc3Npb25zLm1hcChjID0+IHtcbiAgICAgIGlmICghYy5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGMuY2FsY3VsYXRlKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1zdW0sIGV4cGVjdGVkIG51bWJlcicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdW0nLCBRdGlTdW0pO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpLnZhbHVlXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS12YXJpYWJsZScsIFF0aVZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSU1TcGNpLCBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnLCBRdGlWYXJpYWJsZUpTT04gfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZWpzOiBhbnk7XG5kZWNsYXJlIGNvbnN0IGRlZmluZTogYW55O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBpbnRlcnZhbElkOiBhbnk7XG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBwcml2YXRlIHBjaTogSU1TcGNpPHVua25vd24+O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSlcbiAgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdtb2R1bGUnIH0pXG4gIG1vZHVsZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY3VzdG9tLWludGVyYWN0aW9uLXR5cGUtaWRlbnRpZmllcicgfSlcbiAgY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnZlcnRRdGlWYXJpYWJsZUpTT04oaW5wdXQ6IFF0aVZhcmlhYmxlSlNPTik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBmb3IgKGNvbnN0IHRvcExldmVsS2V5IGluIGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkodG9wTGV2ZWxLZXkpKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE9iamVjdCA9IGlucHV0W3RvcExldmVsS2V5IGFzICdsaXN0JyB8ICdiYXNlJ107XG4gICAgICAgIGlmIChuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZEtleSBpbiBuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QuaGFzT3duUHJvcGVydHkobmVzdGVkS2V5KSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5lc3RlZE9iamVjdFtuZXN0ZWRLZXkgYXMga2V5b2YgdHlwZW9mIG5lc3RlZE9iamVjdF07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoU3RyaW5nKTsgLy8gQ29udmVydCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsgLy8gQ29udmVydCB0aGUgc2luZ2xlIHZhbHVlIHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENoZWNraW5nKCk6IHZvaWQge1xuICAgIC8vIGJlY2F1c2UgdGhlIHBjaSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgdG8gY2hlY2sgZm9yIGNoYW5nZXMgd2UnbGwgdXNlIGFuIGludGVydmFsXG4gICAgLy8gdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBjaGFuZ2VkLiBJZiBjaGFuZ2VkIHdlJ2xsIHNhdmUgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQgIT09IHRoaXMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHN0cmluZ2lmaWVkO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydFF0aVZhcmlhYmxlSlNPTihuZXdSZXNwb25zZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDaGVja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRk9SIE5PV1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gT25seSBzZXQgc3RhdGUgaXMgc3VwcG9ydGVkIGluIGEgUENJXG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuICAgIGlmICh0eXBlID09ICdJTVMnKSB7XG4gICAgICBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwY2kgYXMgYW55KS5pbml0aWFsaXplKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllciwgZG9tLmZpcnN0RWxlbWVudENoaWxkLCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgZGVmaW5lKCdxdGlDdXN0b21JbnRlcmFjdGlvbkNvbnRleHQnLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gdGhlIFRBTyB2ZXJzaW9uICovXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJ1aWxkUmVxdWlyZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKGNvbmZpZyk7XG4gICAgcmVxdWlyZVBDSShbJ3JlcXVpcmUnXSwgcmVxdWlyZSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWR5bmFtaWMtcmVxdWlyZVxuICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgcmVxdWlyZWpzLnVuZGVmKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcik7XG4gICAgLy8gQ2xlYXIgdGhlIG1vZHVsZXMgaW4gdGhlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxdWlyZWpzLnMuY29udGV4dHM7XG4gICAgZGVsZXRlIGNvbnRleHRbdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyXTtcbiAgICB0aGlzLnN0b3BDaGVja2luZygpO1xuICB9XG5cbiAgYnVpbGRSZXF1aXJlQ29uZmlnKCkge1xuICAgIC8vIFNldCBSZXF1aXJlSlMgcGF0aHMgYW5kIHNoaW0gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHdpbmRvd1sncmVxdWlyZVBhdGhzJ10gfHwge30sXG4gICAgICBzaGltOiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10gfHwge31cbiAgICB9O1xuICAgIC8vIENoZWNrIGlmIFJlcXVpcmVKUyBpcyBhdmFpbGFibGUsIGlmIG5vdCwgc2V0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYFJlcXVpcmVKUyBub3QgZm91bmQuIFBsZWFzZSBsb2FkIGl0IHZpYSBDRE46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG5cbiAgICBpZiAoaW50ZXJhY3Rpb25Nb2R1bGVzKSB7XG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG5cbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlQYXRoKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwYXRocyB1c2luZyBSZXF1aXJlSlMncyBmYWxsYmFjayBhcnJheVxuICAgICAgICAgIGNvbnN0IHBhdGhzID0gZmFsbGJhY2tQYXRoXG4gICAgICAgICAgICA/IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gY29uZmlnLnBhdGhzW21vZHVsZUlkXSB8fCBbXTtcbiAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhleGlzdGluZ1BhdGgsIHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhwYXRoMTogc3RyaW5nIHwgc3RyaW5nW10sIHBhdGgyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhdGgxQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgxKSA/IHBhdGgxIDogW3BhdGgxXTtcbiAgICBjb25zdCBwYXRoMkFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMikgPyBwYXRoMiA6IFtwYXRoMl07XG4gICAgcmV0dXJuIHBhdGgxQXJyYXkuY29uY2F0KHBhdGgyQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICAgIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbiAgfVxuXG4gIGxvYWRDb25maWcgPSBhc3luYyAodXJsOiBzdHJpbmcsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZHVsZVJlc29sdXRpb25Db25maWc+ID0+IHtcbiAgICB1cmwgPSB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXModXJsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWlyZUNvbmZpZyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAocmVxdWlyZUNvbmZpZy5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXF1aXJlQ29uZmlnLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlQ29uZyA9IGNvbmZpZyBhcyBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIGluIG1vZHVsZUNvbmcucGF0aHMpIHtcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmdldFJlc29sdmFibGVQYXRoKG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdLCBiYXNlVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aFN0cmluZyA9IChwYXRoOiBzdHJpbmcsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aCA9IChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgPyBwYXRoLm1hcChwID0+IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocCwgYmFzZVBhdGgpKVxuICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHBhdGgsIGJhc2VQYXRoKTtcbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdID0gW107XG5cbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG4gIC8vIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcjogKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlciA9IHRoaXMuX3JlZ2lzdGVyQ2hvaWNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGNvbnN0IGNob2ljZSA9IGV2ZW50LnRhcmdldCBhcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICAgIHRoaXMuX2NoaWxkcmVuTWFwLnB1c2goY2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiZHJvcC1jb250YWluZXJcIj5cbiAgICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIHRvdWNoU3RhcnRQb2ludCA9IG51bGw7IC8vIFBvaW50IG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIGxhc3RDbGlja1RpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIGNsaWNrXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWdnYWJsZSBlbGVtZW50IGlzIGFjdGl2ZVxuICBwcml2YXRlIGRyYWdTb3VyY2U6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVGhlIHNvdXJjZSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcbiAgcHJpdmF0ZSBkcmFnQ2xvbmU6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gQ2xvbmUgb2YgZHJhZyBzb3VyY2UgZm9yIHZpc3VhbCBmZWVkYmFja1xuICBwcml2YXRlIHRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7IC8vIEZsYWcgZm9yIHRvdWNoRW5kIGV2ZW50XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZyBvcGVyYXRpb24gaXMgb25nb2luZ1xuICBwcml2YXRlIGluaXRpYWxUcmFuc2Zvcm0gPSAnJzsgLy8gT3JpZ2luYWwgdHJhbnNmb3JtIHN0eWxlXG4gIHByaXZhdGUgaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlOyAvLyBGbGFnIHRvIGVuc3VyZSBkcmFnc3RhcnQgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbmNlXG4gIHByaXZhdGUgcm9vdE5vZGU6IE5vZGUgPSBudWxsOyAvLyBSb290IG5vZGUgZm9yIGJvdW5kYXJ5IGNhbGN1bGF0aW9uc1xuXG4gIHByaXZhdGUgZm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBmb2N1c2FibGVEcm9wWm9uZXM6IEhUTUxFbGVtZW50W10gPSBbXTsgLy8gQWxsIGRyb3B6b25lcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICBwcml2YXRlIGN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIEluZGV4IGZvciB0YWJiaW5nIHRocm91Z2ggZHJvcCB6b25lc1xuXG4gIHByaXZhdGUgZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBjbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNsb25lXG5cbiAgcHJpdmF0ZSBsYXN0VGFyZ2V0ID0gbnVsbDsgLy8gTGFzdCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFRhcmdldCA9IG51bGw7IC8vIEN1cnJlbnQgZHJvcHBhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBhbGxvd0NsaWNrID0gdHJ1ZTsgLy8gRmxhZyB0byBhbGxvdyBvciBwcmV2ZW50IGNsaWNrXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUgPSB0cnVlO1xuICBkcmFnT25DbGlja0VuYWJsZWQgPSBmYWxzZTtcbiAgdXNlRHJhZ0Nsb25lID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHRvIGRyYWcgd2l0aCBhIGNsb25lOyBzZXQgdG8gZmFsc2UgdG8gZHJhZyB0aGUgb3JpZ2luYWwgZWxlbWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0RSQUdfRElTVEFOQ0UgPSA1OyAvLyBNaW5pbXVtIHBpeGVsIG1vdmVtZW50IHRvIHN0YXJ0IGRyYWdnaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19DTE9ORV9PUEFDSVRZID0gMTsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjbG9uZSBlbGVtZW50XG4gIGluaXRpYWxUcmFuc2l0aW9uOiBzdHJpbmc7XG4gIC8vIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5VXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYWRkRHJvcHBhYmxlRWxlbWVudHMoZHJvcHBhYmxlczogRWxlbWVudFtdKSB7XG4gIC8vICAgLy8gdGhpcy5kcm9wcGFibGVzID0gZHJvcHBhYmxlcztcbiAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goZWwgPT4ge1xuICAvLyAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IHsgeCwgeSB9O1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgcm9vdCBub2RlXG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2tFbmFibGVkKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIFNhdmUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm07XG5cbiAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSBjb21wdXRlZFN0eWxlLnRyYW5zaXRpb24gfHwgJyc7XG5cbiAgICAgIC8vIERpc2FibGUgdHJhbnNpdGlvbnNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY2xvbmUgb2Zmc2V0XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC54ID0geCAtIHJlY3QubGVmdDtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHkgLSByZWN0LnRvcDtcblxuICAgICAgLy8gU2V0IGhpZ2hlciB6LWluZGV4IHRvIGJyaW5nIGl0IG9uIHRvcFxuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICc5OTk5JztcbiAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgdGhpcy5kcmFnU291cmNlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlICYmIHRoaXMuZHJhZ1NvdXJjZSkge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgICBjb25zdCBjdXJyZW50VG91Y2ggPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKGN1cnJlbnRUb3VjaCkgPj0gdGhpcy5NSU5fRFJBR19ESVNUQU5DRSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2g6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNvZGUgZm9yIGNyZWF0aW5nIGFuZCBoYW5kbGluZyB0aGUgZHJhZyBjbG9uZVxuICAgICAgaWYgKCF0aGlzLmRyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9IHRoaXMuRFJBR19DTE9ORV9PUEFDSVRZLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lID0gdGhpcy5kcmFnU291cmNlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRm9yRHJhZ0Nsb25lKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgY29tcHV0ZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdGhlIGRyYWcgY2xvbmUgdG8gdGhlIHJvb3Qgbm9kZVxuICAgICAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGhvc3Qgb2YgdGhlIHNoYWRvdyByb290XG4gICAgICAgICAgdGhpcy5yb290Tm9kZS5ob3N0LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLnNldERyYWdDbG9uZVN0eWxlcyhjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGRyYWdnaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIENTUyB0cmFuc2Zvcm1zXG4gICAgICBpZiAodGhpcy50b3VjaFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50VG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50Lnk7XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgICAvLyBjb25zdCB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7Ym91bmRlZERlbHRhWH1weCwgJHtib3VuZGVkRGVsdGFZfXB4KWA7XG5cbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wVGFyZ2V0ID0gdGhpcy5maW5kRHJvcFRhcmdldChlKTtcblxuICAgIGlmIChkcm9wVGFyZ2V0ICE9PSB0aGlzLmxhc3RUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICB0aGlzLmxhc3RUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgbGV0IGRyb3BGb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2Ryb3BGb3VuZCcsIGRyb3BGb3VuZCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgZHJvcEZvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgZHJhZ0VuZEV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHsgZHJvcEVmZmVjdDogJ25vbmUnIH07XG4gICAgICB0aGlzLmRyYWdTb3VyY2U/LmRpc3BhdGNoRXZlbnQoZHJhZ0VuZEV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0KGV2ZW50KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGRvY3VtZW50LCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldEF0UG9pbnQocm9vdDogRG9jdW1lbnRPclNoYWRvd1Jvb3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXB0aDogbnVtYmVyID0gMCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBMaW1pdCB0aGUgcmVjdXJzaW9uIGRlcHRoXG4gICAgY29uc3QgTUFYX0RFUFRIID0gMjtcbiAgICBpZiAoZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3Igd2l0aCAnZHJvcHpvbmUnIGF0dHJpYnV0ZVxuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIFNoYWRvdyBET00gYW5kIGRlcHRoIGxpbWl0IG5vdCByZWFjaGVkLCB0cmF2ZXJzZSBpdFxuICAgIGlmIChlbGVtZW50LnNoYWRvd1Jvb3QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHtcbiAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGVsZW1lbnQuc2hhZG93Um9vdCwgeCwgeSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChzaGFkb3dFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBzaGFkb3dFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWRFbGVtZW50KSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiAhdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlID0gdGhpcy5mb2N1c2VkRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZHJvcCB6b25lcyBmb3IgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLmNvbGxlY3REcm9wWm9uZXMoKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gVGFiIGtleSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGRyb3Agem9uZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVUb05leHREcm9wWm9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJyAnICYmIHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIGFnYWluIHRvIGRyb3AgdGhlIGVsZW1lbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIHRoaXMucmVzZXREcmFnU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RHJvcFpvbmVzKCkge1xuICAgIC8vIENvbGxlY3QgYWxsIGVsZW1lbnRzIHdpdGggZHJvcHpvbmUgYXR0cmlidXRlXG4gICAgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcm9wem9uZV0nKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8gQXJyYXkuZnJvbSh0aGlzLmRyb3BwYWJsZXMpO1xuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gUmVzZXQgbmF2aWdhdGlvbiBpbmRleFxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9OZXh0RHJvcFpvbmUoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGluZGV4IGZvciB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gKHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggKyAxKSAlIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aDtcblxuICAgIC8vIEZvY3VzIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIGNvbnN0IG5leHREcm9wWm9uZSA9IHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzW3RoaXMuY3VycmVudERyb3Bab25lSW5kZXhdO1xuICAgIG5leHREcm9wWm9uZS5mb2N1cygpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZHJvcCB0YXJnZXRcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbmV4dERyb3Bab25lO1xuXG4gICAgLy8gRGlzcGF0Y2ggZHJhZ2VudGVyIGV2ZW50XG4gICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KG5leHREcm9wWm9uZSwgJ2RyYWdlbnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50LCBwYWdlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyB0b3VjaC5wYWdlWCA6IHRvdWNoLmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gdG91Y2gucGFnZVkgOiB0b3VjaC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5jbG9uZU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIH1cblxuICBwcml2YXRlIHNldERyYWdDbG9uZVN0eWxlcyh0b3VjaCkge1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHt0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7dG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueH1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgfHwgIXRoaXMuZHJhZ0Nsb25lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0xlZnQgPSB0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54O1xuICAgICAgY29uc3QgbmV3VG9wID0gdG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueTtcblxuICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgY29uc3QgeyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH0gPSB0aGlzLmFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0LCBuZXdUb3AsIHRoaXMuZHJhZ0Nsb25lKTtcblxuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke2JvdW5kZWRMZWZ0fXB4YDtcbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke2JvdW5kZWRUb3B9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvdGVudGlhbCBuZXcgcG9zaXRpb25cbiAgICBjb25zdCBuZXdMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBlbGVtZW50UmVjdC50b3AgKyBkZWx0YVk7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3IHBvc2l0aW9uIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kZWQgZGVsdGEgdmFsdWVzXG4gICAgY29uc3QgYm91bmRlZERlbHRhWCA9IGJvdW5kZWRMZWZ0IC0gZWxlbWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBib3VuZGVkRGVsdGFZID0gYm91bmRlZFRvcCAtIGVsZW1lbnRSZWN0LnRvcDtcblxuICAgIHJldHVybiB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQ6IG51bWJlciwgbmV3VG9wOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gTGltaXQgdGhlIG5ld0xlZnQgYW5kIG5ld1RvcCB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEcmFnRGlzdGFuY2UodG91Y2gpOiBudW1iZXIge1xuICAgIGNvbnN0IHhEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50LngpO1xuICAgIGNvbnN0IHlEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50LnkpO1xuICAgIHJldHVybiB4RGlzdCArIHlEaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEN1c3RvbUV2ZW50KGVsZW1lbnQsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5kYXRhVHJhbnNmZXI7XG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmU/LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdHlsZXNcbiAgICAgICAgaWYgKCFkcm9wRm91bmQpIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5pbml0aWFsVHJhbnNpdGlvbjtcblxuICAgICAgICAvLyBSZXNldCB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBwcm9wZXJ0eVxuICAgICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdDbG9uZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLmxhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuYWxsb3dDbGljayA9IHRydWU7XG4gICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gJyc7XG4gICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBEcm9wcGFibGVzSW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBEcm9wcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIHVzZVNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJvcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZXMgPSB0aGlzLmdldERyb3BwYWJsZUVsZW1lbnRzKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk7XG4gICAgICBkcm9wcGFibGVzLmZvckVhY2goZHJvcHBhYmxlID0+IHtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREcm9wcGFibGVFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3QgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ292ZXJIYW5kbGVyID0gdGhpcy5kcmFnb3ZlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2xlYXZlSGFuZGxlciA9IHRoaXMuZHJhZ2xlYXZlSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnZW50ZXJIYW5kbGVyID0gdGhpcy5kcmFnZW50ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyb3BIYW5kbGVyID0gdGhpcy5kcm9wSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYXR0cmlidXRlTmFtZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJvcHBhYmxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gZHJvcHBhYmxlLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdlbnRlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdvdmVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZHJvcEhhbmRsZXIoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMuZmluZERyYWdnYWJsZShpZGVudGlmaWVyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChkcmFnZ2FibGUgJiYgIXRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKSB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGUsIGRyb3BwYWJsZSk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcmFnZ2FibGUoaWRlbnRpZmllcjogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgIGlmICghaWRlbnRpZmllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYCkgfHwgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkRHJvcChkcm9wcGFibGU6IEhUTUxFbGVtZW50LCBkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgIT09IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcblxuICAgICAgICAvLyBjaGVja01heEFzc29jaWF0aW9ucyBhbmQgc2F2ZVJlc3BvbnNlIGFyZSBkZWZpbmVkL292ZXJyaWRkZW4gaW4gYSBtaXhpblxuICAgICAgICB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgICAgIHRoaXNbJ3NhdmVSZXNwb25zZSddKG51bGwpOyAvL1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcblxuICAgICAgLy8gdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdsZWF2ZUhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJvcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RHJvcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBUSElTIElTIEEgTUlYSU4sIFRISVMgSVMgQSBNSVhJTlxuLy8gVVNFIExJS0UgVEhJU1xuLy8gYGBgY2xhc3MgRHJvcExpc3QgZXh0ZW5kcyBGbGlwcGFibGVzKExpdEVsZW1lbnQpIHtgYGBcbi8vIG1peGluIHdoaWNoIGFuaW1hdGVzIGNoaWxkcmVuIHdpdGggRkxJUFxuLy8gYSBjb21iaW5hdGlvbiBiZXR3ZWVuIHRoaXMgZGlyZWN0aXZlOlxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbi8vIGFuZCBhIHR1dG9yaWFsIGhvdyB0byBtYWtlIGEgbWl4aW5cbi8vIGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvc2l0aW9uL21peGlucy9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc1NlbDogc3RyaW5nLFxuICBkcmFnZ2FibGVzU2VsOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBGbGlwcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8vIHByaXZhdGUgc3RhdGUgPSBuZXcgTWFwPEVsZW1lbnQsIGFueT4oKTtcbiAgICAvLyBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIC8vIGZsaXBwYWJsZXNTZWxlY3Rvcjogc3RyaW5nO1xuICAgIC8vIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7IC8vIHBrOiB0aGlzIGlzIHRoZSBrZXkgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcHJvcG9ydGlvbnNcbiAgICAvLyAgIGNvbnN0IGRyYWdnYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcmFnZ2FibGVzU2VsKSk7XG4gICAgLy8gICBkcmFnZ2FibGVzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hbmltYXRlTWUpO1xuICAgIC8vICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcmFnZ2FibGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAvLyB9XG4gICAgLy8gcHJpdmF0ZSBhbmltYXRlTWUgPSAoKSA9PiB7XG4gICAgLy8gICB0aGlzLnN0YXRlLmZvckVhY2goKHZhbHVlLCBlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICBpZiAodGhpcy5zdGF0ZS5nZXQoZWxlbSkgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zdGF0ZS5nZXQoZWxlbSk7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWCA9IGNhY2hlLmxlZnQgLSBsZWZ0O1xuICAgIC8vICAgICBjb25zdCBkZWx0YVkgPSBjYWNoZS50b3AgLSB0b3A7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhVyA9IGNhY2hlLndpZHRoIC8gd2lkdGg7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhSCA9IGNhY2hlLmhlaWdodCAvIGhlaWdodDtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIGNvbnN0IHsgZHVyYXRpb24sIGVhc2luZyB9ID0geyBkdXJhdGlvbjogMzUwLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoMC4yNiwgMC44NiwgMC40NCwgMC45ODUpJyB9O1xuICAgIC8vICAgICBlbGVtLmFuaW1hdGUoXG4gICAgLy8gICAgICAgW1xuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogYFxuICAgIC8vIHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpXG4gICAgLy8gc2NhbGUoJHtkZWx0YVd9LCAke2RlbHRhSH0pXG4gICAgLy8gYCxcbiAgICAvLyAgICAgICAgICAgLy8gd2lkdGg6IGNhY2hlLndpZHRoLFxuICAgIC8vICAgICAgICAgICAvLyBoZWlnaHQ6IGNhY2hlLmhlaWdodCsgJ3B4JyxcbiAgICAvLyAgICAgICAgICAgLy8gb3BhY2l0eTogY2FjaGUub3BhY2l0eSxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgZHVyYXRpb24sXG4gICAgLy8gICAgICAgICBlYXNpbmcsXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfTtcbiAgICAvLyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyB9XG4gIH1cbiAgcmV0dXJuIEZsaXBwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPEZsaXBwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcHBhYmxlc01peGluIH0gZnJvbSAnLi9kcm9wcGFibGVzLW1peGluJztcbmltcG9ydCB7IEZsaXBwYWJsZXNNaXhpbiB9IGZyb20gJy4vZmxpcHBhYmxlcy1taXhpbic7XG5cbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgbGl2ZVF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9saXZlLXF1ZXJ5JztcbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmludGVyZmFjZSBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuO1xuICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiBib29sZWFuO1xuICBkcmFnT25DbGljazogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzOiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlcywgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgeyBwYXJlbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIEBsaXZlUXVlcnkoZHJhZ2dhYmxlc1NlbGVjdG9yKVxuICAgIGhhbmRsZURyYWdnYWJsZXNDaGFuZ2UoZHJhZ3NBZGRlZDogSFRNTEVsZW1lbnRbXSwgZHJhZ3NSZW1vdmVkOiBFbGVtZW50W10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5ld0RyYWdnYWJsZXMgPSB0aGlzLmZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnc0FkZGVkKTtcblxuICAgICAgaWYgKG5ld0RyYWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmFkZE5ld0RyYWdnYWJsZXMobmV3RHJhZ2dhYmxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcm9wcGFibGVzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJhZ0Ryb3BBcGkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcmFnRHJvcEFwaSgpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQ+KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlcy5maWx0ZXIoZCA9PiAhdGhpcy5kcmFnZ2FibGVzLmhhcyhkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGROZXdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlcyk7XG4gICAgICBkcmFnZ2FibGVzLmZvckVhY2goZHJhZ2dhYmxlID0+IHRoaXMuc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9yZURyYWdnYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20oZHJhZ2dhYmxlLnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZHJhZ2dhYmxlKTtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5zZXQoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHBhcmVudDogZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQsXG4gICAgICAgIGluZGV4XG4gICAgICB9KTtcbiAgICAgIGRyYWdnYWJsZS5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBgZHJhZy0ke2luZGV4fS0ke3RoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgZHJhZ2dhYmxlLnNldEF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlc1xuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnU3RhcnQgPSAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnRW5kID0gYXN5bmMgKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIGNvbnN0IHdhc0Ryb3BwZWQgPSBhd2FpdCB0aGlzLndhc0Ryb3BwZWQoZXYpO1xuICAgICAgaWYgKCF3YXNEcm9wcGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uZHJhZ0NhbkJlUGxhY2VkQmFjaykge1xuICAgICAgICAgIHRoaXMucmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnNldEF0dHJpYnV0ZSgnZW5hYmxlZCcsICcnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5yZW1vdmVBdHRyaWJ1dGUoJ2VuYWJsZWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTUg6IFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoaXMgY2FuIGJlIHRlc3RlZC5cbiAgICAvLyBiZWNhdXNlIEkgY2FuJ3QgZ2V0IHRoZSBkcm9wRWZmZWN0IHRvIGJlICdtb3ZlJyBpbiB0aGUgdGVzdFxuICAgIHByaXZhdGUgY2hlY2tGb3JNb3ZlVGVzdEl0ZW0gPSAoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgaWYgKCFldi5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGxldCBoYXNNb3ZlVGVzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRhdGFUcmFuc2ZlciBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oZXYuZGF0YVRyYW5zZmVyLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IGl0ZW1zLmxlbmd0aDtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMsIHJlc29sdmUgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdzdHJpbmcnICYmIGl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpdGVtLmdldEFzU3RyaW5nKGRhdGEgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gJ21vdmUtdGVzdCcpIHtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlVGVzdEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBwcm9jZXNzaW5nIGFsbCBpdGVtc1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIG5vdCAnc3RyaW5nJywgc3RpbGwgY291bnQgZG93biBwZW5kaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGFzeW5jIHdhc0Ryb3BwZWQoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgaGFzTW92ZVRlc3RJdGVtID0gYXdhaXQgdGhpcy5jaGVja0Zvck1vdmVUZXN0SXRlbShldik7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgIT09ICdub25lJyB8fCBoYXNNb3ZlVGVzdEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXNNb3ZlZChldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09ICdtb3ZlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgeyBwYXJlbnQsIGluZGV4IH0gPSB0aGlzLmRyYWdnYWJsZXMuZ2V0KGRyYWdnYWJsZSk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRyYW5zaXRpb24uZmluaXNoZWQudGhlbigoKSA9PiB7XG4gICAgICAvLyAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4TWF0Y2ggPSArKGQuZ2V0QXR0cmlidXRlKCdtYXRjaC1tYXgnKSB8fCAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEFzc29jaWF0aW9ucyA9IGQucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJykubGVuZ3RoO1xuICAgICAgICBjb25zdCBkaXNhYmxlRHJvcHBhYmxlID0gY3VycmVudEFzc29jaWF0aW9ucyA+PSBtYXhNYXRjaDtcbiAgICAgICAgaWYgKGRpc2FibGVEcm9wcGFibGUpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICB2YWx1ZT8uZm9yRWFjaChlbnRyeSA9PiB0aGlzLnBsYWNlUmVzcG9uc2UoZW50cnkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYWNlUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IHRoaXMuZmluZERyb3BwYWJsZUJ5SWQoZHJvcElkKTtcbiAgICAgIGRyYWdJZHMuZm9yRWFjaChkcmFnSWQgPT4gdGhpcy5wbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZCwgZHJvcHBhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJvcHBhYmxlQnlJZChpZGVudGlmaWVyOiBzdHJpbmcpOiBFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQ6IHN0cmluZywgZHJvcHBhYmxlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICBpZiAoIWRyb3BwYWJsZSB8fCAhZHJhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBmaW5kIGRyYWdnYWJsZSBvciBkcm9wcGFibGUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjogJHtkcmFnSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHZhbGlkQXNzb2NpYXRpb25zID0gdGhpcy5nZXRWYWxpZEFzc29jaWF0aW9ucygpO1xuICAgICAgcmV0dXJuIHRoaXMubWluQXNzb2NpYXRpb25zIDw9IDAgfHwgdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gdmFsaWRBc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZEFzc29jaWF0aW9ucygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maWx0ZXIoZCA9PiBkLmNoaWxkRWxlbWVudENvdW50ID4gMCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZXNwb25zZURhdGEoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRyb3BwYWJsZXNcbiAgICAgICAgLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZXNJbkRyb3BwYWJsZSA9IGRyb3BwYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKTtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ2dhYmxlc0luRHJvcHBhYmxlKS5tYXAoZCA9PiBkLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgICAgICBjb25zdCBkcm9wcGFibGVJZGVudGlmaWVyID0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICAgIHJldHVybiBpZGVudGlmaWVycy5tYXAoaWQgPT4gYCR7aWR9ICR7ZHJvcHBhYmxlSWRlbnRpZmllcn1gKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXQoKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICByZXNldChzYXZlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIGlmIChzYXZlKSB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXREcm9wcGFibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICIvLyBAd2F0Y2ggZGVjb3JhdG9yXG4vL1xuLy8gUnVucyB3aGVuIGFuIG9ic2VydmVkIHByb3BlcnR5IGNoYW5nZXMsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuXG4vL1xuLy8gVG8gd2FpdCBmb3IgYW4gdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnRcbi8vIHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgQHdhdGNoKCdwcm9wTmFtZScpXG4vLyAgaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbi8vICAgIC4uLlxuLy8gIH1cblxuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpdmVRdWVyeShxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBMaXZlUXVlcnlPcHRpb25zKSB7XG4gIGxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxMaXZlUXVlcnlPcHRpb25zPiA9IHtcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3RlZENhbGxiYWNrLCBkaXNjb25uZWN0ZWRDYWxsYmFjayB9ID0gcHJvdG87XG5cbiAgICBwcm90by5jb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGNvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb1dhdGNoID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikpO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBhZGRlZE5vZGVzLmZpbmQobiA9PiBlbGVtZW50c1RvV2F0Y2guaW5jbHVkZXMobikpKSB7XG4gICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzQWRkZWQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikgPz8gW107XG4gICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoQXJyYXkuZnJvbShlbGVtZW50c0FkZGVkKSwgW10pO1xuICAgIH07XG5cbiAgICBwcm90by5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gIH1cbiAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogMC41cmVtO1xuICB9XG5cbiAgOmhvc3Q6OnBhcnQoYXNzb2NpYWJsZXMtY29udGFpbmVyKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMTgwZGVnLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlIC0gMXB4KSxcbiAgICAgIHZhcigtLXF0aS1ib3JkZXItY29sb3ItZ3JheSkgY2FsYyg1MCUpLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlICsgMXB4KVxuICAgICk7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZURvdWJsZVNsYXNoZXMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC91dGlscyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gVGhpcyBjdXN0b20taW50ZXJhY3Rpb24gc3VwcG9ydCB0aGUgQ0VTIEFQSSB3aGljaCBpcyB1c2UgaW4gRkFDRVRcbiAgLy9cbiAgLy8gSXQgd29ya3MgbGlrZSB0aGlzOlxuICAvLyAxLiBUaGUgQ0kgbWFuaWZlc3QgaXMgZmV0Y2hlZFxuICAvLyAyLiBBbiBpZnJhbWUgaXMgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IHN0eWxlIGFuZCBmaXJzdCBzY3JpcHQgZnJvbSB0aGUgbWFuaWZlc3QgYXJlIGxvYWRlZFxuICAvLyAzLiBUaGUgZmlyc3Qgc2NyaXB0IGlzIGJvb3RzdHJhcC5qcyB3aGljaCBhbHNvIGNyZWF0ZXMgYW4gaWZyYW1lIGFuZCBsb2FkcyB0aGUgZmlyc3QgbWVkaWEgZnJvbSB0aGUgbWFuaWZlc3RcbiAgLy8gNC4gQ29tbXVuaWNhdGlvbiBpcyBkb25lIHZpYSB0aGUgQ0VTIEFQSSBidXQgYmVjYXVzZSB0aGUgaWZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIENFUyBvYmplY3Qgd2UgbmVlZCB0byB1c2Ugd2luZG93LnBvc3RNZXNzYWdlXG5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGNoYW5nZSB0aGUgcGFja2FnZSBieSByZXBsYWNpbmcgdGhlIGJvb3RzdHJhcC5qcyB3aXRoIG91ciBvd24gYW5kIGluamVjdCBhIHByb3h5IENFUyBBUEkgdGhhdCBjb21tdW5pY2F0ZXMgdmlhIHBvc3RNZXNzYWdlXG4gIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIHJ1biB0aGlzIGluIHN0b3J5Ym9vaywgd2UgY2Fubm90IHVzZSB3aW5kb3cudG9wIGJlY2F1c2UgdG8gc2VuZCBtZXNzYWdlcyB0aGVyZSwgYmVjYXVzZSBpbiBjYXNlIG9mIHN0b3J5Ym9vayB0aGF0IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgLy8gU28gd2Ugc2VuZCBtZXNzYWdlcyB0byBhbGwgcGFyZW50IHdpbmRvd3NcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSA9IHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSlcbiAgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICJpR0FBQSxPQUFTLFdBQUFBLE9BQWUsZUFDeEIsT0FBUyxjQUFBQyxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxNQUFnQixvQkMyQmpDLFNBQVNDLEVBQU1DLEVBQWlDQyxFQUF3QixDQUM3RSxJQUFNQyxFQUEwQ0MsRUFBQSxDQUM5QyxxQkFBc0IsSUFDbkJGLEdBRUwsTUFBTyxDQUErQkcsRUFBa0JDLElBQTBELENBRWhILEdBQU0sQ0FBRSxPQUFBQyxDQUFPLEVBQUlGLEVBQ2JHLEVBQW9CLE1BQU0sUUFBUVAsQ0FBWSxFQUFJQSxFQUFlLENBQUNBLENBQVksRUFHcEZJLEVBQU0sT0FBUyxTQUEyQkksRUFBZ0UsQ0FDeEdELEVBQWtCLFFBQVFFLEdBQVksQ0FDcEMsSUFBTUMsRUFBTUQsRUFDWixHQUFJRCxFQUFhLElBQUlFLENBQUcsRUFBRyxDQUN6QixJQUFNQyxFQUFXSCxFQUFhLElBQUlFLENBQUcsRUFDL0JFLEVBQVcsS0FBS0YsQ0FBRyxFQUVyQkMsSUFBYUMsSUFDWCxDQUFDVixFQUFnQixzQkFBd0IsS0FBSyxhQUMvQyxLQUFLRyxDQUFlLEVBQStCTSxFQUFVQyxDQUFRLENBRzVFLENBQ0YsQ0FBQyxFQUVETixFQUFPLEtBQUssS0FBTUUsQ0FBWSxDQUNoQyxDQUNGLENBQ0YsQ0MxREEsT0FBUyxpQkFBQUssT0FBcUIsZUFTdkIsSUFB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Q1QsQ0FFUSx1QkFBd0IsQ0FHOUIsS0FBSyxjQUNILElBQUksWUFBWSwyQkFBNEIsQ0FDMUMsUUFBUyxHQUNULFdBQVksR0FDWixTQUFVLEdBQ1YsT0FBUSxDQUFFLFdBQVksS0FBSyxVQUFXLENBQ3hDLENBQUMsQ0FDSCxDQUNGLENBQ0YsRUFwQ0VDLEVBQUEsQ0FEQ0MsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBWmZMLEdBYVgsMEJBYldBLEdBQU5JLEVBQUEsQ0FETkUsR0FBYyxtQkFBbUIsR0FDckJOLElDSmIsT0FBUyxPQUFBTyxHQUFLLFFBQUFDLEdBQU0sY0FBQUMsR0FBWSxXQUFBQyxPQUFlLE1BQy9DLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsT0FBZ0Isb0JBUWpDLElBQU1DLEdBQU4sY0FBOEJDLEVBQW1CQyxHQUFZLG1CQUFtQixDQUFFLENBeUJ2RixJQUFJLFNBQVUsQ0FDWixPQUFPLEtBQUssVUFBYSxPQUFPLElBQUksV0FBVyxDQUNqRCxDQUVTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQTtBQUFBO0FBQUEsUUFHSCxLQUFLLE9BQVNBLHFCQUF1QixLQUFLLE1BQU0sU0FBV0MsRUFBTztBQUFBLGlDQUV4RSxDQUNGLEVBcENhSixHQUNKLE9BQVNLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXFCVEMsRUFBQSxDQUROQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsRUFBTSxDQUFDLEdBckJqQ1AsR0FzQkosc0JBdEJJQSxHQUFOTSxFQUFBLENBRE5FLEdBQWMsbUJBQW1CLEdBQ3JCUixJQytEYixRQUFRLElBQ04sMENBQ0EsZ0NBQ0EsZ0dBQ0EsbUJBQ0YiLAogICJuYW1lcyI6IFsicHJvdmlkZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm9wZXJ0eU5hbWUiLCAib3B0aW9ucyIsICJyZXNvbHZlZE9wdGlvbnMiLCAiX19zcHJlYWRWYWx1ZXMiLCAicHJvdG8iLCAiZGVjb3JhdGVkRm5OYW1lIiwgInVwZGF0ZSIsICJ3YXRjaGVkUHJvcGVydGllcyIsICJjaGFuZ2VkUHJvcHMiLCAicHJvcGVydHkiLCAia2V5IiwgIm9sZFZhbHVlIiwgIm5ld1ZhbHVlIiwgImNyZWF0ZUNvbnRleHQiLCAiaXRlbUNvbnRleHRWYXJpYWJsZXMiLCAiaXRlbUNvbnRleHQiLCAiUXRpQXNzZXNzbWVudEl0ZW0iLCAiTGl0RWxlbWVudCIsICJfIiwgImRpc2FibGVkIiwgImNoIiwgInJlYWRvbmx5IiwgIml0ZW1Db250ZXh0VmFyaWFibGVzIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAiZmVlZGJhY2tFbGVtZW50IiwgInJlc3BvbnNlSWRlbnRpZmllciIsICJjb3VudEF0dGVtcHQiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAidmFsdWUiLCAidiIsICJ2YXJpYWJsZSIsICJtYXRjaGluZ1ZhbHVlIiwgImludGVyYWN0aW9uRWxlbWVudCIsICJlbCIsICJmZSIsICJteVJlc3BvbnNlcyIsICJyZXNwb25zZSIsICJpbnRlcmFjdGlvbiIsICJpIiwgImh0bWwiLCAic2hvdyIsICJyZXNwb25zZXMiLCAidmFyaSIsICJjciIsICJjb3VudE51bUF0dGVtcHRzIiwgIl9hIiwgInJlc3BvbnNlUHJvY2Vzc29yIiwgImlkZW50aWZpZXIiLCAiZXZlbnQiLCAib3V0Y29tZVZhcmlhYmxlIiwgIm5hbWUiLCAiZGV0YWlsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm92aWRlIiwgIml0ZW1Db250ZXh0IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiIsICJMaXRFbGVtZW50IiwgImV2ZW50IiwgInN0aW11bHVzUmVmIiwgInBhdGgiLCAic3RpbXVsdXMiLCAicXRpVHJhbnNmb3JtSXRlbSIsICJhcGkiLCAiZWxlbWVudHMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJhcmlhQm9vbGVhbkNvbnZlcnRlciIsICJ2YWx1ZSIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiQmFzZSIsICJ0eXBlIiwgIlF0aUNob2ljZSIsICJhcmdzIiwgIl9vbGRWYWx1ZSIsICJkaXNhYmxlZCIsICJldmVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJRdGlJdGVtQm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQcm9tcHQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlTdHlsZXNoZWV0IiwgIkxpdEVsZW1lbnQiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgImxpbmsiLCAicmVzcG9uc2UiLCAiY3NzQ29udGVudCIsICJtaW5pZmllZENzcyIsICJlcnJvciIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpVmFyaWFibGVEZWNsYXJhdGlvbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAidmFyaWFibGUiLCAiaHRtbFZhbHVlcyIsICJkZWZhdWx0VmFsdWVzIiwgIm4iLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpT3V0Y29tZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInRhYmxlIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlVmFsdWUiLCAidGFyZ2V0VmFsdWUiLCAib3V0Y29tZVZhcmlhYmxlIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlSZXNwb25zZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInJlc3BvbnNlVmFyaWFibGUiLCAicmVzdWx0IiwgImNvcnJlY3RSZXNwb25zZSIsICJ2YWx1ZXMiLCAiaSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyIsICJMaXRFbGVtZW50IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUNvbnRlbnRCb2R5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpUnVicmljQmxvY2siLCAiTGl0RWxlbWVudCIsICJvbGQiLCAiZGlzYWJsZWQiLCAiY2xhc3NOYW1lIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImRlY2ltYWxTZXBhcmF0b3IiLCAiY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQiLCAibnVtYmVyIiwgImRTZXAiLCAiSXNOdWxsT3JVbmRlZmluZWQiLCAidmFsdWUiLCAicmVtb3ZlRG91YmxlU2xhc2hlcyIsICJzdHIiLCAiUXRpRmVlZGJhY2siLCAiTGl0RWxlbWVudCIsICJvdXRjb21lSWRlbnRpZmllciIsICJvdXRjb21lVmFyaWFibGUiLCAidiIsICJpc0ZvdW5kIiwgIklzTnVsbE9yVW5kZWZpbmVkIiwgInZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgIlF0aUZlZWRiYWNrQmxvY2siLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpRmVlZGJhY2tJbmxpbmUiLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNb2RhbEZlZWRiYWNrIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImlmRGVmaW5lZCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgIkludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAib2xkIiwgImNsYXNzZXMiLCAiY2xhc3NOYW1lcyIsICJyb3dzU2V0IiwgImNsYXNzTmFtZSIsICJuclJvd3MiLCAiZXN0aW1hdGVkUm93cyIsICJ2YWwiLCAiZm9ybURhdGEiLCAidGV4dGFyZWEiLCAicGF0dGVyblNvdXJjZSIsICJwYXR0ZXJuIiwgImlzVmFsaWQiLCAiY3NzIiwgImh0bWwiLCAiZXZlbnQiLCAiaWZEZWZpbmVkIiwgImlucHV0IiwgInRleHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJjcmVhdGVSZWYiLCAiY3NzIiwgInF0aV90ZXh0X2VudHJ5X2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aVRleHRFbnRyeUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImNyZWF0ZVJlZiIsICJ2YWwiLCAiZm9ybURhdGEiLCAiaW5wdXQiLCAiaXNWYWxpZCIsICJodG1sIiwgImV2ZW50IiwgImlmRGVmaW5lZCIsICJ0ZXh0IiwgInF0aV90ZXh0X2VudHJ5X2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJxdWVyeSIsICJDaG9pY2VzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJzZWxlY3RvciIsICJDaG9pY2VzTWl4aW5FbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiY2giLCAicmVhZG9ubHkiLCAiY2hvaWNlIiwgIl9vbGRWYWx1ZSIsICJfbmV3VmFsdWUiLCAidmFsIiwgImZvcm1EYXRhIiwgInJlc3BvbnNlIiwgInZhbHVlIiwgInJlc3BvbnNlQXJyYXkiLCAic2VsZWN0ZWRDaG9pY2VzIiwgInNlbGVjdGVkQ291bnQiLCAiaXNWYWxpZCIsICJ2YWxpZGl0eU1lc3NhZ2UiLCAiZXZlbnQiLCAiY2hvaWNlRWxlbWVudCIsICJjaGVja2VkIiwgIl9hIiwgInNlbGVjdGVkSWRlbnRpZmllcnMiLCAiaXNTZWxlY3RlZCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiUXRpSG90dGV4dEludGVyYWN0aW9uIiwgIkNob2ljZXNNaXhpbiIsICJJbnRlcmFjdGlvbiIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJjc3MiLCAiaHRtbCIsICJvcHRpb24iLCAidW5zYWZlSFRNTCIsICJjaG9pY2VzIiwgImNob2ljZSIsICJzZWxlY3RlZE9wdGlvbiIsICJpIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAidmFsdWUiLCAiZXZlbnQiLCAic2VsZWN0ZWRPcHRpb25WYWx1ZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2h1ZmZsZU1peGluIiwgInN1cGVyQ2xhc3MiLCAic2VsZWN0b3IiLCAiU2h1ZmZsZUVsZW1lbnQiLCAidmFsdWUiLCAib2xkVmFsdWUiLCAiY2hvaWNlcyIsICJmaXhlZEVsZW1lbnRzIiwgIm5vbkZpeGVkRWxlbWVudHMiLCAiY2hvaWNlIiwgImluZGV4IiwgImlzU2h1ZmZsZWQiLCAibWF4QXR0ZW1wdHMiLCAiYXR0ZW1wdCIsICJvcmlnaW5hbE9yZGVyIiwgImkiLCAiaiIsICJvcmRlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RyaW5nVG9Cb29sZWFuQ29udmVydGVyIiwgInByb3BlcnR5IiwgIlZvY2FidWxhcnlNaXhpbiIsICJzdXBlckNsYXNzIiwgInNlbGVjdG9yIiwgIlZvY2FidWxhcnlFbGVtZW50IiwgInZhbHVlIiwgIl9hIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJjbGFzc0NvbnRhaW5zTGFiZWwiLCAiY2xzIiwgImlzTnVtYmVyIiwgImNob2ljZXMiLCAiYyIsICJjaG9pY2UiLCAiaW5kZXgiLCAiYSIsICJiIiwgImkiLCAibGFzdExhYmVsIiwgImxhc3RMYWJlbFN1ZmZpeCIsICJsYWJlbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3NzIiwgInF0aV9jaG9pY2VfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiUXRpQ2hvaWNlSW50ZXJhY3Rpb24iLCAiVm9jYWJ1bGFyeU1peGluIiwgIlNodWZmbGVNaXhpbiIsICJDaG9pY2VzTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlPdXRjb21lUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibG9naWMiLCAiUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IiLCAicnVsZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInJ1bGUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIm1hdGNoQ29ycmVjdCIsICJtYXBSZXNwb25zZSIsICJtYXBSZXNwb25zZVBvaW50IiwgIlF0aVJlc3BvbnNlUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicnVsZXMiLCAicnVsZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAic3BsaXR0ZWRUZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVOYW1lIiwgIm1hcFJlc3BvbnNlIiwgIm1hcFJlc3BvbnNlUG9pbnQiLCAibWF0Y2hDb3JyZWN0IiwgInN0ckhUTUwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIlF0aVJ1bGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aUxvb2t1cE91dGNvbWVWYWx1ZSIsICJRdGlSdWxlIiwgImlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgInZhbHVlIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJodG1sIiwgIlF0aVJlc3BvbnNlQ29uZGl0aW9uIiwgIlF0aVJ1bGUiLCAiaHRtbCIsICJicmFuY2hlcyIsICJpIiwgImJyYW5jaCIsICJRdGlTZXRPdXRjb21lVmFsdWUiLCAiUXRpUnVsZSIsICJvdXRjb21lSWRlbnRpZmllciIsICJleHByZXNzaW9uIiwgInZhbHVlIiwgIlF0aVNldE91dGNvbWVWYWx1ZVJ1bGUiLCAidiIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiUXRpUmVzcG9uc2VFbHNlIiwgInN1YlJ1bGVzIiwgImkiLCAiaHRtbCIsICJRdGlSZXNwb25zZUlmIiwgIlF0aVJlc3BvbnNlRWxzZSIsICJyZXN1bHQiLCAiaSIsICJRdGlSZXNwb25zZUVsc2VJZiIsICJRdGlSZXNwb25zZUlmIiwgImh0bWwiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgInN0YXRlIiwgIlF0aUV4cHJlc3Npb24iLCAiTGl0RWxlbWVudCIsICJpZGVudGlmaWVyIiwgInYiLCAidmFsdWVzIiwgInJlc3BvbnNlVmFyaWFibGUiLCAiZXJyb3IiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJRdGlFeHByZXNzaW9uIiwgIlF0aUFuZCIsICJxdGlBbmRNaXhpbiIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgIkJhc2UiLCAiY2hpbGRyZW4iLCAiYyIsICJjb25kaXRpb24iLCAidmFsdWUiLCAidmFsIiwgImUiLCAiUXRpQW5kIiwgInByb3BlcnR5IiwgIlF0aUJhc2VWYWx1ZSIsICJRdGlFeHByZXNzaW9uIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlDb250YWlucyIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb2plY3Rpb24xIiwgInByb2plY3Rpb24yIiwgIngiLCAiUXRpQ29ycmVjdCIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAicmVzcG9uc2VWYXJpYWJsZSIsICJ2IiwgInByb3BlcnR5IiwgIlF0aUVxdWFsUm91bmRlZCIsICJRdGlFeHByZXNzaW9uIiwgImZpZ3VyZXMiLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiZmxvYXQxIiwgImZsb2F0MiIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2NvcmluZ0hlbHBlciIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgImJhc2VUeXBlIiwgImludDEiLCAiaW50MiIsICJmbG9hdDEiLCAiZmxvYXQyIiwgInBhaXIxIiwgInBhaXIyIiwgIlF0aUVxdWFsIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpR3QiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlHdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlJc051bGwiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFsdWUiLCAiUXRpTHQiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlMdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9wZXJ0eSIsICJRdGlNYXBSZXNwb25zZSIsICJRdGlFeHByZXNzaW9uIiwgInJlc3BvbnNlIiwgInIiLCAibWFwcGluZyIsICJjYW5kaWRhdGVSZXNwb25zZXMiLCAicmVzdWx0IiwgImNhbmRpZGF0ZVJlc3BvbnNlIiwgIm1hcHBlZFZhbHVlIiwgImVudHJ5IiwgIlNjb3JpbmdIZWxwZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiUXRpTWFwcGluZyIsICJMaXRFbGVtZW50IiwgImVsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlNYXRjaCIsICJfUXRpTWF0Y2giLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWVUb01hcCIsICJjb3JyZWN0VmFsdWVJbmZvIiwgIl9hIiwgIlNjb3JpbmdIZWxwZXIiLCAiaSIsICJhbnN3ZXJJbmRleCIsICJjb3JyZWN0QW5zd2VyIiwgIm1hdGNoaW5nVmFsdWUiLCAiYXJyIiwgIm12IiwgIlF0aU1lbWJlciIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb2plY3Rpb24xIiwgIlF0aU11bHRpcGxlIiwgIlF0aUV4cHJlc3Npb24iLCAidmFyaWFibGVzIiwgInZhcmlhYmxlIiwgImh0bWwiLCAiUXRpTm90IiwgIlF0aUV4cHJlc3Npb24iLCAiaHRtbCIsICJRdGlPciIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgImMiLCAiY29uZGl0aW9uIiwgInZhbHVlIiwgInZhbCIsICJRdGlPcmRlcmVkIiwgIlF0aUV4cHJlc3Npb24iLCAidmFyaWFibGVzIiwgInZhcmlhYmxlIiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVByaW50ZWRWYXJpYWJsZSIsICJMaXRFbGVtZW50IiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJRdGlQcm9kdWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiYWNjdW11bGF0b3IiLCAiY3VycmVudFZhbHVlIiwgImVycm9yIiwgInByb3BlcnR5IiwgIlF0aVN0cmluZ01hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAidjEiLCAidjIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpU3VtIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpU3VtRXhwcmVzc2lvbiIsICJleHByZXNzaW9ucyIsICJjIiwgInZhbHVlIiwgImEiLCAiYiIsICJRdGlWYXJpYWJsZSIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAidiIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ1cmwiLCAiYmFzZVVybCIsICJyZXF1aXJlQ29uZmlnIiwgIm1vZHVsZUNvbmciLCAibW9kdWxlSWQiLCAiZSIsICJwYXRoIiwgImJhc2VQYXRoIiwgInAiLCAiaW5wdXQiLCAidG9wTGV2ZWxLZXkiLCAibmVzdGVkT2JqZWN0IiwgIm5lc3RlZEtleSIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJuZXdSZXNwb25zZSIsICJzdHJpbmdpZmllZCIsICJ2YWwiLCAibm9kZSIsICJhIiwgImNvbmZpZyIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImVsIiwgInByb3BlcnR5IiwgImtleSIsICJjaGlsZHJlbiIsICJhbGxLZXkiLCAiYyIsICJrIiwgImdldENoaWxkUHJvcGVydGllcyIsICJwcm9wZXJ0aWVzIiwgImNoaWxkIiwgIl9fc3ByZWFkVmFsdWVzIiwgInBjaSIsICJ0eXBlIiwgImRvbSIsICJhY2MiLCAibGluayIsICJzdHlsZXMiLCAiY3R4QSIsICJyZXF1aXJlIiwgImNvbnRleHQiLCAiaW50ZXJhY3Rpb25Nb2R1bGVzIiwgIm1vZHVsZXMiLCAibW9kdWxlIiwgInByaW1hcnlQYXRoIiwgImZhbGxiYWNrUGF0aCIsICJwYXRocyIsICJleGlzdGluZ1BhdGgiLCAicGF0aDEiLCAicGF0aDIiLCAicGF0aDFBcnJheSIsICJwYXRoMkFycmF5IiwgInN0ciIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJzdGF0ZSIsICJUb3VjaERyYWdBbmREcm9wIiwgIl9Ub3VjaERyYWdBbmREcm9wIiwgInR5cGUiLCAidmFsIiwgImRyYWdnYWJsZXMiLCAiZWwiLCAiZSIsICJ4IiwgInkiLCAiY29tcHV0ZWRTdHlsZSIsICJyZWN0IiwgImN1cnJlbnRUb3VjaCIsICJjb21wdXRlZFN0eWxlcyIsICJzdHlsZSIsICJkZWx0YVgiLCAiZGVsdGFZIiwgImRyb3BUYXJnZXQiLCAiX2EiLCAiZHJvcEZvdW5kIiwgImRyYWdFbmRFdmVudCIsICJldmVudCIsICJyb290IiwgImRlcHRoIiwgImVsZW1lbnQiLCAiY3VycmVudEVsZW1lbnQiLCAic2hhZG93RWxlbWVudCIsICJuZXh0RHJvcFpvbmUiLCAicGFnZSIsICJ0b3VjaCIsICJuZXdMZWZ0IiwgIm5ld1RvcCIsICJib3VuZGVkTGVmdCIsICJib3VuZGVkVG9wIiwgImJvdW5kYXJ5UmVjdCIsICJlbGVtZW50UmVjdCIsICJlbGVtZW50V2lkdGgiLCAiZWxlbWVudEhlaWdodCIsICJib3VuZGVkRGVsdGFYIiwgImJvdW5kZWREZWx0YVkiLCAieERpc3QiLCAieURpc3QiLCAiZXZlbnRUeXBlIiwgImJ1YmJsZSIsICJwcm9wZXJ0eSIsICJEcm9wcGFibGVzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJ1c2VTaGFkb3dSb290IiwgImRyb3BwYWJsZXNTZWxlY3RvciIsICJEcm9wcGFibGVzRWxlbWVudCIsICJjaGFuZ2VkUHJvcHMiLCAiZHJvcHBhYmxlcyIsICJkcm9wcGFibGUiLCAibXV0YXRpb25zIiwgImF0dHJpYnV0ZU5hbWUiLCAiX2EiLCAiZXYiLCAiaWRlbnRpZmllciIsICJkcmFnZ2FibGUiLCAibW92ZUVsZW1lbnQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIkZsaXBwYWJsZXNNaXhpbiIsICJzdXBlckNsYXNzIiwgImRyb3BwYWJsZXNTZWwiLCAiZHJhZ2dhYmxlc1NlbCIsICJGbGlwcGFibGVzRWxlbWVudCIsICJwcm9wZXJ0eSIsICJsaXZlUXVlcnkiLCAicXVlcnlTZWxlY3RvciIsICJvcHRpb25zIiwgIm9ic2VydmVyIiwgInJlc29sdmVkT3B0aW9ucyIsICJfX3NwcmVhZFZhbHVlcyIsICJwcm90byIsICJkZWNvcmF0ZWRGbk5hbWUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCAiX2EiLCAiY2FsbGJhY2siLCAibXV0YXRpb25MaXN0IiwgImVsZW1lbnRzVG9XYXRjaCIsICJtdXRhdGlvbiIsICJhZGRlZE5vZGVzIiwgImUiLCAicmVtb3ZlZE5vZGVzIiwgIm4iLCAiZWxlbWVudHNBZGRlZCIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAic3VwZXJDbGFzcyIsICJkcmFnZ2FibGVzU2VsZWN0b3IiLCAidXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXMiLCAiZHJvcHBhYmxlc1NlbGVjdG9yIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IiwgIkZsaXBwYWJsZXNNaXhpbiIsICJEcm9wcGFibGVzTWl4aW4iLCAiZXYiLCAidGFyZ2V0IiwgImRyYWdnYWJsZSIsICJyZXNvbHZlIiwgImhhc01vdmVUZXN0SXRlbSIsICJpdGVtcyIsICJwZW5kaW5nIiwgIml0ZW0iLCAiZGF0YSIsICJkcmFnc0FkZGVkIiwgImRyYWdzUmVtb3ZlZCIsICJuZXdEcmFnZ2FibGVzIiwgImNoYW5nZWRQcm9wcyIsICJUb3VjaERyYWdBbmREcm9wIiwgImRyYWdnYWJsZXMiLCAiZCIsICJpbmRleCIsICJwYXJlbnQiLCAidGFyZ2V0SW5kZXgiLCAibW92ZURyYWdnYWJsZSIsICJ0cmFuc2l0aW9uIiwgIm1heE1hdGNoIiwgImRyb3BwYWJsZSIsICJ2YWx1ZSIsICJlbnRyeSIsICJyZXNwb25zZSIsICJkcm9wSWQiLCAiZHJhZ0lkcyIsICJkcmFnSWQiLCAiaWRlbnRpZmllciIsICJkcm9wIiwgIm1vdmVFbGVtZW50IiwgInZhbGlkQXNzb2NpYXRpb25zIiwgImRyYWdnYWJsZXNJbkRyb3BwYWJsZSIsICJpZGVudGlmaWVycyIsICJkcm9wcGFibGVJZGVudGlmaWVyIiwgImlkIiwgInNhdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImxpdmVRdWVyeSIsICJjc3MiLCAicXRpX2Fzc29jaWF0ZV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiZXZlbnQiLCAiY2hvaWNlIiwgImh0bWwiLCAiXyIsICJpbmRleCIsICJxdGlfYXNzb2NpYXRlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlDdXN0b21JbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ1cmlUb01hbmlmZXN0IiwgInJlbW92ZURvdWJsZVNsYXNoZXMiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJlcnIiLCAiaWZyYW1lIiwgImlmcmFtZVdpbiIsICJpZnJhbWVEb2MiLCAiaWZyYW1lc0luU2hhZG93Um9vdCIsICJvdXRlcklGcmFtZXMiLCAiaWZyYW1lU3JjIiwgIm91dGVyRG9jIiwgImUiLCAiaW5kZXgiLCAiaWZyYW1lRG9jdW1lbnQiLCAiaWZyYW1lcyIsICJuZXN0ZWREb2MiLCAidHlwZSIsICJldmVudCIsICJtZWRpYURhdGEiLCAibWVkaWEiLCAidmFsIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUdhcE1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkludGVyYWN0aW9uIiwgImh0bWwiLCAidmFsdWUiLCAibWF0Y2hlcyIsICJyZXNwb25zZSIsICJ4IiwgInNwbGl0IiwgImdhcCIsICJpbmRleCIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJpZGVudGlmaWVyIiwgInRleHRJZGVudGlmaWVyIiwgInRleHQiLCAidGV4dFNwYW4iLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgInN2ZyIsICJjdXN0b21FbGVtZW50IiwgInF1ZXJ5IiwgInF1ZXJ5QXNzaWduZWRFbGVtZW50cyIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgInBvc2l0aW9uSG90c3BvdHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgImltZyIsICJob3RzcG90IiwgImNlbnRlclgiLCAiY2VudGVyWSIsICJyYWRpdXMiLCAiY2VudGVyWFBlciIsICJjZW50ZXJZUGVyIiwgInJhZGl1c1BlciIsICJsZWZ0WCIsICJ0b3BZIiwgInJpZ2h0WCIsICJib3R0b21ZIiwgImxlZnRYUGVyIiwgInRvcFlQZXIiLCAicmlnaHRYUGVyIiwgImJvdHRvbVlQZXIiLCAicG9seWNvb3JkcyIsICJhY2MiLCAiY3VycmVudFZhbHVlIiwgImN1cnJlbnRJbmRleCIsICJwb2x5QyIsICJsYXN0VmFsIiwgInBvaW50IiwgInBvbHlEIiwgInAiLCAiUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJodG1sIiwgImlmRGVmaW5lZCIsICJyZXBlYXQiLCAibGluZSIsICJpbmRleCIsICJzdmciLCAiZSIsICJfIiwgImkiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiZXZlbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJJbnRlcmFjdGlvbiIsICJodG1sIiwgImUiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgImNlbnRlclgiLCAiY2VudGVyWSIsICJyYWRpdXMiLCAibGVmdFgiLCAidG9wWSIsICJyaWdodFgiLCAiYm90dG9tWSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbiIsICJDaG9pY2VzTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJlIiwgImlkZW50aWZpZXIiLCAiaG90c3BvdCIsICJlbCIsICJtYXhTZWxlY3Rpb24iLCAiaW1nIiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUhvdHNwb3RJbnRlcmFjdGlvbiIsICJDaG9pY2VzTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAicXRpX21hdGNoX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aU1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkludGVyYWN0aW9uIiwgInJhZGlvIiwgImNoZWNrYm94IiwgInZhbHVlIiwgIm5hbWUiLCAidHlwZSIsICJ2IiwgInZhbCIsICJyZXNwb25zZVZhbHVlIiwgImh0bWwiLCAiY29sIiwgImkiLCAidW5zYWZlSFRNTCIsICJyb3ciLCAickluZGV4IiwgImNJbmRleCIsICJyb3dJZCIsICJjb2xJZCIsICJzZWxlY3RlZEluUm93Q291bnQiLCAiY2hlY2tlZCIsICJwYXJ0IiwgImRpc2FibGUiLCAiZSIsICJxdGlfbWF0Y2hfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNZWRpYUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgImh0bWwiLCAibWVkaWFPYmplY3QiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJRdGlPcmRlckludGVyYWN0aW9uIiwgIlNodWZmbGVNaXhpbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiSW50ZXJhY3Rpb24iLCAiY2hvaWNlcyIsICJodG1sIiwgIl8iLCAiaSIsICJ1bnNhZmVIVE1MIiwgInZhbHVlIiwgInJlc3BvbnNlIiwgImluZGV4IiwgInNpbXBsZUNob2ljZSIsICJ0ZXh0IiwgImRyb3BwYWJsZSIsICJkcmFnc0luRHJvcHBhYmxlIiwgImQiLCAiY2hhbmdlZFByb3BzIiwgImVsIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgIlF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQb3NpdGlvbk9iamVjdFN0YWdlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJldmVudCIsICJkZWx0YVgiLCAiZGVsdGFZIiwgImEiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicmVwZWF0IiwgInN0eWxlTWFwIiwgIlF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiZXZlbnQiLCAieCIsICJ5IiwgImh0bWwiLCAicmVwZWF0IiwgInBvaW50IiwgImluZGV4IiwgInN0eWxlTWFwIiwgImUiLCAiXyIsICJpIiwgInZhbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAibm90aGluZyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInF1ZXJ5IiwgIlF0aVNsaWRlckludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgIm9sZCIsICJkaXNhYmxlZCIsICJyZWFkb25seSIsICJ2YWx1ZSIsICJ2YWwiLCAibXlSZXNwb25zZSIsICJ2YWx1ZVBlcmNlbnRhZ2UiLCAiaHRtbCIsICJub3RoaW5nIiwgImV2ZW50IiwgImhhbmRsZVRvdWNoTW92ZSIsICJ4IiwgImRpZmZYIiwgImhhbmRsZVRvdWNoRW5kIiwgImhhbmRsZU1vdXNlTW92ZSIsICJoYW5kbGVNb3VzZVVwIiwgInZhbHVlTm93IiwgInJvdW5kZWRTdGVwVmFsdWUiLCAiX3RvdWNoTW92ZSIsICJldnQiLCAidG91Y2giLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJxdWVyeSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiUXRpQ3VzdG9tT3BlcmF0b3IiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImV2ZW50IiwgIl9hIiwgIl9iIiwgIl9jIiwgImNvbW1lbnROb2RlIiwgIm5vZGUiLCAiZSIsICJmbiIsICJyZXNwb25zZUlkZW50aWZpZXIiLCAidiIsICJpdGVtIiwgInZhcmlhYmxlSWRlbnRpZmllciIsICJvdXRjb21lSWRlbnRpZmllciIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlBc3NvY2lhYmxlSG90c3BvdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXAiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUdhcEltZyIsICJMaXRFbGVtZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwVGV4dCIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUhvdHNwb3RDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3R0ZXh0IiwgIkFjdGl2ZUVsZW1lbnRNaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlJbmxpbmVDaG9pY2UiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlTaW1wbGVDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJub3RoaW5nIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K
|