@citolab/qti-components 6.9.1-beta.5 → 6.9.1-beta.51

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.
@@ -1,20 +1,20 @@
1
- import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as dr}from"@lit/context";import{LitElement as ur,html as mr}from"lit";import{customElement as hr,property as W}from"lit/decorators.js";function v(c,s){let e=b({waitUntilFirstUpdate:!1},s);return(t,r)=>{let{update:o}=t,n=Array.isArray(c)?c:[c];t.update=function(a){n.forEach(l=>{let p=l;if(a.has(p)){let d=a.get(p),h=this[p];d!==h&&(!e.waitUntilFirstUpdate||this.hasUpdated)&&this[r](d,h)}}),o.call(this,a)}}}import{createContext as pr}from"@lit/context";var Ht=[{identifier:"completionStatus",cardinality:"single",baseType:"string",value:"unknown",type:"outcome"},{identifier:"numAttempts",cardinality:"single",baseType:"integer",value:"0",type:"response"}],A=pr("item");var C=class extends ur{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:Ht};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(o=>o.identifier===t.identifier);return r?b(b({},t),r):t})}),this._context.variables.forEach(t=>{if(t.type==="response"){let r=this._interactionElements.find(o=>o.responseIdentifier===t.identifier);r&&(r.response=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 o=this._interactionElements.find(n=>n.getAttribute("response-identifier")===t.responseIdentifier);o&&(o.response=t.response)}}render(){return mr`<slot></slot>`}showCorrectResponse(e){let r=this._context.variables.filter(o=>"correctResponse"in o&&o.correctResponse).map(o=>({responseIdentifier:o.identifier,response:o.correctResponse}));for(let o of r){let n=this._interactionElements.find(a=>a.getAttribute("response-identifier")===o.responseIdentifier);n&&(n.correctResponse=e?o.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(o=>o.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 o;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(n=>n.identifier!==e?n:q(b({},n),{value:r.cardinality==="single"?t:[...n.value,t]}))}),this._feedbackElements.forEach(n=>n.checkShowFeedback(e)),this._emit("qti-outcome-changed",{item:this.identifier,outcomeIdentifier:e,value:(o=this._context.variables.find(n=>n.identifier===e))==null?void 0:o.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}))}};i([W({type:String})],C.prototype,"title",2),i([W({type:String})],C.prototype,"identifier",2),i([W({type:String})],C.prototype,"adaptive",2),i([W({type:String})],C.prototype,"timeDependent",2),i([W({type:Boolean})],C.prototype,"disabled",2),i([v("disabled",{waitUntilFirstUpdate:!0})],C.prototype,"_handleDisabledChange",2),i([W({type:Boolean})],C.prototype,"readonly",2),i([v("readonly",{waitUntilFirstUpdate:!0})],C.prototype,"_handleReadonlyChange",2),i([dr({context:A})],C.prototype,"_context",2),C=i([hr("qti-assessment-item")],C);import{LitElement as fr}from"lit";import{customElement as gr,property as Vt}from"lit/decorators.js";var z=class extends fr{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 o=this.closest("qti-assessment-item").querySelector(`[data-stimulus-idref=${this.identifier}]`);o?await this.loadAndAppendStimulus(o):console.warn(`Stimulus with data-stimulus-idref ${this.identifier} not found`)}}async loadAndAppendStimulus(e){var o;let t=this.href.substring(0,this.href.lastIndexOf("/")),r=await Nt().load(this.href).then(n=>n.path(t).htmldoc());if(r){let n=r.querySelectorAll("qti-stimulus-body, qti-stylesheet");e.append(...n),((o=r.querySelector("qti-assessment-stimulus"))==null?void 0:o.title).includes("(lijst)")&&e.classList.add("qti-stimulus-list")}}};i([Vt({type:String})],z.prototype,"identifier",2),i([Vt({type:String})],z.prototype,"href",2),z=i([gr("qti-assessment-stimulus-ref")],z);import{LitElement as br,html as vr}from"lit";import{property as ce}from"lit/decorators.js";var yr={SPACE:32},E=class extends br{constructor(){super(...arguments);this.tabindex=0;this.disabled=!1;this.readonly=!1;this.checked=!1}handleDisabledChange(e,t){t?(this.tabindex=void 0,this.blur()):this.tabIndex=0}connectedCallback(){super.connectedCallback(),this.addEventListener("keyup",this._onKeyUp),this.addEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent("qti-register-choice",{bubbles:!0,cancelable:!1,composed:!0}))}disconnectedCallback(){this.removeEventListener("keyup",this._onKeyUp),this.removeEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent("qti-loose-choice",{bubbles:!0,cancelable:!1,composed:!0}))}reset(){this.checked=!1,this.disabled=!1}_onKeyUp(e){if(!e.altKey)switch(e.keyCode){case yr.SPACE:e.preventDefault(),this._toggleChecked();break;default:}}_onClick(){this._toggleChecked()}_toggleChecked(){this.disabled||this.readonly||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("qti-choice-element-selected",{bubbles:!0,cancelable:!1,composed:!0,detail:{identifier:this.identifier,checked:this.checked}})))}render(){return vr` <slot></slot> `}};i([ce({type:String})],E.prototype,"identifier",2),i([ce({type:Number,reflect:!0})],E.prototype,"tabindex",2),i([ce({reflect:!0,type:Boolean,attribute:"aria-disabled",converter:{toAttribute:e=>e}})],E.prototype,"disabled",2),i([ce({reflect:!0,type:Boolean,attribute:"aria-readonly",converter:{toAttribute:e=>e}})],E.prototype,"readonly",2),i([ce({reflect:!0,type:Boolean,attribute:"aria-checked",converter:{toAttribute:e=>e}})],E.prototype,"checked",2),i([v("disabled",{waitUntilFirstUpdate:!0})],E.prototype,"handleDisabledChange",1);import{customElement as Er}from"lit/decorators.js";import{html as qr,LitElement as Cr}from"lit";import{css as xr}from"lit";var $t=xr`
1
+ import{a as Dt}from"../chunk-IRTOORT6.js";import{a as b,b as C,c as n}from"../chunk-NYAUPIAG.js";import{provide as gr}from"@lit/context";import{LitElement as br,html as vr}from"lit";import{customElement as yr,property as K}from"lit/decorators.js";function x(c,i){let e=b({waitUntilFirstUpdate:!1},i);return(t,r)=>{let{update:s}=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),u=this[p];d!==u&&(!e.waitUntilFirstUpdate||this.hasUpdated)&&this[r](d,u)}}),s.call(this,a)}}}import{createContext as fr}from"@lit/context";var Ht=[{identifier:"completionStatus",cardinality:"single",baseType:"string",value:"unknown",type:"outcome"},{identifier:"numAttempts",cardinality:"single",baseType:"integer",value:"0",type:"response"}],R=fr("item");var q=class extends br{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:Ht};this._initialContext=C(b({},this._context),{variables:this._context.variables});this._feedbackElements=[];this._interactionElements=[];this.addEventListener("qti-register-variable",e=>{this._context=C(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=C(b({},this._context),{variables:this._context.variables.map(t=>{let r=e.find(s=>s.identifier===t.identifier);return r?b(b({},t),r):t})}),this._context.variables.forEach(t=>{if(t.type==="response"){let r=this._interactionElements.find(s=>s.responseIdentifier===t.identifier);r&&(r.response=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 s=this._interactionElements.find(o=>o.getAttribute("response-identifier")===t.responseIdentifier);s&&(s.response=t.response)}}render(){return vr`<slot></slot>`}showCorrectResponse(e){let r=this._context.variables.filter(s=>"correctResponse"in s&&s.correctResponse).map(s=>({responseIdentifier:s.identifier,response:s.correctResponse}));for(let s of r){let o=this._interactionElements.find(a=>a.getAttribute("response-identifier")===s.responseIdentifier);o&&(o.correctResponse=e?s.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(s=>s.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=C(b({},this._context),{variables:this._context.variables.map(r=>r.identifier!==e?r:C(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 s;let r=this.getOutcome(e);if(!r){console.warn(`Can not set qti-outcome-identifier: ${e}, it is not available`);return}this._context=C(b({},this._context),{variables:this._context.variables.map(o=>o.identifier!==e?o:C(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:(s=this._context.variables.find(o=>o.identifier===e))==null?void 0:s.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})],q.prototype,"title",2),n([K({type:String})],q.prototype,"identifier",2),n([K({type:String})],q.prototype,"adaptive",2),n([K({type:String})],q.prototype,"timeDependent",2),n([K({type:Boolean})],q.prototype,"disabled",2),n([x("disabled",{waitUntilFirstUpdate:!0})],q.prototype,"_handleDisabledChange",2),n([K({type:Boolean})],q.prototype,"readonly",2),n([x("readonly",{waitUntilFirstUpdate:!0})],q.prototype,"_handleReadonlyChange",2),n([gr({context:R})],q.prototype,"_context",2),q=n([yr("qti-assessment-item")],q);import{LitElement as xr}from"lit";import{customElement as Er,property as Nt}from"lit/decorators.js";var W=class extends xr{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 s=this.closest("qti-assessment-item").querySelector(`[data-stimulus-idref=${this.identifier}]`);s?await this.updateStimulusRef(s):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 Dt().load(this.href).then(s=>s.path(t).htmldoc());if(r){let s=r.querySelectorAll("qti-stimulus-body, qti-stylesheet");e.innerHTML="",e.append(...s)}}};n([Nt({type:String})],W.prototype,"identifier",2),n([Nt({type:String})],W.prototype,"href",2),W=n([Er("qti-assessment-stimulus-ref")],W);import{html as Cr}from"lit";import{property as Ae}from"lit/decorators.js";var Vt={toAttribute:c=>c?"true":"false",fromAttribute:c=>c==="true"};function M(c,i){class e extends c{constructor(...s){super(...s);this.identifier="";this.tabIndex=0;this.disabled=!1;this.readonly=!1;this._internals=this.attachInternals()}handleDisabledChange(s,o){this.tabIndex=o?-1:0,o&&this.blur()}setInternalState(s,o){o&&!this._internals.states.has(s)?this._internals.states.add(s):!o&&this._internals.states.has(s)&&this._internals.states.delete(s)}connectedCallback(){super.connectedCallback(),this.addEventListener("keyup",this._onKeyUp),this.addEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent(`register-${i}`,{bubbles:!0,composed:!0}))}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("keyup",this._onKeyUp),this.removeEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent(`unregister-${i}`,{bubbles:!0,composed:!0}))}_onKeyUp(s){s.altKey||s.code==="Space"&&(s.preventDefault(),this._activate())}_onClick(){this.disabled||this.readonly||(this.focus(),this._activate())}_activate(){this.disabled||this.readonly||this.dispatchEvent(new CustomEvent(`activate-${i}`,{bubbles:!0,composed:!0,detail:{identifier:this.identifier}}))}render(){return Cr`<slot></slot>`}}return n([Ae({type:String})],e.prototype,"identifier",2),n([Ae({type:Number,reflect:!0,attribute:"tabindex"})],e.prototype,"tabIndex",2),n([Ae({type:Boolean,reflect:!0,attribute:"aria-disabled",converter:Vt})],e.prototype,"disabled",2),n([Ae({type:Boolean,reflect:!0,attribute:"aria-readonly",converter:Vt})],e.prototype,"readonly",2),n([x("disabled",{waitUntilFirstUpdate:!0})],e.prototype,"handleDisabledChange",1),e}import{customElement as Tr}from"lit/decorators.js";import{html as wr,LitElement as Sr}from"lit";import{css as qr}from"lit";var $t=qr`
2
2
  :host {
3
3
  display: block;
4
4
  }
5
- `;var J=class extends Cr{render(){return qr`<slot name="qti-rubric-block"></slot><slot></slot>`}};J.styles=$t,J=i([Er("qti-item-body")],J);import{html as _r,LitElement as kr}from"lit";import{customElement as Tr}from"lit/decorators.js";var Le=class extends kr{render(){return _r`<slot></slot>`}connectedCallback(){this.parentElement.tagName.endsWith("INTERACTION")&&this.setAttribute("slot","prompt")}};Le=i([Tr("qti-prompt")],Le);import{LitElement as wr}from"lit";import{customElement as Rr}from"lit/decorators.js";var Me=class extends wr{firstUpdated(s){super.firstUpdated(s);let e=this,t=this.getAttribute("href");if(t!==null){let r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.media="screen",r.href=t,e.appendChild(r),this.styleLink=r}if(this.textContent!==null){let r=document.createElement("style");r.media="screen",r.textContent=this.textContent,e.appendChild(r),this.styleLink=r}}disconnectedCallback(){if(this.styleLink)try{this.styleLink.remove()}catch(s){console.log("could not remove stylesheet")}}};Me=i([Rr("qti-stylesheet")],Me);import{consume as Mr}from"@lit/context";import{css as Nr,html as Hr}from"lit";import{customElement as Vr,property as Ne,state as $r}from"lit/decorators.js";import{html as Ar,LitElement as Sr}from"lit";import{customElement as Lr}from"lit/decorators.js";var P=class extends Sr{render(){return Ar`<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);return t.length>1||s.cardinality==="multiple"||s.cardinality==="ordered"?t:t[0]}};P=i([Lr("qti-variabledeclaration")],P);var S=class extends P{constructor(){super(...arguments);this.externalScored=null}render(){var t,r;let e=(r=(t=this.itemContext)==null?void 0:t.variables.find(o=>o.identifier===this.identifier))==null?void 0:r.value;return Hr`${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 o=parseInt(r.getAttribute("source-value")),n=parseInt(r.getAttribute("target-value"));(isNaN(o)||isNaN(n))&&console.error("source-value or target-value is not a number in qti-interpolation-table-entry"),t.set(o,n)}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}}))}};S.styles=[Nr`
5
+ `;var Z=class extends Sr{render(){return wr`<slot name="qti-rubric-block"></slot><slot></slot>`}};Z.styles=$t,Z=n([Tr("qti-item-body")],Z);import{html as kr,LitElement as Lr}from"lit";import{customElement as Rr}from"lit/decorators.js";var _e=class extends Lr{render(){return kr`<slot></slot>`}connectedCallback(){this.parentElement.tagName.endsWith("INTERACTION")&&this.setAttribute("slot","prompt")}};_e=n([Rr("qti-prompt")],_e);import{LitElement as Mr}from"lit";import{customElement as Ar}from"lit/decorators.js";var De=class extends Mr{firstUpdated(i){super.firstUpdated(i);let e=this,t=this.getAttribute("href");if(t!==null){let r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.media="screen",r.href=t,e.appendChild(r),this.styleLink=r}if(this.textContent!==null){let r=document.createElement("style");r.media="screen",r.textContent=this.textContent,e.appendChild(r),this.styleLink=r}}disconnectedCallback(){if(this.styleLink)try{this.styleLink.remove()}catch(i){console.log("could not remove stylesheet")}}};De=n([Ar("qti-stylesheet")],De);import{consume as Nr}from"@lit/context";import{css as Vr,html as $r}from"lit";import{customElement as Pr,property as He,state as Ir}from"lit/decorators.js";import{html as _r,LitElement as Dr}from"lit";import{customElement as Hr}from"lit/decorators.js";var O=class extends Dr{render(){return _r`<slot></slot>`}defaultValues(i){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||i.cardinality==="multiple"||i.cardinality==="ordered"?t:t[0]}};O=n([Hr("qti-variabledeclaration")],O);var A=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(s=>s.identifier===this.identifier))==null?void 0:r.value;return $r`${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 s=parseInt(r.getAttribute("source-value")),o=parseInt(r.getAttribute("target-value"));(isNaN(s)||isNaN(o))&&console.error("source-value or target-value is not a number in qti-interpolation-table-entry"),t.set(s,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}}))}};A.styles=[Vr`
6
6
  :host {
7
7
  display: none;
8
8
  }
9
- `],i([Ne({type:String,attribute:"base-type"})],S.prototype,"baseType",2),i([Ne({type:String,attribute:"external-scored"})],S.prototype,"externalScored",2),i([Ne({type:String})],S.prototype,"identifier",2),i([Ne({type:String})],S.prototype,"cardinality",2),i([Mr({context:A,subscribe:!0}),$r()],S.prototype,"itemContext",2),S=i([Vr("qti-outcome-declaration")],S);import{consume as Dr}from"@lit/context";import{css as Or,html as Pr}from"lit";import{customElement as Ir,property as Ge,state as Ur}from"lit/decorators.js";var D=class extends P{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 Pr`${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")}};D.styles=[Or`
9
+ `],n([He({type:String,attribute:"base-type"})],A.prototype,"baseType",2),n([He({type:String,attribute:"external-scored"})],A.prototype,"externalScored",2),n([He({type:String})],A.prototype,"identifier",2),n([He({type:String})],A.prototype,"cardinality",2),n([Nr({context:R,subscribe:!0}),Ir()],A.prototype,"itemContext",2),A=n([Pr("qti-outcome-declaration")],A);import{consume as Or}from"@lit/context";import{css as Ur,html as Fr}from"lit";import{customElement as Br,property as Ge,state as Xr}from"lit/decorators.js";var P=class extends O{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 Fr`${JSON.stringify(i,null,2)}`}connectedCallback(){super.connectedCallback();let i={baseType:this.baseType,identifier:this.identifier,correctResponse:this.correctResponse,cardinality:this.cardinality||"single",mapping:this.mapping,value:null,type:"response",candidateResponse:null};i.value=this.defaultValues(i),this.dispatchEvent(new CustomEvent("qti-register-variable",{bubbles:!0,composed:!0,detail:{variable:i}}))}get correctResponse(){let i,e=this.querySelector("qti-correct-response");if(e){let t=e.querySelectorAll("qti-value");if(this.cardinality==="single"&&t.length>0)i=t[0].textContent,t[0].remove();else if(this.cardinality!=="single"){i=[];for(let r=0;r<t.length;r++)i.push(t[r].textContent),t[r].remove()}}return i}get mapping(){return this.querySelector("qti-mapping")}};P.styles=[Ur`
10
10
  :host {
11
11
  display: none;
12
12
  }
13
- `],i([Ge({type:String,attribute:"base-type"})],D.prototype,"baseType",2),i([Ge({type:String})],D.prototype,"identifier",2),i([Ge({type:String})],D.prototype,"cardinality",2),i([Dr({context:A,subscribe:!0}),Ur()],D.prototype,"itemContext",2),D=i([Ir("qti-response-declaration")],D);import{LitElement as Fr}from"lit";import{customElement as Br}from"lit/decorators.js";var He=class extends Fr{};He=i([Br("qti-companion-materials-info")],He);import{LitElement as Xr,html as Yr}from"lit";import{customElement as jr}from"lit/decorators.js";var Ve=class extends Xr{render(){return Yr`<slot></slot>`}};Ve=i([jr("qti-content-body")],Ve);import{LitElement as Kr,css as Wr,html as zr}from"lit";import{customElement as Jr,property as $e}from"lit/decorators.js";var L=class extends Kr{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 zr`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-rubric-block")}};L.styles=Wr`
13
+ `],n([Ge({type:String,attribute:"base-type"})],P.prototype,"baseType",2),n([Ge({type:String})],P.prototype,"identifier",2),n([Ge({type:String})],P.prototype,"cardinality",2),n([Or({context:R,subscribe:!0}),Xr()],P.prototype,"itemContext",2),P=n([Br("qti-response-declaration")],P);import{LitElement as Yr}from"lit";import{customElement as jr}from"lit/decorators.js";var Ne=class extends Yr{};Ne=n([jr("qti-companion-materials-info")],Ne);import{LitElement as zr,html as Kr}from"lit";import{customElement as Wr}from"lit/decorators.js";var Ve=class extends zr{render(){return Kr`<slot></slot>`}};Ve=n([Wr("qti-content-body")],Ve);import{LitElement as Zr,css as Jr,html as Gr}from"lit";import{customElement as Qr,property as $e}from"lit/decorators.js";var _=class extends Zr{handleclassNamesChange(i,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 Gr`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-rubric-block")}};_.styles=Jr`
14
14
  :host {
15
15
  display: block;
16
16
  }
17
- `,i([$e({type:String})],L.prototype,"id",2),i([$e({type:String})],L.prototype,"use",2),i([$e({type:String})],L.prototype,"view",2),i([$e({type:String,attribute:"class"})],L.prototype,"classNames",2),i([v("classNames",{waitUntilFirstUpdate:!0})],L.prototype,"handleclassNamesChange",1),L=i([Jr("qti-rubric-block")],L);import{css as Qr,html as es}from"lit";import{customElement as ts}from"lit/decorators.js";import{LitElement as Gr}from"lit";import{property as De}from"lit/decorators.js";var Zr=()=>new Intl.NumberFormat().format(.1).replace(/\d/g,""),pe=c=>{if(typeof c=="string")return c;let s=Zr();return s==="."?c.toLocaleString():c.toString().replace(".","").replace(s,".")};function Qe(c){return c==null}function de(c){return c.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}var k=class extends Gr{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-feedback",{bubbles:!0,composed:!0,detail:this}))}checkShowFeedback(s){let e=this.closest("qti-assessment-item").getOutcome(s);if(this.outcomeIdentifier!==s||!e)return;let t=!1;Array.isArray(e.value)?t=e.value.includes(this.identifier):t=!Qe(this.identifier)&&!Qe(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"}};i([De({type:String,attribute:"show-hide"})],k.prototype,"showHide",2),i([De({type:String,attribute:"outcome-identifier"})],k.prototype,"outcomeIdentifier",2),i([De({type:String})],k.prototype,"identifier",2),i([De({type:String,attribute:!1})],k.prototype,"showStatus",2);var ue=class extends k{render(){return es` <slot part="feedback" class="feedback ${this.showStatus}"></slot> `}firstUpdated(s){this.checkShowFeedback(this.outcomeIdentifier)}};ue.styles=Qr`
17
+ `,n([$e({type:String})],_.prototype,"id",2),n([$e({type:String})],_.prototype,"use",2),n([$e({type:String})],_.prototype,"view",2),n([$e({type:String,attribute:"class"})],_.prototype,"classNames",2),n([x("classNames",{waitUntilFirstUpdate:!0})],_.prototype,"handleclassNamesChange",1),_=n([Qr("qti-rubric-block")],_);import{css as ri,html as ii}from"lit";import{customElement as si}from"lit/decorators.js";import{LitElement as ti}from"lit";import{property as Pe}from"lit/decorators.js";var ei=()=>new Intl.NumberFormat().format(.1).replace(/\d/g,""),ce=c=>{if(typeof c=="string")return c;let i=ei();return i==="."?c.toLocaleString():c.toString().replace(".","").replace(i,".")};function Qe(c){return c==null}function pe(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(i){let e=this.closest("qti-assessment-item").getOutcome(i);if(this.outcomeIdentifier!==i||!e)return;let t=!1;Array.isArray(e.value)?t=e.value.includes(this.identifier):t=!Qe(this.identifier)&&!Qe(e==null?void 0:e.value)&&this.identifier===e.value||!1,this.showFeedback(t)}showFeedback(i){this.showStatus=i&&this.showHide==="show"||!i&&this.showHide==="hide"?"on":"off"}};n([Pe({type:String,attribute:"show-hide"})],T.prototype,"showHide",2),n([Pe({type:String,attribute:"outcome-identifier"})],T.prototype,"outcomeIdentifier",2),n([Pe({type:String})],T.prototype,"identifier",2),n([Pe({type:String,attribute:!1})],T.prototype,"showStatus",2);var de=class extends T{render(){return ii` <slot part="feedback" class="feedback ${this.showStatus}"></slot> `}firstUpdated(i){this.checkShowFeedback(this.outcomeIdentifier)}};de.styles=ri`
18
18
  :host {
19
19
  display: block;
20
20
  }
@@ -24,21 +24,21 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
24
24
  .off {
25
25
  display: none;
26
26
  }
27
- `,ue=i([ts("qti-feedback-block")],ue);import{css as rs,html as ss}from"lit";import{customElement as is}from"lit/decorators.js";var me=class extends k{constructor(){super(...arguments);this.render=()=>ss` <slot part="feedback" class="${this.showStatus}"></slot> `}};me.styles=rs`
27
+ `,de=n([si("qti-feedback-block")],de);import{css as oi,html as ni}from"lit";import{customElement as ai}from"lit/decorators.js";var ue=class extends T{constructor(){super(...arguments);this.render=()=>ni` <slot part="feedback" class="${this.showStatus}"></slot> `}};ue.styles=oi`
28
28
  .on {
29
29
  display: inline-block;
30
30
  }
31
31
  .off {
32
32
  display: none;
33
33
  }
34
- `,me=i([is("qti-feedback-inline")],me);import{css as os,html as ns}from"lit";import{customElement as as}from"lit/decorators.js";var he=class extends k{constructor(){super(...arguments);this.render=()=>ns` <slot part="feedback" class="${this.showStatus}"></slot> `}};he.styles=os`
34
+ `,ue=n([ai("qti-feedback-inline")],ue);import{css as li,html as ci}from"lit";import{customElement as pi}from"lit/decorators.js";var me=class extends T{constructor(){super(...arguments);this.render=()=>ci` <slot part="feedback" class="${this.showStatus}"></slot> `}};me.styles=li`
35
35
  .on {
36
36
  display: inline-block;
37
37
  }
38
38
  .off {
39
39
  display: none;
40
40
  }
41
- `,he=i([as("qti-modal-feedback")],he);import{css as cs,html as ps}from"lit";import{ifDefined as tt}from"lit/directives/if-defined.js";import{property as et}from"lit/decorators.js";import{LitElement as ls}from"lit";var g=class extends ls{constructor(){super(...arguments);this.responseIdentifier="";this.disabled=!1;this.readonly=!1}set correctResponse(e){console.warn("correctResponse is not implemented")}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}}))}};i([et({attribute:"response-identifier"})],g.prototype,"responseIdentifier",2),i([et({reflect:!0,type:Boolean})],g.prototype,"disabled",2),i([et({reflect:!0,type:Boolean})],g.prototype,"readonly",2);import{ref as ds,createRef as us}from"lit/directives/ref.js";import{customElement as ms,property as Oe,state as hs}from"lit/decorators.js";var M=class extends g{constructor(){super(...arguments);this.textareaRef=us();this._value=""}handleclassNamesChange(e,t){this.classNames.split(" ").forEach(o=>{if(o.startsWith("qti-height-lines")){let n=o.replace("qti-height-lines-","");this.textareaRef&&(this.textareaRef.value.rows=parseInt(n))}})}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}static get styles(){return[cs`
41
+ `,me=n([pi("qti-modal-feedback")],me);import{css as ui,html as mi}from"lit";import{ifDefined as tt}from"lit/directives/if-defined.js";import{property as et}from"lit/decorators.js";import{LitElement as di}from"lit";var f=class extends di{constructor(){super(...arguments);this.responseIdentifier="";this.disabled=!1;this.readonly=!1}set correctResponse(e){console.warn("correctResponse is not implemented")}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}}))}};n([et({attribute:"response-identifier"})],f.prototype,"responseIdentifier",2),n([et({reflect:!0,type:Boolean})],f.prototype,"disabled",2),n([et({reflect:!0,type:Boolean})],f.prototype,"readonly",2);import{customElement as hi,property as Ie,state as Pt}from"lit/decorators.js";var k=class extends f{constructor(){super(...arguments);this._rows=5;this._value=""}handleclassNamesChange(e,t){t.split(" ").forEach(s=>{if(s.startsWith("qti-height-lines-")){let o=s.replace("qti-height-lines-","");this._rows=parseInt(o)}})}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}static get styles(){return[ui`
42
42
  /* PK: display host as block, else design will be collapsed */
43
43
  :host {
44
44
  display: block;
@@ -49,10 +49,9 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
49
49
  height: 100%;
50
50
  border: 0;
51
51
  }
52
- `]}render(){return ps`<slot name="prompt"></slot
52
+ `]}render(){return mi`<slot name="prompt"></slot
53
53
  ><textarea
54
54
  part="textarea"
55
- ${ds(this.textareaRef)}
56
55
  spellcheck="false"
57
56
  autocomplete="off"
58
57
  @keydown="${e=>e.stopImmediatePropagation()}"
@@ -62,15 +61,93 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
62
61
  placeholder="${tt(this.placeholderText?this.placeholderText:void 0)}"
63
62
  maxlength="${tt(this.expectedLength?this.expectedLength:void 0)}"
64
63
  pattern="${tt(this.patternMask?this.patternMask:void 0)}"
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;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};i([Oe({type:Number,attribute:"expected-length"})],M.prototype,"expectedLength",2),i([Oe({type:String,attribute:"pattern-mask"})],M.prototype,"patternMask",2),i([Oe({type:String,attribute:"placeholder-text"})],M.prototype,"placeholderText",2),i([hs()],M.prototype,"_value",2),i([Oe({type:String,attribute:"class"})],M.prototype,"classNames",2),i([v("classNames",{waitUntilFirstUpdate:!0})],M.prototype,"handleclassNamesChange",1),M=i([ms("qti-extended-text-interaction")],M);import{css as fs,html as gs}from"lit";import{customElement as bs,property as Pe,state as rt}from"lit/decorators.js";import{ifDefined as Ot}from"lit/directives/if-defined.js";import{createRef as vs}from"lit/directives/ref.js";function Dt(c,s){let e,t=b({},s);return(r,o)=>{let{connectedCallback:n,disconnectedCallback:a}=r;r.connectedCallback=function(){var d;n.call(this);let l=h=>{let m=Array.from(this.querySelectorAll(c));for(let f of h){let _=Array.from(f.addedNodes).map(j=>j),y=Array.from(f.addedNodes).map(j=>j);f.type==="childList"&&_.find(j=>m.includes(j))&&this[o](_,y)}};e=new MutationObserver(l),e.observe(this,{childList:!0,subtree:!0});let p=(d=this.querySelectorAll(c))!=null?d:[];this[o](Array.from(p),[])},r.disconnectedCallback=function(){a.call(this),e.disconnect()}}}var T=class extends g{constructor(){super(...arguments);this._value="";this._correctValue="";this._size=5;this.inputRef=vs()}handleclassNamesChange(e,t){t.split(" ").forEach(o=>{if(o.startsWith("qti-input-width")){let n=o.replace("qti-input-width-","");this._size=parseInt(n)}})}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}static get styles(){return[fs`
69
- [part='correct'] {
70
- position: absolute;
71
- width: 100%;
72
- }
73
- `]}set correctResponse(e){this._correctValue=e}render(){return gs`
68
+ ></textarea>`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};n([Pt()],k.prototype,"_rows",2),n([Ie({type:Number,attribute:"expected-length"})],k.prototype,"expectedLength",2),n([Ie({type:String,attribute:"pattern-mask"})],k.prototype,"patternMask",2),n([Ie({type:String,attribute:"placeholder-text"})],k.prototype,"placeholderText",2),n([Pt()],k.prototype,"_value",2),n([Ie({type:String,attribute:"class"})],k.prototype,"classNames",2),n([x("classNames")],k.prototype,"handleclassNamesChange",1),k=n([hi("qti-extended-text-interaction")],k);import{html as gi}from"lit";import{customElement as bi,property as rt,state as it}from"lit/decorators.js";import{ifDefined as Ot}from"lit/directives/if-defined.js";import{createRef as vi}from"lit/directives/ref.js";import{css as fi}from"lit";var It=fi`
69
+ :host {
70
+ display: inline-block;
71
+ }
72
+ [part='correct'] {
73
+ position: absolute;
74
+ width: 100%;
75
+ }
76
+ :host(.qti-input-width-1) [part='input'] {
77
+ width: 1.1rem;
78
+ min-width: 1.1rem;
79
+ }
80
+
81
+ :host(.qti-input-width-2) [part='input'] {
82
+ width: 2.3rem;
83
+ min-width: 2.3rem;
84
+ }
85
+
86
+ :host(.qti-input-width-3) [part='input'] {
87
+ width: 3.3rem;
88
+ min-width: 3.3rem;
89
+ }
90
+
91
+ :host(.qti-input-width-4) [part='input'] {
92
+ width: 4.2rem;
93
+ min-width: 4.2rem;
94
+ }
95
+
96
+ :host(.qti-input-width-6) [part='input'] {
97
+ width: 6.6rem;
98
+ min-width: 6.6rem;
99
+ }
100
+
101
+ :host(.qti-input-width-10) [part='input'] {
102
+ width: 8rem;
103
+ min-width: 8rem;
104
+ }
105
+
106
+ :host(.qti-input-width-15) [part='input'] {
107
+ width: 12rem;
108
+ min-width: 12rem;
109
+ }
110
+
111
+ :host(.qti-input-width-20) [part='input'] {
112
+ width: 17rem;
113
+ min-width: 17rem;
114
+ }
115
+
116
+ :host(.qti-input-width-25) [part='input'] {
117
+ width: 20rem;
118
+ min-width: 20rem;
119
+ }
120
+
121
+ :host(.qti-input-width-30) [part='input'] {
122
+ width: 24rem;
123
+ min-width: 24rem;
124
+ }
125
+
126
+ :host(.qti-input-width-35) [part='input'] {
127
+ width: 28rem;
128
+ min-width: 28rem;
129
+ }
130
+
131
+ :host(.qti-input-width-40) [part='input'] {
132
+ width: 32rem;
133
+ min-width: 32rem;
134
+ }
135
+
136
+ :host(.qti-input-width-45) [part='input'] {
137
+ width: 36rem;
138
+ min-width: 36rem;
139
+ }
140
+
141
+ :host(.qti-input-width-50) [part='input'] {
142
+ width: 40rem;
143
+ min-width: 40rem;
144
+ }
145
+
146
+ :host(.qti-input-width-72) [part='input'] {
147
+ width: 57rem;
148
+ min-width: 57rem;
149
+ }
150
+ `;var L=class extends f{constructor(){super(...arguments);this._value="";this._correctValue="";this._size=5;this.inputRef=vi()}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}set correctResponse(e){this._correctValue=e}render(){return gi`
74
151
  <input
75
152
  part="input"
76
153
  spellcheck="false"
@@ -82,13 +159,12 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
82
159
  type="${this.patternMask=="[0-9]*"?"number":"text"}"
83
160
  placeholder="${Ot(this.placeholderText?this.placeholderText:void 0)}"
84
161
  .value="${this._value}"
85
- size="${this._size}"
86
162
  pattern="${Ot(this.patternMask?this.patternMask:void 0)}"
87
163
  ?disabled="${this.disabled}"
88
164
  ?readonly="${this.readonly}"
89
165
  />
90
166
  <div part="correct">${this._correctValue}</div>
91
- `}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};i([Pe({type:Number,attribute:"expected-length"})],T.prototype,"expectedLength",2),i([Pe({type:String,attribute:"pattern-mask"})],T.prototype,"patternMask",2),i([Pe({type:String,attribute:"placeholder-text"})],T.prototype,"placeholderText",2),i([rt()],T.prototype,"_value",2),i([rt()],T.prototype,"_correctValue",2),i([rt()],T.prototype,"_size",2),i([Pe({type:String,attribute:"class"})],T.prototype,"classNames",2),i([v("classNames")],T.prototype,"handleclassNamesChange",1),T=i([bs("qti-text-entry-interaction")],T);import{html as ys,LitElement as xs}from"lit";import{customElement as Es}from"lit/decorators.js";import{property as st}from"lit/decorators.js";var I=(c,s)=>{class e extends c{constructor(...o){super(...o);this._choiceElements=[];this.responseIdentifier="";this.minChoices=0;this.maxChoices=1;this._handleDisabledChange=(o,n)=>this._choiceElements.forEach(a=>a.disabled=n);this._handleReadonlyChange=(o,n)=>this._choiceElements.forEach(a=>a.readonly=n);this._handleMaxChoicesChange=()=>this._determineInputType();this.addEventListener("qti-register-choice",this._registerChoiceElement),this.addEventListener("qti-loose-choice",this._looseChoiceElement)}validate(){return this._choiceElements.reduce((n,a)=>n+(a.checked?1:0),0)>=this.minChoices}set response(o){let n=Array.isArray(o)?o:[o];this._choiceElements.forEach(a=>{a.checked=!!n.find(l=>l===a.identifier)})}set correctResponse(o){let n=Array.isArray(o)?o:[o];if(o==""){this._choiceElements.forEach(a=>{a.removeAttribute("data-correct-response")});return}this._choiceElements.forEach(a=>{a.setAttribute("data-correct-response",n.find(l=>l===a.identifier)?"true":"false")})}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-choice",this._registerChoiceElement),this.addEventListener("qti-choice-element-selected",this._choiceElementSelectedHandler),this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,cancelable:!1,composed:!0}))}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-choice-element-selected",this._choiceElementSelectedHandler),this.removeEventListener("qti-register-choice",this._registerChoiceElement)}_registerChoiceElement(o){o.stopPropagation();let n=o.target;this._choiceElements.push(n),this._setInputType(n)}_looseChoiceElement(o){o.stopPropagation();let n=o.target;this._choiceElements.push(n),this._choiceElements=this._choiceElements.filter(a=>a!==n)}_determineInputType(){this._choiceElements.forEach(o=>{this._setInputType(o)})}_setInputType(o){this.maxChoices===1?o.setAttribute("role","radio"):o.setAttribute("role","checkbox")}_choiceElementSelectedHandler(o){this.maxChoices===1&&this._choiceElements.filter(n=>n.identifier!==o.detail.identifier).forEach(n=>{n.checked=!1}),this._choiceElementSelected()}_choiceElementSelected(){let o=this._choiceElements.filter(a=>a.checked).map(a=>a.identifier);this.maxChoices>1&&(this.maxChoices===o.length?this._choiceElements.forEach(a=>a.disabled=!a.checked):this._choiceElements.forEach(a=>a.disabled=!1));let n;this.maxChoices===1?n=o.length>0?o[0]:void 0:n=o,this.saveResponse(n)}saveResponse(o){this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:o}}))}}return i([st({attribute:"response-identifier"})],e.prototype,"responseIdentifier",2),i([st({type:Number,attribute:"min-choices"})],e.prototype,"minChoices",2),i([st({type:Number,attribute:"max-choices"})],e.prototype,"maxChoices",2),i([v("disabled",{waitUntilFirstUpdate:!0})],e.prototype,"_handleDisabledChange",2),i([v("readonly",{waitUntilFirstUpdate:!0})],e.prototype,"_handleReadonlyChange",2),i([v("maxChoices",{waitUntilFirstUpdate:!0})],e.prototype,"_handleMaxChoicesChange",2),e};var Ie=class extends I(xs,"qti-hottext"){constructor(){super(...arguments);this.render=()=>ys`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("qti-hottext-interaction","")}};Ie=i([Es("qti-hottext-interaction")],Ie);import{css as qs,html as Pt}from"lit";import{customElement as Cs,property as _s,state as It}from"lit/decorators.js";import{unsafeHTML as Ut}from"lit/directives/unsafe-html.js";var U=class extends g{constructor(){super(...arguments);this.options=[];this.correctOption="";this.dataPrompt="select"}static get styles(){return[qs`
167
+ `}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};L.styles=It,n([rt({type:Number,attribute:"expected-length"})],L.prototype,"expectedLength",2),n([rt({type:String,attribute:"pattern-mask"})],L.prototype,"patternMask",2),n([rt({type:String,attribute:"placeholder-text"})],L.prototype,"placeholderText",2),n([it()],L.prototype,"_value",2),n([it()],L.prototype,"_correctValue",2),n([it()],L.prototype,"_size",2),L=n([bi("qti-text-entry-interaction")],L);import{html as yi,LitElement as xi}from"lit";import{customElement as Ei}from"lit/decorators.js";import{property as he}from"lit/decorators.js";var U=(c,i)=>{class e extends c{constructor(){super(...arguments);this._choiceElements=[];this.responseIdentifier="";this.minChoices=0;this.maxChoices=1;this.disabled=!1;this._handleDisabledChange=(s,o)=>{this._choiceElements.forEach(a=>a.disabled=o)};this.readonly=!1;this._handleReadonlyChange=(s,o)=>{this._choiceElements.forEach(a=>a.readonly=o)}}_handleMaxChoicesChange(s,o){this._determineInputType()}validate(){let s=this._choiceElements.filter(o=>this._getChoiceChecked(o)).length;return this.maxChoices!==0&&s>this.maxChoices?!1:s>=this.minChoices}set response(s){let o=Array.isArray(s)?s:[s];this._choiceElements.forEach(a=>{this._setChoiceChecked(a,o.includes(a.identifier))})}set correctResponse(s){let o=Array.isArray(s)?s:[s];if(o.length===0){this._choiceElements.forEach(a=>{a.removeAttribute("data-correct-response")});return}this._choiceElements.forEach(a=>{a.setAttribute("data-correct-response",o.includes(a.identifier)?"true":"false")})}connectedCallback(){super.connectedCallback(),this.addEventListener(`register-${i}`,this._registerChoiceElement),this.addEventListener(`unregister-${i}`,this._unregisterChoiceElement),this.addEventListener(`activate-${i}`,this._choiceElementSelectedHandler),this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0}))}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`register-${i}`,this._registerChoiceElement),this.removeEventListener(`unregister-${i}`,this._unregisterChoiceElement),this.removeEventListener(`activate-${i}`,this._choiceElementSelectedHandler)}_registerChoiceElement(s){s.stopPropagation();let o=s.target;o.disabled=this.disabled,this._choiceElements.push(o),this._setInputType(o)}_unregisterChoiceElement(s){s.stopPropagation();let o=s.target;this._choiceElements=this._choiceElements.filter(a=>a!==o)}_determineInputType(){this._choiceElements.forEach(s=>{this._setInputType(s)})}_setInputType(s){s.setAttribute("role",this.maxChoices===1?"radio":"checkbox")}_choiceElementSelectedHandler(s){this._toggleChoiceChecked(s.target),this.maxChoices===1&&this._choiceElements.forEach(o=>{o.identifier!==s.detail.identifier&&this._setChoiceChecked(o,!1)}),this._handleChoiceSelection()}_setChoiceChecked(s,o){s.setAttribute("aria-checked",o.toString())}_getChoiceChecked(s){return s.getAttribute("aria-checked")==="true"}_toggleChoiceChecked(s){let o=this._getChoiceChecked(s);this._setChoiceChecked(s,!o)}_handleChoiceSelection(){let s=this._choiceElements.filter(l=>this._getChoiceChecked(l)),o=s.map(l=>l.identifier);if(this.maxChoices>1&&this.maxChoices!==0){let l=s.length>=this.maxChoices;this._choiceElements.forEach(p=>{this._getChoiceChecked(p)||(p.disabled=l)})}let a=this.maxChoices===1?o[0]||void 0:o;this._saveResponse(a)}_saveResponse(s){this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:s}}))}}return n([he({attribute:"response-identifier"})],e.prototype,"responseIdentifier",2),n([he({type:Number,attribute:"min-choices"})],e.prototype,"minChoices",2),n([he({type:Number,attribute:"max-choices"})],e.prototype,"maxChoices",2),n([x("maxChoices",{waitUntilFirstUpdate:!0})],e.prototype,"_handleMaxChoicesChange",1),n([he({reflect:!0,type:Boolean})],e.prototype,"disabled",2),n([x("disabled",{waitUntilFirstUpdate:!0})],e.prototype,"_handleDisabledChange",2),n([he({reflect:!0,type:Boolean})],e.prototype,"readonly",2),n([x("readonly",{waitUntilFirstUpdate:!0})],e.prototype,"_handleReadonlyChange",2),e};var Oe=class extends U(xi,"qti-hottext"){constructor(){super(...arguments);this.render=()=>yi`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("qti-hottext-interaction","")}};Oe=n([Ei("qti-hottext-interaction")],Oe);import{css as Ci,html as Ut}from"lit";import{customElement as qi,property as Ti,state as Ft}from"lit/decorators.js";import{unsafeHTML as Bt}from"lit/directives/unsafe-html.js";var F=class extends f{constructor(){super(...arguments);this.options=[];this.correctOption="";this.dataPrompt="select"}static get styles(){return[Ci`
92
168
  :host {
93
169
  display: inline-block;
94
170
  }
@@ -110,25 +186,56 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
110
186
  /* position-anchor: --infobox; */
111
187
  /* top: anchor(bottom); */
112
188
  }
113
- `]}render(){return Pt`
189
+ `]}render(){return Ut`
114
190
  <select part="select" @change="${this.choiceSelected}" ?disabled="${this.disabled}" ?readonly="${this.readonly}">
115
- ${this.options.map(e=>Pt`
116
- <option value="${e.value}" ?selected="${e.selected}">${Ut(e.textContent)}</option>
191
+ ${this.options.map(e=>Ut`
192
+ <option value="${e.value}" ?selected="${e.selected}">${Bt(e.textContent)}</option>
117
193
  `)}
118
194
  </select>
119
195
 
120
- ${Ut(this.correctOption)}
121
- `}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 response(e){this.options=this.options.map(t=>(e===t.value&&(t.selected=!0),t))}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)}};U.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"],i([It()],U.prototype,"options",2),i([It()],U.prototype,"correctOption",2),i([_s({attribute:"data-prompt",type:String})],U.prototype,"dataPrompt",2),U=i([Cs("qti-inline-choice-interaction")],U);import{html as As,LitElement as Ss}from"lit";import{customElement as Ls,property as Ms}from"lit/decorators.js";import{property as ks}from"lit/decorators.js";var Ue=(c,s)=>{class e extends c{constructor(){super(...arguments);this._shuffle=!1}set shuffle(o){let n=this._shuffle;this._shuffle=o,o?this._shuffleChoices():this._resetShuffleChoices(),this.requestUpdate("shuffle",n)}get shuffle(){return this._shuffle}connectedCallback(){super.connectedCallback(),this.shuffle?this._shuffleChoices():this._resetShuffleChoices()}_shuffleChoices(){let o=Array.from(this.querySelectorAll(s)),n=[],a=[];if(o.forEach((m,f)=>{m.hasAttribute("fixed")?n.push({element:m,index:f}):a.push(m)}),a.length<=1)throw new Error("Shuffling is not possible with fewer than 2 non-fixed elements.");let l=!1,p=10,d=0;for(;!l&&d<p;){d++;for(let m=a.length-1;m>0;m--){let f=Math.floor(Math.random()*(m+1));[a[m],a[f]]=[a[f],a[m]]}if(l=a.some((m,f)=>o.indexOf(m)!==f),l)break}if(!l)throw new Error("Failed to shuffle the choices after multiple attempts.");let h=1;o.forEach((m,f)=>{m.hasAttribute("fixed")?m.style.setProperty("order",String(h++)):a.shift().style.setProperty("order",String(h++))})}_resetShuffleChoices(){Array.from(this.querySelectorAll("qti-simple-choice")).forEach((n,a)=>{n.style.setProperty("order","initial")})}}return i([ks({type:String,reflect:!0,converter:Ts})],e.prototype,"shuffle",1),e},Ts={fromAttribute(c){return c==="true"},toAttribute(c){return c?"true":"false"}};import{property as ws}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(o){o&&(this._classes=o.split(" "),this._addLabels())}get class(){var o;return((o=this._classes)==null?void 0:o.join(" "))||""}updated(o){super.updated(o),o.has("shuffle")&&this._addLabels()}_addLabels(){let o=this._classes.some(a=>this._allLabels.includes(a)||this._allLabelSuffixes.includes(a)),n=a=>!isNaN(+a);if(o){let l=Array.from(this.querySelectorAll("qti-simple-choice")).map(p=>p).map((p,d)=>({el:p,order:n(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(o){let n=this._classes.filter(p=>this._allLabels.includes(p)).pop(),a=this._classes.filter(p=>this._allLabelSuffixes.includes(p)).pop();!n&&a&&(n="qti-labels-upper-alpha");let l="";switch(n){case"qti-labels-decimal":l=`${o}`;break;case"qti-labels-lower-alpha":l=`${String.fromCharCode(97+o-1)}`;break;case"qti-labels-upper-alpha":l=`${String.fromCharCode(65+o-1)}`;break}return a==="qti-labels-suffix-period"?l+=".":a==="qti-labels-suffix-parenthesis"&&(l+=")"),l}}return i([ws({type:String,reflect:!0})],e.prototype,"class",1),e};import{css as Rs}from"lit";var Bt=Rs`
122
- :host {
196
+ ${Bt(this.correctOption)}
197
+ `}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)=>C(b({},e),{selected:t===0}))}set response(e){this.options=this.options.map(t=>(e===t.value&&(t.selected=!0),t))}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=>C(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([Ft()],F.prototype,"options",2),n([Ft()],F.prototype,"correctOption",2),n([Ti({attribute:"data-prompt",type:String})],F.prototype,"dataPrompt",2),F=n([qi("qti-inline-choice-interaction")],F);import{html as Ri,LitElement as Mi}from"lit";import{customElement as Ai,property as _i}from"lit/decorators.js";import{property as wi}from"lit/decorators.js";var Ue=(c,i)=>{class e extends c{constructor(){super(...arguments);this._shuffle=!1}set shuffle(s){let o=this._shuffle;this._shuffle=s,s?this._shuffleChoices():this._resetShuffleChoices(),this.requestUpdate("shuffle",o)}get shuffle(){return this._shuffle}connectedCallback(){super.connectedCallback(),this.shuffle?this._shuffleChoices():this._resetShuffleChoices()}_shuffleChoices(){let s=Array.from(this.querySelectorAll(i)),o=[],a=[];if(s.forEach((h,y)=>{h.hasAttribute("fixed")?o.push({element:h,index:y}):a.push(h)}),a.length<=1){console.warn("Shuffling is not possible with fewer than 2 non-fixed elements.");return}let l=!1,p=10,d=0,u=[...a];for(;!l&&d<p;){d++;for(let h=a.length-1;h>0;h--){let y=Math.floor(Math.random()*(h+1));[a[h],a[y]]=[a[y],a[h]]}if(l=!a.every((h,y)=>h===u[y]),l)break}l||console.warn("Failed to shuffle the choices after multiple attempts.");let g=1;s.forEach((h,y)=>{h.hasAttribute("fixed")?h.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([wi({type:String,reflect:!0,converter:Si})],e.prototype,"shuffle",1),e},Si={fromAttribute(c){return c==="true"},toAttribute(c){return c?"true":"false"}};import{property as ki}from"lit/decorators.js";var Xt=(c,i)=>{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(s){s&&(this._classes=s.split(" "),this._addLabels())}get class(){var s;return((s=this._classes)==null?void 0:s.join(" "))||""}updated(s){super.updated(s),s.has("shuffle")&&this._addLabels()}_addLabels(){let s=this._classes.some(a=>this._allLabels.includes(a)||this._allLabelSuffixes.includes(a)),o=a=>!isNaN(+a);if(s){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(s){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=`${s}`;break;case"qti-labels-lower-alpha":l=`${String.fromCharCode(97+s-1)}`;break;case"qti-labels-upper-alpha":l=`${String.fromCharCode(65+s-1)}`;break}return a==="qti-labels-suffix-period"?l+=".":a==="qti-labels-suffix-parenthesis"&&(l+=")"),l}}return n([ki({type:String,reflect:!0})],e.prototype,"class",1),e};import{css as Li}from"lit";var Yt=Li`
198
+ [part='slot'] {
123
199
  display: flex;
124
200
  flex-direction: column;
125
- // align-items: flex-start;
201
+ gap: var(--qti-gap-size);
202
+ flex-wrap: wrap;
203
+ }
204
+
205
+ ::slotted(qti-simple-choice) {
206
+ flex: 0 0 calc((100% - (var(--qti-gap-size) * var(--choice-interactions-stacking))) / var(--choice-interactions-stacking)) !important;
207
+ box-sizing: border-box !important;
208
+ }
209
+
210
+ :host(.qti-choices-stacking-1) [part='slot'] {
211
+ flex-direction: row;
212
+ --choice-interactions-stacking: 1;
213
+ }
214
+
215
+ :host(.qti-choices-stacking-2) [part='slot'] {
216
+ flex-direction: row;
217
+ --choice-interactions-stacking: 2;
218
+ }
219
+ :host(.qti-choices-stacking-3) [part='slot'] {
220
+ flex-direction: row;
221
+ --choice-interactions-stacking: 3;
222
+ }
223
+ :host(.qti-choices-stacking-4) [part='slot'] {
224
+ flex-direction: row;
225
+ --choice-interactions-stacking: 4;
226
+ }
227
+ :host(.qti-choices-stacking-5) [part='slot'] {
228
+ flex-direction: row;
229
+ --choice-interactions-stacking: 5;
230
+ }
231
+ :host([orientation='horizontal']) [part='slot'] {
232
+ flex-direction: row;
126
233
  }
127
- `;var Z=class extends Ft(Ue(I(Ss,"qti-simple-choice"),"qti-simple-choice"),"qti-simple-choice"){render(){return As` <slot name="prompt"></slot><slot part="slot"></slot>`}};Z.styles=Bt,i([Ms({type:String})],Z.prototype,"orientation",2),Z=i([Ls("qti-choice-interaction")],Z);import{css as Ns,html as Hs,LitElement as Vs}from"lit";import{customElement as $s}from"lit/decorators.js";var fe=class extends Vs{render(){return Hs`<slot></slot>`}process(){let s=new it,e=[...this.children];s.process(e)}};fe.styles=[Ns`
234
+ `;var J=class extends Xt(Ue(U(Mi,"qti-simple-choice"),"qti-simple-choice"),"qti-simple-choice"){render(){return Ri` <slot name="prompt"></slot><slot part="slot"></slot>`}};J.styles=Yt,n([_i({type:String})],J.prototype,"orientation",2),J=n([Ai("qti-choice-interaction")],J);import{css as Di,html as Hi,LitElement as Ni}from"lit";import{customElement as Vi}from"lit/decorators.js";var fe=class extends Ni{render(){return Hi`<slot></slot>`}process(){let i=new st,e=[...this.children];i.process(e)}};fe.styles=[Di`
128
235
  :host {
129
236
  display: none;
130
237
  }
131
- `],fe=i([$s("qti-outcome-processing")],fe);var it=class{process(s){for(let e of s)e.process()}};import{css as Ds,html as Os,LitElement as Ps}from"lit";import{customElement as Is}from"lit/decorators.js";var Xt=`<qti-response-processing>
238
+ `],fe=n([Vi("qti-outcome-processing")],fe);var st=class{process(i){for(let e of i)e.process()}};import{css as $i,html as Pi,LitElement as Ii}from"lit";import{customElement as Oi}from"lit/decorators.js";var jt=`<qti-response-processing>
132
239
  <qti-response-condition>
133
240
  <qti-response-if>
134
241
  <qti-match>
@@ -145,7 +252,7 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
145
252
  </qti-set-outcome-value>
146
253
  </qti-response-else>
147
254
  </qti-response-condition>
148
- </qti-response-processing>`,Yt=`<qti-response-processing>
255
+ </qti-response-processing>`,zt=`<qti-response-processing>
149
256
  <qti-response-condition>
150
257
  <qti-response-if>
151
258
  <qti-is-null>
@@ -161,7 +268,7 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
161
268
  </qti-set-outcome-value>
162
269
  </qti-response-else>
163
270
  </qti-response-condition>
164
- </qti-response-processing>`,jt=`<qti-response-processing>
271
+ </qti-response-processing>`,Kt=`<qti-response-processing>
165
272
  <qti-response-condition>
166
273
  <qti-response-if>
167
274
  <qti-is-null>
@@ -177,41 +284,54 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
177
284
  </qti-set-outcome-value>
178
285
  </qti-response-else>
179
286
  </qti-response-condition>
180
- </qti-response-processing>`;var K=class extends Ps{render(){return Os`<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)}};K.styles=[Ds`
287
+ </qti-response-processing>`;var z=class extends Ii{render(){return Pi`<slot></slot>`}process(){let i=[...this.children];for(let e of i)e.process()}firstUpdated(i){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(zt).firstElementChild.firstElementChild);break}case"map_response_point":{this.appendChild(this.fragmentFromString(Kt).firstElementChild.firstElementChild);break}case"match_correct":this.appendChild(this.fragmentFromString(jt).firstElementChild.firstElementChild);break}}}fragmentFromString(i){return document.createRange().createContextualFragment(i)}};z.styles=[$i`
181
288
  :host {
182
289
  display: none;
183
290
  }
184
- `],K=i([Is("qti-response-processing")],K);import{property as Xs}from"lit/decorators.js";import{customElement as Us}from"lit/decorators.js";import{html as Fs,LitElement as Bs}from"lit";var N=class extends Bs{render(){return Fs`<slot></slot>`}process(){throw new Error("Not implemented")}};N=i([Us("qti-rule")],N);var Fe=class extends N{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:pe(t)}})),t)}};i([Xs({type:String})],Fe.prototype,"identifier",2);customElements.define("qti-lookup-outcome-value",Fe);import{html as Ys}from"lit";var ot=class extends N{render(){return Ys`<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",ot);var nt=class extends N{process(){let s=this.getAttribute("identifier"),e=this.firstElementChild,r=new at(e).process();this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:s,value:Array.isArray(r)?r.map(o=>pe(o)):pe(r)}}))}},at=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",nt);import{LitElement as js,html as Ks}from"lit";var ge=class extends js{render(){return Ks`<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",ge);import{html as Ws}from"lit";var be=class extends ge{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",be);var lt=class extends be{render(){return Ws`${super.render()}`}};customElements.define("qti-response-else-if",lt);import{LitElement as zs,css as Js,html as Zs}from"lit";import{state as Gs}from"lit/decorators.js";var u=class extends zs{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,cardinality:"single"};case"qti-variable":{let t=e.getAttribute("identifier")||"";return this.assessmentItem.getVariable(t)}case"qti-multiple":{let r=e.getResult();return r.length>0?{identifier:"",baseType:r[0].baseType,value:r.map(o=>o.value),cardinality:"multiple",type:"response"}:null}case"qti-correct":{let t=e.getAttribute("identifier")||"",r=this.assessmentItem.getResponse(t);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 Zs`<pre>${JSON.stringify(this.result,null,2)}</pre>
185
- <slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}get assessmentItem(){return this.closest("qti-assessment-item")}};u.styles=Js`
291
+ `],z=n([Oi("qti-response-processing")],z);import{property as Xi}from"lit/decorators.js";import{customElement as Ui}from"lit/decorators.js";import{html as Fi,LitElement as Bi}from"lit";var D=class extends Bi{render(){return Fi`<slot></slot>`}process(){throw new Error("Not implemented")}};D=n([Ui("qti-rule")],D);var Fe=class extends D{get childExpression(){return this.firstElementChild}process(){let i=this.getAttribute("identifier"),e=this.closest("qti-assessment-item").getVariable(i),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:ce(t)}})),t)}};n([Xi({type:String})],Fe.prototype,"identifier",2);customElements.define("qti-lookup-outcome-value",Fe);import{html as Yi}from"lit";var ot=class extends D{render(){return Yi`<slot></slot>`}process(){let i=[...this.children];for(let e=0;e<i.length;e++){let t=i[e];if(t.calculate()){t.process();return}}}};customElements.define("qti-response-condition",ot);var nt=class extends D{process(){let i=this.getAttribute("identifier"),e=this.firstElementChild,r=new at(e).process();this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:i,value:Array.isArray(r)?r.map(s=>ce(s)):ce(r)}}))}},at=class{constructor(i){this.expression=i}process(){let i=this.expression?this.expression.calculate():null;if(i==null){console.warn("setOutcomeValue: value is null or undefined");return}return i}};customElements.define("qti-set-outcome-value",nt);import{LitElement as ji,html as zi}from"lit";var ge=class extends ji{render(){return zi`<slot></slot>`}calculate(){return!0}getSubRules(){return[...this.children]}process(){let i=this.getSubRules();for(let e=0;e<i.length;e++)i[e].process()}};customElements.define("qti-response-else",ge);import{html as Ki}from"lit";var be=class extends ge{calculate(){return this.firstElementChild.calculate()}getSubRules(){let i=[];for(let e=1;e<this.children.length;e++)i.push(this.children[e]);return i}};customElements.define("qti-response-if",be);var lt=class extends be{render(){return Ki`${super.render()}`}};customElements.define("qti-response-else-if",lt);import{LitElement as Wi,css as Zi,html as Ji}from"lit";import{state as Gi}from"lit/decorators.js";var m=class extends Wi{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.assessmentItem.getVariable(t)}case"qti-multiple":{let r=e.getResult();return r.length>0?{identifier:"",baseType:r[0].baseType,value:r.map(s=>s.value),cardinality:"multiple",type:"response"}:null}case"qti-correct":{let t=e.getAttribute("identifier")||"",r=this.assessmentItem.getResponse(t);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 Ji`<pre>${JSON.stringify(this.result,null,2)}</pre>
292
+ <slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}get assessmentItem(){return this.closest("qti-assessment-item")}};m.styles=Zi`
186
293
  slot {
187
294
  display: none;
188
295
  }
189
- `,i([Gs()],u.prototype,"result",2);var w=class extends u{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Be=class extends Qs(w){calculate(){return this.calculateChildren(Array.from(this.children))}};function Qs(c){return class extends c{calculateChildren(e){return e.map(r=>{let o=r;if(!o.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let n=o.calculate();if(typeof n=="string")if(n==="true")n=!0;else if(n==="false")n=!1;else return console.error("unexpected value in qti-and, expected boolean"),null;return n}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Be);import{property as ei}from"lit/decorators.js";var Xe=class extends u{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent}};i([ei({type:String,attribute:"base-type"})],Xe.prototype,"baseType",2);customElements.define("qti-base-value",Xe);var ct=class extends w{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,o=t.value;return r.filter(l=>o.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",ct);var pt=class extends u{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let s=this.getAttribute("identifier")||"",e=this.closest("qti-assessment-item").getResponse(s);return e.correctResponse,e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",pt);import{property as ti}from"lit/decorators.js";var Ye=class extends u{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 o=parseFloat(t.value),n=parseFloat(r.value);if(!isNaN(o)&&!isNaN(n))return this.roundingMode==="significantFigures"?o.toPrecision(this.figures)===n.toPrecision(this.figures):Math.round(o*Math.pow(10,this.figures))/Math.pow(10,this.figures)===Math.round(n*Math.pow(10,this.figures))/Math.pow(10,this.figures);console.error(`value cannot be casted to numeric value in equalRounded operator: ${o}, ${n}`);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}};i([ti({type:String})],Ye.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Ye);import{property as ri}from"lit/decorators.js";var R=class{static compareSingleValues(s,e,t){switch(t){case"identifier":case"string":return s===e;case"integer":{let r=parseInt(s,10),o=parseInt(e,10);if(!isNaN(r)&&!isNaN(o))return r===o;console.error(`Cannot convert ${s} and/or ${e} to int.`);break}case"float":{let r=parseFloat(s),o=parseFloat(e);if(!isNaN(r)&&!isNaN(o))return r===o;console.error(`couldn't convert ${s} and/or ${e} to float.`);break}case"pair":case"directedPair":{let r=s.split(" ").sort(),o=e.split(" ").sort();if(r.length===2&&o.length===2)return t==="pair"&&(r.sort(),o.sort()),r.join(" ")===o.join(" ");console.error(`compared two pair but one of the values does not have 2 values: 1: ${s} 2: ${e}`);break}}return!1}};var je=class extends u{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):R.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};i([ri({type:String})],je.prototype,"toleranceMode",2);customElements.define("qti-equal",je);var dt=class extends u{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",dt);var ut=class extends w{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",ut);var mt=class extends u{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",mt);var ht=class extends u{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",ht);var ft=class extends w{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",ft);import{property as si}from"lit/decorators.js";var Ke=class extends u{getResult(){let s=this.assessmentItem.getResponse(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 o of t){let n=e.mapEntries.find(a=>R.compareSingleValues(a.mapKey,o,s.baseType));n==null||n.mappedValue==null?r+=e.defaultValue:r+=n.mappedValue}return e.lowerBound!=null&&(r=Math.max(e.lowerBound,r)),e.upperBound!=null&&(r=Math.min(e.upperBound,r)),r}};i([si({type:String})],Ke.prototype,"identifier",2);customElements.define("qti-map-response",Ke);import{property as gt}from"lit/decorators.js";import{LitElement as ii}from"lit";var G=class extends ii{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")}))}};i([gt({attribute:"default-value",type:Number})],G.prototype,"defaultValue",2),i([gt({attribute:"lower-bound",type:Number})],G.prototype,"lowerBound",2),i([gt({attribute:"upper-bound",type:Number})],G.prototype,"upperBound",2);customElements.define("qti-mapping",G);var bt=class c extends u{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):R.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(!R.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 o of e.value){let n=null,a=[...s.value];for(let l of a)if(R.compareSingleValues(o,l,e.baseType)){n=l;break}if(n!==null)a.splice(a.indexOf(n),1);else return!1;r++}return!0}default:return console.error("unexpected cardinality in qti match"),!1}}};customElements.define("qti-match",bt);var vt=class extends u{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",vt);var yt=class extends u{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",yt);import{html as oi}from"lit";var xt=class extends u{render(){return oi`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",xt);var Et=class extends w{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();if(typeof r=="string")if(r==="true")r=!0;else if(r==="false")r=!1;else return console.error("unexpected value in qti-or, expected boolean"),null;return r}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",Et);var qt=class extends u{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",qt);import{consume as ni}from"@lit/context";import{LitElement as ai,html as li}from"lit";import{property as ci,state as pi}from"lit/decorators.js";var ve=class extends ai{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 li`${JSON.stringify(s,null,2)}`}calculate(){let s=this.closest("qti-assessment-item"),e=this.identifier;return s.getVariable(e).value}};i([ci({type:String})],ve.prototype,"identifier",2),i([ni({context:A,subscribe:!0}),pi()],ve.prototype,"itemContext",2);customElements.define("qti-printed-variable",ve);var Ct=class extends u{getResult(){return this.getVariables().reduce((t,r)=>{if(r.baseType=="float"||r.baseType=="integer")try{return t*parseInt(r.value.toString())}catch(o){console.warn("can not convert to number")}else console.warn(`has another baseType ${r.baseType}`);return t},1)}};customElements.define("qti-product",Ct);import{property as di}from"lit/decorators.js";var We=class extends u{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 o=this.caseSensitive==="true"?t.value:t.value.toLowerCase(),n=this.caseSensitive==="true"?r.value:r.value.toLowerCase();return R.compareSingleValues(o,n,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};i([di({type:String,attribute:"case-sensitive"})],We.prototype,"caseSensitive",2);customElements.define("qti-string-match",We);var _t=class extends u{constructor(){super(),this._expression=new kt(Array.from(this.children))}getResult(){return this._expression.calculate()}},kt=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",_t);var Tt=class extends u{getResult(){let s=this.getAttribute("identifier");return this.closest("qti-assessment-item").getVariable(s).value}};customElements.define("qti-variable",Tt);import{html as Kt}from"lit";import{customElement as ui,property as wt,state as mi}from"lit/decorators.js";var F=class extends g{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 n=await r.json();for(let a in n.paths)t&&(n.paths[a]=this.getResolvablePath(n.paths[a],t));return n}}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 o in r)if(r.hasOwnProperty(o)){let n=r[o];if(Array.isArray(n))return n.map(String);if(n!=null)return String(n)}}}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 o=this.convertQtiVariableJSON(t);this.response=o,this.saveResponse(o)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set response(e){}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},o=a=>{let l={},p=a.getAttribute("key");if(p){let d=Array.from(a.children),h=d.map(f=>f.getAttribute("key"));h.length>0&&!h.find(f=>!Number.isInteger(+f))?l[p]=d.map(f=>n(f)):l[p]=a.textContent}return l},n=a=>{if(a){let l={};for(let p of a.children)l=b(b({},l),o(p));return l}};for(let a of t)return a.getAttribute("key")||(r=b(b({},r),n(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 o=t=="IMS"?{properties:this.dataset,onready:()=>{console.log("onready")}}:this.getTAOConfig(this);t=="IMS"?e.getInstance(r,o,void 0):e.initialize(this.customInteractionTypeIdentifier,r.firstElementChild,o),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 o=r.querySelectorAll("qti-interaction-module");for(let n of o){let a=n.getAttribute("id"),l=n.getAttribute("primary-path"),p=n.getAttribute("fallback-path");if(a&&l){let d=p?this.combineRequireResolvePaths(this.getResolvablePath(l,t),this.getResolvablePath(p,t)):this.getResolvablePath(l,t),h=e.paths[a]||[];e.paths[a]=this.combineRequireResolvePaths(h,d)}}}return e}combineRequireResolvePaths(e,t){let r=Array.isArray(e)?e:[e],o=Array.isArray(t)?t:[t];return r.concat(o)}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">
296
+ `,n([Gi()],m.prototype,"result",2);var w=class extends m{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Be=class extends Qi(w){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();if(typeof o=="string")if(o==="true")o=!0;else if(o==="false")o=!1;else return console.error("unexpected value in qti-and, expected boolean"),null;return o}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Be);import{property as es}from"lit/decorators.js";var Xe=class extends m{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent.trim()}};n([es({type:String,attribute:"base-type"})],Xe.prototype,"baseType",2);customElements.define("qti-base-value",Xe);var ct=class extends w{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",ct);var pt=class extends m{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let i=this.getAttribute("identifier")||"",e=this.closest("qti-assessment-item").getResponse(i);return e.correctResponse,e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",pt);import{property as ts}from"lit/decorators.js";var Ye=class extends m{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}};n([ts({type:String})],Ye.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Ye);import{property as rs}from"lit/decorators.js";var S=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 je=class extends m{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):S.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};n([rs({type:String})],je.prototype,"toleranceMode",2);customElements.define("qti-equal",je);var dt=class extends m{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",dt);var ut=class extends w{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",ut);var mt=class extends m{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",mt);var ht=class extends m{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",ht);var ft=class extends w{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",ft);import{property as is}from"lit/decorators.js";var ze=class extends m{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(a=>S.compareSingleValues(a.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}};n([is({type:String})],ze.prototype,"identifier",2);customElements.define("qti-map-response",ze);import{property as gt}from"lit/decorators.js";import{LitElement as ss}from"lit";var G=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")}))}};n([gt({attribute:"default-value",type:Number})],G.prototype,"defaultValue",2),n([gt({attribute:"lower-bound",type:Number})],G.prototype,"lowerBound",2),n([gt({attribute:"upper-bound",type:Number})],G.prototype,"upperBound",2);customElements.define("qti-mapping",G);var bt=class c extends m{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):S.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(!S.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,a=[...i.value];for(let l of a)if(S.compareSingleValues(s,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",bt);var vt=class extends m{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",vt);var yt=class extends m{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",yt);import{html as os}from"lit";var xt=class extends m{render(){return os`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",xt);var Et=class extends w{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();if(typeof r=="string")if(r==="true")r=!0;else if(r==="false")r=!1;else return console.error("unexpected value in qti-or, expected boolean"),null;return r}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",Et);var Ct=class extends m{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",Ct);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 ve=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}};n([cs({type:String})],ve.prototype,"identifier",2),n([ns({context:R,subscribe:!0}),ps()],ve.prototype,"itemContext",2);customElements.define("qti-printed-variable",ve);var qt=class extends m{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",qt);import{property as ds}from"lit/decorators.js";var Ke=class extends m{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 S.compareSingleValues(s,o,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};n([ds({type:String,attribute:"case-sensitive"})],Ke.prototype,"caseSensitive",2);customElements.define("qti-string-match",Ke);var Tt=class extends m{constructor(){super(),this._expression=new wt(Array.from(this.children))}getResult(){return this._expression.calculate()}},wt=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",Tt);var St=class extends m{getResult(){let i=this.getAttribute("identifier");return this.closest("qti-assessment-item").getVariable(i).value}};customElements.define("qti-variable",St);import{html as Wt}from"lit";import{customElement as us,property as kt,state as ms}from"lit/decorators.js";var B=class extends f{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 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.response=s,this.saveResponse(s)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set response(e){}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},s=a=>{let l={},p=a.getAttribute("key");if(p){let d=Array.from(a.children),u=d.map(h=>h.getAttribute("key"));u.length>0&&!u.find(h=>!Number.isInteger(+h))?l[p]=d.map(h=>o(h)):l[p]=a.textContent}return l},o=a=>{if(a){let l={};for(let p of a.children)l=b(b({},l),s(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 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(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 s=r.querySelectorAll("qti-interaction-module");for(let o of s){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),u=e.paths[a]||[];e.paths[a]=this.combineRequireResolvePaths(u,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 Wt`<slot></slot>${this._errorMessage&&Wt`<div style="color:red">
190
297
  <h1>Error</h1>
191
298
  ${this._errorMessage}
192
- </div>`}`}};i([wt({type:String,attribute:"response-identifier"})],F.prototype,"responseIdentifier",2),i([wt({type:String,attribute:"module"})],F.prototype,"module",2),i([wt({type:String,attribute:"custom-interaction-type-identifier"})],F.prototype,"customInteractionTypeIdentifier",2),i([mi()],F.prototype,"_errorMessage",2),F=i([ui("qti-portable-custom-interaction")],F);import{LitElement as fi,css as gi,html as Jt}from"lit";import{customElement as bi,state as vi}from"lit/decorators.js";var ze=class c{constructor(){this._touchBegin=0;this._touchDown=null;this._lastClick=0;this._canDrag=!1;this._dragSrc=null;this._dragCopy=null;this._touchEndCalled=!1;this._dragRunning=!1;this._dataTransfer={data:{},setData:function(s,e){this.data[s]=e},getData:function(s){return this.data[s]},effectAllowed:"move"};this._copyOffset={x:0,y:0};this._lastTarget=null;this._currentDropContainer=null;this._handleClick=!0;this._DBLCLICKDELAY=500;this._CONTEXTMENUDELAY=1e3;this._DRAGDELTA=5;this._COPYOPACITY=.7;this.copyStylesDragClone=!0;this.dragOnClick=!1;this._createDragCopy=(s,e)=>{if(this._dragCopy===null&&this._dragRunning){this._dragSrc.style.opacity=this._COPYOPACITY,this._dragCopy=this._dragSrc.cloneNode(!0);let t=window.getComputedStyle(this._dragSrc);if(this._dragCopy.style="",this._dragCopy.setAttribute("dragclone",""),this.copyStylesDragClone)for(let r of t)this._dragCopy.style[r]=t.getPropertyValue(r);this._calculateDragCopyPosition(e),this._dragCopy.style.top=e.clientY-this._copyOffset.y+"px",this._dragCopy.style.left=e.clientX-this._copyOffset.x+"px",this._dragCopy.style.position="fixed",this._dragCopy.style.pointerEvents="none",this._dragCopy.style.zIndex="999999",this._dragCopy=document.body.appendChild(this._dragCopy),this._dispatchEvent(this._dragSrc,"dragstart")}if(this._dragRunning){let t=this;requestAnimationFrame(function(){t._touchEndCalled||t._dragCopy===null||(t._dragCopy.style.top=e.clientY-t._copyOffset.y+"px",t._dragCopy.style.left=e.clientX-t._copyOffset.x+"px")});let r=this._findDroppable(s);r!=this._lastTarget&&(this._dispatchEvent(r,"dragenter"),this._dispatchEvent(this._lastTarget,"dragleave"),this._lastTarget=r),this._currentDropContainer=r,this._currentDropContainer&&this._dispatchEvent(r,"dragover")}};return c._instance?c._instance:(c._instance=this,document.addEventListener("touchmove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("mousemove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchend",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("mouseup",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchcancel",this._touchCancel.bind(this),{passive:!1,capture:!1}),this)}addDraggables(s){s.forEach(e=>{e.addEventListener("touchstart",this._touchStart.bind(this),{passive:!1,capture:!1}),e.addEventListener("mousedown",this._touchStart.bind(this),{passive:!1,capture:!1})})}_touchStart(s){this._touchBegin=Date.now();let{x:e,y:t}=this._getPoint(s);if(this._touchDown={x:e,y:t},this._dragSrc=s.currentTarget,this._canDrag=!0,this.dragOnClick){let r={clientX:e,clientY:t};this._dragRunning=!0,this._createDragCopy(s,r)}s.preventDefault()}_touchMove(s){if(this._canDrag&&this._dragSrc){let{x:e,y:t}=this._getPoint(s),r={clientX:e,clientY:t};this._getDelta(r)>=this._DRAGDELTA&&(this._dragRunning=!0),this._createDragCopy(s,r),s.preventDefault()}}_touchEnd(s){var e;if(this._touchEndCalled=!0,this._canDrag=!1,this._currentDropContainer)this._dispatchEvent(this._currentDropContainer,"drop"),this._dispatchEvent(this._dragSrc,"dragend");else if(this._dragRunning){let t=new CustomEvent("dragend",{bubbles:!0,cancelable:!0});t.dataTransfer={dropEffect:"none"},(e=this._dragSrc)==null||e.dispatchEvent(t)}this._reset()}_touchCancel(s){this._reset()}_findDroppable(s){let e=this._getPoint(s),t=new Set;return this.getElementWithDropzone(document,e.x,e.y,t)}getElementWithDropzone(s,e,t,r){let o=s.elementFromPoint(e,t);if(o){if(r.has(o))return null;if(r.add(o),o.hasAttribute("dropzone"))return o;if(o.shadowRoot){let n=this.getElementWithDropzone(o.shadowRoot,e,t,r);if(n)return n}return o}return null}_getPoint(s,e){return s&&s.touches&&(s=s.touches[0]),{x:e?s.pageX:s.clientX,y:e?s.pageY:s.clientY}}_calculateDragCopyPosition(s){let e=this._dragSrc.getBoundingClientRect();this._copyOffset.x=s.clientX-e.left,this._copyOffset.y=s.clientY-e.top}_getDelta(s){let e=Math.abs(s.clientX-this._touchDown.x),t=Math.abs(s.clientY-this._touchDown.y);return e+t}_dispatchEvent(s,e,t=!0){if(!s)return!1;let r=new CustomEvent(e,{bubbles:t,cancelable:!0});return r.dataTransfer=this._dataTransfer,s.dispatchEvent(r),r.defaultPrevented}_reset(){this._dragRunning&&(this._dragSrc.style.opacity="1.0",this._dragCopy.parentElement.removeChild(this._dragCopy)),this._dragRunning=!1,this._dragSrc=null,this._dragCopy=null,this._canDrag=!1,this._touchBegin=0,this._touchDown=null,this._lastClick=0,this._touchEndCalled=!1,this._dataTransfer={data:{},setData:function(s,e){this.data[s]=e},getData:function(s){return this.data[s]},effectAllowed:"move"},this._copyOffset={x:0,y:0},this._lastTarget=null,this._currentDropContainer=null,this._handleClick=!0}};import{property as hi}from"lit/decorators.js";var Wt=(c,s,e)=>{class t extends c{constructor(){super(...arguments);this.disabled=!1}firstUpdated(n){if(this.classList.contains("qti-match-tabular"))return;super.firstUpdated(n);let a=Array.from(s?this.shadowRoot.querySelectorAll(e):this.querySelectorAll(e));this.dragoverHandler=this.dragoverHandler.bind(this),this.dragleaveHandler=this.dragleaveHandler.bind(this),this.dragenterHandler=this.dragenterHandler.bind(this),this.dropHandler=this.dropHandler.bind(this),a.forEach(l=>{l.setAttribute("dropzone","move"),l.addEventListener("dragleave",this.dragleaveHandler),this.attachHandler(l)});for(let l of a)this.observer=new MutationObserver(p=>{p.forEach(d=>{if(d.type==="attributes")switch(d.attributeName){case"disabled":{l.hasAttribute("disabled")?this.removeHandler(l):this.attachHandler(l);break}}})}),this.observer.observe(l,{attributes:!0})}attachHandler(n){n.addEventListener("dragover",this.dragoverHandler),n.addEventListener("dragenter",this.dragenterHandler),n.addEventListener("drop",this.dropHandler)}removeHandler(n){n.removeEventListener("dragover",this.dragoverHandler),n.removeEventListener("dragenter",this.dragenterHandler),n.removeEventListener("drop",this.dropHandler)}disconnectedCallback(){var n;this.classList.contains("qti-match-tabular")||(super.disconnectedCallback(),(n=this.observer)==null||n.disconnect())}dragenterHandler(n){n.preventDefault()}dragoverHandler(n){return n.preventDefault(),n.currentTarget.setAttribute("active",""),n.dataTransfer.dropEffect="move",!1}dropHandler(n){n.preventDefault();let a=n.currentTarget,l=this.querySelector(`[identifier=${n.dataTransfer.getData("text")}`),p=l||this.shadowRoot.querySelector(`[identifier=${n.dataTransfer.getData("text")}`);return a?p.parentElement.getAttribute("identifier")!==a.getAttribute("identifier")&&a.appendChild(p):console.error(`cannot find droppable, target: ${n.target?JSON.stringify(n.target):"null"}`),a.removeAttribute("active"),!1}dragleaveHandler(n){return n.preventDefault(),n.currentTarget.removeAttribute("active"),n.dataTransfer.dropEffect="none",!1}}return i([hi({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var zt=(c,s,e)=>{class t extends c{}return t};import{property as Q}from"lit/decorators.js";var H=(c,s,e,t)=>{class r extends zt(Wt(c,e,t),t,s){constructor(){super(...arguments);this.draggables=new Map;this.responseIdentifier="";this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.disabled=!1;this.readonly=!1;this.minAssociations=1;this.maxAssociations=1;this.handleDragStart=a=>{a.dataTransfer.setData("text",a.currentTarget.getAttribute("identifier")),a.currentTarget.setAttribute("dragging",""),this.droppables.forEach(l=>l.setAttribute("enabled",""))};this.handleDragEnd=a=>{a.preventDefault(),this.droppables.forEach(p=>p.removeAttribute("enabled"));let l=a.currentTarget;l.removeAttribute("over"),l.removeAttribute("dragging"),(a.dataTransfer.dropEffect==="none"||a.dataTransfer.dropEffect===void 0)&&this.configuration.dragCanBePlacedBack&&this.placeDraggableBack(l),a.dataTransfer.dropEffect==="move"&&(this.saveResponse(),this.checkMaxMatchAssociations())}}reInitDragAndDrop(a,l){if(this.classList.contains("qti-match-tabular"))return;a.filter(d=>!this.draggables||!this.draggables.get(d)).length>0&&(this.dragDropApi.addDraggables(a),a.forEach(d=>{this.draggables.set(d,{parent:d.parentElement,index:Array.from(d.parentNode.children).indexOf(d)}),d.setAttribute("qti-draggable","true"),d.addEventListener("dragstart",this.handleDragStart),d.addEventListener("dragend",this.handleDragEnd)}))}handleDragOptionsChanged(a,l){this.dragDropApi.copyStylesDragClone=l.copyStylesDragClone,this.dragDropApi.dragOnClick=l.dragOnClick}handleDisabledChange(a,l){this.draggables.forEach((p,d)=>{l?d.setAttribute("disabled",""):d.removeAttribute("disabled"),l?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}handleReadonlyChange(a,l){this.draggables.forEach((p,d)=>{l?d.setAttribute("readonly",""):d.removeAttribute("readonly"),l?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}firstUpdated(a){super.firstUpdated(a),this.droppables=Array.from(e?this.shadowRoot.querySelectorAll(t):this.querySelectorAll(t))}connectedCallback(){super.connectedCallback(),this.dragDropApi=new ze,this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0,detail:this}))}placeDraggableBack(a){let l=this.draggables.get(a),p=l.index<=l.parent.children.length?l.index:l.parent.children.length-1,d=l.parent,h=l.parent.children[p];d.insertBefore(a,h),this.saveResponse(),this.checkMaxMatchAssociations()}reset(a=!0){this.draggables.forEach((l,p)=>{let d=l.parent.children,h=l.index<d.length?l.index:d.length;l.parent.insertBefore(p,d[h])}),a&&this.saveResponse()}checkMaxMatchAssociations(){this.droppables.forEach(a=>{let p=+(a.getAttribute("match-max")||1)<=(a.querySelectorAll('[qti-draggable="true"]').length||0);p?a.setAttribute("disabled",""):a.removeAttribute("disabled"),p?a.removeAttribute("dropzone"):a.setAttribute("dropzone","move")})}set response(a){this.classList.contains("qti-match-tabular")||(this.reset(!1),a!==null&&Array.isArray(a)&&a.forEach(l=>{let[p,...d]=l.split(" ").reverse();if(p){let h=this.droppables.find(m=>m.getAttribute("identifier")===p);d.forEach(m=>{let f=this.querySelector(`[identifier=${m}]`);h?f?(h.appendChild(f),this.checkMaxMatchAssociations()):console.error(`cannot find draggable with identifier: ${m}`):console.error(`cannot find droppable with identifier: ${p}`)})}}))}validate(){let l=(e?Array.from(this.shadowRoot.querySelectorAll(t)):Array.from(this.querySelectorAll(t))).filter(p=>p.childElementCount>0).length;return this.minAssociations<=0||this.minAssociations<=l}saveResponse(){let a;typeof this.getResponse=="function"?a=this.getResponse():a=this.droppables.map(l=>{let p=l.querySelectorAll('[qti-draggable="true"]'),d=Array.from(p).map(m=>m.getAttribute("identifier")),h=l.getAttribute("identifier");return[...d,h].join(" ")}),this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:a}}))}}return i([Dt(s)],r.prototype,"reInitDragAndDrop",1),i([Q({type:String,attribute:"response-identifier"})],r.prototype,"responseIdentifier",2),i([Q({attribute:!1,type:Object})],r.prototype,"configuration",2),i([v("configuration")],r.prototype,"handleDragOptionsChanged",1),i([Q({type:Boolean,reflect:!0})],r.prototype,"disabled",2),i([v("disabled",{waitUntilFirstUpdate:!0})],r.prototype,"handleDisabledChange",1),i([Q({type:Boolean,reflect:!0})],r.prototype,"readonly",2),i([v("readonly",{waitUntilFirstUpdate:!0})],r.prototype,"handleReadonlyChange",1),i([Q({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),i([Q({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),r};var ee=class extends H(fi,"qti-simple-associable-choice",!0,".dl"){render(){return Jt` <slot name="prompt"></slot>
299
+ </div>`}`}};n([kt({type:String,attribute:"response-identifier"})],B.prototype,"responseIdentifier",2),n([kt({type:String,attribute:"module"})],B.prototype,"module",2),n([kt({type:String,attribute:"custom-interaction-type-identifier"})],B.prototype,"customInteractionTypeIdentifier",2),n([ms()],B.prototype,"_errorMessage",2),B=n([us("qti-portable-custom-interaction")],B);import{LitElement as gs,html as er}from"lit";import{customElement as bs,state as vs}from"lit/decorators.js";var We=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 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(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,a=r.left+i,l=r.top+e,p=Math.max(t.left,Math.min(a,t.right-s)),d=Math.max(t.top,Math.min(l,t.bottom-o)),u=p-r.left,g=d-r.top;return{boundedDeltaX:u,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,a=s.height,l=Math.max(r.left,Math.min(i,r.right-o)),p=Math.max(r.top,Math.min(e,r.bottom-a));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 Zt=(c,i,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(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(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()};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([hs({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var Jt=(c,i,e)=>{class t extends c{}return t};import{property as Q}from"lit/decorators.js";function Gt(c,i){let e,t=b({},i);return(r,s)=>{let{connectedCallback:o,disconnectedCallback:a}=r;r.connectedCallback=function(){var d;o.call(this);let l=u=>{let g=Array.from(this.querySelectorAll(c));for(let h of u){let y=Array.from(h.addedNodes).map($=>$),v=Array.from(h.addedNodes).map($=>$);h.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(){a.call(this),e.disconnect()}}}var H=(c,i,e,t)=>{class r extends Jt(Zt(c,e,t),t,i){constructor(){super(...arguments);this.draggables=new Map;this.droppables=[];this.responseIdentifier="";this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.disabled=!1;this.readonly=!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),u=d.length;if(u===0){l(!1);return}d.forEach(g=>{g.kind==="string"&&g.type==="text"?g.getAsString(h=>{h==="move-test"&&(p=!0),u===0&&l(p)}):u===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 We,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),u=(h,y,v)=>{let $=Math.min(v,y.children.length);y.insertBefore(h,y.children[$]),h.style.transform="translate(0, 0)",this.checkMaxAssociations()};if(!document.startViewTransition){u(a,l,p);return}let g=document.startViewTransition(()=>{a.style.transform="",u(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 response(){return this.collectResponseData()}set response(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(u=>this.placeDraggableInDroppable(u,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")),u=l.getAttribute("identifier");return d.map(g=>`${g} ${u}`)}).flat()}reset(a=!0){this.resetDroppables(),a&&this.saveResponse()}async resetDroppables(){let a=(p,d,u)=>{p.style.transform="translate(0, 0)";let g=Math.min(u,d.children.length);d.insertBefore(p,d.children[g])};if(!document.startViewTransition){this.draggables.forEach(({parent:p,index:d},u)=>{a(u,p,d)});return}await document.startViewTransition(()=>{this.draggables.forEach(({parent:p,index:d},u)=>{a(u,p,d)})}).finished}}return n([Q({type:String,attribute:"response-identifier"})],r.prototype,"responseIdentifier",2),n([Q({attribute:!1,type:Object})],r.prototype,"configuration",2),n([Q({type:Boolean,reflect:!0})],r.prototype,"disabled",2),n([Q({type:Boolean,reflect:!0})],r.prototype,"readonly",2),n([Q({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),n([Q({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),n([Gt(i)],r.prototype,"handleDraggablesChange",1),r};import{css as fs}from"lit";var Qt=fs`
300
+ :host {
301
+ display: block; /* necessary to calculate scaling position */
302
+ }
303
+ slot[name='qti-simple-associable-choice'] {
304
+ display: flex;
305
+ flex-wrap: wrap;
306
+ gap: 0.5rem;
307
+ }
308
+
309
+ :host::part(associables-container) {
310
+ display: flex;
311
+ justify-content: space-between;
312
+ background: linear-gradient(
313
+ 180deg,
314
+ rgb(0 0 0 / 0%) calc(50% - 1px),
315
+ var(--qti-border-color-gray) calc(50%),
316
+ rgb(0 0 0 / 0%) calc(50% + 1px)
317
+ );
318
+ }
319
+ `;var ee=class extends H(gs,"qti-simple-associable-choice",!0,".dl"){constructor(){super();this._childrenMap=[];this.addEventListener("register-qti-simple-associable-choice",e=>{let t=e.target;this._childrenMap.push(t)})}render(){return er` <slot name="prompt"></slot>
193
320
  <slot name="qti-simple-associable-choice"></slot>
194
- ${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((s,e)=>Jt`<div part="associables-container">
195
- <div name="left${e}" part="drop-list" class="dl" identifier="droplist${e}_left"></div>
196
- <div name="right${e}" part="drop-list" class="dl" identifier="droplist${e}_right"></div>
197
- </div>`)}`}connectedCallback(){super.connectedCallback(),this._childrenMap=Array.from(this.querySelectorAll("qti-simple-associable-choice"))}};ee.styles=gi`
198
- :host {
199
- display: block; /* necessary to calculate scaling position */
200
- }
201
- slot[name='qti-simple-associable-choice'] {
202
- display: flex;
203
- flex-wrap: wrap;
204
- gap: 0.5rem;
205
- }
206
- `,i([vi()],ee.prototype,"_childrenMap",2),ee=i([bi("qti-associate-interaction")],ee);import{html as Zt}from"lit";import{customElement as yi,property as ye,state as xi}from"lit/decorators.js";var V=class extends g{constructor(){super();this._errorMessage=null;this.handlePostMessage=this.handlePostMessage.bind(this)}connectedCallback(){super.connectedCallback();let e=this.data.startsWith("http")?this.data:de(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(`
321
+ <div part="drop-container">
322
+ ${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((e,t)=>er`<div part="associables-container">
323
+ <div name="left${t}" part="drop-list" class="dl" identifier="droplist${t}_left"></div>
324
+ <div name="right${t}" part="drop-list" class="dl" identifier="droplist${t}_right"></div>
325
+ </div>`)}
326
+ </div>`}};ee.styles=Qt,n([vs()],ee.prototype,"_childrenMap",2),ee=n([bs("qti-associate-interaction")],ee);import{html as tr}from"lit";import{customElement as ys,property as ye,state as xs}from"lit/decorators.js";var N=class extends f{constructor(){super();this._errorMessage=null;this.handlePostMessage=this.handlePostMessage.bind(this)}connectedCallback(){super.connectedCallback();let e=this.data.startsWith("http")?this.data:pe(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(`
207
327
  <html>
208
328
  <head>
209
- <link href='${de(`${this.baseRefUrl}/${this.manifest.style[0]}`)}' rel="stylesheet" />
210
- <script src='${de(`${this.baseRefUrl}/${this.manifest.script[0]}`)}'></script>
329
+ <link href='${pe(`${this.baseRefUrl}/${this.manifest.style[0]}`)}' rel="stylesheet" />
330
+ <script src='${pe(`${this.baseRefUrl}/${this.manifest.script[0]}`)}'></script>
211
331
  </head>
212
332
  <body></body>
213
333
  </html>
214
- `),r.close()}getIFrames(){let e=this.shadowRoot.querySelectorAll("iframe"),t=this.querySelectorAll("iframe"),r=[...e,...t];for(let o of r){let n=o.src;if(new URL(n,window.location.href).origin===window.location.origin)try{let l=o.contentDocument||o.contentWindow.document;l&&this.getInnerIFrames(l,r)}catch(l){console.error("Error accessing nested iframe:",l)}}return r.forEach((o,n)=>{r.indexOf(o)!==n&&r.splice(n,1)}),r}getInnerIFrames(e,t=[]){return e.querySelectorAll("iframe").forEach(o=>{t.push(o);let n=o.src;if(new URL(n,window.location.href).origin===window.location.origin)try{let l=o.contentDocument||o.contentWindow.document;this.getInnerIFrames(l,t)}catch(l){console.error("Error accessing nested iframe:",l)}else console.warn("Skipped cross-origin iframe:",n)}),t}postToWindowAndIframes(e,t){window.postMessage({type:e,data:t},"*");let r=this.getIFrames();for(let o of r)o.contentWindow&&o.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 o=this.manifest.media.map(n=>n.startsWith("http")?n:de(this.baseRefUrl+"/"+n));this.postToWindowAndIframes("mediaData",o);break}case"setStageHeight":console.log("setStageHeight not implemented");break}}validate(){return this.rawResponse!==""}set response(e){this.rawResponse=e}disconnectedCallback(){window.removeEventListener("message",this.handlePostMessage),super.disconnectedCallback()}render(){return Zt`<iframe
334
+ `),r.close()}getIFrames(){let e=this.shadowRoot.querySelectorAll("iframe"),t=this.querySelectorAll("iframe"),r=[...e,...t];for(let s of r){let o=s.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let l=s.contentDocument||s.contentWindow.document;l&&this.getInnerIFrames(l,r)}catch(l){console.error("Error accessing nested iframe:",l)}}return r.forEach((s,o)=>{r.indexOf(s)!==o&&r.splice(o,1)}),r}getInnerIFrames(e,t=[]){return e.querySelectorAll("iframe").forEach(s=>{t.push(s);let o=s.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let l=s.contentDocument||s.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 s of r)s.contentWindow&&s.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 s=this.manifest.media.map(o=>o.startsWith("http")?o:pe(this.baseRefUrl+"/"+o));this.postToWindowAndIframes("mediaData",s);break}case"setStageHeight":console.log("setStageHeight not implemented");break}}validate(){return this.rawResponse!==""}set response(e){this.rawResponse=e}disconnectedCallback(){window.removeEventListener("message",this.handlePostMessage),super.disconnectedCallback()}render(){return tr`<iframe
215
335
  width=${this.getAttribute("width")}
216
336
  height=${this.getAttribute("height")}
217
337
  frameborder="0"
@@ -219,11 +339,10 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
219
339
  id="pciContainer"
220
340
  >
221
341
  </iframe>
222
- ${this._errorMessage&&Zt`<div style="color:red">
342
+ ${this._errorMessage&&tr`<div style="color:red">
223
343
  <h1>Error</h1>
224
344
  ${this._errorMessage}
225
- </div>`}`}};i([ye({type:String,attribute:"response-identifier"})],V.prototype,"responseIdentifier",2),i([ye({type:String,attribute:"data"})],V.prototype,"data",2),i([ye({type:String,attribute:"data-base-item"})],V.prototype,"baseItemUrl",2),i([ye({type:String,attribute:"data-base-ref"})],V.prototype,"baseRefUrl",2),i([ye({type:String,attribute:"id"})],V.prototype,"id",2),i([xi()],V.prototype,"_errorMessage",2),V=i([yi("qti-custom-interaction")],V);import{html as Ei}from"lit";import{customElement as qi,property as Gt}from"lit/decorators.js";var te=class extends g{constructor(){super(...arguments);this.countAttempt="true"}validate(){return!0}set response(e){}render(){return Ei`<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"}}))}};i([Gt({type:String,attribute:"count-attempt"})],te.prototype,"countAttempt",2),i([Gt({type:String})],te.prototype,"title",2),te=i([qi("qti-end-attempt-interaction")],te);import{css as Ci,html as _i,LitElement as ki}from"lit";import{customElement as Ti}from"lit/decorators.js";var xe=class extends H(ki,"qti-gap-text",!1,"qti-gap"){render(){return _i` <slot part="drags" name="qti-gap-text"></slot>
226
- <slot part="drops"></slot>`}set correctResponse(s){let e=[],t=Array.isArray(s)?s:[s];t&&(e=t.map(o=>{let n=o.split(" ");return{text:n[0],gap:n[1]}})),this.querySelectorAll("qti-gap").forEach((o,n)=>{var d,h,m,f;let a=o.getAttribute("identifier"),l=(d=e.find(_=>_.gap===a))==null?void 0:d.text,p=(h=this.querySelector(`qti-gap-text[identifier="${l}"]`))==null?void 0:h.textContent.trim();if(l&&p){if(!((m=o.nextElementSibling)!=null&&m.classList.contains("correct-option"))){let _=document.createElement("span");_.classList.add("correct-option"),_.textContent=p,o.insertAdjacentElement("afterend",_)}}else(f=o.nextElementSibling)!=null&&f.classList.contains("correct-option")&&o.nextElementSibling.remove()})}};xe.styles=[Ci`
345
+ </div>`}`}};n([ye({type:String,attribute:"response-identifier"})],N.prototype,"responseIdentifier",2),n([ye({type:String,attribute:"data"})],N.prototype,"data",2),n([ye({type:String,attribute:"data-base-item"})],N.prototype,"baseItemUrl",2),n([ye({type:String,attribute:"data-base-ref"})],N.prototype,"baseRefUrl",2),n([ye({type:String,attribute:"id"})],N.prototype,"id",2),n([xs()],N.prototype,"_errorMessage",2),N=n([ys("qti-custom-interaction")],N);import{html as Es}from"lit";import{customElement as Cs,property as rr}from"lit/decorators.js";var te=class extends f{constructor(){super(...arguments);this.countAttempt="true"}validate(){return!0}set response(e){}render(){return Es`<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([rr({type:String,attribute:"count-attempt"})],te.prototype,"countAttempt",2),n([rr({type:String})],te.prototype,"title",2),te=n([Cs("qti-end-attempt-interaction")],te);import{css as qs,html as Ts,LitElement as ws}from"lit";import{customElement as Ss}from"lit/decorators.js";var xe=class extends H(ws,"qti-gap-text",!1,"qti-gap"){render(){return Ts`<slot name="prompt"> </slot><slot part="drags" name="qti-gap-text"></slot> <slot part="drops"></slot>`}set correctResponse(i){let e=[],t=Array.isArray(i)?i:[i];t&&(e=t.map(s=>{let o=s.split(" ");return{text:o[0],gap:o[1]}})),this.querySelectorAll("qti-gap").forEach((s,o)=>{var d,u,g,h;let a=s.getAttribute("identifier"),l=(d=e.find(y=>y.gap===a))==null?void 0:d.text,p=(u=this.querySelector(`qti-gap-text[identifier="${l}"]`))==null?void 0:u.textContent.trim();if(l&&p){if(!((g=s.nextElementSibling)!=null&&g.classList.contains("correct-option"))){let y=document.createElement("span");y.classList.add("correct-option"),y.textContent=p,s.insertAdjacentElement("afterend",y)}}else(h=s.nextElementSibling)!=null&&h.classList.contains("correct-option")&&s.nextElementSibling.remove()})}};xe.styles=[qs`
227
346
  :host {
228
347
  display: flex;
229
348
  align-items: flex-start;
@@ -250,26 +369,26 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
250
369
  flex: 1;
251
370
  gap: 0.5rem;
252
371
  }
253
- `],xe=i([Ti("qti-gap-match-interaction")],xe);import{css as wi,html as Ri,svg as Qt}from"lit";import{customElement as Ai,query as Si,queryAssignedElements as Li,state as Rt}from"lit/decorators.js";import{ifDefined as er}from"lit/directives/if-defined.js";import{repeat as Mi}from"lit/directives/repeat.js";function re(c,s,e,t){switch(c){case"circle":{let[r,o,n]=s,a=r/e.width*100,l=o/e.height*100,p=n/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,o,n,a]=s,l=r/e.width*100,p=o/e.height*100,d=n/e.width*100,h=a/e.height*100;t.style.left=l+"%",t.style.top=p+"%",t.style.width=d-l+"%",t.style.height=h-p+"%"}break;case"poly":{let r=s.reduce((y,j,Mt,lr)=>{if(Mt%2===1){let cr=y.pop();y[y.length]={x:cr,y:lr[Mt]}}else y.push(j);return y},[]),o=Math.min(...r.map(y=>y.x)),n=Math.max(...r.map(y=>y.x)),a=Math.min(...r.map(y=>y.y)),l=Math.max(...r.map(y=>y.y)),p=o/e.width*100,d=a/e.height*100,h=n/e.width*100,m=l/e.height*100;t.style.left=o/e.width*100+"%",t.style.top=a/e.height*100+"%",t.style.width=h-p+"%",t.style.height=m-d+"%";let _=r.map(y=>({x:(y.x-o)/(n-o)*100,y:(y.y-a)/(l-a)*100})).map(y=>Math.round(y.x)+"% "+Math.round(y.y)+"%").join(",");t.style.clipPath=`polygon(${_})`}break;default:break}}var $=class extends g{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 response(e){Array.isArray(e)&&(this._lines=e)}render(){var e,t,r,o;return Ri`<slot name="prompt"></slot>
372
+ `],xe=n([Ss("qti-gap-match-interaction")],xe);import{css as ks,html as Ls,svg as ir}from"lit";import{customElement as Rs,query as Ms,queryAssignedElements as As,state as Lt}from"lit/decorators.js";import{ifDefined as sr}from"lit/directives/if-defined.js";import{repeat as _s}from"lit/directives/repeat.js";function re(c,i,e,t){switch(c){case"circle":{let[r,s,o]=i,a=r/e.width*100,l=s/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,s,o,a]=i,l=r/e.width*100,p=s/e.height*100,d=o/e.width*100,u=a/e.height*100;t.style.left=l+"%",t.style.top=p+"%",t.style.width=d-l+"%",t.style.height=u-p+"%"}break;case"poly":{let r=i.reduce((v,$,_t,mr)=>{if(_t%2===1){let hr=v.pop();v[v.length]={x:hr,y:mr[_t]}}else v.push($);return v},[]),s=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=s/e.width*100,d=a/e.height*100,u=o/e.width*100,g=l/e.height*100;t.style.left=s/e.width*100+"%",t.style.top=a/e.height*100+"%",t.style.width=u-p+"%",t.style.height=g-d+"%";let y=r.map(v=>({x:(v.x-s)/(o-s)*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 V=class extends f{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 response(e){Array.isArray(e)&&(this._lines=e)}render(){var e,t,r,s;return Ls`<slot name="prompt"></slot>
254
373
  <line-container>
255
374
  <svg
256
- width=${er((e=this.grImage[0])==null?void 0:e.width)}
257
- height=${er((t=this.grImage[0])==null?void 0:t.height)}
258
- viewbox="0 0 ${(r=this.grImage[0])==null?void 0:r.width} ${(o=this.grImage[0])==null?void 0:o.height}"
375
+ width=${sr((e=this.grImage[0])==null?void 0:e.width)}
376
+ height=${sr((t=this.grImage[0])==null?void 0:t.height)}
377
+ viewbox="0 0 ${(r=this.grImage[0])==null?void 0:r.width} ${(s=this.grImage[0])==null?void 0:s.height}"
259
378
  >
260
- ${Mi(this._lines,n=>n,(n,a)=>Qt`
379
+ ${_s(this._lines,o=>o,(o,a)=>ir`
261
380
  <line
262
381
  part="line"
263
- x1=${parseInt(this.querySelector("[identifier="+n.split(" ")[0]+"]").style.left)}
264
- y1=${parseInt(this.querySelector("[identifier="+n.split(" ")[0]+"]").style.top)}
265
- x2=${parseInt(this.querySelector("[identifier="+n.split(" ")[1]+"]").style.left)}
266
- y2=${parseInt(this.querySelector("[identifier="+n.split(" ")[1]+"]").style.top)}
382
+ x1=${parseInt(this.querySelector("[identifier="+o.split(" ")[0]+"]").style.left)}
383
+ y1=${parseInt(this.querySelector("[identifier="+o.split(" ")[0]+"]").style.top)}
384
+ x2=${parseInt(this.querySelector("[identifier="+o.split(" ")[1]+"]").style.left)}
385
+ y2=${parseInt(this.querySelector("[identifier="+o.split(" ")[1]+"]").style.top)}
267
386
  stroke="red"
268
387
  stroke-width="3"
269
388
  @click=${l=>{l.stopPropagation(),this._lines=this._lines.filter((p,d)=>d!==a),this.saveResponse(this._lines)}}
270
389
  />
271
390
  `)}
272
- ${this.startPoint&&Qt`<line
391
+ ${this.startPoint&&ir`<line
273
392
  part="point"
274
393
  x1=${this.startCoord.x}
275
394
  y1=${this.startCoord.y}
@@ -280,7 +399,7 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
280
399
  />`}
281
400
  </svg>
282
401
  <slot></slot>
283
- </line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,o=r.getAttribute("coords"),n=r.getAttribute("shape"),a=o.split(",").map(l=>parseInt(l));re(n,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)}};$.styles=[wi`
402
+ </line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,s=r.getAttribute("coords"),o=r.getAttribute("shape"),a=s.split(",").map(l=>parseInt(l));re(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)}};V.styles=[ks`
284
403
  slot:not([name='prompt']) {
285
404
  // position: relative; /* qti-hotspot-choice relative to the slot */
286
405
  display: block;
@@ -303,8 +422,9 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
303
422
  top: 0px;
304
423
  left: 0px;
305
424
  }
306
- `],i([Rt()],$.prototype,"_lines",2),i([Rt()],$.prototype,"startCoord",2),i([Rt()],$.prototype,"mouseCoord",2),i([Si("svg")],$.prototype,"svgContainer",2),i([Li({selector:"img"})],$.prototype,"grImage",2),$=i([Ai("qti-graphic-associate-interaction")],$);import{css as Ni,html as Hi,LitElement as Vi}from"lit";import{customElement as $i}from"lit/decorators.js";var Ee=class extends H(Vi,"qti-gap-img",!1,"qti-associable-hotspot"){render(){return Hi` <slot></slot>
307
- <slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),o=t.getAttribute("shape"),n=r.split(",").map(a=>parseInt(a));switch(o){case"circle":{let[a,l,p]=n;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]=n;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)}};Ee.styles=Ni`
425
+ `],n([Lt()],V.prototype,"_lines",2),n([Lt()],V.prototype,"startCoord",2),n([Lt()],V.prototype,"mouseCoord",2),n([Ms("svg")],V.prototype,"svgContainer",2),n([As({selector:"img"})],V.prototype,"grImage",2),V=n([Rs("qti-graphic-associate-interaction")],V);import{css as Ds,html as Hs,LitElement as Ns}from"lit";import{customElement as Vs}from"lit/decorators.js";var Ee=class extends H(Ns,"qti-gap-img",!1,"qti-associable-hotspot"){render(){return Hs` <slot name="prompt"></slot>
426
+ <slot></slot>
427
+ <slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(i){let e=this.querySelector("img"),t=i.target,r=t.getAttribute("coords"),s=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));switch(s){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)}};Ee.styles=Ds`
308
428
  :host {
309
429
  display: inline-block;
310
430
  position: relative;
@@ -313,12 +433,12 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
313
433
  display: flex;
314
434
  gap: 1rem;
315
435
  }
316
- `,Ee=i([$i("qti-graphic-gap-match-interaction")],Ee);import{css as Di,html as Oi,LitElement as Pi}from"lit";import{customElement as Ii}from"lit/decorators.js";var qe=class extends I(Pi,"qti-hotspot-choice"){render(){return Oi`
436
+ `,Ee=n([Vs("qti-graphic-gap-match-interaction")],Ee);import{css as $s,html as Ps,LitElement as Is}from"lit";import{customElement as Os}from"lit/decorators.js";var Ce=class extends U(Is,"qti-hotspot-choice"){render(){return Ps`
317
437
  <slot name="prompt"></slot>
318
438
  <!-- slot for the prompt -->
319
439
  <slot></slot>
320
440
  <!-- slot for the image and hotspots -->
321
- `}setHotspotOrder(s){let{identifier:e}=s.detail,t=this._choiceElements.find(o=>o.getAttribute("identifier")===e),r=this._choiceElements.length;if(!this.choiceOrdering){if(this.choiceOrdering=!0,t.order==null){if(this._choiceElements.filter(o=>o.order>0).length>=r){this.choiceOrdering=!1;return}t.order=this._choiceElements.filter(o=>!!o.order).length+1,this.choiceOrdering=!1;return}else this._choiceElements.forEach(o=>(o.order>o.order&&o.order--,o)),t.order=null;this.choiceOrdering=!1}}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),o=t.getAttribute("shape"),n=r.split(",").map(a=>parseInt(a));re(o,n,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-choice-element-selected",this.setHotspotOrder),this.addEventListener("qti-register-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-choice-element-selected",this.setHotspotOrder),this.removeEventListener("qti-register-choice",this.positionHotspotOnRegister)}};qe.styles=[Di`
441
+ `}setHotspotOrder(i){let{identifier:e}=i.detail,t=this._choiceElements.find(s=>s.getAttribute("identifier")===e),r=this._choiceElements.length;if(!this.choiceOrdering){if(this.choiceOrdering=!0,t.order==null){if(this._choiceElements.filter(s=>s.order>0).length>=r){this.choiceOrdering=!1;return}t.order=this._choiceElements.filter(s=>!!s.order).length+1,this.choiceOrdering=!1;return}else this._choiceElements.forEach(s=>(s.order>s.order&&s.order--,s)),t.order=null;this.choiceOrdering=!1}}positionHotspotOnRegister(i){let e=this.querySelector("img"),t=i.target,r=t.getAttribute("coords"),s=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));re(s,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)}};Ce.styles=[$s`
322
442
  slot:not([name='prompt']) {
323
443
  position: relative; /* qti-hotspot-choice relative to the slot */
324
444
  display: block;
@@ -329,12 +449,12 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
329
449
  pointer-events: none;
330
450
  user-select: none;
331
451
  }
332
- `],qe=i([Ii("qti-graphic-order-interaction")],qe);import{css as Ui,html as Fi,LitElement as Bi}from"lit";import{customElement as Xi}from"lit/decorators.js";var Ce=class extends I(Bi,"qti-hotspot-choice"){render(){return Fi`
452
+ `],Ce=n([Os("qti-graphic-order-interaction")],Ce);import{css as Us,html as Fs,LitElement as Bs}from"lit";import{customElement as Xs}from"lit/decorators.js";var qe=class extends U(Bs,"qti-hotspot-choice"){render(){return Fs`
333
453
  <slot name="prompt"></slot>
334
454
  <!-- slot for the prompt -->
335
455
  <slot></slot>
336
456
  <!-- slot for the image and hotspots -->
337
- `}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),o=t.getAttribute("shape"),n=r.split(",").map(a=>parseInt(a));re(o,n,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-choice",this.positionHotspotOnRegister)}};Ce.styles=[Ui`
457
+ `}positionHotspotOnRegister(i){let e=this.querySelector("img"),t=i.target,r=t.getAttribute("coords"),s=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));re(s,o,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("register-qti-hotspot-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("register-qti-hotspot-choice",this.positionHotspotOnRegister)}};qe.styles=[Us`
338
458
  slot:not([name='prompt']) {
339
459
  position: relative; /* qti-hotspot-choice relative to the slot */
340
460
  display: block;
@@ -346,10 +466,10 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
346
466
  user-select: none;
347
467
  /* width:100%; */
348
468
  }
349
- `],Ce=i([Xi("qti-hotspot-interaction")],Ce);import{css as zi,html as _e,LitElement as Ji}from"lit";import{customElement as Zi,property as Gi,state as tr}from"lit/decorators.js";import{unsafeHTML as rr}from"lit/directives/unsafe-html.js";import{css as Yi,html as ji,LitElement as Ki}from"lit";import{customElement as Wi,property as At}from"lit/decorators.js";var B=class extends Ki{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 ji`
350
- <slot></slot>
351
- <slot name="qti-simple-associable-choice"></slot>
352
- `}};B.styles=Yi`
469
+ `],qe=n([Xs("qti-hotspot-interaction")],qe);import{html as Te,LitElement as Zs}from"lit";import{customElement as Js,property as Gs,state as nr}from"lit/decorators.js";import{unsafeHTML as ar}from"lit/directives/unsafe-html.js";import{css as Ys,html as js,LitElement as zs}from"lit";import{customElement as Ks,property as Rt}from"lit/decorators.js";var X=class extends M(zs,"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 js`
470
+ <slot part="slot"></slot>
471
+ <slot part="dropslot" name="qti-simple-associable-choice"></slot>
472
+ `}};X.styles=Ys`
353
473
  :host {
354
474
  display: flex;
355
475
  user-select: none;
@@ -361,56 +481,64 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
361
481
  slot[name='qti-simple-associable-choice'] {
362
482
  width: 100%;
363
483
  }
364
- `,i([At({type:Number,attribute:"match-min"})],B.prototype,"matchMin",2),i([At({type:Number,attribute:"match-max"})],B.prototype,"matchMax",2),i([At({type:Boolean,attribute:"fixed"})],B.prototype,"fixed",2),B=i([Wi("qti-simple-associable-choice")],B);var X=class extends H(Ji,"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,o=t.name,n=t.type;t.checked?(this.response?this.response.indexOf(r)===-1&&(n==="radio"&&(this.response=this.response.filter(a=>a.indexOf(o)===-1)),this.response=[...this.response,r]):this.response=[r],this.lastCheckedRadio=t):(this.response=this.response.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.response)?[...this.response]:this.response}}))}}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.response=[]}set correctResponse(e){if(e===""){this.correctOptions=[];return}else Array.isArray(e)&&(this.correctOptions=e)}render(){return this.classList.contains("qti-match-tabular")?_e`
484
+ `,n([Rt({type:Number,attribute:"match-min"})],X.prototype,"matchMin",2),n([Rt({type:Number,attribute:"match-max"})],X.prototype,"matchMax",2),n([Rt({type:Boolean,attribute:"fixed"})],X.prototype,"fixed",2),X=n([Ks("qti-simple-associable-choice")],X);import{css as Ws}from"lit";var or=Ws`
485
+ slot {
486
+ /* slot where the */
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 0.5rem;
490
+ align-items: flex-start; /* prevents the drag and drop container slots having the same height */
491
+ }
492
+ :host(.qti-choices-top) slot {
493
+ flex-direction: column;
494
+ }
495
+ :host(.qti-choices-bottom) slot {
496
+ flex-direction: column-reverse;
497
+ }
498
+ :host(.qti-choices-left) slot {
499
+ flex-direction: row;
500
+ }
501
+ :host(.qti-choices-right) slot {
502
+ flex-direction: row-reverse;
503
+ }
504
+ slot[name='prompt'] {
505
+ display: block;
506
+ }
507
+ ::slotted(qti-simple-match-set) {
508
+ /* Make sure the drag and drop container slots have the same width */
509
+ flex: 1;
510
+ }
511
+ `;var Y=class extends H(Zs,"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,s=t.name,o=t.type;t.checked?(this.response?this.response.indexOf(r)===-1&&(o==="radio"&&(this.response=this.response.filter(a=>a.indexOf(s)===-1)),this.response=[...this.response,r]):this.response=[r],this.lastCheckedRadio=t):(this.response=this.response.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.response)?[...this.response]:this.response}}))}}get response(){return this.classList.contains("qti-match-tabular")?this._response:super.response}set response(e){this.classList.contains("qti-match-tabular")?this._response=e:super.response=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.response=[]}set correctResponse(e){if(e===""){this.correctOptions=[];return}else Array.isArray(e)&&(this.correctOptions=e)}render(){return this.classList.contains("qti-match-tabular")?Te`
365
512
  <slot name="prompt"></slot>
366
513
  <table>
367
514
  <tr>
368
515
  <td></td>
369
- ${this.cols.map((e,t)=>_e`<th part="r-header">${rr(e.innerHTML)}</th>`)}
516
+ ${this.cols.map((e,t)=>Te`<th part="r-header">${ar(e.innerHTML)}</th>`)}
370
517
  </tr>
371
518
 
372
- ${this.rows.map((e,t)=>_e`<tr>
373
- <td part="c-header">${rr(e.innerHTML)}</td>
374
- ${this.cols.map((r,o)=>{let n=e.getAttribute("identifier"),a=r.getAttribute("identifier"),l=`${n} ${a}`,p=this.response.filter(f=>f.split(" ")[0]===n).length||0,d=this.response.includes(l),h=`rb ${d?"rb-checked":""} ${this.correctOptions.includes(l)?"rb-correct":""}`,m=this.correctOptions.length>0?!0:e.matchMax===1?!1:p>=e.matchMax&&!d;return _e`<td>
519
+ ${this.rows.map((e,t)=>Te`<tr>
520
+ <td part="c-header">${ar(e.innerHTML)}</td>
521
+ ${this.cols.map((r,s)=>{let o=e.getAttribute("identifier"),a=r.getAttribute("identifier"),l=`${o} ${a}`,p=this.response.filter(h=>h.split(" ")[0]===o).length||0,d=this.response.includes(l),u=`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 Te`<td>
375
522
  <input
376
523
  type=${e.matchMax===1?"radio":"checkbox"}
377
- part=${h}
378
- name=${n}
524
+ part=${u}
525
+ name=${o}
379
526
  value=${l}
380
- .disabled=${m}
381
- @change=${f=>this.handleRadioChange(f)}
382
- @click=${f=>e.matchMax===1?this.handleRadioClick(f):null}
527
+ .disabled=${g}
528
+ @change=${h=>this.handleRadioChange(h)}
529
+ @click=${h=>e.matchMax===1?this.handleRadioClick(h):null}
383
530
  />
384
531
  </td>`})}
385
532
  </tr>`)}
386
533
  </table>
387
- `:_e`<slot name="prompt"></slot> <slot></slot>`}};X.styles=[zi`
388
- :host {
389
- display: flex;
390
- flex-direction: column;
391
- gap: 0.5rem;
392
- }
393
-
394
- /* :host(.qti-choices-top) {
395
- flex-direction: column;
396
- } */
397
- :host(.qti-choices-bottom) {
398
- flex-direction: column-reverse;
399
- }
400
- :host(.qti-choices-left) {
401
- flex-direction: row;
402
- }
403
- :host(.qti-choices-right) {
404
- flex-direction: row-reverse;
405
- }
406
- `],i([tr()],X.prototype,"response",2),i([tr()],X.prototype,"correctOptions",2),i([Gi({type:String,attribute:"response-identifier"})],X.prototype,"responseIdentifier",2),X=i([Zi("qti-match-interaction")],X);import{css as Qi,html as eo}from"lit";import{customElement as to}from"lit/decorators.js";var ke=class extends g{constructor(){super();this.value=0}reset(){}validate(){return!0}set response(e){}static get properties(){return q(b({},g.properties),{step:{type:Number,attribute:"step",default:10}})}render(){return eo` <slot name="prompt"></slot>
407
- <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.toString())})}};ke.styles=[Qi``],ke=i([to("qti-media-interaction")],ke);import{css as ro,html as sr,LitElement as so}from"lit";import{customElement as io,property as oo,state as St}from"lit/decorators.js";import{unsafeHTML as no}from"lit/directives/unsafe-html.js";var O=class extends Ue(H(so,"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),sr` <slot name="prompt"> </slot>
534
+ `:Te`<slot name="prompt"></slot> <slot></slot>`}};Y.styles=or,n([nr()],Y.prototype,"_response",2),n([nr()],Y.prototype,"correctOptions",2),n([Gs({type:String,attribute:"response-identifier"})],Y.prototype,"responseIdentifier",2),Y=n([Js("qti-match-interaction")],Y);import{css as Qs,html as eo}from"lit";import{customElement as to}from"lit/decorators.js";var we=class extends f{constructor(){super();this.value=0}reset(){}validate(){return!0}set response(e){}static get properties(){return C(b({},f.properties),{step:{type:Number,attribute:"step",default:10}})}render(){return eo` <slot name="prompt"></slot>
535
+ <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.toString())})}};we.styles=[Qs``],we=n([to("qti-media-interaction")],we);import{css as ro,html as lr,LitElement as io}from"lit";import{customElement as so,property as oo,state as Mt}from"lit/decorators.js";import{unsafeHTML as no}from"lit/directives/unsafe-html.js";var I=class extends Ue(H(io,"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),lr` <slot name="prompt"> </slot>
408
536
  <div part="container">
409
537
  <slot part="drags"> </slot>
410
538
  <div part="drops">
411
- ${Array.from(Array(this.nrChoices)).map((t,r)=>sr`<drop-list part="drop-list" identifier="droplist${r}"></drop-list>${this.showCorrectResponses&&this.correctResponses.length>r?no(`<span part='correct-response'>${this.correctResponses[r]}</span>`):""}`)}
539
+ ${Array.from(Array(this.nrChoices)).map((t,r)=>lr`<drop-list part="drop-list" identifier="droplist${r}"></drop-list>${this.showCorrectResponses&&this.correctResponses.length>r?no(`<span part='correct-response'>${this.correctResponses[r]}</span>`):""}`)}
412
540
  </div>
413
- </div>`}set correctResponse(e){if(e===""){this.showCorrectResponses=!1;return}this.correctResponses.length===0&&(Array.isArray(e)?e:[e]).forEach((r,o)=>{let n=this.querySelector(`qti-simple-choice[identifier="${r}"]`);n||(n=this.shadowRoot.querySelector(`qti-simple-choice[identifier="${r}"]`));let a=n==null?void 0:n.textContent.trim();this.correctResponses=[...this.correctResponses,a]}),this.showCorrectResponses=!0}getResponse(){return Array.from(this.shadowRoot.querySelectorAll("drop-list")).map(r=>{let o=r.querySelectorAll('[qti-draggable="true"]');return[...Array.from(o).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"))}};O.styles=[ro`
541
+ </div>`}set correctResponse(e){if(e===""){this.showCorrectResponses=!1;return}this.correctResponses.length===0&&(Array.isArray(e)?e:[e]).forEach((r,s)=>{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 s=r.querySelectorAll('[qti-draggable="true"]');return[...Array.from(s).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"))}};I.styles=[ro`
414
542
  [part='drags'] {
415
543
  display: flex;
416
544
  align-items: flex-start;
@@ -458,7 +586,7 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
458
586
  :host(.qti-choices-right) [part='container'] {
459
587
  flex-direction: row-reverse;
460
588
  }
461
- `],i([St()],O.prototype,"nrChoices",2),i([St()],O.prototype,"correctResponses",2),i([St()],O.prototype,"showCorrectResponses",2),i([oo({type:String})],O.prototype,"orientation",2),O=i([io("qti-order-interaction")],O);import{LitElement as ao,css as lo,html as co}from"lit";var Je=class extends ao{render(){return co`<slot></slot>`}};Je.styles=[lo`
589
+ `],n([Mt()],I.prototype,"nrChoices",2),n([Mt()],I.prototype,"correctResponses",2),n([Mt()],I.prototype,"showCorrectResponses",2),n([oo({type:String})],I.prototype,"orientation",2),I=n([so("qti-order-interaction")],I);import{LitElement as ao,css as lo,html as co}from"lit";var Ze=class extends ao{render(){return co`<slot></slot>`}};Ze.styles=[lo`
462
590
  :host {
463
591
  display: block;
464
592
  }
@@ -469,23 +597,23 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
469
597
  left: 50%;
470
598
  transform: translateX(-50%);
471
599
  }
472
- `];customElements.define("qti-position-object-interaction",Je);import{LitElement as po,css as uo,html as mo}from"lit";import{customElement as ho}from"lit/decorators.js";var Te=class extends po{render(){return mo`<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)}};Te.styles=[uo`
600
+ `];customElements.define("qti-position-object-interaction",Ze);import{LitElement as po,css as uo,html as mo}from"lit";import{customElement as ho}from"lit/decorators.js";var Se=class extends po{render(){return mo`<slot></slot>`}constructor(){super(),this.removeMoveListener=this.removeMoveListener.bind(this),this.dragElementHandler=this.dragElementHandler.bind(this)}dragElementHandler(i){i.preventDefault();let e=i.clientX-this.startX,t=i.clientY-this.startY;this.dragElement.style.left=this.dragElement.offsetLeft+e+"px",this.dragElement.style.top=this.dragElement.offsetTop+t+"px",this.startX=i.clientX,this.startY=i.clientY}firstUpdated(i){super.firstUpdated(i),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(i){document.removeEventListener("mousemove",this.dragElementHandler,!0)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("mousemove",this.dragElementHandler),document.removeEventListener("mouseup",this.removeMoveListener)}};Se.styles=[uo`
473
601
  :host {
474
602
  display: inline-block;
475
603
  position: relative;
476
604
  }
477
- `],Te=i([ho("qti-position-object-stage")],Te);import{css as fo,html as ir}from"lit";import{customElement as go,property as or,state as bo}from"lit/decorators.js";import{repeat as vo}from"lit/directives/repeat.js";import{styleMap as yo}from"lit/directives/style-map.js";var Y=class extends g{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 ir` <slot name="prompt"></slot>
605
+ `],Se=n([ho("qti-position-object-stage")],Se);import{css as fo,html as cr}from"lit";import{customElement as go,property as pr,state as bo}from"lit/decorators.js";import{repeat as vo}from"lit/directives/repeat.js";import{styleMap as yo}from"lit/directives/style-map.js";var j=class extends f{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 cr` <slot name="prompt"></slot>
478
606
  <point-container>
479
- ${vo(this._points,e=>e,(e,t)=>ir`
607
+ ${vo(this._points,e=>e,(e,t)=>cr`
480
608
  <button
481
609
  part="point"
482
610
  style=${yo({position:"absolute",transform:"translate(-50%, -50%)",left:`${e.split(" ")[0]}px`,top:`${e.split(" ")[1]}px`})}
483
611
  aria-label="Remove point at ${e}"
484
- @click=${r=>{r.stopPropagation(),this._points=this._points.filter((o,n)=>n!==t),this.saveResponse(this._points)}}
612
+ @click=${r=>{r.stopPropagation(),this._points=this._points.filter((s,o)=>o!==t),this.saveResponse(this._points)}}
485
613
  ></button>
486
614
  `)}
487
615
  <slot></slot>
488
- </point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set response(e){this._points=Array.isArray(e)?e:[e]}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)}};Y.styles=[fo`
616
+ </point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set response(e){this._points=Array.isArray(e)?e:[e]}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=[fo`
489
617
  :host {
490
618
  display: block;
491
619
  }
@@ -493,68 +621,70 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
493
621
  display: block;
494
622
  position: relative;
495
623
  }
496
- `],i([or({type:Number,attribute:"max-choices"})],Y.prototype,"maxChoices",2),i([or({type:Number,attribute:"min-choices"})],Y.prototype,"minChoices",2),i([bo()],Y.prototype,"_points",2),Y=i([go("qti-select-point-interaction")],Y);import{css as xo,html as Ze,nothing as Lt}from"lit";import{customElement as Eo,property as se,query as nr}from"lit/decorators.js";var x=class extends g{constructor(){super();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}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>
624
+ `],n([pr({type:Number,attribute:"max-choices"})],j.prototype,"maxChoices",2),n([pr({type:Number,attribute:"min-choices"})],j.prototype,"minChoices",2),n([bo()],j.prototype,"_points",2),j=n([go("qti-select-point-interaction")],j);import{css as xo,html as Je,nothing as At}from"lit";import{customElement as Eo,property as ie,query as dr}from"lit/decorators.js";var E=class extends f{constructor(){super();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}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()),Je`<slot name="prompt"></slot>
497
625
  <div id="slider" part="slider">
498
- ${this.csLive.getPropertyValue("--show-bounds")=="true"?Ze`<div id="bounds" part="bounds">
626
+ ${this.csLive.getPropertyValue("--show-bounds")=="true"?Je`<div id="bounds" part="bounds">
499
627
  <div>${this._min}</div>
500
628
  <div>${this._max}</div>
501
- </div>`:Lt}
502
- ${this.csLive.getPropertyValue("--show-ticks")=="true"?Ze`<div id="ticks" part="ticks"></div>`:Lt}
629
+ </div>`:At}
630
+ ${this.csLive.getPropertyValue("--show-ticks")=="true"?Je`<div id="ticks" part="ticks"></div>`:At}
503
631
  <div id="rail" part="rail" @mousedown=${this._onMouseDown} @touchstart=${this._onTouchMove}>
504
632
  <div id="knob" part="knob">
505
- ${this.csLive.getPropertyValue("--show-value")=="true"?Ze`<div id="value" part="value">${this.value}</div>`:Lt}
633
+ ${this.csLive.getPropertyValue("--show-value")=="true"?Je`<div id="value" part="value">${this.value}</div>`:At}
506
634
  </div>
507
635
  </div>
508
- </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:o}=this.getPositionFromEvent(e),n=o-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(n),e.stopPropagation()}_onMouseDown(e){let t=n=>{let a=n.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(a),n.preventDefault(),n.stopPropagation()},r=()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",r),this.saveResponse(this.value.toString())};document.addEventListener("mousemove",t),document.addEventListener("mouseup",r);let o=e.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(o),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,o=r.touches[0]||r.changedTouches[0];t={x:o.pageX,y:o.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}};x.styles=[xo``],i([nr("#knob")],x.prototype,"_knob",2),i([nr("#rail")],x.prototype,"_rail",2),i([se({type:Number})],x.prototype,"value",2),i([se({type:Boolean,attribute:"step-label"})],x.prototype,"stepLabel",2),i([se({type:Boolean})],x.prototype,"reverse",2),i([se({type:Number,attribute:"lower-bound"})],x.prototype,"min",1),i([se({type:Number,attribute:"upper-bound"})],x.prototype,"max",1),i([se({type:Number,attribute:"step"})],x.prototype,"step",1),i([v("disabled",{waitUntilFirstUpdate:!0})],x.prototype,"_handleDisabledChange",2),i([v("readonly",{waitUntilFirstUpdate:!0})],x.prototype,"_handleReadonlyChange",2),x=i([Eo("qti-slider-interaction")],x);import{consume as qo}from"@lit/context";import{LitElement as Co,html as _o}from"lit";import{customElement as ko,state as To}from"lit/decorators.js";var we=class extends Co{render(){return _o`<slot @slotchange=${this.handleSlotChange}></slot>`}handleSlotChange(s){var t,r,o;let e=Array.from((r=(t=this.firstElementChild)==null?void 0:t.childNodes)!=null?r:[]).find(n=>n.nodeType===Node.COMMENT_NODE);try{this.operatorFunction=new Function("context","fn","item",(o=e.textContent)!=null?o:"")}catch(n){console.error("custom-operator contains invalid javascript code",n)}}calculate(){let s={variable:t=>{var r,o,n;return(n=(o=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:o.value)!=null?n:""},correct:t=>{var r,o,n;return(n=(o=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:o.correctResponse)!=null?n:""}},e={getVariable:t=>{var r;return(r=this._context)==null?void 0:r.variables.find(o=>o.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)}};i([qo({context:A,subscribe:!0}),To()],we.prototype,"_context",2),we=i([ko("qti-custom-operator")],we);import{LitElement as wo,css as Ro,html as Ao}from"lit";import{customElement as So}from"lit/decorators.js";var Re=class extends wo{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-hotspot",{bubbles:!0,cancelable:!1,composed:!0}))}render(){return Ao` <slot name="qti-gap-img"></slot> `}};Re.styles=Ro`
636
+ </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:s}=this.getPositionFromEvent(e),o=s-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 s=e.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(s),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,s=r.touches[0]||r.changedTouches[0];t={x:s.pageX,y:s.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}};E.styles=[xo``],n([dr("#knob")],E.prototype,"_knob",2),n([dr("#rail")],E.prototype,"_rail",2),n([ie({type:Number})],E.prototype,"value",2),n([ie({type:Boolean,attribute:"step-label"})],E.prototype,"stepLabel",2),n([ie({type:Boolean})],E.prototype,"reverse",2),n([ie({type:Number,attribute:"lower-bound"})],E.prototype,"min",1),n([ie({type:Number,attribute:"upper-bound"})],E.prototype,"max",1),n([ie({type:Number,attribute:"step"})],E.prototype,"step",1),n([x("disabled",{waitUntilFirstUpdate:!0})],E.prototype,"_handleDisabledChange",2),n([x("readonly",{waitUntilFirstUpdate:!0})],E.prototype,"_handleReadonlyChange",2),E=n([Eo("qti-slider-interaction")],E);import{consume as Co}from"@lit/context";import{LitElement as qo,html as To}from"lit";import{customElement as wo,state as So}from"lit/decorators.js";var ke=class extends qo{render(){return To`<slot @slotchange=${this.handleSlotChange}></slot>`}handleSlotChange(i){var t,r,s;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",(s=e.textContent)!=null?s:"")}catch(o){console.error("custom-operator contains invalid javascript code",o)}}calculate(){let i={variable:t=>{var r,s,o;return(o=(s=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:s.value)!=null?o:""},correct:t=>{var r,s,o;return(o=(s=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:s.correctResponse)!=null?o:""}},e={getVariable:t=>{var r;return(r=this._context)==null?void 0:r.variables.find(s=>s.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,i,e)}};n([Co({context:R,subscribe:!0}),So()],ke.prototype,"_context",2),ke=n([wo("qti-custom-operator")],ke);import{LitElement as ko,css as Lo,html as Ro}from"lit";import{customElement as Mo}from"lit/decorators.js";var Le=class extends ko{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-hotspot",{bubbles:!0,cancelable:!1,composed:!0}))}render(){return Ro` <slot name="qti-gap-img"></slot> `}};Le.styles=Lo`
509
637
  :host {
510
638
  display: flex;
511
639
  user-select: none;
512
640
  position: absolute;
513
641
  }
514
- `,Re=i([So("qti-associable-hotspot")],Re);import{css as Lo,html as Mo,LitElement as No}from"lit";import{customElement as Ho,property as Vo}from"lit/decorators.js";var ie=class extends No{constructor(){super(...arguments);this.tabindex=0}render(){return Mo` <slot name="qti-gap-text"></slot>`}};ie.styles=Lo`
642
+ `,Le=n([Mo("qti-associable-hotspot")],Le);import{css as Ao,html as _o,LitElement as Do}from"lit";import{customElement as Ho,property as No}from"lit/decorators.js";var se=class extends Do{constructor(){super(...arguments);this.tabindex=0}render(){return _o` <slot name="qti-gap-text"></slot>`}};se.styles=Ao`
515
643
  :host {
516
644
  display: flex;
517
645
  user-select: none;
518
646
  }
519
- `,i([Vo({type:Number,reflect:!0})],ie.prototype,"tabindex",2),ie=i([Ho("qti-gap")],ie);import{css as $o,LitElement as Do}from"lit";import{customElement as Oo,property as Po}from"lit/decorators.js";var oe=class extends Do{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){this.setAttribute("slot","qti-gap-img")}};oe.styles=$o`
647
+ `,n([No({type:Number,reflect:!0})],se.prototype,"tabindex",2),se=n([Ho("qti-gap")],se);import{css as Vo,LitElement as $o}from"lit";import{customElement as Po,property as Io}from"lit/decorators.js";var oe=class extends $o{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){this.setAttribute("slot","qti-gap-img")}};oe.styles=Vo`
520
648
  :host {
521
649
  display: flex;
522
650
  user-select: none;
523
651
  }
524
- `,i([Po({type:Number,reflect:!0})],oe.prototype,"tabindex",2),oe=i([Oo("qti-gap-img")],oe);import{css as Io,html as Uo,LitElement as Fo}from"lit";import{customElement as Bo,property as Xo}from"lit/decorators.js";var ne=class extends Fo{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-gap-text")}render(){return Uo`<slot></slot>`}};ne.styles=Io`
652
+ `,n([Io({type:Number,reflect:!0})],oe.prototype,"tabindex",2),oe=n([Po("qti-gap-img")],oe);import{css as Oo,html as Uo,LitElement as Fo}from"lit";import{customElement as Bo,property as Xo}from"lit/decorators.js";var ne=class extends M(Fo,"qti-gap-text"){constructor(){super(...arguments);this.tabindex=0}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-gap-text")}render(){return Uo`<slot></slot>`}};ne.styles=Oo`
525
653
  :host {
526
654
  display: inline-flex;
527
655
  user-select: none;
528
656
  }
529
- `,i([Xo({type:Number,reflect:!0})],ne.prototype,"tabindex",2),ne=i([Bo("qti-gap-text")],ne);import{css as Yo}from"lit";import{customElement as jo,property as Ko}from"lit/decorators.js";var ae=class extends E{};ae.styles=Yo`
657
+ `,n([Xo({type:Number,reflect:!0})],ne.prototype,"tabindex",2),ne=n([Bo("qti-gap-text")],ne);import{css as Yo,LitElement as jo}from"lit";import{customElement as zo,property as Ko}from"lit/decorators.js";var ae=class extends M(jo,"qti-hotspot-choice"){};ae.styles=Yo`
530
658
  :host {
531
659
  display: flex;
532
660
  user-select: none;
533
661
  position: absolute;
534
662
  }
535
- `,i([Ko({attribute:"aria-ordervalue",type:Number,reflect:!0})],ae.prototype,"order",2),ae=i([jo("qti-hotspot-choice")],ae);import{css as Wo,html as zo}from"lit";import{customElement as Jo}from"lit/decorators.js";var Ae=class extends E{render(){return zo`<div part="ch"><div part="cha"></div></div>
536
- <slot></slot> `}};Ae.styles=Wo`
663
+ `,n([Ko({attribute:"aria-ordervalue",type:Number,reflect:!0})],ae.prototype,"order",2),ae=n([zo("qti-hotspot-choice")],ae);import{css as Wo,html as Zo,LitElement as Jo}from"lit";import{customElement as Go}from"lit/decorators.js";var Re=class extends M(Jo,"qti-hottext"){render(){return Zo`<div part="ch"><div part="cha"></div></div>
664
+ <slot></slot> `}};Re.styles=Wo`
537
665
  :host {
538
666
  display: flex;
539
667
  user-select: none;
540
668
  }
541
- `,Ae=i([Jo("qti-hottext")],Ae);import{css as Zo,html as Go,LitElement as Qo}from"lit";import{customElement as en,property as tn}from"lit/decorators.js";var Se=class extends Qo{static get styles(){return[Zo`
669
+ `,Re=n([Go("qti-hottext")],Re);import{css as Qo,html as en,LitElement as tn}from"lit";import{customElement as rn,property as sn}from"lit/decorators.js";var Me=class extends tn{static get styles(){return[Qo`
542
670
  :host {
543
671
  display: block;
544
672
  cursor: pointer;
545
673
  }
546
- `]}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 Go` <slot></slot> `}_onSelectInlineChoice(){this.dispatchEvent(new CustomEvent("qti-inline-choice-select",{bubbles:!0,cancelable:!1,composed:!0,detail:{identifier:this.identifier}}))}};i([tn({type:String})],Se.prototype,"identifier",2),Se=i([en("qti-inline-choice")],Se);import{css as rn,html as ar,nothing as sn}from"lit";import{customElement as on,property as nn}from"lit/decorators.js";var le=class extends E{render(){return ar`<div part="ch">
674
+ `]}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 en` <slot></slot> `}_onSelectInlineChoice(){this.dispatchEvent(new CustomEvent("qti-inline-choice-select",{bubbles:!0,cancelable:!1,composed:!0,detail:{identifier:this.identifier}}))}};n([sn({type:String})],Me.prototype,"identifier",2),Me=n([rn("qti-inline-choice")],Me);import{css as on,html as ur,LitElement as nn,nothing as an}from"lit";import{customElement as ln,property as cn}from"lit/decorators.js";var le=class extends M(nn,"qti-simple-choice"){render(){return ur`<div part="ch">
547
675
  <div part="cha"></div>
548
676
  </div>
549
- ${this.marker?ar`<div id="label">${this.marker}</div>`:sn}
550
- <slot part="slot"></slot> `}};le.styles=rn`
677
+ ${this.marker?ur`<div id="label">${this.marker}</div>`:an}
678
+ <slot part="slot"></slot> `}};le.styles=on`
551
679
  :host {
552
680
  display: flex;
681
+ align-items: center;
553
682
  user-select: none;
554
683
  }
555
684
  slot {
556
685
  width: 100%;
557
- display: block;
686
+ display: flex;
687
+ align-items: center;
558
688
  }
559
689
  [part='ch'] {
560
690
  display: flex;
@@ -562,5 +692,5 @@ import{a as b,b as q,c as i,d as Nt}from"../chunk-H4VLZ2F7.js";import{provide as
562
692
  align-items: center;
563
693
  justify-content: center;
564
694
  }
565
- `,i([nn({type:String,attribute:!1})],le.prototype,"marker",2),le=i([on("qti-simple-choice")],le);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{g as Interaction,ve as QtPrintedVariable,Be as QtiAnd,C as QtiAssessmentItem,z as QtiAssessmentStimulusRef,Re as QtiAssociableHotspot,ee as QtiAssociateInteraction,Xe as QtiBaseValue,E as QtiChoice,Z as QtiChoiceInteraction,He as QtiCompanionMaterialsInfo,w as QtiConditionExpression,ct as QtiContains,Ve as QtiContentBody,pt as QtiCorrect,V as QtiCustomInteraction,we as QtiCustomOperator,te as QtiEndAttemptInteraction,je as QtiEqual,Ye as QtiEqualRounded,u as QtiExpression,M as QtiExtendedTextInteraction,ue as QtiFeedbackBlock,me as QtiFeedbackInline,ie as QtiGap,oe as QtiGapImg,xe as QtiGapMatchInteraction,ne as QtiGapText,$ as QtiGraphicAssociateInteraction,Ee as QtiGraphicGapMatchInteraction,qe as QtiGraphicOrderInteraction,dt as QtiGt,ut as QtiGte,ae as QtiHotspotChoice,Ce as QtiHotspotInteraction,Ae as QtiHottext,Ie as QtiHottextInteraction,Se as QtiInlineChoice,U as QtiInlineChoiceInteraction,mt as QtiIsNull,Fe as QtiLookupOutcomeValue,ht as QtiLt,ft as QtiLte,Ke as QtiMapResponse,G as QtiMapping,bt as QtiMatch,X as QtiMatchInteraction,ke as QtiMediaInteraction,vt as QtiMember,he as QtiModalFeedback,yt as QtiMultiple,xt as QtiNot,Et as QtiOr,O as QtiOrderInteraction,qt as QtiOrdered,S as QtiOutcomeDeclaration,fe as QtiOutcomeProcessing,it as QtiOutcomeProcessingProcessor,F as QtiPortableCustomInteraction,Te as QtiPositionObjectStage,Ct as QtiProduct,Le as QtiPrompt,ot as QtiResponseCondition,D as QtiResponseDeclaration,ge as QtiResponseElse,lt as QtiResponseElseIf,be as QtiResponseIf,K as QtiResponseProcessing,L as QtiRubricBlock,N as QtiRule,Je as QtiSPositionObjectInteraction,Y as QtiSelectPointInteraction,nt as QtiSetOutcomeValue,at as QtiSetOutcomeValueRule,B as QtiSimpleAssociableChoice,le as QtiSimpleChoice,x as QtiSliderInteraction,We as QtiStringMatch,Me as QtiStylesheet,_t as QtiSum,kt as QtiSumExpression,T as QtiTextEntryInteraction,Tt as QtiVariable,A as itemContext,Ht as itemContextVariables,Qs as qtiAndMixin};
566
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcmVzcG9uc2UtY29uZGl0aW9uL3F0aS1yZXNwb25zZS1jb25kaXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktc2V0LW91dGNvbWUtdmFsdWUvcXRpLXNldC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWVsc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL3F0aS1hbmQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWJhc2V2YWx1ZS9xdGktYmFzZXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbnRhaW5zL3F0aS1jb250YWlucy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb3JyZWN0L3F0aS1jb3JyZWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsLXJvdW5kZWQvcXRpLWVxdWFsLXJvdW5kZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwvcXRpLWVxdWFsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0L3F0aS1ndC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndGUvcXRpLWd0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1pcy1udWxsL3F0aS1pcy1udWxsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0L3F0aS1sdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdGUvcXRpLWx0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXAtcmVzcG9uc2UvcXRpLW1hcC1yZXNwb25zZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hdGNoL3F0aS1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tZW1iZXIvcXRpLW1lbWJlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbm90L3F0aS1ub3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3IvcXRpLW9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yZGVyZWQvcXRpLW9yZGVyZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJpbnRlZC12YXJpYWJsZS9xdGktcHJpbnRlZC12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcm9kdWN0L3F0aS1wcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN0cmluZy1tYXRjaC9xdGktc3RyaW5nLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN1bS9xdGktc3VtLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXZhcmlhYmxlL3F0aS12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHByb3ZpZGUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHMsIE91dGNvbWVDaGFuZ2VkRGV0YWlscyB9IGZyb20gJy4uL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVWYWx1ZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUsIFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2snO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFF0aVJlc3BvbnNlUHJvY2Vzc2luZyB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCwgaXRlbUNvbnRleHRWYXJpYWJsZXMgfSBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICAvLyBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2NvbnRleHQ6IEl0ZW1Db250ZXh0ID0ge1xuICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyksXG4gICAgdmFyaWFibGVzOiBpdGVtQ29udGV4dFZhcmlhYmxlc1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdmFyaWFibGVzKCk6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHtcbiAgICAgIGlkZW50aWZpZXI6IHYuaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB2LnZhbHVlLFxuICAgICAgdHlwZTogdi50eXBlLFxuICAgICAgLy8gYWRkIGV4dGVybmFsc2NvcmVkLCBhIGZpeGVkIHByb3AgdG8gdGhlIHRlc3QsIHNvIHRoZSB0ZXN0Y29udGV4dCBjYW4gcmVhZCBhbmQgZGVjaWRlIGhvdyB0byBzY29yZSB0aGlzIGl0ZW1cbiAgICAgIC4uLih2LnR5cGUgPT09ICdvdXRjb21lJyAmJiB2LmlkZW50aWZpZXIgPT09ICdTQ09SRSdcbiAgICAgICAgPyB7IGV4dGVybmFsU2NvcmVkOiAodiBhcyBPdXRjb21lVmFyaWFibGUpLmV4dGVybmFsU2NvcmVkIH1cbiAgICAgICAgOiB7fSlcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZhcmlhYmxlcyh2YWx1ZTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLnNvbWUodiA9PiAhKCdpZGVudGlmaWVyJyBpbiB2KSkpIHtcbiAgICAgIGNvbnNvbGUud2FybigndmFyaWFibGVzIHByb3BlcnR5IHNob3VsZCBiZSBhbiBhcnJheSBvZiBWYXJpYWJsZURlY2xhcmF0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnJlc3BvbnNlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5yZXNwb25zZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIGUgPT4ge1xuICAgICAgdGhpcy5fY29udGV4dCA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiBbLi4udGhpcy5fY29udGV4dC52YXJpYWJsZXMsIGUuZGV0YWlsLnZhcmlhYmxlXSB9O1xuICAgICAgdGhpcy5faW5pdGlhbENvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIChlOiBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4pID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBmZWVkYmFja0VsZW1lbnQgPSBlLmRldGFpbDtcbiAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMucHVzaChmZWVkYmFja0VsZW1lbnQpO1xuICAgICAgZmVlZGJhY2tFbGVtZW50LmNoZWNrU2hvd0ZlZWRiYWNrKGZlZWRiYWNrRWxlbWVudC5vdXRjb21lSWRlbnRpZmllcik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCAoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLnB1c2goZS50YXJnZXQgYXMgSW50ZXJhY3Rpb24pO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZW5kLWF0dGVtcHQnLCAoZTogQ3VzdG9tRXZlbnQ8eyByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZzsgY291bnRBdHRlbXB0OiBib29sZWFuIH0+KSA9PiB7XG4gICAgICBjb25zdCB7IHJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0IH0gPSBlLmRldGFpbDtcbiAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZUlkZW50aWZpZXIsICd0cnVlJyk7XG4gICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShjb3VudEF0dGVtcHQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgLy8gd29yZHQgYWFuZ2Vyb2VwZW4gdmFudWl0IGRlIHByb2Nlc3Npbmd0ZW1wbGF0ZVxuICAgICAgJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsXG4gICAgICAoZTogQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4pID0+IHtcbiAgICAgICAgY29uc3QgeyBvdXRjb21lSWRlbnRpZmllciwgdmFsdWUgfSA9IGUuZGV0YWlsO1xuICAgICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZShvdXRjb21lSWRlbnRpZmllciwgdmFsdWUpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHRoaXMuaGFuZGxlVXBkYXRlUmVzcG9uc2VWYXJpYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NvcnJlY3RSZXNwb25zZShzaG93OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZXMgPSB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maWx0ZXIoXG4gICAgICAodmFyaTogUmVzcG9uc2VWYXJpYWJsZSB8IE91dGNvbWVWYXJpYWJsZSkgPT4gJ2NvcnJlY3RSZXNwb25zZScgaW4gdmFyaSAmJiB2YXJpLmNvcnJlY3RSZXNwb25zZVxuICAgICkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHJlc3BvbnNlcyA9IHJlc3BvbnNlVmFyaWFibGVzLm1hcChjciA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IGNyLmlkZW50aWZpZXIsXG4gICAgICAgIHJlc3BvbnNlOiBjci5jb3JyZWN0UmVzcG9uc2VcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCByZXNwb25zZSBvZiByZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgaSA9PiBpLmdldEF0dHJpYnV0ZSgncmVzcG9uc2UtaWRlbnRpZmllcicpID09PSByZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXJcbiAgICAgICk7XG4gICAgICBpbnRlcmFjdGlvbiAmJiAoaW50ZXJhY3Rpb24uY29ycmVjdFJlc3BvbnNlID0gc2hvdyA/IHJlc3BvbnNlLnJlc3BvbnNlIDogJycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzUmVzcG9uc2UoY291bnROdW1BdHRlbXB0czogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXNwb25zZVByb2Nlc3NvciA9IHRoaXMucXVlcnlTZWxlY3RvcjxRdGlSZXNwb25zZVByb2Nlc3Npbmc+KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpO1xuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2UgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHdlYmNvbXBvbmVudHMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG5cbiAgICBjb3VudE51bUF0dGVtcHRzICYmXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZShcbiAgICAgICAgJ251bUF0dGVtcHRzJyxcbiAgICAgICAgKCt0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSAnbnVtQXR0ZW1wdHMnKT8udmFsdWUgKyAxKS50b1N0cmluZygpXG4gICAgICApO1xuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KHByb3RvOiBFbGVtQ2xhc3MsIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+KSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KCdpdGVtJyk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQW5kQXBwZW5kU3RpbXVsdXMoc3RpbXVsdXNSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTdGltdWx1cyB3aXRoIGRhdGEtc3RpbXVsdXMtaWRyZWYgJHt0aGlzLmlkZW50aWZpZXJ9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgKiBAcGFyYW0gc3RpbXVsdXNSZWYgLSBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgc3RpbXVsdXMgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkQW5kQXBwZW5kU3RpbXVsdXMoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkucGF0aChwYXRoKS5odG1sZG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykgeyAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmFwcGVuZCguLi5lbGVtZW50cyk7ICAgICAgXG4gICAgICBjb25zdCB0aXRsZSA9IChzdGltdWx1cy5xdWVyeVNlbGVjdG9yKCdxdGktYXNzZXNzbWVudC1zdGltdWx1cycpIGFzIEhUTUxFbGVtZW50KT8udGl0bGU7XG4gICAgICBpZiAodGl0bGUuaW5jbHVkZXMoJyhsaWpzdCknKSkge1xuICAgICAgICBzdGltdWx1c1JlZi5jbGFzc0xpc3QuYWRkKCdxdGktc3RpbXVsdXMtbGlzdCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuY29uc3QgS0VZQ09ERSA9IHtcbiAgU1BBQ0U6IDMyXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IHF0aS1jaG9pY2UgaXMgdXNlZCBieSBxdGktc2ltcGxlLWNob2ljZSwgcXRpLWlubGluZS1jaG9pY2UsIHF0aS1ob3R0ZXh0LCBxdGktaG90c3BvdC1jaG9pY2UuXG4gKlxuICogQHNpbmNlIDEuMFxuICogQHN0YXR1cyBzdGFibGVcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWNob2ljZSAtIHJlZ2lzdGVyIGl0c2VsdmVzIG9uIGEgcXRpLWNob2ljZS1pbnRlcmFjdGlvbiBlbGVtZW50LlxuICogQGV2ZW50IHF0aS1sb29zZS1jaG9pY2UgLSBkZS1yZWdpc3RlciBpdHNlbHZlcyBvbiBhIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb24gZWxlbWVudC5cbiAqIEBldmVudCBxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQgLSBFbWl0dGVkIHdoZW4gdGhlIGNob2ljZSBpcyBzZWxlY3RlZC5cbiAqXG4gKiBAc2xvdCAtIFRoZSBjaG9pY2VzIHNsb3QgZWxlbWVudFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtY2hlY2tlZCcsXG4gICAgY29udmVydGVyOiB7XG4gICAgICB0b0F0dHJpYnV0ZTogdmFsdWUgPT4gdmFsdWVcbiAgICB9XG4gIH0pXG4gIGNoZWNrZWQgPSBmYWxzZTtcblxuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVEaXNhYmxlZENoYW5nZShfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy50YWJpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWNob2ljZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktbG9vc2UtY2hvaWNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIEtFWUNPREUuU1BBQ0U6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUNoZWNrZWQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25DbGljaygpIHtcbiAgICB0aGlzLl90b2dnbGVDaGVja2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciwgY2hlY2tlZDogdGhpcy5jaGVja2VkIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UnOiBRdGlDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWl0ZW0tYm9keS5zdHlsZXMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1pdGVtLWJvZHkgbm9kZSBjb250YWlucyB0aGUgdGV4dCwgZ3JhcGhpY3MsIG1lZGlhIG9iamVjdHMgYW5kIGludGVyYWN0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBpdGVtJ3MgY29udGVudCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IGlzIHN0cnVjdHVyZWQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnNwaHBvNmx1NnpxaVxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAc2xvdCAtIGl0ZW0gYm9keSBjb250ZW50LlxuICogQHNsb3QgcXRpLXJ1YnJpYy1ibG9jayAtIHRoZSBxdGkgcnVicmljIGJsb2NrIGlzIHBsYWNlZCBhYm92ZSB0aGUgaXRlbVxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pdGVtLWJvZHknKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpSXRlbUJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJxdGktcnVicmljLWJsb2NrXCI+PC9zbG90PjxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pdGVtLWJvZHknOiBRdGlJdGVtQm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbkBjdXN0b21FbGVtZW50KCdxdGktcHJvbXB0JylcbmV4cG9ydCBjbGFzcyBRdGlQcm9tcHQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gaWYgcHJvbXB0cyBhcmUgaW4gaW50ZXJhY3Rpb25zIHRoZXkgc2hvdWxkIGhhdmUgYSBzbG90LCBzbyB0aGUgcHJvbXB0IGhhcyB0byBnbyB0aGVyZVxuICAgIC8vIGlmIHByb21wdCBpcyBpbiB0aGUgYm9keSwgdGhlbiBqdXN0IGRpc3BsYXkgdGhlIHByb21wdCB0aGVyZS5cbiAgICAvLyBBIGJldHRlciBjaGVjayB3b3VsZCBiZSB0aGUgbGF0dGVyLCBidXQgbm90IGNhbid0IGdldCB0aHJvdWdoIHRoZSBzaGFkb3dyb290IHRvIGZpbmQgdGhlIHNsb3RcbiAgICBjb25zdCBpbkludGVyYWN0aW9uID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUuZW5kc1dpdGgoJ0lOVEVSQUNUSU9OJyk7XG4gICAgaW5JbnRlcmFjdGlvbiAmJiB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcm9tcHQnKTtcbiAgICAvLyBjb25zdCBwcm9tcHRTbG90ID0gdGhpcy5wYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIltuYW1lPSdwcm9tcHQnXVwiKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcHJvbXB0JzogUXRpUHJvbXB0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXN0eWxlc2hlZXQnKVxuZXhwb3J0IGNsYXNzIFF0aVN0eWxlc2hlZXQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdHlsZUxpbms6IEhUTUxTdHlsZUVsZW1lbnQgfCBIVE1MTGlua0VsZW1lbnQ7XG5cbiAgLy8gcHJvdGVjdGVkIGNyZWF0ZVJlbmRlclJvb3QoKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHtcbiAgLy8gICByZXR1cm4gdGhpcztcbiAgLy8gfVxuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBpdGVtID0gdGhpcztcbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBzdHlsZXMucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICBzdHlsZXMuaHJlZiA9IGxpbms7XG4gICAgICBpdGVtLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB0aGlzLnN0eWxlTGluayA9IHN0eWxlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgc3R5bGVzLnRleHRDb250ZW50ID0gdGhpcy50ZXh0Q29udGVudDtcbiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIHRoaXMuc3R5bGVMaW5rID0gc3R5bGVzO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLnN0eWxlTGluaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHlsZUxpbmsucmVtb3ZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZygnY291bGQgbm90IHJlbW92ZSBzdHlsZXNoZWV0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zdHlsZXNoZWV0JzogUXRpU3R5bGVzaGVldDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdleHRlcm5hbC1zY29yZWQnIH0pIGV4dGVybmFsU2NvcmVkOiAnaHVtYW4nIHwgJ2V4dGVybmFsTWFjaGluZScgfCBudWxsID0gbnVsbDtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgZ2V0IGludGVycG9sYXRpb25UYWJsZSgpOiBNYXA8bnVtYmVyLCBudW1iZXI+IHwgbnVsbCB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlJyk7XG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGFibGUucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKSkge1xuICAgICAgICBpZiAoIWVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbWlzc2luZyBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSk7XG4gICAgICAgIGlmIChpc05hTihzb3VyY2VWYWx1ZSkgfHwgaXNOYU4odGFyZ2V0VmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBub3QgYSBudW1iZXIgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyaWVzLnNldChzb3VyY2VWYWx1ZSwgdGFyZ2V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlOiBPdXRjb21lVmFyaWFibGUgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSxcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgdHlwZTogJ291dGNvbWUnLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBpbnRlcnBvbGF0aW9uVGFibGU6IHRoaXMuaW50ZXJwb2xhdGlvblRhYmxlLFxuICAgICAgZXh0ZXJuYWxTY29yZWQ6IHRoaXMuZXh0ZXJuYWxTY29yZWRcbiAgICB9O1xuICAgIG91dGNvbWVWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhvdXRjb21lVmFyaWFibGUpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiBvdXRjb21lVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJzogUXRpT3V0Y29tZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwpO1xuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzWzBdO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJzogUXRpVmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgSXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLi9pbnRlcm5hbC91dGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlGZWVkYmFjayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Nob3ctaGlkZScgfSlcbiAgcHJvdGVjdGVkIHNob3dIaWRlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdvdXRjb21lLWlkZW50aWZpZXInIH0pXG4gIHB1YmxpYyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwcm90ZWN0ZWQgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2hvd1N0YXR1czogc3RyaW5nO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gKHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtKS5nZXRPdXRjb21lKG91dGNvbWVJZGVudGlmaWVyKTtcblxuICAgIGlmICh0aGlzLm91dGNvbWVJZGVudGlmaWVyICE9PSBvdXRjb21lSWRlbnRpZmllciB8fCAhb3V0Y29tZVZhcmlhYmxlKSByZXR1cm47XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRjb21lVmFyaWFibGUudmFsdWUpKSB7XG4gICAgICBpc0ZvdW5kID0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlLmluY2x1ZGVzKHRoaXMuaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRm91bmQgPVxuICAgICAgICAoIUlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAhSXNOdWxsT3JVbmRlZmluZWQob3V0Y29tZVZhcmlhYmxlPy52YWx1ZSkgJiZcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPT09IG91dGNvbWVWYXJpYWJsZS52YWx1ZSkgfHxcbiAgICAgICAgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZGJhY2soaXNGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikgeyAgICBcbiAgICB0aGlzLnNob3dTdGF0dXMgPSAodmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ3Nob3cnKSB8fCAoIXZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdoaWRlJykgPyAnb24nIDogJ29mZic7ICAgIFxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoMC4xKS5yZXBsYWNlKC9cXGQvZywgJycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0ID0gKG51bWJlcjogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gIC8vIGNoZWNrIGlmIHR5cGUgaXMgc3RyaW5nXG4gIGlmICh0eXBlb2YgbnVtYmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgY29uc3QgZFNlcCA9IGRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgaWYgKGRTZXAgPT09ICcuJykge1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKGRTZXAsICcuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBJc051bGxPclVuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWlubGluZScpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tJbmxpbmUgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWlubGluZSc6IFF0aUZlZWRiYWNrSW5saW5lO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbW9kYWwtZmVlZGJhY2snKVxuZXhwb3J0IGNsYXNzIFF0aU1vZGFsRmVlZGJhY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1vZGFsLWZlZWRiYWNrJzogUXRpTW9kYWxGZWVkYmFjaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVmLCBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gcHVibGljIHN0YXRpYyByb3dIZWlnaHRDbGFzcyA9IFtdO1xuXG4gIHRleHRhcmVhUmVmID0gY3JlYXRlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCk7XG5cbiAgLyoqIGV4cGVjdGVkIGxlbmd0aCBpcyBtYXBwZWQgdG8gdGhlIHByb3BlcnR5IG1heGxlbmd0aCBvbiB0aGUgdGV4dGFyZWEgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgLyoqIHRleHQgYXBwZWFyaW5nIGluIHRoZSBleHRlbmRlZC10ZXh0LW50ZXJhY3Rpb24gaWYgaXQgaXMgZW1wdHkgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuY2xhc3NOYW1lcy5zcGxpdCgnICcpO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcycpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaGVpZ2h0LWxpbmVzLScsICcnKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dGFyZWFSZWYpIHtcbiAgICAgICAgICB0aGlzLnRleHRhcmVhUmVmLnZhbHVlLnJvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHJlc3BvbnNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJyc7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICAke3JlZih0aGlzLnRleHRhcmVhUmVmKX1cbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgIGlmICghaW5wdXQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFzZXQucGF0dGVybm1hc2tNZXNzYWdlIHx8ICdJbnZhbGlkIGlucHV0Jyk7XG4gICAgICAgICAgICBpbnB1dC5yZXBvcnRWYWxpZGl0eSgpOyAvLyBTaG93IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpOyAvLyBDbGVhciB0aGUgY3VzdG9tIHZhbGlkaXR5IG1lc3NhZ2VcbiAgICAgICAgICB9XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBtYXhsZW5ndGg9XCIke2lmRGVmaW5lZCh0aGlzLmV4cGVjdGVkTGVuZ3RoID8gdGhpcy5leHBlY3RlZExlbmd0aCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgcGF0dGVybj1cIiR7aWZEZWZpbmVkKHRoaXMucGF0dGVybk1hc2sgPyB0aGlzLnBhdHRlcm5NYXNrIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAgIC52YWx1ZT0ke3RoaXMuX3ZhbHVlfVxuICAgICAgPjwvdGV4dGFyZWE+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nOiBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBhYnN0cmFjdCB2YWxpZGF0ZSgpOiBib29sZWFuO1xuICBhYnN0cmFjdCBzZXQgcmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pO1xuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbDogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgY29uc29sZS53YXJuKCdjb3JyZWN0UmVzcG9uc2UgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvcnJlY3RWYWx1ZSA9ICcnO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3NpemUgPSA1O1xuXG4gIGlucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdxdGktaW5wdXQtd2lkdGgnKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWlucHV0LXdpZHRoLScsICcnKTtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IHBhcnNlSW50KG5yUm93cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJyc7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICBbcGFydD0nY29ycmVjdCddIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29ycmVjdFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKCFpbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YXNldC5wYXR0ZXJubWFza01lc3NhZ2UgfHwgJ0ludmFsaWQgaW5wdXQnKTtcbiAgICAgICAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7IC8vIFNob3cgdGhlIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gdmFsaWRpdHkgbWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBzaXplPVwiJHt0aGlzLl9zaXplfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RWYWx1ZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIC8vXG4gIC8vIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKExpdEVsZW1lbnQsICdxdGktaG90dGV4dCcpIHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nLCAnJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYDxzbG90Pjwvc2xvdD5gO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dC1pbnRlcmFjdGlvbic6IFF0aUhvdHRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHsgUXRpQ2hvaWNlIH0gZnJvbSAnLi4vY2hvaWNlL3F0aS1jaG9pY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZXNJbnRlcmZhY2Uge1xuICB2YWxpZGF0ZSgpOiBib29sZWFuO1xuICBfY2hvaWNlRWxlbWVudHM6IEhUTUxFbGVtZW50W107XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGNsYXNzIENob2ljZXNNaXhpbkVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZSB7XG4gICAgcHVibGljIF9jaG9pY2VFbGVtZW50czogUXRpQ2hvaWNlW10gPSBbXTtcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnXG4gICAgfSlcbiAgICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICAgIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGF0dHJpYnV0ZTogJ21heC1jaG9pY2VzJ1xuICAgIH0pXG4gICAgcHVibGljIG1heENob2ljZXM6IG51bWJlciA9IDE7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT5cbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcblxuICAgIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlID0gKCkgPT4gdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1sb29zZS1jaG9pY2UnLCB0aGlzLl9sb29zZUNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgbnJTZWxlY3RlZCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IHtcbiAgICAgICAgcmV0dXJuIGFjYyArICh2YWwuY2hlY2tlZCA/IDEgOiAwKTtcbiAgICAgIH0sIDApO1xuICAgICAgcmV0dXJuIG5yU2VsZWN0ZWQgPj0gdGhpcy5taW5DaG9pY2VzO1xuICAgIH1cblxuICAgIHNldCByZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VWYWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSA/IHJlc3BvbnNlVmFsdWUgOiBbcmVzcG9uc2VWYWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IHtcbiAgICAgICAgY2UuY2hlY2tlZCA9IHJlc3BvbnNlVmFsdWVBcnJheS5maW5kKHJ2ID0+IHJ2ID09PSBjZS5pZGVudGlmaWVyKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVmFsdWVBcnJheSA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkgPyByZXNwb25zZVZhbHVlIDogW3Jlc3BvbnNlVmFsdWVdO1xuICAgICAgaWYgKHJlc3BvbnNlVmFsdWUgPT0gJycpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjZSA9PiB7XG4gICAgICAgICAgY2UucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2UgPT4ge1xuICAgICAgICBjZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2RhdGEtY29ycmVjdC1yZXNwb25zZScsXG4gICAgICAgICAgcmVzcG9uc2VWYWx1ZUFycmF5LmZpbmQocnYgPT4gcnYgPT09IGNlLmlkZW50aWZpZXIpID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWNob2ljZS1lbGVtZW50LXNlbGVjdGVkJywgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGUudGFyZ2V0IGFzIFF0aUNob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbG9vc2VDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGUudGFyZ2V0IGFzIFF0aUNob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaCA9PiBjaCAhPT0gY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2VFbGVtZW50ID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQ6IFF0aUNob2ljZSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICAvLyBpZiB6ZXJvIHRoZW4geW91IGNhbiBjaG9vc2UgaG93IG11Y2ggeW91IHdhbnRcbiAgICAgICAgY2hvaWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncmFkaW8nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNob2ljZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2NoZWNrYm94Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9Pikge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5maWx0ZXIoY2UgPT4gY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpXG4gICAgICAgICAgLmZvckVhY2goY2UgPT4ge1xuICAgICAgICAgICAgY2UuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWQoKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNlID0+IGNlLmNoZWNrZWQpLm1hcChjZSA9PiBjZS5pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEpIHtcbiAgICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gc2VsZWN0ZWRJZGVudGlmaWVycy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IChjZS5kaXNhYmxlZCA9ICFjZS5jaGVja2VkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjZSA9PiAoY2UuZGlzYWJsZWQgPSBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSBzZWxlY3RlZElkZW50aWZpZXJzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShyZXN1bHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzYXZlUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgLypcbiAgICA8ZGV0YWlscyBjbGFzcz1cImFuY2hvclwiPlxuICAgICAgPHN1bW1hcnk+JHt0aGlzLmRhdGFQcm9tcHR9PC9zdW1tYXJ5PlxuXG4gICAgICA8ZGl2IHJvbGU9XCJtZW51XCIgcGFydD1cIm1lbnVcIiBjbGFzcz1cInBvc2l0aW9uZWRFbGVtZW50XCI+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGV0YWlscz5cbiAgICAqL1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVzcG9uc2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIHZhbHVlID09PSBvcHRpb24udmFsdWUgJiYgKG9wdGlvbi5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSBgPHNwYW4gcGFydD1cImNvcnJlY3Qtb3B0aW9uXCI+JHtcbiAgICAgIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiB2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKS50ZXh0Q29udGVudFxuICAgIH08L3NwYW4+YDtcbiAgfVxuXG4gIHB1YmxpYyBjaG9pY2VTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvblZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4gKHsgLi4ub3B0aW9uLCBzZWxlY3RlZDogb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZE9wdGlvblZhbHVlIH0pKTtcbiAgICB0aGlzLnNhdmVSZXNwb25zZShzZWxlY3RlZE9wdGlvblZhbHVlKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc0ludGVyZmFjZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzJztcbmltcG9ydCB7IFNodWZmbGVNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbic7XG5pbXBvcnQgeyBWb2NhYnVsYXJ5TWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC92b2NhYnVsYXJ5L3ZvY2FidWxhcnktbWl4aW4nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUNob2ljZUludGVyYWN0aW9uXG4gIGV4dGVuZHMgVm9jYWJ1bGFyeU1peGluKFxuICAgIFNodWZmbGVNaXhpbihDaG9pY2VzTWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksICdxdGktc2ltcGxlLWNob2ljZScpLFxuICAgICdxdGktc2ltcGxlLWNob2ljZSdcbiAgKVxuICBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2VcbntcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgLyoqIG9yaWVudGF0aW9uIG9mIGNob2ljZXMgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlLWludGVyYWN0aW9uJzogUXRpQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBTaHVmZmxlSW50ZXJmYWNlIHt9XG5leHBvcnQgY29uc3QgU2h1ZmZsZU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuXG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gbm9uRml4ZWRFbGVtZW50cy5zb21lKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IGNob2ljZXMuaW5kZXhPZihjaG9pY2UpO1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbEluZGV4ICE9PSBpbmRleDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGlzU2h1ZmZsZWQpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU2h1ZmZsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2h1ZmZsZSB0aGUgY2hvaWNlcyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIG9yZGVyIHRvIGVhY2ggZWxlbWVudFxuICAgICAgbGV0IG9yZGVyID0gMTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gU3RyaW5nKG9yZGVyKyspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpOyAvLyBub25GaXhlZENob2ljZSEuc3R5bGUub3JkZXIgPSBTdHJpbmcob3JkZXIrKyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuLi9jaG9pY2UvcXRpLWNob2ljZSc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKCt2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgaWYgKGNsYXNzQ29udGFpbnNMYWJlbCkge1xuICAgICAgICBjb25zdCBjaG9pY2VFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoYyA9PiBjIGFzIFF0aVNpbXBsZUNob2ljZSk7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBjaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBlbDogY2hvaWNlLCBvcmRlcjogaXNOdW1iZXIoY2hvaWNlLnN0eWxlLm9yZGVyKSA/ICtjaG9pY2Uuc3R5bGUub3JkZXIgOiBpbmRleCArIDEgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcilcbiAgICAgICAgICAubWFwKGNob2ljZSA9PiBjaG9pY2UuZWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAoY2hvaWNlc1tpXSBhcyBRdGlTaW1wbGVDaG9pY2UpLm1hcmtlciA9IHRoaXMuX2dldExhYmVsKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9nZXRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgICBsZXQgbGFzdExhYmVsID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoYykpLnBvcCgpO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAvLyBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtcHJvY2Vzc2luZycpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGxvZ2ljID0gbmV3IFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yKCk7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICAgIGxvZ2ljLnByb2Nlc3MocnVsZXMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnOiBRdGlPdXRjb21lUHJvY2Vzc2luZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3Ige1xuICBwdWJsaWMgcHJvY2VzcyhydWxlczogUXRpUnVsZUJhc2VbXSkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnQGNpdG9sYWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG4vKipcbiAqIFRoZSBsb29rdXBPdXRjb21lVmFsdWUgcnVsZSBzZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRjb21lIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvYnRhaW5lZFxuICogYnkgbG9va2luZyB1cCB0aGUgdmFsdWUgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbiBpbiB0aGUgbG9va3VwVGFibGUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGUgb3V0Y29tZSdzIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXRpTG9va3VwT3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgZ2V0IGNoaWxkRXhwcmVzc2lvbigpOiBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAob3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZSkge1xuICAgICAgdmFsdWUgPSBvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlLmdldChwYXJzZUludCh0aGlzLmNoaWxkRXhwcmVzc2lvbi5jYWxjdWxhdGUoKSkpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdsb29rdXBPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnLCBRdGlMb29rdXBPdXRjb21lVmFsdWUpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnOiBRdGlMb29rdXBPdXRjb21lVmFsdWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VDb25kaXRpb24gZXh0ZW5kcyBRdGlSdWxlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5jYWxjdWxhdGUoKSkge1xuICAgICAgICAoYnJhbmNoIGFzIHVua25vd24gYXMgUXRpUnVsZSkucHJvY2VzcygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtY29uZGl0aW9uJywgUXRpUmVzcG9uc2VDb25kaXRpb24pO1xuIiwgImltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBvdXRjb21lSWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG5cbiAgICBjb25zdCBydWxlID0gbmV3IFF0aVNldE91dGNvbWVWYWx1ZVJ1bGUoZXhwcmVzc2lvbik7XG4gICAgY29uc3QgdmFsdWUgPSBydWxlLnByb2Nlc3MoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAoKHY6IHN0cmluZykgPT4gY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodikpXG4gICAgICAgICAgICA6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZVJ1bGU8VD4gaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogUXRpRXhwcmVzc2lvbkJhc2U8VD4pIHt9XG5cbiAgcHJvY2VzcygpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uID8gdGhpcy5leHByZXNzaW9uLmNhbGN1bGF0ZSgpIDogbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NldE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXNldC1vdXRjb21lLXZhbHVlJywgUXRpU2V0T3V0Y29tZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBzdWJSdWxlcyA9IHRoaXMuZ2V0U3ViUnVsZXMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJSdWxlID0gc3ViUnVsZXNbaV07XG4gICAgICBzdWJSdWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZScsIFF0aVJlc3BvbnNlRWxzZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5pbXBvcnQgeyBRdGlNdWx0aXBsZSB9IGZyb20gJy4vcXRpLW11bHRpcGxlL3F0aS1tdWx0aXBsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICAvLyBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW07XG5cbiAgLy8gZ2V0VmFyaWFibGVzKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W107XG4gIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUV4cHJlc3Npb248VD4gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgcmVzdWx0OiBhbnk7XG5cbiAgLy8gaGlkZSB0aGUgc2xvdCB3aXRoIGNzc1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIHNsb3Qge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxwcmU+JHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdCwgbnVsbCwgMil9PC9wcmU+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cblxuICBnZXRWYXJpYWJsZXMgPSAoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXSA9PlxuICAgIC8vIEZJWE1FOiBpZiB0aGlzIGl0c2VsZiBpcyBtdWx0aXBsZSwgdGhpcyB3aWxsIG5ldmVyIGVudGVyIHRoZSBxdGktbXVsdGlwbGUgc3dpdGNoXG4gICAgLy8gU2VlIHRoaXMgZXhhbXBsZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vMUVkVGVjaC9xdGktZXhhbXBsZXMvYmxvYi9tYXN0ZXIvcXRpdjMtZXhhbXBsZXMvcGFja2FnaW5nL2l0ZW1zL0V4YW1wbGUwNS1mZWVkYmFja0Jsb2NrLWFkYXB0aXZlLnhtbFxuXG4gICAgQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKVxuICAgICAgLm1hcCgoZTogRWxlbWVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAncXRpLWJhc2UtdmFsdWUnOiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogZS5nZXRBdHRyaWJ1dGUoJ2Jhc2UtdHlwZScpLFxuICAgICAgICAgICAgICB2YWx1ZTogZS50ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFzc2Vzc21lbnRJdGVtLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktbXVsdGlwbGUnOiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IGUgYXMgUXRpTXVsdGlwbGU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtdWx0aXBsZS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiB2YWx1ZXNbMF0uYmFzZVR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlcy5tYXAodiA9PiB2LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ211bHRpcGxlJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktY29ycmVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0UmVzcG9uc2UoaWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogcmVzcG9uc2VWYXJpYWJsZS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogcmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eVxuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAvLyBhZGRlZCBmb3IgdXNlIG9mIHF0aS1lcXVhbC1yb3VuZGVkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gZSBhcyBRdGlFeHByZXNzaW9uPG51bWJlcj47XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXhwcmVzc2lvbi5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2RlZmF1bHQgbm90IHN1ZmZpY2llbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbn1cbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmV4cG9ydCBjbGFzcyBRdGlBbmQgZXh0ZW5kcyBxdGlBbmRNaXhpbihRdGlDb25kaXRpb25FeHByZXNzaW9uIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UXRpQ29uZGl0aW9uRXhwcmVzc2lvbj4pIHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVDaGlsZHJlbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uPGFueT5bXSkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE1vY2tRdGlFeHByZXNzaW9uPFQ+ID0geyBjYWxjdWxhdGU6ICgpID0+IFQgfTtcbnR5cGUgTW9ja0NvbnN0cnVjdG9yID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4ge307XG5leHBvcnQgZnVuY3Rpb24gcXRpQW5kTWl4aW48VEJhc2UgZXh0ZW5kcyBNb2NrQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gIHJldHVybiBjbGFzcyBNb2NrUXRpQW5kIGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIGNhbGN1bGF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBBcnJheTxNb2NrUXRpRXhwcmVzc2lvbjxhbnk+Pikge1xuICAgICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNoaWxkcmVuLm1hcChjID0+IHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBNb2NrUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKSBhcyBCb29sZWFuO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLWFuZCwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50O1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1iYXNlLXZhbHVlJywgUXRpQmFzZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlDb250YWlucyBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIGZvciBvdGhlciB0eXBlcyB0aGFuIGRpcmVjdGVkUGFpclxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBlbnVtZXJhYmxlID0gcHJvamVjdGlvbjEuZmlsdGVyKHggPT4gcHJvamVjdGlvbjIuaW5jbHVkZXMoeCkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVudW1lcmFibGUubGVuZ3RoID4gMDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ3Vuc3VwcG9ydGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBjb250YWlucywgb25seSBiYXNlVHlwZTogZGlyZWN0ZWRQYWlyIGFuZCBjYXJkaW5hbGl0eTogbXVsdGlwbGUgaXMgc3VwcG9ydGVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgY29udGFpbnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvbnRhaW5zJywgUXRpQ29udGFpbnMpO1xuIiwgImltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlDb3JyZWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBnZXQgaW50ZXJwcmV0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdpbnRlcnByZXRhdGlvbicpIHx8ICcnO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSAodGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW0pLmdldFJlc3BvbnNlKGlkZW50aWZpZXIpO1xuICAgIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIGlmIChyZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLmxlbmd0aCA+IDAgPyByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZVswXSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvcnJlY3QnLCBRdGlDb3JyZWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsUm91bmRlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgcm91bmRpbmdNb2RlOiAnZGVjaW1hbFBsYWNlcycgfCAnc2lnbmlmaWNhbnRGaWd1cmVzJyA9ICdzaWduaWZpY2FudEZpZ3VyZXMnO1xuXG4gIGdldCBmaWd1cmVzKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpO1xuICAgIGlmICghYXR0cikge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbWlzc2luZycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZpZ3VyZXMgPSBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpIHx8ICcwJyk7XG4gICAgaWYgKGlzTmFOKGZpZ3VyZXMpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5lZ2F0aXZlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAxICYmIHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEgZm9yIFJvdW5kaW5nTW9kZSBzaWduaWZpY2FudEZpZ3VyZXMnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlndXJlcztcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHZhbHVlc1swXS5iYXNlVHlwZSkge1xuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmbG9hdDEudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKSA9PT0gZmxvYXQyLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQxICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykgPT09XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDIgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZSBjYW5ub3QgYmUgY2FzdGVkIHRvIG51bWVyaWMgdmFsdWUgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yOiAke2Zsb2F0MX0sICR7ZmxvYXQyfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWVzIG90aGVyIHRoYW4gZmxvYXQgYW5kIGludCBjYW5ub3QgYmUgdXNlZCBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3IuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsLXJvdW5kZWQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbC1yb3VuZGVkJywgUXRpRXF1YWxSb3VuZGVkKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRvbGVyYW5jZU1vZGU6ICdleGFjdCcgfCAncmVsYXRpdmUnIHwgJ2Fic29sdXRlJyA9ICdleGFjdCc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMudG9sZXJhbmNlTW9kZSAhPT0gJ2V4YWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd0b2xlcmFuY2VNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsJywgUXRpRXF1YWwpO1xuIiwgImltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY2xhc3MgU2NvcmluZ0hlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTE6IFJlYWRvbmx5PHN0cmluZz4sIHZhbHVlMjogUmVhZG9ubHk8c3RyaW5nPiwgYmFzZVR5cGU6IEJhc2VUeXBlKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChiYXNlVHlwZSkge1xuICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTI7XG4gICAgICBjYXNlICdpbnRlZ2VyJzoge1xuICAgICAgICBjb25zdCBpbnQxID0gcGFyc2VJbnQodmFsdWUxLCAxMCk7XG4gICAgICAgIGNvbnN0IGludDIgPSBwYXJzZUludCh2YWx1ZTIsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnQxKSAmJiAhaXNOYU4oaW50MikpIHtcbiAgICAgICAgICByZXR1cm4gaW50MSA9PT0gaW50MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBpbnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEpO1xuICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMik7XG4gICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgIHJldHVybiBmbG9hdDEgPT09IGZsb2F0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb3VsZG4ndCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGZsb2F0LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncGFpcic6XG4gICAgICBjYXNlICdkaXJlY3RlZFBhaXInOiB7XG4gICAgICAgIGNvbnN0IHBhaXIxID0gdmFsdWUxLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBjb25zdCBwYWlyMiA9IHZhbHVlMi5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgaWYgKHBhaXIxLmxlbmd0aCA9PT0gMiAmJiBwYWlyMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAoYmFzZVR5cGUgPT09ICdwYWlyJykge1xuICAgICAgICAgICAgcGFpcjEuc29ydCgpO1xuICAgICAgICAgICAgcGFpcjIuc29ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFpcjEuam9pbignICcpID09PSBwYWlyMi5qb2luKCcgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY29tcGFyZWQgdHdvIHBhaXIgYnV0IG9uZSBvZiB0aGUgdmFsdWVzIGRvZXMgbm90IGhhdmUgMiB2YWx1ZXM6IDE6ICR7dmFsdWUxfSAyOiAke3ZhbHVlMn1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlHdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPiArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3QnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndCcsIFF0aUd0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlHdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID49ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndGUnLCBRdGlHdGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpSXNOdWxsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGlmICghdmFyaWFibGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZXNbMF0udmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgTnVsbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWlzLW51bGwnLCBRdGlJc051bGwpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUx0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0JywgUXRpTHQpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUx0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPD0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0ZScsIFF0aUx0ZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBSZXNwb25zZSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5hc3Nlc3NtZW50SXRlbS5nZXRSZXNwb25zZSh0aGlzLmlkZW50aWZpZXIpO1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUmVzcG9uc2UgJHt0aGlzLmlkZW50aWZpZXJ9IGNhbiBub3QgYmUgZm91bmRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nID0gcmVzcG9uc2UubWFwcGluZztcbiAgICBjb25zdCBjYW5kaWRhdGVSZXNwb25zZXMgPSAhQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZSkgPyBbcmVzcG9uc2UudmFsdWVdIDogcmVzcG9uc2UudmFsdWU7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVSZXNwb25zZSBvZiBjYW5kaWRhdGVSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gbWFwcGluZy5tYXBFbnRyaWVzLmZpbmQoZW50cnkgPT4ge1xuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGVudHJ5Lm1hcEtleSwgY2FuZGlkYXRlUmVzcG9uc2UsIHJlc3BvbnNlLmJhc2VUeXBlKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEobWFwcGVkVmFsdWUgPT0gbnVsbCB8fCBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZSA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwaW5nLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hcHBpbmcubG93ZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1heChtYXBwaW5nLmxvd2VyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLnVwcGVyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5taW4obWFwcGluZy51cHBlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcC1yZXNwb25zZScsIFF0aU1hcFJlc3BvbnNlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkZWZhdWx0LXZhbHVlJywgdHlwZTogTnVtYmVyIH0pIGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgbG93ZXJCb3VuZDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgcHVibGljIGdldCBtYXBFbnRyaWVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLW1hcC1lbnRyeScpKS5tYXAoZWwgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWFwS2V5OiBlbC5nZXRBdHRyaWJ1dGUoJ21hcC1rZXknKSxcbiAgICAgICAgbWFwcGVkVmFsdWU6ICtlbC5nZXRBdHRyaWJ1dGUoJ21hcHBlZC12YWx1ZScpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcHBpbmcnLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgc3dpdGNoIChjb3JyZWN0VmFsdWVJbmZvLmNhcmRpbmFsaXR5KSB7XG4gICAgICBjYXNlICdzaW5nbGUnOiB7XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8IEFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWU/LnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb3JkZXJlZCc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlW2ldLFxuICAgICAgICAgICAgdmFsdWVUb01hcC52YWx1ZVtpXSxcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdtdWx0aXBsZSc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5zd2VySW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBhcnIgPSBbLi4udmFsdWVUb01hcC52YWx1ZV07XG4gICAgICAgICAgZm9yIChjb25zdCBtdiBvZiBhcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAoYXJyIGFzIHN0cmluZ1tdKS5zcGxpY2UoYXJyLmluZGV4T2YobWF0Y2hpbmdWYWx1ZSksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuc3dlckluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWF0Y2gnLCBRdGlNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWVtYmVyIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuIHwgbnVsbD4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuXG4gICAgaWYgKCEodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3IgdGFrZXMgdHdvIHN1Yi1leHByZXNzaW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IFt2YWx1ZTEsIHZhbHVlMl0gPSB2YWx1ZXM7XG5cbiAgICBpZiAoISh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2hpY2ggbXVzdCBib3RoIGhhdmUgdGhlIHNhbWUgYmFzZS10eXBlJyk7XG4gICAgfVxuICAgIGlmICghKHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykpIHtcbiAgICAgIGNvbnNvbGUud2FybignYW5kIHRoZSBzZWNvbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9yIG9yZGVyZWQgY29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZmxvYXQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3Igc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGZsb2F0Jyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZHVyYXRpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0l0IG11c3Qgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZHVyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBlaXRoZXIgc3ViLWV4cHJlc3Npb24gaXMgTlVMTCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdG9yIGlzIE5VTExcbiAgICBpZiAodmFsdWUxLnZhbHVlID09PSBudWxsIHx8IHZhbHVlMi52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBib29sZWFuIHdpdGggYSB2YWx1ZSBvZiAndHJ1ZScgaWYgdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSBmaXJzdCBzdWItZXhwcmVzc2lvbiBpcyBpbiB0aGUgY29udGFpbmVyIGRlZmluZWQgYnkgdGhlIHNlY29uZCBzdWItZXhwcmVzc2lvbi5cbiAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tZW1iZXInLCBRdGlNZW1iZXIpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlNdWx0aXBsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdtdWx0aXBsZScgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB2YWx1ZXMgPSB2YXJpYWJsZXMubWFwKHYgPT4gdi52YWx1ZSk7XG4gICAgLy8gY29uc29sZS5sb2codmFyaWFibGVzKTtcbiAgICAvLyBjb25zdCBmbGF0dGVuZWRBcnJheSA9IHZhbHVlcy5yZWR1Y2UoKGFjYzogc3RyaW5nW10sIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgIC8vICAgcmV0dXJuIGFjYy5jb25jYXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWUpO1xuICAgIC8vIH0sIFtdKTtcbiAgICAvLyByZXR1cm4gZmxhdHRlbmVkQXJyYXk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW11bHRpcGxlJywgUXRpTXVsdGlwbGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU5vdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ub3QnLCBRdGlOb3QpO1xuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU9yIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpIGFzIEJvb2xlYW47XG4gICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKGUgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcicsIFF0aU9yKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpT3JkZXJlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248UmVzcG9uc2VWYXJpYWJsZVtdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ29yZGVyZWQnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBvcmRlcmVkJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcmRlcmVkJywgUXRpT3JkZXJlZCk7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgUXRQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3RvcigpIHtcbiAgLy8gICBzdXBlcigpO1xuICAvLyAgIGNvbnN0IGFzc2Vzc21lbnRJdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW07XG4gIC8vICAgYXNzZXNzbWVudEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcsICgpID0+IHtcbiAgLy8gICAgIHRoaXMudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZSgpIGFzIHN0cmluZztcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgLy8gICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAvLyAgIHRoaXMudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZSgpIGFzIHN0cmluZztcbiAgLy8gfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCBhc3Nlc3NtZW50SXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgY29uc3QgcmVzdWx0ID0gYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcikudmFsdWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRQcmludGVkVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVByb2R1Y3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB2YWx1ZXMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdmbG9hdCcgfHwgY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciAqIHBhcnNlSW50KGN1cnJlbnRWYWx1ZS52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGNhbiBub3QgY29udmVydCB0byBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBoYXMgYW5vdGhlciBiYXNlVHlwZSAke2N1cnJlbnRWYWx1ZS5iYXNlVHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCAxKTtcbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcm9kdWN0JywgUXRpUHJvZHVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN0cmluZ01hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2FzZS1zZW5zaXRpdmUnIH0pIGNhc2VTZW5zaXRpdmUgPSAndHJ1ZSc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIHN0cmluZy1tYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB2MSA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUxLnZhbHVlIDogKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2MiA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUyLnZhbHVlIDogKHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHYxIGFzIHN0cmluZywgdjIgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktc3RyaW5nLW1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3RyaW5nLW1hdGNoJywgUXRpU3RyaW5nTWF0Y2gpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3VtIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogUXRpU3VtRXhwcmVzc2lvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9leHByZXNzaW9uID0gbmV3IFF0aVN1bUV4cHJlc3Npb24oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9leHByZXNzaW9uLmNhbGN1bGF0ZSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU3VtRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25zOiBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pIHt9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmV4cHJlc3Npb25zLm1hcChjID0+IHtcbiAgICAgIGlmICghYy5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGMuY2FsY3VsYXRlKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1zdW0sIGV4cGVjdGVkIG51bWJlcicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdW0nLCBRdGlTdW0pO1xuIiwgImltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCByZXN1bHQgPSAodGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW0pLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpLnZhbHVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pXG4gIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnbW9kdWxlJyB9KVxuICBtb2R1bGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2N1c3RvbS1pbnRlcmFjdGlvbi10eXBlLWlkZW50aWZpZXInIH0pXG4gIGN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UXRpVmFyaWFibGVKU09OKGlucHV0OiBRdGlWYXJpYWJsZUpTT04pOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgZm9yIChjb25zdCB0b3BMZXZlbEtleSBpbiBpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KHRvcExldmVsS2V5KSkge1xuICAgICAgICBjb25zdCBuZXN0ZWRPYmplY3QgPSBpbnB1dFt0b3BMZXZlbEtleSBhcyAnbGlzdCcgfCAnYmFzZSddO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICBpZiAobmVzdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KG5lc3RlZEtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXN0ZWRPYmplY3RbbmVzdGVkS2V5IGFzIGtleW9mIHR5cGVvZiBuZXN0ZWRPYmplY3RdO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKFN0cmluZyk7IC8vIENvbnZlcnQgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7IC8vIENvbnZlcnQgdGhlIHNpbmdsZSB2YWx1ZSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDaGVja2luZygpOiB2b2lkIHtcbiAgICAvLyBiZWNhdXNlIHRoZSBwY2kgZG9lc24ndCBoYXZlIGEgbWV0aG9kIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHdlJ2xsIHVzZSBhbiBpbnRlcnZhbFxuICAgIC8vIHRvIGNoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgY2hhbmdlZC4gSWYgY2hhbmdlZCB3ZSdsbCBzYXZlIHRoZSByZXNwb25zZVxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IG5ld1Jlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkICE9PSB0aGlzLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBzdHJpbmdpZmllZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnZlcnRRdGlWYXJpYWJsZUpTT04obmV3UmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ2hlY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7IC8vIEZPUiBOT1dcbiAgfVxuICBzZXQgcmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuXG4gICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgPyBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZClcbiAgICAgIDogKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgZGVmaW5lKCdxdGlDdXN0b21JbnRlcmFjdGlvbkNvbnRleHQnLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gdGhlIFRBTyB2ZXJzaW9uICovXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJ1aWxkUmVxdWlyZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKGNvbmZpZyk7XG4gICAgcmVxdWlyZVBDSShbJ3JlcXVpcmUnXSwgcmVxdWlyZSA9PiB7XG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBMaXRFbGVtZW50LFxuICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsXG4gIHRydWUsXG4gICcuZGwnXG4pIHtcbiAgQHN0YXRlKCkgcHJpdmF0ZSBfY2hpbGRyZW5NYXA6IEVsZW1lbnRbXTtcblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIGdhcDogMC41cmVtO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICAgICR7dGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoID4gMCAmJlxuICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgaHRtbGA8ZGl2IHBhcnQ9XCJhc3NvY2lhYmxlcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gXG4gICAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2NoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIF90b3VjaEJlZ2luID0gMDsgLy8gdGltZXN0YW1wIG9mIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgX3RvdWNoRG93biA9IG51bGw7IC8vIHBvaW50IG9mIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgX2xhc3RDbGljayA9IDA7IC8vIHRpbWVzdGFtcCBvZiBwcmV2aW91cyBjbGljayAodG91Y2hzdGFydCArIHRvdWNoZW5kKVxuICBwcml2YXRlIF9jYW5EcmFnID0gZmFsc2U7IC8vIHdoZXRoZXIgdGhlcmUgaXMgYW4gZWxlbWVudCB3aGljaCBjYW4gYmUgZHJhZ2dlZFxuICBwcml2YXRlIF9kcmFnU3JjID0gbnVsbDsgLy8gdGhlIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGRyYWdnZWRcbiAgcHJpdmF0ZSBfZHJhZ0NvcHkgPSBudWxsOyAvLyBjb3B5IG9mIGRyYWcgc291cmNlIGZvciBkcmFnIGZlZWRiYWNrXG4gIHByaXZhdGUgX3RvdWNoRW5kQ2FsbGVkID0gZmFsc2U7IC8vIHdoZXRoZXIgdG91Y2hFbmQgb2NjdXJlZFxuICBwcml2YXRlIF9kcmFnUnVubmluZyA9IGZhbHNlOyAvLyB3aGV0aGVyIGEgZHJhZyBwcm9jZXNzIGlzIHJ1bm5pbmcgYXQgdGhlIG1vbWVudFxuXG4gIHByaXZhdGUgX2RhdGFUcmFuc2ZlciA9IHtcbiAgICBkYXRhOiB7fSxcbiAgICBzZXREYXRhOiBmdW5jdGlvbiAodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIF9jb3B5T2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY29weVxuXG4gIHByaXZhdGUgX2xhc3RUYXJnZXQgPSBudWxsOyAvLyBUaGUgbGFzdCByZWdpc3RlcmVkIHRvdWNoIHRhcmdldFxuICBwcml2YXRlIF9jdXJyZW50RHJvcENvbnRhaW5lciA9IG51bGw7IC8vIFRoZSBjdXJyZW50IGRyb3AgY29udGFpbmVyOyBmYWxzZSBpZiBlbGVtZW50IGlzIG5vdCBkcm9wcGFibGVcbiAgcHJpdmF0ZSBfaGFuZGxlQ2xpY2sgPSB0cnVlOyAvLyBTcGVjaWZpZXNcblxuICBwcml2YXRlIF9EQkxDTElDS0RFTEFZID0gNTAwOyAvLyBtYXhpbXVtIGRlbGF5IGluIHdoaWNoIGEgc2Vjb25kIGNsaWNrIG11c3Qgb2NjdXJcbiAgcHJpdmF0ZSBfQ09OVEVYVE1FTlVERUxBWSA9IDEwMDA7IC8vIGhvbGQgZGVsYXkgYWZ0ZXIgd2hpY2ggY29udGV4dCBtZW51IGlzIHNob3duXG4gIHByaXZhdGUgX0RSQUdERUxUQSA9IDU7IC8vIE1pbmltdW0gb2YgcGl4ZWxzIHdoaWNoIHRoZSBmaW5nZXIgbXVzdCBiZSBtb3ZlZCB0byBzdGFydCBkcmFnXG4gIHByaXZhdGUgX0NPUFlPUEFDSVRZID0gMC43OyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNvcHkgZWxlbWVudFxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbiA9IHRydWU7XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQ2hlY2sgc2luZ2xldG9uXG4gICAgaWYgKFRvdWNoRHJhZ0FuZERyb3AuX2luc3RhbmNlKSB7XG4gICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKFwiVG91Y2hEcmFnQW5kRHJvcCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuX2luc3RhbmNlO1xuICAgIH1cbiAgICBUb3VjaERyYWdBbmREcm9wLl9pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyB0aGlzLl9pbml0aWFsaXplRmllbGRzKCk7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl90b3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fdG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl90b3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fdG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX3RvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGREcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX3RvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRvdWNoc3RhcnQgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZVxuICAgKi9cbiAgcHJpdmF0ZSBfdG91Y2hTdGFydChlKSB7XG4gICAgLy8gU2F2ZSBjdXJyZW50IHRpbWVzdGFtcFxuICAgIHRoaXMuX3RvdWNoQmVnaW4gPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLl9nZXRQb2ludChlKTtcblxuICAgIHRoaXMuX3RvdWNoRG93biA9IHsgeCwgeSB9O1xuXG4gICAgdGhpcy5fZHJhZ1NyYyA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLl9jYW5EcmFnID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmRyYWdPbkNsaWNrKSB7XG4gICAgICBjb25zdCBfdG91Y2hlcyA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuICAgICAgdGhpcy5fZHJhZ1J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fY3JlYXRlRHJhZ0NvcHkoZSwgX3RvdWNoZXMpO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdG91Y2htb3ZlIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuX2NhbkRyYWcgJiYgdGhpcy5fZHJhZ1NyYykge1xuICAgICAgLy8gQ3JlYXRlIGNvcHkgb2YgZWxlbWVudCBmb3IgdmlzdWFsIGRyYWcgZmVlZGJhY2tcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLl9nZXRQb2ludChlKTtcbiAgICAgIGNvbnN0IF90b3VjaGVzID0geyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH07XG5cbiAgICAgIGlmICh0aGlzLl9nZXREZWx0YShfdG91Y2hlcykgPj0gdGhpcy5fRFJBR0RFTFRBKSB7XG4gICAgICAgIHRoaXMuX2RyYWdSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3JlYXRlRHJhZ0NvcHkoZSwgX3RvdWNoZXMpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURyYWdDb3B5ID0gKGU6IGFueSwgX3RvdWNoZXM6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkgPT4ge1xuICAgIGlmICh0aGlzLl9kcmFnQ29weSA9PT0gbnVsbCAmJiB0aGlzLl9kcmFnUnVubmluZykge1xuICAgICAgdGhpcy5fZHJhZ1NyYy5zdHlsZS5vcGFjaXR5ID0gdGhpcy5fQ09QWU9QQUNJVFk7XG4gICAgICB0aGlzLl9kcmFnQ29weSA9IHRoaXMuX2RyYWdTcmMuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgY29uc3QgZWxlbWVudFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2RyYWdTcmMpO1xuXG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZSA9ICcnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkuc2V0QXR0cmlidXRlKCdkcmFnY2xvbmUnLCAnJyk7XG5cbiAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNEcmFnQ2xvbmUpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBlbGVtZW50U3R5bGVzKSB7XG4gICAgICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGVbc3R5bGVdID0gZWxlbWVudFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jYWxjdWxhdGVEcmFnQ29weVBvc2l0aW9uKF90b3VjaGVzKTtcblxuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUudG9wID0gX3RvdWNoZXMuY2xpZW50WSAtIHRoaXMuX2NvcHlPZmZzZXQueSArICdweCc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZS5sZWZ0ID0gX3RvdWNoZXMuY2xpZW50WCAtIHRoaXMuX2NvcHlPZmZzZXQueCArICdweCc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUuekluZGV4ID0gJzk5OTk5OSc7XG5cbiAgICAgIHRoaXMuX2RyYWdDb3B5ID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9kcmFnQ29weSk7XG4gICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRoaXMuX2RyYWdTcmMsICdkcmFnc3RhcnQnKTtcbiAgICB9XG5cbiAgICAvLyBEcmFnIGlzIHJ1bm5pbmcsIG1vdmUgZHJhZyBjb3B5IGFuZCBmaXJlIGV2ZW50c1xuICAgIGlmICh0aGlzLl9kcmFnUnVubmluZykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuX3RvdWNoRW5kQ2FsbGVkIHx8IF90aGlzLl9kcmFnQ29weSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBfdGhpcy5fZHJhZ0NvcHkuc3R5bGUudG9wID0gX3RvdWNoZXMuY2xpZW50WSAtIF90aGlzLl9jb3B5T2Zmc2V0LnkgKyAncHgnO1xuICAgICAgICBfdGhpcy5fZHJhZ0NvcHkuc3R5bGUubGVmdCA9IF90b3VjaGVzLmNsaWVudFggLSBfdGhpcy5fY29weU9mZnNldC54ICsgJ3B4JztcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLl9maW5kRHJvcHBhYmxlKGUpO1xuXG4gICAgICAvLyBGaXJlIGRyYWdsZWF2ZSBhbmQgZHJhZ2VudGVyIGV2ZW50cyB3aGVuIHRhcmdldCBoYXMgY2hhbmdlZCBkdXJpbmcgbW92ZVxuICAgICAgaWYgKHRhcmdldCAhPSB0aGlzLl9sYXN0VGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQodGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQodGhpcy5fbGFzdFRhcmdldCwgJ2RyYWdsZWF2ZScpO1xuICAgICAgICB0aGlzLl9sYXN0VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIGN1cnJlbnQgZHJvcCBjb250YWluZXIgY2xhc3N3aWRlIGF2YWlsYWJsZSBhbmQgZmlyZSBkcmFnb3ZlciBpZiBpdCdzIHJlYWxseSBhIGRyb3AgY29udGFpbmVyLlxuXG4gICAgICB0aGlzLl9jdXJyZW50RHJvcENvbnRhaW5lciA9IHRhcmdldDtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50RHJvcENvbnRhaW5lcikgdGhpcy5fZGlzcGF0Y2hFdmVudCh0YXJnZXQsICdkcmFnb3ZlcicpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRvdWNoZW5kIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoRW5kKGUpIHtcbiAgICB0aGlzLl90b3VjaEVuZENhbGxlZCA9IHRydWU7XG4gICAgdGhpcy5fY2FuRHJhZyA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coMSwgZS50YXJnZXQsIHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyKTtcblxuICAgIC8vIFVzZXIgc2VlbXMgdG8gY2xpY2tcbiAgICAvLyBpZiAoIXRoaXMuX2RyYWdSdW5uaW5nICYmIHRoaXMuX2hhbmRsZUNsaWNrKSB7XG4gICAgLy8gICB0aGlzLl9kaXNwYXRjaEV2ZW50KGUudGFyZ2V0LCAnY2xpY2snKTtcbiAgICAvLyAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyLCAnZHJvcCcpO1xuICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCh0aGlzLl9kcmFnU3JjLCAnZHJhZ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXJlIGRyYWdFdmVudCBldmVuIGlmIHRoZWlyIGlzIG5vIGRyb3BwYWJsZS4gQW5kIGFzc2lnbiBkcm9wRWZmZWN0IG5vbmUuXG4gICAgICAvLyBmb3Igb3VyIHB1cnBvc2UsIHRoaXMgd2lsbCBicmluZyBiYWNrIHRoZSBkcmFnIHRvIGl0cyBzdGFydCBwb3NpdGlvbiwgc2VlbCBkcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHNcbiAgICAgIGlmICh0aGlzLl9kcmFnUnVubmluZykge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgnZHJhZ2VuZCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgICAgdGhpcy5fZHJhZ1NyYz8uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdG91Y2hjYW5jZWwgZXZlbnQgbGlzdGVuZXIsIGluIGNhc2UgYnJvd3NlciBzdXBwb3J0cyB0aGlzLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLl9yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG5leHQgZHJvcHBhYmxlIGVsZW1lbnQgYXQgY3VycmVudCBwb2ludC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHB0XG4gICAqL1xuICBwcml2YXRlIF9maW5kRHJvcHBhYmxlKGV2ZW50KSB7XG4gICAgY29uc3QgcG9pbnRGcm9tVG91Y2hFdmVudCA9IHRoaXMuX2dldFBvaW50KGV2ZW50KTtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxFbGVtZW50PigpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRXaXRoRHJvcHpvbmUoZG9jdW1lbnQsIHBvaW50RnJvbVRvdWNoRXZlbnQueCwgcG9pbnRGcm9tVG91Y2hFdmVudC55LCB2aXNpdGVkKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudFdpdGhEcm9wem9uZShcbiAgICByb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCxcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHZpc2l0ZWQ6IFNldDxFbGVtZW50PlxuICApOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgZWwgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChlbCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoaXMgZWxlbWVudFxuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGVsKSkge1xuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBieSBub3QgcmV2aXNpdGluZyB0aGUgc2FtZSBlbGVtZW50XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmlzaXRlZC5hZGQoZWwpO1xuXG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnOyByZXR1cm4gaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuICAgICAgaWYgKGVsLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIHdpdGhpbiB0aGUgU2hhZG93IERPTVxuICAgICAgICBjb25zdCBuZXN0ZWRFbCA9IHRoaXMuZ2V0RWxlbWVudFdpdGhEcm9wem9uZShlbC5zaGFkb3dSb290LCB4LCB5LCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKG5lc3RlZEVsKSB7XG4gICAgICAgICAgLy8gSWYgYSBuZXN0ZWQgZWxlbWVudCB3aXRoICdkcm9wem9uZScgaXMgZm91bmQsIHJldHVybiBpdFxuICAgICAgICAgIHJldHVybiBuZXN0ZWRFbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTm8gJ2Ryb3B6b25lJyBhdHRyaWJ1dGUgZm91bmQgaW4gZGVlcGVyIGxldmVsczsgcmV0dXJuIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgLy8gTm8gZWxlbWVudCBmb3VuZCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXNcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFBvaW50KGV2ZW50LCBwYWdlPykge1xuICAgIGlmIChldmVudCAmJiBldmVudC50b3VjaGVzKSB7XG4gICAgICBldmVudCA9IGV2ZW50LnRvdWNoZXNbMF07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4OiBwYWdlID8gZXZlbnQucGFnZVggOiBldmVudC5jbGllbnRYLFxuICAgICAgeTogcGFnZSA/IGV2ZW50LnBhZ2VZIDogZXZlbnQuY2xpZW50WVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgb2Zmc2V0IGZvciBkaXNwbGF5aW5nIHRoZSBkcmFnIGNvcHkgdG8gaGF2ZSBhIHNlYW1sZXNzIGRyYWdnaW5nLlxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaCBUaGUgY3VycmVudCB0b3VjaC5cbiAgICovXG4gIHByaXZhdGUgX2NhbGN1bGF0ZURyYWdDb3B5UG9zaXRpb24odG91Y2gpIHtcbiAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZHJhZ1NyYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLl9jb3B5T2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gY2xpZW50UmVjdC5sZWZ0O1xuICAgIHRoaXMuX2NvcHlPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSBjbGllbnRSZWN0LnRvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBwaXhlbCBkZWx0YSBiZXR3ZWVuIGZpcnN0IHRvdWNoIGFuZCB0aGUgY3VycmVudCB0b3VjaCBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHRvdWNoXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWx0YSh0b3VjaCkge1xuICAgIGNvbnN0IHggPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fdG91Y2hEb3duLngpO1xuICAgIGNvbnN0IHkgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fdG91Y2hEb3duLnkpO1xuXG4gICAgcmV0dXJuIHggKyB5O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZSBUaGUgZXZlbnQncyB0YXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSB7Ym9vbH0gYnViYmxlIFNldHMgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJ1YmJsZS5cbiAgICovXG4gIHByaXZhdGUgX2Rpc3BhdGNoRXZlbnQoZSwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHsgYnViYmxlczogYnViYmxlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIGV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHRoaXMuX2RhdGFUcmFuc2ZlcjtcbiAgICBlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIHJldHVybiBldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdmFyaWFibGVzIGFuZCBwcmVwYXJlcyBmb3IgbmV3IERyYWcgYW5kIERyb3AuXG4gICAqL1xuICBwcml2YXRlIF9yZXNldCgpIHtcbiAgICBpZiAodGhpcy5fZHJhZ1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX2RyYWdTcmMuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9kcmFnQ29weSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJhZ1J1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kcmFnU3JjID0gbnVsbDtcbiAgICB0aGlzLl9kcmFnQ29weSA9IG51bGw7XG4gICAgdGhpcy5fY2FuRHJhZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5fdG91Y2hCZWdpbiA9IDA7XG4gICAgdGhpcy5fdG91Y2hEb3duID0gbnVsbDtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSAwO1xuICAgIHRoaXMuX3RvdWNoRW5kQ2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fZGF0YVRyYW5zZmVyID0ge1xuICAgICAgZGF0YToge30sXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiAodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5fY29weU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuXG4gICAgdGhpcy5fbGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5fY3VycmVudERyb3BDb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuX2hhbmRsZUNsaWNrID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgX2dldFBvc2l0aW9uRnJvbUV2ZW50KGU6IGFueSk6IHtcbiAgLy8gICB4OiBudW1iZXI7XG4gIC8vICAgeTogbnVtYmVyO1xuICAvLyB9IHtcbiAgLy8gICBsZXQgX3RvdWNoTW92ZTtcbiAgLy8gICBpZiAoZS50eXBlID09ICd0b3VjaHN0YXJ0JyB8fCBlLnR5cGUgPT0gJ3RvdWNobW92ZScgfHwgZS50eXBlID09ICd0b3VjaGVuZCcgfHwgZS50eXBlID09ICd0b3VjaGNhbmNlbCcpIHtcbiAgLy8gICAgIGNvbnN0IGV2dCA9IHR5cGVvZiBlLm9yaWdpbmFsRXZlbnQgPT09ICd1bmRlZmluZWQnID8gZSA6IGUub3JpZ2luYWxFdmVudDtcbiAgLy8gICAgIGNvbnN0IHRvdWNoID0gZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAvLyAgICAgX3RvdWNoTW92ZSA9IHtcbiAgLy8gICAgICAgeDogdG91Y2gucGFnZVgsXG4gIC8vICAgICAgIHk6IHRvdWNoLnBhZ2VZXG4gIC8vICAgICB9O1xuICAvLyAgIH0gZWxzZSBpZiAoXG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlZG93bicgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2V1cCcgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2Vtb3ZlJyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZW92ZXInIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlb3V0JyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZWVudGVyJyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZWxlYXZlJ1xuICAvLyAgICkge1xuICAvLyAgICAgX3RvdWNoTW92ZSA9IHtcbiAgLy8gICAgICAgeDogZS5jbGllbnRYLFxuICAvLyAgICAgICB5OiBlLmNsaWVudFlcbiAgLy8gICAgIH07XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBfdG91Y2hNb3ZlO1xuICAvLyB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgRHJvcHBhYmxlc0ludGVyZmFjZSB7fVxuXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzSW5TaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIERyb3BwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIC8vIGZvciBxdGktbWF0Y2gtaW50ZXJhY3Rpb24gdGhlIGRyYWcgaW50ZXJhY3Rpb24gY2FuIGJlIHJlcGxhY2Ugd2l0aCBhIHF0aS1tYXRjaC10YWJ1bGFyIGNsYXNzXG4gICAgICAvLyB3aGljaCBzaG93cyB0aGUgZGF0YSBpbiBhIGEgdGFidWxhciB3YXksIHNvIG5vIGRyYWcgZHJvcCBzaG91bGQgYmUgaW52b2x2ZWQgdGhlblxuICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm47XG5cbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZHJhZ292ZXJIYW5kbGVyID0gdGhpcy5kcmFnb3ZlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2xlYXZlSGFuZGxlciA9IHRoaXMuZHJhZ2xlYXZlSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnZW50ZXJIYW5kbGVyID0gdGhpcy5kcmFnZW50ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG5cbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkID0+IHtcbiAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgICAgZC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcihkKTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBkcm9wcGFibGUgb2YgZHJvcHBhYmxlcykge1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChtdXRhdGlvbiA9PiB7XG4gICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gbXV0YXRpb24uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgICAgICAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaEhhbmRsZXIoZHJvcHBhYmxlKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGFuZGxlcihkcm9wcGFibGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJvcHBhYmxlLCB7XG4gICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSAvL2NvbmZpZ3VyZSBpdCB0byBsaXN0ZW4gdG8gYXR0cmlidXRlIGNoYW5nZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hIYW5kbGVyKGRyb3BwYWJsZTogRWxlbWVudCkge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlSGFuZGxlcihkcm9wcGFibGU6IEVsZW1lbnQpIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIC8vIGZvciBxdGktbWF0Y2gtaW50ZXJhY3Rpb24gdGhlIGRyYWcgaW50ZXJhY3Rpb24gY2FuIGJlIHJlcGxhY2Ugd2l0aCBhIHF0aS1tYXRjaC10YWJ1bGFyIGNsYXNzXG4gICAgICAvLyB3aGljaCBzaG93cyB0aGUgZGF0YSBpbiBhIGEgdGFidWxhciB3YXksIHNvIG5vIGRyYWcgZHJvcCBzaG91bGQgYmUgaW52b2x2ZWQgdGhlblxuICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm47XG5cbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGRyYWdvdmVySGFuZGxlcihldjogRHJhZ0V2ZW50KSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIC8vIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgIC8vID8gZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgncGFydCcsIGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ3BhcnQnKSArICcgYWN0aXZlJykgOlxuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuXG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGRyb3BIYW5kbGVyKGV2OiBEcmFnRXZlbnQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgLy8gcGs6IGRyYWdnYWJsZXMgaW4gbGlnaHQgZG9tIGNhbiBiZSBkcmFnZ2VkIHRvIHNoYWRvd2RvbSwgdGhpcyBpcyBvbmUgb2YgdGhlIHJ1bGVzIG9mIHdlYmNvbXBvbmVudHMuXG4gICAgICAvLyBUaGV5IG1heSBub3QgY3JlYXRlIG5ldyBlbGVtZW50cyBpbiBsaWdodCBkb20uIFNvbWUgc29tZXRpbWVzcyBkcm9wIHpvbmVzIHNob3VsZCBiZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGJ5IHRoZSB3ZWJjb21wb25lbnQuIFRoZW4gYSBkcmFnZ2FibGUgKCB3aGljaCBpcyBhbHdheXMgYWxyZWFkeSBjcmVhdGVkIGJ5IGEgd2ViY29tcG9uZW50IClcbiAgICAgIC8vIGNhbiBiZSBpbiBsaWdodCBkb20sIGVuIGNhbiBiZSBkcmFnZ2VkIHRvIHNoYWRvdyBkb20uXG4gICAgICAvLyB0aGlua2luZyBvZiBhbm90aGVyIHdheSB3aGVyZSB3ZSBqdXN0IGNoYW5nZSBzbG90cy4gTWF5YmUgdGhhdHMgYmV0dGVyLi5cbiAgICAgIGNvbnN0IGRyYWdnYWJsZUluTGlnaHREb20gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7ZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKX1gKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGRyYWdnYWJsZUluTGlnaHREb21cbiAgICAgICAgPyBkcmFnZ2FibGVJbkxpZ2h0RG9tXG4gICAgICAgIDogdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7ZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKX1gKTtcblxuICAgICAgaWYgKCFkcm9wcGFibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgY2Fubm90IGZpbmQgZHJvcHBhYmxlLCB0YXJnZXQ6ICR7ZXYudGFyZ2V0ID8gSlNPTi5zdHJpbmdpZnkoZXYudGFyZ2V0KSA6ICdudWxsJ31gKTtcbiAgICAgIH0gZWxzZSBpZiAoZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgIT09IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSkge1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcbiAgICAgIH1cbiAgICAgIC8vIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgIC8vID8gZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgncGFydCcsIGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ3BhcnQnKS5yZXBsYWNlKCdhY3RpdmUnLCAnJykudHJpbSgpKSA6XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGRyYWdsZWF2ZUhhbmRsZXIoZXY6IERyYWdFdmVudCkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyb3BwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPERyb3BwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gVEhJUyBJUyBBIE1JWElOLCBUSElTIElTIEEgTUlYSU5cbi8vIFVTRSBMSUtFIFRISVNcbi8vIGBgYGNsYXNzIERyb3BMaXN0IGV4dGVuZHMgRmxpcHBhYmxlcyhMaXRFbGVtZW50KSB7YGBgXG4vLyBtaXhpbiB3aGljaCBhbmltYXRlcyBjaGlsZHJlbiB3aXRoIEZMSVBcbi8vIGEgY29tYmluYXRpb24gYmV0d2VlbiB0aGlzIGRpcmVjdGl2ZTpcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG4vLyBhbmQgYSB0dXRvcmlhbCBob3cgdG8gbWFrZSBhIG1peGluXG4vLyBodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb3NpdGlvbi9taXhpbnMvXG5cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuLy8ga2V5Ym9hcmQgbmF2aWdhdGFibGUgZHJhZyBkcm9wOiBodHRwczovL2NvZGVwZW4uaW8vU2l0ZVBvaW50L3Blbi92RXpYYmpcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU1MjQyMTk2L3R5cGVzY3JpcHQtYWxsb3dzLXRvLXVzZS1wcm9wZXItbXVsdGlwbGUtaW5oZXJpdGFuY2Utd2l0aC1taXhpbnMtYnV0LWZhaWxzLXRvLWNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTc3NDQjaXNzdWVjb21tZW50LTU1ODk5MDM4MVxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmludGVyZmFjZSBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuO1xuICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiBib29sZWFuO1xuICBkcmFnT25DbGljazogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgZHJvcHBhYmxlc0luU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBjbGFzcyBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBleHRlbmRzIEZsaXBwYWJsZXNNaXhpbihcbiAgICBEcm9wcGFibGVzTWl4aW4oc3VwZXJDbGFzcywgZHJvcHBhYmxlc0luU2hhZG93Um9vdCwgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxFbGVtZW50LCB7IHBhcmVudDogRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PigpO1xuICAgIHByb3RlY3RlZCBkcm9wcGFibGVzOiBFbGVtZW50W107XG4gICAgZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgICBAbGl2ZVF1ZXJ5KGRyYWdnYWJsZXNTZWxlY3RvcilcbiAgICByZUluaXREcmFnQW5kRHJvcChkcmFnc0FkZGVkOiBFbGVtZW50W10sIGRyYWdzUmVtb3ZlZDogRWxlbWVudFtdKSB7XG4gICAgICBpZiAodGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHJldHVybjtcblxuICAgICAgLy8gY2hlY2sgaWYgYWRkZWQgZWxlbWVudHMgYXJlIG5vdCBhbHJlYWR5IGluIGxpc3RcbiAgICAgIGNvbnN0IGRyYWdnYWJsZXMgPSBkcmFnc0FkZGVkLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMgfHwgIXRoaXMuZHJhZ2dhYmxlcy5nZXQoZCkpO1xuXG4gICAgICBpZiAoZHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlcyhkcmFnc0FkZGVkKTtcblxuICAgICAgICBkcmFnc0FkZGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgICAgICAgLy8gc3RvcmUgaW5pdGlhbCBwb3NpdGlvbnMgb2YgZWxlbWVudHMsIGFuZCBvZiBjb3Vyc2UsIGp1c3QgdGhlIGVsZW1lbnRzIGZvciBsb29waW5nIGFuZCBzdWNoXG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChlbGVtLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IGVsZW0ucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIGluZGV4OiBBcnJheS5mcm9tKGVsZW0ucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihlbGVtKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlLCB0eXBlOiBPYmplY3QgfSkgY29uZmlndXJhdGlvbjogSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgY29weVN0eWxlc0RyYWdDbG9uZTogdHJ1ZSxcbiAgICAgIGRyYWdDYW5CZVBsYWNlZEJhY2s6IHRydWUsXG4gICAgICBkcmFnT25DbGljazogZmFsc2VcbiAgICB9O1xuICAgIEB3YXRjaCgnY29uZmlndXJhdGlvbicpXG4gICAgaGFuZGxlRHJhZ09wdGlvbnNDaGFuZ2VkKG9sZCwgZHJhZ09wdGlvbnMpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuY29weVN0eWxlc0RyYWdDbG9uZSA9IGRyYWdPcHRpb25zLmNvcHlTdHlsZXNEcmFnQ2xvbmU7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpLmRyYWdPbkNsaWNrID0gZHJhZ09wdGlvbnMuZHJhZ09uQ2xpY2s7XG4gICAgfVxuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgaGFuZGxlRGlzYWJsZWRDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHMsIGNoKSA9PiB7XG4gICAgICAgIGRpc2FibGVkID8gY2guc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKSA6IGNoLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgZGlzYWJsZWQgPyBjaC5yZW1vdmVBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnKSA6IGNoLnNldEF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG4gICAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBoYW5kbGVSZWFkb25seUNoYW5nZShvbGQsIHJlYWRvbmx5OiBib29sZWFuKSB7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgocywgY2gpID0+IHtcbiAgICAgICAgcmVhZG9ubHkgPyBjaC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpIDogY2gucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpO1xuICAgICAgICByZWFkb25seSA/IGNoLnJlbW92ZUF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScpIDogY2guc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWluLWFzc29jaWF0aW9ucycgfSkgbWluQXNzb2NpYXRpb25zID0gMTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21heC1hc3NvY2lhdGlvbnMnIH0pIG1heEFzc29jaWF0aW9ucyA9IDE7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgICAgICA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICAgICA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgICAgLy8gUEs6IE1heWJlIGxhdGVyLCBmb3Igbm93IHdlIGFzc3VtZSBkcm9wcGFibGVzIGFyZSBub3QgZHluYW1pY2x5IGFkZGVkIG9yIHJlbW92ZWRcbiAgICAgIC8vIC5maWx0ZXIoKGVsZW0pID0+ICF0aGlzLmRyb3BwYWJsZXMgfHwgIXRoaXMuZHJvcHBhYmxlcy5pbmNsdWRlcyhlbGVtKSk7XG4gICAgICAvLyB0aGlzLmRyb3BwYWJsZXMgPSB0aGlzLmRyb3BwYWJsZXMgPyB0aGlzLmRyb3BwYWJsZXMuY29uY2F0KG5ld0Ryb3BwYWJsZXMpIDogbmV3RHJvcHBhYmxlcztcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogYW55KSA9PiB7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIGV2LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKGBpZGVudGlmaWVyYCkpO1xuICAgICAgZXYuY3VycmVudFRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuXG4gICAgICAvLyBoaWdobGlnaHQgYWxsIGRyb3BwYWJsZXMgd2l0aCBhbiBhY3RpdmUgY2xhc3NcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5zZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCAnJykpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5yZW1vdmVBdHRyaWJ1dGUoJ2VuYWJsZWQnKSk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnb3ZlcicpO1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcblxuICAgICAgLy8gcGs6IGlmIG5vdCBkcm9wcGVkIG9uIGEgZHJvcCBsb2NhdGlvbiBwdXQgaXQgYmFjayB3aGVyZSBpdCBiZWxvbmdzXG4gICAgICBpZiAoZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09ICdub25lJyB8fCBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uZHJhZ0NhbkJlUGxhY2VkQmFjaykge1xuICAgICAgICAgIHRoaXMucGxhY2VEcmFnZ2FibGVCYWNrKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnKSB7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhNYXRjaEFzc29jaWF0aW9ucygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHBsYWNlRHJhZ2dhYmxlQmFjayhkcmFnZ2FibGU6IEhUTUxFbGVtZW50KSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IGluZGV4ID1cbiAgICAgICAgcG9zaXRpb24uaW5kZXggPD0gcG9zaXRpb24ucGFyZW50LmNoaWxkcmVuLmxlbmd0aCA/IHBvc2l0aW9uLmluZGV4IDogcG9zaXRpb24ucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHBvc2l0aW9uLnBhcmVudDtcbiAgICAgIGNvbnN0IGdhcFRleHQgPSBwb3NpdGlvbi5wYXJlbnQuY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpbnRlcmFjdGlvbi5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBnYXBUZXh0KTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgICB0aGlzLmNoZWNrTWF4TWF0Y2hBc3NvY2lhdGlvbnMoKTtcbiAgICB9XG5cbiAgICByZXNldChzYXZlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHBvc2l0aW9uLCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBwb3NpdGlvbi5wYXJlbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcG9zaXRpb24uaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggPyBwb3NpdGlvbi5pbmRleCA6IGNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgcG9zaXRpb24ucGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIGNoaWxkcmVuW2luZGV4XSk7XG4gICAgICB9KTtcbiAgICAgIHNhdmUgJiYgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tNYXhNYXRjaEFzc29jaWF0aW9ucygpIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICAvLyBjb25zdCBtYXhNaW4gPSArKGQuZ2V0QXR0cmlidXRlKCdtYXRjaC1taW4nKSB8fCAwKTtcbiAgICAgICAgLy8gY29uc3QgZGlzYWJsZSA9IG1heE1hdGNoIDw9IChkLmNoaWxkcmVuLmxlbmd0aCB8fCAwKTtcbiAgICAgICAgY29uc3QgZGlzYWJsZSA9IG1heE1hdGNoIDw9IChkLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpLmxlbmd0aCB8fCAwKTtcblxuICAgICAgICBkaXNhYmxlID8gZC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpIDogZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIGRpc2FibGUgPyBkLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKSA6IGQuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgcmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZ1tdKSB7XG4gICAgICAvLyBmb3IgcXRpLW1hdGNoLWludGVyYWN0aW9uIHRoZSBkcmFnIGludGVyYWN0aW9uIGNhbiBiZSByZXBsYWNlIHdpdGggYSBxdGktbWF0Y2gtdGFidWxhciBjbGFzc1xuICAgICAgLy8gd2hpY2ggc2hvd3MgdGhlIGRhdGEgaW4gYSBhIHRhYnVsYXIgd2F5LCBzbyBubyBkcmFnIGRyb3Agc2hvdWxkIGJlIGludm9sdmVkIHRoZW5cbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgcmVzcG9uc2UuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgICAgICBpZiAoZHJvcElkKSB7XG4gICAgICAgICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGRyb3BJZCk7XG4gICAgICAgICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICAgICAgICAgIGlmICghZHJvcHBhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgY2Fubm90IGZpbmQgZHJvcHBhYmxlIHdpdGggaWRlbnRpZmllcjogJHtkcm9wSWR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbm5vdCBmaW5kIGRyYWdnYWJsZSB3aXRoIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tNYXhNYXRjaEFzc29jaWF0aW9ucygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikpXG4gICAgICAgIDogQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSk7XG4gICAgICBjb25zdCBhc3NvY2lhdGlvbnMgPSBkcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSBhc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNhdmVSZXNwb25zZSgpIHtcbiAgICAgIGxldCByZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSkuZ2V0UmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gb25seSBmb3IgdGhlIHF0aS1vcmRlci1pbnRlcmFjdGlvbiwgYWJzdHJhY3RlZCB0aGlzIGF3YXkgaW4gYSBtZXRob2RcbiAgICAgICAgcmVzcG9uc2UgPSAodGhpcyBhcyBhbnkpLmdldFJlc3BvbnNlKCk7IC8vIENhbGwgdGhlIG1ldGhvZCBmcm9tIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVycywgZHJvcHBhYmxlSWRlbnRpZmllcl0uam9pbignICcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEnIH0pXG4gIGRhdGE6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1pdGVtJyB9KVxuICBiYXNlSXRlbVVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLXJlZicgfSlcbiAgYmFzZVJlZlVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnaWQnIH0pXG4gIGlkOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuICBtYW5pZmVzdDoge1xuICAgIHNjcmlwdDogc3RyaW5nW107XG4gICAgc3R5bGU6IHN0cmluZ1tdO1xuICAgIG1lZGlhOiBzdHJpbmdbXTtcbiAgfTtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgdXJpVG9NYW5pZmVzdCA9IHRoaXMuZGF0YS5zdGFydHNXaXRoKCdodHRwJylcbiAgICAgID8gdGhpcy5kYXRhXG4gICAgICA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlSXRlbVVybCArICcvJyArIHRoaXMuZGF0YSk7XG4gICAgLy8gZmV0Y2ggdGhlIGpzb24gZmlsZSBsb2NhdGVkIGF0IHRoZSBkYXRhIGF0dHJpYnV0ZVxuICAgIGZldGNoKHVyaVRvTWFuaWZlc3QpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2V0dXBDRVMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBNSDogQ2hhbmdlZCB0aGUgZGVmYXVsdCBib290c3RyYXAuanMgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSVxuICAvLyBCZWNhdXNlIHRoZSBvbGQgb25lIHVzZXMgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHRoYXQgaXMgbm90IGFsbG93ZWQgdG8gYmUgYWNjZXNzZWQgd2hlbiB0aGUgQ0lcbiAgLy8gaXMgZW1iZWRkZWQgaW4gYW4gaWZyYW1lIGFuZCBjb21pbmcgZnJvbSBhbm90aGVyIGRvbWFpblxuICAvLyBUaGVyZWZvciB3ZSBuZWVkIHRvIHVzZSB0aGUgbmV3IENFUyBBUEkgdG8gY29tbXVuaWNhdGVzIHZpYSB0aGUgYnJvYWRjYXN0IEFQSVxuICBzZXR1cENFUygpIHtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3BjaUNvbnRhaW5lcicpIGFzIEhUTUxJRnJhbWVFbGVtZW50LFxuICAgICAgaWZyYW1lV2luID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLFxuICAgICAgaWZyYW1lRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgIC8vIGNvbnN0IGNoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnY2VzX2NoYW5uZWwnKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIGlmcmFtZURvYy5vcGVuKCk7XG4gICAgaWZyYW1lRG9jLndyaXRlKGBcbiAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICA8bGluayBocmVmPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc3R5bGVbMF19YCl9JyByZWw9XCJzdHlsZXNoZWV0XCIgLz5cbiAgICAgICAgICA8c2NyaXB0IHNyYz0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnNjcmlwdFswXX1gKX0nPjwvc2NyaXB0PlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5PjwvYm9keT5cbiAgICAgIDwvaHRtbD5cbiAgICAgIGApO1xuXG4gICAgaWZyYW1lRG9jLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldElGcmFtZXMoKSB7XG4gICAgY29uc3QgaWZyYW1lc0luU2hhZG93Um9vdCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY29uc3Qgb3V0ZXJJRnJhbWVzID0gWy4uLmlmcmFtZXNJblNoYWRvd1Jvb3QsIC4uLmlmcmFtZV07XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2Ygb3V0ZXJJRnJhbWVzKSB7XG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXJEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIGlmIChvdXRlckRvYykge1xuICAgICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMob3V0ZXJEb2MsIG91dGVySUZyYW1lcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2V0IG9ubHkgdW5pcXVlIGlmcmFtZXNcbiAgICBvdXRlcklGcmFtZXMuZm9yRWFjaCgoaWZyYW1lLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKG91dGVySUZyYW1lcy5pbmRleE9mKGlmcmFtZSkgIT09IGluZGV4KSB7XG4gICAgICAgIG91dGVySUZyYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvdXRlcklGcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIGdldElubmVySUZyYW1lcyhpZnJhbWVEb2N1bWVudDogRG9jdW1lbnQsIGlmcmFtZXMgPSBbXSkge1xuICAgIC8vIEdldCBhbGwgaWZyYW1lcyBpbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVzID0gaWZyYW1lRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjdXJyZW50SWZyYW1lcy5mb3JFYWNoKGlmcmFtZSA9PiB7XG4gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgaWZyYW1lIHRvIHRoZSBsaXN0XG4gICAgICBpZnJhbWVzLnB1c2goaWZyYW1lKTtcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgZ2V0IGlmcmFtZXMgd2l0aGluIHRoZSBjdXJyZW50IGlmcmFtZVxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlmcmFtZSBzcmMgaXMgZnJvbSB0aGUgc2FtZSBvcmlnaW5cbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcblxuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMobmVzdGVkRG9jLCBpZnJhbWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgY3Jvc3Mtb3JpZ2luIGlmcmFtZTonLCBpZnJhbWVTcmMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlmcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHBvc3RUb1dpbmRvd0FuZElmcmFtZXModHlwZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICB3aW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgY29uc3QgaWZyYW1lcyA9IHRoaXMuZ2V0SUZyYW1lcygpO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIGlmcmFtZXMpIHtcbiAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3N0TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgeyB0eXBlLCBkYXRhIH0gPSBldmVudC5kYXRhO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc2V0UmVzcG9uc2UnOlxuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZ2V0UmVzcG9uc2UnOiB7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygncmVzcG9uc2VEYXRhJywgdGhpcy5yYXdSZXNwb25zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZ2V0TWVkaWEnOiB7XG4gICAgICAgIGNvbnN0IG1lZGlhRGF0YSA9IHRoaXMubWFuaWZlc3QubWVkaWEubWFwKG1lZGlhID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBtZWRpYS5zdGFydHNXaXRoKCdodHRwJykgPyBtZWRpYSA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlUmVmVXJsICsgJy8nICsgbWVkaWEpO1xuICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ21lZGlhRGF0YScsIG1lZGlhRGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc2V0U3RhZ2VIZWlnaHQnOlxuICAgICAgICBjb25zb2xlLmxvZygnc2V0U3RhZ2VIZWlnaHQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlICE9PSAnJztcbiAgfVxuXG4gIHNldCByZXNwb25zZSh2YWw6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWwgYXMgc3RyaW5nO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxpZnJhbWVcbiAgICAgICAgd2lkdGg9JHt0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKX1cbiAgICAgICAgaGVpZ2h0PSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpfVxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICB0aXRsZT1cInBjaUNvbnRhaW5lclwiXG4gICAgICAgIGlkPVwicGNpQ29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgIDwvaWZyYW1lPlxuICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLWludGVyYWN0aW9uJzogUXRpQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY291bnQtYXR0ZW1wdCcgfSlcbiAgcHVibGljIGNvdW50QXR0ZW1wdDogc3RyaW5nID0gJ3RydWUnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgdGl0bGU6ICdlbmQgYXR0ZW1wdCc7XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHVuZGVmaW5lZCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKExpdEVsZW1lbnQsICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgcGFydD1cImRyb3BzXCI+PC9zbG90PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbGl0L25vLWludmFsaWQtaHRtbCAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgTGl0RWxlbWVudCxcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG5cbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIb3RzcG90T3JkZXIoZTogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkZW50aWZpZXIgfSA9IGUuZGV0YWlsO1xuXG4gICAgY29uc3QgaG90c3BvdCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbmQoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpIGFzIFF0aUhvdHNwb3RDaG9pY2U7XG5cbiAgICBjb25zdCBtYXhTZWxlY3Rpb24gPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLmNob2ljZU9yZGVyaW5nKSB7XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChob3RzcG90Lm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBRdGlIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+IGkub3JkZXIgPiAwKS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdXNlciBhbHJlYWR5IHNlbGVjdGVkIDUgaW1hZ2VzLlxuICAgICAgICB9XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgUXRpSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiAhIWkub3JkZXIpLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIFF0aUhvdHNwb3RDaG9pY2VbXSkuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgICAgICBpZiAoaG90c3BvdC5vcmRlciA+IGhvdHNwb3Qub3JkZXIpIHtcbiAgICAgICAgICAgIGhvdHNwb3Qub3JkZXItLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhvdHNwb3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBob3RzcG90Lm9yZGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1jaG9pY2UtZWxlbWVudC1zZWxlY3RlZCcsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90c3BvdEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgIC8qIHdpZHRoOjEwMCU7ICovXG4gICAgICB9XG4gICAgYFxuICBdO1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgcHJvbXB0IC0tPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPCEtLSBzbG90IGZvciB0aGUgaW1hZ2UgYW5kIGhvdHNwb3RzIC0tPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90c3BvdC1pbnRlcmFjdGlvbic6IFF0aUhvdHNwb3RJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlSW50ZXJhY3Rpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIExpdEVsZW1lbnQsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgLyogOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfSAqL1xuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgcm93czogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBjb2xzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGxhc3RDaGVja2VkUmFkaW86IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBAc3RhdGUoKSByZXNwb25zZSA9IFtdO1xuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB3Yy9uby1jaGlsZC10cmF2ZXJzYWwtaW4tY29ubmVjdGVkY2FsbGJhY2tcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgd2Mvbm8tY2hpbGQtdHJhdmVyc2FsLWluLWNvbm5lY3RlZGNhbGxiYWNrXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy5yZXNwb25zZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy5yZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNwb25zZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gWy4uLnRoaXMucmVzcG9uc2UsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnJlc3BvbnNlKSA/IFsuLi50aGlzLnJlc3BvbnNlXSA6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMucmVzcG9uc2UuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMucmVzcG9uc2UuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG4vLyBUSElTIElTIE5PVCBVU0VEIElOIFRBQlVMQVIgTUFUQ0ggSU5URVJBQ1RJT05cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbi8vIHRzbGludDpkaXNhYmxlOiBpbmRlbnRcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWVkaWFJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgdmFsdWUgPSAwO1xuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHVuZGVmaW5lZCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uSW50ZXJhY3Rpb24ucHJvcGVydGllcyxcbiAgICAgIC4uLntcbiAgICAgICAgc3RlcDoge1xuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdzdGVwJyxcbiAgICAgICAgICBkZWZhdWx0OiAxMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gZ2V0IGF1ZGlvLCB2aWRlbyBvZiBvYmplY3QgdGFnLlxuICAgIGNvbnN0IG1lZGlhT2JqZWN0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndmlkZW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuICAgIGlmIChtZWRpYU9iamVjdCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGVuZGVkIGV2ZW50XG4gICAgICBtZWRpYU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDBcbiAgICAgICAgdGhpcy52YWx1ZSsrO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbic6IFF0aU1lZGlhSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJzsgLy8gSW1wb3J0IHRoZSBtaXhpblxuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgU2h1ZmZsZU1peGluKFxuICBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oTGl0RWxlbWVudCwgYHF0aS1zaW1wbGUtY2hvaWNlYCwgdHJ1ZSwgJ2Ryb3AtbGlzdCcpLFxuICAncXRpLXNpbXBsZS1jaG9pY2UnXG4pIHtcbiAgY2hpbGRyZW5NYXA6IEVsZW1lbnRbXTtcblxuICBAc3RhdGUoKSBuckNob2ljZXM6IG51bWJlciA9IDA7XG4gIEBzdGF0ZSgpIGNvcnJlY3RSZXNwb25zZXM6IHN0cmluZ1tdID0gW107XG4gIEBzdGF0ZSgpIHNob3dDb3JyZWN0UmVzcG9uc2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIG9yaWVudGF0aW9uIG9mIGNob2ljZXMgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgICAgZ3JpZC1hdXRvLWNvbHVtbnM6IDFmcjtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogcm93O1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcC1saXN0J10ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgaWYgKHRoaXMubnJDaG9pY2VzIDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubnJDaG9pY2VzID0gY2hvaWNlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxzbG90IHBhcnQ9XCJkcmFnc1wiPiA8L3Nsb3Q+XG4gICAgICAgIDxkaXYgcGFydD1cImRyb3BzXCI+XG4gICAgICAgICAgJHtBcnJheS5mcm9tKEFycmF5KHRoaXMubnJDaG9pY2VzKSkubWFwKFxuICAgICAgICAgICAgKF8sIGkpID0+XG4gICAgICAgICAgICAgIGh0bWxgPGRyb3AtbGlzdCBwYXJ0PVwiZHJvcC1saXN0XCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpfVwiPjwvZHJvcC1saXN0PiR7dGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcy5sZW5ndGggPiBpXG4gICAgICAgICAgICAgICAgICA/IHVuc2FmZUhUTUwoYDxzcGFuIHBhcnQ9J2NvcnJlY3QtcmVzcG9uc2UnPiR7dGhpcy5jb3JyZWN0UmVzcG9uc2VzW2ldfTwvc3Bhbj5gKVxuICAgICAgICAgICAgICAgICAgOiAnJ31gXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgICAgcmVzcG9uc2VzLmZvckVhY2goKHJlc3BvbnNlLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2ltcGxlQ2hvaWNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgaWYgKCFzaW1wbGVDaG9pY2UpIHtcbiAgICAgICAgICBzaW1wbGVDaG9pY2UgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gc2ltcGxlQ2hvaWNlPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcyA9IFsuLi50aGlzLmNvcnJlY3RSZXNwb25zZXMsIHRleHRdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IHRydWU7XG4gIH1cblxuICAvLyBzb21lIGludGVyYWN0aW9ucyBoYXZlIGEgZGlmZmVyZW50IHdheSBvZiBnZXR0aW5nIHRoZSByZXNwb25zZVxuICAvLyB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBkcmFnIGFuZCBkcm9wIG1peGluIGNsYXNzXG4gIC8vIHlvdSBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBnZXRSZXNwb25zZSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3NcbiAgLy8gY2F1c2UgdGhleSBhcmUgZGlmZmVyZW50IGZvciBzb21lIGludGVyYWN0aW9ucy5cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCByZXNwb25zZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5faW1nRWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gQXR0YWNoIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gPGltZz4gZWxlbWVudCBmb3VuZCBpbiA8cXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbj4nKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nOiBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTbGlkZXJJbnRlcmFjdGlvbi5UeXBlIChxdGktc2xpZGVyLWludGVyYWN0aW9uKSBwcmVzZW50cyB0aGUgY2FuZGlkYXRlIHdpdGggYSBjb250cm9sIGZvciBzZWxlY3RpbmcgYSBudW1lcmljYWwgdmFsdWUgYmV0d2VlbiBhIGxvd2VyIGFuZCB1cHBlciBib3VuZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guczYxeGNyajRxY3lqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDYuMFxuICpcbiAqIEBldmVudCBxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24gLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIHdhbnRzIHRvIHJlZ2lzdGVyIGl0c2VsZlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1yZXNwb25zZSAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gY2hhbmdlc1xuICpcbiAqIEBjc3Nwcm9wIC0tc2hvdy12YWx1ZSAtIHNob3dzIHRoZSBjdXJyZW50IHZhbHVlIHdoaWxlIHNsaWRpbmdcbiAqIEBjc3Nwcm9wIC0tc2hvdy10aWNrcyAtIHNob3dzIHRoZSB0aWNrcyBhY2NvcmRpbmcgdG8gc3RlcHNcbiAqIEBjc3Nwcm9wIC0tc2hvdy1ib3VuZHMgLSBzaG93cyB2YWx1ZSBmb3IgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG4gKlxuICogQGNzc3BhcnQgc2xpZGVyIC0tIHNsaWRlciBpbmx1ZGluZywgYm91bmRzIGFuZCB0aWNrcyBhbmQgdmFsdWUsIHVzZSBpdCBmb3IgcGFkZGluZ3MgYW5kIG1hcmdpbnNcbiAqIEBjc3NwYXJ0IGJvdW5kcyAtLSBkaXYgZm9yIGJvdW5kcywgY29udGFpbmluZyB0d28gZGl2cyBmb3Igd2l0aCBtaW4sIGFuZCBtYXggYm91bmRzIHZhbHVlXG4gKiBAY3NzcGFydCB0aWNrcyAtLSBkaXYgZm9yIHRpY2tzLCB1c2UgbGluZWFpciBncmFkaWVudCBhbmQgZXhwb3NlZCBjc3MgdmFyaWFibGVzIGZvciBzdHlsaW5nXG4gKiBAY3NzcGFydCByYWlsIC0tIGRpdiBmb3IgcmFpbCwgc3R5bGUgYWNjb3JkaW5nIHRvIG5lZWRzXG4gKiBAY3NzcGFydCBrbm9iIC0tIGRpdiwgc2hvdWxkIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlXG4gKiBAY3NzcGFydCB2YWx1ZSAtLSBkaXYsIGNvbnRhaW5pbmcgdmFsdWVcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgPHF0aS1zaW1wbGUtY2hvaWNlPiBtdXN0IGJlIHBsYWNlZC5cbiAqIEBzbG90IHByb21wdCAtIHNsb3Qgd2hlcmUgdGhlIHByb21wdCBpcyBwbGFjZWQuXG4gKi9cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVNsaWRlckludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSkgdmFsdWU6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWluJywgYCR7dGhpcy5fbWlufWApO1xuICB9XG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAndXBwZXItYm91bmQnIH0pIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4JywgYCR7dGhpcy5fbWF4fWApO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3N0ZXAnIH0pIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zdGVwJywgYCR7dGhpcy5fc3RlcH1gKTtcbiAgfVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG5cbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKG9sZCwgZGlzYWJsZWQpID0+IHt9O1xuXG4gIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChvbGQsIHJlYWRvbmx5KSA9PiB7fTtcblxuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIC8vIGNvbnZlcnQgdGhlIHZhbHVlLCB3aGljaCBpcyB0aGUgcmVhbCBzbGlkZXIgdmFsdWUgdG8gYSBwZXJjZW50YWdlIGZvciB0aGUgZG9tLlxuICAgIHRoaXMudmFsdWUgPCB0aGlzLm1pbiAmJiAodGhpcy52YWx1ZSA9IHRoaXMubWluKTtcbiAgICB0aGlzLnZhbHVlID4gdGhpcy5tYXggJiYgKHRoaXMudmFsdWUgPSB0aGlzLm1heCk7XG4gICAgY29uc3QgdmFsdWVQZXJjZW50YWdlID0gKCh0aGlzLnZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pKSAqIDEwMDtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXZhbHVlLXBlcmNlbnRhZ2UnLCBgJHt2YWx1ZVBlcmNlbnRhZ2V9JWApO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgdGhpcy52YWx1ZS50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IGlkPVwic2xpZGVyXCIgcGFydD1cInNsaWRlclwiPlxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy1ib3VuZHMnKSA9PSAndHJ1ZSdcbiAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cImJvdW5kc1wiIHBhcnQ9XCJib3VuZHNcIj5cbiAgICAgICAgICAgICAgPGRpdj4ke3RoaXMuX21pbn08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj4ke3RoaXMuX21heH08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXRpY2tzJykgPT0gJ3RydWUnID8gaHRtbGA8ZGl2IGlkPVwidGlja3NcIiBwYXJ0PVwidGlja3NcIj48L2Rpdj5gIDogbm90aGluZ31cbiAgICAgICAgPGRpdiBpZD1cInJhaWxcIiBwYXJ0PVwicmFpbFwiIEBtb3VzZWRvd249JHt0aGlzLl9vbk1vdXNlRG93bn0gQHRvdWNoc3RhcnQ9JHt0aGlzLl9vblRvdWNoTW92ZX0+XG4gICAgICAgICAgPGRpdiBpZD1cImtub2JcIiBwYXJ0PVwia25vYlwiPlxuICAgICAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdmFsdWUnKSA9PSAndHJ1ZSdcbiAgICAgICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJ2YWx1ZVwiIHBhcnQ9XCJ2YWx1ZVwiPiR7dGhpcy52YWx1ZX08L2Rpdj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnN0ZXAgPSAxO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2xpZGVyJyk7XG4gIH1cblxuICBwcml2YXRlIF9vblRvdWNoTW92ZShldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgICBjb25zdCBkaWZmWCA9IHggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlVG91Y2hFbmQpO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlVG91Y2hFbmQpO1xuXG4gICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBkaWZmWCA9IHggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBpZiB0aGUgcXRpLXNsaWRlci1pbnRlcmFjdGlvbiBoYXMgYW4gYWJzb2x1dGUgbGVmdCBwb3NpdGlvbiBhbmQgYm9keSBpcyBzY3JvbGxlZCBhIGJpdCwgdGFrZSBhY2NvdW50IGZvciB0aGF0XG4gICAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAvLyBpZiB0aGUgcXRpLXNsaWRlci1pbnRlcmFjdGlvbiBoYXMgYW4gYWJzb2x1dGUgbGVmdCBwb3NpdGlvbiBhbmQgYm9keSBpcyBzY3JvbGxlZCBhIGJpdCwgdGFrZSBhY2NvdW50IGZvciB0aGF0XG4gICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBjYWxjdWxhdGVWYWx1ZSBnZXRzIHggcG9zaXRpb24gYW5kIGNvbXBhcmVzIHRoaXMgd2l0aCB0aGUgdG90YWwgd2lkdGggaW4gcGl4ZWxzICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVmFsdWUoZGlmZlg6IG51bWJlcikge1xuICAgIGNvbnN0IHZhbHVlTm93ID0gdGhpcy5taW4gKyAoKHRoaXMubWF4IC0gdGhpcy5taW4pICogZGlmZlgpIC8gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCByb3VuZGVkU3RlcFZhbHVlID0gdGhpcy5taW4gKyBNYXRoLnJvdW5kKCh2YWx1ZU5vdyAtIHRoaXMubWluKSAvIHRoaXMuX3N0ZXApICogdGhpcy5fc3RlcDtcbiAgICB0aGlzLnZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgaXRlbUNvbnRleHQsXG4gIHR5cGUgQ2FsY3VsYXRlLFxuICB0eXBlIEl0ZW1Db250ZXh0LFxuICB0eXBlIFJlc3BvbnNlVmFyaWFibGVcbn0gZnJvbSAnQGNpdG9sYWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG4vKipcbiAqIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZmkyOXE4ZHViamd3XG4gKiA8cXRpLWN1c3RvbS1vcGVyYXRvciBjbGFzcz1cImpzLm9yZ1wiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwic3RyaW5nXCI+PCFbQ0RBVEFbXG4gICAgICAgICAgY29uc29sZS5sb2coY29udGV4dC52YXJpYWJsZXMpO1xuICAgICAgICAgIHJldHVybiAnQidcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgXV0+PC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLWN1c3RvbS1vcGVyYXRvcj5cbiAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20tb3BlcmF0b3InKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbU9wZXJhdG9yIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIENhbGN1bGF0ZSB7XG4gIHByaXZhdGUgb3BlcmF0b3JGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLmhhbmRsZVNsb3RDaGFuZ2V9Pjwvc2xvdD5gO1xuICB9XG5cbiAgaGFuZGxlU2xvdENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvLyBleHBlY3RpbmcgPFshQ0RBVEFbIC4uLiBdXT4gaXMgY29udmVydGVkIGludG8gPCEtLSAuLi4gLS0+IHdpdGggcXRpLXRyYW5zZm9ybTogY0RhdGFUb0NvbW1lbnRcbiAgICBjb25zdCBjb21tZW50Tm9kZSA9IEFycmF5LmZyb20odGhpcy5maXJzdEVsZW1lbnRDaGlsZD8uY2hpbGROb2RlcyA/PyBbXSkuZmluZChcbiAgICAgIG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9wZXJhdG9yRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAnZm4nLCAnaXRlbScsIGNvbW1lbnROb2RlLnRleHRDb250ZW50ID8/ICcnKTsgICAgICBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdjdXN0b20tb3BlcmF0b3IgY29udGFpbnMgaW52YWxpZCBqYXZhc2NyaXB0IGNvZGUnLCBlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGZuID0ge1xuICAgICAgdmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcik/LnZhbHVlID8/ICcnLFxuICAgICAgY29ycmVjdDogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICAodGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZSlcbiAgICAgICAgICA/LmNvcnJlY3RSZXNwb25zZSA/PyAnJ1xuICAgIH07XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIGdldFZhcmlhYmxlOiAodmFyaWFibGVJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZUlkZW50aWZpZXIpLFxuICAgICAgdXBkYXRlT3V0Y29tZVZhcmlhYmxlOiAob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7ICAgICAgICBcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlUmVzcG9uc2VWYXJpYWJsZTogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyByZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9OyAgIFxuICAgIFxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1ob3RzcG90Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnOiBRdGlBc3NvY2lhYmxlSG90c3BvdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAnOiBRdGlHYXA7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLWltZycpXG5leHBvcnQgY2xhc3MgUXRpR2FwSW1nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLWdhcC1pbWcnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLWltZyc6IFF0aUdhcEltZztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtdGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwVGV4dCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBRdGlDaG9pY2Uge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIGA7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FyaWEtb3JkZXJ2YWx1ZScsIHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSBvcmRlcjogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90c3BvdC1jaG9pY2UnOiBRdGlIb3RzcG90Q2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0IGV4dGVuZHMgUXRpQ2hvaWNlIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPjxkaXYgcGFydD1cImNoYVwiPjwvZGl2PjwvZGl2PlxuICAgICAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0JzogUXRpSG90dGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25TZWxlY3RJbmxpbmVDaG9pY2UpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW5saW5lLWNob2ljZS1yZWdpc3RlcicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25TZWxlY3RJbmxpbmVDaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdElubGluZUNob2ljZSgpIHtcbiAgICAvLyBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXNlbGVjdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZSc6IFF0aUlubGluZUNob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUNob2ljZSB9IGZyb20gJy4vaW50ZXJuYWwvY2hvaWNlL3F0aS1jaG9pY2UnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFNob3J0IHN1bW1hcnkgb2YgdGhlIGNvbXBvbmVudCdzIGludGVuZGVkIHVzZS5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guajludTFvYTF0dTNiXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBldmVudCBxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQgLSBFbWl0dGVkIHdoZW4gYSBjaG9pY2UgaXMgc2VsZWN0ZWQuXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWNob2ljZSAtIEVtaXR0ZWQgd2hlbiBhbiBjaG9pY2UgaXMgYWRkZWRcbiAqIEBldmVudCBxdGktbG9vc2UtY2hvaWNlIC0gRW1pdHRlZCB3aGVuIGEgY2hvaWNlIGlzIHJlbW92ZWRcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3QuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgUXRpQ2hvaWNlIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgW3BhcnQ9J2NoJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgYDtcblxuICAvLyBwcm9wZXJ0eSBsYWJlbFxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIG1hcmtlcjogc3RyaW5nO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlL3F0aS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICIrREFBQSxPQUFTLFdBQUFBLE9BQWUsZUFDeEIsT0FBUyxjQUFBQyxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxNQUFnQixvQkMyQmpDLFNBQVNDLEVBQU1DLEVBQWlDQyxFQUF3QixDQUM3RSxJQUFNQyxFQUEwQ0MsRUFBQSxDQUM5QyxxQkFBc0IsSUFDbkJGLEdBRUwsTUFBTyxDQUErQkcsRUFBa0JDLElBQTBELENBRWhILEdBQU0sQ0FBRSxPQUFBQyxDQUFPLEVBQUlGLEVBQ2JHLEVBQW9CLE1BQU0sUUFBUVAsQ0FBWSxFQUFJQSxFQUFlLENBQUNBLENBQVksRUFHcEZJLEVBQU0sT0FBUyxTQUEyQkksRUFBZ0UsQ0FDeEdELEVBQWtCLFFBQVFFLEdBQVksQ0FDcEMsSUFBTUMsRUFBTUQsRUFDWixHQUFJRCxFQUFhLElBQUlFLENBQUcsRUFBRyxDQUN6QixJQUFNQyxFQUFXSCxFQUFhLElBQUlFLENBQUcsRUFDL0JFLEVBQVcsS0FBS0YsQ0FBRyxFQUVyQkMsSUFBYUMsSUFDWCxDQUFDVixFQUFnQixzQkFBd0IsS0FBSyxhQUMvQyxLQUFLRyxDQUFlLEVBQStCTSxFQUFVQyxDQUFRLENBRzVFLENBQ0YsQ0FBQyxFQUVETixFQUFPLEtBQUssS0FBTUUsQ0FBWSxDQUNoQyxDQUNGLENBQ0YsQ0MxREEsT0FBUyxpQkFBQUssT0FBcUIsZUFTdkIsSUFBTUMsR0FBdUIsQ0FDbEMsQ0FDRSxXQUFZLG1CQUNaLFlBQWEsU0FDYixTQUFVLFNBQ1YsTUFBTyxVQUNQLEtBQU0sU0FDUixFQUNBLENBQ0UsV0FBWSxjQUNaLFlBQWEsU0FDYixTQUFVLFVBQ1YsTUFBTyxJQUNQLEtBQU0sVUFDUixDQUNGLEVBRWFDLEVBQWNGLEdBQTJCLE1BQU0sRUZJckQsSUFBTUcsRUFBTixjQUFnQ0MsRUFBVyxDQXNHaEQsYUFBYyxDQUNaLE1BQU0sRUFyR29CLGdCQUFxQixHQUNyQixjQUE2QixRQUM3QixtQkFBeUMsS0FJckUsMkJBQXdCLENBQUNDLEVBQVlDLElBQXNCLENBQ3pELEtBQUsscUJBQXFCLFFBQVFDLEdBQU9BLEVBQUcsU0FBV0QsQ0FBUyxDQUNsRSxFQUlBLDJCQUF3QixDQUFDRCxFQUFZRyxJQUNuQyxLQUFLLHFCQUFxQixRQUFRRCxHQUFPQSxFQUFHLFNBQVdDLENBQVMsRUFJbEUsS0FBUSxTQUF3QixDQUM5QixXQUFZLEtBQUssYUFBYSxZQUFZLEVBQzFDLFVBQVdDLEVBQ2IsRUErQ0EsS0FBUSxnQkFBeUNDLEVBQUFDLEVBQUEsR0FBSyxLQUFLLFVBQVYsQ0FBb0IsVUFBVyxLQUFLLFNBQVMsU0FBVSxHQUN4RyxLQUFRLGtCQUFtQyxDQUFDLEVBQzVDLEtBQVEscUJBQXNDLENBQUMsRUFpQzdDLEtBQUssaUJBQWlCLHdCQUF5QixHQUFLLENBQ2xELEtBQUssU0FBV0QsRUFBQUMsRUFBQSxHQUFLLEtBQUssVUFBVixDQUFvQixVQUFXLENBQUMsR0FBRyxLQUFLLFNBQVMsVUFBVyxFQUFFLE9BQU8sUUFBUSxDQUFFLEdBQy9GLEtBQUssZ0JBQWtCLEtBQUssU0FDNUIsRUFBRSxnQkFBZ0IsQ0FDcEIsQ0FBQyxFQUNELEtBQUssaUJBQWlCLHdCQUEwQixHQUFnQyxDQUM5RSxFQUFFLGdCQUFnQixFQUNsQixJQUFNQyxFQUFrQixFQUFFLE9BQzFCLEtBQUssa0JBQWtCLEtBQUtBLENBQWUsRUFDM0NBLEVBQWdCLGtCQUFrQkEsRUFBZ0IsaUJBQWlCLENBQ3JFLENBQUMsRUFDRCxLQUFLLGlCQUFpQiwyQkFBNkIsR0FBeUIsQ0FDMUUsRUFBRSxnQkFBZ0IsRUFDbEIsS0FBSyxxQkFBcUIsS0FBSyxFQUFFLE1BQXFCLENBQ3hELENBQUMsRUFDRCxLQUFLLGlCQUFpQixjQUFnQixHQUEwRSxDQUM5RyxHQUFNLENBQUUsbUJBQUFDLEVBQW9CLGFBQUFDLENBQWEsRUFBSSxFQUFFLE9BQy9DLEtBQUssdUJBQXVCRCxFQUFvQixNQUFNLEVBQ3RELEtBQUssZ0JBQWdCQyxDQUFZLENBQ25DLENBQUMsRUFFRCxLQUFLLGlCQUVILHdCQUNDLEdBQTRFLENBQzNFLEdBQU0sQ0FBRSxrQkFBQUMsRUFBbUIsTUFBQUMsQ0FBTSxFQUFJLEVBQUUsT0FDdkMsS0FBSyxzQkFBc0JELEVBQW1CQyxDQUFLLEVBQ25ELEVBQUUsZ0JBQWdCLENBQ3BCLENBQ0YsRUFFQSxLQUFLLGlCQUFpQiwyQkFBNEIsS0FBSyw0QkFBNEIsQ0FDckYsQ0FoSEEsSUFBVyxXQUF1RCxDQUNoRSxPQUFPLEtBQUssU0FBUyxVQUFVLElBQUlDLEdBQU1OLEVBQUEsQ0FDdkMsV0FBWU0sRUFBRSxXQUNkLE1BQU9BLEVBQUUsTUFDVCxLQUFNQSxFQUFFLE1BRUpBLEVBQUUsT0FBUyxXQUFhQSxFQUFFLGFBQWUsUUFDekMsQ0FBRSxlQUFpQkEsRUFBc0IsY0FBZSxFQUN4RCxDQUFDLEVBQ0wsQ0FDSixDQUVBLElBQVcsVUFBVUQsRUFBa0QsQ0FDckUsR0FBSSxDQUFDLE1BQU0sUUFBUUEsQ0FBSyxHQUFLQSxFQUFNLEtBQUtDLEdBQUssRUFBRSxlQUFnQkEsRUFBRSxFQUFHLENBQ2xFLFFBQVEsS0FBSyw4REFBOEQsRUFDM0UsTUFDRixDQUVBLEtBQUssU0FBV1AsRUFBQUMsRUFBQSxHQUNYLEtBQUssVUFETSxDQUVkLFVBQVcsS0FBSyxTQUFTLFVBQVUsSUFBSU8sR0FBWSxDQUNqRCxJQUFNQyxFQUFnQkgsRUFBTSxLQUFLQyxHQUFLQSxFQUFFLGFBQWVDLEVBQVMsVUFBVSxFQUMxRSxPQUFJQyxFQUNLUixJQUFBLEdBQUtPLEdBQWFDLEdBRXBCRCxDQUNULENBQUMsQ0FDSCxHQUVBLEtBQUssU0FBUyxVQUFVLFFBQVFBLEdBQVksQ0FDMUMsR0FBSUEsRUFBUyxPQUFTLFdBQVksQ0FDaEMsSUFBTUUsRUFBcUIsS0FBSyxxQkFBcUIsS0FDbERDLEdBQW9CQSxFQUFHLHFCQUF1QkgsRUFBUyxVQUMxRCxFQUNJRSxJQUNGQSxFQUFtQixTQUFXRixFQUFTLE1BRTNDLENBRUlBLEVBQVMsT0FBUyxXQUNwQixLQUFLLGtCQUFrQixRQUFRSSxHQUFNQSxFQUFHLGtCQUFrQkosRUFBUyxVQUFVLENBQUMsQ0FFbEYsQ0FBQyxDQUNILENBTUEsTUFBTSxtQkFBbUMsQ0FDdkMsTUFBTSxrQkFBa0IsRUFDeEIsTUFBTSxLQUFLLGVBQ1gsS0FBSyxNQUFxQyxnQ0FBaUMsSUFBSSxDQUNqRixDQUdBLElBQUksVUFBVUssRUFBb0MsQ0FDaEQsR0FBSUEsRUFDRixRQUFXQyxLQUFZRCxFQUFhLENBQ1QsS0FBSyxZQUFZQyxFQUFTLGtCQUFrQixHQUVuRSxLQUFLLHVCQUF1QkEsRUFBUyxtQkFBb0JBLEVBQVMsUUFBUSxFQUc1RSxJQUFNQyxFQUF1QyxLQUFLLHFCQUFxQixLQUNyRUMsR0FBS0EsRUFBRSxhQUFhLHFCQUFxQixJQUFNRixFQUFTLGtCQUMxRCxFQUNJQyxJQUNGQSxFQUFZLFNBQVdELEVBQVMsU0FFcEMsQ0FFSixDQUVTLFFBQVMsQ0FDaEIsT0FBT0csaUJBQ1QsQ0FzQ08sb0JBQW9CQyxFQUFlLENBSXhDLElBQU1DLEVBSG9CLEtBQUssU0FBUyxVQUFVLE9BQy9DQyxHQUE2QyxvQkFBcUJBLEdBQVFBLEVBQUssZUFDbEYsRUFDb0MsSUFBSUMsSUFDL0IsQ0FDTCxtQkFBb0JBLEVBQUcsV0FDdkIsU0FBVUEsRUFBRyxlQUNmLEVBQ0QsRUFDRCxRQUFXUCxLQUFZSyxFQUFXLENBQ2hDLElBQU1KLEVBQXVDLEtBQUsscUJBQXFCLEtBQ3JFQyxHQUFLQSxFQUFFLGFBQWEscUJBQXFCLElBQU1GLEVBQVMsa0JBQzFELEVBQ0FDLElBQWdCQSxFQUFZLGdCQUFrQkcsRUFBT0osRUFBUyxTQUFXLEdBQzNFLENBQ0YsQ0FFTyxnQkFBZ0JRLEVBQTRCLEdBQWUsQ0ExTHBFLElBQUFDLEVBMkxJLElBQU1DLEVBQW9CLEtBQUssY0FBcUMseUJBQXlCLEVBTTdGLE1BTEksQ0FBQ0EsR0FLRCxDQUFDQSxFQUFrQixRQUVkLElBR1RBLEVBQWtCLFFBQVEsRUFFdEIsS0FBSyxXQUFhLFNBRXBCLEtBQUssc0JBQXNCLG1CQUFvQixLQUFLLHFCQUFxQixDQUFDLEVBRzVFRixHQUNFLEtBQUssc0JBQ0gsZUFDQyxHQUFDQyxFQUFBLEtBQUssU0FBUyxVQUFVLEtBQUtoQixHQUFLQSxFQUFFLGFBQWUsYUFBYSxJQUFoRSxZQUFBZ0IsRUFBbUUsT0FBUSxHQUFHLFNBQVMsQ0FDM0YsRUFFRixLQUFLLE1BQU0sd0JBQXdCLEVBQzVCLEdBQ1QsQ0FFTyxnQkFBaUIsQ0FDdEIsS0FBSyxTQUFXLEtBQUssZUFDdkIsQ0FFTyxZQUFZRSxFQUFnRCxDQUNqRSxPQUFPLEtBQUssWUFBWUEsQ0FBVSxDQUNwQyxDQUVPLFdBQVdBLEVBQStDLENBQy9ELE9BQU8sS0FBSyxZQUFZQSxDQUFVLENBQ3BDLENBRU8sWUFBWUEsRUFBNkUsQ0FDOUYsT0FBTyxLQUFLLFNBQVMsVUFBVSxLQUFLbEIsR0FBS0EsRUFBRSxhQUFla0IsQ0FBVSxHQUFLLElBQzNFLENBSVEsNkJBQTZCQyxFQUF5QyxDQUM1RSxHQUFNLENBQUUsbUJBQUF2QixFQUFvQixTQUFBVyxDQUFTLEVBQUlZLEVBQU0sT0FDL0MsS0FBSyx1QkFBdUJ2QixFQUFvQlcsQ0FBUSxDQUMxRCxDQUVPLHVCQUF1QlcsRUFBb0JuQixFQUFzQyxDQUN0RixLQUFLLFNBQVdOLEVBQUFDLEVBQUEsR0FDWCxLQUFLLFVBRE0sQ0FFZCxVQUFXLEtBQUssU0FBUyxVQUFVLElBQUlNLEdBQU1BLEVBQUUsYUFBZWtCLEVBQWFsQixFQUFJUCxFQUFBQyxFQUFBLEdBQUtNLEdBQUwsQ0FBUSxNQUFPRCxDQUFNLEVBQUUsQ0FDeEcsR0FFQSxLQUFLLE1BQWlDLDBCQUEyQixDQUMvRCxLQUFNLEtBQUssV0FDWCxtQkFBb0JtQixFQUNwQixTQUFVLE1BQU0sUUFBUW5CLENBQUssRUFBSSxDQUFDLEdBQUdBLENBQUssRUFBSUEsQ0FDaEQsQ0FBQyxFQUVHLEtBQUssV0FBYSxTQUVwQixLQUFLLHNCQUFzQixtQkFBb0IsS0FBSyxxQkFBcUIsQ0FBQyxDQUU5RSxDQUVPLHNCQUFzQm1CLEVBQW9CbkIsRUFBc0MsQ0FoUXpGLElBQUFpQixFQWlRSSxJQUFNSSxFQUFrQixLQUFLLFdBQVdGLENBQVUsRUFFbEQsR0FBSSxDQUFDRSxFQUFpQixDQUNwQixRQUFRLEtBQUssdUNBQXVDRixDQUFVLHVCQUF1QixFQUNyRixNQUNGLENBRUEsS0FBSyxTQUFXekIsRUFBQUMsRUFBQSxHQUNYLEtBQUssVUFETSxDQUVkLFVBQVcsS0FBSyxTQUFTLFVBQVUsSUFBSU0sR0FDakNBLEVBQUUsYUFBZWtCLEVBQ1psQixFQUVGUCxFQUFBQyxFQUFBLEdBQ0ZNLEdBREUsQ0FFTCxNQUFPb0IsRUFBZ0IsY0FBZ0IsU0FBV3JCLEVBQVEsQ0FBQyxHQUFHQyxFQUFFLE1BQU9ELENBQWUsQ0FDeEYsRUFDRCxDQUNILEdBQ0EsS0FBSyxrQkFBa0IsUUFBUU0sR0FBTUEsRUFBRyxrQkFBa0JhLENBQVUsQ0FBQyxFQUVyRSxLQUFLLE1BQTZCLHNCQUF1QixDQUN2RCxLQUFNLEtBQUssV0FDWCxrQkFBbUJBLEVBQ25CLE9BQU9GLEVBQUEsS0FBSyxTQUFTLFVBQVUsS0FBS2hCLEdBQUtBLEVBQUUsYUFBZWtCLENBQVUsSUFBN0QsWUFBQUYsRUFBZ0UsS0FDekUsQ0FBQyxDQUNILENBRVEsc0JBQWlGLENBQ3ZGLE9BQUksS0FBSyxxQkFBcUIsTUFBTWIsR0FBc0JBLEVBQW1CLFNBQVMsQ0FBQyxFQUFVLFlBQzdGLEtBQUsscUJBQXFCLEtBQUtBLEdBQXNCQSxFQUFtQixTQUFTLENBQUMsRUFBVSxhQUN6RixlQUNULENBRVEsTUFBU2tCLEVBQU1DLEVBQVMsS0FBTSxDQUNwQyxLQUFLLGNBQ0gsSUFBSSxZQUFlRCxFQUFNLENBQ3ZCLFFBQVMsR0FDVCxTQUFVLEdBQ1YsT0FBQUMsQ0FDRixDQUFDLENBQ0gsQ0FDRixDQUNGLEVBN1E4QkMsRUFBQSxDQUEzQkMsRUFBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBRGZ0QyxFQUNpQixxQkFDQXFDLEVBQUEsQ0FBM0JDLEVBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQUZmdEMsRUFFaUIsMEJBQ0FxQyxFQUFBLENBQTNCQyxFQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FIZnRDLEVBR2lCLHdCQUNBcUMsRUFBQSxDQUEzQkMsRUFBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBSmZ0QyxFQUlpQiw2QkFFQ3FDLEVBQUEsQ0FBNUJDLEVBQVMsQ0FBRSxLQUFNLE9BQVEsQ0FBQyxHQU5oQnRDLEVBTWtCLHdCQUU3QnFDLEVBQUEsQ0FEQ0UsRUFBTSxXQUFZLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQVB0Q3ZDLEVBUVgscUNBSTZCcUMsRUFBQSxDQUE1QkMsRUFBUyxDQUFFLEtBQU0sT0FBUSxDQUFDLEdBWmhCdEMsRUFZa0Isd0JBRTdCcUMsRUFBQSxDQURDRSxFQUFNLFdBQVksQ0FBRSxxQkFBc0IsRUFBSyxDQUFDLEdBYnRDdkMsRUFjWCxxQ0FLUXFDLEVBQUEsQ0FGUEcsR0FBUSxDQUFFLFFBQVNDLENBQVksQ0FBQyxHQWpCdEJ6QyxFQW1CSCx3QkFuQkdBLEVBQU5xQyxFQUFBLENBRE5LLEdBQWMscUJBQXFCLEdBQ3ZCMUMsR0c5QmIsT0FBUyxjQUFBMkMsT0FBa0IsTUFDM0IsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkFPakMsSUFBTUMsRUFBTixjQUF1Q0MsRUFBVyxDQUFsRCxrQ0FJdUIsZ0JBQWEsR0FLYixVQUFPLEdBTW5DLE1BQWEsbUJBQW1DLENBQzlDLE1BQU0sa0JBQWtCLEVBRXhCLElBQU1DLEVBQVEsSUFBSSxNQUFNLHdDQUF5QyxDQUFFLFdBQVksR0FBTSxRQUFTLEVBQUssQ0FBQyxFQUdwRyxHQUZvQixLQUFLLGNBQWNBLENBQUssRUFFM0IsQ0FHZixJQUFNQyxFQUZPLEtBQUssUUFBUSxxQkFBcUIsRUFFdEIsY0FBYyx3QkFBd0IsS0FBSyxVQUFVLEdBQUcsRUFDN0VBLEVBQ0YsTUFBTSxLQUFLLHNCQUFzQkEsQ0FBVyxFQUU1QyxRQUFRLEtBQUsscUNBQXFDLEtBQUssVUFBVSxZQUFZLENBRWpGLENBQ0YsQ0FNQSxNQUFhLHNCQUFzQkEsRUFBc0IsQ0E3QzNELElBQUFDLEVBOENJLElBQU1DLEVBQU8sS0FBSyxLQUFLLFVBQVUsRUFBRyxLQUFLLEtBQUssWUFBWSxHQUFHLENBQUMsRUFDeERDLEVBQVcsTUFBTUMsR0FBaUIsRUFDckMsS0FBSyxLQUFLLElBQUksRUFDZCxLQUFLQyxHQUFPQSxFQUFJLEtBQUtILENBQUksRUFBRSxRQUFRLENBQUMsRUFDdkMsR0FBSUMsRUFBVSxDQUNaLElBQU1HLEVBQVdILEVBQVMsaUJBQWlCLG1DQUFtQyxFQUM5RUgsRUFBWSxPQUFPLEdBQUdNLENBQVEsSUFDZkwsRUFBQUUsRUFBUyxjQUFjLHlCQUF5QixJQUFoRCxZQUFBRixFQUFtRSxPQUN4RSxTQUFTLFNBQVMsR0FDMUJELEVBQVksVUFBVSxJQUFJLG1CQUFtQixDQUVqRCxDQUNGLENBQ0YsRUEvQzhCTyxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FKZlgsRUFJaUIsMEJBS0FVLEVBQUEsQ0FBM0JDLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQVRmWCxFQVNpQixvQkFUakJBLEVBQU5VLEVBQUEsQ0FETkUsR0FBYyw2QkFBNkIsR0FDL0JaLEdDUmIsT0FBUyxjQUFBYSxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxZQUFBQyxPQUFnQixvQkFHekIsSUFBTUMsR0FBVSxDQUNkLE1BQU8sRUFDVCxFQWNzQkMsRUFBZixjQUFpQ0MsRUFBVyxDQUE1QyxrQ0FHc0MsY0FBK0IsRUFVMUUsY0FBVyxHQVVYLGNBQVcsR0FVWCxhQUFVLEdBR1YscUJBQXFCQyxFQUFZQyxFQUFtQixDQUM5Q0EsR0FDRixLQUFLLFNBQVcsT0FDaEIsS0FBSyxLQUFLLEdBRVYsS0FBSyxTQUFXLENBRXBCLENBRVMsbUJBQW9CLENBQzNCLE1BQU0sa0JBQWtCLEVBRXhCLEtBQUssaUJBQWlCLFFBQVMsS0FBSyxRQUFRLEVBQzVDLEtBQUssaUJBQWlCLFFBQVMsS0FBSyxRQUFRLEVBRTVDLEtBQUssY0FDSCxJQUFJLFlBQVksc0JBQXVCLENBQ3JDLFFBQVMsR0FDVCxXQUFZLEdBQ1osU0FBVSxFQUNaLENBQUMsQ0FDSCxDQUNGLENBRVMsc0JBQXVCLENBQzlCLEtBQUssb0JBQW9CLFFBQVMsS0FBSyxRQUFRLEVBQy9DLEtBQUssb0JBQW9CLFFBQVMsS0FBSyxRQUFRLEVBRS9DLEtBQUssY0FDSCxJQUFJLFlBQVksbUJBQW9CLENBQ2xDLFFBQVMsR0FDVCxXQUFZLEdBQ1osU0FBVSxFQUNaLENBQUMsQ0FDSCxDQUNGLENBRU8sT0FBUSxDQUNiLEtBQUssUUFBVSxHQUNmLEtBQUssU0FBVyxFQUNsQixDQUVRLFNBQVNDLEVBQXNCLENBQ3JDLEdBQUksQ0FBQUEsRUFBTSxPQUVWLE9BQVFBLEVBQU0sUUFBUyxDQUNyQixLQUFLTCxHQUFRLE1BQ1hLLEVBQU0sZUFBZSxFQUNyQixLQUFLLGVBQWUsRUFDcEIsTUFFRixRQUNGLENBQ0YsQ0FFUSxVQUFXLENBQ2pCLEtBQUssZUFBZSxDQUN0QixDQUVRLGdCQUFpQixDQUNuQixLQUFLLFVBQVksS0FBSyxXQUMxQixLQUFLLFFBQVUsQ0FBQyxLQUFLLFFBRXJCLEtBQUssY0FDSCxJQUFJLFlBQVksOEJBQStCLENBQzdDLFFBQVMsR0FDVCxXQUFZLEdBQ1osU0FBVSxHQUNWLE9BQVEsQ0FBRSxXQUFZLEtBQUssV0FBWSxRQUFTLEtBQUssT0FBUSxDQUMvRCxDQUFDLENBQ0gsRUFDRixDQUVTLFFBQVMsQ0FDaEIsT0FBT0MsbUJBQ1QsQ0FDRixFQS9HOEJDLEVBQUEsQ0FBM0JDLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQUROUCxFQUNRLDBCQUVlTSxFQUFBLENBQTFDQyxHQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSyxDQUFDLEdBSHJCUCxFQUd1Qix3QkFVM0NNLEVBQUEsQ0FSQ0MsR0FBUyxDQUNSLFFBQVMsR0FDVCxLQUFNLFFBQ04sVUFBVyxnQkFDWCxVQUFXLENBQ1QsWUFBYUMsR0FBU0EsQ0FDeEIsQ0FDRixDQUFDLEdBWm1CUixFQWFwQix3QkFVQU0sRUFBQSxDQVJDQyxHQUFTLENBQ1IsUUFBUyxHQUNULEtBQU0sUUFDTixVQUFXLGdCQUNYLFVBQVcsQ0FDVCxZQUFhQyxHQUFTQSxDQUN4QixDQUNGLENBQUMsR0F0Qm1CUixFQXVCcEIsd0JBVUFNLEVBQUEsQ0FSQ0MsR0FBUyxDQUNSLFFBQVMsR0FDVCxLQUFNLFFBQ04sVUFBVyxlQUNYLFVBQVcsQ0FDVCxZQUFhQyxHQUFTQSxDQUN4QixDQUNGLENBQUMsR0FoQ21CUixFQWlDcEIsdUJBR0FNLEVBQUEsQ0FEQ0csRUFBTSxXQUFZLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQW5DN0JULEVBb0NwQixvQ0N4REYsT0FBUyxpQkFBQVUsT0FBcUIsb0JBQzlCLE9BQVMsUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQ0RqQyxPQUFTLE9BQUFDLE9BQVcsTUFFcEIsSUFBT0MsR0FBUUQ7QUFBQTtBQUFBO0FBQUE7RURjZixJQUFxQkUsRUFBckIsY0FBeUNDLEVBQVcsQ0FHekMsUUFBUyxDQUNoQixPQUFPQyxzREFDVCxDQUNGLEVBTnFCRixFQUNaLE9BQXlCRyxHQURiSCxFQUFyQkksRUFBQSxDQURDQyxHQUFjLGVBQWUsR0FDVEwsR0VoQnJCLE9BQVMsUUFBQU0sR0FBTSxjQUFBQyxPQUFrQixNQUNqQyxPQUFTLGlCQUFBQyxPQUFxQixvQkFFdkIsSUFBTUMsR0FBTixjQUF3QkMsRUFBVyxDQUMvQixRQUFTLENBQ2hCLE9BQU9DLGlCQUNULENBRVMsbUJBQTBCLENBSVgsS0FBSyxjQUFjLFFBQVEsU0FBUyxhQUFhLEdBQ3RELEtBQUssYUFBYSxPQUFRLFFBQVEsQ0FFckQsQ0FDRixFQWJhRixHQUFORyxFQUFBLENBRE5DLEdBQWMsWUFBWSxHQUNkSixJQ0hiLE9BQVMsY0FBQUssT0FBb0MsTUFDN0MsT0FBUyxpQkFBQUMsT0FBcUIsb0JBR3ZCLElBQU1DLEdBQU4sY0FBNEJDLEVBQVcsQ0FPbEMsYUFBYUMsRUFBNkUsQ0FDbEcsTUFBTSxhQUFhQSxDQUFrQixFQUVyQyxJQUFNQyxFQUFPLEtBQ1BDLEVBQU8sS0FBSyxhQUFhLE1BQU0sRUFFckMsR0FBSUEsSUFBUyxLQUFNLENBQ2pCLElBQU1DLEVBQVMsU0FBUyxjQUFjLE1BQU0sRUFDNUNBLEVBQU8sSUFBTSxhQUNiQSxFQUFPLEtBQU8sV0FDZEEsRUFBTyxNQUFRLFNBQ2ZBLEVBQU8sS0FBT0QsRUFDZEQsRUFBSyxZQUFZRSxDQUFNLEVBQ3ZCLEtBQUssVUFBWUEsQ0FDbkIsQ0FFQSxHQUFJLEtBQUssY0FBZ0IsS0FBTSxDQUM3QixJQUFNQSxFQUFTLFNBQVMsY0FBYyxPQUFPLEVBQzdDQSxFQUFPLE1BQVEsU0FDZkEsRUFBTyxZQUFjLEtBQUssWUFDMUJGLEVBQUssWUFBWUUsQ0FBTSxFQUN2QixLQUFLLFVBQVlBLENBQ25CLENBQ0YsQ0FFUyxzQkFBdUIsQ0FDOUIsR0FBSSxLQUFLLFVBQ1AsR0FBSSxDQUNGLEtBQUssVUFBVSxPQUFPLENBQ3hCLE9BQVNDLEVBQU8sQ0FDZCxRQUFRLElBQUksNkJBQTZCLENBQzNDLENBRUosQ0FDRixFQXpDYU4sR0FBTk8sRUFBQSxDQUROQyxHQUFjLGdCQUFnQixHQUNsQlIsSUNKYixPQUFTLFdBQUFTLE9BQWUsZUFDeEIsT0FBUyxPQUFBQyxHQUFLLFFBQUFDLE9BQVksTUFDMUIsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxHQUFVLFNBQUFDLE9BQWEsb0JDRi9DLE9BQVMsUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQUNqQyxPQUFTLGlCQUFBQyxPQUFxQixvQkFJdkIsSUFBTUMsRUFBTixjQUFxQ0MsRUFBVyxDQUM1QyxRQUFTLENBQ2hCLE9BQU9DLGlCQUNULENBRVUsY0FBY0MsRUFBeUQsQ0FDL0UsSUFBTUMsRUFBYSxNQUFNLEtBQUssS0FBSyxpQkFBaUIsK0JBQStCLENBQUMsRUFFcEYsR0FBSUEsRUFBVyxTQUFXLEVBQ3hCLE9BQU8sS0FHVCxJQUFNQyxFQUFnQkQsRUFBVyxJQUFJRSxHQUFLQSxFQUFFLFNBQVMsRUFDckQsT0FBSUQsRUFBYyxPQUFTLEdBQUtGLEVBQVMsY0FBZ0IsWUFBY0EsRUFBUyxjQUFnQixVQUN2RkUsRUFFRkEsRUFBYyxDQUFDLENBQ3hCLENBQ0YsRUFsQmFMLEVBQU5PLEVBQUEsQ0FETkMsR0FBYyx5QkFBeUIsR0FDM0JSLEdESU4sSUFBTVMsRUFBTixjQUFvQ0MsQ0FBdUIsQ0FBM0Qsa0NBRXFELG9CQUFxRCxLQWdCdEcsUUFBUyxDQTNCcEIsSUFBQUMsRUFBQUMsRUE0QkksSUFBTUMsR0FBUUQsR0FBQUQsRUFBQSxLQUFLLGNBQUwsWUFBQUEsRUFBa0IsVUFBVSxLQUFLRyxHQUFLQSxFQUFFLGFBQWUsS0FBSyxjQUE1RCxZQUFBRixFQUF5RSxNQUN2RixPQUFPRyxLQUFPLEtBQUssVUFBVUYsRUFBTyxLQUFNLENBQUMsQ0FBQyxFQUM5QyxDQUVBLElBQUksb0JBQWlELENBQ25ELElBQU1HLEVBQVEsS0FBSyxjQUFjLHlCQUF5QixFQUMxRCxHQUFJQSxFQUFPLENBQ1QsSUFBTUMsRUFBVSxJQUFJLElBQ3BCLFFBQVdDLEtBQVNGLEVBQU0saUJBQWlCLCtCQUErQixFQUFHLENBQ3ZFLENBQUNFLEVBQU0sYUFBYSxjQUFjLEdBQUtBLEVBQU0sYUFBYSxjQUFjLEdBQzFFLFFBQVEsTUFBTSwwRUFBMEUsRUFFMUYsSUFBTUMsRUFBYyxTQUFTRCxFQUFNLGFBQWEsY0FBYyxDQUFDLEVBQ3pERSxFQUFjLFNBQVNGLEVBQU0sYUFBYSxjQUFjLENBQUMsR0FDM0QsTUFBTUMsQ0FBVyxHQUFLLE1BQU1DLENBQVcsSUFDekMsUUFBUSxNQUFNLCtFQUErRSxFQUUvRkgsRUFBUSxJQUFJRSxFQUFhQyxDQUFXLENBQ3RDLENBQ0EsT0FBT0gsQ0FDVCxDQUNBLE9BQU8sSUFDVCxDQUVnQixtQkFBb0IsQ0FDbEMsTUFBTSxrQkFBa0IsRUFDeEIsSUFBTUksRUFBbUMsQ0FDdkMsV0FBWSxLQUFLLFdBQ2pCLFlBQWEsS0FBSyxZQUNsQixTQUFVLEtBQUssU0FDZixLQUFNLFVBQ04sTUFBTyxLQUNQLG1CQUFvQixLQUFLLG1CQUN6QixlQUFnQixLQUFLLGNBQ3ZCLEVBQ0FBLEVBQWdCLE1BQVEsS0FBSyxjQUFjQSxDQUFlLEVBQzFELEtBQUssY0FDSCxJQUFJLFlBQVksd0JBQXlCLENBQ3ZDLFFBQVMsR0FDVCxTQUFVLEdBQ1YsT0FBUSxDQUFFLFNBQVVBLENBQWdCLENBQ3RDLENBQUMsQ0FDSCxDQUNGLENBQ0YsRUEvRGFaLEVBVUosT0FBUyxDQUNkYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBS0YsRUFmb0RDLEVBQUEsQ0FBbkRDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxXQUFZLENBQUMsR0FEdkNmLEVBQ3lDLHdCQUNNYyxFQUFBLENBQXpEQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsaUJBQWtCLENBQUMsR0FGN0NmLEVBRStDLDhCQUM5QmMsRUFBQSxDQUEzQkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBSGZmLEVBR2lCLDBCQUNBYyxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FKZmYsRUFJaUIsMkJBSXJCYyxFQUFBLENBRk5FLEdBQVEsQ0FBRSxRQUFTQyxFQUFhLFVBQVcsRUFBSyxDQUFDLEVBQ2pEQyxHQUFNLEdBUElsQixFQVFKLDJCQVJJQSxFQUFOYyxFQUFBLENBRE5LLEdBQWMseUJBQXlCLEdBQzNCbkIsR0VUYixPQUFTLFdBQUFvQixPQUFlLGVBQ3hCLE9BQVMsT0FBQUMsR0FBSyxRQUFBQyxPQUFZLE1BQzFCLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsR0FBVSxTQUFBQyxPQUFhLG9CQVF4QyxJQUFNQyxFQUFOLGNBQXFDQyxDQUF1QixDQW1CeEQsUUFBUyxDQTdCcEIsSUFBQUMsRUFBQUMsRUE4QkksSUFBTUMsR0FBUUQsR0FBQUQsRUFBQSxLQUFLLGNBQUwsWUFBQUEsRUFBa0IsVUFBVSxLQUFLRyxHQUFLQSxFQUFFLGFBQWUsS0FBSyxjQUE1RCxZQUFBRixFQUF5RSxNQUN2RixPQUFPRyxLQUFPLEtBQUssVUFBVUYsRUFBTyxLQUFNLENBQUMsQ0FBQyxFQUM5QyxDQUVnQixtQkFBb0IsQ0FDbEMsTUFBTSxrQkFBa0IsRUFFeEIsSUFBTUcsRUFBcUMsQ0FDekMsU0FBVSxLQUFLLFNBQ2YsV0FBWSxLQUFLLFdBQ2pCLGdCQUFpQixLQUFLLGdCQUN0QixZQUFhLEtBQUssYUFBZSxTQUNqQyxRQUFTLEtBQUssUUFDZCxNQUFPLEtBQ1AsS0FBTSxXQUNOLGtCQUFtQixJQUNyQixFQUNBQSxFQUFpQixNQUFRLEtBQUssY0FBY0EsQ0FBZ0IsRUFFNUQsS0FBSyxjQUNILElBQUksWUFBWSx3QkFBeUIsQ0FDdkMsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQUUsU0FBVUEsQ0FBaUIsQ0FDdkMsQ0FBQyxDQUNILENBQ0YsQ0FFQSxJQUFZLGlCQUFxQyxDQUMvQyxJQUFJQyxFQUNFQyxFQUFrQixLQUFLLGNBQWMsc0JBQXNCLEVBQ2pFLEdBQUlBLEVBQWlCLENBQ25CLElBQU1DLEVBQVNELEVBQWdCLGlCQUFpQixXQUFXLEVBQzNELEdBQUksS0FBSyxjQUFnQixVQUFZQyxFQUFPLE9BQVMsRUFDbkRGLEVBQVNFLEVBQU8sQ0FBQyxFQUFFLFlBQ25CQSxFQUFPLENBQUMsRUFBRSxPQUFPLFVBQ1IsS0FBSyxjQUFnQixTQUFVLENBQ3hDRixFQUFTLENBQUMsRUFDVixRQUFTRyxFQUFJLEVBQUdBLEVBQUlELEVBQU8sT0FBUUMsSUFDakNILEVBQU8sS0FBS0UsRUFBT0MsQ0FBQyxFQUFFLFdBQVcsRUFDakNELEVBQU9DLENBQUMsRUFBRSxPQUFPLENBRXJCLENBQ0YsQ0FDQSxPQUFPSCxDQUNULENBRUEsSUFBWSxTQUFVLENBQ3BCLE9BQU8sS0FBSyxjQUFjLGFBQWEsQ0FDekMsQ0FDRixFQXRFYVIsRUFXSixPQUFTLENBQ2RZO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FLRixFQWhCb0RDLEVBQUEsQ0FBbkRDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxXQUFZLENBQUMsR0FEdkNkLEVBQ3lDLHdCQUV4QmEsRUFBQSxDQUEzQkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBSGZkLEVBR2lCLDBCQUVBYSxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FMZmQsRUFLaUIsMkJBSXJCYSxFQUFBLENBRk5FLEdBQVEsQ0FBRSxRQUFTQyxFQUFhLFVBQVcsRUFBSyxDQUFDLEVBQ2pEQyxHQUFNLEdBUklqQixFQVNKLDJCQVRJQSxFQUFOYSxFQUFBLENBRE5LLEdBQWMsMEJBQTBCLEdBQzVCbEIsR0NWYixPQUFTLGNBQUFtQixPQUFrQixNQUMzQixPQUFTLGlCQUFBQyxPQUFxQixvQkFHdkIsSUFBTUMsR0FBTixjQUF3Q0MsRUFBVyxDQVMxRCxFQVRhRCxHQUFORSxFQUFBLENBRE5DLEdBQWMsOEJBQThCLEdBQ2hDSCxJQ0piLE9BQVMsY0FBQUksR0FBWSxRQUFBQyxPQUFZLE1BQ2pDLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUd2QixJQUFNQyxHQUFOLGNBQTZCQyxFQUFXLENBQ3BDLFFBQVMsQ0FDaEIsT0FBT0MsaUJBQ1QsQ0FDRixFQUphRixHQUFORyxFQUFBLENBRE5DLEdBQWMsa0JBQWtCLEdBQ3BCSixJQ0piLE9BQVMsY0FBQUssR0FBWSxPQUFBQyxHQUFLLFFBQUFDLE9BQVksTUFDdEMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkFJakMsSUFBTUMsRUFBTixjQUE2QkMsRUFBVyxDQVM3Qyx1QkFBdUJDLEVBQUtDLEVBQW1CLENBQzFCLEtBQUssV0FBVyxNQUFNLEdBQUcsRUFDakMsUUFBU0MsR0FBc0IsQ0FDeEMsT0FBUUEsRUFBVyxDQUNqQixJQUFLLHFDQUNILEtBQUssYUFBYSxPQUFRLGtCQUFrQixFQUM1QyxNQUNGLElBQUssb0JBQ0gsS0FBSyxhQUFhLE9BQVEsRUFBRSxFQUM1QixNQUNGLFFBQ0UsS0FDSixDQUNGLENBQUMsQ0FDSCxDQVFTLFFBQVMsQ0FDaEIsT0FBT0MsaUJBQ1QsQ0FFUyxtQkFBMEIsQ0FDakMsTUFBTSxrQkFBa0IsRUFFeEIsS0FBSyxhQUFhLE9BQVEsa0JBQWtCLENBQzlDLENBQ0YsRUF4Q2FMLEVBeUJLLE9BQVNNO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUF4QllDLEVBQUEsQ0FBcENDLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQURmUixFQUMwQixrQkFFVE8sRUFBQSxDQUEzQkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBSGZSLEVBR2lCLG1CQUVBTyxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FMZlIsRUFLaUIsb0JBRW9CTyxFQUFBLENBQS9DQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsT0FBUSxDQUFDLEdBUG5DUixFQU9xQywwQkFFaERPLEVBQUEsQ0FEQ0UsRUFBTSxhQUFjLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQVJ4Q1QsRUFTWCxzQ0FUV0EsRUFBTk8sRUFBQSxDQURORyxHQUFjLGtCQUFrQixHQUNwQlYsR0NMYixPQUEyQixPQUFBVyxHQUFLLFFBQUFDLE9BQVksTUFDNUMsT0FBUyxpQkFBQUMsT0FBcUIsb0JDRDlCLE9BQVMsY0FBQUMsT0FBb0MsTUFDN0MsT0FBUyxZQUFBQyxPQUFnQixvQkNEbEIsSUFBTUMsR0FBbUIsSUFDdkIsSUFBSSxLQUFLLGFBQWEsRUFBRSxPQUFPLEVBQUcsRUFBRSxRQUFRLE1BQU8sRUFBRSxFQUdqREMsR0FBaUNDLEdBQTRCLENBRXhFLEdBQUksT0FBT0EsR0FBVyxTQUNwQixPQUFPQSxFQUVULElBQU1DLEVBQU9ILEdBQWlCLEVBQzlCLE9BQUlHLElBQVMsSUFDSkQsRUFBTyxlQUFlLEVBRXRCQSxFQUFPLFNBQVMsRUFBRSxRQUFRLElBQUssRUFBRSxFQUFFLFFBQVFDLEVBQU0sR0FBRyxDQUUvRCxFQUVPLFNBQVNDLEdBQWtCQyxFQUFnQixDQUNoRCxPQUFPQSxHQUFVLElBQ25CLENBRU8sU0FBU0MsR0FBb0JDLEVBQWEsQ0FNL0MsT0FMNkJBLEVBQzFCLFFBQVEsZUFBZ0IsSUFBSSxFQUM1QixRQUFRLFFBQVMsR0FBRyxFQUNwQixRQUFRLFNBQVUsU0FBUyxFQUMzQixRQUFRLFVBQVcsVUFBVSxDQUVsQyxDRHZCTyxJQUFlQyxFQUFmLGNBQW1DQyxFQUFXLENBYW5DLG1CQUFvQixDQUNsQyxNQUFNLGtCQUFrQixFQUN4QixLQUFLLGNBQ0gsSUFBSSxZQUF5Qix3QkFBeUIsQ0FDcEQsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLElBQ1YsQ0FBQyxDQUNILENBQ0YsQ0FFTyxrQkFBa0JDLEVBQTJCLENBQ2xELElBQU1DLEVBQW1CLEtBQUssUUFBUSxxQkFBcUIsRUFBd0IsV0FBV0QsQ0FBaUIsRUFFL0csR0FBSSxLQUFLLG9CQUFzQkEsR0FBcUIsQ0FBQ0MsRUFBaUIsT0FDdEUsSUFBSUMsRUFBVSxHQUNWLE1BQU0sUUFBUUQsRUFBZ0IsS0FBSyxFQUNyQ0MsRUFBVUQsRUFBZ0IsTUFBTSxTQUFTLEtBQUssVUFBVSxFQUV4REMsRUFDRyxDQUFDQyxHQUFrQixLQUFLLFVBQVUsR0FDakMsQ0FBQ0EsR0FBa0JGLEdBQUEsWUFBQUEsRUFBaUIsS0FBSyxHQUN6QyxLQUFLLGFBQWVBLEVBQWdCLE9BQ3RDLEdBR0osS0FBSyxhQUFhQyxDQUFPLENBQzNCLENBRVEsYUFBYUUsRUFBZ0IsQ0FDbkMsS0FBSyxXQUFjQSxHQUFTLEtBQUssV0FBYSxRQUFZLENBQUNBLEdBQVMsS0FBSyxXQUFhLE9BQVUsS0FBTyxLQUN6RyxDQUNGLEVBM0NZQyxFQUFBLENBRFRDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxXQUFZLENBQUMsR0FEOUJSLEVBRVYsd0JBR0hPLEVBQUEsQ0FETkMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLG9CQUFxQixDQUFDLEdBSnZDUixFQUtiLGlDQUdHTyxFQUFBLENBRFRDLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQVBOUixFQVFWLDBCQUdITyxFQUFBLENBRE5DLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxFQUFNLENBQUMsR0FWeEJSLEVBV2IsMEJEWEYsSUFBTVMsR0FBTixjQUErQkMsQ0FBWSxDQWF2QyxRQUFTLENBQ2hCLE9BQU9DLDRDQUE4QyxLQUFLLFVBQVUsWUFDdEUsQ0FFVSxhQUFhQyxFQUE2RSxDQUNsRyxLQUFLLGtCQUFrQixLQUFLLGlCQUFpQixDQUMvQyxDQUNGLEVBcEJhSCxHQUNLLE9BQVNJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFEZEosR0FBTkssRUFBQSxDQUROQyxHQUFjLG9CQUFvQixHQUN0Qk4sSUdMYixPQUFTLE9BQUFPLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxPQUFxQixvQkFJdkIsSUFBTUMsR0FBTixjQUFnQ0MsQ0FBWSxDQUE1QyxrQ0FVTCxLQUFTLE9BQVMsSUFBTUMsbUNBQXFDLEtBQUssVUFBVSxhQUM5RSxFQVhhRixHQUNLLE9BQVNHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFEZEgsR0FBTkksRUFBQSxDQUROQyxHQUFjLHFCQUFxQixHQUN2QkwsSUNMYixPQUFTLE9BQUFNLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxPQUFxQixvQkFJdkIsSUFBTUMsR0FBTixjQUErQkMsQ0FBWSxDQUEzQyxrQ0FVTCxLQUFTLE9BQVMsSUFBTUMsbUNBQXFDLEtBQUssVUFBVSxhQUM5RSxFQVhhRixHQUNLLE9BQVNHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFEZEgsR0FBTkksRUFBQSxDQUROQyxHQUFjLG9CQUFvQixHQUN0QkwsSUNMYixPQUFTLE9BQUFNLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGFBQUFDLE9BQWlCLCtCQ0QxQixPQUFTLFlBQUFDLE9BQWdCLG9CQUN6QixPQUFTLGNBQUFDLE9BQWtCLE1BRXBCLElBQWVDLEVBQWYsY0FBbUNDLEVBQVcsQ0FBOUMsa0NBQzJDLHdCQUE2QixHQUdqQyxjQUFXLEdBR1gsY0FBVyxHQUl2RCxJQUFJLGdCQUFnQkMsRUFBa0MsQ0FDcEQsUUFBUSxLQUFLLG9DQUFvQyxDQUNuRCxDQUVnQixtQkFBb0IsQ0FDbEMsTUFBTSxrQkFBa0IsRUFFeEIsS0FBSyxjQUNILElBQUksWUFBWSwyQkFBNEIsQ0FDMUMsUUFBUyxHQUNULFdBQVksR0FDWixTQUFVLEVBQ1osQ0FBQyxDQUNILENBQ0YsQ0FFTyxhQUFhQyxFQUEwQixDQUM1QyxLQUFLLGNBQ0gsSUFBSSxZQUFZLDJCQUE0QixDQUMxQyxRQUFTLEdBQ1QsV0FBWSxHQUNaLFNBQVUsR0FDVixPQUFRLENBQ04sbUJBQW9CLEtBQUssbUJBQ3pCLFNBQVUsTUFBTSxRQUFRQSxDQUFLLEVBQUksQ0FBQyxHQUFHQSxDQUFLLEVBQUlBLENBQ2hELENBQ0YsQ0FBQyxDQUNILENBQ0YsQ0FDRixFQXZDa0RDLEVBQUEsQ0FBL0NDLEdBQVMsQ0FBRSxVQUFXLHFCQUFzQixDQUFDLEdBRDFCTCxFQUM0QixrQ0FHSkksRUFBQSxDQUEzQ0MsR0FBUyxDQUFFLFFBQVMsR0FBTSxLQUFNLE9BQVEsQ0FBQyxHQUp0QkwsRUFJd0Isd0JBR0FJLEVBQUEsQ0FBM0NDLEdBQVMsQ0FBRSxRQUFTLEdBQU0sS0FBTSxPQUFRLENBQUMsR0FQdEJMLEVBT3dCLHdCRFA5QyxPQUFTLE9BQUFNLEdBQUssYUFBQUMsT0FBaUIsd0JBQy9CLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsR0FBVSxTQUFBQyxPQUFhLG9CQUl4QyxJQUFNQyxFQUFOLGNBQXlDQyxDQUFZLENBQXJELGtDQUdMLGlCQUFjQyxHQUErQixFQVc3QyxLQUFRLE9BQVMsR0FJakIsdUJBQXVCQyxFQUFLQyxFQUFtQixDQUMxQixLQUFLLFdBQVcsTUFBTSxHQUFHLEVBQ2pDLFFBQVNDLEdBQXNCLENBQ3hDLEdBQUlBLEVBQVUsV0FBVyxrQkFBa0IsRUFBRyxDQUM1QyxJQUFNQyxFQUFTRCxFQUFVLFFBQVEsb0JBQXFCLEVBQUUsRUFDcEQsS0FBSyxjQUNQLEtBQUssWUFBWSxNQUFNLEtBQU8sU0FBU0MsQ0FBTSxFQUVqRCxDQUNGLENBQUMsQ0FDSCxDQUVBLElBQVcsU0FBU0MsRUFBZSxDQUNqQyxLQUFLLE9BQVNBLElBQVUsT0FBWUEsRUFBUSxFQUM5QyxDQUVPLFVBQVcsQ0FDaEIsT0FBTyxLQUFLLFNBQVcsRUFDekIsQ0FFQSxXQUFvQixRQUFTLENBQzNCLE1BQU8sQ0FDTEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BWUYsQ0FDRixDQUVTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQTtBQUFBO0FBQUEsVUFHREMsR0FBSSxLQUFLLFdBQVcsQ0FBQztBQUFBO0FBQUE7QUFBQSxvQkFHWEMsR0FBU0EsRUFBTSx5QkFBeUIsQ0FBQztBQUFBLGtCQUMzQyxLQUFLLFdBQVc7QUFBQSxtQkFDZixLQUFLLFdBQVc7QUFBQSxpQkFDakJBLEdBQXNCLENBQzlCLElBQU1DLEVBQVFELEVBQU0sT0FDZkMsRUFBTSxjQUFjLEVBSXZCQSxFQUFNLGtCQUFrQixFQUFFLEdBSDFCQSxFQUFNLGtCQUFrQixLQUFLLFFBQVEsb0JBQXNCLGVBQWUsRUFDMUVBLEVBQU0sZUFBZSxFQUl6QixDQUFDO0FBQUEsdUJBQ2NDLEdBQVUsS0FBSyxnQkFBa0IsS0FBSyxnQkFBa0IsTUFBUyxDQUFDO0FBQUEscUJBQ3BFQSxHQUFVLEtBQUssZUFBaUIsS0FBSyxlQUFpQixNQUFTLENBQUM7QUFBQSxtQkFDbEVBLEdBQVUsS0FBSyxZQUFjLEtBQUssWUFBYyxNQUFTLENBQUM7QUFBQSxxQkFDeEQsS0FBSyxRQUFRO0FBQUEscUJBQ2IsS0FBSyxRQUFRO0FBQUEsaUJBQ2pCLEtBQUssTUFBTTtBQUFBLG1CQUUxQixDQUVVLFlBQVlGLEVBQWMsQ0FDbEMsR0FBSSxLQUFLLFVBQVksS0FBSyxTQUFVLE9BQ3BDLElBQU1DLEVBQVFELEVBQU0sT0FDcEIsS0FBSyxrQkFBa0JDLEVBQU0sS0FBSyxFQUM5QixLQUFLLFNBQVdBLEVBQU0sUUFDeEIsS0FBSyxPQUFTQSxFQUFNLE1BQ3BCLEtBQUssYUFBYUEsRUFBTSxLQUFLLEVBRWpDLENBRUEsT0FBYyxDQUNaLEtBQUssT0FBUyxFQUNoQixDQUVRLGtCQUFrQkUsRUFBYyxDQUN0QyxLQUFLLGFBQWEsUUFBU0EsSUFBUyxHQUFLLE9BQVMsT0FBTyxDQUMzRCxDQUNGLEVBOUY0REMsRUFBQSxDQUF6REMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLGlCQUFrQixDQUFDLEdBTjdDaEIsRUFNK0MsOEJBRUhlLEVBQUEsQ0FBdERDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxjQUFlLENBQUMsR0FSMUNoQixFQVE0QywyQkFHSWUsRUFBQSxDQUExREMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLGtCQUFtQixDQUFDLEdBWDlDaEIsRUFXZ0QsK0JBR25EZSxFQUFBLENBRFBFLEdBQU0sR0FiSWpCLEVBY0gsc0JBRXdDZSxFQUFBLENBQS9DQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsT0FBUSxDQUFDLEdBaEJuQ2hCLEVBZ0JxQywwQkFFaERlLEVBQUEsQ0FEQ0csRUFBTSxhQUFjLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQWpCeENsQixFQWtCWCxzQ0FsQldBLEVBQU5lLEVBQUEsQ0FETkksR0FBYywrQkFBK0IsR0FDakNuQixHRVJiLE9BQVMsT0FBQW9CLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkFDL0MsT0FBUyxhQUFBQyxPQUFpQiwrQkFDMUIsT0FBUyxhQUFBQyxPQUFpQix3QkMyQm5CLFNBQVNDLEdBQVVDLEVBQXVCQyxFQUE0QixDQUMzRSxJQUFJQyxFQUNFQyxFQUE4Q0MsRUFBQSxHQUMvQ0gsR0FFTCxNQUFPLENBQ0xJLEVBQ0FDLElBQ1MsQ0FDVCxHQUFNLENBQUUsa0JBQUFDLEVBQW1CLHFCQUFBQyxDQUFxQixFQUFJSCxFQUVwREEsRUFBTSxrQkFBb0IsVUFBMkIsQ0F6Q3pELElBQUFJLEVBMENNRixFQUFrQixLQUFLLElBQUksRUFDM0IsSUFBTUcsRUFBWUMsR0FBbUMsQ0FDbkQsSUFBTUMsRUFBa0IsTUFBTSxLQUFLLEtBQUssaUJBQWlCWixDQUFhLENBQUMsRUFDdkUsUUFBV2EsS0FBWUYsRUFBYyxDQUNuQyxJQUFNRyxFQUFhLE1BQU0sS0FBS0QsRUFBUyxVQUFVLEVBQUUsSUFBSUUsR0FBS0EsQ0FBWSxFQUNsRUMsRUFBZSxNQUFNLEtBQUtILEVBQVMsVUFBVSxFQUFFLElBQUlFLEdBQUtBLENBQVksRUFDdEVGLEVBQVMsT0FBUyxhQUFlQyxFQUFXLEtBQUtHLEdBQUtMLEVBQWdCLFNBQVNLLENBQUMsQ0FBQyxHQUNsRixLQUFLWCxDQUFlLEVBQStCUSxFQUFZRSxDQUFZLENBRWhGLENBQ0YsRUFDQWQsRUFBVyxJQUFJLGlCQUFpQlEsQ0FBUSxFQUN4Q1IsRUFBUyxRQUFRLEtBQU0sQ0FBRSxVQUFXLEdBQU0sUUFBUyxFQUFLLENBQUMsRUFFekQsSUFBTWdCLEdBQWdCVCxFQUFBLEtBQUssaUJBQWlCVCxDQUFhLElBQW5DLEtBQUFTLEVBQXdDLENBQUMsRUFDOUQsS0FBS0gsQ0FBZSxFQUErQixNQUFNLEtBQUtZLENBQWEsRUFBRyxDQUFDLENBQUMsQ0FDbkYsRUFFQWIsRUFBTSxxQkFBdUIsVUFBMkIsQ0FDdERHLEVBQXFCLEtBQUssSUFBSSxFQUM5Qk4sRUFBUyxXQUFXLENBQ3RCLENBQ0YsQ0FDRixDRHpETyxJQUFNaUIsRUFBTixjQUFzQ0MsQ0FBWSxDQUFsRCxrQ0FRTCxLQUFRLE9BQVMsR0FHakIsS0FBUSxjQUFnQixHQUd4QixLQUFRLE1BQVEsRUFFaEIsY0FBV0MsR0FBNEIsRUFJdkMsdUJBQXVCQyxFQUFLQyxFQUFpQixDQUN4QkEsRUFBUSxNQUFNLEdBQUcsRUFDekIsUUFBU0MsR0FBc0IsQ0FDeEMsR0FBSUEsRUFBVSxXQUFXLGlCQUFpQixFQUFHLENBQzNDLElBQU1DLEVBQVNELEVBQVUsUUFBUSxtQkFBb0IsRUFBRSxFQUN2RCxLQUFLLE1BQVEsU0FBU0MsQ0FBTSxDQUM5QixDQUNGLENBQUMsQ0FDSCxDQUVBLElBQVcsU0FBU0MsRUFBMkIsQ0FDN0MsS0FBSyxPQUFTQSxJQUFVLE9BQVlBLEVBQVEsRUFDOUMsQ0FFTyxVQUFXLENBQ2hCLE9BQU8sS0FBSyxTQUFXLEVBQ3pCLENBRUEsV0FBb0IsUUFBUyxDQUMzQixNQUFPLENBQ0xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQU1GLENBQ0YsQ0FFQSxJQUFJLGdCQUFnQkQsRUFBZSxDQUNqQyxLQUFLLGNBQWdCQSxDQUN2QixDQUVTLFFBQVMsQ0FDaEIsT0FBT0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUtPQyxHQUFzQixDQUM5QixJQUFNQyxFQUFRRCxFQUFNLE9BQ2ZDLEVBQU0sY0FBYyxFQUl2QkEsRUFBTSxrQkFBa0IsRUFBRSxHQUgxQkEsRUFBTSxrQkFBa0IsS0FBSyxRQUFRLG9CQUFzQixlQUFlLEVBQzFFQSxFQUFNLGVBQWUsRUFJekIsQ0FBQztBQUFBLG9CQUNXRCxHQUFTQSxFQUFNLHlCQUF5QixDQUFDO0FBQUEsa0JBQzNDLEtBQUssV0FBVztBQUFBLG1CQUNmLEtBQUssV0FBVztBQUFBLGdCQUNuQixLQUFLLGFBQWUsU0FBVyxTQUFXLE1BQU07QUFBQSx1QkFDekNFLEdBQVUsS0FBSyxnQkFBa0IsS0FBSyxnQkFBa0IsTUFBUyxDQUFDO0FBQUEsa0JBQ3ZFLEtBQUssTUFBTTtBQUFBLGdCQUNiLEtBQUssS0FBSztBQUFBLG1CQUNQQSxHQUFVLEtBQUssWUFBYyxLQUFLLFlBQWMsTUFBUyxDQUFDO0FBQUEscUJBQ3hELEtBQUssUUFBUTtBQUFBLHFCQUNiLEtBQUssUUFBUTtBQUFBO0FBQUEsNEJBRU4sS0FBSyxhQUFhO0FBQUEsS0FFNUMsQ0FJVSxZQUFZRixFQUFjLENBQ2xDLEdBQUksS0FBSyxVQUFZLEtBQUssU0FBVSxPQUNwQyxJQUFNQyxFQUFRRCxFQUFNLE9BQ3BCLEtBQUssa0JBQWtCQyxFQUFNLEtBQUssRUFDOUIsS0FBSyxTQUFXQSxFQUFNLFFBQ3hCLEtBQUssT0FBU0EsRUFBTSxNQUNwQixLQUFLLGFBQWFBLEVBQU0sS0FBSyxFQUVqQyxDQUVBLE9BQWMsQ0FDWixLQUFLLE9BQVMsRUFDaEIsQ0FFUSxrQkFBa0JFLEVBQWMsQ0FDdEMsS0FBSyxhQUFhLFFBQVNBLElBQVMsR0FBSyxPQUFTLE9BQU8sQ0FDM0QsQ0FDRixFQXJHNERDLEVBQUEsQ0FBekRDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxpQkFBa0IsQ0FBQyxHQUQ3Q2YsRUFDK0MsOEJBRUhjLEVBQUEsQ0FBdERDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxjQUFlLENBQUMsR0FIMUNmLEVBRzRDLDJCQUVJYyxFQUFBLENBQTFEQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsa0JBQW1CLENBQUMsR0FMOUNmLEVBS2dELCtCQUduRGMsRUFBQSxDQURQRSxHQUFNLEdBUEloQixFQVFILHNCQUdBYyxFQUFBLENBRFBFLEdBQU0sR0FWSWhCLEVBV0gsNkJBR0FjLEVBQUEsQ0FEUEUsR0FBTSxHQWJJaEIsRUFjSCxxQkFJd0NjLEVBQUEsQ0FBL0NDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxPQUFRLENBQUMsR0FsQm5DZixFQWtCcUMsMEJBRWhEYyxFQUFBLENBRENHLEVBQU0sWUFBWSxHQW5CUmpCLEVBb0JYLHNDQXBCV0EsRUFBTmMsRUFBQSxDQUROSSxHQUFjLDRCQUE0QixHQUM5QmxCLEdFUmIsT0FBUyxRQUFBbUIsR0FBTSxjQUFBQyxPQUFrQixNQUNqQyxPQUFTLGlCQUFBQyxPQUFxQixvQkNBOUIsT0FBUyxZQUFBQyxPQUFnQixvQkFZbEIsSUFBTUMsRUFBZSxDQUFvQ0MsRUFBZUMsSUFBcUIsQ0FDbEcsTUFBTUMsVUFBNEJGLENBQXVDLENBNkJ2RSxlQUFlRyxFQUFhLENBQzFCLE1BQU0sR0FBR0EsQ0FBSSxFQTdCZixLQUFPLGdCQUErQixDQUFDLEVBRVMsd0JBQTZCLEdBTTdFLEtBQU8sV0FBcUIsRUFPNUIsS0FBTyxXQUFxQixFQUc1QiwyQkFBd0IsQ0FBQ0MsRUFBWUMsSUFDbkMsS0FBSyxnQkFBZ0IsUUFBUUMsR0FBT0EsRUFBRyxTQUFXRCxDQUFTLEVBRzdELDJCQUF3QixDQUFDRCxFQUFZRyxJQUNuQyxLQUFLLGdCQUFnQixRQUFRRCxHQUFPQSxFQUFHLFNBQVdDLENBQVMsRUFHN0QsNkJBQTBCLElBQU0sS0FBSyxvQkFBb0IsRUFLdkQsS0FBSyxpQkFBaUIsc0JBQXVCLEtBQUssc0JBQXNCLEVBQ3hFLEtBQUssaUJBQWlCLG1CQUFvQixLQUFLLG1CQUFtQixDQUNwRSxDQUVBLFVBQW9CLENBSWxCLE9BSG1CLEtBQUssZ0JBQWdCLE9BQU8sQ0FBQ0MsRUFBS0MsSUFDNUNELEdBQU9DLEVBQUksUUFBVSxFQUFJLEdBQy9CLENBQUMsR0FDaUIsS0FBSyxVQUM1QixDQUVBLElBQUksU0FBU0MsRUFBa0MsQ0FDN0MsSUFBTUMsRUFBcUIsTUFBTSxRQUFRRCxDQUFhLEVBQUlBLEVBQWdCLENBQUNBLENBQWEsRUFDeEYsS0FBSyxnQkFBZ0IsUUFBUUUsR0FBTSxDQUNqQ0EsRUFBRyxRQUFVLEVBQUFELEVBQW1CLEtBQUtFLEdBQU1BLElBQU9ELEVBQUcsVUFBVSxDQUNqRSxDQUFDLENBQ0gsQ0FFQSxJQUFJLGdCQUFnQkYsRUFBa0MsQ0FDcEQsSUFBTUMsRUFBcUIsTUFBTSxRQUFRRCxDQUFhLEVBQUlBLEVBQWdCLENBQUNBLENBQWEsRUFDeEYsR0FBSUEsR0FBaUIsR0FBSSxDQUN2QixLQUFLLGdCQUFnQixRQUFRRSxHQUFNLENBQ2pDQSxFQUFHLGdCQUFnQix1QkFBdUIsQ0FDNUMsQ0FBQyxFQUNELE1BQ0YsQ0FDQSxLQUFLLGdCQUFnQixRQUFRQSxHQUFNLENBQ2pDQSxFQUFHLGFBQ0Qsd0JBQ0FELEVBQW1CLEtBQUtFLEdBQU1BLElBQU9ELEVBQUcsVUFBVSxFQUFJLE9BQVMsT0FDakUsQ0FDRixDQUFDLENBQ0gsQ0FFUyxtQkFBb0IsQ0FDM0IsTUFBTSxrQkFBa0IsRUFDeEIsS0FBSyxpQkFBaUIsc0JBQXVCLEtBQUssc0JBQXNCLEVBQ3hFLEtBQUssaUJBQWlCLDhCQUErQixLQUFLLDZCQUE2QixFQUN2RixLQUFLLGNBQ0gsSUFBSSxZQUFZLDJCQUE0QixDQUMxQyxRQUFTLEdBQ1QsV0FBWSxHQUNaLFNBQVUsRUFDWixDQUFDLENBQ0gsQ0FDRixDQUVTLHNCQUF1QixDQUM5QixNQUFNLHFCQUFxQixFQUMzQixLQUFLLG9CQUFvQiw4QkFBK0IsS0FBSyw2QkFBNkIsRUFDMUYsS0FBSyxvQkFBb0Isc0JBQXVCLEtBQUssc0JBQXNCLENBQzdFLENBRVEsdUJBQXVCRSxFQUFnQixDQUM3Q0EsRUFBRSxnQkFBZ0IsRUFDbEIsSUFBTUMsRUFBZ0JELEVBQUUsT0FDeEIsS0FBSyxnQkFBZ0IsS0FBS0MsQ0FBYSxFQUN2QyxLQUFLLGNBQWNBLENBQWEsQ0FDbEMsQ0FFUSxvQkFBb0JELEVBQWdCLENBQzFDQSxFQUFFLGdCQUFnQixFQUNsQixJQUFNQyxFQUFnQkQsRUFBRSxPQUN4QixLQUFLLGdCQUFnQixLQUFLQyxDQUFhLEVBQ3ZDLEtBQUssZ0JBQWtCLEtBQUssZ0JBQWdCLE9BQU9ULEdBQU1BLElBQU9TLENBQWEsQ0FDL0UsQ0FFUSxxQkFBc0IsQ0FDNUIsS0FBSyxnQkFBZ0IsUUFBUUEsR0FBaUIsQ0FDNUMsS0FBSyxjQUFjQSxDQUFhLENBQ2xDLENBQUMsQ0FDSCxDQUVRLGNBQWNBLEVBQTBCLENBQzFDLEtBQUssYUFBZSxFQUV0QkEsRUFBYyxhQUFhLE9BQVEsT0FBTyxFQUUxQ0EsRUFBYyxhQUFhLE9BQVEsVUFBVSxDQUVqRCxDQUVVLDhCQUE4QkMsRUFBOEQsQ0FDaEcsS0FBSyxhQUFlLEdBQ3RCLEtBQUssZ0JBQ0YsT0FBT0osR0FBTUEsRUFBRyxhQUFlSSxFQUFNLE9BQU8sVUFBVSxFQUN0RCxRQUFRSixHQUFNLENBQ2JBLEVBQUcsUUFBVSxFQUNmLENBQUMsRUFFTCxLQUFLLHVCQUF1QixDQUM5QixDQUVVLHdCQUF5QixDQUNqQyxJQUFNSyxFQUFzQixLQUFLLGdCQUFnQixPQUFPTCxHQUFNQSxFQUFHLE9BQU8sRUFBRSxJQUFJQSxHQUFNQSxFQUFHLFVBQVUsRUFFN0YsS0FBSyxXQUFhLElBQ2hCLEtBQUssYUFBZUssRUFBb0IsT0FDMUMsS0FBSyxnQkFBZ0IsUUFBUUwsR0FBT0EsRUFBRyxTQUFXLENBQUNBLEVBQUcsT0FBUSxFQUU5RCxLQUFLLGdCQUFnQixRQUFRQSxHQUFPQSxFQUFHLFNBQVcsRUFBTSxHQUk1RCxJQUFJTSxFQUNBLEtBQUssYUFBZSxFQUN0QkEsRUFBU0QsRUFBb0IsT0FBUyxFQUFJQSxFQUFvQixDQUFDLEVBQUksT0FFbkVDLEVBQVNELEVBR1gsS0FBSyxhQUFhQyxDQUFNLENBQzFCLENBRVUsYUFBYUMsRUFBVSxDQUMvQixLQUFLLGNBQ0gsSUFBSSxZQUFZLDJCQUE0QixDQUMxQyxRQUFTLEdBQ1QsU0FBVSxHQUNWLE9BQVEsQ0FDTixtQkFBb0IsS0FBSyxtQkFDekIsU0FBQUEsQ0FDRixDQUNGLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0EzSmtELE9BQUFDLEVBQUEsQ0FBL0NDLEdBQVMsQ0FBRSxVQUFXLHFCQUFzQixDQUFDLEdBSDFDbkIsRUFHNEMsa0NBTXpDa0IsRUFBQSxDQUpOQyxHQUFTLENBQ1IsS0FBTSxPQUNOLFVBQVcsYUFDYixDQUFDLEdBUkduQixFQVNHLDBCQU9Ba0IsRUFBQSxDQUpOQyxHQUFTLENBQ1IsS0FBTSxPQUNOLFVBQVcsYUFDYixDQUFDLEdBZkduQixFQWdCRywwQkFHUGtCLEVBQUEsQ0FEQ0UsRUFBTSxXQUFZLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQWxCN0NwQixFQW1CSixxQ0FJQWtCLEVBQUEsQ0FEQ0UsRUFBTSxXQUFZLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQXRCN0NwQixFQXVCSixxQ0FJQWtCLEVBQUEsQ0FEQ0UsRUFBTSxhQUFjLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQTFCL0NwQixFQTJCSix1Q0FvSUtBLENBQ1QsRUR6S08sSUFBTXFCLEdBQU4sY0FBb0NDLEVBQWFDLEdBQVksYUFBYSxDQUFFLENBQTVFLGtDQU1MLEtBQVMsT0FBUyxJQUFNQyxrQkFMZixtQkFBb0IsQ0FDM0IsTUFBTSxrQkFBa0IsRUFDeEIsS0FBSyxhQUFhLDBCQUEyQixFQUFFLENBQ2pELENBR0YsRUFQYUgsR0FBTkksRUFBQSxDQUROQyxHQUFjLHlCQUF5QixHQUMzQkwsSUVMYixPQUFTLE9BQUFNLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkFDL0MsT0FBUyxjQUFBQyxPQUFrQixnQ0FVcEIsSUFBTUMsRUFBTixjQUF5Q0MsQ0FBWSxDQUFyRCxrQ0EwQ0ksYUFBd0IsQ0FBQyxFQUV6QixtQkFBd0IsR0FHakMsZ0JBQXFCLFNBOUNyQixXQUFvQixRQUFTLENBQzNCLE1BQU8sQ0FDTEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQXVCRixDQUNGLENBc0JTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQSx1Q0FDNEIsS0FBSyxjQUFjLGdCQUFnQixLQUFLLFFBQVEsZ0JBQWdCLEtBQUssUUFBUTtBQUFBLFVBQzFHLEtBQUssUUFBUSxJQUNiQyxHQUFVRDtBQUFBLDZCQUNTQyxFQUFPLEtBQUssZ0JBQWdCQSxFQUFPLFFBQVEsS0FBS0MsR0FBV0QsRUFBTyxXQUFXLENBQUM7QUFBQSxXQUVuRyxDQUFDO0FBQUE7QUFBQTtBQUFBLFFBR0RDLEdBQVcsS0FBSyxhQUFhLENBQUM7QUFBQSxLQUVwQyxDQVlBLG1CQUFvQixDQUNsQixNQUFNLGtCQUFrQixFQUN4QixLQUFLLGlCQUFpQix1QkFBd0IsS0FBSyxjQUFjLEVBQ2pFLElBQU1DLEVBQVUsTUFBTSxLQUFLLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDLEVBQ3JFLEtBQUssUUFBVSxDQUNiLENBQ0UsWUFBYSxLQUFLLFdBQ2xCLE1BQU8sR0FDUCxTQUFVLEVBQ1osRUFDQSxHQUFHQSxFQUFRLElBQUlDLElBQVcsQ0FDeEIsWUFBYUEsRUFBTyxVQUNwQixNQUFPQSxFQUFPLGFBQWEsWUFBWSxFQUN2QyxTQUFVLEVBQ1osRUFBRSxDQUNKLENBQ0YsQ0FFQSxzQkFBdUIsQ0FDckIsS0FBSyxvQkFBb0IsdUJBQXdCLEtBQUssY0FBYyxDQUN0RSxDQUVPLFVBQW9CLENBQ3pCLElBQU1DLEVBQWlCLEtBQUssUUFBUSxLQUFLSixHQUFVQSxFQUFPLFFBQVEsRUFDbEUsT0FBT0ksRUFBaUJBLEVBQWUsUUFBVSxHQUFLLEVBQ3hELENBRU8sT0FBUSxDQUNiLEtBQUssUUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDSixFQUFRSyxJQUFPQyxFQUFBQyxFQUFBLEdBQUtQLEdBQUwsQ0FBYSxTQUFVSyxJQUFNLENBQUUsRUFBRSxDQUNuRixDQUVBLElBQVcsU0FBU0csRUFBZSxDQUNqQyxLQUFLLFFBQVUsS0FBSyxRQUFRLElBQUlSLElBQzlCUSxJQUFVUixFQUFPLFFBQVVBLEVBQU8sU0FBVyxJQUN0Q0EsRUFDUixDQUNILENBRUEsSUFBSSxnQkFBZ0JRLEVBQW9DLENBQ3RELEdBQUlBLElBQVUsR0FBSSxDQUNoQixLQUFLLGNBQWdCLEdBQ3JCLE1BQ0YsQ0FDQSxLQUFLLGNBQWdCLCtCQUNuQixLQUFLLFFBQVEsS0FBS1IsR0FBVVEsSUFBVVIsRUFBTyxLQUFLLEVBQUUsV0FDdEQsU0FDRixDQUVPLGVBQWVTLEVBQWMsQ0FDbEMsSUFBTUMsRUFBdUJELEVBQU0sT0FBNkIsTUFDaEUsS0FBSyxRQUFVLEtBQUssUUFBUSxJQUFJVCxHQUFXTSxFQUFBQyxFQUFBLEdBQUtQLEdBQUwsQ0FBYSxTQUFVQSxFQUFPLFFBQVVVLENBQW9CLEVBQUUsRUFDekcsS0FBSyxhQUFhQSxDQUFtQixDQUN2QyxDQUNGLEVBOUhhZCxFQTZCRyxnQkFBa0IsQ0FDOUIsR0FDQSxvQkFDQSxvQkFDQSxvQkFDQSxvQkFDQSxvQkFDQSxxQkFDQSxxQkFDQSxxQkFDQSxvQkFDRixFQUVTZSxFQUFBLENBQVJDLEdBQU0sR0ExQ0loQixFQTBDRix1QkFFQWUsRUFBQSxDQUFSQyxHQUFNLEdBNUNJaEIsRUE0Q0YsNkJBR1RlLEVBQUEsQ0FEQ0UsR0FBUyxDQUFFLFVBQVcsY0FBZSxLQUFNLE1BQU8sQ0FBQyxHQTlDekNqQixFQStDWCwwQkEvQ1dBLEVBQU5lLEVBQUEsQ0FETkcsR0FBYywrQkFBK0IsR0FDakNsQixHQ1hiLE9BQVMsUUFBQW1CLEdBQU0sY0FBQUMsT0FBa0IsTUFDakMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkNZeEMsT0FBUyxZQUFBQyxPQUFnQixvQkFLbEIsSUFBTUMsR0FBZSxDQUFvQ0MsRUFBZUMsSUFBcUIsQ0FDbEcsTUFBTUMsVUFBdUJGLENBQVcsQ0FBeEMsa0NBQ0UsS0FBUSxTQUFvQixHQVE1QixJQUFJLFFBQVFHLEVBQWdCLENBQzFCLElBQU1DLEVBQVcsS0FBSyxTQUN0QixLQUFLLFNBQVdELEVBQ1pBLEVBQ0YsS0FBSyxnQkFBZ0IsRUFFckIsS0FBSyxxQkFBcUIsRUFFNUIsS0FBSyxjQUFjLFVBQVdDLENBQVEsQ0FDeEMsQ0FFQSxJQUFJLFNBQW1CLENBQ3JCLE9BQU8sS0FBSyxRQUNkLENBRUEsbUJBQW9CLENBQ2xCLE1BQU0sa0JBQWtCLEVBR3BCLEtBQUssUUFDUCxLQUFLLGdCQUFnQixFQUVyQixLQUFLLHFCQUFxQixDQUU5QixDQUVRLGlCQUFrQixDQUN4QixJQUFNQyxFQUFVLE1BQU0sS0FBSyxLQUFLLGlCQUE4QkosQ0FBUSxDQUFDLEVBRWpFSyxFQUFnRSxDQUFDLEVBQ2pFQyxFQUF1QyxDQUFDLEVBWTlDLEdBVEFGLEVBQVEsUUFBUSxDQUFDRyxFQUFRQyxJQUFVLENBQzdCRCxFQUFPLGFBQWEsT0FBTyxFQUM3QkYsRUFBYyxLQUFLLENBQUUsUUFBU0UsRUFBUSxNQUFPQyxDQUFNLENBQUMsRUFFcERGLEVBQWlCLEtBQUtDLENBQU0sQ0FFaEMsQ0FBQyxFQUdHRCxFQUFpQixRQUFVLEVBQzdCLE1BQU0sSUFBSSxNQUFNLGlFQUFpRSxFQUduRixJQUFJRyxFQUFhLEdBQ1hDLEVBQWMsR0FDaEJDLEVBQVUsRUFHZCxLQUFPLENBQUNGLEdBQWNFLEVBQVVELEdBQWEsQ0FDM0NDLElBR0EsUUFBU0MsRUFBSU4sRUFBaUIsT0FBUyxFQUFHTSxFQUFJLEVBQUdBLElBQUssQ0FDcEQsSUFBTUMsRUFBSSxLQUFLLE1BQU0sS0FBSyxPQUFPLEdBQUtELEVBQUksRUFBRSxFQUM1QyxDQUFDTixFQUFpQk0sQ0FBQyxFQUFHTixFQUFpQk8sQ0FBQyxDQUFDLEVBQUksQ0FBQ1AsRUFBaUJPLENBQUMsRUFBR1AsRUFBaUJNLENBQUMsQ0FBQyxDQUN4RixDQVFBLEdBTEFILEVBQWFILEVBQWlCLEtBQUssQ0FBQ0MsRUFBUUMsSUFDcEJKLEVBQVEsUUFBUUcsQ0FBTSxJQUNuQkMsQ0FDMUIsRUFFR0MsRUFBWSxLQUNsQixDQUVBLEdBQUksQ0FBQ0EsRUFDSCxNQUFNLElBQUksTUFBTSx3REFBd0QsRUFJMUUsSUFBSUssRUFBUSxFQUNaVixFQUFRLFFBQVEsQ0FBQ0csRUFBcUJDLElBQVUsQ0FDMUNELEVBQU8sYUFBYSxPQUFPLEVBQzdCQSxFQUFPLE1BQU0sWUFBWSxRQUFTLE9BQU9PLEdBQU8sQ0FBQyxFQUUxQlIsRUFBaUIsTUFBTSxFQUM5QixNQUFNLFlBQVksUUFBUyxPQUFPUSxHQUFPLENBQUMsQ0FFOUQsQ0FBQyxDQUNILENBRVEsc0JBQXVCLENBQ2IsTUFBTSxLQUFLLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDLEVBQzdELFFBQVEsQ0FBQ1AsRUFBUUMsSUFBVSxDQUNqQ0QsRUFBTyxNQUFNLFlBQVksUUFBUyxTQUFTLENBQzdDLENBQUMsQ0FDSCxDQUNGLENBM0ZNLE9BQUFRLEVBQUEsQ0FMSEMsR0FBUyxDQUNSLEtBQU0sT0FDTixRQUFTLEdBQ1QsVUFBV0MsRUFDYixDQUFDLEdBUkdoQixFQVNBLHVCQTRGQ0EsQ0FDVCxFQUVNZ0IsR0FBMkIsQ0FDL0IsY0FBY2YsRUFBK0IsQ0FDM0MsT0FBT0EsSUFBVSxNQUNuQixFQUNBLFlBQVlBLEVBQXdCLENBQ2xDLE9BQU9BLEVBQVEsT0FBUyxPQUMxQixDQUNGLEVDckhBLE9BQVMsWUFBQWdCLE9BQWdCLG9CQVdsQixJQUFNQyxHQUFrQixDQUFvQ0MsRUFBZUMsSUFBcUIsQ0FDckcsTUFBTUMsVUFBMEJGLENBQVcsQ0FBM0Msa0NBQ0UsS0FBUSxTQUFxQixDQUFDLEVBQzlCLEtBQVEsV0FBYSxDQUFDLHFCQUFzQix5QkFBMEIsd0JBQXdCLEVBQzlGLEtBQVEsa0JBQW9CLENBQUMsMkJBQTRCLCtCQUErQixFQU14RixJQUFJLE1BQU1HLEVBQWUsQ0FDbEJBLElBSUwsS0FBSyxTQUFXQSxFQUFNLE1BQU0sR0FBRyxFQUUvQixLQUFLLFdBQVcsRUFFbEIsQ0FDQSxJQUFJLE9BQWdCLENBN0N4QixJQUFBQyxFQThDTSxRQUFPQSxFQUFBLEtBQUssV0FBTCxZQUFBQSxFQUFlLEtBQUssT0FBUSxFQUNyQyxDQUVtQixRQUFRQyxFQUEwQyxDQUNuRSxNQUFNLFFBQVFBLENBQWtCLEVBQzVCQSxFQUFtQixJQUFJLFNBQVMsR0FDbEMsS0FBSyxXQUFXLENBRXBCLENBRVEsWUFBYSxDQUNuQixJQUFNQyxFQUFxQixLQUFLLFNBQVMsS0FDdkNDLEdBQU8sS0FBSyxXQUFXLFNBQVNBLENBQUcsR0FBSyxLQUFLLGtCQUFrQixTQUFTQSxDQUFHLENBQzdFLEVBQ01DLEVBQVdMLEdBQ1IsQ0FBQyxNQUFNLENBQUNBLENBQUssRUFFdEIsR0FBSUcsRUFBb0IsQ0FFdEIsSUFBTUcsRUFEaUIsTUFBTSxLQUFLLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDLEVBQUUsSUFBSUMsR0FBS0EsQ0FBb0IsRUFFeEcsSUFBSSxDQUFDQyxFQUFxQkMsS0FDbEIsQ0FBRSxHQUFJRCxFQUFRLE1BQU9ILEVBQVNHLEVBQU8sTUFBTSxLQUFLLEVBQUksQ0FBQ0EsRUFBTyxNQUFNLE1BQVFDLEVBQVEsQ0FBRSxFQUM1RixFQUNBLEtBQUssQ0FBQ0MsRUFBR0MsSUFBTUQsRUFBRSxNQUFRQyxFQUFFLEtBQUssRUFDaEMsSUFBSUgsR0FBVUEsRUFBTyxFQUFFLEVBQzFCLFFBQVNJLEVBQUksRUFBR0EsRUFBSU4sRUFBUSxPQUFRTSxJQUNqQ04sRUFBUU0sQ0FBQyxFQUFzQixPQUFTLEtBQUssVUFBVUEsRUFBSSxDQUFDLENBRWpFLENBQ0YsQ0FDUSxVQUFVSCxFQUFlLENBQy9CLElBQUlJLEVBQVksS0FBSyxTQUFTLE9BQU9OLEdBQUssS0FBSyxXQUFXLFNBQVNBLENBQUMsQ0FBQyxFQUFFLElBQUksRUFDckVPLEVBQWtCLEtBQUssU0FBUyxPQUFPUCxHQUFLLEtBQUssa0JBQWtCLFNBQVNBLENBQUMsQ0FBQyxFQUFFLElBQUksRUFFdEYsQ0FBQ00sR0FBYUMsSUFFaEJELEVBQVksMEJBRWQsSUFBSUUsRUFBUSxHQUNaLE9BQVFGLEVBQVcsQ0FDakIsSUFBSyxxQkFDSEUsRUFBUSxHQUFHTixDQUFLLEdBQ2hCLE1BQ0YsSUFBSyx5QkFDSE0sRUFBUSxHQUFHLE9BQU8sYUFBYSxHQUFLTixFQUFRLENBQUMsQ0FBQyxHQUM5QyxNQUNGLElBQUsseUJBQ0hNLEVBQVEsR0FBRyxPQUFPLGFBQWEsR0FBS04sRUFBUSxDQUFDLENBQUMsR0FDOUMsS0FDSixDQUNBLE9BQUlLLElBQW9CLDJCQUN0QkMsR0FBUyxJQUNBRCxJQUFvQixrQ0FDN0JDLEdBQVMsS0FFSkEsQ0FDVCxDQUNGLENBcEVNLE9BQUFDLEVBQUEsQ0FKSEMsR0FBUyxDQUNSLEtBQU0sT0FDTixRQUFTLEVBQ1gsQ0FBQyxHQVJHbEIsRUFTQSxxQkFxRUNBLENBQ1QsRUN6R0EsT0FBUyxPQUFBbUIsT0FBVyxNQUlwQixJQUFPQyxHQUFRRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7RUhLUixJQUFNRSxFQUFOLGNBQ0dDLEdBQ05DLEdBQWFDLEVBQWFDLEdBQVksbUJBQW1CLEVBQUcsbUJBQW1CLEVBQy9FLG1CQUNGLENBRUYsQ0FPRSxRQUFTLENBQ1AsT0FBT0MseURBQ1QsQ0FDRixFQWhCYUwsRUFPSixPQUF5Qk0sR0FJekJDLEVBQUEsQ0FETkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBVmZSLEVBV0osMkJBWElBLEVBQU5PLEVBQUEsQ0FETkUsR0FBYyx3QkFBd0IsR0FDMUJULEdJVGIsT0FBUyxPQUFBVSxHQUFLLFFBQUFDLEdBQU0sY0FBQUMsT0FBa0IsTUFDdEMsT0FBUyxpQkFBQUMsT0FBcUIsb0JBSXZCLElBQU1DLEdBQU4sY0FBbUNDLEVBQVcsQ0FTMUMsUUFBUyxDQUNoQixPQUFPQyxpQkFDVCxDQUVPLFNBQVUsQ0FDZixJQUFNQyxFQUFRLElBQUlDLEdBQ1pDLEVBQVEsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUMvQkYsRUFBTSxRQUFRRSxDQUFLLENBQ3JCLENBQ0YsRUFsQmFMLEdBQ0osT0FBUyxDQUNkTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBS0YsRUFQV04sR0FBTk8sRUFBQSxDQUROQyxHQUFjLHdCQUF3QixHQUMxQlIsSUEwQk4sSUFBTUksR0FBTixLQUFvQyxDQUNsQyxRQUFRQyxFQUFzQixDQUNuQyxRQUFXSSxLQUFRSixFQUNqQkksRUFBSyxRQUFRLENBRWpCLENBQ0YsRUNyQ0EsT0FBUyxPQUFBQyxHQUFLLFFBQUFDLEdBQU0sY0FBQUMsT0FBb0MsTUFDeEQsT0FBUyxpQkFBQUMsT0FBcUIsb0JDRHZCLElBQU1DLEdBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQW1CZkMsR0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQWtCZEMsR0FBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7NEJEOUJoQyxJQUFxQkMsRUFBckIsY0FBbURDLEVBQVcsQ0FTbkQsUUFBUyxDQUNoQixPQUFPQyxpQkFDVCxDQUVPLFNBQVUsQ0FDZixJQUFNQyxFQUFRLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFFL0IsUUFBV0MsS0FBUUQsRUFDakJDLEVBQUssUUFBUSxDQUVqQixDQUVPLGFBQWFDLEVBQTZFLENBQy9GLEdBQUksS0FBSyxhQUFhLFVBQVUsRUFBRyxDQUNqQyxJQUFNQyxFQUF1QixLQUFLLGFBQWEsVUFBVSxFQUFHLE1BQU0sR0FBRyxFQUMvREMsRUFBZUQsRUFBcUJBLEVBQXFCLE9BQVMsQ0FBQyxFQUFFLFFBQVEsT0FBUSxFQUFFLEVBRTdGLE9BREEsS0FBSyxVQUFZLEdBQ1RDLEVBQWMsQ0FDcEIsSUFBSyxlQUFnQixDQUNuQixLQUFLLFlBQVksS0FBSyxtQkFBbUJDLEVBQVcsRUFBRSxrQkFBa0IsaUJBQWlCLEVBQ3pGLEtBQ0YsQ0FDQSxJQUFLLHFCQUFzQixDQUN6QixLQUFLLFlBQVksS0FBSyxtQkFBbUJDLEVBQWdCLEVBQUUsa0JBQWtCLGlCQUFpQixFQUM5RixLQUNGLENBQ0EsSUFBSyxnQkFDSCxLQUFLLFlBQVksS0FBSyxtQkFBbUJDLEVBQVksRUFBRSxrQkFBa0IsaUJBQWlCLEVBQzFGLEtBQ0osQ0FDRixDQUNGLENBRVEsbUJBQW1CQyxFQUFpQixDQUMxQyxPQUFPLFNBQVMsWUFBWSxFQUFFLHlCQUF5QkEsQ0FBTyxDQUNoRSxDQUNGLEVBN0NxQlgsRUFDWixPQUFTLENBQ2RZO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FLRixFQVBtQlosRUFBckJhLEVBQUEsQ0FEQ0MsR0FBYyx5QkFBeUIsR0FDbkJkLEdFTnJCLE9BQVMsWUFBQWUsT0FBZ0Isb0JDRHpCLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUM5QixPQUFTLFFBQUFDLEdBQU0sY0FBQUMsT0FBa0IsTUFHMUIsSUFBTUMsRUFBTixjQUFzQkMsRUFBa0MsQ0FDcEQsUUFBUyxDQUNoQixPQUFPQyxpQkFDVCxDQUVPLFNBQVUsQ0FDZixNQUFNLElBQUksTUFBTSxpQkFBaUIsQ0FDbkMsQ0FDRixFQVJhRixFQUFORyxFQUFBLENBRE5DLEdBQWMsVUFBVSxHQUNaSixHRE9OLElBQU1LLEdBQU4sY0FBb0NDLENBQVEsQ0FHakQsSUFBSSxpQkFBeUMsQ0FDM0MsT0FBTyxLQUFLLGlCQUNkLENBRWdCLFNBQWtCLENBQ2hDLElBQU1DLEVBQWEsS0FBSyxhQUFhLFlBQVksRUFDM0NDLEVBQWtCLEtBQUssUUFBUSxxQkFBcUIsRUFBRSxZQUFZRCxDQUFVLEVBQzlFRSxFQUlKLE9BSElELEVBQWdCLHFCQUNsQkMsRUFBUUQsRUFBZ0IsbUJBQW1CLElBQUksU0FBUyxLQUFLLGdCQUFnQixVQUFVLENBQUMsQ0FBQyxHQUV2RkMsR0FBVSxNQUNaLFFBQVEsS0FBSyxnREFBZ0QsRUFDdEQsSUFFVCxLQUFLLGNBQ0gsSUFBSSxZQUFxRSx3QkFBeUIsQ0FDaEcsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQ04sa0JBQW1CLEtBQUssV0FDeEIsTUFBT0MsR0FBOEJELENBQUssQ0FDNUMsQ0FDRixDQUFDLENBQ0gsRUFDT0EsRUFDVCxDQUNGLEVBN0I4QkUsRUFBQSxDQUEzQkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBRGZQLEdBQ2lCLDBCQThCOUIsZUFBZSxPQUFPLDJCQUE0QkEsRUFBcUIsRUUxQ3ZFLE9BQVMsUUFBQVEsT0FBWSxNQUlkLElBQU1DLEdBQU4sY0FBbUNDLENBQVEsQ0FDdkMsUUFBUyxDQUNoQixPQUFPQyxpQkFDVCxDQUVnQixTQUFVLENBQ3hCLElBQU1DLEVBQVcsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUVsQyxRQUFTQyxFQUFJLEVBQUdBLEVBQUlELEVBQVMsT0FBUUMsSUFBSyxDQUN4QyxJQUFNQyxFQUFTRixFQUFTQyxDQUFDLEVBRXpCLEdBQUlDLEVBQU8sVUFBVSxFQUFHLENBQ3JCQSxFQUE4QixRQUFRLEVBRXZDLE1BQ0YsQ0FDRixDQUNGLENBQ0YsRUFFQSxlQUFlLE9BQU8seUJBQTBCTCxFQUFvQixFQ3BCN0QsSUFBTU0sR0FBTixjQUFpQ0MsQ0FBUSxDQUM5QixTQUFVLENBQ3hCLElBQU1DLEVBQW9CLEtBQUssYUFBYSxZQUFZLEVBRWxEQyxFQUFhLEtBQUssa0JBR2xCQyxFQURPLElBQUlDLEdBQXVCRixDQUFVLEVBQy9CLFFBQVEsRUFDM0IsS0FBSyxjQUNILElBQUksWUFBcUUsd0JBQXlCLENBQ2hHLFFBQVMsR0FDVCxTQUFVLEdBQ1YsT0FBUSxDQUNOLGtCQUFBRCxFQUNBLE1BQU8sTUFBTSxRQUFRRSxDQUFLLEVBQ3RCQSxFQUFNLElBQUtFLEdBQWNDLEdBQThCRCxDQUFDLENBQUMsRUFDekRDLEdBQThCSCxDQUFLLENBQ3pDLENBQ0YsQ0FBQyxDQUNILENBQ0YsQ0FDRixFQUVhQyxHQUFOLEtBQXVELENBQzVELFlBQW9CRixFQUFrQyxDQUFsQyxnQkFBQUEsQ0FBbUMsQ0FFdkQsU0FBZSxDQUNiLElBQU1DLEVBQVEsS0FBSyxXQUFhLEtBQUssV0FBVyxVQUFVLEVBQUksS0FFOUQsR0FBSUEsR0FBVSxLQUE2QixDQUN6QyxRQUFRLEtBQUssNkNBQTZDLEVBQzFELE1BQ0YsQ0FDQSxPQUFPQSxDQUNULENBQ0YsRUFFQSxlQUFlLE9BQU8sd0JBQXlCSixFQUFrQixFQ3pDakUsT0FBUyxjQUFBUSxHQUFZLFFBQUFDLE9BQVksTUFHMUIsSUFBTUMsR0FBTixjQUE4QkYsRUFBVyxDQUNyQyxRQUFTLENBQ2hCLE9BQU9DLGlCQUNULENBRU8sV0FBWSxDQUVqQixNQUFPLEVBQ1QsQ0FFTyxhQUF5QixDQUM5QixNQUFPLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FDMUIsQ0FFTyxTQUFVLENBQ2YsSUFBTUUsRUFBVyxLQUFLLFlBQVksRUFDbEMsUUFBU0MsRUFBSSxFQUFHQSxFQUFJRCxFQUFTLE9BQVFDLElBQ25CRCxFQUFTQyxDQUFDLEVBQ2xCLFFBQVEsQ0FFcEIsQ0FDRixFQUVBLGVBQWUsT0FBTyxvQkFBcUJGLEVBQWUsRUMxQjFELE9BQVMsUUFBQUcsT0FBWSxNQ0lkLElBQU1DLEdBQU4sY0FBNEJDLEVBQWdCLENBQ2pDLFdBQVksQ0FHMUIsT0FGbUIsS0FBSyxrQkFDRSxVQUFVLENBRXRDLENBRWdCLGFBQXlCLENBQ3ZDLElBQU1DLEVBQVMsQ0FBQyxFQUNoQixRQUFTQyxFQUFJLEVBQUdBLEVBQUksS0FBSyxTQUFTLE9BQVFBLElBQ3hDRCxFQUFPLEtBQUssS0FBSyxTQUFTQyxDQUFDLENBQUMsRUFFOUIsT0FBT0QsQ0FDVCxDQUNGLEVBRUEsZUFBZSxPQUFPLGtCQUFtQkYsRUFBYSxFRGpCL0MsSUFBTUksR0FBTixjQUFnQ0MsRUFBYyxDQUMxQyxRQUFTLENBQ2hCLE9BQU9DLEtBQU8sTUFBTSxPQUFPLENBQUMsRUFDOUIsQ0FDRixFQUVBLGVBQWUsT0FBTyx1QkFBd0JGLEVBQWlCLEVFVC9ELE9BQVMsY0FBQUcsR0FBWSxPQUFBQyxHQUFLLFFBQUFDLE9BQVksTUFDdEMsT0FBUyxTQUFBQyxPQUFhLG9CQVlmLElBQWVDLEVBQWYsY0FBd0NDLEVBQTJDLENBQW5GLGtDQTZCTCxrQkFBZSxJQUliLE1BQU0sS0FBSyxLQUFLLFFBQVEsRUFDckIsSUFBSyxHQUFlLENBQ25CLE9BQVEsRUFBRSxRQUFRLFlBQVksRUFBRyxDQUMvQixJQUFLLGlCQUNILE1BQU8sQ0FDTCxTQUFVLEVBQUUsYUFBYSxXQUFXLEVBQ3BDLE1BQU8sRUFBRSxZQUNULFlBQWEsUUFDZixFQUVGLElBQUssZUFBZ0IsQ0FDbkIsSUFBTUMsRUFBYSxFQUFFLGFBQWEsWUFBWSxHQUFLLEdBRW5ELE9BRGlCLEtBQUssZUFBZSxZQUFZQSxDQUFVLENBRTdELENBQ0EsSUFBSyxlQUFnQixDQUVuQixJQUFNQyxFQURXLEVBQ08sVUFBVSxFQUNsQyxPQUFJQSxFQUFPLE9BQVMsRUFDWCxDQUNMLFdBQVksR0FDWixTQUFVQSxFQUFPLENBQUMsRUFBRSxTQUNwQixNQUFPQSxFQUFPLElBQUlDLEdBQUtBLEVBQUUsS0FBSyxFQUM5QixZQUFhLFdBQ2IsS0FBTSxVQUNSLEVBRUssSUFDVCxDQUNBLElBQUssY0FBZSxDQUNsQixJQUFNRixFQUFhLEVBQUUsYUFBYSxZQUFZLEdBQUssR0FDN0NHLEVBQW1CLEtBQUssZUFBZSxZQUFZSCxDQUFVLEVBQ25FLE1BQU8sQ0FDTCxTQUFVRyxFQUFpQixTQUMzQixNQUFPQSxFQUFpQixnQkFDeEIsWUFBYUEsRUFBaUIsV0FDaEMsQ0FDRixDQUNBLFFBQVMsQ0FFUCxHQUFJLENBR0YsTUFBTyxDQUNMLFNBQVUsVUFDVixNQUppQixFQUNNLFVBQVUsRUFHcEIsU0FBUyxFQUN0QixZQUFhLFFBQ2YsQ0FDRixPQUFTQyxFQUFPLENBQ2QsUUFBUSxLQUFLLHdCQUF3QixDQUN2QyxDQUNBLE9BQU8sSUFDVCxDQUNGLENBQ0YsQ0FBQyxFQUNBLE9BQU9GLEdBQUtBLElBQU0sSUFBSSxFQTdFbEIsUUFBUyxDQUNoQixPQUFPRyxVQUFZLEtBQUssVUFBVSxLQUFLLE9BQVEsS0FBTSxDQUFDLENBQUM7QUFBQSxvQkFFekQsQ0FFTyxXQUF5QixDQUM5QixZQUFLLE9BQVMsS0FBSyxVQUFVLEVBQ3RCLEtBQUssTUFDZCxDQUVVLFdBQXlCLENBQ2pDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQixDQUNuQyxDQUVBLElBQUksZ0JBQW9DLENBQ3RDLE9BQU8sS0FBSyxRQUFRLHFCQUFxQixDQUMzQyxDQThERixFQXpGc0JQLEVBS2IsT0FBU1E7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUhOQyxFQUFBLENBRFRDLEdBQU0sR0FEYVYsRUFFVixzQkNiTCxJQUFlVyxFQUFmLGNBQThDQyxDQUF1QixDQUNuRSxXQUErQixDQUNwQyxZQUFLLE9BQVMsS0FBSyxVQUFVLEVBQ3RCLEtBQUssTUFDZCxDQUVPLFdBQStCLENBQ3BDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQixDQUNuQyxDQUNGLEVDUE8sSUFBTUMsR0FBTixjQUFxQkMsR0FBWUMsQ0FBd0UsQ0FBRSxDQUN6RyxXQUFZLENBQ2pCLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSxLQUFLLEtBQUssUUFBMkMsQ0FBQyxDQUM1RixDQUNGLEVBSU8sU0FBU0QsR0FBMkNFLEVBQWEsQ0FDdEUsT0FBTyxjQUF5QkEsQ0FBSyxDQUM1QixrQkFBa0JDLEVBQXlDLENBc0JoRSxPQXBCZUEsRUFBUyxJQUFJQyxHQUFLLENBQy9CLElBQU1DLEVBQVlELEVBQ2xCLEdBQUksQ0FBQ0MsRUFBVSxVQUNiLGVBQVEsTUFBTSxrREFBa0QsRUFDekQsS0FFVCxJQUFJQyxFQUFRRCxFQUFVLFVBQVUsRUFFaEMsR0FBSSxPQUFPQyxHQUFVLFNBQ25CLEdBQUlBLElBQVUsT0FDWkEsRUFBUSxXQUNDQSxJQUFVLFFBQ25CQSxFQUFRLE9BRVIsZ0JBQVEsTUFBTSwrQ0FBK0MsRUFDdEQsS0FHWCxPQUFPQSxDQUNULENBQUMsRUFDYSxNQUFNQyxHQUNYLE9BQU9BLEdBQU0sV0FBYUEsQ0FDbEMsQ0FDSCxDQUNGLENBQ0YsQ0N4Q0EsZUFBZSxPQUFPLFVBQVdDLEVBQU0sRUNEdkMsT0FBUyxZQUFBQyxPQUFnQixvQkFHbEIsSUFBTUMsR0FBTixjQUEyQkMsQ0FBc0IsQ0FBakQsa0NBQytDLGNBQXFCLFNBRXpELFdBQW9CLENBRWxDLE9BRGMsS0FBSyxXQUVyQixDQUNGLEVBTnNEQyxFQUFBLENBQW5EQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsV0FBWSxDQUFDLEdBRHZDSCxHQUN5Qyx3QkFRdEQsZUFBZSxPQUFPLGlCQUFrQkEsRUFBWSxFQ1A3QyxJQUFNSSxHQUFOLGNBQTBCQyxDQUF1QixDQUN0QyxXQUFZLENBRTFCLElBQU1DLEVBQVMsS0FBSyxhQUFhLEVBQ2pDLEdBQUksS0FBSyxTQUFTLFNBQVcsRUFBRyxDQUM5QixJQUFNQyxFQUFTRCxFQUFPLENBQUMsRUFDakJFLEVBQVNGLEVBQU8sQ0FBQyxFQUN2QixHQUNFQyxFQUFPLFdBQWEsZ0JBQ3BCQyxFQUFPLFdBQWEsZ0JBQ3BCRCxFQUFPLGNBQWdCLFdBQ3ZCLENBQ0EsSUFBTUUsRUFBY0YsRUFBTyxNQUNyQkcsRUFBY0YsRUFBTyxNQUkzQixPQUhtQkMsRUFBWSxPQUFPRSxHQUFLRCxFQUFZLFNBQVNDLENBQUMsQ0FBQyxFQUV4QyxPQUFTLENBRXJDLFNBQ0VKLEVBQU8sV0FBYSxnQkFDcEJDLEVBQU8sV0FBYSxnQkFDcEJELEVBQU8sY0FBZ0IsU0FDdkIsQ0FDQSxJQUFNRSxFQUFjRixFQUFPLE1BRTNCLE9BRG9CQyxFQUFPLE1BQ1IsU0FBU0MsQ0FBVyxDQUN6QyxNQUNFLFFBQVEsTUFDTix5SEFDRixDQUVKLE1BQ0UsUUFBUSxNQUFNLCtDQUErQyxFQUUvRCxNQUFPLEVBQ1QsQ0FDRixFQUVBLGVBQWUsT0FBTyxlQUFnQkwsRUFBVyxFQ3hDMUMsSUFBTVEsR0FBTixjQUF5QkMsQ0FBaUMsQ0FDL0QsSUFBSSxnQkFBaUIsQ0FDbkIsT0FBTyxLQUFLLGFBQWEsZ0JBQWdCLEdBQUssRUFDaEQsQ0FFUyxXQUFZLENBQ25CLElBQU1DLEVBQWEsS0FBSyxhQUFhLFlBQVksR0FBSyxHQUNoREMsRUFBb0IsS0FBSyxRQUFRLHFCQUFxQixFQUF3QixZQUFZRCxDQUFVLEVBRTFHLE9BREFDLEVBQWlCLGdCQUNiQSxFQUFpQixjQUFnQixTQUM1QkEsRUFBaUIsZ0JBQWdCLE9BQVMsRUFBSUEsRUFBaUIsZ0JBQWdCLENBQUMsRUFBSSxHQUVwRkEsRUFBaUIsZUFFNUIsQ0FDRixFQUVBLGVBQWUsT0FBTyxjQUFlSCxFQUFVLEVDcEIvQyxPQUFTLFlBQUFJLE9BQWdCLG9CQUlsQixJQUFNQyxHQUFOLGNBQThCQyxDQUF1QixDQUFyRCxrQ0FDdUIsa0JBQXVELHFCQUVuRixJQUFJLFNBQVUsQ0FFWixHQUFJLENBRFMsS0FBSyxhQUFhLFNBQVMsRUFFdEMsZUFBUSxNQUFNLDhCQUE4QixFQUNyQyxLQUVULElBQU1DLEVBQVUsU0FBUyxLQUFLLGFBQWEsU0FBUyxHQUFLLEdBQUcsRUFDNUQsT0FBSSxNQUFNQSxDQUFPLEdBQ2YsUUFBUSxNQUFNLG1DQUFtQyxFQUMxQyxNQUVMQSxFQUFVLEdBQ1osUUFBUSxNQUFNLCtCQUErQixFQUN0QyxNQUVMQSxFQUFVLEdBQUssS0FBSyxlQUFpQixzQkFDdkMsUUFBUSxNQUFNLHNFQUFzRSxFQUM3RSxNQUVGQSxDQUNULENBRWdCLFdBQVksQ0FDMUIsR0FBSSxLQUFLLFNBQVMsU0FBVyxFQUFHLENBQzlCLElBQU1DLEVBQVMsS0FBSyxhQUFhLEVBQzNCQyxFQUFTRCxFQUFPLENBQUMsRUFDakJFLEVBQVNGLEVBQU8sQ0FBQyxFQUN2QixHQUFJLEtBQUssZUFBaUIsS0FDeEIsT0FBTyxLQUVULEdBQ0VDLEVBQU8sY0FBZ0IsVUFDdkJDLEVBQU8sY0FBZ0IsVUFDdkIsTUFBTSxRQUFRRCxFQUFPLEtBQUssR0FDMUIsTUFBTSxRQUFRQyxFQUFPLEtBQUssRUFFMUIsZUFBUSxNQUFNLHFDQUFxQyxFQUM1QyxHQUVULE9BQVFGLEVBQU8sQ0FBQyxFQUFFLFNBQVUsQ0FDMUIsSUFBSyxVQUNMLElBQUssUUFBUyxDQUNaLElBQU1HLEVBQVMsV0FBV0YsRUFBTyxLQUFlLEVBQzFDRyxFQUFTLFdBQVdGLEVBQU8sS0FBZSxFQUVoRCxHQUFJLENBQUMsTUFBTUMsQ0FBTSxHQUFLLENBQUMsTUFBTUMsQ0FBTSxFQUNqQyxPQUFJLEtBQUssZUFBaUIscUJBQ2pCRCxFQUFPLFlBQVksS0FBSyxPQUFPLElBQU1DLEVBQU8sWUFBWSxLQUFLLE9BQU8sRUFHekUsS0FBSyxNQUFNRCxFQUFTLEtBQUssSUFBSSxHQUFJLEtBQUssT0FBTyxDQUFDLEVBQUksS0FBSyxJQUFJLEdBQUksS0FBSyxPQUFPLElBQzNFLEtBQUssTUFBTUMsRUFBUyxLQUFLLElBQUksR0FBSSxLQUFLLE9BQU8sQ0FBQyxFQUFJLEtBQUssSUFBSSxHQUFJLEtBQUssT0FBTyxFQUkvRSxRQUFRLE1BQU0scUVBQXFFRCxDQUFNLEtBQUtDLENBQU0sRUFBRSxFQUV4RyxLQUNGLENBQ0EsUUFBUyxDQUNQLFFBQVEsTUFBTSwwRUFBMEUsRUFDeEYsS0FDRixDQUNGLENBQ0EsTUFBTyxFQUNULENBQ0EsZUFBUSxNQUFNLG9EQUFvRCxFQUMzRCxJQUNULENBQ0YsRUF2RThCQyxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FEZlQsR0FDaUIsNEJBeUU5QixlQUFlLE9BQU8sb0JBQXFCQSxFQUFlLEVDOUUxRCxPQUFTLFlBQUFVLE9BQWdCLG9CQ0VsQixJQUFNQyxFQUFOLEtBQW9CLENBQ3pCLE9BQWMsb0JBQW9CQyxFQUEwQkMsRUFBMEJDLEVBQTZCLENBQ2pILE9BQVFBLEVBQVUsQ0FDaEIsSUFBSyxhQUNMLElBQUssU0FDSCxPQUFPRixJQUFXQyxFQUNwQixJQUFLLFVBQVcsQ0FDZCxJQUFNRSxFQUFPLFNBQVNILEVBQVEsRUFBRSxFQUMxQkksRUFBTyxTQUFTSCxFQUFRLEVBQUUsRUFDaEMsR0FBSSxDQUFDLE1BQU1FLENBQUksR0FBSyxDQUFDLE1BQU1DLENBQUksRUFDN0IsT0FBT0QsSUFBU0MsRUFFaEIsUUFBUSxNQUFNLGtCQUFrQkosQ0FBTSxXQUFXQyxDQUFNLFVBQVUsRUFFbkUsS0FDRixDQUNBLElBQUssUUFBUyxDQUNaLElBQU1JLEVBQVMsV0FBV0wsQ0FBTSxFQUMxQk0sRUFBUyxXQUFXTCxDQUFNLEVBQ2hDLEdBQUksQ0FBQyxNQUFNSSxDQUFNLEdBQUssQ0FBQyxNQUFNQyxDQUFNLEVBQ2pDLE9BQU9ELElBQVdDLEVBRWxCLFFBQVEsTUFBTSxvQkFBb0JOLENBQU0sV0FBV0MsQ0FBTSxZQUFZLEVBRXZFLEtBQ0YsQ0FDQSxJQUFLLE9BQ0wsSUFBSyxlQUFnQixDQUNuQixJQUFNTSxFQUFRUCxFQUFPLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFDL0JRLEVBQVFQLEVBQU8sTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUNyQyxHQUFJTSxFQUFNLFNBQVcsR0FBS0MsRUFBTSxTQUFXLEVBQ3pDLE9BQUlOLElBQWEsU0FDZkssRUFBTSxLQUFLLEVBQ1hDLEVBQU0sS0FBSyxHQUVORCxFQUFNLEtBQUssR0FBRyxJQUFNQyxFQUFNLEtBQUssR0FBRyxFQUV6QyxRQUFRLE1BQU0sc0VBQXNFUixDQUFNLE9BQU9DLENBQU0sRUFBRSxFQUUzRyxLQUNGLENBQ0YsQ0FFQSxNQUFPLEVBQ1QsQ0FDRixFRDFDTyxJQUFNUSxHQUFOLGNBQXVCQyxDQUF1QixDQUE5QyxrQ0FDdUIsbUJBQW1ELFFBRS9ELFdBQVksQ0FDMUIsR0FBSSxLQUFLLFNBQVMsU0FBVyxFQUFHLENBQzlCLElBQU1DLEVBQVMsS0FBSyxhQUFhLEVBQzNCQyxFQUFTRCxFQUFPLENBQUMsRUFDakJFLEVBQVNGLEVBQU8sQ0FBQyxFQUN2QixPQUFJLEtBQUssZ0JBQWtCLFNBQ3pCLFFBQVEsTUFBTSxvQ0FBb0MsRUFDM0MsSUFHUEMsRUFBTyxjQUFnQixVQUN2QkMsRUFBTyxjQUFnQixVQUN2QixNQUFNLFFBQVFELEVBQU8sS0FBSyxHQUMxQixNQUFNLFFBQVFDLEVBQU8sS0FBSyxHQUUxQixRQUFRLE1BQU0scUNBQXFDLEVBQzVDLElBRUZDLEVBQWMsb0JBQW9CRixFQUFPLE1BQWlCQyxFQUFPLE1BQWlCRCxFQUFPLFFBQVEsQ0FDMUcsQ0FDQSxlQUFRLE1BQU0sNENBQTRDLEVBQ25ELElBQ1QsQ0FDRixFQXpCOEJHLEVBQUEsQ0FBM0JDLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQURmUCxHQUNpQiw2QkEyQjlCLGVBQWUsT0FBTyxZQUFhQSxFQUFRLEVFOUJwQyxJQUFNUSxHQUFOLGNBQW9CQyxDQUF1QixDQUNoQyxXQUFxQixDQUNuQyxHQUFJLEtBQUssU0FBUyxTQUFXLEVBQUcsQ0FDOUIsSUFBTUMsRUFBUyxLQUFLLGFBQWEsRUFDM0JDLEVBQVNELEVBQU8sQ0FBQyxFQUNqQkUsRUFBU0YsRUFBTyxDQUFDLEVBQ3ZCLEdBQUlDLEVBQU8sV0FBYUMsRUFBTyxXQUFhRCxFQUFPLFdBQWEsV0FBYUEsRUFBTyxXQUFhLFNBQy9GLE1BQU8sQ0FBQ0EsRUFBTyxNQUFRLENBQUNDLEVBQU8sTUFFL0IsUUFBUSxNQUFNLDhDQUE4QyxDQUVoRSxDQUNBLGVBQVEsTUFBTSxxQ0FBcUMsRUFDNUMsSUFDVCxDQUNGLEVBRUEsZUFBZSxPQUFPLFNBQVVKLEVBQUssRUNmOUIsSUFBTUssR0FBTixjQUFxQkMsQ0FBdUIsQ0FDakMsV0FBcUIsQ0FDbkMsR0FBSSxLQUFLLFNBQVMsU0FBVyxFQUFHLENBQzlCLElBQU1DLEVBQVMsS0FBSyxhQUFhLEVBQzNCQyxFQUFTRCxFQUFPLENBQUMsRUFDakJFLEVBQVNGLEVBQU8sQ0FBQyxFQUN2QixPQUFJQyxFQUFPLFdBQWFDLEVBQU8sV0FBYUQsRUFBTyxXQUFhLFdBQWFBLEVBQU8sV0FBYSxTQUN4RixDQUFDQSxFQUFPLE9BQVMsQ0FBQ0MsRUFBTyxPQUVoQyxRQUFRLE1BQU0sK0NBQStDLEVBQ3RELEtBRVgsQ0FDQSxlQUFRLElBQUksc0NBQXNDLEVBQzNDLElBQ1QsQ0FDRixFQUVBLGVBQWUsT0FBTyxVQUFXSixFQUFNLEVDbEJoQyxJQUFNSyxHQUFOLGNBQXdCQyxDQUF1QixDQUNwQyxXQUFxQixDQUNuQyxHQUFJLEtBQUssU0FBUyxTQUFXLEVBQUcsQ0FDOUIsSUFBTUMsRUFBWSxLQUFLLGFBQWEsRUFDcEMsR0FBSSxDQUFDQSxFQUNILE1BQU8sR0FFVCxJQUFNQyxFQUFRRCxFQUFVLENBQUMsRUFBRSxNQUMzQixPQUFPQyxHQUFTLE1BQVFBLEdBQVMsTUFBYUEsSUFBVSxFQUMxRCxDQUNBLGVBQVEsTUFBTSwyQ0FBMkMsRUFDbEQsSUFDVCxDQUNGLEVBRUEsZUFBZSxPQUFPLGNBQWVILEVBQVMsRUNqQnZDLElBQU1JLEdBQU4sY0FBb0JDLENBQXVCLENBQ2hDLFdBQXFCLENBQ25DLEdBQUksS0FBSyxTQUFTLFNBQVcsRUFBRyxDQUM5QixJQUFNQyxFQUFTLEtBQUssYUFBYSxFQUMzQkMsRUFBU0QsRUFBTyxDQUFDLEVBQ2pCRSxFQUFTRixFQUFPLENBQUMsRUFDdkIsR0FBSUMsRUFBTyxXQUFhQyxFQUFPLFdBQWFELEVBQU8sV0FBYSxXQUFhQSxFQUFPLFdBQWEsU0FDL0YsTUFBTyxDQUFDQSxFQUFPLE1BQVEsQ0FBQ0MsRUFBTyxNQUUvQixRQUFRLE1BQU0sOENBQThDLENBRWhFLENBQ0EsZUFBUSxNQUFNLHFDQUFxQyxFQUM1QyxJQUNULENBQ0YsRUFFQSxlQUFlLE9BQU8sU0FBVUosRUFBSyxFQ2Y5QixJQUFNSyxHQUFOLGNBQXFCQyxDQUF1QixDQUNqQyxXQUFxQixDQUNuQyxHQUFJLEtBQUssU0FBUyxTQUFXLEVBQUcsQ0FDOUIsSUFBTUMsRUFBUyxLQUFLLGFBQWEsRUFDM0JDLEVBQVNELEVBQU8sQ0FBQyxFQUNqQkUsRUFBU0YsRUFBTyxDQUFDLEVBQ3ZCLE9BQUlDLEVBQU8sV0FBYUMsRUFBTyxXQUFhRCxFQUFPLFdBQWEsV0FBYUEsRUFBTyxXQUFhLFNBQ3hGLENBQUNBLEVBQU8sT0FBUyxDQUFDQyxFQUFPLE9BRWhDLFFBQVEsTUFBTSwrQ0FBK0MsRUFDdEQsS0FFWCxDQUNBLGVBQVEsSUFBSSxzQ0FBc0MsRUFDM0MsSUFDVCxDQUNGLEVBRUEsZUFBZSxPQUFPLFVBQVdKLEVBQU0sRUN2QnZDLE9BQVMsWUFBQUssT0FBZ0Isb0JBSWxCLElBQU1DLEdBQU4sY0FBNkJDLENBQXNCLENBR3hDLFdBQW9CLENBQ2xDLElBQU1DLEVBQVcsS0FBSyxlQUFlLFlBQVksS0FBSyxVQUFVLEVBQ2hFLEdBQUksQ0FBQ0EsRUFDSCxlQUFRLEtBQUssWUFBWSxLQUFLLFVBQVUsbUJBQW1CLEVBQ3BELEtBRVQsSUFBTUMsRUFBVUQsRUFBUyxRQUNuQkUsRUFBc0IsTUFBTSxRQUFRRixFQUFTLEtBQUssRUFBdUJBLEVBQVMsTUFBNUIsQ0FBQ0EsRUFBUyxLQUFLLEVBQ3ZFRyxFQUFTLEVBQ2IsUUFBV0MsS0FBcUJGLEVBQW9CLENBQ2xELElBQU1HLEVBQWNKLEVBQVEsV0FBVyxLQUFLSyxHQUNuQ0MsRUFBYyxvQkFBb0JELEVBQU0sT0FBUUYsRUFBbUJKLEVBQVMsUUFBUSxDQUM1RixFQUNLSyxHQUFlLE1BQVFBLEVBQVksYUFBZSxLQUd0REYsR0FBVUYsRUFBUSxhQUZsQkUsR0FBVUUsRUFBWSxXQUkxQixDQUNBLE9BQUlKLEVBQVEsWUFBYyxPQUN4QkUsRUFBUyxLQUFLLElBQUlGLEVBQVEsV0FBWUUsQ0FBTSxHQUUxQ0YsRUFBUSxZQUFjLE9BQ3hCRSxFQUFTLEtBQUssSUFBSUYsRUFBUSxXQUFZRSxDQUFNLEdBRXZDQSxDQUNULENBQ0YsRUE3QjhCSyxFQUFBLENBQTNCQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FEZlgsR0FDaUIsMEJBK0I5QixlQUFlLE9BQU8sbUJBQW9CQSxFQUFjLEVDcEN4RCxPQUFTLFlBQUFZLE9BQWdCLG9CQUN6QixPQUFTLGNBQUFDLE9BQWtCLE1BRXBCLElBQU1DLEVBQU4sY0FBeUJDLEVBQVcsQ0FBcEMsa0NBQ21ELGtCQUF1QixFQUkvRSxJQUFXLFlBQWEsQ0FDdEIsT0FBTyxNQUFNLEtBQUssS0FBSyxpQkFBaUIsZUFBZSxDQUFDLEVBQUUsSUFBSUMsSUFDckQsQ0FDTCxPQUFRQSxFQUFHLGFBQWEsU0FBUyxFQUNqQyxZQUFhLENBQUNBLEVBQUcsYUFBYSxjQUFjLENBQzlDLEVBQ0QsQ0FDSCxDQUNGLEVBWjBEQyxFQUFBLENBQXZEQyxHQUFTLENBQUUsVUFBVyxnQkFBaUIsS0FBTSxNQUFPLENBQUMsR0FEM0NKLEVBQzZDLDRCQUNGRyxFQUFBLENBQXJEQyxHQUFTLENBQUUsVUFBVyxjQUFlLEtBQU0sTUFBTyxDQUFDLEdBRnpDSixFQUUyQywwQkFDQUcsRUFBQSxDQUFyREMsR0FBUyxDQUFFLFVBQVcsY0FBZSxLQUFNLE1BQU8sQ0FBQyxHQUh6Q0osRUFHMkMsMEJBWXhELGVBQWUsT0FBTyxjQUFlQSxDQUFVLEVDZHhDLElBQU1LLEdBQU4sTUFBTUMsVUFBaUJDLENBQXVCLENBUW5DLFdBQVksQ0FDMUIsR0FBSSxLQUFLLFNBQVMsU0FBVyxFQUFHLENBQzlCLElBQU1DLEVBQVMsS0FBSyxhQUFhLEVBQzNCQyxFQUFhRCxFQUFPLENBQUMsRUFDckJFLEVBQW1CRixFQUFPLENBQUMsRUFDakMsT0FBT0YsRUFBUyxNQUFNRyxFQUFZQyxDQUFnQixDQUNwRCxDQUVBLGVBQVEsTUFBTSx3Q0FBd0MsRUFDL0MsSUFDVCxDQUVBLE9BQWMsTUFBTUQsRUFBOEJDLEVBQW9DLENBeEJ4RixJQUFBQyxFQXlCSSxPQUFRRCxFQUFpQixZQUFhLENBQ3BDLElBQUssU0FDSCxPQUFJRCxFQUFXLFFBQVUsS0FBYSxHQUNsQyxNQUFNLFFBQVFBLEVBQVcsS0FBSyxHQUFLLE1BQU0sUUFBUUMsRUFBaUIsS0FBSyxHQUN6RSxRQUFRLE1BQU0scUNBQXFDLEVBQzVDLElBRUZFLEVBQWMscUJBQ25CRCxFQUFBRixFQUFXLFFBQVgsWUFBQUUsRUFBa0IsV0FDbEJELEVBQWlCLE1BQU0sU0FBUyxFQUNoQ0EsRUFBaUIsUUFDbkIsRUFHRixJQUFLLFVBQVcsQ0FDZCxHQUFJLENBQUMsTUFBTSxRQUFRRCxFQUFXLEtBQUssR0FBSyxDQUFDLE1BQU0sUUFBUUMsRUFBaUIsS0FBSyxFQUMzRSxlQUFRLE1BQU0scUNBQXFDLEVBQzVDLEdBRVQsR0FBSUQsRUFBVyxNQUFNLFNBQVdDLEVBQWlCLE1BQU0sT0FDckQsTUFBTyxHQUVULFFBQVNHLEVBQUksRUFBR0EsRUFBSUosRUFBVyxNQUFNLE9BQVFJLElBTTNDLEdBQUksQ0FMV0QsRUFBYyxvQkFDM0JGLEVBQWlCLE1BQU1HLENBQUMsRUFDeEJKLEVBQVcsTUFBTUksQ0FBQyxFQUNsQkgsRUFBaUIsUUFDbkIsRUFFRSxNQUFPLEdBR1gsTUFBTyxFQUNULENBRUEsSUFBSyxXQUFZLENBQ2YsR0FBSSxDQUFDLE1BQU0sUUFBUUQsRUFBVyxLQUFLLEdBQUssQ0FBQyxNQUFNLFFBQVFDLEVBQWlCLEtBQUssRUFDM0UsZUFBUSxNQUFNLHFDQUFxQyxFQUM1QyxHQUVULEdBQUlELEVBQVcsTUFBTSxTQUFXQyxFQUFpQixNQUFNLE9BQ3JELE1BQU8sR0FFVCxJQUFJSSxFQUFjLEVBQ2xCLFFBQVdDLEtBQWlCTCxFQUFpQixNQUFPLENBQ2xELElBQUlNLEVBQStCLEtBQzdCQyxFQUFNLENBQUMsR0FBR1IsRUFBVyxLQUFLLEVBQ2hDLFFBQVdTLEtBQU1ELEVBRWYsR0FEZUwsRUFBYyxvQkFBb0JHLEVBQWVHLEVBQUlSLEVBQWlCLFFBQVEsRUFDakYsQ0FDVk0sRUFBZ0JFLEVBQ2hCLEtBQ0YsQ0FFRixHQUFJRixJQUFrQixLQUNuQkMsRUFBaUIsT0FBT0EsRUFBSSxRQUFRRCxDQUFhLEVBQUcsQ0FBQyxNQUV0RCxPQUFPLEdBRVRGLEdBQ0YsQ0FDQSxNQUFPLEVBQ1QsQ0FFQSxRQUNFLGVBQVEsTUFBTSxxQ0FBcUMsRUFDNUMsRUFDWCxDQUNGLENBQ0YsRUFFQSxlQUFlLE9BQU8sWUFBYVQsRUFBUSxFQzdGcEMsSUFBTWMsR0FBTixjQUF3QkMsQ0FBOEIsQ0FDM0MsV0FBWSxDQUMxQixJQUFNQyxFQUFTLEtBQUssYUFBYSxFQUUzQixLQUFLLFNBQVMsU0FBVyxHQUM3QixRQUFRLEtBQUssK0NBQStDLEVBRzlELEdBQU0sQ0FBQ0MsRUFBUUMsQ0FBTSxFQUFJRixFQWdCekIsR0FkTUMsRUFBTyxXQUFhQyxFQUFPLFVBQy9CLFFBQVEsS0FBSyx5Q0FBeUMsRUFFbERBLEVBQU8sY0FBZ0IsWUFBY0EsRUFBTyxjQUFnQixXQUNoRSxRQUFRLEtBQUssd0RBQXdELEdBRW5FRCxFQUFPLFdBQWEsU0FBV0MsRUFBTyxXQUFhLFVBQ3JELFFBQVEsS0FBSyxxRkFBcUYsR0FFaEdELEVBQU8sV0FBYSxZQUFjQyxFQUFPLFdBQWEsYUFDeEQsUUFBUSxLQUFLLHFFQUFxRSxFQUloRkQsRUFBTyxRQUFVLE1BQVFDLEVBQU8sUUFBVSxLQUM1QyxPQUFPLEtBSVQsSUFBTUMsRUFBY0YsRUFBTyxNQUUzQixPQURvQkMsRUFBTyxNQUNSLFNBQVNDLENBQVcsQ0FDekMsQ0FDRixFQUVBLGVBQWUsT0FBTyxhQUFjTCxFQUFTLEVDcEN0QyxJQUFNTSxHQUFOLGNBQTBCQyxDQUF3RCxDQUN2RSxXQUFnQyxDQUM5QyxJQUFNQyxFQUFZLEtBQUssYUFBYSxFQUNwQyxHQUFJQSxFQUFVLFNBQVcsRUFDdkIsZUFBUSxNQUFNLCtDQUErQyxFQUN0RCxLQUVULFFBQVdDLEtBQVlELEVBQ3JCLEdBQUlDLEVBQVMsY0FBZ0IsWUFBY0EsRUFBUyxjQUFnQixTQUNsRSxlQUFRLE1BQU0sd0NBQXdDLEVBQy9DLENBQUMsRUFXWixPQUFPRCxDQUNULENBQ0YsRUFFQSxlQUFlLE9BQU8sZUFBZ0JGLEVBQVcsRUMzQmpELE9BQVMsUUFBQUksT0FBWSxNQUdkLElBQU1DLEdBQU4sY0FBcUJDLENBQXVCLENBQ3hDLFFBQVMsQ0FDaEIsT0FBT0MsS0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUM5QixDQUVnQixXQUFZLENBRzFCLE1BQU8sQ0FGWSxLQUFLLGtCQUNFLFVBQVUsQ0FFdEMsQ0FDRixFQUVBLGVBQWUsT0FBTyxVQUFXRixFQUFNLEVDWmhDLElBQU1HLEdBQU4sY0FBb0JDLENBQXVCLENBQ2hDLFdBQVksQ0FzQjFCLE9BcEJlLE1BQU0sS0FBSyxLQUFLLFFBQVEsRUFBRSxJQUFJQyxHQUFLLENBQ2hELElBQU1DLEVBQVlELEVBQ2xCLEdBQUksQ0FBQ0MsRUFBVSxVQUNiLGVBQVEsTUFBTSxrREFBa0QsRUFDekQsS0FFVCxJQUFJQyxFQUFRRCxFQUFVLFVBQVUsRUFFaEMsR0FBSSxPQUFPQyxHQUFVLFNBQ25CLEdBQUlBLElBQVUsT0FDWkEsRUFBUSxXQUNDQSxJQUFVLFFBQ25CQSxFQUFRLE9BRVIsZ0JBQVEsTUFBTSw4Q0FBOEMsRUFDckQsS0FHWCxPQUFPQSxDQUNULENBQUMsRUFDYSxLQUFLLEdBQ1YsT0FBTyxHQUFNLFdBQWEsQ0FDbEMsQ0FDSCxDQUNGLEVBRUEsZUFBZSxPQUFPLFNBQVVKLEVBQUssRUM5QjlCLElBQU1LLEdBQU4sY0FBeUJDLENBQWtDLENBQ2hELFdBQWdDLENBQzlDLElBQU1DLEVBQVksS0FBSyxhQUFhLEVBQ3BDLEdBQUlBLEVBQVUsU0FBVyxFQUN2QixlQUFRLE1BQU0sK0NBQStDLEVBQ3RELEtBRVQsUUFBV0MsS0FBWUQsRUFDckIsR0FBSUMsRUFBUyxjQUFnQixXQUFhQSxFQUFTLGNBQWdCLFNBQ2pFLGVBQVEsTUFBTSx1Q0FBdUMsRUFDOUMsQ0FBQyxFQUdaLE9BQU9ELENBQ1QsQ0FDRixFQUVBLGVBQWUsT0FBTyxjQUFlRixFQUFVLEVDbkIvQyxPQUFTLFdBQUFJLE9BQWUsZUFDeEIsT0FBUyxjQUFBQyxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxZQUFBQyxHQUFVLFNBQUFDLE9BQWEsb0JBSXpCLElBQU1DLEdBQU4sY0FBZ0NDLEVBQVcsQ0FRdkMsUUFBUyxDQWRwQixJQUFBQyxFQUFBQyxFQWVJLElBQU1DLEdBQVFELEdBQUFELEVBQUEsS0FBSyxjQUFMLFlBQUFBLEVBQWtCLFVBQVUsS0FBS0csR0FBS0EsRUFBRSxhQUFlLEtBQUssY0FBNUQsWUFBQUYsRUFBeUUsTUFDdkYsT0FBT0csS0FBTyxLQUFLLFVBQVVGLEVBQU8sS0FBTSxDQUFDLENBQUMsRUFDOUMsQ0FlTyxXQUF5QyxDQUM5QyxJQUFNRyxFQUFpQixLQUFLLFFBQVEscUJBQXFCLEVBQ25EQyxFQUFhLEtBQUssV0FFeEIsT0FEZUQsRUFBZSxZQUFZQyxDQUFVLEVBQUUsS0FFeEQsQ0FDRixFQTlCRUMsRUFBQSxDQURDQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FEZlYsR0FFWCwwQkFJT1MsRUFBQSxDQUZORSxHQUFRLENBQUUsUUFBU0MsRUFBYSxVQUFXLEVBQUssQ0FBQyxFQUNqREMsR0FBTSxHQUxJYixHQU1KLDJCQTRCVCxlQUFlLE9BQU8sdUJBQXdCQSxFQUFpQixFQ3JDeEQsSUFBTWMsR0FBTixjQUF5QkMsQ0FBc0IsQ0FDcEMsV0FBWSxDQWMxQixPQWJlLEtBQUssYUFBYSxFQUNWLE9BQU8sQ0FBQ0MsRUFBYUMsSUFBaUIsQ0FDM0QsR0FBSUEsRUFBYSxVQUFZLFNBQVdBLEVBQWEsVUFBWSxVQUMvRCxHQUFJLENBQ0YsT0FBT0QsRUFBYyxTQUFTQyxFQUFhLE1BQU0sU0FBUyxDQUFDLENBQzdELE9BQVNDLEVBQU8sQ0FDZCxRQUFRLEtBQUssMkJBQTJCLENBQzFDLE1BRUEsUUFBUSxLQUFLLHdCQUF3QkQsRUFBYSxRQUFRLEVBQUUsRUFFOUQsT0FBT0QsQ0FDVCxFQUFHLENBQUMsQ0FFTixDQUNGLEVBRUEsZUFBZSxPQUFPLGNBQWVGLEVBQVUsRUN0Qi9DLE9BQVMsWUFBQUssT0FBZ0Isb0JBS2xCLElBQU1DLEdBQU4sY0FBNkJDLENBQXVCLENBQXBELGtDQUNvRCxtQkFBZ0IsT0FFekQsV0FBWSxDQUMxQixHQUFJLEtBQUssU0FBUyxTQUFXLEVBQUcsQ0FDOUIsSUFBTUMsRUFBUyxLQUFLLGFBQWEsRUFDM0JDLEVBQVNELEVBQU8sQ0FBQyxFQUNqQkUsRUFBU0YsRUFBTyxDQUFDLEVBQ3ZCLEdBQ0VDLEVBQU8sY0FBZ0IsVUFDdkJDLEVBQU8sY0FBZ0IsVUFDdkIsTUFBTSxRQUFRRCxFQUFPLEtBQUssR0FDMUIsTUFBTSxRQUFRQyxFQUFPLEtBQUssRUFFMUIsZUFBUSxNQUFNLDRDQUE0QyxFQUNuRCxHQUVULElBQU1DLEVBQUssS0FBSyxnQkFBa0IsT0FBU0YsRUFBTyxNQUFTQSxFQUFPLE1BQWlCLFlBQVksRUFDekZHLEVBQUssS0FBSyxnQkFBa0IsT0FBU0YsRUFBTyxNQUFTQSxFQUFPLE1BQWlCLFlBQVksRUFDL0YsT0FBT0csRUFBYyxvQkFBb0JGLEVBQWNDLEVBQWNILEVBQU8sUUFBUSxDQUN0RixDQUNBLGVBQVEsTUFBTSxtREFBbUQsRUFDMUQsSUFDVCxDQUNGLEVBdkIyREssRUFBQSxDQUF4REMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLGdCQUFpQixDQUFDLEdBRDVDVCxHQUM4Qyw2QkF5QjNELGVBQWUsT0FBTyxtQkFBb0JBLEVBQWMsRUM3QmpELElBQU1VLEdBQU4sY0FBcUJDLENBQXNCLENBRWhELGFBQWMsQ0FDWixNQUFNLEVBQ04sS0FBSyxZQUFjLElBQUlDLEdBQWlCLE1BQU0sS0FBSyxLQUFLLFFBQWtELENBQUMsQ0FDN0csQ0FFZ0IsV0FBWSxDQUcxQixPQURjLEtBQUssWUFBWSxVQUFVLENBRTNDLENBQ0YsRUFFYUEsR0FBTixLQUE0RCxDQUNqRSxZQUFvQkMsRUFBMEMsQ0FBMUMsaUJBQUFBLENBQTJDLENBRXhELFdBQVksQ0FjakIsT0FiZSxLQUFLLFlBQVksSUFBSUMsR0FBSyxDQUN2QyxHQUFJLENBQUNBLEVBQUUsVUFDTCxlQUFRLE1BQU0sa0RBQWtELEVBQ3pELEtBRVQsSUFBTUMsRUFBUUQsRUFBRSxVQUFVLEVBQzFCLE9BQUksT0FBTyxNQUFNQyxDQUFLLEdBQ3BCLFFBQVEsTUFBTSw4Q0FBOEMsRUFDckQsTUFHRixPQUFPQSxDQUFLLENBQ3JCLENBQUMsRUFDYSxPQUFPLENBQUNDLEVBQUdDLElBQU1ELEVBQUlDLEVBQUcsQ0FBQyxDQUN6QyxDQUNGLEVBRUEsZUFBZSxPQUFPLFVBQVdQLEVBQU0sRUNsQ2hDLElBQU1RLEdBQU4sY0FBMEJDLENBQWlDLENBQ2hELFdBQVksQ0FDMUIsSUFBTUMsRUFBYSxLQUFLLGFBQWEsWUFBWSxFQUVqRCxPQURnQixLQUFLLFFBQVEscUJBQXFCLEVBQXdCLFlBQVlBLENBQVUsRUFBRSxLQUVwRyxDQUNGLEVBRUEsZUFBZSxPQUFPLGVBQWdCRixFQUFXLEVDWGpELE9BQVMsUUFBQUcsT0FBWSxNQUNyQixPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkFReEMsSUFBTUMsRUFBTixjQUEyQ0MsQ0FBWSxDQUF2RCxrQ0FnQkwsS0FBUSxjQUF3QixLQTJOaEMsZ0JBQWEsTUFBT0MsRUFBYUMsSUFBc0QsQ0FDckZELEVBQU0sS0FBSyxvQkFBb0JBLENBQUcsRUFDbEMsR0FBSSxDQUNGLElBQU1FLEVBQWdCLE1BQU0sTUFBTUYsQ0FBRyxFQUNyQyxHQUFJRSxFQUFjLEdBQUksQ0FFcEIsSUFBTUMsRUFEUyxNQUFNRCxFQUFjLEtBQUssRUFFeEMsUUFBV0UsS0FBWUQsRUFBVyxNQUM1QkYsSUFDRkUsRUFBVyxNQUFNQyxDQUFRLEVBQUksS0FBSyxrQkFBa0JELEVBQVcsTUFBTUMsQ0FBUSxFQUFHSCxDQUFPLEdBRzNGLE9BQU9FLENBQ1QsQ0FDRixPQUFTRSxFQUFHLENBRVosQ0FDQSxPQUFPLElBQ1QsRUFFQSw2QkFBMEIsQ0FBQ0MsRUFBY0MsS0FDdkNELEVBQU9BLEVBQUssUUFBUSxRQUFTLEVBQUUsRUFDeEJBLEdBQUEsTUFBQUEsRUFBTSxvQkFBb0IsV0FBVyxTQUFXLENBQUNDLEVBQ3BERCxFQUNBLEtBQUssb0JBQW9CLEdBQUdDLENBQVEsSUFBSUQsQ0FBSSxFQUFFLEdBR3BELHVCQUFvQixDQUFDQSxFQUF5QkMsSUFDckMsTUFBTSxRQUFRRCxDQUFJLEVBQ3JCQSxFQUFLLElBQUlFLEdBQUssS0FBSyx3QkFBd0JBLEVBQUdELENBQVEsQ0FBQyxFQUN2RCxLQUFLLHdCQUF3QkQsRUFBTUMsQ0FBUSxFQXZQekMsdUJBQXVCRSxFQUEyQyxDQUN4RSxRQUFXQyxLQUFlRCxFQUV4QixHQUFJQSxFQUFNLGVBQWVDLENBQVcsRUFBRyxDQUNyQyxJQUFNQyxFQUFlRixFQUFNQyxDQUE4QixFQUN6RCxHQUFJQyxHQUNGLFFBQVdDLEtBQWFELEVBRXRCLEdBQUlBLEVBQWEsZUFBZUMsQ0FBUyxFQUFHLENBQzFDLElBQU1DLEVBQVFGLEVBQWFDLENBQXNDLEVBQ2pFLEdBQUksTUFBTSxRQUFRQyxDQUFLLEVBQ3JCLE9BQU9BLEVBQU0sSUFBSSxNQUFNLEVBQ2xCLEdBQTJCQSxHQUFVLEtBQzFDLE9BQU8sT0FBT0EsQ0FBSyxDQUV2QixFQUdOLENBRUYsT0FBTyxJQUNULENBRVEsZUFBc0IsQ0FHNUIsS0FBSyxXQUFhLFlBQVksSUFBTSxDQUNsQyxJQUFNQyxFQUFXLEtBQUssSUFBSSxZQUFZLEVBQ2hDQyxFQUFjLEtBQUssSUFBSSxZQUFZLEVBQ25DQyxFQUFjLEtBQUssVUFBVUYsQ0FBUSxFQUMzQyxHQUFJRSxJQUFnQixLQUFLLFlBQWEsQ0FDcEMsS0FBSyxZQUFjQSxFQUNuQixJQUFNSCxFQUFRLEtBQUssdUJBQXVCRSxDQUFXLEVBQ3JELEtBQUssU0FBV0YsRUFDaEIsS0FBSyxhQUFhQSxDQUFLLENBQ3pCLENBQ0YsRUFBRyxHQUFHLENBQ1IsQ0FFUSxjQUFxQixDQUN2QixLQUFLLGFBQWUsUUFDdEIsY0FBYyxLQUFLLFVBQVUsQ0FFakMsQ0FFQSxVQUFvQixDQUNsQixNQUFPLEVBQ1QsQ0FDQSxJQUFJLFNBQVNJLEVBQWtDLENBRS9DLENBRUEsYUFBYUMsRUFBTSxDQUNqQixJQUFNQyxFQUFJRCxFQUFLLGlCQUFpQixZQUFZLEVBQ3hDRSxFQUFTLENBQUMsRUFFUkMsRUFBbUJDLEdBQU0sQ0FDN0IsSUFBTUMsRUFBVyxDQUFDLEVBQ1pDLEVBQU1GLEVBQUcsYUFBYSxLQUFLLEVBQ2pDLEdBQUlFLEVBQUssQ0FDUCxJQUFNQyxFQUFXLE1BQU0sS0FBS0gsRUFBRyxRQUFRLEVBQ2pDSSxFQUFTRCxFQUFTLElBQUtFLEdBQW1CQSxFQUFFLGFBQWEsS0FBSyxDQUFDLEVBQ3JERCxFQUFPLE9BQVMsR0FBSyxDQUFDQSxFQUFPLEtBQUtFLEdBQUssQ0FBQyxPQUFPLFVBQVUsQ0FBQ0EsQ0FBQyxDQUFDLEVBRTFFTCxFQUFTQyxDQUFHLEVBQUlDLEVBQVMsSUFBSUUsR0FBS0UsRUFBbUJGLENBQUMsQ0FBQyxFQUV2REosRUFBU0MsQ0FBRyxFQUFJRixFQUFHLFdBRXZCLENBQ0EsT0FBT0MsQ0FDVCxFQUVNTSxFQUFzQlAsR0FBa0IsQ0FDNUMsR0FBSUEsRUFBSSxDQUNOLElBQUlRLEVBQWEsQ0FBQyxFQUNsQixRQUFXQyxLQUFTVCxFQUFHLFNBQ3JCUSxFQUFhRSxJQUFBLEdBQUtGLEdBQWVULEVBQWlCVSxDQUFLLEdBRXpELE9BQU9ELENBQ1QsQ0FDRixFQUVBLFFBQVdBLEtBQWNYLEVBRXZCLE9BRFlXLEVBQVcsYUFBYSxLQUFLLElBRXZDVixFQUFTWSxJQUFBLEdBQUtaLEdBQVdTLEVBQW1CQyxDQUFVLElBRWpEVixFQUVULGVBQVEsSUFBSSw0Q0FBNEMsRUFDakQsSUFDVCxDQUVBLFNBQVNhLEVBQXNCLENBQzdCLEtBQUssSUFBTUEsRUFFWCxJQUFNQyxFQUFPLEtBQUssY0FBYyxVQUFZLHlCQUEyQixNQUFRLE1BQ3pFQyxFQUNKRCxHQUFRLE1BQVEsS0FBSyxjQUFjLHdCQUF3QixFQUFJLEtBQUssY0FBYyxRQUFRLEVBQzVGQyxFQUFJLFVBQVUsSUFBSSx1QkFBdUIsRUFFckNELEdBQVEsT0FBUyxLQUFLLGNBQWMsWUFBWSxJQUNqRCxLQUFLLGNBQWMsWUFBWSxFQUFrQixNQUFNLFFBQVUsUUFHcEUsSUFBTWQsRUFDSmMsR0FBUSxNQUNKLENBQ0UsV0FBWSxLQUFLLFFBQ2pCLFFBQVMsSUFBTSxDQUNiLFFBQVEsSUFBSSxTQUFTLENBQ3ZCLENBQ0YsRUFDQSxLQUFLLGFBQWEsSUFBSSxFQUU1QkEsR0FBUSxNQUNKRCxFQUFJLFlBQVlFLEVBQUtmLEVBQVEsTUFBUyxFQUNyQ2EsRUFBWSxXQUFXLEtBQUssZ0NBQWlDRSxFQUFJLGtCQUFtQmYsQ0FBTSxFQUUzRmMsR0FBUSxPQUNJLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixNQUFNLENBQUMsRUFBRSxJQUFJRSxHQUFPQSxFQUFJLGFBQWEsTUFBTSxDQUFDLEVBQ3JGLFFBQVFDLEdBQVEsQ0FDcEIsSUFBTUMsRUFBUyxTQUFTLGNBQWMsTUFBTSxFQUM1Q0EsRUFBTyxJQUFNLGFBQ2JBLEVBQU8sS0FBTyxXQUNkQSxFQUFPLE1BQVEsU0FDZkEsRUFBTyxLQUFPRCxFQUNkRixFQUFJLFlBQVlHLENBQU0sQ0FDeEIsQ0FBQyxFQUVILEtBQUssY0FBYyxDQUNyQixDQUVTLG1CQUEwQixDQUNqQyxNQUFNLGtCQUFrQixFQUV4QixPQUFPLDhCQUErQixLQUM3QixDQUNMLFNBQVVDLEdBQVEsQ0FDaEIsS0FBSyxTQUFTQSxDQUFJLENBQ3BCLEVBQ0EsWUFBYSxJQUFNLENBRW5CLENBQ0YsRUFDRCxFQUVELElBQU1uQixFQUFTLEtBQUssbUJBQW1CLEVBQ3BCLFVBQVUsT0FBT0EsQ0FBTSxFQUMvQixDQUFDLFNBQVMsRUFBR29CLEdBQVcsQ0FDakNBLEVBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUN2QixDQUFDLENBQ0gsQ0FFUyxzQkFBNkIsQ0FDcEMsTUFBTSxxQkFBcUIsRUFDM0IsVUFBVSxNQUFNLEtBQUssK0JBQStCLEVBRXBELElBQU1DLEVBQVUsVUFBVSxFQUFFLFNBQzVCLE9BQU9BLEVBQVEsS0FBSywrQkFBK0IsRUFDbkQsS0FBSyxhQUFhLENBQ3BCLENBRUEsb0JBQXFCLENBRW5CLElBQU1yQixFQUFpQyxDQUNyQyxRQUFTLEtBQUssZ0NBQ2QsV0FBWSxHQUNaLE1BQU8sT0FBTyxjQUFtQixDQUFDLEVBQ2xDLEtBQU0sT0FBTyxhQUFrQixDQUFDLENBQ2xDLEVBRUEsR0FBSSxDQUFDLFdBQVcsUUFDZCxZQUFLLGNBQWdCLHNGQUNkLEtBRVQsSUFBTW5CLEVBQVUsS0FBSyxhQUFhLGVBQWUsRUFDM0N5QyxFQUFxQixLQUFLLGNBQWMseUJBQXlCLEVBRXZFLEdBQUlBLEVBQW9CLENBQ3RCLElBQU1DLEVBQVVELEVBQW1CLGlCQUFpQix3QkFBd0IsRUFDNUUsUUFBV0UsS0FBVUQsRUFBUyxDQUM1QixJQUFNdkMsRUFBV3dDLEVBQU8sYUFBYSxJQUFJLEVBQ25DQyxFQUFjRCxFQUFPLGFBQWEsY0FBYyxFQUNoREUsRUFBZUYsRUFBTyxhQUFhLGVBQWUsRUFFeEQsR0FBSXhDLEdBQVl5QyxFQUFhLENBRTNCLElBQU1FLEVBQVFELEVBQ1YsS0FBSywyQkFDSCxLQUFLLGtCQUFrQkQsRUFBYTVDLENBQU8sRUFDM0MsS0FBSyxrQkFBa0I2QyxFQUFjN0MsQ0FBTyxDQUM5QyxFQUNBLEtBQUssa0JBQWtCNEMsRUFBYTVDLENBQU8sRUFDekMrQyxFQUFlNUIsRUFBTyxNQUFNaEIsQ0FBUSxHQUFLLENBQUMsRUFDaERnQixFQUFPLE1BQU1oQixDQUFRLEVBQUksS0FBSywyQkFBMkI0QyxFQUFjRCxDQUFLLENBQzlFLENBQ0YsQ0FDRixDQUNBLE9BQU8zQixDQUNULENBRVEsMkJBQTJCNkIsRUFBMEJDLEVBQTBCLENBQ3JGLElBQU1DLEVBQWEsTUFBTSxRQUFRRixDQUFLLEVBQUlBLEVBQVEsQ0FBQ0EsQ0FBSyxFQUNsREcsRUFBYSxNQUFNLFFBQVFGLENBQUssRUFBSUEsRUFBUSxDQUFDQSxDQUFLLEVBQ3hELE9BQU9DLEVBQVcsT0FBT0MsQ0FBVSxDQUNyQyxDQUVRLG9CQUFvQkMsRUFBYSxDQU12QyxPQUw2QkEsRUFDMUIsUUFBUSxlQUFnQixJQUFJLEVBQzVCLFFBQVEsUUFBUyxHQUFHLEVBQ3BCLFFBQVEsU0FBVSxTQUFTLEVBQzNCLFFBQVEsVUFBVyxVQUFVLENBRWxDLENBbUNTLFFBQVMsQ0FDaEIsT0FBT0Msa0JBQW9CLEtBQUssZUFDOUJBO0FBQUE7QUFBQSxVQUVJLEtBQUssYUFBYTtBQUFBLGFBQ2YsRUFDWCxDQUNGLEVBNVFFQyxFQUFBLENBRENoQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcscUJBQXNCLENBQUMsR0FOakR6QixFQU9YLGtDQUdBeUQsRUFBQSxDQURDaEMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLFFBQVMsQ0FBQyxHQVRwQ3pCLEVBVVgsc0JBR0F5RCxFQUFBLENBRENoQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsb0NBQXFDLENBQUMsR0FaaEV6QixFQWFYLCtDQUdReUQsRUFBQSxDQURQQyxHQUFNLEdBZkkxRCxFQWdCSCw2QkFoQkdBLEVBQU55RCxFQUFBLENBRE5FLEdBQWMsaUNBQWlDLEdBQ25DM0QsR0NUYixPQUFTLGNBQUE0RCxHQUFZLE9BQUFDLEdBQUssUUFBQUMsT0FBWSxNQUV0QyxPQUFTLGlCQUFBQyxHQUFlLFNBQUFDLE9BQWEsb0JDRjlCLElBQU1DLEdBQU4sTUFBTUMsQ0FBaUIsQ0FtQzVCLGFBQWMsQ0FsQ2QsS0FBUSxZQUFjLEVBQ3RCLEtBQVEsV0FBYSxLQUNyQixLQUFRLFdBQWEsRUFDckIsS0FBUSxTQUFXLEdBQ25CLEtBQVEsU0FBVyxLQUNuQixLQUFRLFVBQVksS0FDcEIsS0FBUSxnQkFBa0IsR0FDMUIsS0FBUSxhQUFlLEdBRXZCLEtBQVEsY0FBZ0IsQ0FDdEIsS0FBTSxDQUFDLEVBQ1AsUUFBUyxTQUFVQyxFQUFNQyxFQUFLLENBQzVCLEtBQUssS0FBS0QsQ0FBSSxFQUFJQyxDQUNwQixFQUNBLFFBQVMsU0FBVUQsRUFBTSxDQUN2QixPQUFPLEtBQUssS0FBS0EsQ0FBSSxDQUN2QixFQUNBLGNBQWUsTUFDakIsRUFDQSxLQUFRLFlBQWMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBRW5DLEtBQVEsWUFBYyxLQUN0QixLQUFRLHNCQUF3QixLQUNoQyxLQUFRLGFBQWUsR0FFdkIsS0FBUSxlQUFpQixJQUN6QixLQUFRLGtCQUFvQixJQUM1QixLQUFRLFdBQWEsRUFDckIsS0FBUSxhQUFlLEdBR3ZCLHlCQUErQixHQUMvQixpQkFBdUIsR0E0RXZCLEtBQVEsZ0JBQWtCLENBQUNFLEVBQVFDLElBQW1ELENBQ3BGLEdBQUksS0FBSyxZQUFjLE1BQVEsS0FBSyxhQUFjLENBQ2hELEtBQUssU0FBUyxNQUFNLFFBQVUsS0FBSyxhQUNuQyxLQUFLLFVBQVksS0FBSyxTQUFTLFVBQVUsRUFBSSxFQUM3QyxJQUFNQyxFQUFnQixPQUFPLGlCQUFpQixLQUFLLFFBQVEsRUFLM0QsR0FIQSxLQUFLLFVBQVUsTUFBUSxHQUN2QixLQUFLLFVBQVUsYUFBYSxZQUFhLEVBQUUsRUFFdkMsS0FBSyxvQkFDUCxRQUFXQyxLQUFTRCxFQUNsQixLQUFLLFVBQVUsTUFBTUMsQ0FBSyxFQUFJRCxFQUFjLGlCQUFpQkMsQ0FBSyxFQUl0RSxLQUFLLDJCQUEyQkYsQ0FBUSxFQUV4QyxLQUFLLFVBQVUsTUFBTSxJQUFNQSxFQUFTLFFBQVUsS0FBSyxZQUFZLEVBQUksS0FDbkUsS0FBSyxVQUFVLE1BQU0sS0FBT0EsRUFBUyxRQUFVLEtBQUssWUFBWSxFQUFJLEtBQ3BFLEtBQUssVUFBVSxNQUFNLFNBQVcsUUFDaEMsS0FBSyxVQUFVLE1BQU0sY0FBZ0IsT0FDckMsS0FBSyxVQUFVLE1BQU0sT0FBUyxTQUU5QixLQUFLLFVBQVksU0FBUyxLQUFLLFlBQVksS0FBSyxTQUFTLEVBQ3pELEtBQUssZUFBZSxLQUFLLFNBQVUsV0FBVyxDQUNoRCxDQUdBLEdBQUksS0FBSyxhQUFjLENBRXJCLElBQU1HLEVBQVEsS0FDZCxzQkFBc0IsVUFBWSxDQUM1QkEsRUFBTSxpQkFBbUJBLEVBQU0sWUFBYyxPQUNqREEsRUFBTSxVQUFVLE1BQU0sSUFBTUgsRUFBUyxRQUFVRyxFQUFNLFlBQVksRUFBSSxLQUNyRUEsRUFBTSxVQUFVLE1BQU0sS0FBT0gsRUFBUyxRQUFVRyxFQUFNLFlBQVksRUFBSSxLQUN4RSxDQUFDLEVBRUQsSUFBTUMsRUFBUyxLQUFLLGVBQWVMLENBQUMsRUFHaENLLEdBQVUsS0FBSyxjQUNqQixLQUFLLGVBQWVBLEVBQVEsV0FBVyxFQUN2QyxLQUFLLGVBQWUsS0FBSyxZQUFhLFdBQVcsRUFDakQsS0FBSyxZQUFjQSxHQUtyQixLQUFLLHNCQUF3QkEsRUFDekIsS0FBSyx1QkFBdUIsS0FBSyxlQUFlQSxFQUFRLFVBQVUsQ0FDeEUsQ0FDRixFQTNIRSxPQUFJUixFQUFpQixVQUVaQSxFQUFpQixXQUUxQkEsRUFBaUIsVUFBWSxLQU03QixTQUFTLGlCQUFpQixZQUFhLEtBQUssV0FBVyxLQUFLLElBQUksRUFBRyxDQUFFLFFBQVMsR0FBTyxRQUFTLEVBQU0sQ0FBQyxFQUNyRyxTQUFTLGlCQUFpQixZQUFhLEtBQUssV0FBVyxLQUFLLElBQUksRUFBRyxDQUFFLFFBQVMsR0FBTyxRQUFTLEVBQU0sQ0FBQyxFQUVyRyxTQUFTLGlCQUFpQixXQUFZLEtBQUssVUFBVSxLQUFLLElBQUksRUFBRyxDQUFFLFFBQVMsR0FBTyxRQUFTLEVBQU0sQ0FBQyxFQUNuRyxTQUFTLGlCQUFpQixVQUFXLEtBQUssVUFBVSxLQUFLLElBQUksRUFBRyxDQUFFLFFBQVMsR0FBTyxRQUFTLEVBQU0sQ0FBQyxFQUVsRyxTQUFTLGlCQUFpQixjQUFlLEtBQUssYUFBYSxLQUFLLElBQUksRUFBRyxDQUFFLFFBQVMsR0FBTyxRQUFTLEVBQU0sQ0FBQyxFQUVsRyxLQUNULENBRUEsY0FBY1MsRUFBdUIsQ0FDbkNBLEVBQVcsUUFBUUMsR0FBTSxDQUN2QkEsRUFBRyxpQkFBaUIsYUFBYyxLQUFLLFlBQVksS0FBSyxJQUFJLEVBQUcsQ0FBRSxRQUFTLEdBQU8sUUFBUyxFQUFNLENBQUMsRUFDakdBLEVBQUcsaUJBQWlCLFlBQWEsS0FBSyxZQUFZLEtBQUssSUFBSSxFQUFHLENBQUUsUUFBUyxHQUFPLFFBQVMsRUFBTSxDQUFDLENBQ2xHLENBQUMsQ0FDSCxDQU1RLFlBQVlQLEVBQUcsQ0FFckIsS0FBSyxZQUFjLEtBQUssSUFBSSxFQUU1QixHQUFNLENBQUUsRUFBQVEsRUFBRyxFQUFBQyxDQUFFLEVBQUksS0FBSyxVQUFVVCxDQUFDLEVBT2pDLEdBTEEsS0FBSyxXQUFhLENBQUUsRUFBQVEsRUFBRyxFQUFBQyxDQUFFLEVBRXpCLEtBQUssU0FBV1QsRUFBRSxjQUNsQixLQUFLLFNBQVcsR0FFWixLQUFLLFlBQWEsQ0FDcEIsSUFBTUMsRUFBVyxDQUFFLFFBQVNPLEVBQUcsUUFBU0MsQ0FBRSxFQUMxQyxLQUFLLGFBQWUsR0FDcEIsS0FBSyxnQkFBZ0JULEVBQUdDLENBQVEsQ0FDbEMsQ0FFQUQsRUFBRSxlQUFlLENBQ25CLENBTVEsV0FBV0EsRUFBRyxDQUNwQixHQUFJLEtBQUssVUFBWSxLQUFLLFNBQVUsQ0FHbEMsR0FBTSxDQUFFLEVBQUFRLEVBQUcsRUFBQUMsQ0FBRSxFQUFJLEtBQUssVUFBVVQsQ0FBQyxFQUMzQkMsRUFBVyxDQUFFLFFBQVNPLEVBQUcsUUFBU0MsQ0FBRSxFQUV0QyxLQUFLLFVBQVVSLENBQVEsR0FBSyxLQUFLLGFBQ25DLEtBQUssYUFBZSxJQUd0QixLQUFLLGdCQUFnQkQsRUFBR0MsQ0FBUSxFQUNoQ0QsRUFBRSxlQUFlLENBQ25CLENBQ0YsQ0EyRFEsVUFBVUEsRUFBRyxDQXRLdkIsSUFBQVUsRUFrTEksR0FYQSxLQUFLLGdCQUFrQixHQUN2QixLQUFLLFNBQVcsR0FVWixLQUFLLHNCQUNQLEtBQUssZUFBZSxLQUFLLHNCQUF1QixNQUFNLEVBQ3RELEtBQUssZUFBZSxLQUFLLFNBQVUsU0FBUyxVQUl4QyxLQUFLLGFBQWMsQ0FDckIsSUFBTUMsRUFBUSxJQUFJLFlBQVksVUFBVyxDQUFFLFFBQVMsR0FBTSxXQUFZLEVBQUssQ0FBQyxFQUM1RUEsRUFBTSxhQUFrQixDQUFFLFdBQVksTUFBTyxHQUM3Q0QsRUFBQSxLQUFLLFdBQUwsTUFBQUEsRUFBZSxjQUFjQyxFQUMvQixDQUdGLEtBQUssT0FBTyxDQUNkLENBTVEsYUFBYVgsRUFBRyxDQUN0QixLQUFLLE9BQU8sQ0FDZCxDQU1RLGVBQWVXLEVBQU8sQ0FDNUIsSUFBTUMsRUFBc0IsS0FBSyxVQUFVRCxDQUFLLEVBQzFDRSxFQUFVLElBQUksSUFFcEIsT0FEZ0IsS0FBSyx1QkFBdUIsU0FBVUQsRUFBb0IsRUFBR0EsRUFBb0IsRUFBR0MsQ0FBTyxDQUU3RyxDQUVRLHVCQUNOQyxFQUNBTixFQUNBQyxFQUNBSSxFQUNnQixDQUNoQixJQUFNTixFQUFLTyxFQUFLLGlCQUFpQk4sRUFBR0MsQ0FBQyxFQUNyQyxHQUFJRixFQUFJLENBRU4sR0FBSU0sRUFBUSxJQUFJTixDQUFFLEVBRWhCLE9BQU8sS0FJVCxHQUZBTSxFQUFRLElBQUlOLENBQUUsRUFFVkEsRUFBRyxhQUFhLFVBQVUsRUFFNUIsT0FBT0EsRUFFVCxHQUFJQSxFQUFHLFdBQVksQ0FFakIsSUFBTVEsRUFBVyxLQUFLLHVCQUF1QlIsRUFBRyxXQUFZQyxFQUFHQyxFQUFHSSxDQUFPLEVBQ3pFLEdBQUlFLEVBRUYsT0FBT0EsQ0FFWCxDQUVBLE9BQU9SLENBQ1QsQ0FFQSxPQUFPLElBQ1QsQ0FFUSxVQUFVSSxFQUFPSyxFQUFPLENBQzlCLE9BQUlMLEdBQVNBLEVBQU0sVUFDakJBLEVBQVFBLEVBQU0sUUFBUSxDQUFDLEdBRWxCLENBQ0wsRUFBR0ssRUFBT0wsRUFBTSxNQUFRQSxFQUFNLFFBQzlCLEVBQUdLLEVBQU9MLEVBQU0sTUFBUUEsRUFBTSxPQUNoQyxDQUNGLENBTVEsMkJBQTJCTSxFQUFPLENBQ3hDLElBQU1DLEVBQWEsS0FBSyxTQUFTLHNCQUFzQixFQUN2RCxLQUFLLFlBQVksRUFBSUQsRUFBTSxRQUFVQyxFQUFXLEtBQ2hELEtBQUssWUFBWSxFQUFJRCxFQUFNLFFBQVVDLEVBQVcsR0FDbEQsQ0FNUSxVQUFVRCxFQUFPLENBQ3ZCLElBQU1ULEVBQUksS0FBSyxJQUFJUyxFQUFNLFFBQVUsS0FBSyxXQUFXLENBQUMsRUFDOUNSLEVBQUksS0FBSyxJQUFJUSxFQUFNLFFBQVUsS0FBSyxXQUFXLENBQUMsRUFFcEQsT0FBT1QsRUFBSUMsQ0FDYixDQVFRLGVBQWVULEVBQUdtQixFQUFXQyxFQUFTLEdBQU0sQ0FDbEQsR0FBSSxDQUFDcEIsRUFBRyxNQUFPLEdBRWYsSUFBTVcsRUFBUSxJQUFJLFlBQVlRLEVBQVcsQ0FBRSxRQUFTQyxFQUFRLFdBQVksRUFBSyxDQUFDLEVBQzlFLE9BQUFULEVBQU0sYUFBa0IsS0FBSyxjQUM3QlgsRUFBRSxjQUFjVyxDQUFLLEVBQ2RBLEVBQU0sZ0JBQ2YsQ0FLUSxRQUFTLENBQ1gsS0FBSyxlQUNQLEtBQUssU0FBUyxNQUFNLFFBQVUsTUFDOUIsS0FBSyxVQUFVLGNBQWMsWUFBWSxLQUFLLFNBQVMsR0FHekQsS0FBSyxhQUFlLEdBQ3BCLEtBQUssU0FBVyxLQUNoQixLQUFLLFVBQVksS0FDakIsS0FBSyxTQUFXLEdBRWhCLEtBQUssWUFBYyxFQUNuQixLQUFLLFdBQWEsS0FDbEIsS0FBSyxXQUFhLEVBQ2xCLEtBQUssZ0JBQWtCLEdBQ3ZCLEtBQUssY0FBZ0IsQ0FDbkIsS0FBTSxDQUFDLEVBQ1AsUUFBUyxTQUFVYixFQUFNQyxFQUFLLENBQzVCLEtBQUssS0FBS0QsQ0FBSSxFQUFJQyxDQUNwQixFQUNBLFFBQVMsU0FBVUQsRUFBTSxDQUN2QixPQUFPLEtBQUssS0FBS0EsQ0FBSSxDQUN2QixFQUNBLGNBQWUsTUFDakIsRUFDQSxLQUFLLFlBQWMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBRWhDLEtBQUssWUFBYyxLQUNuQixLQUFLLHNCQUF3QixLQUM3QixLQUFLLGFBQWUsRUFDdEIsQ0E4QkYsRUNuV0EsT0FBUyxZQUFBdUIsT0FBZ0Isb0JBT2xCLElBQU1DLEdBQWtCLENBQzdCQyxFQUNBQyxFQUNBQyxJQUNHLENBQ0gsTUFBTUMsVUFBMEJILENBQVcsQ0FBM0Msa0NBRzhDLGNBQVcsR0FFOUMsYUFBYUksRUFBb0IsQ0FHeEMsR0FBSSxLQUFLLFVBQVUsU0FBUyxtQkFBbUIsRUFBRyxPQUVsRCxNQUFNLGFBQWFBLENBQVksRUFFL0IsSUFBTUMsRUFBYSxNQUFNLEtBQ3ZCSixFQUNJLEtBQUssV0FBVyxpQkFBaUJDLENBQWtCLEVBQ25ELEtBQUssaUJBQWlCQSxDQUFrQixDQUM5QyxFQUVBLEtBQUssZ0JBQWtCLEtBQUssZ0JBQWdCLEtBQUssSUFBSSxFQUNyRCxLQUFLLGlCQUFtQixLQUFLLGlCQUFpQixLQUFLLElBQUksRUFDdkQsS0FBSyxpQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEVBRXZELEtBQUssWUFBYyxLQUFLLFlBQVksS0FBSyxJQUFJLEVBRTdDRyxFQUFXLFFBQVFDLEdBQUssQ0FDdEJBLEVBQUUsYUFBYSxXQUFZLE1BQU0sRUFDakNBLEVBQUUsaUJBQWlCLFlBQWEsS0FBSyxnQkFBZ0IsRUFFckQsS0FBSyxjQUFjQSxDQUFDLENBQ3RCLENBQUMsRUFDRCxRQUFXQyxLQUFhRixFQUN0QixLQUFLLFNBQVcsSUFBSSxpQkFBaUJHLEdBQWEsQ0FDaERBLEVBQVUsUUFBUUMsR0FBWSxDQUM1QixHQUFJQSxFQUFTLE9BQVMsYUFFcEIsT0FEaUJBLEVBQVMsY0FDUixDQUNoQixJQUFLLFdBQVksQ0FDRUYsRUFBVSxhQUFhLFVBQVUsRUFJaEQsS0FBSyxjQUFjQSxDQUFTLEVBRjVCLEtBQUssY0FBY0EsQ0FBUyxFQUk5QixLQUNGLENBQ0YsQ0FFSixDQUFDLENBQ0gsQ0FBQyxFQUNELEtBQUssU0FBUyxRQUFRQSxFQUFXLENBQy9CLFdBQVksRUFDZCxDQUFDLENBRUwsQ0FFUSxjQUFjQSxFQUFvQixDQUN4Q0EsRUFBVSxpQkFBaUIsV0FBWSxLQUFLLGVBQWUsRUFDM0RBLEVBQVUsaUJBQWlCLFlBQWEsS0FBSyxnQkFBZ0IsRUFDN0RBLEVBQVUsaUJBQWlCLE9BQVEsS0FBSyxXQUFXLENBQ3JELENBRVEsY0FBY0EsRUFBb0IsQ0FDeENBLEVBQVUsb0JBQW9CLFdBQVksS0FBSyxlQUFlLEVBQzlEQSxFQUFVLG9CQUFvQixZQUFhLEtBQUssZ0JBQWdCLEVBQ2hFQSxFQUFVLG9CQUFvQixPQUFRLEtBQUssV0FBVyxDQUN4RCxDQUVTLHNCQUF1QixDQWhGcEMsSUFBQUcsRUFtRlUsS0FBSyxVQUFVLFNBQVMsbUJBQW1CLElBRS9DLE1BQU0scUJBQXFCLEdBQzNCQSxFQUFBLEtBQUssV0FBTCxNQUFBQSxFQUFlLGFBQ2pCLENBRUEsaUJBQWlCQyxFQUFlLENBQzlCQSxFQUFHLGVBQWUsQ0FDcEIsQ0FFQSxnQkFBZ0JBLEVBQWUsQ0FDN0IsT0FBQUEsRUFBRyxlQUFlLEVBQ0FBLEVBQUcsY0FHWCxhQUFhLFNBQVUsRUFBRSxFQUVuQ0EsRUFBRyxhQUFhLFdBQWEsT0FFdEIsRUFDVCxDQUVBLFlBQVlBLEVBQWUsQ0FDekJBLEVBQUcsZUFBZSxFQUNsQixJQUFNSixFQUFZSSxFQUFHLGNBTWZDLEVBQXNCLEtBQUssY0FBYyxlQUFlRCxFQUFHLGFBQWEsUUFBUSxNQUFNLENBQUMsRUFBRSxFQUN6RkUsRUFBWUQsR0FFZCxLQUFLLFdBQVcsY0FBYyxlQUFlRCxFQUFHLGFBQWEsUUFBUSxNQUFNLENBQUMsRUFBRSxFQUVsRixPQUFLSixFQUVNTSxFQUFVLGNBQWMsYUFBYSxZQUFZLElBQU1OLEVBQVUsYUFBYSxZQUFZLEdBQ25HQSxFQUFVLFlBQVlNLENBQVMsRUFGL0IsUUFBUSxNQUFNLGtDQUFrQ0YsRUFBRyxPQUFTLEtBQUssVUFBVUEsRUFBRyxNQUFNLEVBQUksTUFBTSxFQUFFLEVBTWxHSixFQUFVLGdCQUFnQixRQUFRLEVBRTNCLEVBQ1QsQ0FFQSxpQkFBaUJJLEVBQWUsQ0FDOUIsT0FBQUEsRUFBRyxlQUFlLEVBRUFBLEVBQUcsY0FDWCxnQkFBZ0IsUUFBUSxFQUNsQ0EsRUFBRyxhQUFhLFdBQWEsT0FFdEIsRUFDVCxDQUNGLENBM0g4QyxPQUFBRyxFQUFBLENBQTNDQyxHQUFTLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBSyxDQUFDLEdBSHRDWixFQUd3Qyx3QkE0SHZDQSxDQUNULEVDekhPLElBQU1hLEdBQWtCLENBQzdCQyxFQUNBQyxFQUNBQyxJQUNHLENBQ0gsTUFBTUMsVUFBMEJILENBQVcsQ0E0RDNDLENBQ0EsT0FBT0csQ0FDVCxFQ2xGQSxPQUFTLFlBQUFDLE1BQWdCLG9CQWlCbEIsSUFBTUMsRUFBMkIsQ0FDdENDLEVBQ0FDLEVBQ0FDLEVBQ0FDLElBQ0csQ0FDSCxNQUFNQyxVQUFtQ0MsR0FDdkNDLEdBQWdCTixFQUFZRSxFQUF3QkMsQ0FBa0IsRUFDdEVBLEVBQ0FGLENBQ0YsQ0FBRSxDQUpGLGtDQUtFLEtBQVUsV0FBYSxJQUFJLElBMkJtQyx3QkFBNkIsR0FFN0MsbUJBQTBDLENBQ3RGLG9CQUFxQixHQUNyQixvQkFBcUIsR0FDckIsWUFBYSxFQUNmLEVBTzRDLGNBQVcsR0FTWCxjQUFXLEdBU21CLHFCQUFrQixFQUNsQixxQkFBa0IsRUE0QjVGLEtBQVEsZ0JBQW1CTSxHQUFZLENBQ3JDQSxFQUFHLGFBQWEsUUFBUSxPQUFRQSxFQUFHLGNBQWMsYUFBYSxZQUFZLENBQUMsRUFDM0VBLEVBQUcsY0FBYyxhQUFhLFdBQVksRUFBRSxFQUc1QyxLQUFLLFdBQVcsUUFBUUMsR0FBS0EsRUFBRSxhQUFhLFVBQVcsRUFBRSxDQUFDLENBQzVELEVBRUEsS0FBUSxjQUFpQkQsR0FBa0IsQ0FDekNBLEVBQUcsZUFBZSxFQUNsQixLQUFLLFdBQVcsUUFBUUMsR0FBS0EsRUFBRSxnQkFBZ0IsU0FBUyxDQUFDLEVBQ3pELElBQU1DLEVBQVlGLEVBQUcsY0FDckJFLEVBQVUsZ0JBQWdCLE1BQU0sRUFDaENBLEVBQVUsZ0JBQWdCLFVBQVUsR0FHaENGLEVBQUcsYUFBYSxhQUFlLFFBQVVBLEVBQUcsYUFBYSxhQUFlLFNBQ3RFLEtBQUssY0FBYyxxQkFDckIsS0FBSyxtQkFBbUJFLENBQVMsRUFHakNGLEVBQUcsYUFBYSxhQUFlLFNBQ2pDLEtBQUssYUFBYSxFQUNsQixLQUFLLDBCQUEwQixFQUVuQyxFQTNHQSxrQkFBa0JHLEVBQXVCQyxFQUF5QixDQUNoRSxHQUFJLEtBQUssVUFBVSxTQUFTLG1CQUFtQixFQUFHLE9BRy9CRCxFQUFXLE9BQU8sR0FBSyxDQUFDLEtBQUssWUFBYyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUV0RSxPQUFTLElBQ3RCLEtBQUssWUFBWSxjQUFjQSxDQUFVLEVBRXpDQSxFQUFXLFFBQVFFLEdBQVEsQ0FFekIsS0FBSyxXQUFXLElBQUlBLEVBQU0sQ0FDeEIsT0FBUUEsRUFBSyxjQUNiLE1BQU8sTUFBTSxLQUFLQSxFQUFLLFdBQVcsUUFBUSxFQUFFLFFBQVFBLENBQUksQ0FDMUQsQ0FBQyxFQUNEQSxFQUFLLGFBQWEsZ0JBQWlCLE1BQU0sRUFDekNBLEVBQUssaUJBQWlCLFlBQWEsS0FBSyxlQUFlLEVBQ3ZEQSxFQUFLLGlCQUFpQixVQUFXLEtBQUssYUFBYSxDQUNyRCxDQUFDLEVBRUwsQ0FVQSx5QkFBeUJDLEVBQUtDLEVBQWEsQ0FDekMsS0FBSyxZQUFZLG9CQUFzQkEsRUFBWSxvQkFDbkQsS0FBSyxZQUFZLFlBQWNBLEVBQVksV0FDN0MsQ0FJQSxxQkFBcUJELEVBQUtFLEVBQW1CLENBQzNDLEtBQUssV0FBVyxRQUFRLENBQUNDLEVBQUdDLElBQU8sQ0FDakNGLEVBQVdFLEVBQUcsYUFBYSxXQUFZLEVBQUUsRUFBSUEsRUFBRyxnQkFBZ0IsVUFBVSxFQUMxRUYsRUFBV0UsRUFBRyxnQkFBZ0IsZUFBZSxFQUFJQSxFQUFHLGFBQWEsZ0JBQWlCLE1BQU0sQ0FDMUYsQ0FBQyxDQUNILENBSUEscUJBQXFCSixFQUFLSyxFQUFtQixDQUMzQyxLQUFLLFdBQVcsUUFBUSxDQUFDRixFQUFHQyxJQUFPLENBQ2pDQyxFQUFXRCxFQUFHLGFBQWEsV0FBWSxFQUFFLEVBQUlBLEVBQUcsZ0JBQWdCLFVBQVUsRUFDMUVDLEVBQVdELEVBQUcsZ0JBQWdCLGVBQWUsRUFBSUEsRUFBRyxhQUFhLGdCQUFpQixNQUFNLENBQzFGLENBQUMsQ0FDSCxDQUtTLGFBQWFFLEVBQW9CLENBQ3hDLE1BQU0sYUFBYUEsQ0FBWSxFQUMvQixLQUFLLFdBQWEsTUFBTSxLQUN0QmpCLEVBQ0ksS0FBSyxXQUFXLGlCQUFpQkMsQ0FBa0IsRUFDbkQsS0FBSyxpQkFBaUJBLENBQWtCLENBQzlDLENBSUYsQ0FFUyxtQkFBb0IsQ0FDM0IsTUFBTSxrQkFBa0IsRUFFeEIsS0FBSyxZQUFjLElBQUlpQixHQUV2QixLQUFLLGNBQ0gsSUFBSSxZQUF3QywyQkFBNEIsQ0FDdEUsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLElBQ1YsQ0FBQyxDQUNILENBQ0YsQ0E2QlEsbUJBQW1CWCxFQUF3QixDQUNqRCxJQUFNWSxFQUFXLEtBQUssV0FBVyxJQUFJWixDQUFTLEVBQ3hDYSxFQUNKRCxFQUFTLE9BQVNBLEVBQVMsT0FBTyxTQUFTLE9BQVNBLEVBQVMsTUFBUUEsRUFBUyxPQUFPLFNBQVMsT0FBUyxFQUNuR0UsRUFBY0YsRUFBUyxPQUN2QkcsRUFBVUgsRUFBUyxPQUFPLFNBQVNDLENBQUssRUFFOUNDLEVBQVksYUFBYWQsRUFBV2UsQ0FBTyxFQUMzQyxLQUFLLGFBQWEsRUFDbEIsS0FBSywwQkFBMEIsQ0FDakMsQ0FFQSxNQUFNQyxFQUFPLEdBQVksQ0FDdkIsS0FBSyxXQUFXLFFBQVEsQ0FBQ0osRUFBVVosSUFBYyxDQUMvQyxJQUFNaUIsRUFBV0wsRUFBUyxPQUFPLFNBQzNCQyxFQUFRRCxFQUFTLE1BQVFLLEVBQVMsT0FBU0wsRUFBUyxNQUFRSyxFQUFTLE9BQzNFTCxFQUFTLE9BQU8sYUFBYVosRUFBV2lCLEVBQVNKLENBQUssQ0FBQyxDQUN6RCxDQUFDLEVBQ0RHLEdBQVEsS0FBSyxhQUFhLENBQzVCLENBRVUsMkJBQTRCLENBQ3BDLEtBQUssV0FBVyxRQUFRakIsR0FBSyxDQUkzQixJQUFNbUIsRUFIVyxFQUFFbkIsRUFBRSxhQUFhLFdBQVcsR0FBSyxLQUdyQkEsRUFBRSxpQkFBaUIsd0JBQXdCLEVBQUUsUUFBVSxHQUVwRm1CLEVBQVVuQixFQUFFLGFBQWEsV0FBWSxFQUFFLEVBQUlBLEVBQUUsZ0JBQWdCLFVBQVUsRUFDdkVtQixFQUFVbkIsRUFBRSxnQkFBZ0IsVUFBVSxFQUFJQSxFQUFFLGFBQWEsV0FBWSxNQUFNLENBQzdFLENBQUMsQ0FDSCxDQUVBLElBQUksU0FBU29CLEVBQW9CLENBRzNCLEtBQUssVUFBVSxTQUFTLG1CQUFtQixJQUUvQyxLQUFLLE1BQU0sRUFBSyxFQUNaQSxJQUFhLE1BQVEsTUFBTSxRQUFRQSxDQUFRLEdBQzdDQSxFQUFTLFFBQVFBLEdBQVksQ0FDM0IsR0FBTSxDQUFDQyxFQUFRLEdBQUdDLENBQU8sRUFBSUYsRUFBUyxNQUFNLEdBQUcsRUFBRSxRQUFRLEVBQ3pELEdBQUlDLEVBQVEsQ0FDVixJQUFNRSxFQUFZLEtBQUssV0FBVyxLQUFLQyxHQUFRQSxFQUFLLGFBQWEsWUFBWSxJQUFNSCxDQUFNLEVBQ3pGQyxFQUFRLFFBQVFHLEdBQVUsQ0FDeEIsSUFBTXhCLEVBQVksS0FBSyxjQUFjLGVBQWV3QixDQUFNLEdBQUcsRUFDeERGLEVBRU90QixHQUdWc0IsRUFBVSxZQUFZdEIsQ0FBUyxFQUMvQixLQUFLLDBCQUEwQixHQUgvQixRQUFRLE1BQU0sMENBQTBDd0IsQ0FBTSxFQUFFLEVBRmhFLFFBQVEsTUFBTSwwQ0FBMENKLENBQU0sRUFBRSxDQU9wRSxDQUFDLENBQ0gsQ0FDRixDQUFDLEVBQ0wsQ0FFQSxVQUFXLENBSVQsSUFBTUssR0FIYWhDLEVBQ2YsTUFBTSxLQUFLLEtBQUssV0FBVyxpQkFBaUJDLENBQWtCLENBQUMsRUFDL0QsTUFBTSxLQUFLLEtBQUssaUJBQWlCQSxDQUFrQixDQUFDLEdBQ3hCLE9BQU9LLEdBQUtBLEVBQUUsa0JBQW9CLENBQUMsRUFBRSxPQUNyRSxPQUFPLEtBQUssaUJBQW1CLEdBQUssS0FBSyxpQkFBbUIwQixDQUM5RCxDQUVVLGNBQWUsQ0FDdkIsSUFBSU4sRUFDQSxPQUFRLEtBQWEsYUFBZ0IsV0FFdkNBLEVBQVksS0FBYSxZQUFZLEVBRXJDQSxFQUFXLEtBQUssV0FBVyxJQUFJRyxHQUFhLENBQzFDLElBQU1JLEVBQW1CSixFQUFVLGlCQUFpQix3QkFBd0IsRUFDdEVLLEVBQWMsTUFBTSxLQUFLRCxDQUFnQixFQUFFLElBQUkzQixHQUFLQSxFQUFFLGFBQWEsWUFBWSxDQUFDLEVBQ2hGNkIsRUFBc0JOLEVBQVUsYUFBYSxZQUFZLEVBQy9ELE1BQU8sQ0FBQyxHQUFHSyxFQUFhQyxDQUFtQixFQUFFLEtBQUssR0FBRyxDQUN2RCxDQUFDLEVBR0gsS0FBSyxjQUNILElBQUksWUFBWSwyQkFBNEIsQ0FDMUMsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQ04sbUJBQW9CLEtBQUssbUJBQ3pCLFNBQUFULENBQ0YsQ0FDRixDQUFDLENBQ0gsQ0FDRixDQUNGLENBek1FLE9BQUFVLEVBQUEsQ0FEQ0MsR0FBVXRDLENBQWtCLEdBVHpCRyxFQVVKLGlDQXNCOERrQyxFQUFBLENBQTdERSxFQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcscUJBQXNCLENBQUMsR0FoQ3hEcEMsRUFnQzBELGtDQUVoQmtDLEVBQUEsQ0FBN0NFLEVBQVMsQ0FBRSxVQUFXLEdBQU8sS0FBTSxNQUFPLENBQUMsR0FsQ3hDcEMsRUFrQzBDLDZCQU05Q2tDLEVBQUEsQ0FEQ0csRUFBTSxlQUFlLEdBdkNsQnJDLEVBd0NKLHdDQUs0Q2tDLEVBQUEsQ0FBM0NFLEVBQVMsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQUMsR0E3Q3RDcEMsRUE2Q3dDLHdCQUU1Q2tDLEVBQUEsQ0FEQ0csRUFBTSxXQUFZLENBQUUscUJBQXNCLEVBQUssQ0FBQyxHQTlDN0NyQyxFQStDSixvQ0FPNENrQyxFQUFBLENBQTNDRSxFQUFTLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBSyxDQUFDLEdBdER0Q3BDLEVBc0R3Qyx3QkFFNUNrQyxFQUFBLENBRENHLEVBQU0sV0FBWSxDQUFFLHFCQUFzQixFQUFLLENBQUMsR0F2RDdDckMsRUF3REosb0NBTzBFa0MsRUFBQSxDQUF6RUUsRUFBUyxDQUFFLEtBQU0sT0FBUSxRQUFTLEdBQU0sVUFBVyxrQkFBbUIsQ0FBQyxHQS9EcEVwQyxFQStEc0UsK0JBQ0FrQyxFQUFBLENBQXpFRSxFQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsR0FBTSxVQUFXLGtCQUFtQixDQUFDLEdBaEVwRXBDLEVBZ0VzRSwrQkFvSnJFQSxDQUNULEVKM09PLElBQU1zQyxHQUFOLGNBQXNDQyxFQUMzQ0MsR0FDQSwrQkFDQSxHQUNBLEtBQ0YsQ0FBRSxDQWNTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQTtBQUFBLFFBRUgsS0FBSyxhQUFhLE9BQVMsR0FDN0IsTUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssYUFBYSxPQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQ2hFLENBQUNDLEVBQUdDLElBQ0ZGO0FBQUEsNkJBQ21CRSxDQUFLLHFEQUFxREEsQ0FBSztBQUFBLDhCQUM5REEsQ0FBSyxxREFBcURBLENBQUs7QUFBQSxpQkFFdkYsQ0FBQyxFQUNMLENBRVMsbUJBQW9CLENBQzNCLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssYUFBZSxNQUFNLEtBQUssS0FBSyxpQkFBaUIsOEJBQThCLENBQUMsQ0FDdEYsQ0FDRixFQXBDYUwsR0FRSyxPQUFTTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUZSQyxFQUFBLENBQWhCQyxHQUFNLEdBTklSLEdBTU0sNEJBTk5BLEdBQU5PLEVBQUEsQ0FETkUsR0FBYywyQkFBMkIsR0FDN0JULElLTmIsT0FBUyxRQUFBVSxPQUFZLE1BQ3JCLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsR0FBVSxTQUFBQyxPQUFhLG9CQUt4QyxJQUFNQyxFQUFOLGNBQW1DQyxDQUFZLENBY3BELGFBQWMsQ0FDWixNQUFNLEVBb0JSLEtBQVEsY0FBd0IsS0FuQjlCLEtBQUssa0JBQW9CLEtBQUssa0JBQWtCLEtBQUssSUFBSSxDQUMzRCxDQXlCUyxtQkFBMEIsQ0FDakMsTUFBTSxrQkFBa0IsRUFFeEIsSUFBTUMsRUFBZ0IsS0FBSyxLQUFLLFdBQVcsTUFBTSxFQUM3QyxLQUFLLEtBQ0xDLEdBQW9CLEtBQUssWUFBYyxJQUFNLEtBQUssSUFBSSxFQUUxRCxNQUFNRCxDQUFhLEVBQ2hCLEtBQUtFLEdBQVlBLEVBQVMsS0FBSyxDQUFDLEVBQ2hDLEtBQUtDLEdBQVEsQ0FDWixLQUFLLFNBQVdBLEVBQ2hCLEtBQUssU0FBUyxDQUNoQixDQUFDLEVBQ0EsTUFBTUMsR0FBTyxDQUNaLEtBQUssY0FBZ0JBLENBQ3ZCLENBQUMsQ0FDTCxDQU1BLFVBQVcsQ0FDVCxJQUFNQyxFQUFTLEtBQUssV0FBVyxjQUFjLGVBQWUsRUFDMURDLEVBQVlELEVBQU8sZUFBaUJBLEVBQ3BDRSxFQUFZRixFQUFPLGdCQUdyQixPQUFPLGlCQUFpQixVQUFXLEtBQUssaUJBQWlCLEVBQ3pERSxFQUFVLEtBQUssRUFDZkEsRUFBVSxNQUFNO0FBQUE7QUFBQTtBQUFBLHdCQUdJTixHQUFvQixHQUFHLEtBQUssVUFBVSxJQUFJLEtBQUssU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFBQSx5QkFDbEVBLEdBQW9CLEdBQUcsS0FBSyxVQUFVLElBQUksS0FBSyxTQUFTLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLE9BSXRGLEVBRUhNLEVBQVUsTUFBTSxDQUNsQixDQUVRLFlBQWEsQ0FDbkIsSUFBTUMsRUFBc0IsS0FBSyxXQUFXLGlCQUFpQixRQUFRLEVBQy9ESCxFQUFTLEtBQUssaUJBQWlCLFFBQVEsRUFFdkNJLEVBQWUsQ0FBQyxHQUFHRCxFQUFxQixHQUFHSCxDQUFNLEVBQ3ZELFFBQVdBLEtBQVVJLEVBQWMsQ0FDakMsSUFBTUMsRUFBWUwsRUFBTyxJQUV6QixHQURxQixJQUFJLElBQUlLLEVBQVcsT0FBTyxTQUFTLElBQUksRUFBRSxTQUFXLE9BQU8sU0FBUyxPQUV2RixHQUFJLENBQ0YsSUFBTUMsRUFBV04sRUFBTyxpQkFBbUJBLEVBQU8sY0FBYyxTQUM1RE0sR0FDRixLQUFLLGdCQUFnQkEsRUFBVUYsQ0FBWSxDQUUvQyxPQUFTRyxFQUFHLENBQ1YsUUFBUSxNQUFNLGlDQUFrQ0EsQ0FBQyxDQUNuRCxDQUVKLENBRUEsT0FBQUgsRUFBYSxRQUFRLENBQUNKLEVBQVFRLElBQVUsQ0FDbENKLEVBQWEsUUFBUUosQ0FBTSxJQUFNUSxHQUNuQ0osRUFBYSxPQUFPSSxFQUFPLENBQUMsQ0FFaEMsQ0FBQyxFQUNNSixDQUNULENBRVEsZ0JBQWdCSyxFQUEwQkMsRUFBVSxDQUFDLEVBQUcsQ0FJOUQsT0FGdUJELEVBQWUsaUJBQWlCLFFBQVEsRUFFaEQsUUFBUVQsR0FBVSxDQUUvQlUsRUFBUSxLQUFLVixDQUFNLEVBSW5CLElBQU1LLEVBQVlMLEVBQU8sSUFHekIsR0FGcUIsSUFBSSxJQUFJSyxFQUFXLE9BQU8sU0FBUyxJQUFJLEVBQUUsU0FBVyxPQUFPLFNBQVMsT0FHdkYsR0FBSSxDQUNGLElBQU1NLEVBQVlYLEVBQU8saUJBQW1CQSxFQUFPLGNBQWMsU0FDakUsS0FBSyxnQkFBZ0JXLEVBQVdELENBQU8sQ0FDekMsT0FBU0gsRUFBRyxDQUNWLFFBQVEsTUFBTSxpQ0FBa0NBLENBQUMsQ0FDbkQsTUFFQSxRQUFRLEtBQUssK0JBQWdDRixDQUFTLENBRTFELENBQUMsRUFFTUssQ0FDVCxDQUVRLHVCQUF1QkUsRUFBY2QsRUFBVyxDQUN0RCxPQUFPLFlBQVksQ0FBRSxLQUFBYyxFQUFNLEtBQUFkLENBQUssRUFBRyxHQUFHLEVBQ3RDLElBQU1ZLEVBQVUsS0FBSyxXQUFXLEVBQ2hDLFFBQVdWLEtBQVVVLEVBQ2ZWLEVBQU8sZUFDVEEsRUFBTyxjQUFjLFlBQVksQ0FBRSxLQUFBWSxFQUFNLEtBQUFkLENBQUssRUFBRyxHQUFHLENBRzFELENBRUEsa0JBQWtCZSxFQUFxQixDQUNyQyxHQUFNLENBQUUsS0FBQUQsRUFBTSxLQUFBZCxDQUFLLEVBQUllLEVBQU0sS0FDN0IsT0FBUUQsRUFBTSxDQUNaLElBQUssY0FDSCxLQUFLLFlBQWNkLEVBQ25CLEtBQUssYUFBYUEsQ0FBSSxFQUN0QixNQUNGLElBQUssY0FBZSxDQUNsQixLQUFLLHVCQUF1QixlQUFnQixLQUFLLFdBQVcsRUFDNUQsS0FDRixDQUNBLElBQUssV0FBWSxDQUNmLElBQU1nQixFQUFZLEtBQUssU0FBUyxNQUFNLElBQUlDLEdBQzVCQSxFQUFNLFdBQVcsTUFBTSxFQUFJQSxFQUFRbkIsR0FBb0IsS0FBSyxXQUFhLElBQU1tQixDQUFLLENBRWpHLEVBQ0QsS0FBSyx1QkFBdUIsWUFBYUQsQ0FBUyxFQUNsRCxLQUNGLENBQ0EsSUFBSyxpQkFDSCxRQUFRLElBQUksZ0NBQWdDLEVBQzVDLEtBQ0osQ0FDRixDQUVBLFVBQW9CLENBQ2xCLE9BQU8sS0FBSyxjQUFnQixFQUM5QixDQUVBLElBQUksU0FBU0UsRUFBa0MsQ0FDN0MsS0FBSyxZQUFjQSxDQUNyQixDQUVTLHNCQUE2QixDQUNwQyxPQUFPLG9CQUFvQixVQUFXLEtBQUssaUJBQWlCLEVBQzVELE1BQU0scUJBQXFCLENBQzdCLENBRVMsUUFBUyxDQUNoQixPQUFPQztBQUFBLGdCQUNLLEtBQUssYUFBYSxPQUFPLENBQUM7QUFBQSxpQkFDekIsS0FBSyxhQUFhLFFBQVEsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQU1wQyxLQUFLLGVBQ1BBO0FBQUE7QUFBQSxVQUVJLEtBQUssYUFBYTtBQUFBLGFBQ2YsRUFDWCxDQUNGLEVBeExFQyxFQUFBLENBRENDLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxxQkFBc0IsQ0FBQyxHQW5CakQxQixFQW9CWCxrQ0FHQXlCLEVBQUEsQ0FEQ0MsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLE1BQU8sQ0FBQyxHQXRCbEMxQixFQXVCWCxvQkFHQXlCLEVBQUEsQ0FEQ0MsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLGdCQUFpQixDQUFDLEdBekI1QzFCLEVBMEJYLDJCQUdBeUIsRUFBQSxDQURDQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsZUFBZ0IsQ0FBQyxHQTVCM0MxQixFQTZCWCwwQkFHQXlCLEVBQUEsQ0FEQ0MsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLElBQUssQ0FBQyxHQS9CaEMxQixFQWdDWCxrQkFHUXlCLEVBQUEsQ0FEUEUsR0FBTSxHQWxDSTNCLEVBbUNILDZCQW5DR0EsRUFBTnlCLEVBQUEsQ0FETkcsR0FBYyx3QkFBd0IsR0FDMUI1QixHQ05iLE9BQVMsUUFBQTZCLE9BQVksTUFDckIsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkFHakMsSUFBTUMsR0FBTixjQUF1Q0MsQ0FBWSxDQUFuRCxrQ0FFTCxLQUFPLGFBQXVCLE9BSzlCLFVBQW9CLENBRWxCLE1BQU8sRUFDVCxDQUNBLElBQUksU0FBU0MsRUFBZ0IsQ0FFN0IsQ0FFUyxRQUFTLENBQ2hCLE9BQU9DLHVCQUF5QixLQUFLLFFBQVEseUJBQXlCLEtBQUssVUFBVSxJQUFJLEtBQUssS0FBSyxXQUNyRyxDQUNPLFdBQVcsRUFBVSxDQUMxQixLQUFLLGNBQ0gsSUFBSSxZQUFZLGNBQWUsQ0FDN0IsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQUUsbUJBQW9CLEtBQUssbUJBQW9CLGFBQWMsS0FBSyxlQUFpQixNQUFPLENBQ3BHLENBQUMsQ0FDSCxDQUNGLENBQ0YsRUF6QlNDLEVBQUEsQ0FETkMsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLGVBQWdCLENBQUMsR0FEM0NMLEdBRUosNEJBR0FJLEVBQUEsQ0FETkMsR0FBUyxDQUFFLEtBQU0sTUFBTyxDQUFDLEdBSmZMLEdBS0oscUJBTElBLEdBQU5JLEVBQUEsQ0FETkUsR0FBYyw2QkFBNkIsR0FDL0JOLElDSmIsT0FBUyxPQUFBTyxHQUFLLFFBQUFDLEdBQU0sY0FBQUMsT0FBa0IsTUFDdEMsT0FBUyxpQkFBQUMsT0FBcUIsb0JBSXZCLElBQU1DLEdBQU4sY0FBcUNDLEVBQXlCQyxHQUFZLGVBQWdCLEdBQU8sU0FBUyxDQUFFLENBZ0N4RyxRQUFTLENBQ2hCLE9BQU9DO0FBQUEsaUNBRVQsQ0FFQSxJQUFJLGdCQUFnQkMsRUFBb0MsQ0FDdEQsSUFBSUMsRUFBMkMsQ0FBQyxFQUMxQ0MsRUFBVyxNQUFNLFFBQVFGLENBQUssRUFBSUEsRUFBUSxDQUFDQSxDQUFLLEVBRWxERSxJQUNGRCxFQUFVQyxFQUFTLElBQUlDLEdBQUssQ0FDMUIsSUFBTUMsRUFBUUQsRUFBRSxNQUFNLEdBQUcsRUFDekIsTUFBTyxDQUFFLEtBQU1DLEVBQU0sQ0FBQyxFQUFHLElBQUtBLEVBQU0sQ0FBQyxDQUFFLENBQ3pDLENBQUMsR0FHVSxLQUFLLGlCQUFpQixTQUFTLEVBQ3ZDLFFBQVEsQ0FBQ0MsRUFBS0MsSUFBVSxDQXREakMsSUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUF1RE0sSUFBTUMsRUFBYU4sRUFBSSxhQUFhLFlBQVksRUFDMUNPLEdBQWlCTCxFQUFBTixFQUFRLEtBQUtFLEdBQUtBLEVBQUUsTUFBUVEsQ0FBVSxJQUF0QyxZQUFBSixFQUF5QyxLQUMxRE0sR0FBT0wsRUFBQSxLQUFLLGNBQWMsNEJBQTRCSSxDQUFjLElBQUksSUFBakUsWUFBQUosRUFBb0UsWUFBWSxPQUM3RixHQUFJSSxHQUFrQkMsR0FDcEIsR0FBSSxHQUFDSixFQUFBSixFQUFJLHFCQUFKLE1BQUFJLEVBQXdCLFVBQVUsU0FBUyxtQkFBbUIsQ0FDakUsSUFBTUssRUFBVyxTQUFTLGNBQWMsTUFBTSxFQUM5Q0EsRUFBUyxVQUFVLElBQUksZ0JBQWdCLEVBQ3ZDQSxFQUFTLFlBQWNELEVBQ3ZCUixFQUFJLHNCQUFzQixXQUFZUyxDQUFRLENBQ2hELE9BQ1NKLEVBQUFMLEVBQUkscUJBQUosTUFBQUssRUFBd0IsVUFBVSxTQUFTLG1CQUNwREwsRUFBSSxtQkFBbUIsT0FBTyxDQUVsQyxDQUFDLENBQ0gsQ0FDRixFQWpFYVQsR0FDSyxPQUFTLENBQ3ZCbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0E0QkYsRUE5QlduQixHQUFOb0IsRUFBQSxDQUROQyxHQUFjLDJCQUEyQixHQUM3QnJCLElDSmIsT0FBUyxPQUFBc0IsR0FBSyxRQUFBQyxHQUFNLE9BQUFDLE9BQVcsTUFDL0IsT0FBUyxpQkFBQUMsR0FBZSxTQUFBQyxHQUFPLHlCQUFBQyxHQUF1QixTQUFBQyxPQUFhLG9CQUNuRSxPQUFTLGFBQUFDLE9BQWlCLCtCQUMxQixPQUFTLFVBQUFDLE9BQWMsMkJDRmhCLFNBQVNDLEdBQ2RDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0EsQ0FDQSxPQUFRSCxFQUFPLENBQ2IsSUFBSyxTQUNILENBQ0UsR0FBTSxDQUFDSSxFQUFTQyxFQUFTQyxDQUFNLEVBQUlMLEVBQzdCTSxFQUFjSCxFQUFVRixFQUFJLE1BQVMsSUFDckNNLEVBQWNILEVBQVVILEVBQUksT0FBVSxJQUN0Q08sRUFBYUgsRUFBU0osRUFBSSxNQUFTLElBQ3pDQyxFQUFRLE1BQU0sS0FBT0ksRUFBYUUsRUFBWSxJQUM5Q04sRUFBUSxNQUFNLElBQU1LLEVBQWFDLEVBQVksSUFDN0NOLEVBQVEsTUFBTSxNQUFRQSxFQUFRLE1BQU0sT0FBUyxFQUFJTSxFQUFZLEtBQzdETixFQUFRLE1BQU0sYUFBZSxRQUMvQixDQUNBLE1BRUYsSUFBSyxPQUNILENBQ0UsR0FBTSxDQUFDTyxFQUFPQyxFQUFNQyxFQUFRQyxDQUFPLEVBQUlaLEVBQ2pDYSxFQUFZSixFQUFRUixFQUFJLE1BQVMsSUFDakNhLEVBQVdKLEVBQU9ULEVBQUksT0FBVSxJQUNoQ2MsRUFBYUosRUFBU1YsRUFBSSxNQUFTLElBQ25DZSxFQUFjSixFQUFVWCxFQUFJLE9BQVUsSUFDNUNDLEVBQVEsTUFBTSxLQUFPVyxFQUFXLElBQ2hDWCxFQUFRLE1BQU0sSUFBTVksRUFBVSxJQUM5QlosRUFBUSxNQUFNLE1BQVFhLEVBQVlGLEVBQVcsSUFDN0NYLEVBQVEsTUFBTSxPQUFTYyxFQUFhRixFQUFVLEdBQ2hELENBQ0EsTUFFRixJQUFLLE9BQ0gsQ0FFRSxJQUFNRyxFQUFhakIsRUFBYSxPQUFPLENBQUNrQixFQUFLQyxFQUFjQyxHQUFjQyxLQUFVLENBQ2pGLEdBQUlELEdBQWUsSUFBTSxFQUFHLENBQzFCLElBQU1FLEdBQVVKLEVBQUksSUFBSSxFQUN4QkEsRUFBSUEsRUFBSSxNQUFNLEVBQUksQ0FBRSxFQUFHSSxHQUFTLEVBQUdELEdBQU1ELEVBQVksQ0FBRSxDQUN6RCxNQUNFRixFQUFJLEtBQUtDLENBQVksRUFFdkIsT0FBT0QsQ0FDVCxFQUFHLENBQUMsQ0FBQyxFQUdDVCxFQUFRLEtBQUssSUFBSSxHQUFHUSxFQUFXLElBQUlNLEdBQVNBLEVBQU0sQ0FBQyxDQUFDLEVBQ3BEWixFQUFTLEtBQUssSUFBSSxHQUFHTSxFQUFXLElBQUlNLEdBQVNBLEVBQU0sQ0FBQyxDQUFDLEVBQ3JEYixFQUFPLEtBQUssSUFBSSxHQUFHTyxFQUFXLElBQUlNLEdBQVNBLEVBQU0sQ0FBQyxDQUFDLEVBQ25EWCxFQUFVLEtBQUssSUFBSSxHQUFHSyxFQUFXLElBQUlNLEdBQVNBLEVBQU0sQ0FBQyxDQUFDLEVBR3REVixFQUFZSixFQUFRUixFQUFJLE1BQVMsSUFDakNhLEVBQVdKLEVBQU9ULEVBQUksT0FBVSxJQUNoQ2MsRUFBYUosRUFBU1YsRUFBSSxNQUFTLElBQ25DZSxFQUFjSixFQUFVWCxFQUFJLE9BQVUsSUFHNUNDLEVBQVEsTUFBTSxLQUFRTyxFQUFRUixFQUFJLE1BQVMsSUFBTSxJQUNqREMsRUFBUSxNQUFNLElBQU9RLEVBQU9ULEVBQUksT0FBVSxJQUFNLElBQ2hEQyxFQUFRLE1BQU0sTUFBUWEsRUFBWUYsRUFBVyxJQUM3Q1gsRUFBUSxNQUFNLE9BQVNjLEVBQWFGLEVBQVUsSUFhOUMsSUFBTVUsRUFOY1AsRUFBVyxJQUFJTSxJQUFVLENBQzNDLEdBQUtBLEVBQU0sRUFBSWQsSUFBVUUsRUFBU0YsR0FBVSxJQUM1QyxHQUFLYyxFQUFNLEVBQUliLElBQVNFLEVBQVVGLEdBQVMsR0FDN0MsRUFBRSxFQUd3QixJQUFJZSxHQUFLLEtBQUssTUFBTUEsRUFBRSxDQUFDLEVBQUksS0FBTyxLQUFLLE1BQU1BLEVBQUUsQ0FBQyxFQUFJLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFHM0Z2QixFQUFRLE1BQU0sU0FBVyxXQUFXc0IsQ0FBSyxHQUMzQyxDQUNBLE1BRUYsUUFDRSxLQUNKLENBQ0YsQ0Q5RU8sSUFBTUUsRUFBTixjQUE2Q0MsQ0FBWSxDQXdDOUQsYUFBYyxDQUNaLE1BQU0sRUF0Q1IsZ0JBQWEsS0FDYixjQUFXLEtBQ0YsWUFBUyxDQUFDLEVBcUNqQixLQUFLLGlCQUFpQix1QkFBd0IsS0FBSyx5QkFBeUIsQ0FDOUUsQ0FFQSxPQUFjLENBQ1osS0FBSyxPQUFTLENBQUMsQ0FDakIsQ0FDQSxVQUFvQixDQUNsQixPQUFPLEtBQUssT0FBTyxPQUFTLENBQzlCLENBQ0EsSUFBSSxTQUFTQyxFQUF3QixDQUMvQixNQUFNLFFBQVFBLENBQUcsSUFDbkIsS0FBSyxPQUFTQSxFQUVsQixDQUVTLFFBQVMsQ0FuRXBCLElBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBb0VJLE9BQU9DO0FBQUE7QUFBQTtBQUFBLGtCQUdPQyxJQUFVTCxFQUFBLEtBQUssUUFBUSxDQUFDLElBQWQsWUFBQUEsRUFBaUIsS0FBSyxDQUFDO0FBQUEsbUJBQ2hDSyxJQUFVSixFQUFBLEtBQUssUUFBUSxDQUFDLElBQWQsWUFBQUEsRUFBaUIsTUFBTSxDQUFDO0FBQUEsMEJBQzVCQyxFQUFBLEtBQUssUUFBUSxDQUFDLElBQWQsWUFBQUEsRUFBaUIsS0FBSyxLQUFJQyxFQUFBLEtBQUssUUFBUSxDQUFDLElBQWQsWUFBQUEsRUFBaUIsTUFBTTtBQUFBO0FBQUEsWUFFOURHLEdBQ0EsS0FBSyxPQUNMQyxHQUFRQSxFQUNSLENBQUNBLEVBQU1DLElBQVVDO0FBQUE7QUFBQTtBQUFBLHFCQUdSLFNBQVMsS0FBSyxjQUE4QixlQUFpQkYsRUFBSyxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEscUJBQ2xHLFNBQVMsS0FBSyxjQUE4QixlQUFpQkEsRUFBSyxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDO0FBQUEscUJBQ2pHLFNBQVMsS0FBSyxjQUE4QixlQUFpQkEsRUFBSyxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEscUJBQ2xHLFNBQVMsS0FBSyxjQUE4QixlQUFpQkEsRUFBSyxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLHlCQUc1RkcsR0FBYSxDQUNyQkEsRUFBRSxnQkFBZ0IsRUFDbEIsS0FBSyxPQUFTLEtBQUssT0FBTyxPQUFPLENBQUNDLEVBQUdDLElBQU1BLElBQU1KLENBQUssRUFDdEQsS0FBSyxhQUFhLEtBQUssTUFBTSxDQUMvQixDQUFDO0FBQUE7QUFBQSxhQUdQLENBQUM7QUFBQSxZQUNDLEtBQUssWUFDUEM7QUFBQTtBQUFBLGlCQUVPLEtBQUssV0FBVyxDQUFDO0FBQUEsaUJBQ2pCLEtBQUssV0FBVyxDQUFDO0FBQUEsaUJBQ2pCLEtBQUssV0FBVyxDQUFDO0FBQUEsaUJBQ2pCLEtBQUssV0FBVyxDQUFDO0FBQUE7QUFBQTtBQUFBLGFBR3JCO0FBQUE7QUFBQTtBQUFBLHdCQUlYLENBRVEsMEJBQTBCLEVBQXdDLENBQ3hFLElBQU1JLEVBQU0sS0FBSyxjQUFjLEtBQUssRUFDOUJDLEVBQVUsRUFBRSxPQUNaQyxFQUFTRCxFQUFRLGFBQWEsUUFBUSxFQUN0Q0UsRUFBUUYsRUFBUSxhQUFhLE9BQU8sRUFDcENHLEVBQWVGLEVBQU8sTUFBTSxHQUFHLEVBQUUsSUFBSUcsR0FBSyxTQUFTQSxDQUFDLENBQUMsRUFDM0RDLEdBQWlCSCxFQUFPQyxFQUFjSixFQUFLQyxDQUFPLENBQ3BELENBRVMsYUFBYSxFQUFTLENBQzdCLE1BQU0sYUFBYSxDQUFDLEVBRXBCLEtBQUssU0FBVyxLQUFLLGlCQUFpQix3QkFBd0IsRUFFOUQsU0FBUyxpQkFBaUIsWUFBYU0sR0FBUyxDQUM5QyxLQUFLLFdBQWEsQ0FDaEIsRUFBR0EsRUFBTSxRQUFVLEtBQUssUUFBUSxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsS0FDM0QsRUFBR0EsRUFBTSxRQUFVLEtBQUssUUFBUSxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsR0FDN0QsQ0FDRixDQUFDLEVBRUQsS0FBSyxTQUFTLFFBQVFOLEdBQVcsQ0FDL0JBLEVBQVEsTUFBTSxLQUFPQSxFQUFRLGFBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBSSxLQUNwRUEsRUFBUSxNQUFNLElBQU1BLEVBQVEsYUFBYSxRQUFRLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFJLEtBRW5FQSxFQUFRLGlCQUFpQixRQUFTTSxHQUFTLENBQ3BDLEtBQUssV0FPRSxLQUFLLFdBQ2YsS0FBSyxTQUFXQSxFQUFNLE9BRXRCLEtBQUssT0FBUyxDQUNaLEdBQUcsS0FBSyxPQUNSLEtBQUssV0FBVyxhQUFhLFlBQVksRUFBSSxJQUFNLEtBQUssU0FBUyxhQUFhLFlBQVksQ0FDNUYsRUFDQSxLQUFLLGFBQWEsS0FBSyxNQUFNLEVBQzdCLEtBQUssV0FBYSxLQUNsQixLQUFLLFNBQVcsT0FmaEIsS0FBSyxXQUFhQSxFQUFNLE9BRXhCLEtBQUssV0FBYSxDQUNoQixFQUFHLEtBQUssV0FBVyxhQUFhLFFBQVEsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQ3RELEVBQUcsS0FBSyxXQUFXLGFBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FDeEQsRUFZSixDQUFDLENBQ0gsQ0FBQyxDQUNILENBQ1Msc0JBQXVCLENBQzlCLE1BQU0scUJBQXFCLEVBQzNCLEtBQUssb0JBQW9CLHVCQUF3QixLQUFLLHlCQUF5QixDQUNqRixDQUNGLEVBdkphdkIsRUFZSyxPQUFTLENBQ3ZCd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBd0JGLEVBaENTQyxFQUFBLENBQVJDLEdBQU0sR0FMSTFCLEVBS0Ysc0JBQ0F5QixFQUFBLENBQVJDLEdBQU0sR0FOSTFCLEVBTUYsMEJBQ0F5QixFQUFBLENBQVJDLEdBQU0sR0FQSTFCLEVBT0YsMEJBQ0t5QixFQUFBLENBQWJFLEdBQU0sS0FBSyxHQVJEM0IsRUFRRyw0QkFDOEJ5QixFQUFBLENBQTNDRyxHQUFzQixDQUFFLFNBQVUsS0FBTSxDQUFDLEdBVC9CNUIsRUFTaUMsdUJBVGpDQSxFQUFOeUIsRUFBQSxDQUROSSxHQUFjLG1DQUFtQyxHQUNyQzdCLEdFVmIsT0FBUyxPQUFBOEIsR0FBSyxRQUFBQyxHQUFNLGNBQUFDLE9BQWtCLE1BQ3RDLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUt2QixJQUFNQyxHQUFOLGNBQTRDQyxFQUNqREMsR0FDQSxjQUNBLEdBQ0Esd0JBQ0YsQ0FBRSxDQVlTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQSx1Q0FFVCxDQUVRLDBCQUEwQkMsRUFBNEIsQ0FDNUQsSUFBTUMsRUFBTSxLQUFLLGNBQWMsS0FBSyxFQUM5QkMsRUFBVUYsRUFBRSxPQUNaRyxFQUFTRCxFQUFRLGFBQWEsUUFBUSxFQUN0Q0UsRUFBUUYsRUFBUSxhQUFhLE9BQU8sRUFDcENHLEVBQWVGLEVBQU8sTUFBTSxHQUFHLEVBQUUsSUFBSUcsR0FBSyxTQUFTQSxDQUFDLENBQUMsRUFHM0QsT0FBUUYsRUFBTyxDQUNiLElBQUssU0FDSCxDQUNFLEdBQU0sQ0FBQ0csRUFBU0MsRUFBU0MsQ0FBTSxFQUFJSixFQUNuQ0gsRUFBUSxNQUFNLEtBQU9LLEVBQVVFLEVBQVMsS0FDeENQLEVBQVEsTUFBTSxJQUFNTSxFQUFVQyxFQUFTLEtBQ3ZDUCxFQUFRLE1BQU0sTUFBUUEsRUFBUSxNQUFNLE9BQVMsRUFBSU8sRUFBUyxJQUM1RCxDQUNBLE1BRUYsSUFBSyxPQUNILENBQ0UsR0FBTSxDQUFDQyxFQUFPQyxFQUFNQyxFQUFRQyxDQUFPLEVBQUlSLEVBQ3ZDSCxFQUFRLE1BQU0sS0FBT1EsRUFBUSxLQUM3QlIsRUFBUSxNQUFNLElBQU1TLEVBQU8sS0FDM0JULEVBQVEsTUFBTSxNQUFRVSxFQUFTRixFQUFRLEtBQ3ZDUixFQUFRLE1BQU0sT0FBU1csRUFBVUYsRUFBTyxJQUMxQyxDQUNBLE1BRUYsUUFDRSxLQUNKLENBQ0YsQ0FFUyxtQkFBMEIsQ0FDakMsTUFBTSxrQkFBa0IsRUFDeEIsS0FBSyxpQkFBaUIsdUJBQXdCLEtBQUsseUJBQXlCLENBQzlFLENBQ1Msc0JBQXVCLENBQzlCLE1BQU0scUJBQXFCLEVBQzNCLEtBQUssb0JBQW9CLHVCQUF3QixLQUFLLHlCQUF5QixDQUNqRixDQUNGLEVBL0RhZixHQU1LLE9BQVNrQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU5kbEIsR0FBTm1CLEVBQUEsQ0FETkMsR0FBYyxtQ0FBbUMsR0FDckNwQixJQ05iLE9BQVMsT0FBQXFCLEdBQUssUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQUl0QyxPQUFTLGlCQUFBQyxPQUFxQixvQkFJdkIsSUFBTUMsR0FBTixjQUF5Q0MsRUFBYUMsR0FBWSxvQkFBb0IsQ0FBRSxDQW9CcEYsUUFBUyxDQUNoQixPQUFPQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNVCxDQUVRLGdCQUFnQkMsRUFBZ0UsQ0FDdEYsR0FBTSxDQUFFLFdBQUFDLENBQVcsRUFBSUQsRUFBRSxPQUVuQkUsRUFBVSxLQUFLLGdCQUFnQixLQUFLQyxHQUFNQSxFQUFHLGFBQWEsWUFBWSxJQUFNRixDQUFVLEVBRXRGRyxFQUFlLEtBQUssZ0JBQWdCLE9BQzFDLEdBQUksQ0FBQyxLQUFLLGVBQWdCLENBRXhCLEdBREEsS0FBSyxlQUFpQixHQUNsQkYsRUFBUSxPQUFTLEtBQU0sQ0FDekIsR0FBSyxLQUFLLGdCQUF1QyxPQUFPRyxHQUFLQSxFQUFFLE1BQVEsQ0FBQyxFQUFFLFFBQVVELEVBQWMsQ0FDaEcsS0FBSyxlQUFpQixHQUN0QixNQUNGLENBQ0FGLEVBQVEsTUFBUyxLQUFLLGdCQUF1QyxPQUFPRyxHQUFLLENBQUMsQ0FBQ0EsRUFBRSxLQUFLLEVBQUUsT0FBUyxFQUM3RixLQUFLLGVBQWlCLEdBQ3RCLE1BQ0YsTUFDRyxLQUFLLGdCQUF1QyxRQUFRSCxJQUMvQ0EsRUFBUSxNQUFRQSxFQUFRLE9BQzFCQSxFQUFRLFFBRUhBLEVBQ1IsRUFDREEsRUFBUSxNQUFRLEtBRWxCLEtBQUssZUFBaUIsRUFDeEIsQ0FDRixDQUVRLDBCQUEwQkYsRUFBd0MsQ0FDeEUsSUFBTU0sRUFBTSxLQUFLLGNBQWMsS0FBSyxFQUM5QkosRUFBVUYsRUFBRSxPQUNaTyxFQUFTTCxFQUFRLGFBQWEsUUFBUSxFQUN0Q00sRUFBUU4sRUFBUSxhQUFhLE9BQU8sRUFDcENPLEVBQWVGLEVBQU8sTUFBTSxHQUFHLEVBQUUsSUFBSUcsR0FBSyxTQUFTQSxDQUFDLENBQUMsRUFFM0RDLEdBQWlCSCxFQUFPQyxFQUFjSCxFQUFLSixDQUFPLENBQ3BELENBRVMsbUJBQTBCLENBQ2pDLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssaUJBQWlCLDhCQUErQixLQUFLLGVBQWUsRUFDekUsS0FBSyxpQkFBaUIsc0JBQXVCLEtBQUsseUJBQXlCLENBQzdFLENBQ1Msc0JBQXVCLENBQzlCLE1BQU0scUJBQXFCLEVBQzNCLEtBQUssb0JBQW9CLDhCQUErQixLQUFLLGVBQWUsRUFDNUUsS0FBSyxvQkFBb0Isc0JBQXVCLEtBQUsseUJBQXlCLENBQ2hGLENBQ0YsRUE5RWFOLEdBS0ssT0FBUyxDQUN2QmdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVlGLEVBbEJXaEIsR0FBTmlCLEVBQUEsQ0FETkMsR0FBYywrQkFBK0IsR0FDakNsQixJQ1JiLE9BQVMsT0FBQW1CLEdBQUssUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQUN0QyxPQUFTLGlCQUFBQyxPQUFxQixvQkFNdkIsSUFBTUMsR0FBTixjQUFvQ0MsRUFBYUMsR0FBWSxvQkFBb0IsQ0FBRSxDQWtCL0UsUUFBUyxDQUNoQixPQUFPQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNVCxDQUVRLDBCQUEwQkMsRUFBd0MsQ0FDeEUsSUFBTUMsRUFBTSxLQUFLLGNBQWMsS0FBSyxFQUM5QkMsRUFBVUYsRUFBRSxPQUNaRyxFQUFTRCxFQUFRLGFBQWEsUUFBUSxFQUN0Q0UsRUFBUUYsRUFBUSxhQUFhLE9BQU8sRUFDcENHLEVBQWVGLEVBQU8sTUFBTSxHQUFHLEVBQUUsSUFBSUcsR0FBSyxTQUFTQSxDQUFDLENBQUMsRUFFM0RDLEdBQWlCSCxFQUFPQyxFQUFjSixFQUFLQyxDQUFPLENBQ3BELENBRVMsbUJBQTBCLENBQ2pDLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssaUJBQWlCLHNCQUF1QixLQUFLLHlCQUF5QixDQUM3RSxDQUNTLHNCQUF1QixDQUM5QixNQUFNLHFCQUFxQixFQUMzQixLQUFLLG9CQUFvQixzQkFBdUIsS0FBSyx5QkFBeUIsQ0FDaEYsQ0FDRixFQTdDYU4sR0FHSyxPQUFTLENBQ3ZCWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQWFGLEVBakJXWixHQUFOYSxFQUFBLENBRE5DLEdBQWMseUJBQXlCLEdBQzNCZCxJQ1BiLE9BQVMsT0FBQWUsR0FBSyxRQUFBQyxHQUFNLGNBQUFDLE9BQWtCLE1BR3RDLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsR0FBVSxTQUFBQyxPQUFhLG9CQUMvQyxPQUFTLGNBQUFDLE9BQWtCLGdDQ0ozQixPQUFTLE9BQUFDLEdBQUssUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQUN0QyxPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLE9BQWdCLG9CQUtqQyxJQUFNQyxFQUFOLGNBQXdDQyxFQUFXLENBQW5ELGtDQW9CTCxLQUFPLFNBQW1CLEVBTzFCLEtBQU8sU0FBbUIsRUFNMUIsS0FBTyxNQUFRLEdBSU4sbUJBQTBCLENBQ2pDLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssYUFBYSxPQUFRLDhCQUE4QixFQUN4RCxLQUFLLGFBQWEsT0FBUSw4QkFBOEIsQ0FDMUQsQ0FPUyxRQUFTLENBQ2hCLE9BQU9DO0FBQUE7QUFBQTtBQUFBLEtBSVQsQ0FDRixFQXREYUYsRUFDSixPQUFTRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQW1CVEMsRUFBQSxDQUpOQyxHQUFTLENBQ1IsS0FBTSxPQUNOLFVBQVcsV0FDYixDQUFDLEdBbkJVTCxFQW9CSix3QkFPQUksRUFBQSxDQUpOQyxHQUFTLENBQ1IsS0FBTSxPQUNOLFVBQVcsV0FDYixDQUFDLEdBMUJVTCxFQTJCSix3QkFNQUksRUFBQSxDQUpOQyxHQUFTLENBQ1IsS0FBTSxRQUNOLFVBQVcsT0FDYixDQUFDLEdBaENVTCxFQWlDSixxQkFqQ0lBLEVBQU5JLEVBQUEsQ0FGTkUsR0FBYyw4QkFBOEIsR0FFaENOLEdEZU4sSUFBTU8sRUFBTixjQUFrQ0MsRUFDdkNDLEdBQ0Esa0VBQ0EsR0FDQSxnRUFDRixDQUFFLENBTEssa0NBK0JMLHNCQUE0QyxLQUVuQyxjQUFXLENBQUMsRUFDWixvQkFBMkIsQ0FBQyxFQUN5Qix3QkFBNkIsR0FnQjNGLHNCQUFtQixHQUFLLENBQ3RCLElBQU1DLEVBQVEsRUFBRSxPQUNaLEtBQUssbUJBQXFCQSxHQUM1QkEsRUFBTSxRQUFVLEdBQ2hCLEtBQUssaUJBQW1CLEtBQ3hCLEtBQUssa0JBQWtCLENBQUMsR0FFeEIsS0FBSyxpQkFBbUJBLENBRTVCLEVBRUEsdUJBQW9CLEdBQUssQ0FDdkIsSUFBTUMsRUFBVyxFQUFFLE9BQ2JDLEVBQVFELEVBQVMsTUFDakJFLEVBQU9GLEVBQVMsS0FDaEJHLEVBQU9ILEVBQVMsS0FFbEJBLEVBQVMsU0FDTixLQUFLLFNBRUMsS0FBSyxTQUFTLFFBQVFDLENBQUssSUFBTSxLQUN0Q0UsSUFBUyxVQUNYLEtBQUssU0FBVyxLQUFLLFNBQVMsT0FBT0MsR0FBS0EsRUFBRSxRQUFRRixDQUFJLElBQU0sRUFBRSxHQUVsRSxLQUFLLFNBQVcsQ0FBQyxHQUFHLEtBQUssU0FBVUQsQ0FBSyxHQUx4QyxLQUFLLFNBQVcsQ0FBQ0EsQ0FBSyxFQU94QixLQUFLLGlCQUFtQkQsSUFFeEIsS0FBSyxTQUFXLEtBQUssU0FBUyxPQUFPSSxHQUFLQSxJQUFNSCxDQUFLLEVBQ3JELEtBQUssaUJBQW1CLE1BRzFCLEtBQUssY0FBYyxFQUNuQixLQUFLLGNBQ0gsSUFBSSxZQUFpQywyQkFBNEIsQ0FDL0QsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQ04sbUJBQW9CLEtBQUssbUJBQ3pCLFNBQVUsTUFBTSxRQUFRLEtBQUssUUFBUSxFQUFJLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBSSxLQUFLLFFBQ3JFLENBQ0YsQ0FBQyxDQUNILENBQ0YsRUF6REEsbUJBQTBCLENBQ3hCLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssS0FBTyxNQUFNLEtBRWhCLEtBQUssaUJBQWlCLGlFQUFpRSxDQUN6RixFQUNBLEtBQUssS0FBTyxNQUFNLEtBRWhCLEtBQUssaUJBQWlCLGdFQUFnRSxDQUN4RixFQUVBLEtBQUssU0FBVyxDQUFDLENBQ25CLENBK0NBLElBQUksZ0JBQWdCSSxFQUFrQyxDQUNwRCxHQUFJQSxJQUFrQixHQUFJLENBQ3hCLEtBQUssZUFBaUIsQ0FBQyxFQUN2QixNQUNGLE1BQVcsTUFBTSxRQUFRQSxDQUFhLElBQ3BDLEtBQUssZUFBaUJBLEVBRTFCLENBRVMsUUFBUyxDQUNoQixPQUFLLEtBQUssVUFBVSxTQUFTLG1CQUFtQixFQUd6Q0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBS0MsS0FBSyxLQUFLLElBQUksQ0FBQ0MsRUFBS0MsSUFBTUYseUJBQTJCRyxHQUFXRixFQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsVUFHeEYsS0FBSyxLQUFLLElBQ1YsQ0FBQ0csRUFBS0MsSUFDSkw7QUFBQSxvQ0FDd0JHLEdBQVdDLEVBQUksU0FBUyxDQUFDO0FBQUEsZ0JBQzdDLEtBQUssS0FBSyxJQUFJLENBQUNILEVBQUtLLElBQVcsQ0FDL0IsSUFBTUMsRUFBUUgsRUFBSSxhQUFhLFlBQVksRUFDckNJLEVBQVFQLEVBQUksYUFBYSxZQUFZLEVBQ3JDTixFQUFRLEdBQUdZLENBQUssSUFBSUMsQ0FBSyxHQUN6QkMsRUFBcUIsS0FBSyxTQUFTLE9BQU9YLEdBQUtBLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFNUyxDQUFLLEVBQUUsUUFBVSxFQUNwRkcsRUFBVSxLQUFLLFNBQVMsU0FBU2YsQ0FBSyxFQUN0Q2dCLEVBQU8sTUFBTUQsRUFBVSxhQUFlLEVBQUUsSUFBSSxLQUFLLGVBQWUsU0FBU2YsQ0FBSyxFQUFJLGFBQWUsRUFBRSxHQUVuR2lCLEVBQ0osS0FBSyxlQUFlLE9BQVMsRUFDekIsR0FDQVIsRUFBSSxXQUFhLEVBQ2YsR0FDQUssR0FBc0JMLEVBQUksVUFBWSxDQUFDTSxFQUMvQyxPQUFPVjtBQUFBO0FBQUEsMkJBRUlJLEVBQUksV0FBYSxFQUFJLFFBQVUsVUFBVTtBQUFBLDJCQUN6Q08sQ0FBSTtBQUFBLDJCQUNKSixDQUFLO0FBQUEsNEJBQ0paLENBQUs7QUFBQSxnQ0FDRGlCLENBQU87QUFBQSw4QkFDVEMsR0FBSyxLQUFLLGtCQUFrQkEsQ0FBQyxDQUFDO0FBQUEsNkJBQy9CQSxHQUFNVCxFQUFJLFdBQWEsRUFBSSxLQUFLLGlCQUFpQlMsQ0FBQyxFQUFJLElBQUs7QUFBQTtBQUFBLHNCQUcxRSxDQUFDLENBQUM7QUFBQSxrQkFFUixDQUFDO0FBQUE7QUFBQSxNQXpDSWIsNkNBNENYLENBQ0YsRUF4SmFWLEVBTUssT0FBUyxDQUN2QndCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FvQkYsRUFNU0MsRUFBQSxDQUFSQyxHQUFNLEdBakNJMUIsRUFpQ0Ysd0JBQ0F5QixFQUFBLENBQVJDLEdBQU0sR0FsQ0kxQixFQWtDRiw4QkFDcUR5QixFQUFBLENBQTdERSxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcscUJBQXNCLENBQUMsR0FuQ2pEM0IsRUFtQ21ELGtDQW5DbkRBLEVBQU55QixFQUFBLENBRE5HLEdBQWMsdUJBQXVCLEdBQ3pCNUIsR0VyQmIsT0FBUyxPQUFBNkIsR0FBSyxRQUFBQyxPQUFZLE1BQzFCLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUl2QixJQUFNQyxHQUFOLGNBQWtDQyxDQUFZLENBaUNuRCxhQUFjLENBQ1osTUFBTSxFQWpDUixXQUFRLENBa0NSLENBakNBLE9BQVEsQ0FFUixDQUNBLFVBQW9CLENBRWxCLE1BQU8sRUFDVCxDQUNBLElBQUksU0FBU0MsRUFBZ0IsQ0FFN0IsQ0FFQSxXQUFvQixZQUFhLENBQy9CLE9BQU9DLEVBQUFDLEVBQUEsR0FDRkgsRUFBWSxZQURWLENBR0gsS0FBTSxDQUNKLEtBQU0sT0FDTixVQUFXLE9BQ1gsUUFBUyxFQUNYLENBRUosRUFDRixDQUlTLFFBQVMsQ0FDaEIsT0FBT0k7QUFBQSxvQkFFVCxDQU1TLG1CQUFvQixDQUMzQixNQUFNLGtCQUFrQixFQUV4QixJQUFNQyxFQUFjLEtBQUssY0FBYyxPQUFPLEdBQUssS0FBSyxjQUFjLE9BQU8sR0FBSyxLQUFLLGNBQWMsUUFBUSxFQUN6R0EsR0FFRkEsRUFBWSxpQkFBaUIsUUFBUyxJQUFNLENBRTFDLEtBQUssUUFDTCxLQUFLLGFBQWEsS0FBSyxNQUFNLFNBQVMsQ0FBQyxDQUN6QyxDQUFDLENBRUwsQ0FDRixFQWxEYU4sR0EwQkssT0FBUyxDQUFDTyxJQUFLLEVBMUJwQlAsR0FBTlEsRUFBQSxDQUROQyxHQUFjLHVCQUF1QixHQUN6QlQsSUNMYixPQUFTLE9BQUFVLEdBQUssUUFBQUMsR0FBTSxjQUFBQyxPQUFrQixNQUN0QyxPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkFDL0MsT0FBUyxjQUFBQyxPQUFrQixnQ0FNcEIsSUFBTUMsRUFBTixjQUFrQ0MsR0FDdkNDLEVBQXlCQyxHQUFZLG9CQUFxQixHQUFNLFdBQVcsRUFDM0UsbUJBQ0YsQ0FBRSxDQUhLLGtDQU1JLGVBQW9CLEVBQ3BCLHNCQUE2QixDQUFDLEVBQzlCLDBCQUFnQyxHQTBEaEMsUUFBUyxDQUNoQixJQUFNQyxFQUFVLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixtQkFBbUIsQ0FBQyxFQUNyRSxPQUFJLEtBQUssVUFBWUEsRUFBUSxTQUMzQixLQUFLLFVBQVlBLEVBQVEsUUFHcEJDO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFJQyxNQUFNLEtBQUssTUFBTSxLQUFLLFNBQVMsQ0FBQyxFQUFFLElBQ2xDLENBQUNDLEVBQUdDLElBQ0ZGLHFEQUF1REUsQ0FBQyxpQkFBaUIsS0FBSyxzQkFDNUUsS0FBSyxpQkFBaUIsT0FBU0EsRUFDM0JDLEdBQVcsaUNBQWlDLEtBQUssaUJBQWlCRCxDQUFDLENBQUMsU0FBUyxFQUM3RSxFQUFFLEVBQ1osQ0FBQztBQUFBO0FBQUEsYUFHVCxDQUVBLElBQUksZ0JBQWdCRSxFQUFvQyxDQUN0RCxHQUFJQSxJQUFVLEdBQUksQ0FDaEIsS0FBSyxxQkFBdUIsR0FDNUIsTUFDRixDQUVJLEtBQUssaUJBQWlCLFNBQVcsSUFDakIsTUFBTSxRQUFRQSxDQUFLLEVBQUlBLEVBQVEsQ0FBQ0EsQ0FBSyxHQUU3QyxRQUFRLENBQUNDLEVBQVVDLElBQVUsQ0FDckMsSUFBSUMsRUFBZSxLQUFLLGNBQWMsaUNBQWlDRixDQUFRLElBQUksRUFDOUVFLElBQ0hBLEVBQWUsS0FBSyxXQUFXLGNBQWMsaUNBQWlDRixDQUFRLElBQUksR0FHNUYsSUFBTUcsRUFBT0QsR0FBQSxZQUFBQSxFQUFjLFlBQVksT0FDdkMsS0FBSyxpQkFBbUIsQ0FBQyxHQUFHLEtBQUssaUJBQWtCQyxDQUFJLENBQ3pELENBQUMsRUFHSCxLQUFLLHFCQUF1QixFQUM5QixDQU1VLGFBQXdCLENBUWhDLE9BUG1CLE1BQU0sS0FBc0IsS0FBSyxXQUFXLGlCQUFpQixXQUFXLENBQUMsRUFFaEUsSUFBSUMsR0FBYSxDQUMzQyxJQUFNQyxFQUFtQkQsRUFBVSxpQkFBaUIsd0JBQXdCLEVBRTVFLE1BQU8sQ0FBQyxHQURZLE1BQU0sS0FBS0MsQ0FBZ0IsRUFBRSxJQUFJQyxHQUFLQSxFQUFFLGFBQWEsWUFBWSxDQUFDLENBQ2hFLEVBQUUsS0FBSyxHQUFHLENBQ2xDLENBQUMsQ0FFSCxDQUVBLE1BQWUsYUFBYUMsRUFBYyxDQUN4QyxNQUFNLGFBQWFBLENBQVksRUFDL0IsS0FBSyxZQUFjLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixtQkFBbUIsQ0FBQyxFQUN4RSxLQUFLLFlBQVksUUFBUUMsR0FBTUEsRUFBRyxhQUFhLE9BQVEsbUJBQW1CLENBQUMsQ0FDN0UsQ0FDRixFQWxJYWxCLEVBY0ssT0FBUyxDQUN2Qm1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBaURGLEVBMURTQyxFQUFBLENBQVJDLEdBQU0sR0FOSXJCLEVBTUYseUJBQ0FvQixFQUFBLENBQVJDLEdBQU0sR0FQSXJCLEVBT0YsZ0NBQ0FvQixFQUFBLENBQVJDLEdBQU0sR0FSSXJCLEVBUUYsb0NBSUZvQixFQUFBLENBRE5FLEdBQVMsQ0FBRSxLQUFNLE1BQU8sQ0FBQyxHQVhmdEIsRUFZSiwyQkFaSUEsRUFBTm9CLEVBQUEsQ0FETkcsR0FBYyx1QkFBdUIsR0FDekJ2QixHQ1JiLE9BQVMsY0FBQXdCLEdBQVksT0FBQUMsR0FBSyxRQUFBQyxPQUFZLE1BRS9CLElBQU1DLEdBQU4sY0FBNENILEVBQVcsQ0FDbkQsUUFBUyxDQUNoQixPQUFPRSxpQkFDVCxDQWdCRixFQW5CYUMsR0FLSyxPQUFTLENBQ3ZCRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FZRixFQUdGLGVBQWUsT0FBTyxrQ0FBbUNFLEVBQTZCLEVDdkJ0RixPQUFTLGNBQUFDLEdBQVksT0FBQUMsR0FBSyxRQUFBQyxPQUFZLE1BQ3RDLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUd2QixJQUFNQyxHQUFOLGNBQXFDQyxFQUFXLENBTTVDLFFBQVMsQ0FDaEIsT0FBT0MsaUJBQ1QsQ0FXQSxhQUFjLENBQ1osTUFBTSxFQUNOLEtBQUssbUJBQXFCLEtBQUssbUJBQW1CLEtBQUssSUFBSSxFQUMzRCxLQUFLLG1CQUFxQixLQUFLLG1CQUFtQixLQUFLLElBQUksQ0FDN0QsQ0FHQSxtQkFBbUJDLEVBQU8sQ0FDeEJBLEVBQU0sZUFBZSxFQUdyQixJQUFNQyxFQUFTRCxFQUFNLFFBQVUsS0FBSyxPQUM5QkUsRUFBU0YsRUFBTSxRQUFVLEtBQUssT0FHcEMsS0FBSyxZQUFZLE1BQU0sS0FBTyxLQUFLLFlBQVksV0FBYUMsRUFBUyxLQUNyRSxLQUFLLFlBQVksTUFBTSxJQUFNLEtBQUssWUFBWSxVQUFZQyxFQUFTLEtBR25FLEtBQUssT0FBU0YsRUFBTSxRQUNwQixLQUFLLE9BQVNBLEVBQU0sT0FDdEIsQ0FFUyxhQUFhRyxFQUFTLENBQzdCLE1BQU0sYUFBYUEsQ0FBQyxFQUdwQixLQUFLLFlBQWMsS0FBSyxjQUFjLHFDQUFxQyxFQUkzRSxLQUFLLE9BQVMsRUFDZCxLQUFLLE9BQVMsRUFHZCxLQUFLLFlBQVksaUJBQWlCLFlBQWNILEdBQXNCLENBRXBFLEtBQUssT0FBU0EsRUFBTSxRQUNwQixLQUFLLE9BQVNBLEVBQU0sUUFHcEIsU0FBUyxpQkFBaUIsWUFBYSxLQUFLLG1CQUFvQixFQUFJLENBQ3RFLENBQUMsRUFDRCxTQUFTLGlCQUFpQixVQUFXLEtBQUssa0JBQWtCLENBQzlELENBRUEsbUJBQW1CQSxFQUFPLENBQ3hCLFNBQVMsb0JBQW9CLFlBQWEsS0FBSyxtQkFBb0IsRUFBSSxDQUN6RSxDQUVTLHNCQUF1QixDQUM5QixNQUFNLHFCQUFxQixFQUMzQixTQUFTLG9CQUFvQixZQUFhLEtBQUssa0JBQWtCLEVBQ2pFLFNBQVMsb0JBQW9CLFVBQVcsS0FBSyxrQkFBa0IsQ0FDakUsQ0FDRixFQTFFYUgsR0FVSyxPQUFTLENBQ3ZCTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNRixFQWpCV1AsR0FBTlEsRUFBQSxDQUROQyxHQUFjLDJCQUEyQixHQUM3QlQsSUNKYixPQUFTLE9BQUFVLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkFDL0MsT0FBUyxVQUFBQyxPQUFjLDJCQUN2QixPQUFTLFlBQUFDLE9BQWdCLDhCQUlsQixJQUFNQyxFQUFOLGNBQXdDQyxDQUFZLENBQXBELGtDQWlCTCxLQUFPLFdBQXFCLElBTTVCLEtBQU8sV0FBcUIsRUFHNUIsS0FBUSxRQUFvQixDQUFDLEVBRzdCLEtBQVEsWUFBdUMsS0FHL0MsS0FBUSxjQUFpQkMsR0FBc0IsQ0FDN0MsR0FBSSxLQUFLLFFBQVEsT0FBUyxLQUFLLFdBQVksQ0FDekMsSUFBTUMsRUFBSUQsRUFBTSxRQUNWRSxFQUFJRixFQUFNLFFBRWhCLEtBQUssUUFBVSxDQUFDLEdBQUcsS0FBSyxRQUFTLEdBQUdDLENBQUMsSUFBSUMsQ0FBQyxFQUFFLEVBQzVDLEtBQUssYUFBYSxLQUFLLE9BQU8sQ0FDaEMsQ0FDRixFQUVTLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQTtBQUFBLFVBRURDLEdBQ0EsS0FBSyxRQUNMQyxHQUFTQSxFQUNULENBQUNBLEVBQU9DLElBQVVIO0FBQUE7QUFBQTtBQUFBLHNCQUdOSSxHQUFTLENBQ2YsU0FBVSxXQUNWLFVBQVcsd0JBQ1gsS0FBTSxHQUFHRixFQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUM1QixJQUFLLEdBQUdBLEVBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQzdCLENBQUMsQ0FBQztBQUFBLDRDQUM0QkEsQ0FBSztBQUFBLHVCQUN6QkcsR0FBYSxDQUNyQkEsRUFBRSxnQkFBZ0IsRUFDbEIsS0FBSyxRQUFVLEtBQUssUUFBUSxPQUFPLENBQUNDLEVBQUdDLElBQU1BLElBQU1KLENBQUssRUFDeEQsS0FBSyxhQUFhLEtBQUssT0FBTyxDQUNoQyxDQUFDO0FBQUE7QUFBQSxXQUdQLENBQUM7QUFBQTtBQUFBLHlCQUdQLENBRUEsT0FBYyxDQUNaLEtBQUssUUFBVSxDQUFDLENBQ2xCLENBRUEsVUFBb0IsQ0FDbEIsT0FBTyxLQUFLLFFBQVEsUUFBVSxLQUFLLFlBQWMsS0FBSyxRQUFRLFFBQVUsS0FBSyxVQUMvRSxDQUVBLElBQUksU0FBU0ssRUFBd0IsQ0FDbkMsS0FBSyxRQUFVLE1BQU0sUUFBUUEsQ0FBRyxFQUFJQSxFQUFNLENBQUNBLENBQUcsQ0FDaEQsQ0FFUyxjQUFxQixDQUM1QixLQUFLLFlBQWMsS0FBSyxjQUFjLEtBQUssRUFFdkMsS0FBSyxZQUVQLEtBQUssWUFBWSxpQkFBaUIsUUFBUyxLQUFLLGFBQWEsRUFFN0QsUUFBUSxLQUFLLDBEQUEwRCxDQUUzRSxDQUVTLHNCQUE2QixDQUNwQyxNQUFNLHFCQUFxQixFQUV2QixLQUFLLGFBRVAsS0FBSyxZQUFZLG9CQUFvQixRQUFTLEtBQUssYUFBYSxDQUVwRSxDQUNGLEVBckdhYixFQUNLLE9BQVMsQ0FDdkJjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVNGLEVBTU9DLEVBQUEsQ0FKTkMsR0FBUyxDQUNSLEtBQU0sT0FDTixVQUFXLGFBQ2IsQ0FBQyxHQWhCVWhCLEVBaUJKLDBCQU1BZSxFQUFBLENBSk5DLEdBQVMsQ0FDUixLQUFNLE9BQ04sVUFBVyxhQUNiLENBQUMsR0F0QlVoQixFQXVCSiwwQkFHQ2UsRUFBQSxDQURQRSxHQUFNLEdBekJJakIsRUEwQkgsdUJBMUJHQSxFQUFOZSxFQUFBLENBRE5HLEdBQWMsOEJBQThCLEdBQ2hDbEIsR0NQYixPQUFTLE9BQUFtQixHQUFLLFFBQUFDLEdBQU0sV0FBQUMsT0FBZSxNQUNuQyxPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLEdBQVUsU0FBQUMsT0FBYSxvQkE4QnhDLElBQU1DLEVBQU4sY0FBbUNDLENBQVksQ0EwRHBELGFBQWMsQ0FDWixNQUFNLEVBaEQ4QyxlQUFZLEdBRXJDLGFBQVUsR0ErQnZDLDJCQUF3QixDQUFDQyxFQUFLQyxJQUFhLENBQUMsRUFHNUMsMkJBQXdCLENBQUNELEVBQUtFLElBQWEsQ0FBQyxFQWUxQyxLQUFLLE9BQVMsaUJBQWlCLElBQUksQ0FDckMsQ0EvQ3NELElBQUksSUFBSUMsRUFBZSxDQUMzRSxLQUFLLEtBQU9BLEVBQ1osS0FBSyxNQUFRQSxFQUNiLEtBQUssTUFBTSxZQUFZLFFBQVMsR0FBRyxLQUFLLElBQUksRUFBRSxDQUNoRCxDQUNBLElBQUksS0FBYyxDQUNoQixPQUFPLEtBQUssSUFDZCxDQUdzRCxJQUFJLElBQUlBLEVBQWUsQ0FDM0UsS0FBSyxLQUFPQSxFQUNaLEtBQUssTUFBTSxZQUFZLFFBQVMsR0FBRyxLQUFLLElBQUksRUFBRSxDQUNoRCxDQUNBLElBQUksS0FBYyxDQUNoQixPQUFPLEtBQUssSUFDZCxDQUcrQyxJQUFJLEtBQUtBLEVBQWUsQ0FDckUsS0FBSyxNQUFRQSxFQUNiLEtBQUssTUFBTSxZQUFZLFNBQVUsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUNsRCxDQUNBLElBQUksTUFBZSxDQUNqQixPQUFPLEtBQUssS0FDZCxDQVFBLE9BQVEsQ0FFUixDQUNBLFVBQW9CLENBQ2xCLE1BQU8sRUFDVCxDQVdBLElBQUksU0FBU0MsRUFBK0IsQ0FDMUMsR0FBSSxNQUFNLFFBQVFBLENBQVUsRUFBRyxDQUM3QixRQUFRLE1BQU0sMEVBQTBFLEVBQ3hGLE1BQ0YsQ0FDQSxJQUFNRCxFQUFRLFNBQVNDLENBQVUsRUFDakMsR0FBSSxPQUFPLE1BQU1ELENBQUssRUFBRyxDQUN2QixRQUFRLE1BQU0sZ0RBQWdELEVBQzlELE1BQ0YsQ0FDQSxLQUFLLE1BQVFBLENBQ2YsQ0FJUyxRQUFTLENBRWhCLEtBQUssTUFBUSxLQUFLLE1BQVEsS0FBSyxNQUFRLEtBQUssS0FDNUMsS0FBSyxNQUFRLEtBQUssTUFBUSxLQUFLLE1BQVEsS0FBSyxLQUM1QyxJQUFNRSxHQUFvQixLQUFLLE1BQVEsS0FBSyxNQUFRLEtBQUssSUFBTSxLQUFLLEtBQVEsSUFDNUUsWUFBSyxNQUFNLFlBQVkscUJBQXNCLEdBQUdBLENBQWUsR0FBRyxFQUNsRSxLQUFLLGFBQWEsZ0JBQWlCLEtBQUssTUFBTSxTQUFTLENBQUMsRUFFakRDO0FBQUE7QUFBQSxVQUVELEtBQUssT0FBTyxpQkFBaUIsZUFBZSxHQUFLLE9BQy9DQTtBQUFBLHFCQUNTLEtBQUssSUFBSTtBQUFBLHFCQUNULEtBQUssSUFBSTtBQUFBLG9CQUVsQkMsRUFBTztBQUFBLFVBQ1QsS0FBSyxPQUFPLGlCQUFpQixjQUFjLEdBQUssT0FBU0Qsd0NBQTRDQyxFQUFPO0FBQUEsZ0RBQ3RFLEtBQUssWUFBWSxnQkFBZ0IsS0FBSyxZQUFZO0FBQUE7QUFBQSxjQUVwRixLQUFLLE9BQU8saUJBQWlCLGNBQWMsR0FBSyxPQUM5Q0Qsa0NBQW9DLEtBQUssS0FBSyxTQUM5Q0MsRUFBTztBQUFBO0FBQUE7QUFBQSxhQUlyQixDQUVTLG1CQUFvQixDQUMzQixNQUFNLGtCQUFrQixFQUN4QixLQUFLLEtBQU8sRUFDWixLQUFLLGFBQWEsV0FBWSxHQUFHLEVBQ2pDLEtBQUssYUFBYSxPQUFRLFFBQVEsQ0FDcEMsQ0FFUSxhQUFhQyxFQUFPLENBQzFCLElBQU1DLEVBQWtCRCxHQUFTLENBQy9CLEdBQU0sQ0FBRSxFQUFBRSxDQUFFLEVBQUksS0FBSyxxQkFBcUJGLENBQUssRUFDdkNHLEVBQVFELEVBQUksS0FBSyxNQUFNLHNCQUFzQixFQUFFLEtBQU8sU0FBUyxnQkFBZ0IsV0FDckYsS0FBSyxlQUFlQyxDQUFLLEVBQ3pCSCxFQUFNLGdCQUFnQixDQUN4QixFQUVNSSxFQUFpQixJQUFNLENBQzNCLFNBQVMsb0JBQW9CLFlBQWFILENBQWUsRUFDekQsU0FBUyxvQkFBb0IsV0FBWUcsQ0FBYyxFQUV2RCxLQUFLLGFBQWEsS0FBSyxNQUFNLFNBQVMsQ0FBQyxDQUN6QyxFQUVBLFNBQVMsaUJBQWlCLFlBQWFILENBQWUsRUFDdEQsU0FBUyxpQkFBaUIsV0FBWUcsQ0FBYyxFQUVwRCxHQUFNLENBQUUsRUFBQUYsQ0FBRSxFQUFJLEtBQUsscUJBQXFCRixDQUFLLEVBQ3ZDRyxFQUFRRCxFQUFJLEtBQUssTUFBTSxzQkFBc0IsRUFBRSxLQUFPLFNBQVMsZ0JBQWdCLFdBQ3JGLEtBQUssZUFBZUMsQ0FBSyxFQUN6QkgsRUFBTSxnQkFBZ0IsQ0FDeEIsQ0FFUSxhQUFhQSxFQUFPLENBQzFCLElBQU1LLEVBQW1CTCxHQUFzQixDQUU3QyxJQUFNRyxFQUFRSCxFQUFNLE1BQVEsS0FBSyxNQUFNLHNCQUFzQixFQUFFLEtBQU8sU0FBUyxnQkFBZ0IsV0FFL0YsS0FBSyxlQUFlRyxDQUFLLEVBQ3pCSCxFQUFNLGVBQWUsRUFDckJBLEVBQU0sZ0JBQWdCLENBQ3hCLEVBRU1NLEVBQWdCLElBQU0sQ0FDMUIsU0FBUyxvQkFBb0IsWUFBYUQsQ0FBZSxFQUN6RCxTQUFTLG9CQUFvQixVQUFXQyxDQUFhLEVBRXJELEtBQUssYUFBYSxLQUFLLE1BQU0sU0FBUyxDQUFDLENBQ3pDLEVBRUEsU0FBUyxpQkFBaUIsWUFBYUQsQ0FBZSxFQUN0RCxTQUFTLGlCQUFpQixVQUFXQyxDQUFhLEVBR2xELElBQU1ILEVBQVFILEVBQU0sTUFBUSxLQUFLLE1BQU0sc0JBQXNCLEVBQUUsS0FBTyxTQUFTLGdCQUFnQixXQUUvRixLQUFLLGVBQWVHLENBQUssRUFDekJILEVBQU0sZUFBZSxFQUNyQkEsRUFBTSxnQkFBZ0IsQ0FDeEIsQ0FHUSxlQUFlRyxFQUFlLENBQ3BDLElBQU1JLEVBQVcsS0FBSyxLQUFRLEtBQUssSUFBTSxLQUFLLEtBQU9KLEVBQVMsS0FBSyxNQUFNLHNCQUFzQixFQUFFLE1BQzNGSyxFQUFtQixLQUFLLElBQU0sS0FBSyxPQUFPRCxFQUFXLEtBQUssS0FBTyxLQUFLLEtBQUssRUFBSSxLQUFLLE1BQzFGLEtBQUssTUFBUUMsQ0FDZixDQUVRLHFCQUFxQixFQUczQixDQUNBLElBQUlDLEVBQ0osR0FBSSxFQUFFLE1BQVEsY0FBZ0IsRUFBRSxNQUFRLGFBQWUsRUFBRSxNQUFRLFlBQWMsRUFBRSxNQUFRLGNBQWUsQ0FDdEcsSUFBTUMsRUFBTSxPQUFPLEVBQUUsZUFBa0IsWUFBYyxFQUFJLEVBQUUsY0FDckRDLEVBQVFELEVBQUksUUFBUSxDQUFDLEdBQUtBLEVBQUksZUFBZSxDQUFDLEVBQ3BERCxFQUFhLENBQ1gsRUFBR0UsRUFBTSxNQUNULEVBQUdBLEVBQU0sS0FDWCxDQUNGLE1BQ0UsRUFBRSxNQUFRLGFBQ1YsRUFBRSxNQUFRLFdBQ1YsRUFBRSxNQUFRLGFBQ1YsRUFBRSxNQUFRLGFBQ1YsRUFBRSxNQUFRLFlBQ1YsRUFBRSxNQUFRLGNBQ1YsRUFBRSxNQUFRLGdCQUVWRixFQUFhLENBQ1gsRUFBRyxFQUFFLFFBQ0wsRUFBRyxFQUFFLE9BQ1AsR0FFRixPQUFPQSxDQUNULENBQ0YsRUF6TWFuQixFQThFSyxPQUFTLENBQUNzQixJQUFLLEVBMUV2QkMsRUFBQSxDQURQQyxHQUFNLE9BQU8sR0FISHhCLEVBSUgscUJBR0F1QixFQUFBLENBRFBDLEdBQU0sT0FBTyxHQU5IeEIsRUFPSCxxQkFFb0J1QixFQUFBLENBQTNCRSxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FUZnpCLEVBU2lCLHFCQUUwQnVCLEVBQUEsQ0FBckRFLEdBQVMsQ0FBRSxLQUFNLFFBQVMsVUFBVyxZQUFhLENBQUMsR0FYekN6QixFQVcyQyx5QkFFekJ1QixFQUFBLENBQTVCRSxHQUFTLENBQUUsS0FBTSxPQUFRLENBQUMsR0FiaEJ6QixFQWFrQix1QkFHNkJ1QixFQUFBLENBQXpERSxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsYUFBYyxDQUFDLEdBaEJ6Q3pCLEVBZ0IrQyxtQkFVQXVCLEVBQUEsQ0FBekRFLEdBQVMsQ0FBRSxLQUFNLE9BQVEsVUFBVyxhQUFjLENBQUMsR0ExQnpDekIsRUEwQitDLG1CQVNQdUIsRUFBQSxDQUFsREUsR0FBUyxDQUFFLEtBQU0sT0FBUSxVQUFXLE1BQU8sQ0FBQyxHQW5DbEN6QixFQW1Dd0Msb0JBU25EdUIsRUFBQSxDQURDRyxFQUFNLFdBQVksQ0FBRSxxQkFBc0IsRUFBSyxDQUFDLEdBM0N0QzFCLEVBNENYLHFDQUdBdUIsRUFBQSxDQURDRyxFQUFNLFdBQVksQ0FBRSxxQkFBc0IsRUFBSyxDQUFDLEdBOUN0QzFCLEVBK0NYLHFDQS9DV0EsRUFBTnVCLEVBQUEsQ0FETkksR0FBYyx3QkFBd0IsR0FDMUIzQixHQ3pCYixPQUFTLFdBQUE0QixPQUFlLGVBQ3hCLE9BQVMsY0FBQUMsR0FBWSxRQUFBQyxPQUFZLE1BQ2pDLE9BQVMsaUJBQUFDLEdBQWUsU0FBQUMsT0FBYSxvQkFjOUIsSUFBTUMsR0FBTixjQUFnQ0MsRUFBZ0MsQ0FPckUsUUFBUyxDQUNQLE9BQU9DLHVCQUF5QixLQUFLLGdCQUFnQixVQUN2RCxDQUVBLGlCQUFpQkMsRUFBYyxDQWpDakMsSUFBQUMsRUFBQUMsRUFBQUMsRUFtQ0ksSUFBTUMsRUFBYyxNQUFNLE1BQUtGLEdBQUFELEVBQUEsS0FBSyxvQkFBTCxZQUFBQSxFQUF3QixhQUF4QixLQUFBQyxFQUFzQyxDQUFDLENBQUMsRUFBRSxLQUN2RUcsR0FBUUEsRUFBSyxXQUFhLEtBQUssWUFDakMsRUFDQSxHQUFJLENBQ0YsS0FBSyxpQkFBbUIsSUFBSSxTQUFTLFVBQVcsS0FBTSxRQUFRRixFQUFBQyxFQUFZLGNBQVosS0FBQUQsRUFBMkIsRUFBRSxDQUM3RixPQUFTRyxFQUFHLENBQ1YsUUFBUSxNQUFNLG1EQUFvREEsQ0FBQyxDQUNyRSxDQUNGLENBRU8sV0FBWSxDQUNqQixJQUFNQyxFQUFLLENBQ1QsU0FBV0MsR0FBNEIsQ0EvQzdDLElBQUFQLEVBQUFDLEVBQUFDLEVBZ0RRLE9BQUFBLEdBQUFELEdBQUFELEVBQUEsS0FBSyxXQUFMLFlBQUFBLEVBQWUsVUFBVSxLQUFLUSxHQUFLQSxFQUFFLGFBQWVELEtBQXBELFlBQUFOLEVBQXlFLFFBQXpFLEtBQUFDLEVBQWtGLElBQ3BGLFFBQVVLLEdBQTRCLENBakQ1QyxJQUFBUCxFQUFBQyxFQUFBQyxFQWtEUyxPQUFBQSxHQUFBRCxHQUFBRCxFQUFBLEtBQUssV0FBTCxZQUFBQSxFQUFlLFVBQVUsS0FBS1EsR0FBS0EsRUFBRSxhQUFlRCxLQUFwRCxZQUFBTixFQUNHLGtCQURILEtBQUFDLEVBQ3NCLEdBQzNCLEVBQ01PLEVBQU8sQ0FDWCxZQUFjQyxHQUE0QixDQXREaEQsSUFBQVYsRUF1RFEsT0FBQUEsRUFBQSxLQUFLLFdBQUwsWUFBQUEsRUFBZSxVQUFVLEtBQUtRLEdBQUtBLEVBQUUsYUFBZUUsSUFDdEQsc0JBQXVCLENBQUNDLEVBQTJCQyxJQUE2QixDQUM5RSxLQUFLLGNBQ0gsSUFBSSxZQUFxRSx3QkFBeUIsQ0FDaEcsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQ04sa0JBQUFELEVBQ0EsTUFBQUMsQ0FDRixDQUNGLENBQUMsQ0FDSCxDQUNGLEVBQ0EsdUJBQXdCLENBQUNMLEVBQTRCTSxJQUFnQyxDQUNuRixLQUFLLGNBQ0gsSUFBSSxZQUF5RSwyQkFBNEIsQ0FDdkcsUUFBUyxHQUNULFNBQVUsR0FDVixPQUFRLENBQ04sbUJBQUFOLEVBQ0EsU0FBQU0sQ0FDRixDQUNGLENBQUMsQ0FDSCxDQUNGLENBQ0YsRUFFQSxPQUFPLEtBQUssaUJBQWlCLEtBQUssU0FBVVAsRUFBSUcsQ0FBSSxDQUN0RCxDQUNGLEVBekRVSyxFQUFBLENBRlBDLEdBQVEsQ0FBRSxRQUFTQyxFQUFhLFVBQVcsRUFBSyxDQUFDLEVBQ2pEQyxHQUFNLEdBSklyQixHQUtILHdCQUxHQSxHQUFOa0IsRUFBQSxDQUROSSxHQUFjLHFCQUFxQixHQUN2QnRCLElDdEJiLE9BQVMsY0FBQXVCLEdBQVksT0FBQUMsR0FBSyxRQUFBQyxPQUFZLE1BQ3RDLE9BQVMsaUJBQUFDLE9BQXFCLG9CQUd2QixJQUFNQyxHQUFOLGNBQW1DQyxFQUFXLENBUzFDLG1CQUFvQixDQUMzQixNQUFNLGtCQUFrQixFQUV4QixLQUFLLGNBQ0gsSUFBSSxZQUFZLHVCQUF3QixDQUN0QyxRQUFTLEdBQ1QsV0FBWSxHQUNaLFNBQVUsRUFDWixDQUFDLENBQ0gsQ0FDRixDQUVTLFFBQVMsQ0FDaEIsT0FBT0Msc0NBQ1QsQ0FDRixFQXhCYUYsR0FDSixPQUFTRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQURMSCxHQUFOSSxFQUFBLENBRE5DLEdBQWMsd0JBQXdCLEdBQzFCTCxJQ0piLE9BQVMsT0FBQU0sR0FBSyxRQUFBQyxHQUFNLGNBQUFDLE9BQWtCLE1BQ3RDLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsT0FBZ0Isb0JBR2pDLElBQU1DLEdBQU4sY0FBcUJDLEVBQVcsQ0FBaEMsa0NBUXNDLGNBQStCLEVBRWpFLFFBQVMsQ0FDaEIsT0FBT0Msc0NBQ1QsQ0FDRixFQWJhRixHQUNKLE9BQVNHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU8yQkMsRUFBQSxDQUExQ0MsR0FBUyxDQUFFLEtBQU0sT0FBUSxRQUFTLEVBQUssQ0FBQyxHQVI5QkwsR0FRZ0Msd0JBUmhDQSxHQUFOSSxFQUFBLENBRE5FLEdBQWMsU0FBUyxHQUNYTixJQ0piLE9BQVMsT0FBQU8sR0FBSyxjQUFBQyxPQUFrQixNQUNoQyxPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLE9BQWdCLG9CQUdqQyxJQUFNQyxHQUFOLGNBQXdCQyxFQUFXLENBQW5DLGtDQVFzQyxjQUErQixFQUUxRSxtQkFBb0IsQ0FDbEIsS0FBSyxhQUFhLE9BQVEsYUFBYSxDQUN6QyxDQUNGLEVBYmFELEdBQ0osT0FBU0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTzJCQyxFQUFBLENBQTFDQyxHQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSyxDQUFDLEdBUjlCSixHQVFnQyx3QkFSaENBLEdBQU5HLEVBQUEsQ0FETkUsR0FBYyxhQUFhLEdBQ2ZMLElDSmIsT0FBUyxPQUFBTSxHQUFLLFFBQUFDLEdBQU0sY0FBQUMsT0FBa0IsTUFDdEMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkFHakMsSUFBTUMsR0FBTixjQUF5QkMsRUFBVyxDQUFwQyxrQ0FRc0MsY0FBK0IsRUFFakUsbUJBQTBCLENBQ2pDLE1BQU0sa0JBQWtCLEVBQ3hCLEtBQUssYUFBYSxPQUFRLGNBQWMsQ0FDMUMsQ0FFUyxRQUFTLENBQ2hCLE9BQU9DLGlCQUNULENBQ0YsRUFsQmFGLEdBQ0osT0FBU0c7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTzJCQyxFQUFBLENBQTFDQyxHQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSyxDQUFDLEdBUjlCTCxHQVFnQyx3QkFSaENBLEdBQU5JLEVBQUEsQ0FETkUsR0FBYyxjQUFjLEdBQ2hCTixJQ0piLE9BQVMsT0FBQU8sT0FBVyxNQUNwQixPQUFTLGlCQUFBQyxHQUFlLFlBQUFDLE9BQWdCLG9CQU1qQyxJQUFNQyxHQUFOLGNBQStCQyxDQUFVLENBU2hELEVBVGFELEdBQ0osT0FBU0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPeURDLEVBQUEsQ0FBeEVDLEdBQVMsQ0FBRSxVQUFXLGtCQUFtQixLQUFNLE9BQVEsUUFBUyxFQUFLLENBQUMsR0FSNURKLEdBUThELHFCQVI5REEsR0FBTkcsRUFBQSxDQURORSxHQUFjLG9CQUFvQixHQUN0QkwsSUNQYixPQUFTLE9BQUFNLEdBQUssUUFBQUMsT0FBWSxNQUMxQixPQUFTLGlCQUFBQyxPQUFxQixvQkFJdkIsSUFBTUMsR0FBTixjQUF5QkMsQ0FBVSxDQVEvQixRQUFTLENBQ2hCLE9BQU9DO0FBQUEscUJBRVQsQ0FDRixFQVphRixHQUNKLE9BQVNHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQURMSCxHQUFOSSxFQUFBLENBRE5DLEdBQWMsYUFBYSxHQUNmTCxJQ0xiLE9BQVMsT0FBQU0sR0FBSyxRQUFBQyxHQUFNLGNBQUFDLE9BQWtCLE1BQ3RDLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsT0FBZ0Isb0JBR2pDLElBQU1DLEdBQU4sY0FBOEJDLEVBQVcsQ0FDOUMsV0FBb0IsUUFBUyxDQUMzQixNQUFPLENBQ0xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQU1GLENBQ0YsQ0FLUyxtQkFBb0IsQ0FDM0IsTUFBTSxrQkFBa0IsRUFFeEIsS0FBSyxpQkFBaUIsUUFBUyxLQUFLLHFCQUFxQixFQUV6RCxLQUFLLGNBQ0gsSUFBSSxZQUFZLDZCQUE4QixDQUM1QyxRQUFTLEdBQ1QsV0FBWSxHQUNaLFNBQVUsRUFDWixDQUFDLENBQ0gsQ0FDRixDQUVTLHNCQUF1QixDQUM5QixLQUFLLG9CQUFvQixRQUFTLEtBQUsscUJBQXFCLENBQzlELENBRVMsUUFBUyxDQUNoQixPQUFPQyxtQkFDVCxDQUVRLHVCQUF3QixDQUc5QixLQUFLLGNBQ0gsSUFBSSxZQUFZLDJCQUE0QixDQUMxQyxRQUFTLEdBQ1QsV0FBWSxHQUNaLFNBQVUsR0FDVixPQUFRLENBQUUsV0FBWSxLQUFLLFVBQVcsQ0FDeEMsQ0FBQyxDQUNILENBQ0YsQ0FDRixFQXBDRUMsRUFBQSxDQURDQyxHQUFTLENBQUUsS0FBTSxNQUFPLENBQUMsR0FaZkwsR0FhWCwwQkFiV0EsR0FBTkksRUFBQSxDQURORSxHQUFjLG1CQUFtQixHQUNyQk4sSUNKYixPQUFTLE9BQUFPLEdBQUssUUFBQUMsR0FBTSxXQUFBQyxPQUFlLE1BQ25DLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsT0FBZ0Isb0JBZ0JqQyxJQUFNQyxHQUFOLGNBQThCQyxDQUFVLENBc0JwQyxRQUFTLENBQ2hCLE9BQU9DO0FBQUE7QUFBQTtBQUFBLFFBR0gsS0FBSyxPQUFTQSxxQkFBdUIsS0FBSyxNQUFNLFNBQVdDLEVBQU87QUFBQSxpQ0FFeEUsQ0FDRixFQTdCYUgsR0FDSixPQUFTSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQW1CVEMsRUFBQSxDQUROQyxHQUFTLENBQUUsS0FBTSxPQUFRLFVBQVcsRUFBTSxDQUFDLEdBbkJqQ04sR0FvQkosc0JBcEJJQSxHQUFOSyxFQUFBLENBRE5FLEdBQWMsbUJBQW1CLEdBQ3JCUCxJQ3VEYixRQUFRLElBQ04sMENBQ0EsZ0NBQ0EsZ0dBQ0EsbUJBQ0YiLAogICJuYW1lcyI6IFsicHJvdmlkZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm9wZXJ0eU5hbWUiLCAib3B0aW9ucyIsICJyZXNvbHZlZE9wdGlvbnMiLCAiX19zcHJlYWRWYWx1ZXMiLCAicHJvdG8iLCAiZGVjb3JhdGVkRm5OYW1lIiwgInVwZGF0ZSIsICJ3YXRjaGVkUHJvcGVydGllcyIsICJjaGFuZ2VkUHJvcHMiLCAicHJvcGVydHkiLCAia2V5IiwgIm9sZFZhbHVlIiwgIm5ld1ZhbHVlIiwgImNyZWF0ZUNvbnRleHQiLCAiaXRlbUNvbnRleHRWYXJpYWJsZXMiLCAiaXRlbUNvbnRleHQiLCAiUXRpQXNzZXNzbWVudEl0ZW0iLCAiTGl0RWxlbWVudCIsICJfIiwgImRpc2FibGVkIiwgImNoIiwgInJlYWRvbmx5IiwgIml0ZW1Db250ZXh0VmFyaWFibGVzIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAiZmVlZGJhY2tFbGVtZW50IiwgInJlc3BvbnNlSWRlbnRpZmllciIsICJjb3VudEF0dGVtcHQiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAidmFsdWUiLCAidiIsICJ2YXJpYWJsZSIsICJtYXRjaGluZ1ZhbHVlIiwgImludGVyYWN0aW9uRWxlbWVudCIsICJlbCIsICJmZSIsICJteVJlc3BvbnNlcyIsICJyZXNwb25zZSIsICJpbnRlcmFjdGlvbiIsICJpIiwgImh0bWwiLCAic2hvdyIsICJyZXNwb25zZXMiLCAidmFyaSIsICJjciIsICJjb3VudE51bUF0dGVtcHRzIiwgIl9hIiwgInJlc3BvbnNlUHJvY2Vzc29yIiwgImlkZW50aWZpZXIiLCAiZXZlbnQiLCAib3V0Y29tZVZhcmlhYmxlIiwgIm5hbWUiLCAiZGV0YWlsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJwcm92aWRlIiwgIml0ZW1Db250ZXh0IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiIsICJMaXRFbGVtZW50IiwgImV2ZW50IiwgInN0aW11bHVzUmVmIiwgIl9hIiwgInBhdGgiLCAic3RpbXVsdXMiLCAicXRpVHJhbnNmb3JtSXRlbSIsICJhcGkiLCAiZWxlbWVudHMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgIktFWUNPREUiLCAiUXRpQ2hvaWNlIiwgIkxpdEVsZW1lbnQiLCAiXyIsICJkaXNhYmxlZCIsICJldmVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ2YWx1ZSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJRdGlJdGVtQm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQcm9tcHQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlTdHlsZXNoZWV0IiwgIkxpdEVsZW1lbnQiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgIml0ZW0iLCAibGluayIsICJzdHlsZXMiLCAiZXJyb3IiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInZhcmlhYmxlIiwgImh0bWxWYWx1ZXMiLCAiZGVmYXVsdFZhbHVlcyIsICJuIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aU91dGNvbWVEZWNsYXJhdGlvbiIsICJRdGlWYXJpYWJsZURlY2xhcmF0aW9uIiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJ0YWJsZSIsICJlbnRyaWVzIiwgImVudHJ5IiwgInNvdXJjZVZhbHVlIiwgInRhcmdldFZhbHVlIiwgIm91dGNvbWVWYXJpYWJsZSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiIsICJRdGlWYXJpYWJsZURlY2xhcmF0aW9uIiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJyZXNwb25zZVZhcmlhYmxlIiwgInJlc3VsdCIsICJjb3JyZWN0UmVzcG9uc2UiLCAidmFsdWVzIiwgImkiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8iLCAiTGl0RWxlbWVudCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlDb250ZW50Qm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aVJ1YnJpY0Jsb2NrIiwgIkxpdEVsZW1lbnQiLCAib2xkIiwgImRpc2FibGVkIiwgImNsYXNzTmFtZSIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiZGVjaW1hbFNlcGFyYXRvciIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJudW1iZXIiLCAiZFNlcCIsICJJc051bGxPclVuZGVmaW5lZCIsICJ2YWx1ZSIsICJyZW1vdmVEb3VibGVTbGFzaGVzIiwgInN0ciIsICJRdGlGZWVkYmFjayIsICJMaXRFbGVtZW50IiwgIm91dGNvbWVJZGVudGlmaWVyIiwgIm91dGNvbWVWYXJpYWJsZSIsICJpc0ZvdW5kIiwgIklzTnVsbE9yVW5kZWZpbmVkIiwgInZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlGZWVkYmFja0Jsb2NrIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUZlZWRiYWNrSW5saW5lIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpTW9kYWxGZWVkYmFjayIsICJRdGlGZWVkYmFjayIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJJbnRlcmFjdGlvbiIsICJMaXRFbGVtZW50IiwgInZhbCIsICJ2YWx1ZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAicmVmIiwgImNyZWF0ZVJlZiIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImNyZWF0ZVJlZiIsICJvbGQiLCAiZGlzYWJsZWQiLCAiY2xhc3NOYW1lIiwgIm5yUm93cyIsICJ2YWx1ZSIsICJjc3MiLCAiaHRtbCIsICJyZWYiLCAiZXZlbnQiLCAiaW5wdXQiLCAiaWZEZWZpbmVkIiwgInRleHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAiY3JlYXRlUmVmIiwgImxpdmVRdWVyeSIsICJxdWVyeVNlbGVjdG9yIiwgIm9wdGlvbnMiLCAib2JzZXJ2ZXIiLCAicmVzb2x2ZWRPcHRpb25zIiwgIl9fc3ByZWFkVmFsdWVzIiwgInByb3RvIiwgImRlY29yYXRlZEZuTmFtZSIsICJjb25uZWN0ZWRDYWxsYmFjayIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJfYSIsICJjYWxsYmFjayIsICJtdXRhdGlvbkxpc3QiLCAiZWxlbWVudHNUb1dhdGNoIiwgIm11dGF0aW9uIiwgImFkZGVkTm9kZXMiLCAiZSIsICJyZW1vdmVkTm9kZXMiLCAibiIsICJlbGVtZW50c0FkZGVkIiwgIlF0aVRleHRFbnRyeUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImNyZWF0ZVJlZiIsICJvbGQiLCAiY2xhc3NlcyIsICJjbGFzc05hbWUiLCAibnJSb3dzIiwgInZhbHVlIiwgImNzcyIsICJodG1sIiwgImV2ZW50IiwgImlucHV0IiwgImlmRGVmaW5lZCIsICJ0ZXh0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkNob2ljZXNNaXhpbiIsICJzdXBlckNsYXNzIiwgInNlbGVjdG9yIiwgIkNob2ljZXNNaXhpbkVsZW1lbnQiLCAiYXJncyIsICJfIiwgImRpc2FibGVkIiwgImNoIiwgInJlYWRvbmx5IiwgImFjYyIsICJ2YWwiLCAicmVzcG9uc2VWYWx1ZSIsICJyZXNwb25zZVZhbHVlQXJyYXkiLCAiY2UiLCAicnYiLCAiZSIsICJjaG9pY2VFbGVtZW50IiwgImV2ZW50IiwgInNlbGVjdGVkSWRlbnRpZmllcnMiLCAicmVzdWx0IiwgInJlc3BvbnNlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJRdGlIb3R0ZXh0SW50ZXJhY3Rpb24iLCAiQ2hvaWNlc01peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiY3NzIiwgImh0bWwiLCAib3B0aW9uIiwgInVuc2FmZUhUTUwiLCAiY2hvaWNlcyIsICJjaG9pY2UiLCAic2VsZWN0ZWRPcHRpb24iLCAiaSIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgInZhbHVlIiwgImV2ZW50IiwgInNlbGVjdGVkT3B0aW9uVmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2h1ZmZsZU1peGluIiwgInN1cGVyQ2xhc3MiLCAic2VsZWN0b3IiLCAiU2h1ZmZsZUVsZW1lbnQiLCAidmFsdWUiLCAib2xkVmFsdWUiLCAiY2hvaWNlcyIsICJmaXhlZEVsZW1lbnRzIiwgIm5vbkZpeGVkRWxlbWVudHMiLCAiY2hvaWNlIiwgImluZGV4IiwgImlzU2h1ZmZsZWQiLCAibWF4QXR0ZW1wdHMiLCAiYXR0ZW1wdCIsICJpIiwgImoiLCAib3JkZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciIsICJwcm9wZXJ0eSIsICJWb2NhYnVsYXJ5TWl4aW4iLCAic3VwZXJDbGFzcyIsICJzZWxlY3RvciIsICJWb2NhYnVsYXJ5RWxlbWVudCIsICJ2YWx1ZSIsICJfYSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiY2xhc3NDb250YWluc0xhYmVsIiwgImNscyIsICJpc051bWJlciIsICJjaG9pY2VzIiwgImMiLCAiY2hvaWNlIiwgImluZGV4IiwgImEiLCAiYiIsICJpIiwgImxhc3RMYWJlbCIsICJsYXN0TGFiZWxTdWZmaXgiLCAibGFiZWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNzcyIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aUNob2ljZUludGVyYWN0aW9uIiwgIlZvY2FidWxhcnlNaXhpbiIsICJTaHVmZmxlTWl4aW4iLCAiQ2hvaWNlc01peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlPdXRjb21lUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibG9naWMiLCAiUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IiLCAicnVsZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInJ1bGUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIm1hdGNoQ29ycmVjdCIsICJtYXBSZXNwb25zZSIsICJtYXBSZXNwb25zZVBvaW50IiwgIlF0aVJlc3BvbnNlUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicnVsZXMiLCAicnVsZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAic3BsaXR0ZWRUZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVOYW1lIiwgIm1hcFJlc3BvbnNlIiwgIm1hcFJlc3BvbnNlUG9pbnQiLCAibWF0Y2hDb3JyZWN0IiwgInN0ckhUTUwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIlF0aVJ1bGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aUxvb2t1cE91dGNvbWVWYWx1ZSIsICJRdGlSdWxlIiwgImlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgInZhbHVlIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJodG1sIiwgIlF0aVJlc3BvbnNlQ29uZGl0aW9uIiwgIlF0aVJ1bGUiLCAiaHRtbCIsICJicmFuY2hlcyIsICJpIiwgImJyYW5jaCIsICJRdGlTZXRPdXRjb21lVmFsdWUiLCAiUXRpUnVsZSIsICJvdXRjb21lSWRlbnRpZmllciIsICJleHByZXNzaW9uIiwgInZhbHVlIiwgIlF0aVNldE91dGNvbWVWYWx1ZVJ1bGUiLCAidiIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiUXRpUmVzcG9uc2VFbHNlIiwgInN1YlJ1bGVzIiwgImkiLCAiaHRtbCIsICJRdGlSZXNwb25zZUlmIiwgIlF0aVJlc3BvbnNlRWxzZSIsICJyZXN1bHQiLCAiaSIsICJRdGlSZXNwb25zZUVsc2VJZiIsICJRdGlSZXNwb25zZUlmIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJRdGlFeHByZXNzaW9uIiwgIkxpdEVsZW1lbnQiLCAiaWRlbnRpZmllciIsICJ2YWx1ZXMiLCAidiIsICJyZXNwb25zZVZhcmlhYmxlIiwgImVycm9yIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpQW5kIiwgInF0aUFuZE1peGluIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiQmFzZSIsICJjaGlsZHJlbiIsICJjIiwgImNvbmRpdGlvbiIsICJ2YWx1ZSIsICJlIiwgIlF0aUFuZCIsICJwcm9wZXJ0eSIsICJRdGlCYXNlVmFsdWUiLCAiUXRpRXhwcmVzc2lvbiIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpQ29udGFpbnMiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9qZWN0aW9uMSIsICJwcm9qZWN0aW9uMiIsICJ4IiwgIlF0aUNvcnJlY3QiLCAiUXRpRXhwcmVzc2lvbiIsICJpZGVudGlmaWVyIiwgInJlc3BvbnNlVmFyaWFibGUiLCAicHJvcGVydHkiLCAiUXRpRXF1YWxSb3VuZGVkIiwgIlF0aUV4cHJlc3Npb24iLCAiZmlndXJlcyIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJmbG9hdDEiLCAiZmxvYXQyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJTY29yaW5nSGVscGVyIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiYmFzZVR5cGUiLCAiaW50MSIsICJpbnQyIiwgImZsb2F0MSIsICJmbG9hdDIiLCAicGFpcjEiLCAicGFpcjIiLCAiUXRpRXF1YWwiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJTY29yaW5nSGVscGVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlHdCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUd0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUlzTnVsbCIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YWx1ZSIsICJRdGlMdCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUx0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb3BlcnR5IiwgIlF0aU1hcFJlc3BvbnNlIiwgIlF0aUV4cHJlc3Npb24iLCAicmVzcG9uc2UiLCAibWFwcGluZyIsICJjYW5kaWRhdGVSZXNwb25zZXMiLCAicmVzdWx0IiwgImNhbmRpZGF0ZVJlc3BvbnNlIiwgIm1hcHBlZFZhbHVlIiwgImVudHJ5IiwgIlNjb3JpbmdIZWxwZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiUXRpTWFwcGluZyIsICJMaXRFbGVtZW50IiwgImVsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlNYXRjaCIsICJfUXRpTWF0Y2giLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWVUb01hcCIsICJjb3JyZWN0VmFsdWVJbmZvIiwgIl9hIiwgIlNjb3JpbmdIZWxwZXIiLCAiaSIsICJhbnN3ZXJJbmRleCIsICJjb3JyZWN0QW5zd2VyIiwgIm1hdGNoaW5nVmFsdWUiLCAiYXJyIiwgIm12IiwgIlF0aU1lbWJlciIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb2plY3Rpb24xIiwgIlF0aU11bHRpcGxlIiwgIlF0aUV4cHJlc3Npb24iLCAidmFyaWFibGVzIiwgInZhcmlhYmxlIiwgImh0bWwiLCAiUXRpTm90IiwgIlF0aUV4cHJlc3Npb24iLCAiaHRtbCIsICJRdGlPciIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgImMiLCAiY29uZGl0aW9uIiwgInZhbHVlIiwgIlF0aU9yZGVyZWQiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFyaWFibGUiLCAiY29uc3VtZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRQcmludGVkVmFyaWFibGUiLCAiTGl0RWxlbWVudCIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAiYXNzZXNzbWVudEl0ZW0iLCAiaWRlbnRpZmllciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJRdGlQcm9kdWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiYWNjdW11bGF0b3IiLCAiY3VycmVudFZhbHVlIiwgImVycm9yIiwgInByb3BlcnR5IiwgIlF0aVN0cmluZ01hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAidjEiLCAidjIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpU3VtIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpU3VtRXhwcmVzc2lvbiIsICJleHByZXNzaW9ucyIsICJjIiwgInZhbHVlIiwgImEiLCAiYiIsICJRdGlWYXJpYWJsZSIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidXJsIiwgImJhc2VVcmwiLCAicmVxdWlyZUNvbmZpZyIsICJtb2R1bGVDb25nIiwgIm1vZHVsZUlkIiwgImUiLCAicGF0aCIsICJiYXNlUGF0aCIsICJwIiwgImlucHV0IiwgInRvcExldmVsS2V5IiwgIm5lc3RlZE9iamVjdCIsICJuZXN0ZWRLZXkiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAibmV3UmVzcG9uc2UiLCAic3RyaW5naWZpZWQiLCAidmFsIiwgIm5vZGUiLCAiYSIsICJjb25maWciLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJlbCIsICJwcm9wZXJ0eSIsICJrZXkiLCAiY2hpbGRyZW4iLCAiYWxsS2V5IiwgImMiLCAiayIsICJnZXRDaGlsZFByb3BlcnRpZXMiLCAicHJvcGVydGllcyIsICJjaGlsZCIsICJfX3NwcmVhZFZhbHVlcyIsICJwY2kiLCAidHlwZSIsICJkb20iLCAiYWNjIiwgImxpbmsiLCAic3R5bGVzIiwgImN0eEEiLCAicmVxdWlyZSIsICJjb250ZXh0IiwgImludGVyYWN0aW9uTW9kdWxlcyIsICJtb2R1bGVzIiwgIm1vZHVsZSIsICJwcmltYXJ5UGF0aCIsICJmYWxsYmFja1BhdGgiLCAicGF0aHMiLCAiZXhpc3RpbmdQYXRoIiwgInBhdGgxIiwgInBhdGgyIiwgInBhdGgxQXJyYXkiLCAicGF0aDJBcnJheSIsICJzdHIiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiVG91Y2hEcmFnQW5kRHJvcCIsICJfVG91Y2hEcmFnQW5kRHJvcCIsICJ0eXBlIiwgInZhbCIsICJlIiwgIl90b3VjaGVzIiwgImVsZW1lbnRTdHlsZXMiLCAic3R5bGUiLCAiX3RoaXMiLCAidGFyZ2V0IiwgImRyYWdnYWJsZXMiLCAiZWwiLCAieCIsICJ5IiwgIl9hIiwgImV2ZW50IiwgInBvaW50RnJvbVRvdWNoRXZlbnQiLCAidmlzaXRlZCIsICJyb290IiwgIm5lc3RlZEVsIiwgInBhZ2UiLCAidG91Y2giLCAiY2xpZW50UmVjdCIsICJldmVudFR5cGUiLCAiYnViYmxlIiwgInByb3BlcnR5IiwgIkRyb3BwYWJsZXNNaXhpbiIsICJzdXBlckNsYXNzIiwgImRyb3BwYWJsZXNJblNoYWRvd1Jvb3QiLCAiZHJvcHBhYmxlc1NlbGVjdG9yIiwgIkRyb3BwYWJsZXNFbGVtZW50IiwgImNoYW5nZWRQcm9wcyIsICJkcm9wcGFibGVzIiwgImQiLCAiZHJvcHBhYmxlIiwgIm11dGF0aW9ucyIsICJtdXRhdGlvbiIsICJfYSIsICJldiIsICJkcmFnZ2FibGVJbkxpZ2h0RG9tIiwgImRyYWdnYWJsZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiRmxpcHBhYmxlc01peGluIiwgInN1cGVyQ2xhc3MiLCAiZHJvcHBhYmxlc1NlbCIsICJkcmFnZ2FibGVzU2VsIiwgIkZsaXBwYWJsZXNFbGVtZW50IiwgInByb3BlcnR5IiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJzdXBlckNsYXNzIiwgImRyYWdnYWJsZXNTZWxlY3RvciIsICJkcm9wcGFibGVzSW5TaGFkb3dSb290IiwgImRyb3BwYWJsZXNTZWxlY3RvciIsICJEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCIsICJGbGlwcGFibGVzTWl4aW4iLCAiRHJvcHBhYmxlc01peGluIiwgImV2IiwgImQiLCAiZHJhZ2dhYmxlIiwgImRyYWdzQWRkZWQiLCAiZHJhZ3NSZW1vdmVkIiwgImVsZW0iLCAib2xkIiwgImRyYWdPcHRpb25zIiwgImRpc2FibGVkIiwgInMiLCAiY2giLCAicmVhZG9ubHkiLCAiY2hhbmdlZFByb3BzIiwgIlRvdWNoRHJhZ0FuZERyb3AiLCAicG9zaXRpb24iLCAiaW5kZXgiLCAiaW50ZXJhY3Rpb24iLCAiZ2FwVGV4dCIsICJzYXZlIiwgImNoaWxkcmVuIiwgImRpc2FibGUiLCAicmVzcG9uc2UiLCAiZHJvcElkIiwgImRyYWdJZHMiLCAiZHJvcHBhYmxlIiwgImRyb3AiLCAiZHJhZ0lkIiwgImFzc29jaWF0aW9ucyIsICJkcmFnc0luRHJvcHBhYmxlIiwgImlkZW50aWZpZXJzIiwgImRyb3BwYWJsZUlkZW50aWZpZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImxpdmVRdWVyeSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl8iLCAiaW5kZXgiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlDdXN0b21JbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ1cmlUb01hbmlmZXN0IiwgInJlbW92ZURvdWJsZVNsYXNoZXMiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJlcnIiLCAiaWZyYW1lIiwgImlmcmFtZVdpbiIsICJpZnJhbWVEb2MiLCAiaWZyYW1lc0luU2hhZG93Um9vdCIsICJvdXRlcklGcmFtZXMiLCAiaWZyYW1lU3JjIiwgIm91dGVyRG9jIiwgImUiLCAiaW5kZXgiLCAiaWZyYW1lRG9jdW1lbnQiLCAiaWZyYW1lcyIsICJuZXN0ZWREb2MiLCAidHlwZSIsICJldmVudCIsICJtZWRpYURhdGEiLCAibWVkaWEiLCAidmFsIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInZhbHVlIiwgIm1hdGNoZXMiLCAicmVzcG9uc2UiLCAieCIsICJzcGxpdCIsICJnYXAiLCAiaW5kZXgiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaWRlbnRpZmllciIsICJ0ZXh0SWRlbnRpZmllciIsICJ0ZXh0IiwgInRleHRTcGFuIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdmciLCAiY3VzdG9tRWxlbWVudCIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgInJlcGVhdCIsICJwb3NpdGlvbkhvdHNwb3RzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJpbWciLCAiaG90c3BvdCIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImNlbnRlclhQZXIiLCAiY2VudGVyWVBlciIsICJyYWRpdXNQZXIiLCAibGVmdFgiLCAidG9wWSIsICJyaWdodFgiLCAiYm90dG9tWSIsICJsZWZ0WFBlciIsICJ0b3BZUGVyIiwgInJpZ2h0WFBlciIsICJib3R0b21ZUGVyIiwgInBvbHljb29yZHMiLCAiYWNjIiwgImN1cnJlbnRWYWx1ZSIsICJjdXJyZW50SW5kZXgiLCAicG9seUMiLCAibGFzdFZhbCIsICJwb2ludCIsICJwb2x5RCIsICJwIiwgIlF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgImxpbmUiLCAiaW5kZXgiLCAic3ZnIiwgImUiLCAiXyIsICJpIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImV2ZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicXVlcnkiLCAicXVlcnlBc3NpZ25lZEVsZW1lbnRzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiZSIsICJpbWciLCAiaG90c3BvdCIsICJjb29yZHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgInMiLCAiY2VudGVyWCIsICJjZW50ZXJZIiwgInJhZGl1cyIsICJsZWZ0WCIsICJ0b3BZIiwgInJpZ2h0WCIsICJib3R0b21ZIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24iLCAiQ2hvaWNlc01peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJlIiwgImlkZW50aWZpZXIiLCAiaG90c3BvdCIsICJlbCIsICJtYXhTZWxlY3Rpb24iLCAiaSIsICJpbWciLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3RzcG90SW50ZXJhY3Rpb24iLCAiQ2hvaWNlc01peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIlF0aU1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkxpdEVsZW1lbnQiLCAicmFkaW8iLCAiY2hlY2tib3giLCAidmFsdWUiLCAibmFtZSIsICJ0eXBlIiwgInYiLCAicmVzcG9uc2VWYWx1ZSIsICJodG1sIiwgImNvbCIsICJpIiwgInVuc2FmZUhUTUwiLCAicm93IiwgInJJbmRleCIsICJjSW5kZXgiLCAicm93SWQiLCAiY29sSWQiLCAic2VsZWN0ZWRJblJvd0NvdW50IiwgImNoZWNrZWQiLCAicGFydCIsICJkaXNhYmxlIiwgImUiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpTWVkaWFJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiX19zcHJlYWRQcm9wcyIsICJfX3NwcmVhZFZhbHVlcyIsICJodG1sIiwgIm1lZGlhT2JqZWN0IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJRdGlPcmRlckludGVyYWN0aW9uIiwgIlNodWZmbGVNaXhpbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJjaG9pY2VzIiwgImh0bWwiLCAiXyIsICJpIiwgInVuc2FmZUhUTUwiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAiaW5kZXgiLCAic2ltcGxlQ2hvaWNlIiwgInRleHQiLCAiZHJvcHBhYmxlIiwgImRyYWdzSW5Ecm9wcGFibGUiLCAiZCIsICJjaGFuZ2VkUHJvcHMiLCAiZWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiUXRpU1Bvc2l0aW9uT2JqZWN0SW50ZXJhY3Rpb24iLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImV2ZW50IiwgImRlbHRhWCIsICJkZWx0YVkiLCAiYSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJyZXBlYXQiLCAic3R5bGVNYXAiLCAiUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJldmVudCIsICJ4IiwgInkiLCAiaHRtbCIsICJyZXBlYXQiLCAicG9pbnQiLCAiaW5kZXgiLCAic3R5bGVNYXAiLCAiZSIsICJfIiwgImkiLCAidmFsIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJub3RoaW5nIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicXVlcnkiLCAiUXRpU2xpZGVySW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAib2xkIiwgImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInZhbHVlIiwgIm15UmVzcG9uc2UiLCAidmFsdWVQZXJjZW50YWdlIiwgImh0bWwiLCAibm90aGluZyIsICJldmVudCIsICJoYW5kbGVUb3VjaE1vdmUiLCAieCIsICJkaWZmWCIsICJoYW5kbGVUb3VjaEVuZCIsICJoYW5kbGVNb3VzZU1vdmUiLCAiaGFuZGxlTW91c2VVcCIsICJ2YWx1ZU5vdyIsICJyb3VuZGVkU3RlcFZhbHVlIiwgIl90b3VjaE1vdmUiLCAiZXZ0IiwgInRvdWNoIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgIlF0aUN1c3RvbU9wZXJhdG9yIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJldmVudCIsICJfYSIsICJfYiIsICJfYyIsICJjb21tZW50Tm9kZSIsICJub2RlIiwgImUiLCAiZm4iLCAicmVzcG9uc2VJZGVudGlmaWVyIiwgInYiLCAiaXRlbSIsICJ2YXJpYWJsZUlkZW50aWZpZXIiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQXNzb2NpYWJsZUhvdHNwb3QiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXBJbWciLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUdhcFRleHQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlIb3RzcG90Q2hvaWNlIiwgIlF0aUNob2ljZSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3R0ZXh0IiwgIlF0aUNob2ljZSIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpSW5saW5lQ2hvaWNlIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAibm90aGluZyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aVNpbXBsZUNob2ljZSIsICJRdGlDaG9pY2UiLCAiaHRtbCIsICJub3RoaW5nIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K
695
+ `,n([cn({type:String,attribute:!1})],le.prototype,"marker",2),le=n([ln("qti-simple-choice")],le);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{M as ActiveElementMixin,f as Interaction,Be as QtiAnd,q as QtiAssessmentItem,W as QtiAssessmentStimulusRef,Le as QtiAssociableHotspot,ee as QtiAssociateInteraction,Xe as QtiBaseValue,J as QtiChoiceInteraction,Ne as QtiCompanionMaterialsInfo,w as QtiConditionExpression,ct as QtiContains,Ve as QtiContentBody,pt as QtiCorrect,N as QtiCustomInteraction,ke as QtiCustomOperator,te as QtiEndAttemptInteraction,je as QtiEqual,Ye as QtiEqualRounded,m as QtiExpression,k as QtiExtendedTextInteraction,de as QtiFeedbackBlock,ue as QtiFeedbackInline,se as QtiGap,oe as QtiGapImg,xe as QtiGapMatchInteraction,ne as QtiGapText,V as QtiGraphicAssociateInteraction,Ee as QtiGraphicGapMatchInteraction,Ce as QtiGraphicOrderInteraction,dt as QtiGt,ut as QtiGte,ae as QtiHotspotChoice,qe as QtiHotspotInteraction,Re as QtiHottext,Oe as QtiHottextInteraction,Me as QtiInlineChoice,F as QtiInlineChoiceInteraction,mt as QtiIsNull,Fe as QtiLookupOutcomeValue,ht as QtiLt,ft as QtiLte,ze as QtiMapResponse,G as QtiMapping,bt as QtiMatch,Y as QtiMatchInteraction,we as QtiMediaInteraction,vt as QtiMember,me as QtiModalFeedback,yt as QtiMultiple,xt as QtiNot,Et as QtiOr,I as QtiOrderInteraction,Ct as QtiOrdered,A as QtiOutcomeDeclaration,fe as QtiOutcomeProcessing,st as QtiOutcomeProcessingProcessor,B as QtiPortableCustomInteraction,Se as QtiPositionObjectStage,ve as QtiPrintedVariable,qt as QtiProduct,_e as QtiPrompt,ot as QtiResponseCondition,P as QtiResponseDeclaration,ge as QtiResponseElse,lt as QtiResponseElseIf,be as QtiResponseIf,z as QtiResponseProcessing,_ as QtiRubricBlock,D as QtiRule,Ze as QtiSPositionObjectInteraction,j as QtiSelectPointInteraction,nt as QtiSetOutcomeValue,at as QtiSetOutcomeValueRule,X as QtiSimpleAssociableChoice,le as QtiSimpleChoice,E as QtiSliderInteraction,Ke as QtiStringMatch,De as QtiStylesheet,Tt as QtiSum,wt as QtiSumExpression,L as QtiTextEntryInteraction,St as QtiVariable,R as itemContext,Ht as itemContextVariables,Qi as qtiAndMixin};
696
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1ydWxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWFwaS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJvcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZmxpcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHByb3ZpZGUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHMsIE91dGNvbWVDaGFuZ2VkRGV0YWlscyB9IGZyb20gJy4uL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVWYWx1ZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUsIFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2snO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFF0aVJlc3BvbnNlUHJvY2Vzc2luZyB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCwgaXRlbUNvbnRleHRWYXJpYWJsZXMgfSBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICBwcml2YXRlIF9jb250ZXh0OiBJdGVtQ29udGV4dCA9IHtcbiAgICBpZGVudGlmaWVyOiB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgIHZhcmlhYmxlczogaXRlbUNvbnRleHRWYXJpYWJsZXNcbiAgfTtcblxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh7XG4gICAgICBpZGVudGlmaWVyOiB2LmlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgIHR5cGU6IHYudHlwZSxcbiAgICAgIC8vIGFkZCBleHRlcm5hbHNjb3JlZCwgYSBmaXhlZCBwcm9wIHRvIHRoZSB0ZXN0LCBzbyB0aGUgdGVzdGNvbnRleHQgY2FuIHJlYWQgYW5kIGRlY2lkZSBob3cgdG8gc2NvcmUgdGhpcyBpdGVtXG4gICAgICAuLi4odi50eXBlID09PSAnb3V0Y29tZScgJiYgdi5pZGVudGlmaWVyID09PSAnU0NPUkUnXG4gICAgICAgID8geyBleHRlcm5hbFNjb3JlZDogKHYgYXMgT3V0Y29tZVZhcmlhYmxlKS5leHRlcm5hbFNjb3JlZCB9XG4gICAgICAgIDoge30pXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YXJpYWJsZXModmFsdWU6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5zb21lKHYgPT4gISgnaWRlbnRpZmllcicgaW4gdikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhcmlhYmxlcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgVmFyaWFibGVEZWNsYXJhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQucmVzcG9uc2UgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgZSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGludGVyYWN0aW9uICYmIChpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb2Nlc3NSZXNwb25zZShjb3VudE51bUF0dGVtcHRzOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3BvbnNlUHJvY2Vzc29yID0gdGhpcy5xdWVyeVNlbGVjdG9yPFF0aVJlc3BvbnNlUHJvY2Vzc2luZz4oJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJyk7XG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvcikge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSBwcm9jZXNzaW5nIHRlbXBsYXRlIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2Ugd2ViY29tcG9uZW50cyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VQcm9jZXNzb3IucHJvY2VzcygpO1xuXG4gICAgaWYgKHRoaXMuYWRhcHRpdmUgPT09ICdmYWxzZScpIHtcbiAgICAgIC8vIGlmIGFkYXB0aXZlLCBjb21wbGV0aW9uU3RhdHVzIGlzIHNldCBieSB0aGUgcHJvY2Vzc2luZyB0ZW1wbGF0ZVxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoJ2NvbXBsZXRpb25TdGF0dXMnLCB0aGlzLl9nZXRDb21wbGV0aW9uU3RhdHVzKCkpO1xuICAgIH1cblxuICAgIGNvdW50TnVtQXR0ZW1wdHMgJiZcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG5cbiAgICB0aGlzLl9lbWl0KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2VkJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRSZXNwb25zZXMoKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2luaXRpYWxDb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3BvbnNlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFJlc3BvbnNlVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldE91dGNvbWUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8T3V0Y29tZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldFZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPj4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICB9XG5cbiAgLy8gc2F2aW5nIHByaXZhdGVzIGhlcmU6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaGFuZGxlVXBkYXRlUmVzcG9uc2VWYXJpYWJsZShldmVudDogQ3VzdG9tRXZlbnQ8UmVzcG9uc2VJbnRlcmFjdGlvbj4pIHtcbiAgICBjb25zdCB7IHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UgfSA9IGV2ZW50LmRldGFpbDtcbiAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUmVzcG9uc2VWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyID8gdiA6IHsgLi4udiwgdmFsdWU6IHZhbHVlIH0pKVxuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0PEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHM+KCdxdGktaW50ZXJhY3Rpb24tY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWRhcHRpdmUgPT09ICdmYWxzZScpIHtcbiAgICAgIC8vIGlmIGFkYXBhdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlT3V0Y29tZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5nZXRPdXRjb21lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFvdXRjb21lVmFyaWFibGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuIG5vdCBzZXQgcXRpLW91dGNvbWUtaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfSwgaXQgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiB7XG4gICAgICAgIGlmICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IG91dGNvbWVWYXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgPyB2YWx1ZSA6IFsuLi52LnZhbHVlLCB2YWx1ZSBhcyBzdHJpbmddXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG4gICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5mb3JFYWNoKGZlID0+IGZlLmNoZWNrU2hvd0ZlZWRiYWNrKGlkZW50aWZpZXIpKTtcblxuICAgIHRoaXMuX2VtaXQ8T3V0Y29tZUNoYW5nZWREZXRhaWxzPigncXRpLW91dGNvbWUtY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIG91dGNvbWVJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpPy52YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29tcGxldGlvblN0YXR1cygpOiAnY29tcGxldGVkJyB8ICdpbmNvbXBsZXRlJyB8ICdub3RfYXR0ZW1wdGVkJyB8ICd1bmtub3duJyB7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZXZlcnkoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdjb21wbGV0ZWQnO1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLnNvbWUoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdpbmNvbXBsZXRlJztcbiAgICByZXR1cm4gJ25vdF9hdHRlbXB0ZWQnO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdDxUPihuYW1lLCBkZXRhaWwgPSBudWxsKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFQ+KG5hbWUsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nOiBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgVXBkYXRlSGFuZGxlciA9IChwcmV2PzogdW5rbm93biwgbmV4dD86IHVua25vd24pID0+IHZvaWQ7XG5cbnR5cGUgTm9uVW5kZWZpbmVkPEE+ID0gQSBleHRlbmRzIHVuZGVmaW5lZCA/IG5ldmVyIDogQTtcblxudHlwZSBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiBOb25VbmRlZmluZWQ8VFtLXT4gZXh0ZW5kcyBVcGRhdGVIYW5kbGVyID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuaW50ZXJmYWNlIFdhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbiAgd2FpdFVudGlsRmlyc3RVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgd2hlbiBvYnNlcnZlZCBwcm9wZXJ0aWVzIGNoYW5nZSwgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy4gVG8gd2FpdCBmb3IgYW5cbiAqIHVwZGF0ZSB0byBjb21wbGV0ZSBhZnRlciBhIGNoYW5nZSBvY2N1cnMsIHVzZSBgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZWAgaW4gdGhlIGhhbmRsZXIuIFRvIHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZVxuICogaW5pdGlhbCB1cGRhdGUvcmVuZGVyLCB1c2UgYHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfWAgb3IgYHRoaXMuaGFzVXBkYXRlZGAgaW4gdGhlIGhhbmRsZXIuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogQHdhdGNoKCdwcm9wTmFtZScpXG4gKiBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICogICAuLi5cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoKHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnMpIHtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxXYXRjaE9wdGlvbnM+ID0ge1xuICAgIHdhaXRVbnRpbEZpcnN0VXBkYXRlOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4ocHJvdG86IEVsZW1DbGFzcywgZGVjb3JhdGVkRm5OYW1lOiBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPEVsZW1DbGFzcz4pID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgY29uc3QgeyB1cGRhdGUgfSA9IHByb3RvO1xuICAgIGNvbnN0IHdhdGNoZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0eU5hbWUpID8gcHJvcGVydHlOYW1lIDogW3Byb3BlcnR5TmFtZV07XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcywgY2hhbmdlZFByb3BzOiBNYXA8a2V5b2YgRWxlbUNsYXNzLCBFbGVtQ2xhc3Nba2V5b2YgRWxlbUNsYXNzXT4pIHtcbiAgICAgIHdhdGNoZWRQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eSBhcyBrZXlvZiBFbGVtQ2xhc3M7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGNoYW5nZWRQcm9wcy5nZXQoa2V5KTtcbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZWRPcHRpb25zLndhaXRVbnRpbEZpcnN0VXBkYXRlIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGUuY2FsbCh0aGlzLCBjaGFuZ2VkUHJvcHMpO1xuICAgIH07XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJdGVtQ29udGV4dCB7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgdmFyaWFibGVzOiBSZWFkb25seUFycmF5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+Pjtcbn1cblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0VmFyaWFibGVzID0gW1xuICB7XG4gICAgaWRlbnRpZmllcjogJ2NvbXBsZXRpb25TdGF0dXMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ3N0cmluZycsXG4gICAgdmFsdWU6ICd1bmtub3duJyxcbiAgICB0eXBlOiAnb3V0Y29tZSdcbiAgfSxcbiAge1xuICAgIGlkZW50aWZpZXI6ICdudW1BdHRlbXB0cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgdmFsdWU6ICcwJyxcbiAgICB0eXBlOiAncmVzcG9uc2UnXG4gIH1cbl0gYXMgVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXTtcblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0ID0gY3JlYXRlQ29udGV4dDxJdGVtQ29udGV4dD4oJ2l0ZW0nKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSB9IGZyb20gJy4uLy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjdXN0b20gZWxlbWVudCBmb3IgcmVmZXJlbmNpbmcgYW4gYXNzZXNzbWVudCBzdGltdWx1cy5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZicpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaHJlZiBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaHJlZiA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgaWYgdGhlICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJyBldmVudCBpcyBub3QgcHJldmVudGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBpc1ByZXZlbnRlZCA9IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcblxuICAgICAgY29uc3Qgc3RpbXVsdXNSZWYgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0aW11bHVzLWlkcmVmPSR7dGhpcy5pZGVudGlmaWVyfV1gKTtcbiAgICAgIGlmIChzdGltdWx1c1JlZikge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkucGF0aChwYXRoKS5odG1sZG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykgeyAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlciwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydGVyIHRvIGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMgZm9yIEFSSUEgcHJvcGVydGllcyxcbiAqIGVuc3VyaW5nIHRoZXkgYXJlIHNldCBhcyAndHJ1ZScgb3IgJ2ZhbHNlJyBzdHJpbmdzLlxuICovXG5jb25zdCBhcmlhQm9vbGVhbkNvbnZlcnRlcjogQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxib29sZWFuLCBib29sZWFuPiA9IHtcbiAgdG9BdHRyaWJ1dGU6ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJyksXG4gIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdmFsdWUgPT09ICd0cnVlJ1xufTtcblxuLyoqXG4gKiBBIG1peGluIHRoYXQgYWRkcyBjaG9pY2UgZnVuY3Rpb25hbGl0eSB0byBhIExpdEVsZW1lbnQtYmFzZWQgY2xhc3MuXG4gKiBJdCBkaXNwYXRjaGVzIGV2ZW50cyB3aXRoIGEgY3VzdG9tIGB0eXBlYCBhbmQgaGFuZGxlcyBzZWxlY3Rpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIEJhc2UgLSBUaGUgYmFzZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjaG9pY2UsIHVzZWQgaW4gZXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIG5ldyBjbGFzcyBleHRlbmRpbmcgdGhlIGJhc2UgY2xhc3Mgd2l0aCBjaG9pY2UgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFjdGl2ZUVsZW1lbnRNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQsIHR5cGU6IHN0cmluZykge1xuICBjbGFzcyBRdGlDaG9pY2UgZXh0ZW5kcyBCYXNlIHtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgaWRlbnRpZmllciA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICd0YWJpbmRleCcgfSlcbiAgICBwdWJsaWMgdGFiSW5kZXggPSAwO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1kaXNhYmxlZCcsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJbnRlcm5hbFN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbikge1xuICAgICAgaWYgKHZhbHVlICYmICF0aGlzLl9pbnRlcm5hbHMuc3RhdGVzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zdGF0ZXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiB0aGlzLl9pbnRlcm5hbHMuc3RhdGVzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zdGF0ZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8Q2hvaWNlSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGluSW50ZXJhY3Rpb24gJiYgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVMaW5rOiBIVE1MU3R5bGVFbGVtZW50IHwgSFRNTExpbmtFbGVtZW50O1xuXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gIC8vICAgcmV0dXJuIHRoaXM7XG4gIC8vIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgaXRlbSA9IHRoaXM7XG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICBpZiAobGluayAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgaXRlbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgdGhpcy5zdHlsZUxpbmsgPSBzdHlsZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgIHN0eWxlcy50ZXh0Q29udGVudCA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgICBpdGVtLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB0aGlzLnN0eWxlTGluayA9IHN0eWxlcztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5zdHlsZUxpbmspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3R5bGVMaW5rLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc3R5bGVzaGVldCc6IFF0aVN0eWxlc2hlZXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MLnRyaW0oKSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMubGVuZ3RoID4gMSB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNbMF07XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nOiBRdGlWYXJpYWJsZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlNYXBwaW5nIH0gZnJvbSAnLi4vLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcHBpbmcvcXRpLW1hcHBpbmcnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHtcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY29ycmVjdFJlc3BvbnNlOiB0aGlzLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5IHx8ICdzaW5nbGUnLFxuICAgICAgbWFwcGluZzogdGhpcy5tYXBwaW5nLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgY2FuZGlkYXRlUmVzcG9uc2U6IG51bGxcbiAgICB9O1xuICAgIHJlc3BvbnNlVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMocmVzcG9uc2VWYXJpYWJsZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogcmVzcG9uc2VWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIGNvbnN0IGNvcnJlY3RSZXNwb25zZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICBpZiAoY29ycmVjdFJlc3BvbnNlKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBjb3JyZWN0UmVzcG9uc2UucXVlcnlTZWxlY3RvckFsbCgncXRpLXZhbHVlJyk7XG4gICAgICBpZiAodGhpcy5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdLnRleHRDb250ZW50O1xuICAgICAgICB2YWx1ZXNbMF0ucmVtb3ZlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlc1tpXS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgdmFsdWVzW2ldLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBtYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1tYXBwaW5nJykgYXMgUXRpTWFwcGluZztcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nOiBRdGlSZXNwb25zZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbycpXG5leHBvcnQgY2xhc3MgUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvLyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAvLyAgIHNsb3Qge1xuICAvLyAgICAgZGlzcGxheTogaGlkZGVuO1xuICAvLyAgIH1cbiAgLy8gYDtcbiAgLy8gb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAvLyAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+IGA7XG4gIC8vIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbyc6IFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm87XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29udGVudC1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlDb250ZW50Qm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb250ZW50LWJvZHknOiBRdGlDb250ZW50Qm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVicmljLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlSdWJyaWNCbG9jayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgb3ZlcnJpZGUgaWQ7IC8vID1cInF0aUFzcGVjdEluaG91ZFJ1YnJpY0Jsb2NrXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdXNlOiAnaW5zdHJ1Y3Rpb25zJyB8ICdzY29yaW5nJyB8ICduYXZpZ2F0aW9uJzsgLy8gID0gXCJzY29yaW5nXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdmlldzogJ2F1dGhvcicgfCAnY2FuZGlkYXRlJyB8ICdwcm9jdG9yJyB8ICdzY29yZXInIHwgJ3Rlc3RDb25zdHJ1Y3RvcicgfCAndHV0b3InO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuY2xhc3NOYW1lcy5zcGxpdCgnICcpO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtZGlzY3JldGlvbmFyeS1wbGFjZW1lbnQnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1pbmxpbmUnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBieSBkZWZhdWx0IHB1dCB0aGlzIGluIGEgc2xvdCBpbiB0aGUgaXRlbS1ib2R5XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWJyaWMtYmxvY2snOiBRdGlSdWJyaWNCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IFByb3BlcnR5VmFsdWVNYXAsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0Jsb2NrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub24ge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cImZlZWRiYWNrICR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1Nob3dGZWVkYmFjayh0aGlzLm91dGNvbWVJZGVudGlmaWVyKTtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWJsb2NrJzogUXRpRmVlZGJhY2tCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5pbXBvcnQgeyBJc051bGxPclVuZGVmaW5lZCB9IGZyb20gJy4uL2ludGVybmFsL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUZlZWRiYWNrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnc2hvdy1oaWRlJyB9KVxuICBwcm90ZWN0ZWQgc2hvd0hpZGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ291dGNvbWUtaWRlbnRpZmllcicgfSlcbiAgcHVibGljIG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHByb3RlY3RlZCBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzaG93U3RhdHVzOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tTaG93RmVlZGJhY2sob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZykgeyAgICBcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSAodGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW0pLmdldE91dGNvbWUob3V0Y29tZUlkZW50aWZpZXIpO1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2staW5saW5lJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0lubGluZSBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2staW5saW5lJzogUXRpRmVlZGJhY2tJbmxpbmU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tb2RhbC1mZWVkYmFjaycpXG5leHBvcnQgY2xhc3MgUXRpTW9kYWxGZWVkYmFjayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbW9kYWwtZmVlZGJhY2snOiBRdGlNb2RhbEZlZWRiYWNrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyByZWYsIGNyZWF0ZVJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdxdGktaGVpZ2h0LWxpbmVzLScpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaGVpZ2h0LWxpbmVzLScsICcnKTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHBhcnNlSW50KG5yUm93cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHJlc3BvbnNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJyc7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKCFpbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YXNldC5wYXR0ZXJubWFza01lc3NhZ2UgfHwgJ0ludmFsaWQgaW5wdXQnKTtcbiAgICAgICAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7IC8vIFNob3cgdGhlIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gdmFsaWRpdHkgbWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgfX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIHJvd3M9XCIke3RoaXMuX3Jvd3N9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgICAudmFsdWU9JHt0aGlzLl92YWx1ZX1cbiAgICAgID48L3RleHRhcmVhPmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW50ZXJhY3Rpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcblxuICAvKiogZGlzYWJsZWQgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiByZWFkb25seSBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcbiAgYWJzdHJhY3Qgc2V0IHJlc3BvbnNlKHZhbDogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KTtcbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWw6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIGNvbnNvbGUud2FybignY29ycmVjdFJlc3BvbnNlIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvcnJlY3RWYWx1ZSA9ICcnO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3NpemUgPSA1O1xuXG4gIGlucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHNldCByZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJztcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29ycmVjdFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKCFpbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YXNldC5wYXR0ZXJubWFza01lc3NhZ2UgfHwgJ0ludmFsaWQgaW5wdXQnKTtcbiAgICAgICAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7IC8vIFNob3cgdGhlIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gdmFsaWRpdHkgbWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb3JyZWN0XCI+JHt0aGlzLl9jb3JyZWN0VmFsdWV9PC9kaXY+XG4gICAgYDtcbiAgfVxuICAvL1xuICAvLyBtYXhsZW5ndGg9XCIke2lmRGVmaW5lZCh0aGlzLmV4cGVjdGVkTGVuZ3RoID8gdGhpcy5leHBlY3RlZExlbmd0aCA6IHVuZGVmaW5lZCl9XCJcblxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJzogUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgW3BhcnQ9J2NvcnJlY3QnXSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxLjFyZW07XG4gICAgbWluLXdpZHRoOiAxLjFyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMi4zcmVtO1xuICAgIG1pbi13aWR0aDogMi4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMuM3JlbTtcbiAgICBtaW4td2lkdGg6IDMuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0LjJyZW07XG4gICAgbWluLXdpZHRoOiA0LjJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTYpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNi42cmVtO1xuICAgIG1pbi13aWR0aDogNi42cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA4cmVtO1xuICAgIG1pbi13aWR0aDogOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTJyZW07XG4gICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTdyZW07XG4gICAgbWluLXdpZHRoOiAxN3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgbWluLXdpZHRoOiAyMHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjRyZW07XG4gICAgbWluLXdpZHRoOiAyNHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjhyZW07XG4gICAgbWluLXdpZHRoOiAyOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzJyZW07XG4gICAgbWluLXdpZHRoOiAzMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzZyZW07XG4gICAgbWluLXdpZHRoOiAzNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNDByZW07XG4gICAgbWluLXdpZHRoOiA0MHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNzIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNTdyZW07XG4gICAgbWluLXdpZHRoOiA1N3JlbTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHRJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gJy4uL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZTtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VzSW50ZXJmYWNlIHtcbiAgdmFsaWRhdGUoKTogYm9vbGVhbjtcbiAgX2Nob2ljZUVsZW1lbnRzOiBBcnJheTxDaG9pY2U+O1xuICBjb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ2hvaWNlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHB1YmxpYyBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICAgIHB1YmxpYyByZXNwb25zZUlkZW50aWZpZXIgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1pbkNob2ljZXMgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcycgfSkgbWF4Q2hvaWNlcyA9IDE7XG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlKF9vbGRWYWx1ZTogbnVtYmVyLCBfbmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgfVxuXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gICAgfTtcblxuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4gKGNob2ljZS5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSkubGVuZ3RoO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyAhPT0gMCAmJiBzZWxlY3RlZENvdW50ID4gdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RlZENvdW50ID49IHRoaXMubWluQ2hvaWNlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJlc3BvbnNlKHJlc3BvbnNlVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSA/IHJlc3BvbnNlVmFsdWUgOiBbcmVzcG9uc2VWYWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkgPyByZXNwb25zZVZhbHVlIDogW3Jlc3BvbnNlVmFsdWVdO1xuICAgICAgaWYgKHJlc3BvbnNlQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgICBjaG9pY2UucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLnNldEF0dHJpYnV0ZSgnZGF0YS1jb3JyZWN0LXJlc3BvbnNlJywgcmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHF0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbmAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICBjaG9pY2VFbGVtZW50LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IGNob2ljZSAhPT0gY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50OiBDaG9pY2UpIHtcbiAgICAgIGNob2ljZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4pIHtcbiAgICAgIHRoaXMuX3RvZ2dsZUNob2ljZUNoZWNrZWQoZXZlbnQudGFyZ2V0IGFzIENob2ljZSk7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgICBpZiAoY2hvaWNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlLCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICBjaG9pY2Uuc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCBjaGVja2VkLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuZ2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnKSA9PT0gJ3RydWUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIHNlbGVjdGlvbiBvZiBjaG9pY2VzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZmlsdGVycyB0aGUgY2hvaWNlIGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIGNoZWNrZWQgc3RhdGUgYW5kIHJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgaWRlbnRpZmllcnMuXG4gICAgICogSWYgdGhlIGBtYXhDaG9pY2VzYCBwcm9wZXJ0eSBpcyBzZXQgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMSBhbmQgbm90IGVxdWFsIHRvIDAsIGl0IGRpc2FibGVzIHVuc2VsZWN0ZWQgY2hvaWNlc1xuICAgICAqIHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNob2ljZXMgaXMgcmVhY2hlZC5cbiAgICAgKiBGaW5hbGx5LCBpdCBzYXZlcyB0aGUgcmVzcG9uc2UgYmFzZWQgb24gdGhlIGBtYXhDaG9pY2VzYCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxICYmIHRoaXMubWF4Q2hvaWNlcyAhPT0gMCkge1xuICAgICAgICBjb25zdCBkaXNhYmxlVW5zZWxlY3RlZCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGggPj0gdGhpcy5tYXhDaG9pY2VzO1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpIHtcbiAgICAgICAgICAgIGNob2ljZS5kaXNhYmxlZCA9IGRpc2FibGVVbnNlbGVjdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJlc3BvbnNlIGZyb20gdGhlIGludGVyYWN0aW9uLlxuICAgICAgICogSWYgYG1heENob2ljZXNgIGlzIDEsIGl0IHdpbGwgYmUgdGhlIHNlbGVjdGVkIGlkZW50aWZpZXIgb3IgYHVuZGVmaW5lZGAgaWYgbm8gaWRlbnRpZmllciBpcyBzZWxlY3RlZC5cbiAgICAgICAqIElmIGBtYXhDaG9pY2VzYCBpcyBncmVhdGVyIHRoYW4gMSwgaXQgd2lsbCBiZSBhbiBhcnJheSBvZiBzZWxlY3RlZCBpZGVudGlmaWVycy5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8IHVuZGVmaW5lZCA6IHNlbGVjdGVkSWRlbnRpZmllcnM7XG4gICAgICB0aGlzLl9zYXZlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2F2ZVJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENob2ljZXNNaXhpbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Q2hvaWNlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgT3B0aW9uVHlwZSB7XG4gIHRleHRDb250ZW50OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xufVxuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHNsb3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBbcm9sZT0nbWVudSddIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgei1pbmRleDogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAuYW5jaG9yIHtcbiAgICAgICAgICAvKiBhbmNob3ItbmFtZTogLS1pbmZvYm94OyAqL1xuICAgICAgICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wb3NpdGlvbmVkRWxlbWVudCB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIC8qIHBvc2l0aW9uLWFuY2hvcjogLS1pbmZvYm94OyAqL1xuICAgICAgICAgIC8qIHRvcDogYW5jaG9yKGJvdHRvbSk7ICovXG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbnB1dFdpZHRoQ2xhc3MgPSBbXG4gICAgJycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC00JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTYnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTUnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMjAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNzInXG4gIF07XG5cbiAgQHN0YXRlKCkgb3B0aW9uczogT3B0aW9uVHlwZVtdID0gW107XG5cbiAgQHN0YXRlKCkgY29ycmVjdE9wdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0YS1wcm9tcHQnLCB0eXBlOiBTdHJpbmcgfSlcbiAgZGF0YVByb21wdDogc3RyaW5nID0gJ3NlbGVjdCc7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNlbGVjdCBwYXJ0PVwic2VsZWN0XCIgQGNoYW5nZT1cIiR7dGhpcy5jaG9pY2VTZWxlY3RlZH1cIiA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCIgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiPlxuICAgICAgICAke3RoaXMub3B0aW9ucy5tYXAoXG4gICAgICAgICAgb3B0aW9uID0+IGh0bWxgXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiJHtvcHRpb24udmFsdWV9XCIgP3NlbGVjdGVkPVwiJHtvcHRpb24uc2VsZWN0ZWR9XCI+JHt1bnNhZmVIVE1MKG9wdGlvbi50ZXh0Q29udGVudCl9PC9vcHRpb24+XG4gICAgICAgICAgYFxuICAgICAgICApfVxuICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICR7dW5zYWZlSFRNTCh0aGlzLmNvcnJlY3RPcHRpb24pfVxuICAgIGA7XG4gIH1cblxuICAvKlxuICAgIDxkZXRhaWxzIGNsYXNzPVwiYW5jaG9yXCI+XG4gICAgICA8c3VtbWFyeT4ke3RoaXMuZGF0YVByb21wdH08L3N1bW1hcnk+XG5cbiAgICAgIDxkaXYgcm9sZT1cIm1lbnVcIiBwYXJ0PVwibWVudVwiIGNsYXNzPVwicG9zaXRpb25lZEVsZW1lbnRcIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC9kZXRhaWxzPlxuICAgICovXG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCByZXNwb25zZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgdmFsdWUgPT09IG9wdGlvbi52YWx1ZSAmJiAob3B0aW9uLnNlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ2hvaWNlSW50ZXJhY3Rpb25cbiAgZXh0ZW5kcyBWb2NhYnVsYXJ5TWl4aW4oXG4gICAgU2h1ZmZsZU1peGluKENob2ljZXNNaXhpbihMaXRFbGVtZW50LCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGNsYXNzIFNodWZmbGVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfc2h1ZmZsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBjb252ZXJ0ZXI6IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgc2V0IHNodWZmbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2h1ZmZsZTtcbiAgICAgIHRoaXMuX3NodWZmbGUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCdzaHVmZmxlJywgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBzaHVmZmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3NodWZmbGU7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgLy8gQ2FsbCBfcmVzZXRTaHVmZmxlQ2hvaWNlcyBpbml0aWFsbHkgdG8gc2V0IHRoZSBDU1Mgb3JkZXIgdG8gaW5pdGlhbC5cbiAgICAgIC8vIElmIHNodWZmbGUgaXMgdHJ1ZSwgX3NodWZmbGVDaG9pY2VzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBzZXR0ZXIuXG4gICAgICBpZiAodGhpcy5zaHVmZmxlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKSk7XG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTaHVmZmxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDsgLy8gTWF4IGF0dGVtcHRzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgb3JkZXIgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbLi4ubm9uRml4ZWRFbGVtZW50c107XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gIW5vbkZpeGVkRWxlbWVudHMuZXZlcnkoKGNob2ljZSwgaW5kZXgpID0+IGNob2ljZSA9PT0gb3JpZ2luYWxPcmRlcltpbmRleF0pO1xuXG4gICAgICAgIGlmIChpc1NodWZmbGVkKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NodWZmbGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNodWZmbGUgdGhlIGNob2ljZXMgYWZ0ZXIgbXVsdGlwbGUgYXR0ZW1wdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBvcmRlciB0byBlYWNoIGVsZW1lbnRcbiAgICAgIGxldCBvcmRlciA9IDE7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9uRml4ZWRDaG9pY2UgPSBub25GaXhlZEVsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgbm9uRml4ZWRDaG9pY2UhLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKCt2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgaWYgKGNsYXNzQ29udGFpbnNMYWJlbCkge1xuICAgICAgICBjb25zdCBjaG9pY2VFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoYyA9PiBjIGFzIFF0aVNpbXBsZUNob2ljZSk7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBjaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBlbDogY2hvaWNlLCBvcmRlcjogaXNOdW1iZXIoY2hvaWNlLnN0eWxlLm9yZGVyKSA/ICtjaG9pY2Uuc3R5bGUub3JkZXIgOiBpbmRleCArIDEgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcilcbiAgICAgICAgICAubWFwKGNob2ljZSA9PiBjaG9pY2UuZWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAoY2hvaWNlc1tpXSBhcyBRdGlTaW1wbGVDaG9pY2UpLm1hcmtlciA9IHRoaXMuX2dldExhYmVsKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9nZXRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgICBsZXQgbGFzdExhYmVsID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoYykpLnBvcCgpO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIFtwYXJ0PSdzbG90J10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLXF0aS1nYXAtc2l6ZSk7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG5cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtY2hvaWNlKSB7XG4gICAgZmxleDogMCAwIGNhbGMoKDEwMCUgLSAodmFyKC0tcXRpLWdhcC1zaXplKSAqIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSkgLyB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkgIWltcG9ydGFudDsgXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTEpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAxO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTIpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAyO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0zKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNCkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDQ7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTUpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA1O1xuICB9XG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0ge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFzc2Vzc21lbnRJdGVtLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktbXVsdGlwbGUnOiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IGUgYXMgUXRpTXVsdGlwbGU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtdWx0aXBsZS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiB2YWx1ZXNbMF0uYmFzZVR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlcy5tYXAodiA9PiB2LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ211bHRpcGxlJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktY29ycmVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0UmVzcG9uc2UoaWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogcmVzcG9uc2VWYXJpYWJsZS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogcmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eVxuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAvLyBhZGRlZCBmb3IgdXNlIG9mIHF0aS1lcXVhbC1yb3VuZGVkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gZSBhcyBRdGlFeHByZXNzaW9uPG51bWJlcj47XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXhwcmVzc2lvbi5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2RlZmF1bHQgbm90IHN1ZmZpY2llbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbn1cbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmV4cG9ydCBjbGFzcyBRdGlBbmQgZXh0ZW5kcyBxdGlBbmRNaXhpbihRdGlDb25kaXRpb25FeHByZXNzaW9uIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UXRpQ29uZGl0aW9uRXhwcmVzc2lvbj4pIHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVDaGlsZHJlbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uPGFueT5bXSkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE1vY2tRdGlFeHByZXNzaW9uPFQ+ID0geyBjYWxjdWxhdGU6ICgpID0+IFQgfTtcbnR5cGUgTW9ja0NvbnN0cnVjdG9yID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4ge307XG5leHBvcnQgZnVuY3Rpb24gcXRpQW5kTWl4aW48VEJhc2UgZXh0ZW5kcyBNb2NrQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gIHJldHVybiBjbGFzcyBNb2NrUXRpQW5kIGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIGNhbGN1bGF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBBcnJheTxNb2NrUXRpRXhwcmVzc2lvbjxhbnk+Pikge1xuICAgICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNoaWxkcmVuLm1hcChjID0+IHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBNb2NrUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKSBhcyBCb29sZWFuO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLWFuZCwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpQ29ycmVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgZ2V0IGludGVycHJldGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnaW50ZXJwcmV0YXRpb24nKSB8fCAnJztcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gKHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtKS5nZXRSZXNwb25zZShpZGVudGlmaWVyKTtcbiAgICByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0b2xlcmFuY2VNb2RlOiAnZXhhY3QnIHwgJ3JlbGF0aXZlJyB8ICdhYnNvbHV0ZScgPSAnZXhhY3QnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnRvbGVyYW5jZU1vZGUgIT09ICdleGFjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndG9sZXJhbmNlTW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbCcsIFF0aUVxdWFsKTtcbiIsICJpbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNsYXNzIFNjb3JpbmdIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIGNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxOiBSZWFkb25seTxzdHJpbmc+LCB2YWx1ZTI6IFJlYWRvbmx5PHN0cmluZz4sIGJhc2VUeXBlOiBCYXNlVHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoYmFzZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyO1xuICAgICAgY2FzZSAnaW50ZWdlcic6IHtcbiAgICAgICAgY29uc3QgaW50MSA9IHBhcnNlSW50KHZhbHVlMSwgMTApO1xuICAgICAgICBjb25zdCBpbnQyID0gcGFyc2VJbnQodmFsdWUyLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oaW50MSkgJiYgIWlzTmFOKGludDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGludDEgPT09IGludDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gaW50LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxKTtcbiAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIpO1xuICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICByZXR1cm4gZmxvYXQxID09PSBmbG9hdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY291bGRuJ3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBmbG9hdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhaXInOlxuICAgICAgY2FzZSAnZGlyZWN0ZWRQYWlyJzoge1xuICAgICAgICBjb25zdCBwYWlyMSA9IHZhbHVlMS5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGFpcjIgPSB2YWx1ZTIuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGlmIChwYWlyMS5sZW5ndGggPT09IDIgJiYgcGFpcjIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKGJhc2VUeXBlID09PSAncGFpcicpIHtcbiAgICAgICAgICAgIHBhaXIxLnNvcnQoKTtcbiAgICAgICAgICAgIHBhaXIyLnNvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhaXIxLmpvaW4oJyAnKSA9PT0gcGFpcjIuam9pbignICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvbXBhcmVkIHR3byBwYWlyIGJ1dCBvbmUgb2YgdGhlIHZhbHVlcyBkb2VzIG5vdCBoYXZlIDIgdmFsdWVzOiAxOiAke3ZhbHVlMX0gMjogJHt2YWx1ZTJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwUmVzcG9uc2UgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0UmVzcG9uc2UodGhpcy5pZGVudGlmaWVyKTtcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFJlc3BvbnNlICR7dGhpcy5pZGVudGlmaWVyfSBjYW4gbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IHJlc3BvbnNlLm1hcHBpbmc7XG4gICAgY29uc3QgY2FuZGlkYXRlUmVzcG9uc2VzID0gIUFycmF5LmlzQXJyYXkocmVzcG9uc2UudmFsdWUpID8gW3Jlc3BvbnNlLnZhbHVlXSA6IHJlc3BvbnNlLnZhbHVlO1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlUmVzcG9uc2Ugb2YgY2FuZGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IG1hcHBpbmcubWFwRW50cmllcy5maW5kKGVudHJ5ID0+IHtcbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhlbnRyeS5tYXBLZXksIGNhbmRpZGF0ZVJlc3BvbnNlLCByZXNwb25zZS5iYXNlVHlwZSk7XG4gICAgICB9KTtcbiAgICAgIGlmICghKG1hcHBlZFZhbHVlID09IG51bGwgfHwgbWFwcGVkVmFsdWUubWFwcGVkVmFsdWUgPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGVkVmFsdWUubWFwcGVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGluZy5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLmxvd2VyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5tYXgobWFwcGluZy5sb3dlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAobWFwcGluZy51cHBlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWluKG1hcHBpbmcudXBwZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXAtcmVzcG9uc2UnLCBRdGlNYXBSZXNwb25zZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcHBpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGVmYXVsdC12YWx1ZScsIHR5cGU6IE51bWJlciB9KSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDA7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndXBwZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgdXBwZXJCb3VuZDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgbWFwRW50cmllcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1tYXAtZW50cnknKSkubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hcEtleTogZWwuZ2V0QXR0cmlidXRlKCdtYXAta2V5JyksXG4gICAgICAgIG1hcHBlZFZhbHVlOiArZWwuZ2V0QXR0cmlidXRlKCdtYXBwZWQtdmFsdWUnKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXBwaW5nJywgUXRpTWFwcGluZyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICAvL1BLIDogRklYTUUuXG4gIC8vIFRoaXMgd2FzIGEgbGl0dGxlIGV4cGVyaW1lbnQgaWYgd2UgY291bGQgY2FsbCB0aGUgbWF0Y2ggZnVuY3Rpb24gYXMgYSBzdGF0aWMgZnVuY3Rpb24sXG4gIC8vIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFsbCBraW5kIG9mIHRoaW5ncywgYnV0IG5vdyBlc3BlY2lhbGx5IGZvciB1c2UgaW5cbiAgLy8gcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi1zY3JpcHRcbiAgLy8gaW4gd2hpY2ggd2UgcGFzcyB0aGUgZXhwcmVzc2lvbnMgYXMgcHVyZSBmdW5jdGlvbnMsIGFuZCBob3BlIGZvciB0aGUgYmVzdC5cbiAgLy8gU0FETFksIHRoZSBnZXRWYXJpYWJsZXMgdGhyb3dzIHJvZXQgaW4gZGUgZXRlbi4uIHdlZXQgbm9nIG5pZXQgcHJlY2llcyBob2UgZGV6ZSB3ZXJrdC5cbiAgLy8gTWFhciBpayBnYSBlcmluIGR1aWtlbi5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWVUb01hcCA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IGNvcnJlY3RWYWx1ZUluZm8gPSB2YWx1ZXNbMV07XG4gICAgICByZXR1cm4gUXRpTWF0Y2gubWF0Y2godmFsdWVUb01hcCwgY29ycmVjdFZhbHVlSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWF0Y2godmFsdWVUb01hcDogUmVzcG9uc2VWYXJpYWJsZSwgY29ycmVjdFZhbHVlSW5mbzogUmVzcG9uc2VWYXJpYWJsZSkge1xuICAgIHN3aXRjaCAoY29ycmVjdFZhbHVlSW5mby5jYXJkaW5hbGl0eSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzoge1xuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCBBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlPy50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ29yZGVyZWQnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZVtpXSxcbiAgICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWVbaV0sXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbXVsdGlwbGUnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFuc3dlckluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjb3JyZWN0QW5zd2VyIG9mIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hpbmdWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgY29uc3QgYXJyID0gWy4uLnZhbHVlVG9NYXAudmFsdWVdO1xuICAgICAgICAgIGZvciAoY29uc3QgbXYgb2YgYXJyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoY29ycmVjdEFuc3dlciwgbXYsIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICBtYXRjaGluZ1ZhbHVlID0gbXY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgKGFyciBhcyBzdHJpbmdbXSkuc3BsaWNlKGFyci5pbmRleE9mKG1hdGNoaW5nVmFsdWUpLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbnN3ZXJJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hdGNoJywgUXRpTWF0Y2gpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1lbWJlciBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbiB8IG51bGw+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcblxuICAgIGlmICghKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHRha2VzIHR3byBzdWItZXhwcmVzc2lvbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbdmFsdWUxLCB2YWx1ZTJdID0gdmFsdWVzO1xuXG4gICAgaWYgKCEodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1doaWNoIG11c3QgYm90aCBoYXZlIHRoZSBzYW1lIGJhc2UtdHlwZScpO1xuICAgIH1cbiAgICBpZiAoISh2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2FuZCB0aGUgc2Vjb25kIG11c3QgYmUgYSBtdWx0aXBsZSBvciBvcmRlcmVkIGNvbnRhaW5lcicpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHNob3VsZCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBmbG9hdCcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZHVyYXRpb24nIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKCdJdCBtdXN0IG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGR1cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIHN1Yi1leHByZXNzaW9uIGlzIE5VTEwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRvciBpcyBOVUxMXG4gICAgaWYgKHZhbHVlMS52YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZTIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSByZXN1bHQgaXMgYSBzaW5nbGUgYm9vbGVhbiB3aXRoIGEgdmFsdWUgb2YgJ3RydWUnIGlmIHRoZSB2YWx1ZSBnaXZlbiBieSB0aGUgZmlyc3Qgc3ViLWV4cHJlc3Npb24gaXMgaW4gdGhlIGNvbnRhaW5lciBkZWZpbmVkIGJ5IHRoZSBzZWNvbmQgc3ViLWV4cHJlc3Npb24uXG4gICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWVtYmVyJywgUXRpTWVtYmVyKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpTXVsdGlwbGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnbXVsdGlwbGUnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3QgdmFsdWVzID0gdmFyaWFibGVzLm1hcCh2ID0+IHYudmFsdWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKHZhcmlhYmxlcyk7XG4gICAgLy8gY29uc3QgZmxhdHRlbmVkQXJyYXkgPSB2YWx1ZXMucmVkdWNlKChhY2M6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAvLyAgIHJldHVybiBhY2MuY29uY2F0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlKTtcbiAgICAvLyB9LCBbXSk7XG4gICAgLy8gcmV0dXJuIGZsYXR0ZW5lZEFycmF5O1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tdWx0aXBsZScsIFF0aU11bHRpcGxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlOb3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuICFyZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbm90JywgUXRpTm90KTtcbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlPciBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5tYXAoYyA9PiB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIFF0aUV4cHJlc3Npb248YW55PjtcbiAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxldCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKSBhcyBCb29sZWFuO1xuICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktb3IsIGV4cGVjdGVkIGJvb2xlYW4nKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGNsYXNzIFF0aVByaW50ZWRWYXJpYWJsZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCBhc3Nlc3NtZW50SXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgY29uc3QgcmVzdWx0ID0gYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcikudmFsdWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gKHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKS52YWx1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXZhcmlhYmxlJywgUXRpVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJTVNwY2ksIE1vZHVsZVJlc29sdXRpb25Db25maWcsIFF0aVZhcmlhYmxlSlNPTiB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZGVjbGFyZSBjb25zdCByZXF1aXJlanM6IGFueTtcbmRlY2xhcmUgY29uc3QgZGVmaW5lOiBhbnk7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIGludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGNpOiBJTVNwY2k8dW5rbm93bj47XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgLy8gT25seSBzZXQgc3RhdGUgaXMgc3VwcG9ydGVkIGluIGEgUENJXG4gIH1cblxuICBnZXRUQU9Db25maWcobm9kZSkge1xuICAgIGNvbnN0IGEgPSBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Byb3BlcnRpZXMnKTtcbiAgICBsZXQgY29uZmlnID0ge307XG5cbiAgICBjb25zdCBnZXRQcm9wZXJ0eVZhbHVlID0gZWwgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB7fTtcbiAgICAgIGNvbnN0IGtleSA9IGVsLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IGFsbEtleSA9IGNoaWxkcmVuLm1hcCgoYzogSFRNTEVsZW1lbnQpID0+IGMuZ2V0QXR0cmlidXRlKCdrZXknKSk7XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBhbGxLZXkubGVuZ3RoID4gMCAmJiAhYWxsS2V5LmZpbmQoayA9PiAhTnVtYmVyLmlzSW50ZWdlcigraykpO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBjaGlsZHJlbi5tYXAoYyA9PiBnZXRDaGlsZFByb3BlcnRpZXMoYykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBlbC50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRDaGlsZFByb3BlcnRpZXMgPSAoZWwpOiB7fSB8IHZvaWQgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWwuY2hpbGRyZW4pIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzLCAuLi5nZXRQcm9wZXJ0eVZhbHVlKGNoaWxkKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnRpZXMgb2YgYSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydGllcy5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgY29uZmlnID0geyAuLi5jb25maWcsIC4uLmdldENoaWxkUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NhbiBub3QgZmluZCBxdGktY3VzdG9tLWludGVyYWN0aW9uIGNvbmZpZycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVnaXN0ZXIocGNpOiBJTVNwY2k8dW5rbm93bj4pIHtcbiAgICB0aGlzLnBjaSA9IHBjaTtcblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ1FUSS1DVVNUT00tSU5URVJBQ1RJT04nID8gJ1RBTycgOiAnSU1TJztcbiAgICBjb25zdCBkb206IEhUTUxFbGVtZW50ID1cbiAgICAgIHR5cGUgPT0gJ0lNUycgPyB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tYXJrdXAnKSA6IHRoaXMucXVlcnlTZWxlY3RvcignbWFya3VwJyk7XG4gICAgZG9tLmNsYXNzTGlzdC5hZGQoJ3F0aS1jdXN0b21JbnRlcmFjdGlvbicpO1xuXG4gICAgaWYgKHR5cGUgPT0gJ1RBTycgJiYgdGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykpIHtcbiAgICAgICh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IGFueSA9XG4gICAgICB0eXBlID09ICdJTVMnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5kYXRhc2V0LFxuICAgICAgICAgICAgb25yZWFkeTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25yZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB0aGlzLmdldFRBT0NvbmZpZyh0aGlzKTtcblxuICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgID8gcGNpLmdldEluc3RhbmNlKGRvbSwgY29uZmlnLCB1bmRlZmluZWQpXG4gICAgICA6IChwY2kgYXMgYW55KS5pbml0aWFsaXplKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllciwgZG9tLmZpcnN0RWxlbWVudENoaWxkLCBjb25maWcpO1xuXG4gICAgaWYgKHR5cGUgPT0gJ1RBTycpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmsnKSkubWFwKGFjYyA9PiBhY2MuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgbGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBzdHlsZXMucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBzdHlsZXMudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICBzdHlsZXMuaHJlZiA9IGxpbms7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRDaGVja2luZygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGRlZmluZSgncXRpQ3VzdG9tSW50ZXJhY3Rpb25Db250ZXh0JywgKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaXN0ZXI6IGN0eEEgPT4ge1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY3R4QSk7XG4gICAgICAgIH0sXG4gICAgICAgIG5vdGlmeVJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgLyogb25seSB1c2VkIGluIHRoZSBUQU8gdmVyc2lvbiAqL1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5idWlsZFJlcXVpcmVDb25maWcoKTtcbiAgICBjb25zdCByZXF1aXJlUENJID0gcmVxdWlyZWpzLmNvbmZpZyhjb25maWcpO1xuICAgIHJlcXVpcmVQQ0koWydyZXF1aXJlJ10sIHJlcXVpcmUgPT4ge1xuICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgcmVxdWlyZWpzLnVuZGVmKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcik7XG4gICAgLy8gQ2xlYXIgdGhlIG1vZHVsZXMgaW4gdGhlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxdWlyZWpzLnMuY29udGV4dHM7XG4gICAgZGVsZXRlIGNvbnRleHRbdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyXTtcbiAgICB0aGlzLnN0b3BDaGVja2luZygpO1xuICB9XG5cbiAgYnVpbGRSZXF1aXJlQ29uZmlnKCkge1xuICAgIC8vIFNldCBSZXF1aXJlSlMgcGF0aHMgYW5kIHNoaW0gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHdpbmRvd1sncmVxdWlyZVBhdGhzJ10gfHwge30sXG4gICAgICBzaGltOiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10gfHwge31cbiAgICB9O1xuICAgIC8vIENoZWNrIGlmIFJlcXVpcmVKUyBpcyBhdmFpbGFibGUsIGlmIG5vdCwgc2V0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYFJlcXVpcmVKUyBub3QgZm91bmQuIFBsZWFzZSBsb2FkIGl0IHZpYSBDRE46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG5cbiAgICBpZiAoaW50ZXJhY3Rpb25Nb2R1bGVzKSB7XG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG5cbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlQYXRoKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwYXRocyB1c2luZyBSZXF1aXJlSlMncyBmYWxsYmFjayBhcnJheVxuICAgICAgICAgIGNvbnN0IHBhdGhzID0gZmFsbGJhY2tQYXRoXG4gICAgICAgICAgICA/IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gY29uZmlnLnBhdGhzW21vZHVsZUlkXSB8fCBbXTtcbiAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhleGlzdGluZ1BhdGgsIHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhwYXRoMTogc3RyaW5nIHwgc3RyaW5nW10sIHBhdGgyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhdGgxQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgxKSA/IHBhdGgxIDogW3BhdGgxXTtcbiAgICBjb25zdCBwYXRoMkFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMikgPyBwYXRoMiA6IFtwYXRoMl07XG4gICAgcmV0dXJuIHBhdGgxQXJyYXkuY29uY2F0KHBhdGgyQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICAgIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbiAgfVxuXG4gIGxvYWRDb25maWcgPSBhc3luYyAodXJsOiBzdHJpbmcsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZHVsZVJlc29sdXRpb25Db25maWc+ID0+IHtcbiAgICB1cmwgPSB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXModXJsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWlyZUNvbmZpZyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAocmVxdWlyZUNvbmZpZy5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXF1aXJlQ29uZmlnLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlQ29uZyA9IGNvbmZpZyBhcyBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIGluIG1vZHVsZUNvbmcucGF0aHMpIHtcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmdldFJlc29sdmFibGVQYXRoKG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdLCBiYXNlVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aFN0cmluZyA9IChwYXRoOiBzdHJpbmcsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aCA9IChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgPyBwYXRoLm1hcChwID0+IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocCwgYmFzZVBhdGgpKVxuICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHBhdGgsIGJhc2VQYXRoKTtcbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIExpdEVsZW1lbnQsXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdID0gW107XG5cbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG4gIC8vIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiZHJvcC1jb250YWluZXJcIj5cbiAgICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICAvLyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gIC8vICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gIC8vICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSk7XG4gIC8vICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnLmRsJykpO1xuICAvLyB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjaG9pY2UgPSBldmVudC50YXJnZXQgYXMgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgICAgIHRoaXMuX2NoaWxkcmVuTWFwLnB1c2goY2hvaWNlKTtcbiAgICB9KTtcblxuICAgIC8vIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgKGV2ZW50OiBDdXN0b21FdmVudCkgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coJ3Rlc3QnKTtcbiAgICAvLyAgIGNvbnN0IGNob2ljZSA9IGV2ZW50LnRhcmdldCBhcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICAgIC8vICAgY29uc3QgaW5kZXggPSB0aGlzLl9jaGlsZHJlbk1hcC5pbmRleE9mKGNob2ljZSk7XG4gICAgLy8gICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgLy8gICAgIHRoaXMuX2NoaWxkcmVuTWFwLnNwbGljZShpbmRleCwgMSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIHRvdWNoU3RhcnRQb2ludCA9IG51bGw7IC8vIFBvaW50IG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIGxhc3RDbGlja1RpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIGNsaWNrXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWdnYWJsZSBlbGVtZW50IGlzIGFjdGl2ZVxuICBwcml2YXRlIGRyYWdTb3VyY2U6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVGhlIHNvdXJjZSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcbiAgcHJpdmF0ZSBkcmFnQ2xvbmU6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gQ2xvbmUgb2YgZHJhZyBzb3VyY2UgZm9yIHZpc3VhbCBmZWVkYmFja1xuICBwcml2YXRlIHRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7IC8vIEZsYWcgZm9yIHRvdWNoRW5kIGV2ZW50XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZyBvcGVyYXRpb24gaXMgb25nb2luZ1xuICBwcml2YXRlIGluaXRpYWxUcmFuc2Zvcm0gPSAnJzsgLy8gT3JpZ2luYWwgdHJhbnNmb3JtIHN0eWxlXG4gIHByaXZhdGUgaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlOyAvLyBGbGFnIHRvIGVuc3VyZSBkcmFnc3RhcnQgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbmNlXG4gIHByaXZhdGUgcm9vdE5vZGU6IE5vZGUgPSBudWxsOyAvLyBSb290IG5vZGUgZm9yIGJvdW5kYXJ5IGNhbGN1bGF0aW9uc1xuXG4gIHByaXZhdGUgZm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBmb2N1c2FibGVEcm9wWm9uZXM6IEhUTUxFbGVtZW50W10gPSBbXTsgLy8gQWxsIGRyb3B6b25lcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICBwcml2YXRlIGN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIEluZGV4IGZvciB0YWJiaW5nIHRocm91Z2ggZHJvcCB6b25lc1xuXG4gIHByaXZhdGUgZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBjbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNsb25lXG5cbiAgcHJpdmF0ZSBsYXN0VGFyZ2V0ID0gbnVsbDsgLy8gTGFzdCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFRhcmdldCA9IG51bGw7IC8vIEN1cnJlbnQgZHJvcHBhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBhbGxvd0NsaWNrID0gdHJ1ZTsgLy8gRmxhZyB0byBhbGxvdyBvciBwcmV2ZW50IGNsaWNrXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUgPSB0cnVlO1xuICBkcmFnT25DbGlja0VuYWJsZWQgPSBmYWxzZTtcbiAgdXNlRHJhZ0Nsb25lID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHRvIGRyYWcgd2l0aCBhIGNsb25lOyBzZXQgdG8gZmFsc2UgdG8gZHJhZyB0aGUgb3JpZ2luYWwgZWxlbWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0RSQUdfRElTVEFOQ0UgPSA1OyAvLyBNaW5pbXVtIHBpeGVsIG1vdmVtZW50IHRvIHN0YXJ0IGRyYWdnaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19DTE9ORV9PUEFDSVRZID0gMTsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjbG9uZSBlbGVtZW50XG4gIGluaXRpYWxUcmFuc2l0aW9uOiBzdHJpbmc7XG4gIC8vIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5VXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYWRkRHJvcHBhYmxlRWxlbWVudHMoZHJvcHBhYmxlczogRWxlbWVudFtdKSB7XG4gIC8vICAgLy8gdGhpcy5kcm9wcGFibGVzID0gZHJvcHBhYmxlcztcbiAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goZWwgPT4ge1xuICAvLyAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IHsgeCwgeSB9O1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgcm9vdCBub2RlXG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2tFbmFibGVkKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIFNhdmUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm07XG5cbiAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSBjb21wdXRlZFN0eWxlLnRyYW5zaXRpb24gfHwgJyc7XG5cbiAgICAgIC8vIERpc2FibGUgdHJhbnNpdGlvbnNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY2xvbmUgb2Zmc2V0XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC54ID0geCAtIHJlY3QubGVmdDtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHkgLSByZWN0LnRvcDtcblxuICAgICAgLy8gU2V0IGhpZ2hlciB6LWluZGV4IHRvIGJyaW5nIGl0IG9uIHRvcFxuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICc5OTk5JztcbiAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgdGhpcy5kcmFnU291cmNlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlICYmIHRoaXMuZHJhZ1NvdXJjZSkge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgICBjb25zdCBjdXJyZW50VG91Y2ggPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKGN1cnJlbnRUb3VjaCkgPj0gdGhpcy5NSU5fRFJBR19ESVNUQU5DRSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2g6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNvZGUgZm9yIGNyZWF0aW5nIGFuZCBoYW5kbGluZyB0aGUgZHJhZyBjbG9uZVxuICAgICAgaWYgKCF0aGlzLmRyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9IHRoaXMuRFJBR19DTE9ORV9PUEFDSVRZLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lID0gdGhpcy5kcmFnU291cmNlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRm9yRHJhZ0Nsb25lKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgY29tcHV0ZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdGhlIGRyYWcgY2xvbmUgdG8gdGhlIHJvb3Qgbm9kZVxuICAgICAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGhvc3Qgb2YgdGhlIHNoYWRvdyByb290XG4gICAgICAgICAgdGhpcy5yb290Tm9kZS5ob3N0LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLnNldERyYWdDbG9uZVN0eWxlcyhjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGRyYWdnaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIENTUyB0cmFuc2Zvcm1zXG4gICAgICBpZiAodGhpcy50b3VjaFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50VG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50Lnk7XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgICAvLyBjb25zdCB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7Ym91bmRlZERlbHRhWH1weCwgJHtib3VuZGVkRGVsdGFZfXB4KWA7XG5cbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wVGFyZ2V0ID0gdGhpcy5maW5kRHJvcFRhcmdldChlKTtcblxuICAgIGlmIChkcm9wVGFyZ2V0ICE9PSB0aGlzLmxhc3RUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICB0aGlzLmxhc3RUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgbGV0IGRyb3BGb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2Ryb3BGb3VuZCcsIGRyb3BGb3VuZCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgZHJvcEZvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgZHJhZ0VuZEV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHsgZHJvcEVmZmVjdDogJ25vbmUnIH07XG4gICAgICB0aGlzLmRyYWdTb3VyY2U/LmRpc3BhdGNoRXZlbnQoZHJhZ0VuZEV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0KGV2ZW50KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGRvY3VtZW50LCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldEF0UG9pbnQocm9vdDogRG9jdW1lbnRPclNoYWRvd1Jvb3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXB0aDogbnVtYmVyID0gMCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBMaW1pdCB0aGUgcmVjdXJzaW9uIGRlcHRoXG4gICAgY29uc3QgTUFYX0RFUFRIID0gMjtcbiAgICBpZiAoZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3Igd2l0aCAnZHJvcHpvbmUnIGF0dHJpYnV0ZVxuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIFNoYWRvdyBET00gYW5kIGRlcHRoIGxpbWl0IG5vdCByZWFjaGVkLCB0cmF2ZXJzZSBpdFxuICAgIGlmIChlbGVtZW50LnNoYWRvd1Jvb3QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHtcbiAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGVsZW1lbnQuc2hhZG93Um9vdCwgeCwgeSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChzaGFkb3dFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBzaGFkb3dFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWRFbGVtZW50KSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiAhdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlID0gdGhpcy5mb2N1c2VkRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZHJvcCB6b25lcyBmb3IgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLmNvbGxlY3REcm9wWm9uZXMoKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gVGFiIGtleSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGRyb3Agem9uZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVUb05leHREcm9wWm9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJyAnICYmIHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIGFnYWluIHRvIGRyb3AgdGhlIGVsZW1lbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIHRoaXMucmVzZXREcmFnU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RHJvcFpvbmVzKCkge1xuICAgIC8vIENvbGxlY3QgYWxsIGVsZW1lbnRzIHdpdGggZHJvcHpvbmUgYXR0cmlidXRlXG4gICAgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcm9wem9uZV0nKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8gQXJyYXkuZnJvbSh0aGlzLmRyb3BwYWJsZXMpO1xuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gUmVzZXQgbmF2aWdhdGlvbiBpbmRleFxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9OZXh0RHJvcFpvbmUoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGluZGV4IGZvciB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gKHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggKyAxKSAlIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aDtcblxuICAgIC8vIEZvY3VzIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIGNvbnN0IG5leHREcm9wWm9uZSA9IHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzW3RoaXMuY3VycmVudERyb3Bab25lSW5kZXhdO1xuICAgIG5leHREcm9wWm9uZS5mb2N1cygpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZHJvcCB0YXJnZXRcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbmV4dERyb3Bab25lO1xuXG4gICAgLy8gRGlzcGF0Y2ggZHJhZ2VudGVyIGV2ZW50XG4gICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KG5leHREcm9wWm9uZSwgJ2RyYWdlbnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50LCBwYWdlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyB0b3VjaC5wYWdlWCA6IHRvdWNoLmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gdG91Y2gucGFnZVkgOiB0b3VjaC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5jbG9uZU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIH1cblxuICBwcml2YXRlIHNldERyYWdDbG9uZVN0eWxlcyh0b3VjaCkge1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHt0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7dG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueH1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgfHwgIXRoaXMuZHJhZ0Nsb25lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0xlZnQgPSB0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54O1xuICAgICAgY29uc3QgbmV3VG9wID0gdG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueTtcblxuICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgY29uc3QgeyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH0gPSB0aGlzLmFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0LCBuZXdUb3AsIHRoaXMuZHJhZ0Nsb25lKTtcblxuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke2JvdW5kZWRMZWZ0fXB4YDtcbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke2JvdW5kZWRUb3B9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvdGVudGlhbCBuZXcgcG9zaXRpb25cbiAgICBjb25zdCBuZXdMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBlbGVtZW50UmVjdC50b3AgKyBkZWx0YVk7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3IHBvc2l0aW9uIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kZWQgZGVsdGEgdmFsdWVzXG4gICAgY29uc3QgYm91bmRlZERlbHRhWCA9IGJvdW5kZWRMZWZ0IC0gZWxlbWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBib3VuZGVkRGVsdGFZID0gYm91bmRlZFRvcCAtIGVsZW1lbnRSZWN0LnRvcDtcblxuICAgIHJldHVybiB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQ6IG51bWJlciwgbmV3VG9wOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gTGltaXQgdGhlIG5ld0xlZnQgYW5kIG5ld1RvcCB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEcmFnRGlzdGFuY2UodG91Y2gpOiBudW1iZXIge1xuICAgIGNvbnN0IHhEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50LngpO1xuICAgIGNvbnN0IHlEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50LnkpO1xuICAgIHJldHVybiB4RGlzdCArIHlEaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEN1c3RvbUV2ZW50KGVsZW1lbnQsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5kYXRhVHJhbnNmZXI7XG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmU/LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdHlsZXNcbiAgICAgICAgaWYgKCFkcm9wRm91bmQpIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5pbml0aWFsVHJhbnNpdGlvbjtcblxuICAgICAgICAvLyBSZXNldCB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBwcm9wZXJ0eVxuICAgICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdDbG9uZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLmxhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuYWxsb3dDbGljayA9IHRydWU7XG4gICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gJyc7XG4gICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuICB1c2VTaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIERyb3BwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gdGhpcy5nZXREcm9wcGFibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRXZlbnRIYW5kbGVycygpO1xuICAgICAgZHJvcHBhYmxlcy5mb3JFYWNoKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgIHRoaXMucHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgICB0aGlzLm9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTogRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290ID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdvdmVySGFuZGxlciA9IHRoaXMuZHJhZ292ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIgPSB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2VudGVySGFuZGxlciA9IHRoaXMuZHJhZ2VudGVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcm9wSGFuZGxlciA9IHRoaXMuZHJvcEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5kcmFnbGVhdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCh7IGF0dHJpYnV0ZU5hbWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyb3BwYWJsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGRyb3BwYWJsZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBkaXNhYmxlZCA/IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKSA6IHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG5cbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10oKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG5cbiAgICAgIC8vIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnbGVhdmVIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyb3BwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPERyb3BwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gVEhJUyBJUyBBIE1JWElOLCBUSElTIElTIEEgTUlYSU5cbi8vIFVTRSBMSUtFIFRISVNcbi8vIGBgYGNsYXNzIERyb3BMaXN0IGV4dGVuZHMgRmxpcHBhYmxlcyhMaXRFbGVtZW50KSB7YGBgXG4vLyBtaXhpbiB3aGljaCBhbmltYXRlcyBjaGlsZHJlbiB3aXRoIEZMSVBcbi8vIGEgY29tYmluYXRpb24gYmV0d2VlbiB0aGlzIGRpcmVjdGl2ZTpcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG4vLyBhbmQgYSB0dXRvcmlhbCBob3cgdG8gbWFrZSBhIG1peGluXG4vLyBodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb3NpdGlvbi9taXhpbnMvXG5cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5pbnRlcmZhY2UgSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbjtcbiAgZHJhZ0NhbkJlUGxhY2VkQmFjazogYm9vbGVhbjtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzOiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlcywgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgeyBwYXJlbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlLCB0eXBlOiBPYmplY3QgfSkgY29uZmlndXJhdGlvbjogSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgY29weVN0eWxlc0RyYWdDbG9uZTogdHJ1ZSxcbiAgICAgIGRyYWdDYW5CZVBsYWNlZEJhY2s6IHRydWUsXG4gICAgICBkcmFnT25DbGljazogZmFsc2VcbiAgICB9O1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBkaXNhYmxlRHJvcHBhYmxlID8gdGhpcy5kaXNhYmxlRHJvcHBhYmxlKGQpIDogdGhpcy5lbmFibGVEcm9wcGFibGUoZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Ryb3B6b25lJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgIH1cblxuICAgIGdldCByZXNwb25zZSgpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgfVxuXG4gICAgc2V0IHJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgcmVzcG9uc2U/LmZvckVhY2goZW50cnkgPT4gdGhpcy5wbGFjZVJlc3BvbnNlKGVudHJ5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGFjZVJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IFtkcm9wSWQsIC4uLmRyYWdJZHNdID0gcmVzcG9uc2Uuc3BsaXQoJyAnKS5yZXZlcnNlKCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmZpbmREcm9wcGFibGVCeUlkKGRyb3BJZCk7XG4gICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHRoaXMucGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQsIGRyb3BwYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyb3BwYWJsZUJ5SWQoaWRlbnRpZmllcjogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbmQoZHJvcCA9PiBkcm9wLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkOiBzdHJpbmcsIGRyb3BwYWJsZTogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2lkZW50aWZpZXI9JHtkcmFnSWR9XWApO1xuICAgICAgaWYgKCFkcm9wcGFibGUgfHwgIWRyYWdnYWJsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgZmluZCBkcmFnZ2FibGUgb3IgZHJvcHBhYmxlIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB2YWxpZEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTtcbiAgICAgIHJldHVybiB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSAwIHx8IHRoaXMubWluQXNzb2NpYXRpb25zIDw9IHZhbGlkQXNzb2NpYXRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmlsdGVyKGQgPT4gZC5jaGlsZEVsZW1lbnRDb3VudCA+IDApLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2F2ZVJlc3BvbnNlKCk6IHZvaWQge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0UmVzcG9uc2VEYXRhKCk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzXG4gICAgICAgIC5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgICAgICBjb25zdCBkcmFnZ2FibGVzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdnYWJsZXNJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICAgICAgY29uc3QgZHJvcHBhYmxlSWRlbnRpZmllciA9IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcnMubWFwKGlkID0+IGAke2lkfSAke2Ryb3BwYWJsZUlkZW50aWZpZXJ9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mbGF0KCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcmVzZXQoc2F2ZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICBpZiAoc2F2ZSkgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc2V0RHJvcHBhYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxJSW50ZXJhY3Rpb24+ICYgVDtcbn07XG5gYDtcbiIsICIvLyBAd2F0Y2ggZGVjb3JhdG9yXG4vL1xuLy8gUnVucyB3aGVuIGFuIG9ic2VydmVkIHByb3BlcnR5IGNoYW5nZXMsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuXG4vL1xuLy8gVG8gd2FpdCBmb3IgYW4gdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnRcbi8vIHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgQHdhdGNoKCdwcm9wTmFtZScpXG4vLyAgaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbi8vICAgIC4uLlxuLy8gIH1cblxuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpdmVRdWVyeShxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBMaXZlUXVlcnlPcHRpb25zKSB7XG4gIGxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxMaXZlUXVlcnlPcHRpb25zPiA9IHtcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3RlZENhbGxiYWNrLCBkaXNjb25uZWN0ZWRDYWxsYmFjayB9ID0gcHJvdG87XG5cbiAgICBwcm90by5jb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGNvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb1dhdGNoID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikpO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBhZGRlZE5vZGVzLmZpbmQobiA9PiBlbGVtZW50c1RvV2F0Y2guaW5jbHVkZXMobikpKSB7XG4gICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzQWRkZWQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikgPz8gW107XG4gICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoQXJyYXkuZnJvbShlbGVtZW50c0FkZGVkKSwgW10pO1xuICAgIH07XG5cbiAgICBwcm90by5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gIH1cbiAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogMC41cmVtO1xuICB9XG5cbiAgOmhvc3Q6OnBhcnQoYXNzb2NpYWJsZXMtY29udGFpbmVyKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMTgwZGVnLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlIC0gMXB4KSxcbiAgICAgIHZhcigtLXF0aS1ib3JkZXItY29sb3ItZ3JheSkgY2FsYyg1MCUpLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlICsgMXB4KVxuICAgICk7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZURvdWJsZVNsYXNoZXMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC91dGlscyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gVGhpcyBjdXN0b20taW50ZXJhY3Rpb24gc3VwcG9ydCB0aGUgQ0VTIEFQSSB3aGljaCBpcyB1c2UgaW4gRkFDRVRcbiAgLy9cbiAgLy8gSXQgd29ya3MgbGlrZSB0aGlzOlxuICAvLyAxLiBUaGUgQ0kgbWFuaWZlc3QgaXMgZmV0Y2hlZFxuICAvLyAyLiBBbiBpZnJhbWUgaXMgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IHN0eWxlIGFuZCBmaXJzdCBzY3JpcHQgZnJvbSB0aGUgbWFuaWZlc3QgYXJlIGxvYWRlZFxuICAvLyAzLiBUaGUgZmlyc3Qgc2NyaXB0IGlzIGJvb3RzdHJhcC5qcyB3aGljaCBhbHNvIGNyZWF0ZXMgYW4gaWZyYW1lIGFuZCBsb2FkcyB0aGUgZmlyc3QgbWVkaWEgZnJvbSB0aGUgbWFuaWZlc3RcbiAgLy8gNC4gQ29tbXVuaWNhdGlvbiBpcyBkb25lIHZpYSB0aGUgQ0VTIEFQSSBidXQgYmVjYXVzZSB0aGUgaWZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIENFUyBvYmplY3Qgd2UgbmVlZCB0byB1c2Ugd2luZG93LnBvc3RNZXNzYWdlXG5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGNoYW5nZSB0aGUgcGFja2FnZSBieSByZXBsYWNpbmcgdGhlIGJvb3RzdHJhcC5qcyB3aXRoIG91ciBvd24gYW5kIGluamVjdCBhIHByb3h5IENFUyBBUEkgdGhhdCBjb21tdW5pY2F0ZXMgdmlhIHBvc3RNZXNzYWdlXG4gIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIHJ1biB0aGlzIGluIHN0b3J5Ym9vaywgd2UgY2Fubm90IHVzZSB3aW5kb3cudG9wIGJlY2F1c2UgdG8gc2VuZCBtZXNzYWdlcyB0aGVyZSwgYmVjYXVzZSBpbiBjYXNlIG9mIHN0b3J5Ym9vayB0aGF0IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgLy8gU28gd2Ugc2VuZCBtZXNzYWdlcyB0byBhbGwgcGFyZW50IHdpbmRvd3NcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSA9IHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSlcbiAgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsIGFzIHN0cmluZztcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8aWZyYW1lXG4gICAgICAgIHdpZHRoPSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyl9XG4gICAgICAgIGhlaWdodD0ke3RoaXMuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKX1cbiAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgdGl0bGU9XCJwY2lDb250YWluZXJcIlxuICAgICAgICBpZD1cInBjaUNvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICA8L2lmcmFtZT5cbiAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NvdW50LWF0dGVtcHQnIH0pXG4gIHB1YmxpYyBjb3VudEF0dGVtcHQ6IHN0cmluZyA9ICd0cnVlJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIHRpdGxlOiAnZW5kIGF0dGVtcHQnO1xuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXQgcmVzcG9uc2UodmFsOiB1bmRlZmluZWQpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGJ1dHRvbiA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfSBwYXJ0PVwiYnV0dG9uXCIgQGNsaWNrPSR7dGhpcy5lbmRBdHRlbXB0fT4ke3RoaXMudGl0bGV9PC9idXR0b24+YDtcbiAgfVxuICBwdWJsaWMgZW5kQXR0ZW1wdChlOiBFdmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZW5kLWF0dGVtcHQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0OiB0aGlzLmNvdW50QXR0ZW1wdCA9PT0gJ3RydWUnIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nOiBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihMaXRFbGVtZW50LCAncXRpLWdhcC10ZXh0JywgZmFsc2UsICdxdGktZ2FwJykge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgLyogW3BhcnQ9J2Ryb3BzJ10gLCAqL1xuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD48c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PiA8c2xvdCBwYXJ0PVwiZHJvcHNcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIGxldCBtYXRjaGVzOiB7IHRleHQ6IHN0cmluZzsgZ2FwOiBzdHJpbmcgfVtdID0gW107XG4gICAgY29uc3QgcmVzcG9uc2UgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgbWF0Y2hlcyA9IHJlc3BvbnNlLm1hcCh4ID0+IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSB4LnNwbGl0KCcgJyk7XG4gICAgICAgIHJldHVybiB7IHRleHQ6IHNwbGl0WzBdLCBnYXA6IHNwbGl0WzFdIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXBzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZ2FwJyk7XG4gICAgZ2Fwcy5mb3JFYWNoKChnYXAsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZ2FwLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgY29uc3QgdGV4dElkZW50aWZpZXIgPSBtYXRjaGVzLmZpbmQoeCA9PiB4LmdhcCA9PT0gaWRlbnRpZmllcik/LnRleHQ7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktZ2FwLXRleHRbaWRlbnRpZmllcj1cIiR7dGV4dElkZW50aWZpZXJ9XCJdYCk/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgIGlmICh0ZXh0SWRlbnRpZmllciAmJiB0ZXh0KSB7XG4gICAgICAgIGlmICghZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGV4dFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHRpb24nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgZ2FwLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0ZXh0U3Bhbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgIGdhcC5uZXh0RWxlbWVudFNpYmxpbmcucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBsaXQvbm8taW52YWxpZC1odG1sICovXG5pbXBvcnQgeyBjc3MsIGh0bWwsIHN2ZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBxdWVyeSwgcXVlcnlBc3NpZ25lZEVsZW1lbnRzLCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIGhvdHNwb3RzO1xuICBzdGFydFBvaW50ID0gbnVsbDtcbiAgZW5kUG9pbnQgPSBudWxsO1xuICBAc3RhdGUoKSBfbGluZXMgPSBbXTtcbiAgQHN0YXRlKCkgc3RhcnRDb29yZDogeyB4OiBhbnk7IHk6IGFueSB9O1xuICBAc3RhdGUoKSBtb3VzZUNvb3JkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIEBxdWVyeSgnc3ZnJykgc3ZnQ29udGFpbmVyO1xuICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2VsZWN0b3I6ICdpbWcnIH0pIGdySW1hZ2U7XG5cbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICAvLyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKHF0aS1hc3NvY2lhYmxlLWhvdHNwb3QpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG4gICAgICBsaW5lLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMHB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICB9XG4gICAgYFxuICBdO1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVzID0gW107XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0aGlzLl9saW5lcyA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxsaW5lLWNvbnRhaW5lcj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8ud2lkdGgpfVxuICAgICAgICAgIGhlaWdodD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LmhlaWdodCl9XG4gICAgICAgICAgdmlld2JveD1cIjAgMCAke3RoaXMuZ3JJbWFnZVswXT8ud2lkdGh9ICR7dGhpcy5nckltYWdlWzBdPy5oZWlnaHR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgICAgdGhpcy5fbGluZXMsXG4gICAgICAgICAgICBsaW5lID0+IGxpbmUsXG4gICAgICAgICAgICAobGluZSwgaW5kZXgpID0+IHN2Z2BcbiAgICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0PVwibGluZVwiXG4gICAgICAgICAgICAgICAgeDE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgeDI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saW5lcyA9IHRoaXMuX2xpbmVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgKX1cbiAgICAgICAgICAke3RoaXMuc3RhcnRQb2ludCAmJlxuICAgICAgICAgIHN2Z2A8bGluZVxuICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgIHgxPSR7dGhpcy5zdGFydENvb3JkLnh9XG4gICAgICAgICAgICB5MT0ke3RoaXMuc3RhcnRDb29yZC55fVxuICAgICAgICAgICAgeDI9JHt0aGlzLm1vdXNlQ29vcmQueH1cbiAgICAgICAgICAgIHkyPSR7dGhpcy5tb3VzZUNvb3JkLnl9XG4gICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgLz5gfVxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9saW5lLWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoZSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChlKTtcblxuICAgIHRoaXMuaG90c3BvdHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMubW91c2VDb29yZCA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuaG90c3BvdHMuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdICsgJ3B4JztcbiAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV0gKyAncHgnO1xuXG4gICAgICBob3RzcG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRQb2ludCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuc3RhcnRDb29yZCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0sXG4gICAgICAgICAgICB5OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICsgJyAnICsgdGhpcy5lbmRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKVxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkhvdHNwb3RzKFxuICBzaGFwZTogc3RyaW5nLFxuICBjb29yZHNOdW1iZXI6IG51bWJlcltdLFxuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIGhvdHNwb3Q6IFF0aUhvdHNwb3RDaG9pY2Vcbikge1xuICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGNlbnRlclhQZXIgPSAoY2VudGVyWCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGNlbnRlcllQZXIgPSAoY2VudGVyWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByYWRpdXNQZXIgPSAocmFkaXVzIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWFBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSA0ICogcmFkaXVzUGVyICsgJ3B4JztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgOTk5OXB4YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncmVjdCc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvbHknOlxuICAgICAge1xuICAgICAgICAvLyBmcm9tIGEsYixjLGQsZSxmID0+IFt7eDphLCB5OmJ9LHt4OmMsIHk6ZH0se3g6ZSwgeTpmfV1cbiAgICAgICAgY29uc3QgcG9seWNvb3JkcyA9IGNvb3Jkc051bWJlci5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIHBvbHlDKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWwgPSBhY2MucG9wKCk7XG4gICAgICAgICAgICBhY2NbYWNjLmxlbmd0aF0gPSB7IHg6IGxhc3RWYWwsIHk6IHBvbHlDW2N1cnJlbnRJbmRleF0gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBib3VuZGluZyBib3ggYnkgZmluZGluZyB0aGUgbWF4IGF4IG1pbiBjb29yZGluYXRlcyBvZiB4IGFuZCB5XG4gICAgICAgIGNvbnN0IGxlZnRYID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCByaWdodFggPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHRvcFkgPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVkgPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBjYXVzZSB3ZSB3YW50IHRvIHVzZSBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBob3RzcG90IG9uIHgseSBhbmQgc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuXG4gICAgICAgIC8vIGFsbCB0aGUgcG9seWdvbiBwb2ludHMgc2hvdWxkIGJlIGNvcnJlY3RlZCBjYXVzZWQgdGhleSBhcmUgZnJvbVxuICAgICAgICAvLyBpbWFnZSAwLDAgcG9pbnQsIGFuZCBzaG91bGQgYmUgZnJvbSB0aGUgaG90c3BvdCBwb2ludCB3aGljaCBhbHJlYWR5XG4gICAgICAgIC8vIGhhcyBiZWVuIG9mZnNldHRlZCBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgcHJldmlvdXMgZmV3IGxpbmVzIG9mIGNvZGVcbiAgICAgICAgLy8gYWxzbyB0aGUgcG9pbnRzIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgaW1hZ2UsIGJ1dCBub3cgaGF2ZVxuICAgICAgICAvLyB0byBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgd2lkdGggb2YgdGhlIGhvdHNwb3RcbiAgICAgICAgY29uc3QgcG9seWdvbkRhdGEgPSBwb2x5Y29vcmRzLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgIHg6ICgocG9pbnQueCAtIGxlZnRYKSAvIChyaWdodFggLSBsZWZ0WCkpICogMTAwLFxuICAgICAgICAgIHk6ICgocG9pbnQueSAtIHRvcFkpIC8gKGJvdHRvbVkgLSB0b3BZKSkgKiAxMDBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjbGlwIHBhdGggY29vcmRpbmF0ZSBzdHlsZSBpbiBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBwb2x5RCA9IHBvbHlnb25EYXRhLm1hcChwID0+IE1hdGgucm91bmQocC54KSArICclICcgKyBNYXRoLnJvdW5kKHAueSkgKyAnJScpLmpvaW4oJywnKTtcblxuICAgICAgICAvLyA1MCUgMCUsIDEwMCUgNTAlLCA1MCUgMTAwJSwgMCUgNTAlXG4gICAgICAgIGhvdHNwb3Quc3R5bGUuY2xpcFBhdGggPSBgcG9seWdvbigke3BvbHlEfSlgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBMaXRFbGVtZW50LFxuICAncXRpLWdhcC1pbWcnLFxuICBmYWxzZSxcbiAgJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnXG4pIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLWdhcC1pbWcnXSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZ2FwOiAxcmVtO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG5cbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIb3RzcG90T3JkZXIoZTogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkZW50aWZpZXIgfSA9IGUuZGV0YWlsO1xuXG4gICAgY29uc3QgaG90c3BvdCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbmQoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpIGFzIFF0aUhvdHNwb3RDaG9pY2U7XG5cbiAgICBjb25zdCBtYXhTZWxlY3Rpb24gPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLmNob2ljZU9yZGVyaW5nKSB7XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChob3RzcG90Lm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBRdGlIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+IGkub3JkZXIgPiAwKS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdXNlciBhbHJlYWR5IHNlbGVjdGVkIDUgaW1hZ2VzLlxuICAgICAgICB9XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgUXRpSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiAhIWkub3JkZXIpLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIFF0aUhvdHNwb3RDaG9pY2VbXSkuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgICAgICBpZiAoaG90c3BvdC5vcmRlciA+IGhvdHNwb3Qub3JkZXIpIHtcbiAgICAgICAgICAgIGhvdHNwb3Qub3JkZXItLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhvdHNwb3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBob3RzcG90Lm9yZGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICAvLyBkbyBub3Qgc2VsZWN0ICggaGlnaGxpZ2h0IGJsdWUsIHRoZSBpbWFnZSlcbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAvKiB3aWR0aDoxMDAlOyAqL1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcblxuaW50ZXJmYWNlIENvbHVtbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJvdyB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNDaGVja2VkOiBib29sZWFuO1xufVxuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBMaXRFbGVtZW50LFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCByZXNwb25zZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnJlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIucmVzcG9uc2UgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB3Yy9uby1jaGlsZC10cmF2ZXJzYWwtaW4tY29ubmVjdGVkY2FsbGJhY2tcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgd2Mvbm8tY2hpbGQtdHJhdmVyc2FsLWluLWNvbm5lY3RlZGNhbGxiYWNrXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy5yZXNwb25zZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy5yZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNwb25zZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gWy4uLnRoaXMucmVzcG9uc2UsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnJlc3BvbnNlKSA/IFsuLi50aGlzLnJlc3BvbnNlXSA6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMucmVzcG9uc2UuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMucmVzcG9uc2UuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICB2YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogdW5kZWZpbmVkKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5JbnRlcmFjdGlvbi5wcm9wZXJ0aWVzLFxuICAgICAgLi4ue1xuICAgICAgICBzdGVwOiB7XG4gICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgIGF0dHJpYnV0ZTogJ3N0ZXAnLFxuICAgICAgICAgIGRlZmF1bHQ6IDEwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBnZXQgYXVkaW8sIHZpZGVvIG9mIG9iamVjdCB0YWcuXG4gICAgY29uc3QgbWVkaWFPYmplY3QgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpIHx8IHRoaXMucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG4gICAgaWYgKG1lZGlhT2JqZWN0KSB7XG4gICAgICAvLyBsaXN0ZW4gdG8gZW5kZWQgZXZlbnRcbiAgICAgIG1lZGlhT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgKCkgPT4ge1xuICAgICAgICAvLyBzZXQgdmFsdWUgdG8gMFxuICAgICAgICB0aGlzLnZhbHVlKys7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU9yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBTaHVmZmxlTWl4aW4oXG4gIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihMaXRFbGVtZW50LCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ycmVjdFJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgICByZXNwb25zZXMuZm9yRWFjaCgocmVzcG9uc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBzaW1wbGVDaG9pY2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICBpZiAoIXNpbXBsZUNob2ljZSkge1xuICAgICAgICAgIHNpbXBsZUNob2ljZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBzaW1wbGVDaG9pY2U/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzID0gWy4uLnRoaXMuY29ycmVjdFJlc3BvbnNlcywgdGV4dF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHNvbWUgaW50ZXJhY3Rpb25zIGhhdmUgYSBkaWZmZXJlbnQgd2F5IG9mIGdldHRpbmcgdGhlIHJlc3BvbnNlXG4gIC8vIHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGRyYWcgYW5kIGRyb3AgbWl4aW4gY2xhc3NcbiAgLy8geW91IGhhdmUgdG8gaW1wbGVtZW50IHlvdXIgb3duIGdldFJlc3BvbnNlIG1ldGhvZCBpbiB0aGUgc3VwZXJjbGFzc1xuICAvLyBjYXVzZSB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIHNvbWUgaW50ZXJhY3Rpb25zLlxuICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2UoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUNob2ljZT4odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Ryb3AtbGlzdCcpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZHJvcHBhYmxlcy5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ3NJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICByZXR1cm4gWy4uLmlkZW50aWZpZXJzXS5qb2luKCcgJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5jaGlsZHJlbk1hcC5mb3JFYWNoKGVsID0+IGVsLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbicsIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnKVxuZXhwb3J0IGNsYXNzIFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIHN0YXJ0WDogYW55O1xuICBzdGFydFk6IGFueTtcbiAgZHJhZ0VsZW1lbnQ6IGFueTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyID0gdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIERlZmluZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbW91c2Vtb3ZlIGV2ZW50IG9uIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICBkcmFnRWxlbWVudEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSB0aGUgbW91c2UgaGFzIG1vdmVkIHNpbmNlIHRoZSBsYXN0IGV2ZW50XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcmFnRWxlbWVudC5vZmZzZXRMZWZ0ICsgZGVsdGFYICsgJ3B4JztcbiAgICB0aGlzLmRyYWdFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0VG9wICsgZGVsdGFZICsgJ3B4JztcblxuICAgIC8vIFVwZGF0ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChhKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGEpO1xuXG4gICAgLy8gR2V0IHRoZSBkcmFnZ2FibGUgYW5kIGRyb3Agem9uZSBlbGVtZW50c1xuICAgIHRoaXMuZHJhZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24+aW1nJyk7XG4gICAgLy8gY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5zdGFydFggPSAwO1xuICAgIHRoaXMuc3RhcnRZID0gMDtcblxuICAgIC8vIEFkZCBhIG1vdXNlZG93biBldmVudCBsaXN0ZW5lciB0byB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLmRyYWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gU2F2ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICAgIC8vIEFkZCBhIG1vdXNlbW92ZSBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlTW92ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJzogUXRpUG9zaXRpb25PYmplY3RTdGFnZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICBwb2ludC1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1heENob2ljZXM6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gIHByaXZhdGUgX2ltZ0VsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHRyYWN0ZWQgY2xpY2sgaGFuZGxlciBtZXRob2RcbiAgcHJpdmF0ZSBfb25JbWFnZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuX3BvaW50cy5sZW5ndGggPCB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIGAke3h9ICR7eX1gXTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxwb2ludC1jb250YWluZXI+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIHRoaXMuX3BvaW50cyxcbiAgICAgICAgICBwb2ludCA9PiBwb2ludCxcbiAgICAgICAgICAocG9pbnQsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGAke3BvaW50LnNwbGl0KCcgJylbMF19cHhgLFxuICAgICAgICAgICAgICAgIHRvcDogYCR7cG9pbnQuc3BsaXQoJyAnKVsxXX1weGBcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgcG9pbnQgYXQgJHtwb2ludH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50cyA9IHRoaXMuX3BvaW50cy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9wb2ludC1jb250YWluZXI+YDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3BvaW50cyA9IFtdO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50cy5sZW5ndGggPj0gdGhpcy5taW5DaG9pY2VzICYmIHRoaXMuX3BvaW50cy5sZW5ndGggPD0gdGhpcy5tYXhDaG9pY2VzO1xuICB9XG5cbiAgc2V0IHJlc3BvbnNlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9wb2ludHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBBdHRhY2ggdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB0aGlzLl9pbWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25JbWFnZUNsaWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdObyA8aW1nPiBlbGVtZW50IGZvdW5kIGluIDxxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uPicpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB0aGlzLl9pbWdFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25JbWFnZUNsaWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbic6IFF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIFNsaWRlckludGVyYWN0aW9uLlR5cGUgKHF0aS1zbGlkZXItaW50ZXJhY3Rpb24pIHByZXNlbnRzIHRoZSBjYW5kaWRhdGUgd2l0aCBhIGNvbnRyb2wgZm9yIHNlbGVjdGluZyBhIG51bWVyaWNhbCB2YWx1ZSBiZXR3ZWVuIGEgbG93ZXIgYW5kIHVwcGVyIGJvdW5kLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zNjF4Y3JqNHFjeWpcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNi4wXG4gKlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbiAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FudHMgdG8gcmVnaXN0ZXIgaXRzZWxmXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLXJlc3BvbnNlIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiBjaGFuZ2VzXG4gKlxuICogQGNzc3Byb3AgLS1zaG93LXZhbHVlIC0gc2hvd3MgdGhlIGN1cnJlbnQgdmFsdWUgd2hpbGUgc2xpZGluZ1xuICogQGNzc3Byb3AgLS1zaG93LXRpY2tzIC0gc2hvd3MgdGhlIHRpY2tzIGFjY29yZGluZyB0byBzdGVwc1xuICogQGNzc3Byb3AgLS1zaG93LWJvdW5kcyAtIHNob3dzIHZhbHVlIGZvciBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnlcbiAqXG4gKiBAY3NzcGFydCBzbGlkZXIgLS0gc2xpZGVyIGlubHVkaW5nLCBib3VuZHMgYW5kIHRpY2tzIGFuZCB2YWx1ZSwgdXNlIGl0IGZvciBwYWRkaW5ncyBhbmQgbWFyZ2luc1xuICogQGNzc3BhcnQgYm91bmRzIC0tIGRpdiBmb3IgYm91bmRzLCBjb250YWluaW5nIHR3byBkaXZzIGZvciB3aXRoIG1pbiwgYW5kIG1heCBib3VuZHMgdmFsdWVcbiAqIEBjc3NwYXJ0IHRpY2tzIC0tIGRpdiBmb3IgdGlja3MsIHVzZSBsaW5lYWlyIGdyYWRpZW50IGFuZCBleHBvc2VkIGNzcyB2YXJpYWJsZXMgZm9yIHN0eWxpbmdcbiAqIEBjc3NwYXJ0IHJhaWwgLS0gZGl2IGZvciByYWlsLCBzdHlsZSBhY2NvcmRpbmcgdG8gbmVlZHNcbiAqIEBjc3NwYXJ0IGtub2IgLS0gZGl2LCBzaG91bGQgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGVcbiAqIEBjc3NwYXJ0IHZhbHVlIC0tIGRpdiwgY29udGFpbmluZyB2YWx1ZVxuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSA8cXRpLXNpbXBsZS1jaG9pY2U+IG11c3QgYmUgcGxhY2VkLlxuICogQHNsb3QgcHJvbXB0IC0gc2xvdCB3aGVyZSB0aGUgcHJvbXB0IGlzIHBsYWNlZC5cbiAqL1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNsaWRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2xpZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNzTGl2ZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcblxuICBAcXVlcnkoJyNrbm9iJylcbiAgcHJpdmF0ZSBfa25vYjogSFRNTEVsZW1lbnQ7XG5cbiAgQHF1ZXJ5KCcjcmFpbCcpXG4gIHByaXZhdGUgX3JhaWw6IEhUTUxFbGVtZW50O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSB2YWx1ZTogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3N0ZXAtbGFiZWwnIH0pIHN0ZXBMYWJlbCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJyB9KSBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1taW4nLCBgJHt0aGlzLl9taW59YCk7XG4gIH1cbiAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwcml2YXRlIF9tYXg6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcgfSkgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tYXgnLCBgJHt0aGlzLl9tYXh9YCk7XG4gIH1cbiAgZ2V0IG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnc3RlcCcgfSkgc2V0IHN0ZXAodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXN0ZXAnLCBgJHt0aGlzLl9zdGVwfWApO1xuICB9XG4gIGdldCBzdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXA7XG4gIH1cblxuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAob2xkLCBkaXNhYmxlZCkgPT4ge307XG5cbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKG9sZCwgcmVhZG9ubHkpID0+IHt9O1xuXG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7IC4uLkxpdEVsZW1lbnQuc2hhZG93Um9vdE9wdGlvbnMsIGRlbGVnYXRlc0ZvY3VzOiB0cnVlLCBtb2RlOiAnb3BlbicgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBhIGxpdmUgcHJvcGVydHksIHdlIHVzZSB0aGlzIHRvIGdldCBjc3MgdmFyaWFibGVzXG4gICAgc2VlIHJlbmRlciB0ZW1wbGF0ZSAqL1xuICAgIHRoaXMuY3NMaXZlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtcbiAgfVxuXG4gIHNldCByZXNwb25zZShteVJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG15UmVzcG9uc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgYSBzaW5nbGUgdmFsdWUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChteVJlc3BvbnNlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgLy8gY29udmVydCB0aGUgdmFsdWUsIHdoaWNoIGlzIHRoZSByZWFsIHNsaWRlciB2YWx1ZSB0byBhIHBlcmNlbnRhZ2UgZm9yIHRoZSBkb20uXG4gICAgdGhpcy52YWx1ZSA8IHRoaXMubWluICYmICh0aGlzLnZhbHVlID0gdGhpcy5taW4pO1xuICAgIHRoaXMudmFsdWUgPiB0aGlzLm1heCAmJiAodGhpcy52YWx1ZSA9IHRoaXMubWF4KTtcbiAgICBjb25zdCB2YWx1ZVBlcmNlbnRhZ2UgPSAoKHRoaXMudmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMudmFsdWUgPSByb3VuZGVkU3RlcFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbkZyb21FdmVudChlOiBhbnkpOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IF90b3VjaE1vdmU7XG4gICAgaWYgKGUudHlwZSA9PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09ICd0b3VjaG1vdmUnIHx8IGUudHlwZSA9PSAndG91Y2hlbmQnIHx8IGUudHlwZSA9PSAndG91Y2hjYW5jZWwnKSB7XG4gICAgICBjb25zdCBldnQgPSB0eXBlb2YgZS5vcmlnaW5hbEV2ZW50ID09PSAndW5kZWZpbmVkJyA/IGUgOiBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2dC50b3VjaGVzWzBdIHx8IGV2dC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxuICAgICAgICB5OiB0b3VjaC5wYWdlWVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS50eXBlID09ICdtb3VzZWRvd24nIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNldXAnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbW92ZScgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdmVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW91dCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VlbnRlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VsZWF2ZSdcbiAgICApIHtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IGUuY2xpZW50WCxcbiAgICAgICAgeTogZS5jbGllbnRZXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX3RvdWNoTW92ZTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2xpZGVyLWludGVyYWN0aW9uJzogUXRpU2xpZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDYWxjdWxhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj5cbiAgICAgICAgPGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7dGhpcy5tYXJrZXIgPyBodG1sYDxkaXYgaWQ9XCJsYWJlbFwiPiR7dGhpcy5tYXJrZXJ9PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2ltcGxlLWNob2ljZSc6IFF0aVNpbXBsZUNob2ljZTtcbiAgfVxufVxuIiwgIi8qIG9ubHkgZXhwb3J0ZWQgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGZvciBzcGVjaWZpYyBwdXJwb3NlcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvdmFyaWFibGVzJztcbi8qIG9ubHkgZXhwb3J0ZWQgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGZvciBzcGVjaWZpYyBwdXJwb3NlcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXByb21wdC9xdGktcHJvbXB0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQnO1xuLyogc3RhcnQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nO1xuLyogZW5kIHJlc3BvbnNlIGFuZCBvdXRjb21lICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jayc7XG4vKiBzdGFydCBmZWVkYmFjayAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jayc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjayc7XG4vKiBlbmQgZmVlZGJhY2sgKi9cbi8qIHN0YXJ0IHRleHRlbnRyeWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbi8qIHN0YXJ0IGhvdHRleHQgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJztcbi8qIGVuZCBob3R0ZXh0ICovXG4vKiBzdGFydCBpbmxpbmVjaG9pY2UgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJztcbi8qIGVuZCBpbmxpbmVjaG9pY2UgKi9cbi8qIHN0YXJ0IGNob2ljZWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGNob2ljZWludGVyYWN0aW9uICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcvcXRpLW91dGNvbWUtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbi8qIHN0YXJ0IGN1c3RvbSBpbnRlcmFjdGlvbnMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuLyogc3RhcnQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nO1xuLyogZW5kIG9ubHkgcHJldmlldyBpdGVtcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1nYXAnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtY2hvaWNlJztcblxuY29uc29sZS5sb2coXG4gICclY0NcdTAwQkZUTyVjTGFiJWM6IHF0aS1jb21wb25lbnRzIGxvYWRlZCcsXG4gICdmb250LXdlaWdodDpib2xkOyBjb2xvcjpncmVlbicsXG4gICdmb250LWZhbWlseTogXCJQVCBTYW5zXCIsIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuOyBmb250LXNpemU6IHNtYWxsZXI7dmVydGljYWwtYWxpZ246IHN1YicsXG4gICdmb250LXdlaWdodDp1bnNldCdcbik7XG5cbi8vIGNzcyBmb3IgZm9udCBwdC1zYW5zIGFuZCBzdWJzY3JpcHQgYW5kIGdyZWVuXG4iXSwKICAibWFwcGluZ3MiOiAiaUdBQUEsT0FBUyxXQUFBQSxPQUFlLGVBQ3hCLE9BQVMsY0FBQUMsR0FBWSxRQUFBQyxPQUFZLE1BQ2pDLE9BQVMsaUJBQUFDLEdBQWUsWUFBQUMsTUFBZ0Isb0JDMkJqQyxTQUFTQyxFQUFNQyxFQUFpQ0MsRUFBd0IsQ0FDN0UsSUFBTUMsRUFBMENDLEVBQUEsQ0FDOUMscUJBQXNCLElBQ25CRixHQUVMLE1BQU8sQ0FBK0JHLEVBQWtCQyxJQUEwRCxDQUVoSCxHQUFNLENBQUUsT0FBQUMsQ0FBTyxFQUFJRixFQUNiRyxFQUFvQixNQUFNLFFBQVFQLENBQVksRUFBSUEsRUFBZSxDQUFDQSxDQUFZLEVBR3BGSSxFQUFNLE9BQVMsU0FBMkJJLEVBQWdFLENBQ3hHRCxFQUFrQixRQUFRRSxHQUFZLENBQ3BDLElBQU1DLEVBQU1ELEVBQ1osR0FBSUQsRUFBYSxJQUFJRSxDQUFHLEVBQUcsQ0FDekIsSUFBTUMsRUFBV0gsRUFBYSxJQUFJRSxDQUFHLEVBQy9CRSxFQUFXLEtBQUtGLENBQUcsRUFFckJDLElBQWFDLElBQ1gsQ0FBQ1YsRUFBZ0Isc0JBQXdCLEtBQUssYUFDL0MsS0FBS0csQ0FBZSxFQUErQk0sRUFBVUMsQ0FBUSxDQUc1RSxDQUNGLENBQUMsRUFFRE4sRUFBTyxLQUFLLEtBQU1FLENBQVksQ0FDaEMsQ0FDRixDQUNGLENDMURBLE9BQVMsaUJBQUFLLE9BQXFCLGVBU3ZCLElBQU1DLEdBQXVCLENBQ2xDLENBQ0UsV0FBWSxtQkFDWixZQUFhLFNBQ2IsU0FBVSxTQUNWLE1BQU8sVUFDUCxLQUFNLFNBQ1IsRUFDQSxDQUNFLFdBQVks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bWVzIjogWyJwcm92aWRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIndhdGNoIiwgInByb3BlcnR5TmFtZSIsICJvcHRpb25zIiwgInJlc29sdmVkT3B0aW9ucyIsICJfX3NwcmVhZFZhbHVlcyIsICJwcm90byIsICJkZWNvcmF0ZWRGbk5hbWUiLCAidXBkYXRlIiwgIndhdGNoZWRQcm9wZXJ0aWVzIiwgImNoYW5nZWRQcm9wcyIsICJwcm9wZXJ0eSIsICJrZXkiLCAib2xkVmFsdWUiLCAibmV3VmFsdWUiLCAiY3JlYXRlQ29udGV4dCIsICJpdGVtQ29udGV4dFZhcmlhYmxlcyIsICJpdGVtQ29udGV4dCIsICJRdGlBc3Nlc3NtZW50SXRlbSIsICJMaXRFbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiY2giLCAicmVhZG9ubHkiLCAiaXRlbUNvbnRleHRWYXJpYWJsZXMiLCAiX19zcHJlYWRQcm9wcyIsICJfX3NwcmVhZFZhbHVlcyIsICJmZWVkYmFja0VsZW1lbnQiLCAicmVzcG9uc2VJZGVudGlmaWVyIiwgImNvdW50QXR0ZW1wdCIsICJvdXRjb21lSWRlbnRpZmllciIsICJ2YWx1ZSIsICJ2IiwgInZhcmlhYmxlIiwgIm1hdGNoaW5nVmFsdWUiLCAiaW50ZXJhY3Rpb25FbGVtZW50IiwgImVsIiwgImZlIiwgIm15UmVzcG9uc2VzIiwgInJlc3BvbnNlIiwgImludGVyYWN0aW9uIiwgImkiLCAiaHRtbCIsICJzaG93IiwgInJlc3BvbnNlcyIsICJ2YXJpIiwgImNyIiwgImNvdW50TnVtQXR0ZW1wdHMiLCAiX2EiLCAicmVzcG9uc2VQcm9jZXNzb3IiLCAiaWRlbnRpZmllciIsICJldmVudCIsICJvdXRjb21lVmFyaWFibGUiLCAibmFtZSIsICJkZXRhaWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIndhdGNoIiwgInByb3ZpZGUiLCAiaXRlbUNvbnRleHQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIiwgIkxpdEVsZW1lbnQiLCAiZXZlbnQiLCAic3RpbXVsdXNSZWYiLCAicGF0aCIsICJzdGltdWx1cyIsICJxdGlUcmFuc2Zvcm1JdGVtIiwgImFwaSIsICJlbGVtZW50cyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgImFyaWFCb29sZWFuQ29udmVydGVyIiwgInZhbHVlIiwgIkFjdGl2ZUVsZW1lbnRNaXhpbiIsICJCYXNlIiwgInR5cGUiLCAiUXRpQ2hvaWNlIiwgImFyZ3MiLCAiX29sZFZhbHVlIiwgImRpc2FibGVkIiwgImtleSIsICJldmVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJRdGlJdGVtQm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicXRpX2l0ZW1fYm9keV9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQcm9tcHQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlTdHlsZXNoZWV0IiwgIkxpdEVsZW1lbnQiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgIml0ZW0iLCAibGluayIsICJzdHlsZXMiLCAiZXJyb3IiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInZhcmlhYmxlIiwgImh0bWxWYWx1ZXMiLCAiZGVmYXVsdFZhbHVlcyIsICJuIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aU91dGNvbWVEZWNsYXJhdGlvbiIsICJRdGlWYXJpYWJsZURlY2xhcmF0aW9uIiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJ0YWJsZSIsICJlbnRyaWVzIiwgImVudHJ5IiwgInNvdXJjZVZhbHVlIiwgInRhcmdldFZhbHVlIiwgIm91dGNvbWVWYXJpYWJsZSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiIsICJRdGlWYXJpYWJsZURlY2xhcmF0aW9uIiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJyZXNwb25zZVZhcmlhYmxlIiwgInJlc3VsdCIsICJjb3JyZWN0UmVzcG9uc2UiLCAidmFsdWVzIiwgImkiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8iLCAiTGl0RWxlbWVudCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlDb250ZW50Qm9keSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aVJ1YnJpY0Jsb2NrIiwgIkxpdEVsZW1lbnQiLCAib2xkIiwgImRpc2FibGVkIiwgImNsYXNzTmFtZSIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiZGVjaW1hbFNlcGFyYXRvciIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJudW1iZXIiLCAiZFNlcCIsICJJc051bGxPclVuZGVmaW5lZCIsICJ2YWx1ZSIsICJyZW1vdmVEb3VibGVTbGFzaGVzIiwgInN0ciIsICJRdGlGZWVkYmFjayIsICJMaXRFbGVtZW50IiwgIm91dGNvbWVJZGVudGlmaWVyIiwgIm91dGNvbWVWYXJpYWJsZSIsICJpc0ZvdW5kIiwgIklzTnVsbE9yVW5kZWZpbmVkIiwgInZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlGZWVkYmFja0Jsb2NrIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUZlZWRiYWNrSW5saW5lIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpTW9kYWxGZWVkYmFjayIsICJRdGlGZWVkYmFjayIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJJbnRlcmFjdGlvbiIsICJMaXRFbGVtZW50IiwgInZhbCIsICJ2YWx1ZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJvbGQiLCAiY2xhc3NlcyIsICJjbGFzc05hbWUiLCAibnJSb3dzIiwgInZhbHVlIiwgImNzcyIsICJodG1sIiwgImV2ZW50IiwgImlucHV0IiwgImlmRGVmaW5lZCIsICJ0ZXh0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAiY3JlYXRlUmVmIiwgImNzcyIsICJxdGlfdGV4dF9lbnRyeV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJjcmVhdGVSZWYiLCAidmFsdWUiLCAiaHRtbCIsICJldmVudCIsICJpbnB1dCIsICJpZkRlZmluZWQiLCAidGV4dCIsICJxdGlfdGV4dF9lbnRyeV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJDaG9pY2VzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJzZWxlY3RvciIsICJDaG9pY2VzTWl4aW5FbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiY2giLCAicmVhZG9ubHkiLCAiY2hvaWNlIiwgIl9vbGRWYWx1ZSIsICJfbmV3VmFsdWUiLCAic2VsZWN0ZWRDb3VudCIsICJyZXNwb25zZVZhbHVlIiwgInJlc3BvbnNlQXJyYXkiLCAiZXZlbnQiLCAiY2hvaWNlRWxlbWVudCIsICJjaGVja2VkIiwgInNlbGVjdGVkQ2hvaWNlcyIsICJzZWxlY3RlZElkZW50aWZpZXJzIiwgImRpc2FibGVVbnNlbGVjdGVkIiwgInJlc3BvbnNlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJRdGlIb3R0ZXh0SW50ZXJhY3Rpb24iLCAiQ2hvaWNlc01peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiY3NzIiwgImh0bWwiLCAib3B0aW9uIiwgInVuc2FmZUhUTUwiLCAiY2hvaWNlcyIsICJjaG9pY2UiLCAic2VsZWN0ZWRPcHRpb24iLCAiaSIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgInZhbHVlIiwgImV2ZW50IiwgInNlbGVjdGVkT3B0aW9uVmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2h1ZmZsZU1peGluIiwgInN1cGVyQ2xhc3MiLCAic2VsZWN0b3IiLCAiU2h1ZmZsZUVsZW1lbnQiLCAidmFsdWUiLCAib2xkVmFsdWUiLCAiY2hvaWNlcyIsICJmaXhlZEVsZW1lbnRzIiwgIm5vbkZpeGVkRWxlbWVudHMiLCAiY2hvaWNlIiwgImluZGV4IiwgImlzU2h1ZmZsZWQiLCAibWF4QXR0ZW1wdHMiLCAiYXR0ZW1wdCIsICJvcmlnaW5hbE9yZGVyIiwgImkiLCAiaiIsICJvcmRlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RyaW5nVG9Cb29sZWFuQ29udmVydGVyIiwgInByb3BlcnR5IiwgIlZvY2FidWxhcnlNaXhpbiIsICJzdXBlckNsYXNzIiwgInNlbGVjdG9yIiwgIlZvY2FidWxhcnlFbGVtZW50IiwgInZhbHVlIiwgIl9hIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJjbGFzc0NvbnRhaW5zTGFiZWwiLCAiY2xzIiwgImlzTnVtYmVyIiwgImNob2ljZXMiLCAiYyIsICJjaG9pY2UiLCAiaW5kZXgiLCAiYSIsICJiIiwgImkiLCAibGFzdExhYmVsIiwgImxhc3RMYWJlbFN1ZmZpeCIsICJsYWJlbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3NzIiwgInF0aV9jaG9pY2VfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiUXRpQ2hvaWNlSW50ZXJhY3Rpb24iLCAiVm9jYWJ1bGFyeU1peGluIiwgIlNodWZmbGVNaXhpbiIsICJDaG9pY2VzTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInF0aV9jaG9pY2VfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aU91dGNvbWVQcm9jZXNzaW5nIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJsb2dpYyIsICJRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciIsICJydWxlcyIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAicnVsZSIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAibWF0Y2hDb3JyZWN0IiwgIm1hcFJlc3BvbnNlIiwgIm1hcFJlc3BvbnNlUG9pbnQiLCAiUXRpUmVzcG9uc2VQcm9jZXNzaW5nIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJydWxlcyIsICJydWxlIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJzcGxpdHRlZFRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZU5hbWUiLCAibWFwUmVzcG9uc2UiLCAibWFwUmVzcG9uc2VQb2ludCIsICJtYXRjaENvcnJlY3QiLCAic3RySFRNTCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiUXRpUnVsZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpTG9va3VwT3V0Y29tZVZhbHVlIiwgIlF0aVJ1bGUiLCAiaWRlbnRpZmllciIsICJvdXRjb21lVmFyaWFibGUiLCAidmFsdWUiLCAiY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImh0bWwiLCAiUXRpUmVzcG9uc2VDb25kaXRpb24iLCAiUXRpUnVsZSIsICJodG1sIiwgImJyYW5jaGVzIiwgImkiLCAiYnJhbmNoIiwgIlF0aVNldE91dGNvbWVWYWx1ZSIsICJRdGlSdWxlIiwgIm91dGNvbWVJZGVudGlmaWVyIiwgImV4cHJlc3Npb24iLCAidmFsdWUiLCAiUXRpU2V0T3V0Y29tZVZhbHVlUnVsZSIsICJ2IiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJRdGlSZXNwb25zZUVsc2UiLCAic3ViUnVsZXMiLCAiaSIsICJodG1sIiwgIlF0aVJlc3BvbnNlSWYiLCAiUXRpUmVzcG9uc2VFbHNlIiwgInJlc3VsdCIsICJpIiwgIlF0aVJlc3BvbnNlRWxzZUlmIiwgIlF0aVJlc3BvbnNlSWYiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgInN0YXRlIiwgIlF0aUV4cHJlc3Npb24iLCAiTGl0RWxlbWVudCIsICJpZGVudGlmaWVyIiwgInZhbHVlcyIsICJ2IiwgInJlc3BvbnNlVmFyaWFibGUiLCAiZXJyb3IiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiUXRpRXhwcmVzc2lvbiIsICJRdGlBbmQiLCAicXRpQW5kTWl4aW4iLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJCYXNlIiwgImNoaWxkcmVuIiwgImMiLCAiY29uZGl0aW9uIiwgInZhbHVlIiwgImUiLCAiUXRpQW5kIiwgInByb3BlcnR5IiwgIlF0aUJhc2VWYWx1ZSIsICJRdGlFeHByZXNzaW9uIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlDb250YWlucyIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb2plY3Rpb24xIiwgInByb2plY3Rpb24yIiwgIngiLCAiUXRpQ29ycmVjdCIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAicmVzcG9uc2VWYXJpYWJsZSIsICJwcm9wZXJ0eSIsICJRdGlFcXVhbFJvdW5kZWQiLCAiUXRpRXhwcmVzc2lvbiIsICJmaWd1cmVzIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgImZsb2F0MSIsICJmbG9hdDIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgIlNjb3JpbmdIZWxwZXIiLCAidmFsdWUxIiwgInZhbHVlMiIsICJiYXNlVHlwZSIsICJpbnQxIiwgImludDIiLCAiZmxvYXQxIiwgImZsb2F0MiIsICJwYWlyMSIsICJwYWlyMiIsICJRdGlFcXVhbCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlNjb3JpbmdIZWxwZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aUd0IiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiUXRpR3RlIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiUXRpSXNOdWxsIiwgIlF0aUV4cHJlc3Npb24iLCAidmFyaWFibGVzIiwgInZhbHVlIiwgIlF0aUx0IiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiUXRpTHRlIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAicHJvcGVydHkiLCAiUXRpTWFwUmVzcG9uc2UiLCAiUXRpRXhwcmVzc2lvbiIsICJyZXNwb25zZSIsICJtYXBwaW5nIiwgImNhbmRpZGF0ZVJlc3BvbnNlcyIsICJyZXN1bHQiLCAiY2FuZGlkYXRlUmVzcG9uc2UiLCAibWFwcGVkVmFsdWUiLCAiZW50cnkiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJRdGlNYXBwaW5nIiwgIkxpdEVsZW1lbnQiLCAiZWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aU1hdGNoIiwgIl9RdGlNYXRjaCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZVRvTWFwIiwgImNvcnJlY3RWYWx1ZUluZm8iLCAiX2EiLCAiU2NvcmluZ0hlbHBlciIsICJpIiwgImFuc3dlckluZGV4IiwgImNvcnJlY3RBbnN3ZXIiLCAibWF0Y2hpbmdWYWx1ZSIsICJhcnIiLCAibXYiLCAiUXRpTWVtYmVyIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAicHJvamVjdGlvbjEiLCAiUXRpTXVsdGlwbGUiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFyaWFibGUiLCAiaHRtbCIsICJRdGlOb3QiLCAiUXRpRXhwcmVzc2lvbiIsICJodG1sIiwgIlF0aU9yIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiYyIsICJjb25kaXRpb24iLCAidmFsdWUiLCAiUXRpT3JkZXJlZCIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YXJpYWJsZSIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlQcmludGVkVmFyaWFibGUiLCAiTGl0RWxlbWVudCIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAiYXNzZXNzbWVudEl0ZW0iLCAiaWRlbnRpZmllciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJRdGlQcm9kdWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiYWNjdW11bGF0b3IiLCAiY3VycmVudFZhbHVlIiwgImVycm9yIiwgInByb3BlcnR5IiwgIlF0aVN0cmluZ01hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAidjEiLCAidjIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpU3VtIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpU3VtRXhwcmVzc2lvbiIsICJleHByZXNzaW9ucyIsICJjIiwgInZhbHVlIiwgImEiLCAiYiIsICJRdGlWYXJpYWJsZSIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidXJsIiwgImJhc2VVcmwiLCAicmVxdWlyZUNvbmZpZyIsICJtb2R1bGVDb25nIiwgIm1vZHVsZUlkIiwgImUiLCAicGF0aCIsICJiYXNlUGF0aCIsICJwIiwgImlucHV0IiwgInRvcExldmVsS2V5IiwgIm5lc3RlZE9iamVjdCIsICJuZXN0ZWRLZXkiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAibmV3UmVzcG9uc2UiLCAic3RyaW5naWZpZWQiLCAidmFsIiwgIm5vZGUiLCAiYSIsICJjb25maWciLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJlbCIsICJwcm9wZXJ0eSIsICJrZXkiLCAiY2hpbGRyZW4iLCAiYWxsS2V5IiwgImMiLCAiayIsICJnZXRDaGlsZFByb3BlcnRpZXMiLCAicHJvcGVydGllcyIsICJjaGlsZCIsICJfX3NwcmVhZFZhbHVlcyIsICJwY2kiLCAidHlwZSIsICJkb20iLCAiYWNjIiwgImxpbmsiLCAic3R5bGVzIiwgImN0eEEiLCAicmVxdWlyZSIsICJjb250ZXh0IiwgImludGVyYWN0aW9uTW9kdWxlcyIsICJtb2R1bGVzIiwgIm1vZHVsZSIsICJwcmltYXJ5UGF0aCIsICJmYWxsYmFja1BhdGgiLCAicGF0aHMiLCAiZXhpc3RpbmdQYXRoIiwgInBhdGgxIiwgInBhdGgyIiwgInBhdGgxQXJyYXkiLCAicGF0aDJBcnJheSIsICJzdHIiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJzdGF0ZSIsICJUb3VjaERyYWdBbmREcm9wIiwgIl9Ub3VjaERyYWdBbmREcm9wIiwgInR5cGUiLCAidmFsIiwgImRyYWdnYWJsZXMiLCAiZWwiLCAiZSIsICJ4IiwgInkiLCAiY29tcHV0ZWRTdHlsZSIsICJyZWN0IiwgImN1cnJlbnRUb3VjaCIsICJjb21wdXRlZFN0eWxlcyIsICJzdHlsZSIsICJkZWx0YVgiLCAiZGVsdGFZIiwgImRyb3BUYXJnZXQiLCAiX2EiLCAiZHJvcEZvdW5kIiwgImRyYWdFbmRFdmVudCIsICJldmVudCIsICJyb290IiwgImRlcHRoIiwgImVsZW1lbnQiLCAiY3VycmVudEVsZW1lbnQiLCAic2hhZG93RWxlbWVudCIsICJuZXh0RHJvcFpvbmUiLCAicGFnZSIsICJ0b3VjaCIsICJuZXdMZWZ0IiwgIm5ld1RvcCIsICJib3VuZGVkTGVmdCIsICJib3VuZGVkVG9wIiwgImJvdW5kYXJ5UmVjdCIsICJlbGVtZW50UmVjdCIsICJlbGVtZW50V2lkdGgiLCAiZWxlbWVudEhlaWdodCIsICJib3VuZGVkRGVsdGFYIiwgImJvdW5kZWREZWx0YVkiLCAieERpc3QiLCAieURpc3QiLCAiZXZlbnRUeXBlIiwgImJ1YmJsZSIsICJwcm9wZXJ0eSIsICJEcm9wcGFibGVzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJ1c2VTaGFkb3dSb290IiwgImRyb3BwYWJsZXNTZWxlY3RvciIsICJEcm9wcGFibGVzRWxlbWVudCIsICJjaGFuZ2VkUHJvcHMiLCAiZHJvcHBhYmxlcyIsICJkcm9wcGFibGUiLCAibXV0YXRpb25zIiwgImF0dHJpYnV0ZU5hbWUiLCAiX2EiLCAiZXYiLCAiaWRlbnRpZmllciIsICJkcmFnZ2FibGUiLCAibW92ZUVsZW1lbnQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIkZsaXBwYWJsZXNNaXhpbiIsICJzdXBlckNsYXNzIiwgImRyb3BwYWJsZXNTZWwiLCAiZHJhZ2dhYmxlc1NlbCIsICJGbGlwcGFibGVzRWxlbWVudCIsICJwcm9wZXJ0eSIsICJsaXZlUXVlcnkiLCAicXVlcnlTZWxlY3RvciIsICJvcHRpb25zIiwgIm9ic2VydmVyIiwgInJlc29sdmVkT3B0aW9ucyIsICJfX3NwcmVhZFZhbHVlcyIsICJwcm90byIsICJkZWNvcmF0ZWRGbk5hbWUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCAiX2EiLCAiY2FsbGJhY2siLCAibXV0YXRpb25MaXN0IiwgImVsZW1lbnRzVG9XYXRjaCIsICJtdXRhdGlvbiIsICJhZGRlZE5vZGVzIiwgImUiLCAicmVtb3ZlZE5vZGVzIiwgIm4iLCAiZWxlbWVudHNBZGRlZCIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAic3VwZXJDbGFzcyIsICJkcmFnZ2FibGVzU2VsZWN0b3IiLCAidXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXMiLCAiZHJvcHBhYmxlc1NlbGVjdG9yIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IiwgIkZsaXBwYWJsZXNNaXhpbiIsICJEcm9wcGFibGVzTWl4aW4iLCAiZXYiLCAidGFyZ2V0IiwgImRyYWdnYWJsZSIsICJyZXNvbHZlIiwgImhhc01vdmVUZXN0SXRlbSIsICJpdGVtcyIsICJwZW5kaW5nIiwgIml0ZW0iLCAiZGF0YSIsICJkcmFnc0FkZGVkIiwgImRyYWdzUmVtb3ZlZCIsICJuZXdEcmFnZ2FibGVzIiwgImNoYW5nZWRQcm9wcyIsICJUb3VjaERyYWdBbmREcm9wIiwgImRyYWdnYWJsZXMiLCAiZCIsICJpbmRleCIsICJwYXJlbnQiLCAidGFyZ2V0SW5kZXgiLCAibW92ZURyYWdnYWJsZSIsICJ0cmFuc2l0aW9uIiwgIm1heE1hdGNoIiwgImRyb3BwYWJsZSIsICJyZXNwb25zZSIsICJlbnRyeSIsICJkcm9wSWQiLCAiZHJhZ0lkcyIsICJkcmFnSWQiLCAiaWRlbnRpZmllciIsICJkcm9wIiwgIm1vdmVFbGVtZW50IiwgInZhbGlkQXNzb2NpYXRpb25zIiwgImRyYWdnYWJsZXNJbkRyb3BwYWJsZSIsICJpZGVudGlmaWVycyIsICJkcm9wcGFibGVJZGVudGlmaWVyIiwgImlkIiwgInNhdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImxpdmVRdWVyeSIsICJjc3MiLCAicXRpX2Fzc29jaWF0ZV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJldmVudCIsICJjaG9pY2UiLCAiaHRtbCIsICJfIiwgImluZGV4IiwgInF0aV9hc3NvY2lhdGVfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aUN1c3RvbUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInVyaVRvTWFuaWZlc3QiLCAicmVtb3ZlRG91YmxlU2xhc2hlcyIsICJyZXNwb25zZSIsICJkYXRhIiwgImVyciIsICJpZnJhbWUiLCAiaWZyYW1lV2luIiwgImlmcmFtZURvYyIsICJpZnJhbWVzSW5TaGFkb3dSb290IiwgIm91dGVySUZyYW1lcyIsICJpZnJhbWVTcmMiLCAib3V0ZXJEb2MiLCAiZSIsICJpbmRleCIsICJpZnJhbWVEb2N1bWVudCIsICJpZnJhbWVzIiwgIm5lc3RlZERvYyIsICJ0eXBlIiwgImV2ZW50IiwgIm1lZGlhRGF0YSIsICJtZWRpYSIsICJ2YWwiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAidmFsdWUiLCAibWF0Y2hlcyIsICJyZXNwb25zZSIsICJ4IiwgInNwbGl0IiwgImdhcCIsICJpbmRleCIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJpZGVudGlmaWVyIiwgInRleHRJZGVudGlmaWVyIiwgInRleHQiLCAidGV4dFNwYW4iLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgInN2ZyIsICJjdXN0b21FbGVtZW50IiwgInF1ZXJ5IiwgInF1ZXJ5QXNzaWduZWRFbGVtZW50cyIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgInBvc2l0aW9uSG90c3BvdHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgImltZyIsICJob3RzcG90IiwgImNlbnRlclgiLCAiY2VudGVyWSIsICJyYWRpdXMiLCAiY2VudGVyWFBlciIsICJjZW50ZXJZUGVyIiwgInJhZGl1c1BlciIsICJsZWZ0WCIsICJ0b3BZIiwgInJpZ2h0WCIsICJib3R0b21ZIiwgImxlZnRYUGVyIiwgInRvcFlQZXIiLCAicmlnaHRYUGVyIiwgImJvdHRvbVlQZXIiLCAicG9seWNvb3JkcyIsICJhY2MiLCAiY3VycmVudFZhbHVlIiwgImN1cnJlbnRJbmRleCIsICJwb2x5QyIsICJsYXN0VmFsIiwgInBvaW50IiwgInBvbHlEIiwgInAiLCAiUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJodG1sIiwgImlmRGVmaW5lZCIsICJyZXBlYXQiLCAibGluZSIsICJpbmRleCIsICJzdmciLCAiZSIsICJfIiwgImkiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiZXZlbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImxlZnRYIiwgInRvcFkiLCAicmlnaHRYIiwgImJvdHRvbVkiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbiIsICJDaG9pY2VzTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImUiLCAiaWRlbnRpZmllciIsICJob3RzcG90IiwgImVsIiwgIm1heFNlbGVjdGlvbiIsICJpIiwgImltZyIsICJjb29yZHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgInMiLCAicG9zaXRpb25Ib3RzcG90cyIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUhvdHNwb3RJbnRlcmFjdGlvbiIsICJDaG9pY2VzTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImUiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgInF0aV9tYXRjaF9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJRdGlNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInZhbHVlIiwgIm5hbWUiLCAidHlwZSIsICJ2IiwgInZhbCIsICJyZXNwb25zZVZhbHVlIiwgImh0bWwiLCAiY29sIiwgImkiLCAidW5zYWZlSFRNTCIsICJyb3ciLCAickluZGV4IiwgImNJbmRleCIsICJyb3dJZCIsICJjb2xJZCIsICJzZWxlY3RlZEluUm93Q291bnQiLCAiY2hlY2tlZCIsICJwYXJ0IiwgImRpc2FibGUiLCAiZSIsICJxdGlfbWF0Y2hfaW50ZXJhY3Rpb25fc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNZWRpYUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgImh0bWwiLCAibWVkaWFPYmplY3QiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ1bnNhZmVIVE1MIiwgIlF0aU9yZGVySW50ZXJhY3Rpb24iLCAiU2h1ZmZsZU1peGluIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImNob2ljZXMiLCAiaHRtbCIsICJfIiwgImkiLCAidW5zYWZlSFRNTCIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJpbmRleCIsICJzaW1wbGVDaG9pY2UiLCAidGV4dCIsICJkcm9wcGFibGUiLCAiZHJhZ3NJbkRyb3BwYWJsZSIsICJkIiwgImNoYW5nZWRQcm9wcyIsICJlbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpUG9zaXRpb25PYmplY3RTdGFnZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiZXZlbnQiLCAiZGVsdGFYIiwgImRlbHRhWSIsICJhIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInJlcGVhdCIsICJzdHlsZU1hcCIsICJRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImV2ZW50IiwgIngiLCAieSIsICJodG1sIiwgInJlcGVhdCIsICJwb2ludCIsICJpbmRleCIsICJzdHlsZU1hcCIsICJlIiwgIl8iLCAiaSIsICJ2YWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJxdWVyeSIsICJRdGlTbGlkZXJJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJvbGQiLCAiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAidmFsdWUiLCAibXlSZXNwb25zZSIsICJ2YWx1ZVBlcmNlbnRhZ2UiLCAiaHRtbCIsICJub3RoaW5nIiwgImV2ZW50IiwgImhhbmRsZVRvdWNoTW92ZSIsICJ4IiwgImRpZmZYIiwgImhhbmRsZVRvdWNoRW5kIiwgImhhbmRsZU1vdXNlTW92ZSIsICJoYW5kbGVNb3VzZVVwIiwgInZhbHVlTm93IiwgInJvdW5kZWRTdGVwVmFsdWUiLCAiX3RvdWNoTW92ZSIsICJldnQiLCAidG91Y2giLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJxdWVyeSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiUXRpQ3VzdG9tT3BlcmF0b3IiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImV2ZW50IiwgIl9hIiwgIl9iIiwgIl9jIiwgImNvbW1lbnROb2RlIiwgIm5vZGUiLCAiZSIsICJmbiIsICJyZXNwb25zZUlkZW50aWZpZXIiLCAidiIsICJpdGVtIiwgInZhcmlhYmxlSWRlbnRpZmllciIsICJvdXRjb21lSWRlbnRpZmllciIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlBc3NvY2lhYmxlSG90c3BvdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXAiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUdhcEltZyIsICJMaXRFbGVtZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwVGV4dCIsICJBY3RpdmVFbGVtZW50TWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUhvdHNwb3RDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3R0ZXh0IiwgIkFjdGl2ZUVsZW1lbnRNaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlJbmxpbmVDaG9pY2UiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlTaW1wbGVDaG9pY2UiLCAiQWN0aXZlRWxlbWVudE1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJub3RoaW5nIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K