@ditojs/admin 2.2.0 → 2.2.1

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,6 +1,6 @@
1
- (function(n,O){typeof exports=="object"&&typeof module<"u"?module.exports=O(require("vue"),require("vue-router"),require("@kyvg/vue3-notification"),require("@ditojs/utils"),require("nanoid"),require("vue-demi"),require("focus-trap"),require("@vueuse/core"),require("sortablejs"),require("codeflask"),require("tinycolor2"),require("@lk77/vue3-color"),require("@tiptap/vue-3"),require("@tiptap/extension-document"),require("@tiptap/extension-text"),require("@tiptap/extension-bold"),require("@tiptap/extension-code"),require("@tiptap/extension-italic"),require("@tiptap/extension-link"),require("@tiptap/extension-strike"),require("@tiptap/extension-underline"),require("@tiptap/extension-blockquote"),require("@tiptap/extension-code-block"),require("@tiptap/extension-hard-break"),require("@tiptap/extension-heading"),require("@tiptap/extension-paragraph"),require("@tiptap/extension-horizontal-rule"),require("@tiptap/extension-ordered-list"),require("@tiptap/extension-bullet-list"),require("@tiptap/extension-list-item"),require("@tiptap/extension-history"),require("vue-multiselect"),require("filesize-parser"),require("filesize"),require("vue-upload-component")):typeof define=="function"&&define.amd?define(["vue","vue-router","@kyvg/vue3-notification","@ditojs/utils","nanoid","vue-demi","focus-trap","@vueuse/core","sortablejs","codeflask","tinycolor2","@lk77/vue3-color","@tiptap/vue-3","@tiptap/extension-document","@tiptap/extension-text","@tiptap/extension-bold","@tiptap/extension-code","@tiptap/extension-italic","@tiptap/extension-link","@tiptap/extension-strike","@tiptap/extension-underline","@tiptap/extension-blockquote","@tiptap/extension-code-block","@tiptap/extension-hard-break","@tiptap/extension-heading","@tiptap/extension-paragraph","@tiptap/extension-horizontal-rule","@tiptap/extension-ordered-list","@tiptap/extension-bullet-list","@tiptap/extension-list-item","@tiptap/extension-history","vue-multiselect","filesize-parser","filesize","vue-upload-component"],O):(n=typeof globalThis<"u"?globalThis:n||self,n["dito-admin"]=O(n.vue,n["vue-router"],n["@kyvg/vue3-notification"],n["@ditojs/utils"],n.nanoid,n["vue-demi"],n["focus-trap"],n["@vueuse/core"],n.sortablejs,n.codeflask,n.tinycolor2,n["@lk77/vue3-color"],n["@tiptap/vue-3"],n["@tiptap/extension-document"],n["@tiptap/extension-text"],n["@tiptap/extension-bold"],n["@tiptap/extension-code"],n["@tiptap/extension-italic"],n["@tiptap/extension-link"],n["@tiptap/extension-strike"],n["@tiptap/extension-underline"],n["@tiptap/extension-blockquote"],n["@tiptap/extension-code-block"],n["@tiptap/extension-hard-break"],n["@tiptap/extension-heading"],n["@tiptap/extension-paragraph"],n["@tiptap/extension-horizontal-rule"],n["@tiptap/extension-ordered-list"],n["@tiptap/extension-bullet-list"],n["@tiptap/extension-list-item"],n["@tiptap/extension-history"],n["vue-multiselect"],n["filesize-parser"],n.filesize,n["vue-upload-component"]))})(this,function(n,O,R,c,Ut,F,Ht,q,Wt,Kt,ue,Yt,x,Jt,Qt,Gt,Xt,Zt,vt,xt,en,tn,nn,on,sn,an,rn,ln,dn,cn,hn,un,pn,mn,fn){"use strict";var Bd=Object.defineProperty;var Dd=(n,O,R)=>O in n?Bd(n,O,{enumerable:!0,configurable:!0,writable:!0,value:R}):n[O]=R;var _e=(n,O,R)=>(Dd(n,typeof O!="symbol"?O+"":O,R),R);const je=n.reactive({title:"",routeComponents:[],user:null,loadCache:{},activeLabel:null,clipboardData:null});function L(e,t){return e?`${e}/${t}`:t}function gn(e){const t=c.parseDataPath(e);return t==null||t.pop(),t}function pe(e,t=!1){return t?gn(e):c.parseDataPath(e)}function bn(e,t=!1){return c.normalizeDataPath(pe(e,t))}function Me(e,t=!1){const o=pe(e,t);if(o){let s;do s=o.pop();while(s!=null&&c.isInteger(+s));if(s!=null)return o}return null}function yn(e,t=!1){return c.normalizeDataPath(Me(e,t))}function Re(e,t,o=!1){const s=pe(t,o);return s?c.getValueAtDataPath(e,s):null}function me(e,t,o=!1){const s=Me(t,o);return s?c.getValueAtDataPath(e,s):null}function qe(e){const t=c.parseDataPath(e);return t[t.length-1]}function kn(e){const t=qe(e);return t==null||c.isInteger(+t)?null:t}function fe(e){const t=qe(e),o=t==null?null:+t;return c.isInteger(o)?o:null}let Cn=0;function $n(e,t="id"){e[t]=`@${++Cn}`}function ee(e){return/^@/.test(e)}function Bn(e,t="id"){return(e==null?void 0:e[t])!=null&&Object.keys(e).length===1}const{hasOwnProperty:Dn}=Object.prototype,ge=new WeakMap;function B(e,t,o){const s=ge.get(n.toRaw(e)),a=s[t];return a!==void 0||Dn.call(s,t)?a:c.isFunction(o)?o():o}function wn(e,t,o){ge.get(n.toRaw(e))[t]=o}class V{constructor(t,o){o=o?c.isFunction(o)?o():{...o}:{},o.nested??(o.nested=!0),o.component=t;const s=Object.setPrototypeOf(o,t);ge.set(this,s)}static get(t,o){return o instanceof V?o:new V(t,o)}get nested(){return B(this,"nested",!0)}get schema(){return B(this,"schema",null)}get value(){return B(this,"value",void 0)}get dataPath(){return B(this,"dataPath","")}get name(){return B(this,"name",()=>kn(this.dataPath))}get index(){return B(this,"index",()=>fe(this.dataPath))}get itemDataPath(){return bn(this.dataPath,this.nested)}get parentItemDataPath(){return yn(this.dataPath,this.nested)}get itemIndex(){return fe(this.itemDataPath)}get parentItemIndex(){return fe(this.parentItemDataPath)}get item(){return B(this,"data",()=>Re(this.rootItem,this.dataPath,this.nested))}get parentItem(){const t=me(this.rootItem,this.dataPath,this.nested)||null;return t!==this.item?t:null}get rootItem(){return B(this,"rootData",null)}get processedItem(){return B(this,"processedData",null)}get clipboardItem(){return B(this,"clipboardData",null)}get user(){return B(this,"user",null)}get api(){return B(this,"api",null)}get views(){return B(this,"views",null)}get itemLabel(){return B(this,"itemLabel",null)}get formLabel(){return B(this,"formLabel",null)}get component(){return B(this,"component",null)}get schemaComponent(){return B(this,"schemaComponent",null)}get formComponent(){return B(this,"formComponent",null)}get viewComponent(){return B(this,"viewComponent",null)}get dialogComponent(){return B(this,"dialogComponent",null)}get panelComponent(){return B(this,"panelComponent",null)}get resourceComponent(){return B(this,"resourceComponent",null)}get sourceComponent(){return B(this,"sourceComponent",null)}get option(){return B(this,"option",void 0)}get options(){return B(this,"options",void 0)}get query(){return B(this,"query",void 0)}get error(){return B(this,"error",void 0)}get wasNotified(){return B(this,"wasNotified",!1)}get request(){return t=>this.component.request(t)}get format(){return(t,o)=>this.component.format(t,o)}get navigate(){return t=>this.component.navigate(t)}get download(){return t=>this.component.download(t)}get getResourceUrl(){return t=>this.component.getResourceUrl(t)}get notify(){return t=>{this.component.notify(t),wn(this,"wasNotified",!0)}}}const Vn={data(){return{listeners:null}},methods:{on(e,t){if(c.isArray(e))for(const o of e)this.on(o,t);else if(c.isPlainObject(e))for(const o in e)this.on(o,e[o]);else{const o=this.listeners||(this.listeners=Object.create(null)),{callbacks:s}=o[e]||(o[e]={callbacks:[],queue:[]});s.push(t)}return this},once(e,t){const o=(...s)=>(this.off(e,o),t.apply(this,s));return o.callback=t,this.on(e,o)},off(e,t){var o;if(!arguments.length)delete this.listeners;else if(c.isArray(e))for(const s of e)this.off(s,t);else if(c.isPlainObject(e))for(const s in e)this.off(s,e[s]);else{const s=(o=this.listeners)==null?void 0:o[e];if(s)if(!t)delete this.listeners[e];else{const{callbacks:a}=s,i=a.findIndex(r=>r===t||r.callback===t);i!==-1&&a.splice(i,1)}}return this},emit(e,...t){var s;const o=(s=this.listeners)==null?void 0:s[e];if(o){const{queue:a,callbacks:i}=o;return new Promise(r=>{const l=async()=>{const d=a.shift();if(d){let h;for(const u of i)try{const p=await u.apply(this,d.args);p!==void 0&&(h=p)}catch(p){console.error(`Error during event handler for '${e}':`,p)}d.resolve(h),l()}};a.push({args:t,resolve:r}),a.length===1&&l()})}},hasListeners(e){var t;if(c.isArray(e)){for(const o of e)if(!this.hasListeners(o))return!1;return e.length>0}else return!!((t=this.listeners)!=null&&t[e])},delegate(e,t){if(t)if(c.isArray(e))for(const o of e)this.delegate(o,t);else this.on(e,(...o)=>t.emit(e,...o));return this}}},be={Boolean:c.isBoolean,Number:c.isNumber,String:c.isString,Date:c.isDate,Array:c.isArray,Object:c.isObject,RegExp:c.isRegExp,Function:c.isFunction},Sn={Boolean:e=>!!e,Number:e=>+e,String:e=>String(e),Date:e=>c.isDate(e)?e:new Date(e),Array:e=>c.isArray(e)?e:c.isString(e)?e.split(","):c.asArray(e),Object:e=>c.isObject(e)?e:e===!0?{}:null,RegExp:e=>c.isRegExp(e)?e:new RegExp(e)};function ye(e,t){var o;if(e&&t!=null){for(const s of e)if((o=be[s.name])!=null&&o.call(be,t))return!0}return!1}function Pn(e,t){const o=e&&Sn[e.name||e];return o?o(t):t}function Ie(e){return!!T(e.resource)}function T(e,t={}){var a;const{parent:o,...s}=t;return e=c.isObject(e)?{...s,...e}:c.isString(e)?{...s,path:e}:null,e&&o!==void 0&&e.parent===void 0&&!((a=e.path)!=null&&a.startsWith("/"))&&(e.parent=o,e.path||(e.path=".")),e}function ke(e,t){return e!=null&&(t==null?void 0:t.type)==="collection"?{type:"member",...c.pickBy(t,(o,s)=>["method","path","parent"].includes(s)),id:`${e}`}:null}const ze={mixins:[Vn],inject:["api","$verbs","$views","$isPopulated","$parentComponent","$schemaComponent","$routeComponent","$dataComponent","$sourceComponent","$resourceComponent","$dialogComponent","$panelComponent","$tabComponent"],provide(){return this.providesData?{$parentComponent:()=>this,$dataComponent:()=>this}:{$parentComponent:()=>this}},data(){return{appState:je,overrides:null}},computed:{providesData(){return!1},sourceSchema(){var e;return(e=this.meta)==null?void 0:e.schema},user(){return je.user},verbs(){return this.$verbs()},views(){return this.$views()},isPopulated(){return this.$isPopulated()},locale(){return this.api.locale},context(){return new V(this,{nested:!1})},rootComponent(){return this.$root.$refs.root},parentComponent(){return this.$parentComponent()},schemaComponent(){return this.$schemaComponent()},routeComponent(){return this.$routeComponent()},formComponent(){const e=this.routeComponent;return e!=null&&e.isForm?e:null},viewComponent(){const e=this.routeComponent;return e!=null&&e.isView?e:null},dataComponent(){return this.providesData?this:this.$dataComponent()},sourceComponent(){return this.$sourceComponent()},resourceComponent(){return this.$resourceComponent()},dialogComponent(){return this.$dialogComponent()},panelComponent(){return this.$panelComponent()},tabComponent(){return this.$tabComponent()},parentSchemaComponent(){var e;return(e=this.schemaComponent)==null?void 0:e.parentComponent.schemaComponent},parentRouteComponent(){var e;return(e=this.routeComponent)==null?void 0:e.parentComponent.routeComponent},parentFormComponent(){var e;return(e=this.formComponent)==null?void 0:e.parentComponent.formComponent},rootData(){var e;return(e=this.dataComponent)==null?void 0:e.data}},beforeCreate(){const e=En++;Object.defineProperty(this,"$uid",{get(){return e}})},methods:{getStore(e){return this.store[e]},setStore(e,t){return this.store[e]=t,t},getChildStore(e){return this.getStore(e)||this.setStore(e,n.reactive({}))},getSchemaValue(e,{type:t,default:o,schema:s=this.schema,callback:a=!0}={}){const i=t&&c.asArray(t);let r=s?c.isArray(e)?c.getValueAtDataPath(s,e,()=>{}):s[e]:void 0;if(r===void 0&&o!==void 0)return a&&c.isFunction(o)&&!ye(i,o)&&(o=o.call(this)),o;if(ye(i,r))return r;if(a&&c.isFunction(r)&&(r=r(this.context)),i&&r!=null&&!ye(i,r))for(const l of i){const d=Pn(l,r);if(d!==r)return d}return r},getLabel(e,t){return e?this.getSchemaValue("label",{type:String,schema:e})||c.labelize(t||e.name):c.labelize(t)||""},labelize:c.labelize,getButtonAttributes(e,t){const o=this.verbs[e]||e;return{class:`dito-button-${o}`,title:(t==null?void 0:t.text)||c.labelize(o)}},getQueryLink(e){return{query:e,hash:this.$route.hash}},shouldRender(e=null){return this.getSchemaValue("if",{type:Boolean,default:!0,schema:e})},shouldShow(e=null){return this.getSchemaValue("visible",{type:Boolean,default:!0,schema:e})},shouldDisable(e=null){return this.getSchemaValue("disabled",{type:Boolean,default:!1,schema:e})},getResourcePath(e){var t;return e=T(e),e.parent===void 0&&(e.parent=(t=this.dataComponent)==null?void 0:t.resource),this.api.resources.any(T(e))},getResourceUrl(e){const t=this.getResourcePath(e);return t?this.api.getApiUrl({url:t,query:e.query}):null},async sendRequest({method:e,url:t,resource:o,query:s,data:a,internal:i}){t||(t=this.getResourcePath(o)),e||(e=o==null?void 0:o.method);const r=!i&&this.api.isApiUrl(t);r&&await this.rootComponent.ensureUser();const l=await this.api.request({method:e,url:t,data:a,query:s});return r&&e==="patch"&&c.equals(o,ke(this.user.id,this.api.users))&&await this.rootComponent.fetchUser(),l},showDialog({components:e,buttons:t,data:o,settings:s}){return this.rootComponent.showDialog({components:e,buttons:t,data:o,settings:s})},request({cache:e,...t}){const o=e&&{global:this.appState,local:this.dataComponent}[e],s=o==null?void 0:o.loadCache,a=s&&`${t.method||"get"} ${t.url} ${JSON.stringify(t.query||t.params||"")} ${JSON.stringify(t.data||"")}`;if(s&&a in s)return s[a];const i=this.sendRequest(t).then(r=>r.data).catch(r=>{var d;const l=(d=r.response)==null?void 0:d.data;throw l?Object.assign(new Error(l.message),l):r});return s&&(s[a]=i),i},format(e,{locale:t=this.api.locale,defaults:o=this.api.formats,...s}={}){return c.format(e,{locale:t,defaults:o,...s})},async navigate(e){return this.$router.push(e)},download(e={}){c.isString(e)&&(e={url:e});const t=document.createElement("a");t.href=this.api.getApiUrl(e),t.download=e.filename??null;const{body:o}=document;o.appendChild(t),t.click(),o.removeChild(t)},notify(e){this.rootComponent.notify(e)},closeNotifications(){this.rootComponent.closeNotifications()},setupSchemaFields(){this.setupMethods(),this.setupComputed(),this.setupEvents()},setupMethods(){for(const[e,t]of Object.entries(this.schema.methods||{}))c.isFunction(t)?this[e]=t:console.error(`Invalid method definition: ${e}: ${t}`)},setupComputed(){for(const[e,t]of Object.entries(this.schema.computed||{})){const o=c.isFunction(t)?{get:t}:c.isObject(t)&&c.isFunction(t.get)?t:null;o?Object.defineProperty(this,e,o):console.error(`Invalid computed property definition: ${e}: ${t}`)}},setupEvents(){const{watch:e,events:t}=this.schema;if(e){const s=c.isFunction(e)?e.call(this):e;c.isObject(s)&&this.$nextTick(()=>{for(const[a,i]of Object.entries(s)){const r=this.schemaComponent.getComponentByName(a)?`data.${a}`:a;this.$watch(r,i)}})}const o=(s,a,i)=>{c.isFunction(i)?this.on(c.hyphenate(a),i):console.error(`Invalid event definition: ${s}: ${i}`)};if(t)for(const[s,a]of Object.entries(t))o(s,s,a);for(const[s,a]of Object.entries(this.schema))/^on[A-Z]/.test(s)&&o(s,s.slice(2),a)},async emitEvent(e,{context:t=null,parent:o=null}={}){const s=this.hasListeners(e),a=o==null?void 0:o.hasListeners(e);if(s||a){["load","change"].includes(e)&&await this.$nextTick();const i=()=>t=V.get(this,t),r=s?await this.emit(e,i()):void 0;return a&&r!==!1&&o.emit(e,i()),r}},emitSchemaEvent(e,t){return this.schemaComponent.emitEvent(e,t)}}};let En=0;const Nn=Object.freeze(Object.defineProperty({__proto__:null,creditcard:{validate:e=>c.isCreditCard(e),message:"is invalid"},decimals:{validate:(e,t)=>{const o=t==="*"?"+":`{1,${t}}`;return new RegExp(`^[-+]?\\d*(\\.\\d${o})?$`).test(e)},message:(e,t)=>`must be numeric and may contain ${!t||t==="*"?"":t} decimal points`},domain:{validate:e=>c.isDomain(e),message:"is not a domain"},email:{validate:e=>c.isEmail(e),message:"must be a valid email"},hostname:{validate:e=>c.isHostname(e),message:"is not a host name"},integer:{validate:e=>c.isInteger(e),message:"must be whole number"},max:{validate:(e,t)=>e<=t,message(e,t){return`must be ${t} or less`}},min:{validate:(e,t)=>e>=t,message(e,t){return`must be ${t} or more`}},password:{validate:()=>!0},range:{validate:(e,[t,o])=>e>=t&&e<=o,message(e,[t,o]){return`must be between ${t} and ${o}`}},required:{validate:(e,t,{password:o})=>e!=null&&e!==""||o&&e===void 0,message:"is required",nullish:!0},url:{validate:e=>c.isUrl(e),message:"is not a valid URL"}},Symbol.toStringTag,{value:"Module"})),On={emits:["errors"],data(){return{isTouched:!1,isDirty:!1,isValidated:!1,isValid:!1,errors:null}},methods:{resetValidation(){this.isTouched=!1,this.isDirty=!1,this.isValidated=!1,this.isValid=!1,this.clearErrors()},validate(e=!0){let t=!0;e&&this.clearErrors();const{value:o}=this;for(const[s,a]of Object.entries(this.validations)){const i=Nn[s];if(i&&(i.nullish||o!=null)){const{validate:r,message:l}=i;if(!r(o,a,this.validations)&&(t=!1,e)){const d=c.isFunction(l)?l(o,a,this):l;this.addError(d,!0)}}}return e&&(this.isValidated=!0,this.isValid=t),t},verify(){return this.validate(!1)},markTouched(){this.isTouched=!0},markDirty(){this.isDirty=!0,this.isValidated=!1,this.isValid=!1,this.clearErrors()},addError(e,t=!1){this.errors||(this.errors=[]),t&&(e=`The ${this.label||this.placeholder||this.name} field ${e}.`),this.errors.push(e),this.$emit("errors",this.errors)},showValidationErrors(e,t){this.errors=[];for(const{message:o}of e)this.addError(o,!0);return t&&this.focus(),!0},getErrors(){return this.errors?[...this.errors]:null},clearErrors(){this.errors=null,this.$emit("errors",this.errors)}}};function y(e,{type:t,default:o,get:s,set:a,callback:i=!0}={}){c.isString(e)&&e.includes(".")&&(e=c.parseDataPath(e));const r=c.normalizeDataPath(e);return{get(){const l=!s||s.length>0?this.overrides&&r in this.overrides?this.overrides[r]:this.getSchemaValue(e,{type:t,default:o,callback:i}):void 0;return s?s.call(this,l):l},set(l){a?a.call(this,l):(this.overrides||(this.overrides={}),this.overrides[r]=l)}}}function Ce(e,{default:t,get:o,set:s}={}){return{get(){let a=this.getStore(e);return a===void 0&&t!==void 0&&(a=c.isFunction(t)?t.call(this):t,this[e]=a,this.getStore(e)),o?o.call(this,a):a},set(a){(!s||(a=s.call(this,a))!==void 0)&&this.setStore(e,a)}}}const K={mixins:[On],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},data(){return{parsedValue:null,focused:!1}},computed:{name(){return this.schema.name},type(){return this.schema.type},context(){return new V(this,{nested:this.nested})},value:{get(){const e=st(this.schema,this.data,this.name,this.dataPath,{component:this}),{format:t}=this.schema;return t?t.call(this,new V(this,{value:e})):e},set(e){const{parse:t}=this.schema;this.parsedValue=t?t.call(this,new V(this,{value:e})):e,this.data[this.name]=this.parsedValue}},parentData(){const e=me(this.rootData,this.dataPath,this.nested);return e!==this.data?e:null},processedData(){const{schemaComponent:e}=this;return Re(e.processedData,this.dataPath.slice(e.dataPath.length),this.nested)},item(){return this.data},parentItem(){return this.parentData},rootItem(){return this.rootData},processedItem(){return this.processedData},label:y("label",{type:[String,Boolean],get(e){return c.isString(e)?e:e!==!1&&this.$options.generateLabel?this.getLabel(this.schema):null}}),width:y("width",{type:[String,Number]}),visible:y("visible",{type:Boolean,default(){return this.$options.defaultVisible}}),exclude:y("exclude",{type:Boolean,default:!1}),required:y("required",{type:Boolean,default:!1}),readonly:y("readonly",{type:Boolean,default:!1}),autofocus:y("autofocus",{type:Boolean,default:!1}),clearable:y("clearable",{type:Boolean,default:!1}),placeholder:y("placeholder",{type:String}),autocomplete:y("autocomplete",{type:String}),events(){const{onFocus:e,onBlur:t,onInput:o,onChange:s}=this;return{onFocus:e,onBlur:t,onInput:o,onChange:s}},attributes(){const{nativeField:e,textField:t}=this.$options,o={...this.events,disabled:this.disabled};return e&&(o.name=this.name,this.label&&(o.title=this.label),o.readonly=this.readonly,o.autofocus=this.autofocus,t&&(o.placeholder=this.placeholder,o.autocomplete=this.autocomplete)),o},validations(){const e={...this.getValidations()};this.required&&(e.required=!0);for(const[t,o]of Object.entries(this.schema.rules||{}))o===void 0?delete e[t]:e[t]=o;return e},showClearButton(){return this.clearable&&this.value!=null}},created(){this._register(!0),this.setupSchemaFields()},beforeUnmount(){this._register(!1)},methods:{_register(e){this.nested&&this.schemaComponent._registerComponent(this,e)},getValidations(){return null},focusElement(){const[e]=c.asArray(this.$refs.element);e&&this.$nextTick(()=>{var t,o;e.focus(),this.disabled&&((o=(t=e.$el||e).scrollIntoView)==null||o.call(t))})},focus(){var e;this.schemaComponent.focus(),(e=this.tabComponent)==null||e.focus(),this.focusElement()},clear(){this.value=null,this.onChange()},onFocus(){this.focused=!0,this.markTouched(),this.emitEvent("focus")},onBlur(){this.focused=!1,this.validate(),this.emitEvent("blur")},onInput(){this.markDirty(),this.emitEvent("input")},onChange(){this.markDirty(),this.emitEvent("change",{context:this.parsedValue!==void 0?{value:this.parsedValue}:null,parent:this.schemaComponent})}}},Ae=new WeakMap;let Ln=0;function Fn(e,t){let o=Ae.get(e);return o||(o=t||`@${++Ln}`,Ae.set(e,o)),o}class Tn{constructor(){_e(this,"graph",{});_e(this,"references",{})}set(t,o,s){t=c.parseDataPath(t);let a=this.graph;for(const i of t){const r=c.isInteger(+i)?"*":i;a=a[r]??(a[r]={})}a.$settings={...s,...a.$settings,...o}}addSource(t,o){this.set(t,{type:"source",schema:o},{related:!1})}setSourceRelated(t){this.set(t,{related:!0,reference:this.getReferencePrefix(t)})}addRelation(t,o,s){this.set(t,{type:"relation",schema:s,internal:!!o,reference:this.getReferencePrefix(o)})}getReferencePrefix(t){var o;return t?(o=this.references)[t]??(o[t]=Ut.nanoid(6)):null}flatten(){const t=o=>{const s=[];for(const[a,{$settings:i,...r}]of Object.entries(o)){i&&s.push([a,i]);for(const[l,d]of t(r))s.push([`${a}/${l}`,d])}return s};return t(this.graph)}process(t,o,{target:s}){const a=s==="clipboard";a&&delete o[t.idKey||"id"];for(const[i,r]of this.flatten()){const{type:l,schema:d,internal:h,related:u,reference:p}=r,g=l==="source",f=l==="relation";if(g||f&&h){const m=c.getValueAtDataPath(o,i,()=>null),k=a&&g&&!u,P=a&&(f&&h||g&&u);for(const w of c.asArray(m).flat()){const $=g&&d.idKey||f&&d.relateBy||"id";let S=w==null?void 0:w[$];if(S!=null&&(k&&delete w[$],P||ee(S))){ee(S)&&(S=S.slice(1));const N=a?$:g?"#id":"#ref",E=a?`@${S}`:p?`${p}-${S}`:S;w[N]=E,N!==$&&delete w[$]}}}}return o}}const Ue={},He={};function _n(e,t){Ue[e]=t}function te(e,t=!1){const o=Ue[e]||null;if(!o&&!t&&!He[e])throw He[e]=!0,new Error(`Unknown Dito component type: '${e}'`);return o}function We(e,t){for(const o of e)if(Be(o)){const s=t(o.component,o.name,0);if(s!==void 0)return s}else for(const[s,a]of Object.entries(o.components||{})){const i=t(a,s,1);if(i!==void 0)return i}}function $e(e,t){return e?We([e,...ct(e)],t):void 0}function jn(e,t){return $e(e,o=>t(o)?o:void 0)||null}function Mn(e,t){return $e(e,o=>t(o)?!0:void 0)===!0}function z(e){return c.isObject(e)&&c.isString(e.type)}function Rn(e){return z(e)&&e.type==="form"}function Ke(e){return z(e)&&e.type==="view"}function qn(e){return z(e)&&e.type==="tab"}function In(e){return z(e)&&e.type==="panel"}function ne(e){return e.name||e.label||e.type}async function A(e,t=!1){if(c.isFunction(e)&&(e=e()),c.isPromise(e)&&(e=await e),c.isModule(e)&&(e={...e},!e.name&&(t||e.default))){const o=Object.keys(e);if(o.length===1){const s=o[0];e=e[s],s!=="default"&&(e.name=s)}}return e}async function oe(e,t=A){let o=c.isFunction(e)?e():e;return o=await A(o,!1),c.isArray(o)?o=Object.fromEntries(await c.mapConcurrently(o,async s=>{const a=await t(s,!0);return[a.name,a]})):c.isObject(o)&&(o=Object.fromEntries(await c.mapConcurrently(Object.entries(o),async([s,a])=>{const i=await t(a,!0);return[s,i]}))),o}async function se(e){let{component:t}=e;t&&(t=await A(t,!0),t&&(e.component=n.markRaw({...t,mixins:[ze,K,...t.mixins||[]]})))}async function Ye(e){await c.mapConcurrently(Object.values(e||{}),se)}async function Y(e,t,o,s){const a=[],i=(r,l,d)=>{a.push(zn(e,r,l,o,s+d))};$e(t,i),We(Ve(t),i),await Promise.all(a)}async function zn(e,t,o,s,a){var i,r;J(e,t),await Promise.all([c.mapConcurrently(Ve(t),l=>Y(e,l,s,a)),await((r=(i=_(t))==null?void 0:i.processSchema)==null?void 0:r.call(i,e,t,o,s,a))])}async function An(e,t,o,s){if(!Ke(o))throw new Error(`Invalid view schema: '${ne(o)}'`);Je(t,o,s),J(t,o),await Ge(t,o);const a=[];return await Y(t,o,a,0),{path:`/${o.path}`,children:a,component:e,meta:{api:t,schema:o}}}function J(e,t){let o=e.defaults[t.type];if(o&&(c.isFunction(o)&&(o=o(t)),c.isObject(o)))for(const[s,a]of Object.entries(o))t[s]===void 0?t[s]=a:t[s]=c.merge(a,t[s])}function Je(e,t,o){t.name=o,t.path||(t.path=e.normalizePath(o))}async function Un(e,t,o){let{form:s,forms:a,components:i}=t;a?a=t.forms=await oe(a,l=>Qe(e,l)):s?s=t.form=await Qe(e,s):i&&c.isObject(i)&&(s={components:i}),a||(a={default:s});const r=[];for(const l of Object.values(a))await Y(e,l,r,o);return r}async function Qe(e,t){if(t=await A(t,!0),!Rn(t))throw new Error(`Invalid form schema: '${ne(t)}'`);return J(e,t),await Ge(e,t),t}async function Hn(e,t){if(t=await A(t,!0),!qn(t))throw new Error(`Invalid tab schema: '${ne(t)}'`);return J(e,t),t}async function Wn(e,t){if(t=await A(t,!0),!In(t))throw new Error(`Invalid panel schema: '${ne(t)}'`);return J(e,t),t}async function Ge(e,t){const{tabs:o,panels:s}=t;o&&(t.tabs=await oe(o,a=>Hn(e,a))),s&&(t.panels=await oe(s,a=>Wn(e,a)))}function I(e){return z(e)&&c.isObject(e.form||e.forms||e.components)}function Kn(e){return z(e)&&Object.keys((e==null?void 0:e.forms)||{}).length>1}function Be(e){return Ke(e)&&c.isObject(e.component)}function Xe(e,t){const{view:o}=e,s=o&&t.views[o];return s&&jn(s,I)||null}function Ze(e,t){return Xe(e,t)?t.views[e.view]:null}function Yn(e,t){const o=Ze(e,t);return o?Be(o)?`/${o.path}`:`/${o.path}/${o.path}`:null}function Q(e,t,o){const s=Xe(e,t);if(s)e=s;else if(e.view)throw new Error(`Unknown view: '${e.view}'`);let{form:a,forms:i,components:r,compact:l}=e;if(!a&&!i)if(r)a={components:r,compact:l};else return{};return i||(i={default:a}),Object.fromEntries(Object.entries(i).map(([d,h])=>(c.isFunction(h.components)&&(h={...h,components:h.components(t)}),[d,(o==null?void 0:o(h))??h])))}function ve(e,t){return e[t==null?void 0:t.type]||e.default||null}function De(e,t,o){return ve(Q(e,o),t)}function xe(e){return!!e.compact}function we(e){return!!(e.inlined||e.components)}function et(e){var t;return!!(e.nested||((t=_(e))==null?void 0:t.defaultNested)===!0)}function Jn(e){var t;return!!((t=_(e))!=null&&t.omitPadding)}function Qn(e){var t;return!!((t=_(e))!=null&&t.alignBottom)}function tt(e){var s;const t=e.default,o=t!==void 0?t:(s=_(e))==null?void 0:s.defaultValue;return c.isFunction(o)?o(e):c.clone(o)}function nt(e){var o;const t=_(e);return!!(t!=null&&t.excludeValue||(o=t==null?void 0:t.ignoreMissingValue)!=null&&o.call(t,e))}function ot(e,t={},o){return ae(e,t,null,null,(i,r,l)=>{!(l in r)&&!nt(i)&&(r[l]=tt(i))},null,{component:o,rootData:t})}function st(e,t,o,s,{component:a=null,rootData:i=a==null?void 0:a.rootData}={}){const{compute:r}=e;if(r){const l=r(V.get(a,{schema:e,value:t[o],name:o,data:t,dataPath:s,rootData:i}));l!==void 0&&(t[o]=l)}return!(o in t)&&!nt(e)&&(t[o]=tt(e)),t[o]}function at(e,t,o){if(o.schemaOnly){const s={},{idKey:a="id",orderKey:i}=e,r=t[a];return r!==void 0&&(s[a]=r),Kn(e)&&(s.type=t.type),i&&(s[i]=t[i]),s}else return{...t}}function Gn(e,t,o,s,{component:a,schemaOnly:i,target:r}={}){const l={component:a,schemaOnly:i,target:r,rootData:o},d=at(t,o,l),h=new Tn;return ae(e,o,s,d,(g,f,m,k,P)=>{let w=st(g,f,m,k,l);if(c.isArray(w)){const{wrapPrimitives:$,orderKey:S,idKey:N="id"}=g;$?w=w.map(E=>({[$]:E})):w=[...w],S&&r==="clipboard"&&w.sort((E,M)=>{const j=E==null?void 0:E[N],Te=M==null?void 0:M[N];return j==null||ee(j)?1:Te==null||ee(Te)?-1:j-Te})}P[m]=w},(g,f,m,k,P)=>{const{wrapPrimitives:w,exclude:$,process:S}=g;let N=P[m];const E=_(g),M=()=>V.get(a,{schema:g,value:N,name:m,data:f,dataPath:k,rootData:l.rootData,processedData:P});if(w&&c.isArray(N)&&(N=N.map(j=>j[w])),S&&(N=S(M())),E!=null&&E.excludeValue||$===!0||c.isFunction($)&&$(M()))delete P[m];else{const j=E==null?void 0:E.processValue;j&&(N=j(g,N,k,h)),P[m]=N}},l),h.process(t,d,l)}function ae(e,t,o,s,a,i,r){const l=d=>{const h=(u,p)=>u!=null?L(u,p):null;if(d)for(const[u,p]of Object.entries(d))if(!et(p))ae(p,t,o,s,a,i,r);else{const g=h(o,u),f=(k,P=null)=>{var M;const w=P!==null?h(g,P):g,$=V.get(r.component,{schema:p,data:t,value:k,dataPath:w,index:P,rootData:r.rootData}),N=(((M=_(p))==null?void 0:M.getFormSchemasForProcessing)||Q)(p,$),E=ve(N,k);if(E){const j=s?at(p,k,r):null;return ae(E,k,w,j,a,i,r)}else return{...k}};a==null||a(p,t,u,g,s);let m=s?s[u]:t[u];m!=null&&I(p)&&(c.isArray(m)?m=s?m.map(f):m.forEach(f):m=f(m),s&&(s[u]=m)),i==null||i(p,t,u,g,s)}};l(e.components);for(const d of ct(e))l(d.components);for(const d of Ve(e))l(d.components);return s||t}function U(e,t){const o=(s,a)=>s.length>0?s.reduce((i,r)=>{const l=a(r);return l&&(i[l.name]=l&&t?{...t,...l}:l),i},{}):null;return c.isArray(e)?o(e,s=>c.isObject(s)?s:{name:c.camelize(s,!1)}):c.isObject(e)?o(Object.entries(e),([s,a])=>c.isObject(a)?{name:s,...a}:c.isString(a)?{name:s,label:a}:null):null}function re(e){return U(e,{type:"button"})}function rt(e){return c.isObject(e)?e.type:e}function _(e){return te(rt(e),!0)??null}function it(e){var t,o;return((o=(t=_(e))==null?void 0:t.getSourceType)==null?void 0:o.call(t,rt(e)))??null}function lt(e,t=null,o=null){return e?{schema:e,dataPath:t!=null&&e.name?L(t,e.name):t,tabComponent:o}:null}function dt(e,t=null,o=null,s=[]){if(e)for(const[a,i]of Object.entries(e)){const r=lt(i,t!=null?L(t,a):null,o);r&&s.push(r)}return s}function ct(e){return e!=null&&e.tabs?Object.values(e.tabs):[]}function Ve(e){return ht(e).map(t=>t.schema)}function ht(e,t=null,o=null,s=null){var r,l;const a=(l=(r=_(e))==null?void 0:r.getPanelSchema)==null?void 0:l.call(r,e,t,o),i=a?[lt(a,t,s)]:[];return dt(e==null?void 0:e.panels,t,s,i),i}function G(e){return it(e)==="object"}function X(e){return it(e)==="list"}function ut(e,t){const o=t[e.idKey||"id"];return o!=null?String(o):void 0}function Xn(e,t){return Fn(t,ut(e,t))}function Zn(e){const{mixins:t}=e;return t||e.extends?Se({...e},e):e}function Se(e,t){if(t.extends&&Se(e,t.extends),t.mixins)for(const o of t.mixins)Se(e,o);for(const o of vn)o in t&&(e[o]=t[o]);return e}const vn=["defaultValue","defaultNested","defaultVisible","generateLabel","excludeValue","ignoreMissingValue","alignBottom","omitPadding","processValue","processSchema","getPanelSchema","getFormSchemasForProcessing","beforeRouteUpdate","beforeRouteLeave"],ie={},C={mixins:[ze],components:ie,component(e,t){if(t&&(c.isPlainObject(t)&&(t=Zn({extends:this,name:e,...t})),ie[e]=t),!(e in ie))throw new Error(`Component "${e}" not registered`);return ie[e]},methods:{getTypeComponent:te}};class xn{hasRole(...t){if(this.roles){for(const o of t)if(this.roles.includes(o))return!0}return!1}}const pt={provide(){return{$schemaParentComponent:()=>this}},data(){return{schemaComponents:[]}},computed:{mainSchemaComponent(){return this.schemaComponents[0]}},methods:{_registerSchemaComponent(e,t){const{schemaComponents:o}=this;t?o.push(e):o.splice(o.indexOf(e),1)}}},mt={mixins:[pt],computed:{errors(){return this.schemaComponents.reduce((e,{errors:t})=>t&&e?e.concat(t):t,null)},isTouched(){return this.schemaComponents.some(e=>e.isTouched)},isDirty(){return this.schemaComponents.some(e=>e.isDirty)},isValid(){return this.schemaComponents.every(e=>e.isValid)},isValidated(){return this.schemaComponents.every(e=>e.isValid)}},methods:{validateAll(e,t=!0){return this.schemaComponents.every(o=>o.validateAll(e,t))},verifyAll(e){return this.schemaComponents.every(t=>t.verifyAll(e))},resetValidation(){this.schemaComponents.forEach(e=>e.resetValidation())},clearErrors(){this.schemaComponents.forEach(e=>e.clearErrors())},showValidationErrors(e,t){this.schemaComponents.forEach(o=>o.showValidationErrors(e,t))}}},ft={mixins:[mt],provide(){return{$routeComponent:()=>this}},data(){return{reload:!1,store:{},loadCache:{}}},computed:{routeComponent(){return this},routeLevel(){let e=0,t=this;for(;t=t.parentComponent.routeComponent;)e++;return e},routeRecord(){return this.$route.matched[this.routeLevel]},isLastRoute(){const{matched:e}=this.$route;return this.routeRecord===e[e.length-1]},isLastUnnestedRoute(){const{matched:e}=this.$route;for(let t=e.length-1;t>=0;t--){const o=e[t];if(!o.meta.nested)return this.routeRecord===o}return!1},isNestedRoute(){return this.meta.nested},isView(){return!1},meta(){var e;return(e=this.routeRecord)==null?void 0:e.meta},path(){return this.getRoutePath(this.routeRecord.path)},label(){return this.getLabel(this.schema)},breadcrumb(){const{breadcrumb:e}=this.schema||{};return e||`${this.breadcrumbPrefix} ${this.label}`},breadcrumbPrefix(){return""},param(){var e;return this.$route.params[(e=this.meta)==null?void 0:e.param]||null},isMutating(){return!1}},beforeRouteUpdate(e,t,o){this==null||this.beforeRouteChange(e,t,o)},beforeRouteLeave(e,t,o){this==null||this.beforeRouteChange(e,t,o)},created(){this.appState.routeComponents.push(this)},unmounted(){const{routeComponents:e}=this.appState;e.splice(e.indexOf(this),1)},methods:{beforeRouteChange(e,t,o){let s=!0;t.path.startsWith(this.path)&&!e.path.startsWith(this.path)&&t.path!==e.path&&(this.isFullRouteChange(e,t)||e.path.length<=t.path.length)&&(this.isMutating?s=this.isValidated||this.validateAll():this.isDirty&&(s=window.confirm(`You have unsaved changes. Do you really want to ${this.verbs.cancel}?`))),o(s)},getRoutePath(e){return this.$route.path.split("/").slice(0,e.split("/").length).join("/")},getChildPath(e){return`${this.path}/${e}`},isFullRouteChange(e,t){const o=this.path.match(/^(\/[^/]*)/)[1];return!c.getCommonPrefix(e.path,t.path).startsWith(o)}}},eo=["data-resource"];function to(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoSchema");return e.user?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.isLastRoute?e.shouldRender(e.viewSchema)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-view dito-scroll-parent","data-resource":e.sourceSchema.path},[n.createVNode(l,{class:"dito-scroll",schema:e.viewSchema,data:e.data,meta:e.meta,store:e.getChildStore(e.name),disabled:e.isLoading,generateLabels:!1,menuHeader:!0},null,8,["schema","data","meta","store","disabled"])],8,eo)):n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(r,{key:e.name}))],64)):n.createCommentVNode("",!0)}const b=(e,t)=>{const o=e.__vccOpts||e;for(const[s,a]of t)o[s]=a;return o},no=C.component("DitoView",{mixins:[ft],provide(){return{$sourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.sourceComponent)||null},$resourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.resourceComponent)||null}}},data(){return{isLoading:!1,data:{}}},computed:{schema(){return this.meta.schema},name(){return this.schema.name},isView(){return!0},isSingleComponentView(){return Be(this.schema)},mainComponent(){return this.mainSchemaComponent.getComponentByDataPath(this.name)},viewSchema(){const{component:e,...t}=this.schema;return this.isSingleComponentView?{...t,components:{[t.name]:{name:t.name,label:!1,...e}}}:t},providesData(){return Mn(this.viewSchema,Ie)}},watch:{$route(e,t){this.isFullRouteChange(e,t)&&(this.isLoading=!1,this.data={})}},methods:{setData(e){this.data=e},getChildPath(e){return this.isSingleComponentView?this.path:`${this.path}/${e}`},setLoading(e){this.isLoading=!!e}}}),gt=b(no,[["render",to]]),Hd="";function le(e,{year:t=(e==null?void 0:e.getFullYear())??0,month:o=(e==null?void 0:e.getMonth())??0,day:s=(e==null?void 0:e.getDate())??0,hour:a=(e==null?void 0:e.getHours())??0,minute:i=(e==null?void 0:e.getMinutes())??0,second:r=(e==null?void 0:e.getSeconds())??0,millisecond:l=(e==null?void 0:e.getMilliseconds())??0}={}){return new Date(t,o,s,a,i,r,l)}const oo={class:"dito-calendar"},so={class:"dito-calendar-popup"},ao={class:"dito-calendar-inner"},ro={class:"dito-calendar-header"},io={class:"dito-calendar-body"},lo={class:"dito-calendar-weekdays"},co={class:"dito-calendar-dates"},ho=["onClick"],uo={class:"dito-calendar-footer"},po=["title"],mo={class:"dito-calendar-header"},fo={class:"dito-calendar-body"},go={class:"dito-calendar-months"},bo=["onClick"],yo={class:"dito-calendar-header"},ko={class:"dito-calendar-body"},Co={class:"dito-calendar-years"},$o=["onClick"];function Bo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",oo,[n.createElementVNode("div",so,[n.createElementVNode("div",ao,[a.currentMode==="day"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",ro,[n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>i.stepYear(-1))}),n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>i.stepMonth(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1),n.createElementVNode("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>i.setMode("month"))},n.toDisplayString(i.dateToString(a.currentValue,{month:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>i.stepMonth(1))}),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>i.stepYear(1))})]),n.createElementVNode("div",io,[n.createElementVNode("div",lo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.weekdayNames,r=>(n.openBlock(),n.createElementBlock("span",null,n.toDisplayString(r.short),1))),256))]),n.createElementVNode("div",co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.dateRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:l=>i.selectDate(r.date,r.state,!0)},n.toDisplayString(r.text),11,ho))),256))])]),n.createElementVNode("div",uo,[n.createElementVNode("a",{class:"dito-calendar-select-today",role:"button",title:i.dateToString(new Date,{year:1,month:1,day:1}),onClick:t[6]||(t[6]=r=>i.selectDate(new Date))},null,8,po)])],64)):a.currentMode==="month"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",mo,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>i.stepYear(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>i.stepYear(1))})]),n.createElementVNode("div",fo,[n.createElementVNode("div",go,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.monthNames,(r,l)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getMonthClass(l)),onClick:d=>i.selectMonth(l)},n.toDisplayString(r.short),11,bo))),256))])])],64)):a.currentMode==="year"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",yo,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>i.stepDecade(-1))}),n.createElementVNode("span",null,n.toDisplayString(i.decadeToString(a.currentValue)),1),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>i.stepDecade(1))})]),n.createElementVNode("div",ko,[n.createElementVNode("div",Co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.yearRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getYearClass(r)),onClick:l=>i.selectYear(r)},n.toDisplayString(r),11,$o))),256))])])],64)):n.createCommentVNode("",!0)])])])}const Wd="",Do={emits:["update:modelValue"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=wo(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e){this.currentValue=le(this.currentValue,e)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:o,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(o,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e,t,o=!1){t!=="disabled"&&(o?this.setDate({year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}):this.currentValue=e,this.$emit("update:modelValue",this.currentValue))},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1})},selectYear(e){this.setMode("month"),this.setDate({year:e})},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:o,day:s}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:o&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({hor:e,ver:t,enter:o}){const{currentMode:s,currentValue:a}=this;if(e||t){switch(s){case"day":this.setDate({day:a.getDate()+e+t*7});break;case"month":this.setDate({month:a.getMonth()+e+t*6});break;case"year":this.setDate({year:a.getFullYear()+e+t*5});break}return!0}else if(o){switch(s){case"day":this.selectDate(a);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),o=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let h=0;h<10;h++)this.yearRange.push(s+h);let i=new Date(t,o,1).getDay()+1;i===0&&(i=7);const r=this.getDaysInMonth(t,o);if(i>1){const h=this.getYearMonth(t,o-1),u=this.getDaysInMonth(h.year,h.month);for(let p=1;p<i;p++){const g=u-i+p+1,f=new Date(h.year,h.month,g);this.dateRange.push({text:g,date:f,state:this.disabledDate(f)?"disabled":"gray"})}}const l=new Date;for(let h=1;h<=r;h++){const u=new Date(t,o,h),p=f=>f&&f.getDate()===h&&f.getFullYear()===t&&f.getMonth()===o,g=p(this.modelValue)?"active":p(l)?"today":this.disabledDate(u)?"disabled":p(e)?"current":null;this.dateRange.push({text:h,date:u,state:g})}const d=42-this.dateRange.length;if(d>0){const h=this.getYearMonth(t,o+1);for(let u=1;u<=d;u++){const p=new Date(h.year,h.month,u),g=this.disabledDate(p)?"disabled":"gray";this.dateRange.push({text:u,date:p,state:g})}}}}},bt={};function wo(e){let t=bt[e];if(!t){const o=[];for(let a=0;a<7;a++){const i=new Date(0,0,a);o.push({long:i.toLocaleString(e,{weekday:"long"}),short:i.toLocaleString(e,{weekday:"short"})})}const s=[];for(let a=1;a<=12;a++){const i=new Date(0,a,0);s.push({long:i.toLocaleString(e,{month:"long"}),short:i.toLocaleString(e,{month:"short"})})}t=bt[e]={weekdayNames:o,monthNames:s}}return t}const Vo=b(Do,[["render",Bo]]);function de(e,t){for(const o in t)e.addEventListener(o,t[o],!1);return{remove(){for(const o in t)e.removeEventListener(o,t[o],!1)}}}function So(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e.keyCode]}function yt(e){const t=So(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}const Po={class:"dito-trigger-container"};function Eo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Po,[o.alwaysShow?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="click"?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>i.onClick&&i.onClick(...r))},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="hover"?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>i.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>i.onHover(!1))},[n.renderSlot(e.$slots,"trigger")],34)):o.trigger==="focus"||o.trigger==="always"?(n.openBlock(),n.createElementBlock("div",{key:3,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:o.transition},{default:n.withCtx(()=>[o.trigger==="hover"?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle),onMouseenter:t[3]||(t[3]=r=>i.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>i.onHover(!1))},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],38)),[[n.vShow,a.showPopup]]):n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle)},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],6)),[[n.vShow,a.showPopup]])]),_:3},8,["name"])])}const Kd="",Pe=b({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${c.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),e&&this.$nextTick(()=>this.updatePosition()))}},mounted(){const{trigger:e,popup:t}=this.$refs;if(this.trigger==="focus"){const o=e.querySelector("input, textarea");o&&(this.focusEvents=de(o,{focus:()=>{this.showPopup=!0},blur:()=>{this.showPopup=!1}}))}this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=de(window,{mouseup:o=>{this.showPopup&&!t.contains(o.target)&&!e.contains(o.target)&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},beforeUnmount(){var e,t;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),this.mouseLeaveTimer=null},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const o=c.isString(this.target)?this.$refs[this.target]:this.target;if(o){const m=o===t?e:t.firstElementChild;m&&(m.style.width=getComputedStyle(o).width)}const s=(o||e).getBoundingClientRect(),a=s.left+window.scrollX,i=s.top+window.scrollY,r=s.width,l=s.height,d=t.offsetWidth,h=t.offsetHeight;let[u,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const m=window.innerWidth,k=window.innerHeight;u==="top"?i<h&&(u="bottom"):u==="bottom"?k-i-l<h&&(u="top"):u==="left"?a<d&&(u="right"):u==="right"&&m-a-r<d&&(u="left"),p==="top"?k-i<h&&(p="bottom"):p==="bottom"?i+l<h&&(p="top"):p==="left"?m-a<d&&(p="right"):p==="right"&&a+r<d&&(p="left")}let g=0,f=0;switch(u){case"top":f-=h;break;case"left":g-=d;break;case"right":g+=r;break;case"bottom":f+=l;break}switch(p){case"right":g-=d-r;break;case"bottom":f-=h-l;break}if(this.cover&&(u==="top"?f+=l:u==="bottom"&&(f-=l)),o&&o!==e){const m=e.getBoundingClientRect();g+=a-m.left,f+=i-m.top}t.style.left=`${g}px`,t.style.top=`${f}px`},onClick(){this.disabled||(this.showPopup=!this.showPopup)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Eo]]),No={class:"dito-input"},Oo=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Lo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",No,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>a.currentValue=r),type:o.type,name:o.name,title:o.title,disabled:o.disabled,readonly:o.readonly,autofocus:o.autofocus,placeholder:o.placeholder,autocomplete:o.autocomplete,"aria-label":o.title},e.$attrs),null,16,Oo),[[n.vModelDynamic,a.currentValue]])])}const Jd="",Z=b({emits:["update:modelValue"],props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{size(){const{size:e,min:t,max:o}=this.$attrs,s=a=>a!=null?`${a}`.length:0;return e||s(t)||s(o)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Lo]]);function Fo(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Calendar"),d=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(d,n.mergeProps({class:"dito-date-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[4]||(t[4]=h=>a.showPopup=h),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-date-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=h=>i.currentText=h),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=h=>a.inputFocused=!0),onBlur:t[2]||(t[2]=h=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createVNode(l,n.mergeProps({class:"dito-date-picker-popup",ref:"calendar",modelValue:a.currentValue,"onUpdate:modelValue":t[3]||(t[3]=h=>a.currentValue=h)},{locale:o.locale,disabledDate:o.disabledDate}),null,16,["modelValue"])]),_:1},16,["show"])}const Gd="",kt=b({components:{Trigger:Pe,Calendar:Vo,InputField:Z},emits:["update:modelValue","update:show","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},locale:{type:String,default:"en-US"},dateFormat:{type:Object,default:()=>c.defaultFormats.date},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return c.format(this.currentValue,{locale:this.locale,date:this.dateFormat,time:!1})||""}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.showPopup=!1,this.$emit("update:modelValue",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("update:modelValue",this.currentValue)))}},methods:{onKeyDown(e){var t;(t=this.$refs.calendar)!=null&&t.navigate(yt(e))&&e.preventDefault()},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Fo]]);function Ct(e,t,o){const s=window.requestAnimationFrame||function(){return setTimeout(arguments[0],10)};if(o<=0)e.scrollTop=t;else{const i=(t-e.scrollTop)/o*10;s(()=>{e.scrollTop=e.scrollTop+i,e.scrollTop!==t&&Ct(e,t,o-10)})}}function To(e,t,o){if(e.createTextRange){const s=e.createTextRange();s.collapse(!0),s.moveStart("character",t),s.moveEnd("character",o),s.select(),e.focus()}else e.setSelectionRange?(e.focus(),e.setSelectionRange(t,o)):"selectionStart"in e&&(e.selectionStart=t,e.selectionEnd=o,e.focus())}const _o={class:"dito-time-picker-popup"},jo={class:"dito-time-picker-panel"},Mo=["onClick"],Ro={class:"dito-time-picker-panel"},qo=["onClick"],Io={class:"dito-time-picker-panel"},zo=["onClick"];function Ao(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-time-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[6]||(t[6]=d=>a.showPopup=d),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-time-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=d=>i.currentText=d),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=d=>a.inputFocused=!0),onBlur:t[2]||(t[2]=d=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createElementVNode("div",_o,[n.createElementVNode("div",jo,[n.createElementVNode("ul",{class:"dito-time-picker-hour",ref:"hour",onMouseover:t[3]||(t[3]=d=>a.selection=0)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(24,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledHour(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.hour===d-1}),onClick:h=>i.hour=d-1},n.toDisplayString(i.leftPad(d-1)),11,Mo))],64))),64))],544)]),n.createElementVNode("div",Ro,[n.createElementVNode("ul",{class:"dito-time-picker-minute",ref:"minute",onMouseover:t[4]||(t[4]=d=>a.selection=1)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledMinute(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.minute===d-1}),onClick:h=>i.minute=d-1},n.toDisplayString(i.leftPad(d-1)),11,qo))],64))),64))],544)]),n.createElementVNode("div",Io,[n.createElementVNode("ul",{class:"dito-time-picker-second",ref:"second",onMouseover:t[5]||(t[5]=d=>a.selection=2)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledSecond(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.second===d-1}),onClick:h=>i.second=d-1},n.toDisplayString(i.leftPad(d-1)),11,zo))],64))),64))],544)])])]),_:1},16,["show"])}const Zd="",$t=b({components:{Trigger:Pe,InputField:Z},emits:["update:modelValue","update:show","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,selection:0,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return this.currentValue?`${this.leftPad(this.hour)}:${this.leftPad(this.minute)}:${this.leftPad(this.second)}`:""},currentDate(){return this.currentValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e),this.scrollAll())},currentText:"updateSelection",selection:"updateSelection",show(e){this.showPopup=e},showPopup(e,t){e&&(this.updateSelection(),this.scrollAll(0)),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=le(this.currentDate,{...e,millisecond:0})},updateSelection(e=!1){if(this.showPopup||e){const t=3*this.selection;this.$nextTick(()=>To(this.$refs.input,t,t+2))}},scrollAll(e=100){const t=(o,s)=>{const a=this.$refs[o];if(a){const i=a.scrollHeight/(a.children.length+6);Ct(a,Math.round(s*i),e)}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onKeyDown(e){const t=["hour","minute","second"][this.selection];if(t){const{hor:o,ver:s,enter:a}=yt(e);if(o){const i=this.selection+o;this.selection=i<0?2:i>2?0:i}else if(s){const i=this[t]+s,{length:r}=this.$refs[t].children;this[t]=i<0?i+r:i>=r?i-r:i}a&&(this.showPopup=!1),(o||s||a)&&(this.updateSelection(!0),e.preventDefault())}},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Ao]]),Uo={class:"dito-date-time-picker",ref:"picker"};function Ho(e,t,o,s,a,i){const r=n.resolveComponent("DatePicker"),l=n.resolveComponent("TimePicker");return n.openBlock(),n.createElementBlock("div",Uo,[n.createElementVNode("div",{class:n.normalizeClass(["dito-pickers",{"dito-focus":i.focused}])},[n.createVNode(r,n.mergeProps({ref:"date",modelValue:a.currentValue,"onUpdate:modelValue":t[0]||(t[0]=d=>a.currentValue=d),show:a.showDate,"onUpdate:show":t[1]||(t[1]=d=>a.showDate=d),placement:"bottom-left",target:e.$refs.picker},{transition:o.transition,placeholder:o.placeholder,locale:o.locale,dateFormat:o.dateFormat,disabled:o.disabled},{onFocus:t[2]||(t[2]=d=>a.dateFocused=!0),onBlur:t[3]||(t[3]=d=>a.dateFocused=!1)}),null,16,["modelValue","show","target"]),n.createVNode(l,n.mergeProps({ref:"time",modelValue:a.currentValue,"onUpdate:modelValue":t[4]||(t[4]=d=>a.currentValue=d),show:a.showTime,"onUpdate:show":t[5]||(t[5]=d=>a.showTime=d),placeholder:"",placement:"bottom-right",target:e.$refs.picker},{transition:o.transition,disabled:o.disabled},{onFocus:t[6]||(t[6]=d=>a.timeFocused=!0),onBlur:t[7]||(t[7]=d=>a.timeFocused=!1)}),null,16,["modelValue","show","target"])],2)],512)}const xd="",Wo=b({components:{DatePicker:kt,TimePicker:$t},emits:["update:modelValue","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},dateFormat:{type:Object,default:()=>c.defaultFormats.date},locale:{type:String,default:"en-US"},disabled:{type:Boolean,default:!1}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,dateFocused:!1,timeFocused:!1,changed:!1}},computed:{focused(){return this.dateFocused||this.timeFocused}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e))},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{focus(){this.$refs.date.focus()},blur(){this.$refs.date.blur(),this.$refs.time.blur()}}},[["render",Ho]]);function Ko(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("i",{class:n.normalizeClass(["dito-icon",`dito-icon-${o.name}`])},null,2)}const tc="",Yo=b({props:{name:{type:String,required:!0}}},[["render",Ko]]),Jo={class:"dito-pagination"},Qo={key:0,class:"dito-pagination-total"},Go={class:"dito-buttons dito-buttons-round"},Xo=["disabled","onClick"],Zo={key:0};function vo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Jo,[o.showTotal?(n.openBlock(),n.createElementBlock("div",Qo,[o.total>0?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(i.first)+" – "+n.toDisplayString(i.last),1)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("0")],64)),n.createTextVNode("/ "+n.toDisplayString(o.total),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",Go,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.pageRange,r=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",i.getPageClass(r)]),disabled:r.disabled,onClick:l=>i.onClickPage(r)},[r.text?(n.openBlock(),n.createElementBlock("span",Zo,n.toDisplayString(r.text),1)):n.createCommentVNode("",!0)],10,Xo))),256))])])}const oc="",xo=b({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{pageRange:[],showPrev:!0,showNext:!0,numPages:0,currentPageSize:this.pageSize,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.currentPageSize+1},last(){return Math.min(this.first+this.currentPageSize-1,this.total)}},watch:{total:"updatePageRange",showPrev:"updatePageRange",showNext:"updatePageRange",page(e){this.currentPage=e},pageSize(e){this.currentPageSize=e},currentPageSize(e){this.numPages=Math.ceil(this.total/e),this.currentPage>this.numPages&&(this.currentPage=this.numPages),this.updatePageRange()},currentPage(e,t){e!==t&&(this.updatePageRange(),this.$emit("update:page",e))}},created(){this.currentPage=this.page,this.currentPageSize=this.pageSize},mounted(){this.updatePageRange()},methods:{onClickPage(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)},getPageClass(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},updatePageRange(){const{showPrev:e,showNext:t,total:o,currentPageSize:s,currentPage:a}=this,i=e+t+1,r=this.numPages=Math.ceil(o/s);let l=1,d=1;r<=i?d=r:a<=e+1?d=i:a>=r-t?(d=r,l=r-i+1):(l=a-e,d=a+t);const h=[];h.push({index:a-1,type:"prev",disabled:a<=1}),l>=2&&h.push({index:1,text:1}),l>2&&h.push({index:Math.max(1,a-10),type:"ellipsis-prev"});for(let u=l;u<=d;u++)h.push({index:u,text:u,active:u===a});d<r-1&&h.push({index:Math.min(r,a+10),type:"ellipsis-next"}),d<=r-1&&h.push({index:r,text:r}),h.push({index:a+1,type:"next",disabled:a>=r}),this.pageRange=h}}},[["render",vo]]),es={class:"dito-switch-pane"},ts=["id","name","disabled"],ns=n.createElementVNode("div",{class:"dito-switch-button"},null,-1),os={key:0,class:"dito-switch-label"};function ss(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-switch",i.classes]),style:n.normalizeStyle(i.styles)},[n.createElementVNode("div",es,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input"},e.$attrs,{"onUpdate:modelValue":t[0]||(t[0]=r=>a.checked=r),type:"checkbox",name:o.name,disabled:o.disabled}),null,16,ts),[[n.vModelCheckbox,a.checked]]),ns,o.labels?(n.openBlock(),n.createElementBlock("span",os,[a.checked?n.renderSlot(e.$slots,"checked",{key:0},()=>[n.createTextVNode(n.toDisplayString(o.labels.checked||"on"),1)]):n.renderSlot(e.$slots,"unchecked",{key:1},()=>[n.createTextVNode(n.toDisplayString(o.labels.unchecked||"off"),1)])])):n.createCommentVNode("",!0)])],6)}const ac="",as=b({emits:["update:modelValue","change"],props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){const{checked:e,disabled:t}=this;return{"dito-checked":e,"dito-disabled":t}},styles(){const{labels:{checked:e,unchecked:t}={}}=this,o=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":o?`${o*1.5}rem`:null}}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",ss]]),ic="";function Bt({enabled:e},{slots:t}){return e?n.h(n.Transition,is,t):t.default()}Bt.props={enabled:{type:Boolean,default:!0}};const rs=Bt,H=(e,t)=>Object.assign(e.style,t),Dt=e=>getComputedStyle(e).height,is={name:"height",onAfterEnter(e){setTimeout(()=>H(e,{height:"auto"}))},onEnter(e){const{width:t}=getComputedStyle(e);H(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"});const{height:o}=getComputedStyle(e);H(e,{width:null,position:null,visibility:null,height:0}),Dt(e),setTimeout(()=>H(e,{height:o}))},onLeave(e){const{height:t}=getComputedStyle(e);H(e,{height:t}),Dt(e),setTimeout(()=>H(e,{height:0}))}},ls=F.defineComponent({name:"UseFocusTrap",props:["as","options"],setup(e,{slots:t}){let o;const s=F.ref(),a=()=>o&&o.activate(),i=()=>o&&o.deactivate();return F.watch(()=>q.unrefElement(s),r=>{r&&(o=Ht.createFocusTrap(r,e.options||{}),a())},{flush:"post"}),F.onScopeDispose(()=>i()),()=>{if(t.default)return F.h(e.as||"div",{ref:s},t.default())}}});function ds(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema"),d=n.resolveComponent("UseFocusTrap");return n.openBlock(),n.createElementBlock("div",{class:"dito-dialog",ref:"dialog",role:"dialog","aria-expanded":"true","aria-modal":"true",style:n.normalizeStyle({"--width":`${e.settings.width}px`}),onMouseup:t[1]||(t[1]=(...h)=>e.onMouseUp&&e.onMouseUp(...h))},[n.createVNode(d,{class:"dito-dialog__focus-trap",options:{immediate:!0,fallbackFocus:()=>e.$refs.dialog}},{default:n.withCtx(()=>[n.createElementVNode("form",{class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers((...h)=>e.submit&&e.submit(...h),["prevent"]))},[n.createVNode(l,{class:"dito-scroll",schema:e.schema,data:e.dialogData},{buttons:n.withCtx(()=>[n.createVNode(r,{class:"dito-buttons-large",buttons:e.buttonSchemas,data:e.dialogData},null,8,["buttons","data"])]),_:1},8,["schema","data"])],32)]),_:1},8,["options"])],36)}const lc="",cs=C.component("DitoDialog",{components:{UseFocusTrap:ls},emits:["remove"],provide(){return{$dialogComponent:()=>this}},props:{components:{type:Object,required:!0},buttons:{type:Object,required:!0},promise:{type:Object,required:!0},data:{type:Object,default:()=>({})},settings:{type:Object,default:()=>({width:480,clickToClose:!1})}},data(){const e=c.clone(this.data);for(const t in this.components)t in e||(e[t]=null);return{windowEvents:null,dialogData:e}},computed:{dialogComponent(){return this},schema(){return{components:this.components}},buttonSchemas(){return Object.fromEntries(Object.entries(re(this.buttons)).map(([e,t])=>(e==="cancel"&&!t.events&&(t={...t,events:{click:()=>this.cancel()}}),[e,t])))},hasButtons(){return Object.keys(this.buttonSchemas).length>0},hasCancel(){return!!this.buttonSchemas.cancel}},mounted(){this.windowEvents=de(window,{keyup:e=>{(this.hasCancel||!this.hasButtons)&&e.keyCode===27&&this.cancel()}})},unmounted(){this.windowEvents.remove()},methods:{remove(){this.$emit("remove")},resolve(e){this.promise.resolve(e),this.remove()},reject(e){this.promise.reject(e),this.remove()},submit(){this.resolve(this.dialogData)},cancel(){this.resolve(null)},close(){this.cancel()},onMouseUp(){this.settings.clickToClose&&this.close()}}}),wt=b(cs,[["render",ds]]),v={data(){return{domHandlers:[]}},beforeUnmount(){for(const{remove:e}of this.domHandlers)e();this.domHandlers=[]},methods:{domOn(e,t,o){const s=de(e,c.isObject(t)?t:{[t]:o});return this.domHandlers.push(s),s}}},hs={class:"dito-root"},us={class:"dito-page dito-scroll-parent"},ps=[n.createElementVNode("span",null,"Login",-1)];function ms(e,t,o,s,a,i){const r=n.resolveComponent("VueNotifications"),l=n.resolveComponent("DitoDialog"),d=n.resolveComponent("DitoMenu"),h=n.resolveComponent("DitoAccount"),u=n.resolveComponent("DitoHeader"),p=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",hs,[n.createVNode(r,{class:"dito-notifications",ref:"notifications",position:"top right",classes:"dito-notification"},null,512),n.createVNode(n.TransitionGroup,{name:"dito-dialog"},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.dialogs,(g,f)=>(n.openBlock(),n.createBlock(l,{key:f,components:g.components,buttons:g.buttons,promise:g.promise,data:g.data,settings:g.settings,onRemove:m=>e.removeDialog(f)},null,8,["components","buttons","promise","data","settings","onRemove"]))),128))]),_:1}),n.createVNode(d),n.createElementVNode("main",us,[n.createVNode(u,{spinner:e.options.spinner,isLoading:e.isLoading},{default:n.withCtx(()=>[e.user?(n.openBlock(),n.createBlock(h,{key:0})):e.allowLogin?(n.openBlock(),n.createElementBlock("a",{key:1,class:"dito-login",onClick:t[0]||(t[0]=g=>e.rootComponent.login())},ps)):n.createCommentVNode("",!0)]),_:1},8,["spinner","isLoading"]),n.createVNode(p)])])}const cc="",fs=C.component("DitoRoot",{mixins:[v],components:{DitoDialog:wt},provide(){return{$views:()=>this.resolvedViews}},props:{unresolvedViews:{type:[Object,Function,Promise],required:!0},options:{type:Object,default:()=>({})}},data(){return{resolvedViews:{},removeRoutes:null,dialogs:{},allowLogin:!1,loadingCount:0}},computed:{notifications(){return this.$refs.notifications},isLoading(){return this.loadingCount>0}},created(){this.appState.title=document.title||"Dito.js Admin",this.appState.routeComponents=[]},async mounted(){this.domOn(document,{click:e=>{e.target.closest(".dito-label")||(this.appState.activeLabel=null)},keyup:e=>{e.code==="Tab"&&(this.appState.activeLabel=null)}});try{this.allowLogin=!1,await this.fetchUser()?await this.resolveViews():await this.login()}catch(e){console.error(e)}this.allowLogin=!0},methods:{notify({type:e="info",title:t,text:o}={}){t||(t={warning:"Warning",error:"Error",info:"Information",success:"Success"}[e]||"Notification"),o=`<p>${c.asArray(o).join("</p> <p>")}</p>`.replace(/\n|\r\n|\r/g,"<br>");const s={warning:"warn",error:"error",info:"log",success:"log"}[e]||"error";console[s](c.stripTags(o));const{notifications:a=!0}=this.api;if(a){const{durationFactor:i=20}=a,r=(40+o.length+t.length)*i;this.$notify({type:e,title:t,text:o,duration:r})}},closeNotifications(){this.notifications.destroyAll()},registerLoading(e){this.loadingCount+=e?1:-1},showDialog({components:e,buttons:t,data:o,settings:s}){return new Promise(async(a,i)=>{const r=[];if(await Y(this.api,{components:e},r,0),r.length>0)throw new Error("Dialogs do not support components that produce routes");const l=`dialog-${++gs}`;this.dialogs[l]={components:e,buttons:t,data:o,settings:s,promise:{resolve:a,reject:i}}})},removeDialog(e){delete this.dialogs[e]},async login(){var s,a;this.allowLogin=!0;const{additionalComponents:e,redirectAfterLogin:t}=this.options.login||{},o=await this.showDialog({components:{username:{type:"text",autofocus:!0},password:{type:"password"},...e},buttons:{cancel:{},login:{type:"submit"}}});if(o)try{const i=await this.sendRequest({resource:this.api.users.login,data:o,internal:!0});t?location.replace(t):(this.setUser(i.data.user),await this.resolveViews())}catch(i){const r=(a=(s=i.response)==null?void 0:s.data)==null?void 0:a.error;this.notify({type:"error",title:"Authentication Error",text:r||i}),r||console.error(i,i.response),this.login()}},navigateHome(){return this.navigate("/")},async logout(){try{(await this.sendRequest({resource:this.api.users.logout,internal:!0})).data.success&&(this.setUser(null),this.navigateHome())}catch(e){console.error(e)}},async fetchUser(){let e=null;try{e=(await this.sendRequest({resource:this.api.users.session,internal:!0})).data.user||null}catch(t){this.notify({type:"error",title:"Authentication Error",text:t})}return this.setUser(e),e},setUser(e){this.appState.user=e&&Object.setPrototypeOf(e,xn.prototype),e||(this.resolvedViews={},this.navigateHome())},async ensureUser(){await this.fetchUser()||await this.login()},async resolveViews(){var o;try{this.resolvedViews=await oe(this.unresolvedViews)}catch(s){return s.request||console.error(s),this.login()}const e=await c.mapConcurrently(Object.entries(this.resolvedViews),([s,a])=>An(gt,this.api,a,s)),{fullPath:t}=this.$route;(o=this.removeRoutes)==null||o.call(this),this.removeRoutes=bs(this.$router,[{name:"root",path:"/",components:{}},...e]),this.$router.replace(t)}}});let gs=0;function bs(e,t){const o=[];for(const s of t){const a=e.addRoute(s);o.push(a)}return()=>{for(const s of o)s()}}const Ee=b(fs,[["render",ms]]),ys={class:"dito-menu dito-scroll-parent"},ks={class:"dito-scroll"};function Cs(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("nav",ys,[n.createElementVNode("h1",null,n.toDisplayString(e.appState.title),1),n.createElementVNode("ul",ks,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.views,l=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:0,class:"dito-link",to:`/${l.path}`,activeClass:"dito-active"},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l)),1)]),_:2},1032,["to"])):n.createCommentVNode("",!0)]))),256))])])}const hc="",$s=C.component("DitoMenu",{}),Bs=b($s,[["render",Cs]]),Ds={class:"dito-spinner"};function ws(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("div",Ds,[n.createElementVNode("div",{class:"v-pulse v-pulse1",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay1])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse2",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay2])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse3",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay3])},null,4)],512)),[[n.vShow,o.loading]])}const uc="",Vt=b({props:{loading:{type:Boolean,default:!0},color:{type:String,default:"#5dc596"},size:{type:String,default:"15px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},data(){return{spinnerStyle:{backgroundColor:this.color,width:this.size,height:this.size,margin:this.margin,borderRadius:this.radius,display:"inline-block",animationName:"v-pulseStretchDelay",animationDuration:"0.75s",animationIterationCount:"infinite",animationTimingFunction:"cubic-bezier(.2,.68,.18,1.08)",animationFillMode:"both"},spinnerDelay1:{animationDelay:"0.12s"},spinnerDelay2:{animationDelay:"0.24s"},spinnerDelay3:{animationDelay:"0.36s"}}}},[["render",ws]]),Vs={class:"dito-header"},Ss={class:"dito-trail"};function Ps(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoSpinner");return n.openBlock(),n.createElementBlock("nav",Vs,[n.createElementVNode("div",Ss,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.trail,(d,h)=>(n.openBlock(),n.createElementBlock("li",null,[h===e.trail.length-1?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(e.getBreadcrumbClass(d))},n.toDisplayString(d.breadcrumb),3)):(n.openBlock(),n.createBlock(r,{key:1,class:"dito-breadcrumb",to:d.path},{default:n.withCtx(()=>[n.createElementVNode("span",{class:n.normalizeClass(e.getBreadcrumbClass(d))},n.toDisplayString(d.breadcrumb),3)]),_:2},1032,["to"]))]))),256))]),e.isLoading?(n.openBlock(),n.createBlock(l,{key:0})):n.createCommentVNode("",!0)]),n.renderSlot(e.$slots,"default")])}const mc="",Es=C.component("DitoHeader",{components:{DitoSpinner:Vt},props:{spinner:{type:Object,default:null},isLoading:{type:Boolean,default:!1}},computed:{trail(){return this.appState.routeComponents.filter(e=>!!e.routeRecord)}},created(){const{size:e="8px",color:t="#999"}=this.spinner||{},{props:o}=Vt;o.size.default=e,o.color.default=t},methods:{getBreadcrumbClass(e){return{"dito-dirty":e.isDirty}}}}),Ns=b(Es,[["render",Ps]]),St={mixins:[v],data(){return{pulldown:{open:!1,startTime:0,checkTime:!0,events:{mousedown:()=>{this.setPulldownOpen(!1),this.pulldown.handlers.remove()},mouseup:()=>{this.onPulldownMouseUp(null)&&this.pulldown.handlers.remove()}},handlers:null}}},methods:{onPulldownMouseDown(e){e?this.checkTime=!1:(this.setPulldownOpen(!0),this.checkTime=!0)},onPulldownMouseUp(e){const{startTime:t}=this.pulldown;if(!this.checkTime||t&&Date.now()-t>250)return this.setPulldownOpen(!1),e&&this.onPulldownSelect(e),!0},onPulldownSelect(){},setPulldownOpen(e){this.pulldown.open=e,this.pulldown.startTime=e?Date.now():0,e&&(this.pulldown.handlers=this.domOn(document,this.pulldown.events))}}},Os={class:"dito-account"},Ls=["onMousedown","onMouseup"];function Fs(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Os,[n.createElementVNode("a",{onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},[n.createElementVNode("span",null,n.toDisplayString(e.user.username),1)],32),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(r),41,Ls)]))),256))],2)])}const fc="",Ts=C.component("DitoAccount",{mixins:[St],data(){return{items:{settings:"Settings",logout:"Logout"}}},methods:{onPulldownSelect(e){switch(e){case"logout":this.rootComponent.logout();break;case"settings":console.info("TODO: Implement Settings");break}}}}),_s=b(Ts,[["render",Fs]]);function js(e,t,o,s,a,i){return e.content?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.options.tag||e.tag),{key:0,class:n.normalizeClass(e.classes),style:n.normalizeStyle(e.styles)},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.options.text),1)]),_:1},8,["class","style"])):n.createCommentVNode("",!0)}const Ms=C.component("DitoElement",{props:{tag:{type:String,default:"span"},content:{type:[String,Object],default:null}},computed:{options(){const{content:e}=this;return c.isObject(e)?e:{text:e}},classes(){return{...this.$attrs.class,...Pt(this.options.class)}},styles(){return{...this.$attrs.style,...Pt(this.options.style)}}}});function Pt(e){return c.asArray(e).reduce((t,o)=>(c.isString(o)?t[o]=!0:c.isObject(o)&&Object.assign(t,o),t),{})}const Rs=b(Ms,[["render",js]]),qs=["for","innerHTML"];function Is(e,t,o,s,a,i){const r=n.resolveComponent("DitoElement");return e.text||e.collapsible?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),n.mergeProps({key:0,class:"dito-label"},e.attributes,{class:{"dito-active":e.isActive}}),{default:n.withCtx(()=>[e.collapsible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":!e.collapsed}])},null,2)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.prefixes,(l,d)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-prefix",key:`prefix-${d}`,tag:"span",content:l},null,8,["content"]))),128)),n.createElementVNode("label",{for:e.dataPath,innerHTML:e.text},null,8,qs),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.suffixes,(l,d)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-suffix",key:`suffix-${d}`,tag:"span",content:l},null,8,["content"]))),128)),n.renderSlot(e.$slots,"edit-buttons")]),_:3},16,["class"])):n.createCommentVNode("",!0)}const gc="",zs=C.component("DitoLabel",{emits:["expand"],props:{label:{type:[String,Object],default:null},dataPath:{type:String,default:null},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1}},computed:{tag(){return this.collapsible?"a":"div"},text(){const{label:e}=this;return c.isObject(e)?e==null?void 0:e.text:e},prefixes(){var e;return c.asArray((e=this.label)==null?void 0:e.prefix)},suffixes(){var e;return c.asArray((e=this.label)==null?void 0:e.suffix)},attributes(){return this.collapsible?{onClick:this.onClick}:{}},isActive(){return this.appState.activeLabel===this}},methods:{onClick(){this.appState.activeLabel=this,this.$emit("expand",this.collapsed)}}}),As=b(zs,[["render",Is]]),Ne={methods:{getItemFormSchema:De,getItemUid:Xn,getItemId(e,t,o=null){return this.isTransient&&o!==null?String(o):ut(e,t)},getItemDataPath(e,t){let{dataPath:o}=this;return e!==this.schema&&(o=L(o,e.name)),t!=null&&(o=L(o,t)),o},findItemIdIndex(e,t,o){const s=this.isTransient?o:t==null?void 0:t.findIndex((a,i)=>this.getItemId(e,a,i)===o);return s!==-1?s:null},getItemLabel(e,t,{index:o=null,extended:s=!1,asObject:a=!1}={}){const{itemLabel:i}=e;if(!t||!s&&i===!1)return null;let r;const l=()=>r||(r=this.getItemDataPath(e,o));let d;const h=()=>d||(d=this.getLabel(De(e,t,this.context)));let u,p,g;if(c.isFunction(i)){const m=i.call(this,new V(this,{nested:!1,data:t,value:t,index:o,get dataPath(){return l()},get formLabel(){return h()}}));c.isObject(m)?{text:u,prefix:p,suffix:g}=m:u=m,s=!1}else if(c.isString(i)&&!(i in t))u=i;else{const{columns:m}=e,k=c.isString(i)&&i||X(e)&&m&&Object.keys(m)[0]||"name";u=t[k]}const f=!!u;if(u==null&&(s=!0,u=X(e)&&o!==null?u=`${o+1}`:""),s){const m=h();m&&(u=`${m} ${f?`'${u}'`:u}`)}return a?{text:u,prefix:p,suffix:g}:u}}},Us={class:"dito-schema"},Hs={class:"dito-schema-content"};function Ws(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTabs"),d=n.resolveComponent("DitoClipboard"),h=n.resolveComponent("DitoPane"),u=n.resolveComponent("TransitionHeight"),p=n.resolveComponent("DitoPanels");return n.openBlock(),n.createElementBlock("div",Us,[n.createElementVNode("div",Hs,[e.hasLabel||e.hasTabs||e.clipboard?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-schema-header",{"dito-schema-menu-header":e.menuHeader}])},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.dataPath,collapsible:e.collapsible,collapsed:!e.opened,onExpand:e.onExpand},n.createSlots({_:2},[e.inlined?{name:"edit-buttons",fn:n.withCtx(()=>[n.renderSlot(e.$slots,"edit-buttons")]),key:"0"}:void 0]),1032,["label","dataPath","collapsible","collapsed","onExpand"])):n.createCommentVNode("",!0),e.tabs?(n.openBlock(),n.createBlock(l,{key:1,tabs:e.tabs,selectedTab:e.selectedTab},null,8,["tabs","selectedTab"])):n.createCommentVNode("",!0),n.createVNode(d,{clipboard:e.clipboard,dataPath:e.dataPath,data:e.data},null,8,["clipboard","dataPath","data"])],2)):n.createCommentVNode("",!0),e.hasTabs?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(e.tabs,(g,f)=>(n.openBlock(),n.createBlock(h,{class:"dito-pane-tab",ref_for:!0,ref:"tabs",key:f,visible:e.selectedTab===f,tab:f,schema:g,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasMainPane,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["visible","tab","schema","dataPath","data","meta","store","single","disabled","generateLabels"]))),128)):n.createCommentVNode("",!0),n.createVNode(u,{enabled:e.inlined},{default:n.withCtx(()=>[e.hasMainPane&&e.opened?(n.openBlock(),n.createBlock(h,{key:0,class:"dito-pane-main",ref:"components",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasTabs,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","disabled","generateLabels"])):n.createCommentVNode("",!0)]),_:1},8,["enabled"]),!e.inlined&&e.isPopulated?n.renderSlot(e.$slots,"buttons",{key:2}):n.createCommentVNode("",!0)]),e.inlined?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.hasLabel?n.createCommentVNode("",!0):n.renderSlot(e.$slots,"edit-buttons",{key:0})],64)):e.isPopulated?(n.openBlock(),n.createBlock(p,{key:1,panels:e.panelEntries,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])):n.createCommentVNode("",!0)])}const bc="",Ks=C.component("DitoSchema",{mixins:[Ne],components:{TransitionHeight:rs},provide(){return{$schemaComponent:()=>this}},inject:["$schemaParentComponent"],props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},label:{type:[String,Object],default:null},inlined:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0},hasOwnData:{type:Boolean,default:!1},menuHeader:{type:Boolean,default:!1}},data(){const{data:e}=this.schema;return{...e&&c.isFunction(e)?e(this.context):e,componentsRegistry:{},panesRegistry:{},panelsRegistry:{}}},computed:{schemaComponent(){return this},parentSchemaComponent(){return this.hasOwnData?null:this.parentComponent.schemaComponent},panelEntries(){const e=dt(this.schema.panels,"");for(const t of this.panes)e.push(...t.panelEntries);return e},tabs(){return U(this.schema.tabs)},selectedTab(){var o,s;const e=((o=this.$route.hash)==null?void 0:o.slice(1))||null,t=e&&this.shouldRender(this.tabs[e])?e:((s=this.defaultTab)==null?void 0:s.name)||null;return t!==e&&this.$router.replace({hash:`#${t}`}),t},defaultTab(){let e=null;if(this.tabs)for(const t of Object.values(this.tabs)){const{defaultTab:o}=t;if(c.isFunction(o)?o(this.context):o)return t;e||(e=t)}return e},clipboard(){var e;return(e=this.schema)==null?void 0:e.clipboard},parentData(){const e=me(this.rootData,this.dataPath,!1);return e!==this.data?e:null},processedData(){return this.processData({target:"server",schemaOnly:!0})},clipboardData(){return{$schema:this.schema.name,...this.processData({target:"clipboard",schemaOnly:!0})}},item(){return this.data},parentItem(){return this.parentData},rootItem(){return this.rootData},processedItem(){return this.processedData},clipboardItem(){return this.clipboardData},formLabel(){return this.getLabel(this.getItemFormSchema(this.sourceSchema,this.data,this.context))},isDirty(){return this.someComponent(e=>e.isDirty)},isTouched(){return this.someComponent(e=>e.isTouched)},isValid(){return this.everyComponent(e=>e.isValid)},isValidated(){return this.everyComponent(e=>e.isValidated)},hasData(){return!!this.data},hasLabel(){return!!this.label||this.collapsible},hasTabs(){return!this.inlined&&!!this.tabs},hasMainPane(){const{components:e}=this.schema;return!!e&&Object.keys(e).length>0},opened:Ce("opened",{default(){return!this.collapsed}}),components(){return Object.values(this.componentsRegistry)},panes(){return Object.values(this.panesRegistry)},panels(){return Object.values(this.panelsRegistry)},componentsByDataPath(){return this._listEntriesByDataPath(this.componentsRegistry)},panesByDataPath(){return this._listEntriesByDataPath(this.panesRegistry)},panelsByDataPath(){return this._listEntriesByDataPath(this.panelsRegistry)}},created(){this._register(!0),this.setupSchemaFields(),this.delegate("change",this.parentSchemaComponent),this.emitEvent("initialize")},beforeUnmount(){this.emitEvent("destroy"),this._register(!1)},methods:{getComponentsByDataPath(e,t){return this._getEntriesByDataPath(this.componentsByDataPath,e,t)},getComponentByDataPath(e,t){return this.getComponentsByDataPath(e,t)[0]||null},getComponentsByName(e,t){return this._getEntriesByName(this.componentsByDataPath,e,t)},getComponentByName(e,t){return this.getComponentsByName(e,t)[0]||null},getComponents(e,t){return this._getEntries(this.componentsByDataPath,e,t)},getComponent(e,t){return this.getComponents(e,t)[0]||null},getPanelsByDataPath(e,t){return this._getEntriesByDataPath(this.panelsByDataPath,e,t)},getPanelByDataPath(e,t){return this.getPanelsByDataPath(e,t)[0]||null},getPanels(e,t){return this._getEntries(this.panelsByDataPath,e,t)},getPanel(e,t){return this.getPanels(e,t)[0]||null},someComponent(e){return this.isPopulated&&this.components.some(e)},everyComponent(e){return this.isPopulated&&this.components.every(e)},onExpand(e){this.emitEvent("expand",{context:{expand:e}}),(!this.opened||e||this.validateAll())&&(this.opened=e)},onChange(){this.emitEvent("change")},resetValidation(){for(const e of this.components)e.resetValidation()},clearErrors(){for(const e of this.components)e.clearErrors()},focus(){var e;(e=this.parentSchemaComponent)==null||e.focus(),this.opened=!0},validateAll(e,t=!0){const{componentsByDataPath:o}=this;let s;if(e){const r=c.isFunction(e)?e:c.isRegExp(e)?l=>e.test(l):null;s=r?Object.keys(o).filter(r):c.isArray(e)?e:[e]}t&&this.clearErrors();let a=!0,i=!0;s||(s=Object.keys(o));for(const r of s){const l=this.getComponentsByDataPath(r);for(const d of l)d.validate(t)||(t&&i&&d.focus(),i=!1,a=!1)}return t&&!a&&this.notifyErrors(),a},verifyAll(e){return this.validateAll(e,!1)},async showValidationErrors(e,t){var a;this.clearErrors();let o=!0;const s=[];for(const[i,r]of Object.entries(e)){const l=this.hasOwnData?L(this.dataPath,i):i,d=c.parseDataPath(l);let h=!1;const u=this.getComponentsByDataPath(d);for(const p of u)p.showValidationErrors(r,o&&t)&&(h=!0,o=!1);if(!h){const p=d.pop();for(;d.length>0;){const f=this.getComponentsByDataPath(d);for(const m of f)if(await((a=m.navigateToComponent)==null?void 0:a.call(m,l,k=>{let P=!1;for(const w of k){const $=e[w.dataPath];$&&w.showValidationErrors($,o&&t)&&(P=!0,o=!1)}return P})))return;d.pop()}const g=c.labelize(p);for(const f of r){const m=g?`The field ${g}`:`The ${this.formLabel}`;s.push(`${m} ${f.message}`)}}o=!1}o||this.notifyErrors(s.join(`
2
- `))},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,ot(this.schema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={};for(const[o,s]of Object.entries(e))(c.isArray(s)||c.isObject(s))&&this.getComponentsByName(o).some(i=>i.providesData)||(t[o]=s);return t},processData({target:e="clipboard",schemaOnly:t=!0}={}){return Gn(this.schema,this.sourceSchema,this.data,this.dataPath,{component:this,schemaOnly:t,target:e})},_register(e){var t;(t=this.$schemaParentComponent())==null||t._registerSchemaComponent(this,e)},_registerComponent(e,t){var o;this._registerEntry(this.componentsRegistry,e,t),(o=this.parentSchemaComponent)==null||o._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||(t[s]=[])).push(o),t},{})},_getEntries(e,t,o){return c.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t,o):this._getEntriesByName(e,t,o)},_getEntriesByDataPath(e,t,o){return this._filterEntries(e[c.normalizeDataPath(t)]||[],o)},_getEntriesByName(e,t,o){return this._filterEntries(e[L(this.dataPath,t)]||[],o)},_filterEntries(e,t){return t?e.filter(t):e}}}),Ys=b(Ks,[["render",Ws]]);function Js(e,t,o,s,a,i){const r=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:n.normalizeClass(["dito-schema-inlined",{"dito-schema-compact":e.isCompact}]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,inlined:!0,disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible,generateLabels:!e.isCompact},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(r,{key:0,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.$emit("delete"))},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","disabled","collapsed","collapsible","generateLabels","class"])}const yc="",Qs=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null}},computed:{isCompact(){return xe(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),Gs=b(Qs,[["render",Js]]),Xs={key:0,class:"dito-pane"},Zs={key:0,class:"dito-break"},vs={key:2,class:"dito-break"};function xs(e,t,o,s,a,i){const r=n.resolveComponent("DitoContainer");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",Xs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:l,dataPath:d,nestedDataPath:h,nested:u,store:p})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[l.break==="before"?(n.openBlock(),n.createElementBlock("div",Zs)):n.createCommentVNode("",!0),e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:h,schema:l,dataPath:d,data:e.data,meta:e.meta,store:p,single:e.isSingleComponent,nested:u,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","nested","disabled","generateLabels"])):n.createCommentVNode("",!0),l.break==="after"?(n.openBlock(),n.createElementBlock("div",vs)):n.createCommentVNode("",!0)],64))),256))],512)),[[n.vShow,e.visible]]):n.createCommentVNode("",!0)}const kc="",ea=C.component("DitoPane",{provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0}},computed:{tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){var t,o;const e=(t=this.sourceSchema)==null?void 0:t.wrapPrimitives;return Object.entries(((o=this.schema)==null?void 0:o.components)||{}).map(([s,a])=>{a.name=s;const i=et(a),r=L(this.dataPath,s);return{schema:a,dataPath:i&&!e?r:this.dataPath,nestedDataPath:r,nested:i,store:i?this.getChildStore(s):this.store}})},panelEntries(){return this.componentSchemas.flatMap(({schema:e,nestedDataPath:t})=>ht(e,t,this.schemaComponent,this.tabComponent))},isSingleComponent(){return this.single&&this.componentSchemas.length===1}},created(){this._register(!0)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){this.tab&&this.$router.push({hash:`#${this.tab}`})}}}),ta=b(ea,[["render",xs]]);function na(e){const t=c.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function oa(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClass]),style:n.normalizeStyle(e.containerStyle)},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.labelDataPath,class:n.normalizeClass(e.componentClass)},null,8,["label","dataPath","class"])):n.createCommentVNode("",!0),(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{class:n.normalizeClass(["dito-component",e.componentClass]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:e.single,nested:e.nested,disabled:e.componentDisabled,onErrors:e.onErrors},null,40,["schema","dataPath","data","meta","store","single","nested","disabled","class","onErrors"])),n.createVNode(l,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const Cc="",sa=C.component("DitoContainer",{props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},generateLabels:{type:Boolean,default:!0}},data(){return{errors:null}},computed:{context(){return new V(this,{nested:this.nested})},typeComponent(){return te(this.schema.type)},hasLabel(){var t;const{label:e}=this.schema;return e!==!1&&(!!e||this.generateLabels&&((t=this.typeComponent)==null?void 0:t.generateLabel))},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},componentWidth:y("width",{type:[String,Number],default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultWidth},get(e){return e===void 0?1:c.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),componentWidthOperator:y("width",{type:String,get(e){return c.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:y("visible",{type:Boolean,default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultVisible}}),componentDisabled:y("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),containerClass(){const{class:e}=this.schema,t="dito-container";return{[`${t}--single`]:this.single,[`${t}--has-label`]:this.hasLabel,[`${t}--align-bottom`]:Qn(this.schema),[`${t}--omit-padding`]:Jn(this.schema),...c.isString(e)?{[e]:!0}:e}},componentBasis(){const e=this.componentWidth,t=[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e):/[a-z]/.test(e)?e:na(e)*100;return c.isNumber(t)?`${t}%`:t},containerStyle(){const e=this.componentWidthOperator===">"||this.componentWidth==="fill",t=this.componentWidthOperator==="<";return{flex:`${e?1:0} ${t?1:0} ${this.componentBasis}`}},componentClass(){const e=this.componentBasis==="auto";return{"dito-single":this.single,"dito-disabled":this.componentDisabled,"dito-width-fill":!e||this.componentWidth==="fill","dito-width-auto":e,"dito-has-errors":!!this.errors}}},methods:{onErrors(e){this.errors=e}}}),aa=b(sa,[["render",oa]]),ra={class:"dito-tabs"};function ia(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",ra,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(l,d)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{class:n.normalizeClass(["dito-link",{"dito-active":e.selectedTab===d}]),key:d,to:{hash:`#${d}`}},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l,d)),1)]),_:2},1032,["to","class"])):n.createCommentVNode("",!0)],64))),256))])}const $c="",la=C.component("DitoTabs",{props:{tabs:{type:Object,default:null},selectedTab:{type:String,default:null}}}),da=b(la,[["render",ia]]),ca={class:"dito-panel-title"};function ha(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createElementVNode("label",ca,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(l,{class:"dito-panel-schema",schema:e.panelSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled,hasOwnData:e.hasOwnData},{buttons:n.withCtx(()=>[n.createVNode(r,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]])}const Bc="",ua=C.component("DitoPanel",{mixins:[mt],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return re(this.schema.buttons)},target(){return this.schema.target||this.dataPath},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:y("visible",{type:Boolean,default:!0})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=c.isFunction(e)?e(this.context):e)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),pa=b(ua,[["render",ha]]),ma={key:0,class:"dito-panels"};function fa(e,t,o,s,a,i){const r=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",ma,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:d,tabComponent:h})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:e.getPanelKey(d,h),schema:l,dataPath:d,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled!=null?l.disabled:e.disabled,panelTabComponent:h},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Dc="",ga=C.component("DitoPanels",{props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),ba=b(ga,[["render",fa]]);function Et(e){return e&&c.asArray(e).some(t=>t.type!==n.Comment)}function ya(e,t={}){return e=c.isString(e)?n.useSlots()[e]:e,Et(e==null?void 0:e(t))}const ka={key:0,class:"dito-buttons"},Ca={key:0,class:"dito-container"};function $a(e,t,o,s,a,i){var d,h;const r=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",ka,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(u,p)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(u)?(n.openBlock(),n.createBlock(r,{key:p,schema:u,dataPath:p,data:e.data,meta:e.meta,store:e.getChildStore(u.name),disabled:e.disabled,generateLabels:!1},null,8,["schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList((h=(d=e.$slots).default)==null?void 0:h.call(d),u=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(u)?(n.openBlock(),n.createElementBlock("div",Ca,[n.createVNode(l,{vnode:u},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const wc="",Ba=C.component("DitoButtons",{provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[L(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:ya,hasVNodeContent:Et}}),Da=b(Ba,[["render",$a]]);function wa(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),d=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(d,{class:"dito-edit-buttons dito-buttons-round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.isDraggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.isEditable?(n.openBlock(),n.createBlock(r,n.mergeProps({key:1,class:"dito-button",to:{path:e.editPath}},e.getButtonAttributes(e.verbs.edit)),null,16,["to"])):n.createCommentVNode("",!0),e.isCreatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,path:e.createPath,verb:e.verbs.create,text:e.createButtonText},null,8,["schema","path","verb","text"])):n.createCommentVNode("",!0),e.isDeletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=h=>e.$emit("delete"))}),null,16)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store"])}const Vc="",Va=C.component("DitoEditButtons",{emits:["delete"],props:{draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null},buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggable(){return this.hasOption("draggable")},isEditable(){return this.hasOption("editable")&&!!this.editPath},isCreatable(){return this.hasOption("creatable")&&!!this.createPath},isDeletable(){return this.hasOption("deletable")},createButtonText(){var e;return((e=this.schema.creatable)==null?void 0:e.label)||this.formLabel&&`${c.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasOption(e){return!!(this[e]&&this.schema[e]!==!1)}}}),Sa=b(Va,[["render",wa]]),Pa={class:"dito-create-button"},Ea=["title"],Na=["onMousedown","onMouseup"],Oa=["type","title"];function La(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Pa,[e.showPulldown?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:"button",title:e.labelize(e.verb),onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},n.toDisplayString(e.text),43,Ea),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.forms,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(r)?n.withDirectives((n.openBlock(),n.createElementBlock("a",{key:0,class:n.normalizeClass(e.getFormClass(r,l)),onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(r)),43,Na)),[[n.vShow,e.shouldShow(r)]]):n.createCommentVNode("",!0)]))),256))],2)],64)):(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:e.isInlined?"button":"submit",title:e.labelize(e.verb),onClick:t[1]||(t[1]=r=>e.createItem(e.forms.default))},n.toDisplayString(e.text),11,Oa))])}const Sc="",Fa=C.component("DitoCreateButton",{mixins:[St],props:{schema:{type:Object,required:!0},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null}},computed:{forms(){return Q(this.schema,this.context)},isInlined(){return we(this.schema)},showPulldown(){return Object.keys(this.forms).length>1||!this.forms.default}},methods:{createItem(e,t=null){if(this.shouldRender(e)&&!this.shouldDisable(e))this.isInlined?this.sourceComponent.createItem(e,t):this.$router.push({path:`${this.path}/create`,query:{type:t}});else throw new Error("Not allowed to create item for given form")},getFormClass(e,t){return{[`dito-type-${t}`]:!0,"dito-disabled":this.shouldDisable(e)}},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),Ta=b(Fa,[["render",La]]),_a={key:0,class:"dito-clipboard dito-buttons dito-buttons-round"},ja=["disabled"],Ma=["disabled"];function Ra(e,t,o,s,a,i){return e.clipboard?(n.openBlock(),n.createElementBlock("div",_a,[n.createElementVNode("button",{class:"dito-button dito-button-copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...r)=>e.onCopy&&e.onCopy(...r))},null,8,ja),n.createElementVNode("button",{class:"dito-button dito-button-paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...r)=>e.onPaste&&e.onPaste(...r))},null,8,Ma)])):n.createCommentVNode("",!0)}const qa=C.component("DitoClipboard",{mixins:[v],props:{clipboard:{type:[Boolean,Object],default:!1},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null}},data(){return{copyEnabled:!1,pasteEnabled:!1,fixClipboard:!0}},computed:{clipboardOptions(){return c.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>c.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>t}},mounted(){this.domOn(document,{copy:this.checkClipboard}),this.domOn(window,{focus:this.checkClipboard}),this.$watch("data",{immediate:!0,handler:(e,t)=>{e!==t&&this.checkClipboard()}})},methods:{async getClipboardData(e){var a,i,r,l,d;let{clipboardData:t}=this.appState;try{const h=await((i=(a=navigator.clipboard)==null?void 0:a.readText)==null?void 0:i.call(a));this.fixClipboard&&h&&(await((l=(r=navigator.clipboard)==null?void 0:r.writeText)==null?void 0:l.call(r,h)),this.fixClipboard=!1),h&&(t=JSON.parse(h))}catch(h){e&&(console.error(h,h.name,h.message),h.name==="SyntaxError"&&alert(c.deindent`
1
+ (function(n,N){typeof exports=="object"&&typeof module<"u"?module.exports=N(require("vue"),require("vue-router"),require("@kyvg/vue3-notification"),require("@ditojs/utils"),require("nanoid"),require("vue-demi"),require("focus-trap"),require("@vueuse/core"),require("sortablejs"),require("codeflask"),require("tinycolor2"),require("@lk77/vue3-color"),require("@tiptap/vue-3"),require("@tiptap/extension-document"),require("@tiptap/extension-text"),require("@tiptap/extension-bold"),require("@tiptap/extension-code"),require("@tiptap/extension-italic"),require("@tiptap/extension-link"),require("@tiptap/extension-strike"),require("@tiptap/extension-underline"),require("@tiptap/extension-blockquote"),require("@tiptap/extension-code-block"),require("@tiptap/extension-hard-break"),require("@tiptap/extension-heading"),require("@tiptap/extension-paragraph"),require("@tiptap/extension-horizontal-rule"),require("@tiptap/extension-ordered-list"),require("@tiptap/extension-bullet-list"),require("@tiptap/extension-list-item"),require("@tiptap/extension-history"),require("vue-multiselect"),require("filesize-parser"),require("filesize"),require("vue-upload-component")):typeof define=="function"&&define.amd?define(["vue","vue-router","@kyvg/vue3-notification","@ditojs/utils","nanoid","vue-demi","focus-trap","@vueuse/core","sortablejs","codeflask","tinycolor2","@lk77/vue3-color","@tiptap/vue-3","@tiptap/extension-document","@tiptap/extension-text","@tiptap/extension-bold","@tiptap/extension-code","@tiptap/extension-italic","@tiptap/extension-link","@tiptap/extension-strike","@tiptap/extension-underline","@tiptap/extension-blockquote","@tiptap/extension-code-block","@tiptap/extension-hard-break","@tiptap/extension-heading","@tiptap/extension-paragraph","@tiptap/extension-horizontal-rule","@tiptap/extension-ordered-list","@tiptap/extension-bullet-list","@tiptap/extension-list-item","@tiptap/extension-history","vue-multiselect","filesize-parser","filesize","vue-upload-component"],N):(n=typeof globalThis<"u"?globalThis:n||self,n["dito-admin"]=N(n.vue,n["vue-router"],n["@kyvg/vue3-notification"],n["@ditojs/utils"],n.nanoid,n["vue-demi"],n["focus-trap"],n["@vueuse/core"],n.sortablejs,n.codeflask,n.tinycolor2,n["@lk77/vue3-color"],n["@tiptap/vue-3"],n["@tiptap/extension-document"],n["@tiptap/extension-text"],n["@tiptap/extension-bold"],n["@tiptap/extension-code"],n["@tiptap/extension-italic"],n["@tiptap/extension-link"],n["@tiptap/extension-strike"],n["@tiptap/extension-underline"],n["@tiptap/extension-blockquote"],n["@tiptap/extension-code-block"],n["@tiptap/extension-hard-break"],n["@tiptap/extension-heading"],n["@tiptap/extension-paragraph"],n["@tiptap/extension-horizontal-rule"],n["@tiptap/extension-ordered-list"],n["@tiptap/extension-bullet-list"],n["@tiptap/extension-list-item"],n["@tiptap/extension-history"],n["vue-multiselect"],n["filesize-parser"],n.filesize,n["vue-upload-component"]))})(this,function(n,N,R,c,Ut,F,Ht,q,Wt,Kt,ue,Yt,x,Jt,Qt,Gt,Xt,Zt,vt,xt,en,tn,nn,on,sn,an,rn,ln,dn,cn,hn,un,pn,mn,fn){"use strict";var Bd=Object.defineProperty;var Dd=(n,N,R)=>N in n?Bd(n,N,{enumerable:!0,configurable:!0,writable:!0,value:R}):n[N]=R;var _e=(n,N,R)=>(Dd(n,typeof N!="symbol"?N+"":N,R),R);const je=n.reactive({title:"",routeComponents:[],user:null,loadCache:{},activeLabel:null,clipboardData:null});function L(e,t){return e?`${e}/${t}`:t}function gn(e){const t=c.parseDataPath(e);return t==null||t.pop(),t}function pe(e,t=!1){return t?gn(e):c.parseDataPath(e)}function bn(e,t=!1){return c.normalizeDataPath(pe(e,t))}function Me(e,t=!1){const o=pe(e,t);if(o){let s;do s=o.pop();while(s!=null&&c.isInteger(+s));if(s!=null)return o}return null}function yn(e,t=!1){return c.normalizeDataPath(Me(e,t))}function Re(e,t,o=!1){const s=pe(t,o);return s?c.getValueAtDataPath(e,s):null}function me(e,t,o=!1){const s=Me(t,o);return s?c.getValueAtDataPath(e,s):null}function qe(e){const t=c.parseDataPath(e);return t[t.length-1]}function kn(e){const t=qe(e);return t==null||c.isInteger(+t)?null:t}function fe(e){const t=qe(e),o=t==null?null:+t;return c.isInteger(o)?o:null}let Cn=0;function $n(e,t="id"){e[t]=`@${++Cn}`}function ee(e){return/^@/.test(e)}function Bn(e,t="id"){return(e==null?void 0:e[t])!=null&&Object.keys(e).length===1}const{hasOwnProperty:Dn}=Object.prototype,ge=new WeakMap;function B(e,t,o){const s=ge.get(n.toRaw(e)),a=s[t];return a!==void 0||Dn.call(s,t)?a:c.isFunction(o)?o():o}function wn(e,t,o){ge.get(n.toRaw(e))[t]=o}class V{constructor(t,o){o=o?c.isFunction(o)?o():{...o}:{},o.nested??(o.nested=!0),o.component=t;const s=Object.setPrototypeOf(o,t);ge.set(this,s)}static get(t,o){return o instanceof V?o:new V(t,o)}get nested(){return B(this,"nested",!0)}get schema(){return B(this,"schema",null)}get value(){return B(this,"value",void 0)}get dataPath(){return B(this,"dataPath","")}get name(){return B(this,"name",()=>kn(this.dataPath))}get index(){return B(this,"index",()=>fe(this.dataPath))}get itemDataPath(){return bn(this.dataPath,this.nested)}get parentItemDataPath(){return yn(this.dataPath,this.nested)}get itemIndex(){return fe(this.itemDataPath)}get parentItemIndex(){return fe(this.parentItemDataPath)}get item(){return B(this,"data",()=>Re(this.rootItem,this.dataPath,this.nested))}get parentItem(){const t=me(this.rootItem,this.dataPath,this.nested)||null;return t!==this.item?t:null}get rootItem(){return B(this,"rootData",null)}get processedItem(){return B(this,"processedData",null)}get clipboardItem(){return B(this,"clipboardData",null)}get user(){return B(this,"user",null)}get api(){return B(this,"api",null)}get views(){return B(this,"views",null)}get itemLabel(){return B(this,"itemLabel",null)}get formLabel(){return B(this,"formLabel",null)}get component(){return B(this,"component",null)}get schemaComponent(){return B(this,"schemaComponent",null)}get formComponent(){return B(this,"formComponent",null)}get viewComponent(){return B(this,"viewComponent",null)}get dialogComponent(){return B(this,"dialogComponent",null)}get panelComponent(){return B(this,"panelComponent",null)}get resourceComponent(){return B(this,"resourceComponent",null)}get sourceComponent(){return B(this,"sourceComponent",null)}get option(){return B(this,"option",void 0)}get options(){return B(this,"options",void 0)}get query(){return B(this,"query",void 0)}get error(){return B(this,"error",void 0)}get wasNotified(){return B(this,"wasNotified",!1)}get request(){return t=>this.component.request(t)}get format(){return(t,o)=>this.component.format(t,o)}get navigate(){return t=>this.component.navigate(t)}get download(){return t=>this.component.download(t)}get getResourceUrl(){return t=>this.component.getResourceUrl(t)}get notify(){return t=>{this.component.notify(t),wn(this,"wasNotified",!0)}}}const Vn={data(){return{listeners:null}},methods:{on(e,t){if(c.isArray(e))for(const o of e)this.on(o,t);else if(c.isPlainObject(e))for(const o in e)this.on(o,e[o]);else{const o=this.listeners||(this.listeners=Object.create(null)),{callbacks:s}=o[e]||(o[e]={callbacks:[],queue:[]});s.push(t)}return this},once(e,t){const o=(...s)=>(this.off(e,o),t.apply(this,s));return o.callback=t,this.on(e,o)},off(e,t){var o;if(!arguments.length)delete this.listeners;else if(c.isArray(e))for(const s of e)this.off(s,t);else if(c.isPlainObject(e))for(const s in e)this.off(s,e[s]);else{const s=(o=this.listeners)==null?void 0:o[e];if(s)if(!t)delete this.listeners[e];else{const{callbacks:a}=s,i=a.findIndex(r=>r===t||r.callback===t);i!==-1&&a.splice(i,1)}}return this},emit(e,...t){var s;const o=(s=this.listeners)==null?void 0:s[e];if(o){const{queue:a,callbacks:i}=o;return new Promise(r=>{const l=async()=>{const d=a.shift();if(d){let h;for(const u of i)try{const p=await u.apply(this,d.args);p!==void 0&&(h=p)}catch(p){console.error(`Error during event handler for '${e}':`,p)}d.resolve(h),l()}};a.push({args:t,resolve:r}),a.length===1&&l()})}},hasListeners(e){var t;if(c.isArray(e)){for(const o of e)if(!this.hasListeners(o))return!1;return e.length>0}else return!!((t=this.listeners)!=null&&t[e])},delegate(e,t){if(t)if(c.isArray(e))for(const o of e)this.delegate(o,t);else this.on(e,(...o)=>t.emit(e,...o));return this}}},be={Boolean:c.isBoolean,Number:c.isNumber,String:c.isString,Date:c.isDate,Array:c.isArray,Object:c.isObject,RegExp:c.isRegExp,Function:c.isFunction},Sn={Boolean:e=>!!e,Number:e=>+e,String:e=>String(e),Date:e=>c.isDate(e)?e:new Date(e),Array:e=>c.isArray(e)?e:c.isString(e)?e.split(","):c.asArray(e),Object:e=>c.isObject(e)?e:e===!0?{}:null,RegExp:e=>c.isRegExp(e)?e:new RegExp(e)};function ye(e,t){var o;if(e&&t!=null){for(const s of e)if((o=be[s.name])!=null&&o.call(be,t))return!0}return!1}function Pn(e,t){const o=e&&Sn[e.name||e];return o?o(t):t}function Ie(e){return!!T(e.resource)}function T(e,t={}){var a;const{parent:o,...s}=t;return e=c.isObject(e)?{...s,...e}:c.isString(e)?{...s,path:e}:null,e&&o!==void 0&&e.parent===void 0&&!((a=e.path)!=null&&a.startsWith("/"))&&(e.parent=o,e.path||(e.path=".")),e}function ke(e,t){return e!=null&&(t==null?void 0:t.type)==="collection"?{type:"member",...c.pickBy(t,(o,s)=>["method","path","parent"].includes(s)),id:`${e}`}:null}const ze={mixins:[Vn],inject:["api","$verbs","$views","$isPopulated","$parentComponent","$schemaComponent","$routeComponent","$dataComponent","$sourceComponent","$resourceComponent","$dialogComponent","$panelComponent","$tabComponent"],provide(){return this.providesData?{$parentComponent:()=>this,$dataComponent:()=>this}:{$parentComponent:()=>this}},data(){return{appState:je,overrides:null}},computed:{providesData(){return!1},sourceSchema(){var e;return(e=this.meta)==null?void 0:e.schema},user(){return je.user},verbs(){return this.$verbs()},views(){return this.$views()},isPopulated(){return this.$isPopulated()},locale(){return this.api.locale},context(){return new V(this,{nested:!1})},rootComponent(){return this.$root.$refs.root},parentComponent(){return this.$parentComponent()},schemaComponent(){return this.$schemaComponent()},routeComponent(){return this.$routeComponent()},formComponent(){const e=this.routeComponent;return e!=null&&e.isForm?e:null},viewComponent(){const e=this.routeComponent;return e!=null&&e.isView?e:null},dataComponent(){return this.providesData?this:this.$dataComponent()},sourceComponent(){return this.$sourceComponent()},resourceComponent(){return this.$resourceComponent()},dialogComponent(){return this.$dialogComponent()},panelComponent(){return this.$panelComponent()},tabComponent(){return this.$tabComponent()},parentSchemaComponent(){var e;return(e=this.schemaComponent)==null?void 0:e.parentComponent.schemaComponent},parentRouteComponent(){var e;return(e=this.routeComponent)==null?void 0:e.parentComponent.routeComponent},parentFormComponent(){var e;return(e=this.formComponent)==null?void 0:e.parentComponent.formComponent},rootData(){var e;return(e=this.dataComponent)==null?void 0:e.data}},beforeCreate(){const e=En++;Object.defineProperty(this,"$uid",{get(){return e}})},methods:{getStore(e){return this.store[e]},setStore(e,t){return this.store[e]=t,t},getChildStore(e){return this.getStore(e)||this.setStore(e,n.reactive({}))},getSchemaValue(e,{type:t,default:o,schema:s=this.schema,callback:a=!0}={}){const i=t&&c.asArray(t);let r=s?c.isArray(e)?c.getValueAtDataPath(s,e,()=>{}):s[e]:void 0;if(r===void 0&&o!==void 0)return a&&c.isFunction(o)&&!ye(i,o)&&(o=o.call(this)),o;if(ye(i,r))return r;if(a&&c.isFunction(r)&&(r=r(this.context)),i&&r!=null&&!ye(i,r))for(const l of i){const d=Pn(l,r);if(d!==r)return d}return r},getLabel(e,t){return e?this.getSchemaValue("label",{type:String,schema:e})||c.labelize(t||e.name):c.labelize(t)||""},labelize:c.labelize,getButtonAttributes(e,t){const o=this.verbs[e]||e;return{class:`dito-button-${o}`,title:(t==null?void 0:t.text)||c.labelize(o)}},getQueryLink(e){return{query:e,hash:this.$route.hash}},shouldRender(e=null){return this.getSchemaValue("if",{type:Boolean,default:!0,schema:e})},shouldShow(e=null){return this.getSchemaValue("visible",{type:Boolean,default:!0,schema:e})},shouldDisable(e=null){return this.getSchemaValue("disabled",{type:Boolean,default:!1,schema:e})},getResourcePath(e){var t;return e=T(e),e.parent===void 0&&(e.parent=(t=this.dataComponent)==null?void 0:t.resource),this.api.resources.any(T(e))},getResourceUrl(e){const t=this.getResourcePath(e);return t?this.api.getApiUrl({url:t,query:e.query}):null},async sendRequest({method:e,url:t,resource:o,query:s,data:a,internal:i}){t||(t=this.getResourcePath(o)),e||(e=o==null?void 0:o.method);const r=!i&&this.api.isApiUrl(t);r&&await this.rootComponent.ensureUser();const l=await this.api.request({method:e,url:t,data:a,query:s});return r&&e==="patch"&&c.equals(o,ke(this.user.id,this.api.users))&&await this.rootComponent.fetchUser(),l},showDialog({components:e,buttons:t,data:o,settings:s}){return this.rootComponent.showDialog({components:e,buttons:t,data:o,settings:s})},request({cache:e,...t}){const o=e&&{global:this.appState,local:this.dataComponent}[e],s=o==null?void 0:o.loadCache,a=s&&`${t.method||"get"} ${t.url} ${JSON.stringify(t.query||t.params||"")} ${JSON.stringify(t.data||"")}`;if(s&&a in s)return s[a];const i=this.sendRequest(t).then(r=>r.data).catch(r=>{var d;const l=(d=r.response)==null?void 0:d.data;throw l?Object.assign(new Error(l.message),l):r});return s&&(s[a]=i),i},format(e,{locale:t=this.api.locale,defaults:o=this.api.formats,...s}={}){return c.format(e,{locale:t,defaults:o,...s})},async navigate(e){return this.$router.push(e)},download(e={}){c.isString(e)&&(e={url:e});const t=document.createElement("a");t.href=this.api.getApiUrl(e),t.download=e.filename??null;const{body:o}=document;o.appendChild(t),t.click(),o.removeChild(t)},notify(e){this.rootComponent.notify(e)},closeNotifications(){this.rootComponent.closeNotifications()},setupSchemaFields(){this.setupMethods(),this.setupComputed(),this.setupEvents()},setupMethods(){for(const[e,t]of Object.entries(this.schema.methods||{}))c.isFunction(t)?this[e]=t:console.error(`Invalid method definition: ${e}: ${t}`)},setupComputed(){for(const[e,t]of Object.entries(this.schema.computed||{})){const o=c.isFunction(t)?{get:t}:c.isObject(t)&&c.isFunction(t.get)?t:null;o?Object.defineProperty(this,e,o):console.error(`Invalid computed property definition: ${e}: ${t}`)}},setupEvents(){const{watch:e,events:t}=this.schema;if(e){const s=c.isFunction(e)?e.call(this):e;c.isObject(s)&&this.$nextTick(()=>{for(const[a,i]of Object.entries(s)){const r=this.schemaComponent.getComponentByName(a)?`data.${a}`:a;this.$watch(r,i)}})}const o=(s,a,i)=>{c.isFunction(i)?this.on(c.hyphenate(a),i):console.error(`Invalid event definition: ${s}: ${i}`)};if(t)for(const[s,a]of Object.entries(t))o(s,s,a);for(const[s,a]of Object.entries(this.schema))/^on[A-Z]/.test(s)&&o(s,s.slice(2),a)},async emitEvent(e,{context:t=null,parent:o=null}={}){const s=this.hasListeners(e),a=o==null?void 0:o.hasListeners(e);if(s||a){["load","change"].includes(e)&&await this.$nextTick();const i=()=>t=V.get(this,t),r=s?await this.emit(e,i()):void 0;return a&&r!==!1&&o.emit(e,i()),r}},emitSchemaEvent(e,t){return this.schemaComponent.emitEvent(e,t)}}};let En=0;const On=Object.freeze(Object.defineProperty({__proto__:null,creditcard:{validate:e=>c.isCreditCard(e),message:"is invalid"},decimals:{validate:(e,t)=>{const o=t==="*"?"+":`{1,${t}}`;return new RegExp(`^[-+]?\\d*(\\.\\d${o})?$`).test(e)},message:(e,t)=>`must be numeric and may contain ${!t||t==="*"?"":t} decimal points`},domain:{validate:e=>c.isDomain(e),message:"is not a domain"},email:{validate:e=>c.isEmail(e),message:"must be a valid email"},hostname:{validate:e=>c.isHostname(e),message:"is not a host name"},integer:{validate:e=>c.isInteger(e),message:"must be whole number"},max:{validate:(e,t)=>e<=t,message(e,t){return`must be ${t} or less`}},min:{validate:(e,t)=>e>=t,message(e,t){return`must be ${t} or more`}},password:{validate:()=>!0},range:{validate:(e,[t,o])=>e>=t&&e<=o,message(e,[t,o]){return`must be between ${t} and ${o}`}},required:{validate:(e,t,{password:o})=>e!=null&&e!==""||o&&e===void 0,message:"is required",nullish:!0},url:{validate:e=>c.isUrl(e),message:"is not a valid URL"}},Symbol.toStringTag,{value:"Module"})),Nn={emits:["errors"],data(){return{isTouched:!1,isDirty:!1,isValidated:!1,isValid:!1,errors:null}},methods:{resetValidation(){this.isTouched=!1,this.isDirty=!1,this.isValidated=!1,this.isValid=!1,this.clearErrors()},validate(e=!0){let t=!0;e&&this.clearErrors();const{value:o}=this;for(const[s,a]of Object.entries(this.validations)){const i=On[s];if(i&&(i.nullish||o!=null)){const{validate:r,message:l}=i;if(!r(o,a,this.validations)&&(t=!1,e)){const d=c.isFunction(l)?l(o,a,this):l;this.addError(d,!0)}}}return e&&(this.isValidated=!0,this.isValid=t),t},verify(){return this.validate(!1)},markTouched(){this.isTouched=!0},markDirty(){this.isDirty=!0,this.isValidated=!1,this.isValid=!1,this.clearErrors()},addError(e,t=!1){this.errors||(this.errors=[]),t&&(e=`The ${this.label||this.placeholder||this.name} field ${e}.`),this.errors.push(e),this.$emit("errors",this.errors)},showValidationErrors(e,t){this.errors=[];for(const{message:o}of e)this.addError(o,!0);return t&&this.focus(),!0},getErrors(){return this.errors?[...this.errors]:null},clearErrors(){this.errors=null,this.$emit("errors",this.errors)}}};function y(e,{type:t,default:o,get:s,set:a,callback:i=!0}={}){c.isString(e)&&e.includes(".")&&(e=c.parseDataPath(e));const r=c.normalizeDataPath(e);return{get(){const l=!s||s.length>0?this.overrides&&r in this.overrides?this.overrides[r]:this.getSchemaValue(e,{type:t,default:o,callback:i}):void 0;return s?s.call(this,l):l},set(l){a?a.call(this,l):(this.overrides||(this.overrides={}),this.overrides[r]=l)}}}function Ce(e,{default:t,get:o,set:s}={}){return{get(){let a=this.getStore(e);return a===void 0&&t!==void 0&&(a=c.isFunction(t)?t.call(this):t,this[e]=a,this.getStore(e)),o?o.call(this,a):a},set(a){(!s||(a=s.call(this,a))!==void 0)&&this.setStore(e,a)}}}const K={mixins:[Nn],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},data(){return{parsedValue:null,focused:!1}},computed:{name(){return this.schema.name},type(){return this.schema.type},context(){return new V(this,{nested:this.nested})},value:{get(){const e=st(this.schema,this.data,this.name,this.dataPath,{component:this}),{format:t}=this.schema;return t?t.call(this,new V(this,{value:e})):e},set(e){const{parse:t}=this.schema;this.parsedValue=t?t.call(this,new V(this,{value:e})):e,this.data[this.name]=this.parsedValue}},parentData(){const e=me(this.rootData,this.dataPath,this.nested);return e!==this.data?e:null},processedData(){const{schemaComponent:e}=this;return Re(e.processedData,this.dataPath.slice(e.dataPath.length),this.nested)},item(){return this.data},parentItem(){return this.parentData},rootItem(){return this.rootData},processedItem(){return this.processedData},label:y("label",{type:[String,Boolean],get(e){return c.isString(e)?e:e!==!1&&this.$options.generateLabel?this.getLabel(this.schema):null}}),width:y("width",{type:[String,Number]}),visible:y("visible",{type:Boolean,default(){return this.$options.defaultVisible}}),exclude:y("exclude",{type:Boolean,default:!1}),required:y("required",{type:Boolean,default:!1}),readonly:y("readonly",{type:Boolean,default:!1}),autofocus:y("autofocus",{type:Boolean,default:!1}),clearable:y("clearable",{type:Boolean,default:!1}),placeholder:y("placeholder",{type:String}),autocomplete:y("autocomplete",{type:String}),events(){var t;const e=this.getEvents();for(const o of Object.keys(this.schema.events||{}))e[t=`on${c.camelize(o,!0)}`]??(e[t]=()=>{this.emitEvent(o)});return e},attributes(){const{nativeField:e,textField:t}=this.$options,o={...this.events,disabled:this.disabled};return e&&(o.name=this.name,this.label&&(o.title=this.label),o.readonly=this.readonly,o.autofocus=this.autofocus,t&&(o.placeholder=this.placeholder,o.autocomplete=this.autocomplete)),o},validations(){const e={...this.getValidations()};this.required&&(e.required=!0);for(const[t,o]of Object.entries(this.schema.rules||{}))o===void 0?delete e[t]:e[t]=o;return e},showClearButton(){return this.clearable&&this.value!=null}},created(){this._register(!0),this.setupSchemaFields()},beforeUnmount(){this._register(!1)},methods:{_register(e){this.nested&&this.schemaComponent._registerComponent(this,e)},getEvents(){const{onFocus:e,onBlur:t,onInput:o,onChange:s}=this;return{onFocus:e,onBlur:t,onInput:o,onChange:s}},getValidations(){return null},focusElement(){const[e]=c.asArray(this.$refs.element);e&&this.$nextTick(()=>{var t,o;e.focus(),this.disabled&&((o=(t=e.$el||e).scrollIntoView)==null||o.call(t))})},focus(){var e;this.schemaComponent.focus(),(e=this.tabComponent)==null||e.focus(),this.focusElement()},clear(){this.value=null,this.onChange()},onFocus(){this.focused=!0,this.markTouched(),this.emitEvent("focus")},onBlur(){this.focused=!1,this.validate(),this.emitEvent("blur")},onInput(){this.markDirty(),this.emitEvent("input")},onChange(){this.markDirty(),this.emitEvent("change",{context:this.parsedValue!==void 0?{value:this.parsedValue}:null,parent:this.schemaComponent})}}},Ae=new WeakMap;let Ln=0;function Fn(e,t){let o=Ae.get(e);return o||(o=t||`@${++Ln}`,Ae.set(e,o)),o}class Tn{constructor(){_e(this,"graph",{});_e(this,"references",{})}set(t,o,s){t=c.parseDataPath(t);let a=this.graph;for(const i of t){const r=c.isInteger(+i)?"*":i;a=a[r]??(a[r]={})}a.$settings={...s,...a.$settings,...o}}addSource(t,o){this.set(t,{type:"source",schema:o},{related:!1})}setSourceRelated(t){this.set(t,{related:!0,reference:this.getReferencePrefix(t)})}addRelation(t,o,s){this.set(t,{type:"relation",schema:s,internal:!!o,reference:this.getReferencePrefix(o)})}getReferencePrefix(t){var o;return t?(o=this.references)[t]??(o[t]=Ut.nanoid(6)):null}flatten(){const t=o=>{const s=[];for(const[a,{$settings:i,...r}]of Object.entries(o)){i&&s.push([a,i]);for(const[l,d]of t(r))s.push([`${a}/${l}`,d])}return s};return t(this.graph)}process(t,o,{target:s}){const a=s==="clipboard";a&&delete o[t.idKey||"id"];for(const[i,r]of this.flatten()){const{type:l,schema:d,internal:h,related:u,reference:p}=r,g=l==="source",f=l==="relation";if(g||f&&h){const m=c.getValueAtDataPath(o,i,()=>null),k=a&&g&&!u,P=a&&(f&&h||g&&u);for(const w of c.asArray(m).flat()){const $=g&&d.idKey||f&&d.relateBy||"id";let S=w==null?void 0:w[$];if(S!=null&&(k&&delete w[$],P||ee(S))){ee(S)&&(S=S.slice(1));const O=a?$:g?"#id":"#ref",E=a?`@${S}`:p?`${p}-${S}`:S;w[O]=E,O!==$&&delete w[$]}}}}return o}}const Ue={},He={};function _n(e,t){Ue[e]=t}function te(e,t=!1){const o=Ue[e]||null;if(!o&&!t&&!He[e])throw He[e]=!0,new Error(`Unknown Dito component type: '${e}'`);return o}function We(e,t){for(const o of e)if(Be(o)){const s=t(o.component,o.name,0);if(s!==void 0)return s}else for(const[s,a]of Object.entries(o.components||{})){const i=t(a,s,1);if(i!==void 0)return i}}function $e(e,t){return e?We([e,...ct(e)],t):void 0}function jn(e,t){return $e(e,o=>t(o)?o:void 0)||null}function Mn(e,t){return $e(e,o=>t(o)?!0:void 0)===!0}function z(e){return c.isObject(e)&&c.isString(e.type)}function Rn(e){return z(e)&&e.type==="form"}function Ke(e){return z(e)&&e.type==="view"}function qn(e){return z(e)&&e.type==="tab"}function In(e){return z(e)&&e.type==="panel"}function ne(e){return e.name||e.label||e.type}async function A(e,t=!1){if(c.isFunction(e)&&(e=e()),c.isPromise(e)&&(e=await e),c.isModule(e)&&(e={...e},!e.name&&(t||e.default))){const o=Object.keys(e);if(o.length===1){const s=o[0];e=e[s],s!=="default"&&(e.name=s)}}return e}async function oe(e,t=A){let o=c.isFunction(e)?e():e;return o=await A(o,!1),c.isArray(o)?o=Object.fromEntries(await c.mapConcurrently(o,async s=>{const a=await t(s,!0);return[a.name,a]})):c.isObject(o)&&(o=Object.fromEntries(await c.mapConcurrently(Object.entries(o),async([s,a])=>{const i=await t(a,!0);return[s,i]}))),o}async function se(e){let{component:t}=e;t&&(t=await A(t,!0),t&&(e.component=n.markRaw({...t,mixins:[ze,K,...t.mixins||[]]})))}async function Ye(e){await c.mapConcurrently(Object.values(e||{}),se)}async function Y(e,t,o,s){const a=[],i=(r,l,d)=>{a.push(zn(e,r,l,o,s+d))};$e(t,i),We(Ve(t),i),await Promise.all(a)}async function zn(e,t,o,s,a){var i,r;J(e,t),await Promise.all([c.mapConcurrently(Ve(t),l=>Y(e,l,s,a)),await((r=(i=_(t))==null?void 0:i.processSchema)==null?void 0:r.call(i,e,t,o,s,a))])}async function An(e,t,o,s){if(!Ke(o))throw new Error(`Invalid view schema: '${ne(o)}'`);Je(t,o,s),J(t,o),await Ge(t,o);const a=[];return await Y(t,o,a,0),{path:`/${o.path}`,children:a,component:e,meta:{api:t,schema:o}}}function J(e,t){let o=e.defaults[t.type];if(o&&(c.isFunction(o)&&(o=o(t)),c.isObject(o)))for(const[s,a]of Object.entries(o))t[s]===void 0?t[s]=a:t[s]=c.merge(a,t[s])}function Je(e,t,o){t.name=o,t.path||(t.path=e.normalizePath(o))}async function Un(e,t,o){let{form:s,forms:a,components:i}=t;a?a=t.forms=await oe(a,l=>Qe(e,l)):s?s=t.form=await Qe(e,s):i&&c.isObject(i)&&(s={components:i}),a||(a={default:s});const r=[];for(const l of Object.values(a))await Y(e,l,r,o);return r}async function Qe(e,t){if(t=await A(t,!0),!Rn(t))throw new Error(`Invalid form schema: '${ne(t)}'`);return J(e,t),await Ge(e,t),t}async function Hn(e,t){if(t=await A(t,!0),!qn(t))throw new Error(`Invalid tab schema: '${ne(t)}'`);return J(e,t),t}async function Wn(e,t){if(t=await A(t,!0),!In(t))throw new Error(`Invalid panel schema: '${ne(t)}'`);return J(e,t),t}async function Ge(e,t){const{tabs:o,panels:s}=t;o&&(t.tabs=await oe(o,a=>Hn(e,a))),s&&(t.panels=await oe(s,a=>Wn(e,a)))}function I(e){return z(e)&&c.isObject(e.form||e.forms||e.components)}function Kn(e){return z(e)&&Object.keys((e==null?void 0:e.forms)||{}).length>1}function Be(e){return Ke(e)&&c.isObject(e.component)}function Xe(e,t){const{view:o}=e,s=o&&t.views[o];return s&&jn(s,I)||null}function Ze(e,t){return Xe(e,t)?t.views[e.view]:null}function Yn(e,t){const o=Ze(e,t);return o?Be(o)?`/${o.path}`:`/${o.path}/${o.path}`:null}function Q(e,t,o){const s=Xe(e,t);if(s)e=s;else if(e.view)throw new Error(`Unknown view: '${e.view}'`);let{form:a,forms:i,components:r,compact:l}=e;if(!a&&!i)if(r)a={components:r,compact:l};else return{};return i||(i={default:a}),Object.fromEntries(Object.entries(i).map(([d,h])=>(c.isFunction(h.components)&&(h={...h,components:h.components(t)}),[d,(o==null?void 0:o(h))??h])))}function ve(e,t){return e[t==null?void 0:t.type]||e.default||null}function De(e,t,o){return ve(Q(e,o),t)}function xe(e){return!!e.compact}function we(e){return!!(e.inlined||e.components)}function et(e){var t;return!!(e.nested||((t=_(e))==null?void 0:t.defaultNested)===!0)}function Jn(e){var t;return!!((t=_(e))!=null&&t.omitPadding)}function Qn(e){var t;return!!((t=_(e))!=null&&t.alignBottom)}function tt(e){var s;const t=e.default,o=t!==void 0?t:(s=_(e))==null?void 0:s.defaultValue;return c.isFunction(o)?o(e):c.clone(o)}function nt(e){var o;const t=_(e);return!!(t!=null&&t.excludeValue||(o=t==null?void 0:t.ignoreMissingValue)!=null&&o.call(t,e))}function ot(e,t={},o){return ae(e,t,null,null,(i,r,l)=>{!(l in r)&&!nt(i)&&(r[l]=tt(i))},null,{component:o,rootData:t})}function st(e,t,o,s,{component:a=null,rootData:i=a==null?void 0:a.rootData}={}){const{compute:r}=e;if(r){const l=r(V.get(a,{schema:e,value:t[o],name:o,data:t,dataPath:s,rootData:i}));l!==void 0&&(t[o]=l)}return!(o in t)&&!nt(e)&&(t[o]=tt(e)),t[o]}function at(e,t,o){if(o.schemaOnly){const s={},{idKey:a="id",orderKey:i}=e,r=t[a];return r!==void 0&&(s[a]=r),Kn(e)&&(s.type=t.type),i&&(s[i]=t[i]),s}else return{...t}}function Gn(e,t,o,s,{component:a,schemaOnly:i,target:r}={}){const l={component:a,schemaOnly:i,target:r,rootData:o},d=at(t,o,l),h=new Tn;return ae(e,o,s,d,(g,f,m,k,P)=>{let w=st(g,f,m,k,l);if(c.isArray(w)){const{wrapPrimitives:$,orderKey:S,idKey:O="id"}=g;$?w=w.map(E=>({[$]:E})):w=[...w],S&&r==="clipboard"&&w.sort((E,M)=>{const j=E==null?void 0:E[O],Te=M==null?void 0:M[O];return j==null||ee(j)?1:Te==null||ee(Te)?-1:j-Te})}P[m]=w},(g,f,m,k,P)=>{const{wrapPrimitives:w,exclude:$,process:S}=g;let O=P[m];const E=_(g),M=()=>V.get(a,{schema:g,value:O,name:m,data:f,dataPath:k,rootData:l.rootData,processedData:P});if(w&&c.isArray(O)&&(O=O.map(j=>j[w])),S&&(O=S(M())),E!=null&&E.excludeValue||$===!0||c.isFunction($)&&$(M()))delete P[m];else{const j=E==null?void 0:E.processValue;j&&(O=j(g,O,k,h)),P[m]=O}},l),h.process(t,d,l)}function ae(e,t,o,s,a,i,r){const l=d=>{const h=(u,p)=>u!=null?L(u,p):null;if(d)for(const[u,p]of Object.entries(d))if(!et(p))ae(p,t,o,s,a,i,r);else{const g=h(o,u),f=(k,P=null)=>{var M;const w=P!==null?h(g,P):g,$=V.get(r.component,{schema:p,data:t,value:k,dataPath:w,index:P,rootData:r.rootData}),O=(((M=_(p))==null?void 0:M.getFormSchemasForProcessing)||Q)(p,$),E=ve(O,k);if(E){const j=s?at(p,k,r):null;return ae(E,k,w,j,a,i,r)}else return{...k}};a==null||a(p,t,u,g,s);let m=s?s[u]:t[u];m!=null&&I(p)&&(c.isArray(m)?m=s?m.map(f):m.forEach(f):m=f(m),s&&(s[u]=m)),i==null||i(p,t,u,g,s)}};l(e.components);for(const d of ct(e))l(d.components);for(const d of Ve(e))l(d.components);return s||t}function U(e,t){const o=(s,a)=>s.length>0?s.reduce((i,r)=>{const l=a(r);return l&&(i[l.name]=l&&t?{...t,...l}:l),i},{}):null;return c.isArray(e)?o(e,s=>c.isObject(s)?s:{name:c.camelize(s,!1)}):c.isObject(e)?o(Object.entries(e),([s,a])=>c.isObject(a)?{name:s,...a}:c.isString(a)?{name:s,label:a}:null):null}function re(e){return U(e,{type:"button"})}function rt(e){return c.isObject(e)?e.type:e}function _(e){return te(rt(e),!0)??null}function it(e){var t,o;return((o=(t=_(e))==null?void 0:t.getSourceType)==null?void 0:o.call(t,rt(e)))??null}function lt(e,t=null,o=null){return e?{schema:e,dataPath:t!=null&&e.name?L(t,e.name):t,tabComponent:o}:null}function dt(e,t=null,o=null,s=[]){if(e)for(const[a,i]of Object.entries(e)){const r=lt(i,t!=null?L(t,a):null,o);r&&s.push(r)}return s}function ct(e){return e!=null&&e.tabs?Object.values(e.tabs):[]}function Ve(e){return ht(e).map(t=>t.schema)}function ht(e,t=null,o=null,s=null){var r,l;const a=(l=(r=_(e))==null?void 0:r.getPanelSchema)==null?void 0:l.call(r,e,t,o),i=a?[lt(a,t,s)]:[];return dt(e==null?void 0:e.panels,t,s,i),i}function G(e){return it(e)==="object"}function X(e){return it(e)==="list"}function ut(e,t){const o=t[e.idKey||"id"];return o!=null?String(o):void 0}function Xn(e,t){return Fn(t,ut(e,t))}function Zn(e){const{mixins:t}=e;return t||e.extends?Se({...e},e):e}function Se(e,t){if(t.extends&&Se(e,t.extends),t.mixins)for(const o of t.mixins)Se(e,o);for(const o of vn)o in t&&(e[o]=t[o]);return e}const vn=["defaultValue","defaultNested","defaultVisible","generateLabel","excludeValue","ignoreMissingValue","alignBottom","omitPadding","processValue","processSchema","getPanelSchema","getFormSchemasForProcessing","beforeRouteUpdate","beforeRouteLeave"],ie={},C={mixins:[ze],components:ie,component(e,t){if(t&&(c.isPlainObject(t)&&(t=Zn({extends:this,name:e,...t})),ie[e]=t),!(e in ie))throw new Error(`Component "${e}" not registered`);return ie[e]},methods:{getTypeComponent:te}};class xn{hasRole(...t){if(this.roles){for(const o of t)if(this.roles.includes(o))return!0}return!1}}const pt={provide(){return{$schemaParentComponent:()=>this}},data(){return{schemaComponents:[]}},computed:{mainSchemaComponent(){return this.schemaComponents[0]}},methods:{_registerSchemaComponent(e,t){const{schemaComponents:o}=this;t?o.push(e):o.splice(o.indexOf(e),1)}}},mt={mixins:[pt],computed:{errors(){return this.schemaComponents.reduce((e,{errors:t})=>t&&e?e.concat(t):t,null)},isTouched(){return this.schemaComponents.some(e=>e.isTouched)},isDirty(){return this.schemaComponents.some(e=>e.isDirty)},isValid(){return this.schemaComponents.every(e=>e.isValid)},isValidated(){return this.schemaComponents.every(e=>e.isValid)}},methods:{validateAll(e,t=!0){return this.schemaComponents.every(o=>o.validateAll(e,t))},verifyAll(e){return this.schemaComponents.every(t=>t.verifyAll(e))},resetValidation(){this.schemaComponents.forEach(e=>e.resetValidation())},clearErrors(){this.schemaComponents.forEach(e=>e.clearErrors())},showValidationErrors(e,t){this.schemaComponents.forEach(o=>o.showValidationErrors(e,t))}}},ft={mixins:[mt],provide(){return{$routeComponent:()=>this}},data(){return{reload:!1,store:{},loadCache:{}}},computed:{routeComponent(){return this},routeLevel(){let e=0,t=this;for(;t=t.parentComponent.routeComponent;)e++;return e},routeRecord(){return this.$route.matched[this.routeLevel]},isLastRoute(){const{matched:e}=this.$route;return this.routeRecord===e[e.length-1]},isLastUnnestedRoute(){const{matched:e}=this.$route;for(let t=e.length-1;t>=0;t--){const o=e[t];if(!o.meta.nested)return this.routeRecord===o}return!1},isNestedRoute(){return this.meta.nested},isView(){return!1},meta(){var e;return(e=this.routeRecord)==null?void 0:e.meta},path(){return this.getRoutePath(this.routeRecord.path)},label(){return this.getLabel(this.schema)},breadcrumb(){const{breadcrumb:e}=this.schema||{};return e||`${this.breadcrumbPrefix} ${this.label}`},breadcrumbPrefix(){return""},param(){var e;return this.$route.params[(e=this.meta)==null?void 0:e.param]||null},isMutating(){return!1}},beforeRouteUpdate(e,t,o){this==null||this.beforeRouteChange(e,t,o)},beforeRouteLeave(e,t,o){this==null||this.beforeRouteChange(e,t,o)},created(){this.appState.routeComponents.push(this)},unmounted(){const{routeComponents:e}=this.appState;e.splice(e.indexOf(this),1)},methods:{beforeRouteChange(e,t,o){let s=!0;t.path.startsWith(this.path)&&!e.path.startsWith(this.path)&&t.path!==e.path&&(this.isFullRouteChange(e,t)||e.path.length<=t.path.length)&&(this.isMutating?s=this.isValidated||this.validateAll():this.isDirty&&(s=window.confirm(`You have unsaved changes. Do you really want to ${this.verbs.cancel}?`))),o(s)},getRoutePath(e){return this.$route.path.split("/").slice(0,e.split("/").length).join("/")},getChildPath(e){return`${this.path}/${e}`},isFullRouteChange(e,t){const o=this.path.match(/^(\/[^/]*)/)[1];return!c.getCommonPrefix(e.path,t.path).startsWith(o)}}},eo=["data-resource"];function to(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoSchema");return e.user?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.isLastRoute?e.shouldRender(e.viewSchema)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-view dito-scroll-parent","data-resource":e.sourceSchema.path},[n.createVNode(l,{class:"dito-scroll",schema:e.viewSchema,data:e.data,meta:e.meta,store:e.getChildStore(e.name),disabled:e.isLoading,generateLabels:!1,menuHeader:!0},null,8,["schema","data","meta","store","disabled"])],8,eo)):n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(r,{key:e.name}))],64)):n.createCommentVNode("",!0)}const b=(e,t)=>{const o=e.__vccOpts||e;for(const[s,a]of t)o[s]=a;return o},no=C.component("DitoView",{mixins:[ft],provide(){return{$sourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.sourceComponent)||null},$resourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.resourceComponent)||null}}},data(){return{isLoading:!1,data:{}}},computed:{schema(){return this.meta.schema},name(){return this.schema.name},isView(){return!0},isSingleComponentView(){return Be(this.schema)},mainComponent(){return this.mainSchemaComponent.getComponentByDataPath(this.name)},viewSchema(){const{component:e,...t}=this.schema;return this.isSingleComponentView?{...t,components:{[t.name]:{name:t.name,label:!1,...e}}}:t},providesData(){return Mn(this.viewSchema,Ie)}},watch:{$route(e,t){this.isFullRouteChange(e,t)&&(this.isLoading=!1,this.data={})}},methods:{setData(e){this.data=e},getChildPath(e){return this.isSingleComponentView?this.path:`${this.path}/${e}`},setLoading(e){this.isLoading=!!e}}}),gt=b(no,[["render",to]]),Hd="";function le(e,{year:t=(e==null?void 0:e.getFullYear())??0,month:o=(e==null?void 0:e.getMonth())??0,day:s=(e==null?void 0:e.getDate())??0,hour:a=(e==null?void 0:e.getHours())??0,minute:i=(e==null?void 0:e.getMinutes())??0,second:r=(e==null?void 0:e.getSeconds())??0,millisecond:l=(e==null?void 0:e.getMilliseconds())??0}={}){return new Date(t,o,s,a,i,r,l)}const oo={class:"dito-calendar"},so={class:"dito-calendar-popup"},ao={class:"dito-calendar-inner"},ro={class:"dito-calendar-header"},io={class:"dito-calendar-body"},lo={class:"dito-calendar-weekdays"},co={class:"dito-calendar-dates"},ho=["onClick"],uo={class:"dito-calendar-footer"},po=["title"],mo={class:"dito-calendar-header"},fo={class:"dito-calendar-body"},go={class:"dito-calendar-months"},bo=["onClick"],yo={class:"dito-calendar-header"},ko={class:"dito-calendar-body"},Co={class:"dito-calendar-years"},$o=["onClick"];function Bo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",oo,[n.createElementVNode("div",so,[n.createElementVNode("div",ao,[a.currentMode==="day"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",ro,[n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>i.stepYear(-1))}),n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>i.stepMonth(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1),n.createElementVNode("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>i.setMode("month"))},n.toDisplayString(i.dateToString(a.currentValue,{month:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>i.stepMonth(1))}),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>i.stepYear(1))})]),n.createElementVNode("div",io,[n.createElementVNode("div",lo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.weekdayNames,r=>(n.openBlock(),n.createElementBlock("span",null,n.toDisplayString(r.short),1))),256))]),n.createElementVNode("div",co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.dateRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:l=>i.selectDate(r.date,r.state,!0)},n.toDisplayString(r.text),11,ho))),256))])]),n.createElementVNode("div",uo,[n.createElementVNode("a",{class:"dito-calendar-select-today",role:"button",title:i.dateToString(new Date,{year:1,month:1,day:1}),onClick:t[6]||(t[6]=r=>i.selectDate(new Date))},null,8,po)])],64)):a.currentMode==="month"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",mo,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>i.stepYear(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>i.stepYear(1))})]),n.createElementVNode("div",fo,[n.createElementVNode("div",go,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.monthNames,(r,l)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getMonthClass(l)),onClick:d=>i.selectMonth(l)},n.toDisplayString(r.short),11,bo))),256))])])],64)):a.currentMode==="year"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",yo,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>i.stepDecade(-1))}),n.createElementVNode("span",null,n.toDisplayString(i.decadeToString(a.currentValue)),1),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>i.stepDecade(1))})]),n.createElementVNode("div",ko,[n.createElementVNode("div",Co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.yearRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getYearClass(r)),onClick:l=>i.selectYear(r)},n.toDisplayString(r),11,$o))),256))])])],64)):n.createCommentVNode("",!0)])])])}const Wd="",Do={emits:["update:modelValue"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=wo(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e){this.currentValue=le(this.currentValue,e)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:o,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(o,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e,t,o=!1){t!=="disabled"&&(o?this.setDate({year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}):this.currentValue=e,this.$emit("update:modelValue",this.currentValue))},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1})},selectYear(e){this.setMode("month"),this.setDate({year:e})},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:o,day:s}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:o&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({hor:e,ver:t,enter:o}){const{currentMode:s,currentValue:a}=this;if(e||t){switch(s){case"day":this.setDate({day:a.getDate()+e+t*7});break;case"month":this.setDate({month:a.getMonth()+e+t*6});break;case"year":this.setDate({year:a.getFullYear()+e+t*5});break}return!0}else if(o){switch(s){case"day":this.selectDate(a);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),o=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let h=0;h<10;h++)this.yearRange.push(s+h);let i=new Date(t,o,1).getDay()+1;i===0&&(i=7);const r=this.getDaysInMonth(t,o);if(i>1){const h=this.getYearMonth(t,o-1),u=this.getDaysInMonth(h.year,h.month);for(let p=1;p<i;p++){const g=u-i+p+1,f=new Date(h.year,h.month,g);this.dateRange.push({text:g,date:f,state:this.disabledDate(f)?"disabled":"gray"})}}const l=new Date;for(let h=1;h<=r;h++){const u=new Date(t,o,h),p=f=>f&&f.getDate()===h&&f.getFullYear()===t&&f.getMonth()===o,g=p(this.modelValue)?"active":p(l)?"today":this.disabledDate(u)?"disabled":p(e)?"current":null;this.dateRange.push({text:h,date:u,state:g})}const d=42-this.dateRange.length;if(d>0){const h=this.getYearMonth(t,o+1);for(let u=1;u<=d;u++){const p=new Date(h.year,h.month,u),g=this.disabledDate(p)?"disabled":"gray";this.dateRange.push({text:u,date:p,state:g})}}}}},bt={};function wo(e){let t=bt[e];if(!t){const o=[];for(let a=0;a<7;a++){const i=new Date(0,0,a);o.push({long:i.toLocaleString(e,{weekday:"long"}),short:i.toLocaleString(e,{weekday:"short"})})}const s=[];for(let a=1;a<=12;a++){const i=new Date(0,a,0);s.push({long:i.toLocaleString(e,{month:"long"}),short:i.toLocaleString(e,{month:"short"})})}t=bt[e]={weekdayNames:o,monthNames:s}}return t}const Vo=b(Do,[["render",Bo]]);function de(e,t){for(const o in t)e.addEventListener(o,t[o],!1);return{remove(){for(const o in t)e.removeEventListener(o,t[o],!1)}}}function So(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e.keyCode]}function yt(e){const t=So(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}const Po={class:"dito-trigger-container"};function Eo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Po,[o.alwaysShow?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="click"?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>i.onClick&&i.onClick(...r))},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="hover"?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>i.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>i.onHover(!1))},[n.renderSlot(e.$slots,"trigger")],34)):o.trigger==="focus"||o.trigger==="always"?(n.openBlock(),n.createElementBlock("div",{key:3,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:o.transition},{default:n.withCtx(()=>[o.trigger==="hover"?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle),onMouseenter:t[3]||(t[3]=r=>i.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>i.onHover(!1))},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],38)),[[n.vShow,a.showPopup]]):n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle)},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],6)),[[n.vShow,a.showPopup]])]),_:3},8,["name"])])}const Kd="",Pe=b({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${c.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),e&&this.$nextTick(()=>this.updatePosition()))}},mounted(){const{trigger:e,popup:t}=this.$refs;if(this.trigger==="focus"){const o=e.querySelector("input, textarea");o&&(this.focusEvents=de(o,{focus:()=>{this.showPopup=!0},blur:()=>{this.showPopup=!1}}))}this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=de(window,{mouseup:o=>{this.showPopup&&!t.contains(o.target)&&!e.contains(o.target)&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},beforeUnmount(){var e,t;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),this.mouseLeaveTimer=null},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const o=c.isString(this.target)?this.$refs[this.target]:this.target;if(o){const m=o===t?e:t.firstElementChild;m&&(m.style.width=getComputedStyle(o).width)}const s=(o||e).getBoundingClientRect(),a=s.left+window.scrollX,i=s.top+window.scrollY,r=s.width,l=s.height,d=t.offsetWidth,h=t.offsetHeight;let[u,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const m=window.innerWidth,k=window.innerHeight;u==="top"?i<h&&(u="bottom"):u==="bottom"?k-i-l<h&&(u="top"):u==="left"?a<d&&(u="right"):u==="right"&&m-a-r<d&&(u="left"),p==="top"?k-i<h&&(p="bottom"):p==="bottom"?i+l<h&&(p="top"):p==="left"?m-a<d&&(p="right"):p==="right"&&a+r<d&&(p="left")}let g=0,f=0;switch(u){case"top":f-=h;break;case"left":g-=d;break;case"right":g+=r;break;case"bottom":f+=l;break}switch(p){case"right":g-=d-r;break;case"bottom":f-=h-l;break}if(this.cover&&(u==="top"?f+=l:u==="bottom"&&(f-=l)),o&&o!==e){const m=e.getBoundingClientRect();g+=a-m.left,f+=i-m.top}t.style.left=`${g}px`,t.style.top=`${f}px`},onClick(){this.disabled||(this.showPopup=!this.showPopup)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Eo]]),Oo={class:"dito-input"},No=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Lo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Oo,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>a.currentValue=r),type:o.type,name:o.name,title:o.title,disabled:o.disabled,readonly:o.readonly,autofocus:o.autofocus,placeholder:o.placeholder,autocomplete:o.autocomplete,"aria-label":o.title},e.$attrs),null,16,No),[[n.vModelDynamic,a.currentValue]])])}const Jd="",Z=b({emits:["update:modelValue"],props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{size(){const{size:e,min:t,max:o}=this.$attrs,s=a=>a!=null?`${a}`.length:0;return e||s(t)||s(o)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Lo]]);function Fo(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Calendar"),d=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(d,n.mergeProps({class:"dito-date-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[4]||(t[4]=h=>a.showPopup=h),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-date-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=h=>i.currentText=h),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=h=>a.inputFocused=!0),onBlur:t[2]||(t[2]=h=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createVNode(l,n.mergeProps({class:"dito-date-picker-popup",ref:"calendar",modelValue:a.currentValue,"onUpdate:modelValue":t[3]||(t[3]=h=>a.currentValue=h)},{locale:o.locale,disabledDate:o.disabledDate}),null,16,["modelValue"])]),_:1},16,["show"])}const Gd="",kt=b({components:{Trigger:Pe,Calendar:Vo,InputField:Z},emits:["update:modelValue","update:show","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},locale:{type:String,default:"en-US"},dateFormat:{type:Object,default:()=>c.defaultFormats.date},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return c.format(this.currentValue,{locale:this.locale,date:this.dateFormat,time:!1})||""}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.showPopup=!1,this.$emit("update:modelValue",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("update:modelValue",this.currentValue)))}},methods:{onKeyDown(e){var t;(t=this.$refs.calendar)!=null&&t.navigate(yt(e))&&e.preventDefault()},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Fo]]);function Ct(e,t,o){const s=window.requestAnimationFrame||function(){return setTimeout(arguments[0],10)};if(o<=0)e.scrollTop=t;else{const i=(t-e.scrollTop)/o*10;s(()=>{e.scrollTop=e.scrollTop+i,e.scrollTop!==t&&Ct(e,t,o-10)})}}function To(e,t,o){if(e.createTextRange){const s=e.createTextRange();s.collapse(!0),s.moveStart("character",t),s.moveEnd("character",o),s.select(),e.focus()}else e.setSelectionRange?(e.focus(),e.setSelectionRange(t,o)):"selectionStart"in e&&(e.selectionStart=t,e.selectionEnd=o,e.focus())}const _o={class:"dito-time-picker-popup"},jo={class:"dito-time-picker-panel"},Mo=["onClick"],Ro={class:"dito-time-picker-panel"},qo=["onClick"],Io={class:"dito-time-picker-panel"},zo=["onClick"];function Ao(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-time-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[6]||(t[6]=d=>a.showPopup=d),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-time-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=d=>i.currentText=d),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=d=>a.inputFocused=!0),onBlur:t[2]||(t[2]=d=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createElementVNode("div",_o,[n.createElementVNode("div",jo,[n.createElementVNode("ul",{class:"dito-time-picker-hour",ref:"hour",onMouseover:t[3]||(t[3]=d=>a.selection=0)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(24,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledHour(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.hour===d-1}),onClick:h=>i.hour=d-1},n.toDisplayString(i.leftPad(d-1)),11,Mo))],64))),64))],544)]),n.createElementVNode("div",Ro,[n.createElementVNode("ul",{class:"dito-time-picker-minute",ref:"minute",onMouseover:t[4]||(t[4]=d=>a.selection=1)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledMinute(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.minute===d-1}),onClick:h=>i.minute=d-1},n.toDisplayString(i.leftPad(d-1)),11,qo))],64))),64))],544)]),n.createElementVNode("div",Io,[n.createElementVNode("ul",{class:"dito-time-picker-second",ref:"second",onMouseover:t[5]||(t[5]=d=>a.selection=2)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledSecond(d-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.second===d-1}),onClick:h=>i.second=d-1},n.toDisplayString(i.leftPad(d-1)),11,zo))],64))),64))],544)])])]),_:1},16,["show"])}const Zd="",$t=b({components:{Trigger:Pe,InputField:Z},emits:["update:modelValue","update:show","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,selection:0,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return this.currentValue?`${this.leftPad(this.hour)}:${this.leftPad(this.minute)}:${this.leftPad(this.second)}`:""},currentDate(){return this.currentValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e),this.scrollAll())},currentText:"updateSelection",selection:"updateSelection",show(e){this.showPopup=e},showPopup(e,t){e&&(this.updateSelection(),this.scrollAll(0)),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=le(this.currentDate,{...e,millisecond:0})},updateSelection(e=!1){if(this.showPopup||e){const t=3*this.selection;this.$nextTick(()=>To(this.$refs.input,t,t+2))}},scrollAll(e=100){const t=(o,s)=>{const a=this.$refs[o];if(a){const i=a.scrollHeight/(a.children.length+6);Ct(a,Math.round(s*i),e)}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onKeyDown(e){const t=["hour","minute","second"][this.selection];if(t){const{hor:o,ver:s,enter:a}=yt(e);if(o){const i=this.selection+o;this.selection=i<0?2:i>2?0:i}else if(s){const i=this[t]+s,{length:r}=this.$refs[t].children;this[t]=i<0?i+r:i>=r?i-r:i}a&&(this.showPopup=!1),(o||s||a)&&(this.updateSelection(!0),e.preventDefault())}},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Ao]]),Uo={class:"dito-date-time-picker",ref:"picker"};function Ho(e,t,o,s,a,i){const r=n.resolveComponent("DatePicker"),l=n.resolveComponent("TimePicker");return n.openBlock(),n.createElementBlock("div",Uo,[n.createElementVNode("div",{class:n.normalizeClass(["dito-pickers",{"dito-focus":i.focused}])},[n.createVNode(r,n.mergeProps({ref:"date",modelValue:a.currentValue,"onUpdate:modelValue":t[0]||(t[0]=d=>a.currentValue=d),show:a.showDate,"onUpdate:show":t[1]||(t[1]=d=>a.showDate=d),placement:"bottom-left",target:e.$refs.picker},{transition:o.transition,placeholder:o.placeholder,locale:o.locale,dateFormat:o.dateFormat,disabled:o.disabled},{onFocus:t[2]||(t[2]=d=>a.dateFocused=!0),onBlur:t[3]||(t[3]=d=>a.dateFocused=!1)}),null,16,["modelValue","show","target"]),n.createVNode(l,n.mergeProps({ref:"time",modelValue:a.currentValue,"onUpdate:modelValue":t[4]||(t[4]=d=>a.currentValue=d),show:a.showTime,"onUpdate:show":t[5]||(t[5]=d=>a.showTime=d),placeholder:"",placement:"bottom-right",target:e.$refs.picker},{transition:o.transition,disabled:o.disabled},{onFocus:t[6]||(t[6]=d=>a.timeFocused=!0),onBlur:t[7]||(t[7]=d=>a.timeFocused=!1)}),null,16,["modelValue","show","target"])],2)],512)}const xd="",Wo=b({components:{DatePicker:kt,TimePicker:$t},emits:["update:modelValue","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},dateFormat:{type:Object,default:()=>c.defaultFormats.date},locale:{type:String,default:"en-US"},disabled:{type:Boolean,default:!1}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,dateFocused:!1,timeFocused:!1,changed:!1}},computed:{focused(){return this.dateFocused||this.timeFocused}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e))},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{focus(){this.$refs.date.focus()},blur(){this.$refs.date.blur(),this.$refs.time.blur()}}},[["render",Ho]]);function Ko(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("i",{class:n.normalizeClass(["dito-icon",`dito-icon-${o.name}`])},null,2)}const tc="",Yo=b({props:{name:{type:String,required:!0}}},[["render",Ko]]),Jo={class:"dito-pagination"},Qo={key:0,class:"dito-pagination-total"},Go={class:"dito-buttons dito-buttons-round"},Xo=["disabled","onClick"],Zo={key:0};function vo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Jo,[o.showTotal?(n.openBlock(),n.createElementBlock("div",Qo,[o.total>0?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(i.first)+" – "+n.toDisplayString(i.last),1)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("0")],64)),n.createTextVNode("/ "+n.toDisplayString(o.total),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",Go,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.pageRange,r=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",i.getPageClass(r)]),disabled:r.disabled,onClick:l=>i.onClickPage(r)},[r.text?(n.openBlock(),n.createElementBlock("span",Zo,n.toDisplayString(r.text),1)):n.createCommentVNode("",!0)],10,Xo))),256))])])}const oc="",xo=b({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{pageRange:[],showPrev:!0,showNext:!0,numPages:0,currentPageSize:this.pageSize,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.currentPageSize+1},last(){return Math.min(this.first+this.currentPageSize-1,this.total)}},watch:{total:"updatePageRange",showPrev:"updatePageRange",showNext:"updatePageRange",page(e){this.currentPage=e},pageSize(e){this.currentPageSize=e},currentPageSize(e){this.numPages=Math.ceil(this.total/e),this.currentPage>this.numPages&&(this.currentPage=this.numPages),this.updatePageRange()},currentPage(e,t){e!==t&&(this.updatePageRange(),this.$emit("update:page",e))}},created(){this.currentPage=this.page,this.currentPageSize=this.pageSize},mounted(){this.updatePageRange()},methods:{onClickPage(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)},getPageClass(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},updatePageRange(){const{showPrev:e,showNext:t,total:o,currentPageSize:s,currentPage:a}=this,i=e+t+1,r=this.numPages=Math.ceil(o/s);let l=1,d=1;r<=i?d=r:a<=e+1?d=i:a>=r-t?(d=r,l=r-i+1):(l=a-e,d=a+t);const h=[];h.push({index:a-1,type:"prev",disabled:a<=1}),l>=2&&h.push({index:1,text:1}),l>2&&h.push({index:Math.max(1,a-10),type:"ellipsis-prev"});for(let u=l;u<=d;u++)h.push({index:u,text:u,active:u===a});d<r-1&&h.push({index:Math.min(r,a+10),type:"ellipsis-next"}),d<=r-1&&h.push({index:r,text:r}),h.push({index:a+1,type:"next",disabled:a>=r}),this.pageRange=h}}},[["render",vo]]),es={class:"dito-switch-pane"},ts=["id","name","disabled"],ns=n.createElementVNode("div",{class:"dito-switch-button"},null,-1),os={key:0,class:"dito-switch-label"};function ss(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-switch",i.classes]),style:n.normalizeStyle(i.styles)},[n.createElementVNode("div",es,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input"},e.$attrs,{"onUpdate:modelValue":t[0]||(t[0]=r=>a.checked=r),type:"checkbox",name:o.name,disabled:o.disabled}),null,16,ts),[[n.vModelCheckbox,a.checked]]),ns,o.labels?(n.openBlock(),n.createElementBlock("span",os,[a.checked?n.renderSlot(e.$slots,"checked",{key:0},()=>[n.createTextVNode(n.toDisplayString(o.labels.checked||"on"),1)]):n.renderSlot(e.$slots,"unchecked",{key:1},()=>[n.createTextVNode(n.toDisplayString(o.labels.unchecked||"off"),1)])])):n.createCommentVNode("",!0)])],6)}const ac="",as=b({emits:["update:modelValue","change"],props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){const{checked:e,disabled:t}=this;return{"dito-checked":e,"dito-disabled":t}},styles(){const{labels:{checked:e,unchecked:t}={}}=this,o=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":o?`${o*1.5}rem`:null}}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",ss]]),ic="";function Bt({enabled:e},{slots:t}){return e?n.h(n.Transition,is,t):t.default()}Bt.props={enabled:{type:Boolean,default:!0}};const rs=Bt,H=(e,t)=>Object.assign(e.style,t),Dt=e=>getComputedStyle(e).height,is={name:"height",onAfterEnter(e){setTimeout(()=>H(e,{height:"auto"}))},onEnter(e){const{width:t}=getComputedStyle(e);H(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"});const{height:o}=getComputedStyle(e);H(e,{width:null,position:null,visibility:null,height:0}),Dt(e),setTimeout(()=>H(e,{height:o}))},onLeave(e){const{height:t}=getComputedStyle(e);H(e,{height:t}),Dt(e),setTimeout(()=>H(e,{height:0}))}},ls=F.defineComponent({name:"UseFocusTrap",props:["as","options"],setup(e,{slots:t}){let o;const s=F.ref(),a=()=>o&&o.activate(),i=()=>o&&o.deactivate();return F.watch(()=>q.unrefElement(s),r=>{r&&(o=Ht.createFocusTrap(r,e.options||{}),a())},{flush:"post"}),F.onScopeDispose(()=>i()),()=>{if(t.default)return F.h(e.as||"div",{ref:s},t.default())}}});function ds(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema"),d=n.resolveComponent("UseFocusTrap");return n.openBlock(),n.createElementBlock("div",{class:"dito-dialog",ref:"dialog",role:"dialog","aria-expanded":"true","aria-modal":"true",style:n.normalizeStyle({"--width":`${e.settings.width}px`}),onMouseup:t[1]||(t[1]=(...h)=>e.onMouseUp&&e.onMouseUp(...h))},[n.createVNode(d,{class:"dito-dialog__focus-trap",options:{immediate:!0,fallbackFocus:()=>e.$refs.dialog}},{default:n.withCtx(()=>[n.createElementVNode("form",{class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers((...h)=>e.submit&&e.submit(...h),["prevent"]))},[n.createVNode(l,{class:"dito-scroll",schema:e.schema,data:e.dialogData},{buttons:n.withCtx(()=>[n.createVNode(r,{class:"dito-buttons-large",buttons:e.buttonSchemas,data:e.dialogData},null,8,["buttons","data"])]),_:1},8,["schema","data"])],32)]),_:1},8,["options"])],36)}const lc="",cs=C.component("DitoDialog",{components:{UseFocusTrap:ls},emits:["remove"],provide(){return{$dialogComponent:()=>this}},props:{components:{type:Object,required:!0},buttons:{type:Object,required:!0},promise:{type:Object,required:!0},data:{type:Object,default:()=>({})},settings:{type:Object,default:()=>({width:480,clickToClose:!1})}},data(){const e=c.clone(this.data);for(const t in this.components)t in e||(e[t]=null);return{windowEvents:null,dialogData:e}},computed:{dialogComponent(){return this},schema(){return{components:this.components}},buttonSchemas(){return Object.fromEntries(Object.entries(re(this.buttons)).map(([e,t])=>(e==="cancel"&&!t.events&&(t={...t,events:{click:()=>this.cancel()}}),[e,t])))},hasButtons(){return Object.keys(this.buttonSchemas).length>0},hasCancel(){return!!this.buttonSchemas.cancel}},mounted(){this.windowEvents=de(window,{keyup:e=>{(this.hasCancel||!this.hasButtons)&&e.keyCode===27&&this.cancel()}})},unmounted(){this.windowEvents.remove()},methods:{remove(){this.$emit("remove")},resolve(e){this.promise.resolve(e),this.remove()},reject(e){this.promise.reject(e),this.remove()},submit(){this.resolve(this.dialogData)},cancel(){this.resolve(null)},close(){this.cancel()},onMouseUp(){this.settings.clickToClose&&this.close()}}}),wt=b(cs,[["render",ds]]),v={data(){return{domHandlers:[]}},beforeUnmount(){for(const{remove:e}of this.domHandlers)e();this.domHandlers=[]},methods:{domOn(e,t,o){const s=de(e,c.isObject(t)?t:{[t]:o});return this.domHandlers.push(s),s}}},hs={class:"dito-root"},us={class:"dito-page dito-scroll-parent"},ps=[n.createElementVNode("span",null,"Login",-1)];function ms(e,t,o,s,a,i){const r=n.resolveComponent("VueNotifications"),l=n.resolveComponent("DitoDialog"),d=n.resolveComponent("DitoMenu"),h=n.resolveComponent("DitoAccount"),u=n.resolveComponent("DitoHeader"),p=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",hs,[n.createVNode(r,{class:"dito-notifications",ref:"notifications",position:"top right",classes:"dito-notification"},null,512),n.createVNode(n.TransitionGroup,{name:"dito-dialog"},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.dialogs,(g,f)=>(n.openBlock(),n.createBlock(l,{key:f,components:g.components,buttons:g.buttons,promise:g.promise,data:g.data,settings:g.settings,onRemove:m=>e.removeDialog(f)},null,8,["components","buttons","promise","data","settings","onRemove"]))),128))]),_:1}),n.createVNode(d),n.createElementVNode("main",us,[n.createVNode(u,{spinner:e.options.spinner,isLoading:e.isLoading},{default:n.withCtx(()=>[e.user?(n.openBlock(),n.createBlock(h,{key:0})):e.allowLogin?(n.openBlock(),n.createElementBlock("a",{key:1,class:"dito-login",onClick:t[0]||(t[0]=g=>e.rootComponent.login())},ps)):n.createCommentVNode("",!0)]),_:1},8,["spinner","isLoading"]),n.createVNode(p)])])}const cc="",fs=C.component("DitoRoot",{mixins:[v],components:{DitoDialog:wt},provide(){return{$views:()=>this.resolvedViews}},props:{unresolvedViews:{type:[Object,Function,Promise],required:!0},options:{type:Object,default:()=>({})}},data(){return{resolvedViews:{},removeRoutes:null,dialogs:{},allowLogin:!1,loadingCount:0}},computed:{notifications(){return this.$refs.notifications},isLoading(){return this.loadingCount>0}},created(){this.appState.title=document.title||"Dito.js Admin",this.appState.routeComponents=[]},async mounted(){this.domOn(document,{click:e=>{e.target.closest(".dito-label")||(this.appState.activeLabel=null)},keyup:e=>{e.code==="Tab"&&(this.appState.activeLabel=null)}});try{this.allowLogin=!1,await this.fetchUser()?await this.resolveViews():await this.login()}catch(e){console.error(e)}this.allowLogin=!0},methods:{notify({type:e="info",title:t,text:o}={}){t||(t={warning:"Warning",error:"Error",info:"Information",success:"Success"}[e]||"Notification"),o=`<p>${c.asArray(o).join("</p> <p>")}</p>`.replace(/\n|\r\n|\r/g,"<br>");const s={warning:"warn",error:"error",info:"log",success:"log"}[e]||"error";console[s](c.stripTags(o));const{notifications:a=!0}=this.api;if(a){const{durationFactor:i=20}=a,r=(40+o.length+t.length)*i;this.$notify({type:e,title:t,text:o,duration:r})}},closeNotifications(){this.notifications.destroyAll()},registerLoading(e){this.loadingCount+=e?1:-1},showDialog({components:e,buttons:t,data:o,settings:s}){return new Promise(async(a,i)=>{const r=[];if(await Y(this.api,{components:e},r,0),r.length>0)throw new Error("Dialogs do not support components that produce routes");const l=`dialog-${++gs}`;this.dialogs[l]={components:e,buttons:t,data:o,settings:s,promise:{resolve:a,reject:i}}})},removeDialog(e){delete this.dialogs[e]},async login(){var s,a;this.allowLogin=!0;const{additionalComponents:e,redirectAfterLogin:t}=this.options.login||{},o=await this.showDialog({components:{username:{type:"text",autofocus:!0},password:{type:"password"},...e},buttons:{cancel:{},login:{type:"submit"}}});if(o)try{const i=await this.sendRequest({resource:this.api.users.login,data:o,internal:!0});t?location.replace(t):(this.setUser(i.data.user),await this.resolveViews())}catch(i){const r=(a=(s=i.response)==null?void 0:s.data)==null?void 0:a.error;this.notify({type:"error",title:"Authentication Error",text:r||i}),r||console.error(i,i.response),this.login()}},navigateHome(){return this.navigate("/")},async logout(){try{(await this.sendRequest({resource:this.api.users.logout,internal:!0})).data.success&&(this.setUser(null),this.navigateHome())}catch(e){console.error(e)}},async fetchUser(){let e=null;try{e=(await this.sendRequest({resource:this.api.users.session,internal:!0})).data.user||null}catch(t){this.notify({type:"error",title:"Authentication Error",text:t})}return this.setUser(e),e},setUser(e){this.appState.user=e&&Object.setPrototypeOf(e,xn.prototype),e||(this.resolvedViews={},this.navigateHome())},async ensureUser(){await this.fetchUser()||await this.login()},async resolveViews(){var o;try{this.resolvedViews=await oe(this.unresolvedViews)}catch(s){return s.request||console.error(s),this.login()}const e=await c.mapConcurrently(Object.entries(this.resolvedViews),([s,a])=>An(gt,this.api,a,s)),{fullPath:t}=this.$route;(o=this.removeRoutes)==null||o.call(this),this.removeRoutes=bs(this.$router,[{name:"root",path:"/",components:{}},...e]),this.$router.replace(t)}}});let gs=0;function bs(e,t){const o=[];for(const s of t){const a=e.addRoute(s);o.push(a)}return()=>{for(const s of o)s()}}const Ee=b(fs,[["render",ms]]),ys={class:"dito-menu dito-scroll-parent"},ks={class:"dito-scroll"};function Cs(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("nav",ys,[n.createElementVNode("h1",null,n.toDisplayString(e.appState.title),1),n.createElementVNode("ul",ks,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.views,l=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:0,class:"dito-link",to:`/${l.path}`,activeClass:"dito-active"},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l)),1)]),_:2},1032,["to"])):n.createCommentVNode("",!0)]))),256))])])}const hc="",$s=C.component("DitoMenu",{}),Bs=b($s,[["render",Cs]]),Ds={class:"dito-spinner"};function ws(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("div",Ds,[n.createElementVNode("div",{class:"v-pulse v-pulse1",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay1])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse2",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay2])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse3",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay3])},null,4)],512)),[[n.vShow,o.loading]])}const uc="",Vt=b({props:{loading:{type:Boolean,default:!0},color:{type:String,default:"#5dc596"},size:{type:String,default:"15px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},data(){return{spinnerStyle:{backgroundColor:this.color,width:this.size,height:this.size,margin:this.margin,borderRadius:this.radius,display:"inline-block",animationName:"v-pulseStretchDelay",animationDuration:"0.75s",animationIterationCount:"infinite",animationTimingFunction:"cubic-bezier(.2,.68,.18,1.08)",animationFillMode:"both"},spinnerDelay1:{animationDelay:"0.12s"},spinnerDelay2:{animationDelay:"0.24s"},spinnerDelay3:{animationDelay:"0.36s"}}}},[["render",ws]]),Vs={class:"dito-header"},Ss={class:"dito-trail"};function Ps(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoSpinner");return n.openBlock(),n.createElementBlock("nav",Vs,[n.createElementVNode("div",Ss,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.trail,(d,h)=>(n.openBlock(),n.createElementBlock("li",null,[h===e.trail.length-1?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(e.getBreadcrumbClass(d))},n.toDisplayString(d.breadcrumb),3)):(n.openBlock(),n.createBlock(r,{key:1,class:"dito-breadcrumb",to:d.path},{default:n.withCtx(()=>[n.createElementVNode("span",{class:n.normalizeClass(e.getBreadcrumbClass(d))},n.toDisplayString(d.breadcrumb),3)]),_:2},1032,["to"]))]))),256))]),e.isLoading?(n.openBlock(),n.createBlock(l,{key:0})):n.createCommentVNode("",!0)]),n.renderSlot(e.$slots,"default")])}const mc="",Es=C.component("DitoHeader",{components:{DitoSpinner:Vt},props:{spinner:{type:Object,default:null},isLoading:{type:Boolean,default:!1}},computed:{trail(){return this.appState.routeComponents.filter(e=>!!e.routeRecord)}},created(){const{size:e="8px",color:t="#999"}=this.spinner||{},{props:o}=Vt;o.size.default=e,o.color.default=t},methods:{getBreadcrumbClass(e){return{"dito-dirty":e.isDirty}}}}),Os=b(Es,[["render",Ps]]),St={mixins:[v],data(){return{pulldown:{open:!1,startTime:0,checkTime:!0,events:{mousedown:()=>{this.setPulldownOpen(!1),this.pulldown.handlers.remove()},mouseup:()=>{this.onPulldownMouseUp(null)&&this.pulldown.handlers.remove()}},handlers:null}}},methods:{onPulldownMouseDown(e){e?this.checkTime=!1:(this.setPulldownOpen(!0),this.checkTime=!0)},onPulldownMouseUp(e){const{startTime:t}=this.pulldown;if(!this.checkTime||t&&Date.now()-t>250)return this.setPulldownOpen(!1),e&&this.onPulldownSelect(e),!0},onPulldownSelect(){},setPulldownOpen(e){this.pulldown.open=e,this.pulldown.startTime=e?Date.now():0,e&&(this.pulldown.handlers=this.domOn(document,this.pulldown.events))}}},Ns={class:"dito-account"},Ls=["onMousedown","onMouseup"];function Fs(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Ns,[n.createElementVNode("a",{onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},[n.createElementVNode("span",null,n.toDisplayString(e.user.username),1)],32),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(r),41,Ls)]))),256))],2)])}const fc="",Ts=C.component("DitoAccount",{mixins:[St],data(){return{items:{settings:"Settings",logout:"Logout"}}},methods:{onPulldownSelect(e){switch(e){case"logout":this.rootComponent.logout();break;case"settings":console.info("TODO: Implement Settings");break}}}}),_s=b(Ts,[["render",Fs]]);function js(e,t,o,s,a,i){return e.content?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.options.tag||e.tag),{key:0,class:n.normalizeClass(e.classes),style:n.normalizeStyle(e.styles)},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.options.text),1)]),_:1},8,["class","style"])):n.createCommentVNode("",!0)}const Ms=C.component("DitoElement",{props:{tag:{type:String,default:"span"},content:{type:[String,Object],default:null}},computed:{options(){const{content:e}=this;return c.isObject(e)?e:{text:e}},classes(){return{...this.$attrs.class,...Pt(this.options.class)}},styles(){return{...this.$attrs.style,...Pt(this.options.style)}}}});function Pt(e){return c.asArray(e).reduce((t,o)=>(c.isString(o)?t[o]=!0:c.isObject(o)&&Object.assign(t,o),t),{})}const Rs=b(Ms,[["render",js]]),qs=["for","innerHTML"];function Is(e,t,o,s,a,i){const r=n.resolveComponent("DitoElement");return e.text||e.collapsible?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),n.mergeProps({key:0,class:"dito-label"},e.attributes,{class:{"dito-active":e.isActive}}),{default:n.withCtx(()=>[e.collapsible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":!e.collapsed}])},null,2)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.prefixes,(l,d)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-prefix",key:`prefix-${d}`,tag:"span",content:l},null,8,["content"]))),128)),n.createElementVNode("label",{for:e.dataPath,innerHTML:e.text},null,8,qs),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.suffixes,(l,d)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-suffix",key:`suffix-${d}`,tag:"span",content:l},null,8,["content"]))),128)),n.renderSlot(e.$slots,"edit-buttons")]),_:3},16,["class"])):n.createCommentVNode("",!0)}const gc="",zs=C.component("DitoLabel",{emits:["expand"],props:{label:{type:[String,Object],default:null},dataPath:{type:String,default:null},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1}},computed:{tag(){return this.collapsible?"a":"div"},text(){const{label:e}=this;return c.isObject(e)?e==null?void 0:e.text:e},prefixes(){var e;return c.asArray((e=this.label)==null?void 0:e.prefix)},suffixes(){var e;return c.asArray((e=this.label)==null?void 0:e.suffix)},attributes(){return this.collapsible?{onClick:this.onClick}:{}},isActive(){return this.appState.activeLabel===this}},methods:{onClick(){this.appState.activeLabel=this,this.$emit("expand",this.collapsed)}}}),As=b(zs,[["render",Is]]),Oe={methods:{getItemFormSchema:De,getItemUid:Xn,getItemId(e,t,o=null){return this.isTransient&&o!==null?String(o):ut(e,t)},getItemDataPath(e,t){let{dataPath:o}=this;return e!==this.schema&&(o=L(o,e.name)),t!=null&&(o=L(o,t)),o},findItemIdIndex(e,t,o){const s=this.isTransient?o:t==null?void 0:t.findIndex((a,i)=>this.getItemId(e,a,i)===o);return s!==-1?s:null},getItemLabel(e,t,{index:o=null,extended:s=!1,asObject:a=!1}={}){const{itemLabel:i}=e;if(!t||!s&&i===!1)return null;let r;const l=()=>r||(r=this.getItemDataPath(e,o));let d;const h=()=>d||(d=this.getLabel(De(e,t,this.context)));let u,p,g;if(c.isFunction(i)){const m=i.call(this,new V(this,{nested:!1,data:t,value:t,index:o,get dataPath(){return l()},get formLabel(){return h()}}));c.isObject(m)?{text:u,prefix:p,suffix:g}=m:u=m,s=!1}else if(c.isString(i)&&!(i in t))u=i;else{const{columns:m}=e,k=c.isString(i)&&i||X(e)&&m&&Object.keys(m)[0]||"name";u=t[k]}const f=!!u;if(u==null&&(s=!0,u=X(e)&&o!==null?u=`${o+1}`:""),s){const m=h();m&&(u=`${m} ${f?`'${u}'`:u}`)}return a?{text:u,prefix:p,suffix:g}:u}}},Us={class:"dito-schema"},Hs={class:"dito-schema-content"};function Ws(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTabs"),d=n.resolveComponent("DitoClipboard"),h=n.resolveComponent("DitoPane"),u=n.resolveComponent("TransitionHeight"),p=n.resolveComponent("DitoPanels");return n.openBlock(),n.createElementBlock("div",Us,[n.createElementVNode("div",Hs,[e.hasLabel||e.hasTabs||e.clipboard?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-schema-header",{"dito-schema-menu-header":e.menuHeader}])},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.dataPath,collapsible:e.collapsible,collapsed:!e.opened,onExpand:e.onExpand},n.createSlots({_:2},[e.inlined?{name:"edit-buttons",fn:n.withCtx(()=>[n.renderSlot(e.$slots,"edit-buttons")]),key:"0"}:void 0]),1032,["label","dataPath","collapsible","collapsed","onExpand"])):n.createCommentVNode("",!0),e.tabs?(n.openBlock(),n.createBlock(l,{key:1,tabs:e.tabs,selectedTab:e.selectedTab},null,8,["tabs","selectedTab"])):n.createCommentVNode("",!0),n.createVNode(d,{clipboard:e.clipboard,dataPath:e.dataPath,data:e.data},null,8,["clipboard","dataPath","data"])],2)):n.createCommentVNode("",!0),e.hasTabs?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(e.tabs,(g,f)=>(n.openBlock(),n.createBlock(h,{class:"dito-pane-tab",ref_for:!0,ref:"tabs",key:f,visible:e.selectedTab===f,tab:f,schema:g,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasMainPane,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["visible","tab","schema","dataPath","data","meta","store","single","disabled","generateLabels"]))),128)):n.createCommentVNode("",!0),n.createVNode(u,{enabled:e.inlined},{default:n.withCtx(()=>[e.hasMainPane&&e.opened?(n.openBlock(),n.createBlock(h,{key:0,class:"dito-pane-main",ref:"components",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasTabs,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","disabled","generateLabels"])):n.createCommentVNode("",!0)]),_:1},8,["enabled"]),!e.inlined&&e.isPopulated?n.renderSlot(e.$slots,"buttons",{key:2}):n.createCommentVNode("",!0)]),e.inlined?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.hasLabel?n.createCommentVNode("",!0):n.renderSlot(e.$slots,"edit-buttons",{key:0})],64)):e.isPopulated?(n.openBlock(),n.createBlock(p,{key:1,panels:e.panelEntries,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])):n.createCommentVNode("",!0)])}const bc="",Ks=C.component("DitoSchema",{mixins:[Oe],components:{TransitionHeight:rs},provide(){return{$schemaComponent:()=>this}},inject:["$schemaParentComponent"],props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},label:{type:[String,Object],default:null},inlined:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0},hasOwnData:{type:Boolean,default:!1},menuHeader:{type:Boolean,default:!1}},data(){const{data:e}=this.schema;return{...e&&c.isFunction(e)?e(this.context):e,componentsRegistry:{},panesRegistry:{},panelsRegistry:{}}},computed:{schemaComponent(){return this},parentSchemaComponent(){return this.hasOwnData?null:this.parentComponent.schemaComponent},panelEntries(){const e=dt(this.schema.panels,"");for(const t of this.panes)e.push(...t.panelEntries);return e},tabs(){return U(this.schema.tabs)},selectedTab(){var o,s;const e=((o=this.$route.hash)==null?void 0:o.slice(1))||null,t=e&&this.shouldRender(this.tabs[e])?e:((s=this.defaultTab)==null?void 0:s.name)||null;return t!==e&&this.$router.replace({hash:`#${t}`}),t},defaultTab(){let e=null;if(this.tabs)for(const t of Object.values(this.tabs)){const{defaultTab:o}=t;if(c.isFunction(o)?o(this.context):o)return t;e||(e=t)}return e},clipboard(){var e;return(e=this.schema)==null?void 0:e.clipboard},parentData(){const e=me(this.rootData,this.dataPath,!1);return e!==this.data?e:null},processedData(){return this.processData({target:"server",schemaOnly:!0})},clipboardData(){return{$schema:this.schema.name,...this.processData({target:"clipboard",schemaOnly:!0})}},item(){return this.data},parentItem(){return this.parentData},rootItem(){return this.rootData},processedItem(){return this.processedData},clipboardItem(){return this.clipboardData},formLabel(){return this.getLabel(this.getItemFormSchema(this.sourceSchema,this.data,this.context))},isDirty(){return this.someComponent(e=>e.isDirty)},isTouched(){return this.someComponent(e=>e.isTouched)},isValid(){return this.everyComponent(e=>e.isValid)},isValidated(){return this.everyComponent(e=>e.isValidated)},hasData(){return!!this.data},hasLabel(){return!!this.label||this.collapsible},hasTabs(){return!this.inlined&&!!this.tabs},hasMainPane(){const{components:e}=this.schema;return!!e&&Object.keys(e).length>0},opened:Ce("opened",{default(){return!this.collapsed}}),components(){return Object.values(this.componentsRegistry)},panes(){return Object.values(this.panesRegistry)},panels(){return Object.values(this.panelsRegistry)},componentsByDataPath(){return this._listEntriesByDataPath(this.componentsRegistry)},panesByDataPath(){return this._listEntriesByDataPath(this.panesRegistry)},panelsByDataPath(){return this._listEntriesByDataPath(this.panelsRegistry)}},created(){this._register(!0),this.setupSchemaFields(),this.delegate("change",this.parentSchemaComponent),this.emitEvent("initialize")},beforeUnmount(){this.emitEvent("destroy"),this._register(!1)},methods:{getComponentsByDataPath(e,t){return this._getEntriesByDataPath(this.componentsByDataPath,e,t)},getComponentByDataPath(e,t){return this.getComponentsByDataPath(e,t)[0]||null},getComponentsByName(e,t){return this._getEntriesByName(this.componentsByDataPath,e,t)},getComponentByName(e,t){return this.getComponentsByName(e,t)[0]||null},getComponents(e,t){return this._getEntries(this.componentsByDataPath,e,t)},getComponent(e,t){return this.getComponents(e,t)[0]||null},getPanelsByDataPath(e,t){return this._getEntriesByDataPath(this.panelsByDataPath,e,t)},getPanelByDataPath(e,t){return this.getPanelsByDataPath(e,t)[0]||null},getPanels(e,t){return this._getEntries(this.panelsByDataPath,e,t)},getPanel(e,t){return this.getPanels(e,t)[0]||null},someComponent(e){return this.isPopulated&&this.components.some(e)},everyComponent(e){return this.isPopulated&&this.components.every(e)},onExpand(e){this.emitEvent("expand",{context:{expand:e}}),(!this.opened||e||this.validateAll())&&(this.opened=e)},onChange(){this.emitEvent("change")},resetValidation(){for(const e of this.components)e.resetValidation()},clearErrors(){for(const e of this.components)e.clearErrors()},focus(){var e;(e=this.parentSchemaComponent)==null||e.focus(),this.opened=!0},validateAll(e,t=!0){const{componentsByDataPath:o}=this;let s;if(e){const r=c.isFunction(e)?e:c.isRegExp(e)?l=>e.test(l):null;s=r?Object.keys(o).filter(r):c.isArray(e)?e:[e]}t&&this.clearErrors();let a=!0,i=!0;s||(s=Object.keys(o));for(const r of s){const l=this.getComponentsByDataPath(r);for(const d of l)d.validate(t)||(t&&i&&d.focus(),i=!1,a=!1)}return t&&!a&&this.notifyErrors(),a},verifyAll(e){return this.validateAll(e,!1)},async showValidationErrors(e,t){var a;this.clearErrors();let o=!0;const s=[];for(const[i,r]of Object.entries(e)){const l=this.hasOwnData?L(this.dataPath,i):i,d=c.parseDataPath(l);let h=!1;const u=this.getComponentsByDataPath(d);for(const p of u)p.showValidationErrors(r,o&&t)&&(h=!0,o=!1);if(!h){const p=d.pop();for(;d.length>0;){const f=this.getComponentsByDataPath(d);for(const m of f)if(await((a=m.navigateToComponent)==null?void 0:a.call(m,l,k=>{let P=!1;for(const w of k){const $=e[w.dataPath];$&&w.showValidationErrors($,o&&t)&&(P=!0,o=!1)}return P})))return;d.pop()}const g=c.labelize(p);for(const f of r){const m=g?`The field ${g}`:`The ${this.formLabel}`;s.push(`${m} ${f.message}`)}}o=!1}o||this.notifyErrors(s.join(`
2
+ `))},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,ot(this.schema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={};for(const[o,s]of Object.entries(e))(c.isArray(s)||c.isObject(s))&&this.getComponentsByName(o).some(i=>i.providesData)||(t[o]=s);return t},processData({target:e="clipboard",schemaOnly:t=!0}={}){return Gn(this.schema,this.sourceSchema,this.data,this.dataPath,{component:this,schemaOnly:t,target:e})},_register(e){var t;(t=this.$schemaParentComponent())==null||t._registerSchemaComponent(this,e)},_registerComponent(e,t){var o;this._registerEntry(this.componentsRegistry,e,t),(o=this.parentSchemaComponent)==null||o._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||(t[s]=[])).push(o),t},{})},_getEntries(e,t,o){return c.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t,o):this._getEntriesByName(e,t,o)},_getEntriesByDataPath(e,t,o){return this._filterEntries(e[c.normalizeDataPath(t)]||[],o)},_getEntriesByName(e,t,o){return this._filterEntries(e[L(this.dataPath,t)]||[],o)},_filterEntries(e,t){return t?e.filter(t):e}}}),Ys=b(Ks,[["render",Ws]]);function Js(e,t,o,s,a,i){const r=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:n.normalizeClass(["dito-schema-inlined",{"dito-schema-compact":e.isCompact}]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,inlined:!0,disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible,generateLabels:!e.isCompact},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(r,{key:0,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.$emit("delete"))},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","disabled","collapsed","collapsible","generateLabels","class"])}const yc="",Qs=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null}},computed:{isCompact(){return xe(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),Gs=b(Qs,[["render",Js]]),Xs={key:0,class:"dito-pane"},Zs={key:0,class:"dito-break"},vs={key:2,class:"dito-break"};function xs(e,t,o,s,a,i){const r=n.resolveComponent("DitoContainer");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",Xs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:l,dataPath:d,nestedDataPath:h,nested:u,store:p})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[l.break==="before"?(n.openBlock(),n.createElementBlock("div",Zs)):n.createCommentVNode("",!0),e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:h,schema:l,dataPath:d,data:e.data,meta:e.meta,store:p,single:e.isSingleComponent,nested:u,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","nested","disabled","generateLabels"])):n.createCommentVNode("",!0),l.break==="after"?(n.openBlock(),n.createElementBlock("div",vs)):n.createCommentVNode("",!0)],64))),256))],512)),[[n.vShow,e.visible]]):n.createCommentVNode("",!0)}const kc="",ea=C.component("DitoPane",{provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0}},computed:{tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){var t,o;const e=(t=this.sourceSchema)==null?void 0:t.wrapPrimitives;return Object.entries(((o=this.schema)==null?void 0:o.components)||{}).map(([s,a])=>{a.name=s;const i=et(a),r=L(this.dataPath,s);return{schema:a,dataPath:i&&!e?r:this.dataPath,nestedDataPath:r,nested:i,store:i?this.getChildStore(s):this.store}})},panelEntries(){return this.componentSchemas.flatMap(({schema:e,nestedDataPath:t})=>ht(e,t,this.schemaComponent,this.tabComponent))},isSingleComponent(){return this.single&&this.componentSchemas.length===1}},created(){this._register(!0)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){this.tab&&this.$router.push({hash:`#${this.tab}`})}}}),ta=b(ea,[["render",xs]]);function na(e){const t=c.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function oa(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClass]),style:n.normalizeStyle(e.containerStyle)},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.labelDataPath,class:n.normalizeClass(e.componentClass)},null,8,["label","dataPath","class"])):n.createCommentVNode("",!0),(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{class:n.normalizeClass(["dito-component",e.componentClass]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:e.single,nested:e.nested,disabled:e.componentDisabled,onErrors:e.onErrors},null,40,["schema","dataPath","data","meta","store","single","nested","disabled","class","onErrors"])),n.createVNode(l,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const Cc="",sa=C.component("DitoContainer",{props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},generateLabels:{type:Boolean,default:!0}},data(){return{errors:null}},computed:{context(){return new V(this,{nested:this.nested})},typeComponent(){return te(this.schema.type)},hasLabel(){var t;const{label:e}=this.schema;return e!==!1&&(!!e||this.generateLabels&&((t=this.typeComponent)==null?void 0:t.generateLabel))},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},componentWidth:y("width",{type:[String,Number],default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultWidth},get(e){return e===void 0?1:c.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),componentWidthOperator:y("width",{type:String,get(e){return c.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:y("visible",{type:Boolean,default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultVisible}}),componentDisabled:y("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),containerClass(){const{class:e}=this.schema,t="dito-container";return{[`${t}--single`]:this.single,[`${t}--has-label`]:this.hasLabel,[`${t}--align-bottom`]:Qn(this.schema),[`${t}--omit-padding`]:Jn(this.schema),...c.isString(e)?{[e]:!0}:e}},componentBasis(){const e=this.componentWidth,t=[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e):/[a-z]/.test(e)?e:na(e)*100;return c.isNumber(t)?`${t}%`:t},containerStyle(){const e=this.componentWidthOperator===">"||this.componentWidth==="fill",t=this.componentWidthOperator==="<";return{flex:`${e?1:0} ${t?1:0} ${this.componentBasis}`}},componentClass(){const e=this.componentBasis==="auto";return{"dito-single":this.single,"dito-disabled":this.componentDisabled,"dito-width-fill":!e||this.componentWidth==="fill","dito-width-auto":e,"dito-has-errors":!!this.errors}}},methods:{onErrors(e){this.errors=e}}}),aa=b(sa,[["render",oa]]),ra={class:"dito-tabs"};function ia(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",ra,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(l,d)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{class:n.normalizeClass(["dito-link",{"dito-active":e.selectedTab===d}]),key:d,to:{hash:`#${d}`}},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l,d)),1)]),_:2},1032,["to","class"])):n.createCommentVNode("",!0)],64))),256))])}const $c="",la=C.component("DitoTabs",{props:{tabs:{type:Object,default:null},selectedTab:{type:String,default:null}}}),da=b(la,[["render",ia]]),ca={class:"dito-panel-title"};function ha(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createElementVNode("label",ca,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(l,{class:"dito-panel-schema",schema:e.panelSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled,hasOwnData:e.hasOwnData},{buttons:n.withCtx(()=>[n.createVNode(r,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]])}const Bc="",ua=C.component("DitoPanel",{mixins:[mt],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return re(this.schema.buttons)},target(){return this.schema.target||this.dataPath},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:y("visible",{type:Boolean,default:!0})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=c.isFunction(e)?e(this.context):e)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),pa=b(ua,[["render",ha]]),ma={key:0,class:"dito-panels"};function fa(e,t,o,s,a,i){const r=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",ma,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:d,tabComponent:h})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:e.getPanelKey(d,h),schema:l,dataPath:d,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled!=null?l.disabled:e.disabled,panelTabComponent:h},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Dc="",ga=C.component("DitoPanels",{props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),ba=b(ga,[["render",fa]]);function Et(e){return e&&c.asArray(e).some(t=>t.type!==n.Comment)}function ya(e,t={}){return e=c.isString(e)?n.useSlots()[e]:e,Et(e==null?void 0:e(t))}const ka={key:0,class:"dito-buttons"},Ca={key:0,class:"dito-container"};function $a(e,t,o,s,a,i){var d,h;const r=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",ka,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(u,p)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(u)?(n.openBlock(),n.createBlock(r,{key:p,schema:u,dataPath:p,data:e.data,meta:e.meta,store:e.getChildStore(u.name),disabled:e.disabled,generateLabels:!1},null,8,["schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList((h=(d=e.$slots).default)==null?void 0:h.call(d),u=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(u)?(n.openBlock(),n.createElementBlock("div",Ca,[n.createVNode(l,{vnode:u},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const wc="",Ba=C.component("DitoButtons",{provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[L(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:ya,hasVNodeContent:Et}}),Da=b(Ba,[["render",$a]]);function wa(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),d=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(d,{class:"dito-edit-buttons dito-buttons-round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.isDraggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.isEditable?(n.openBlock(),n.createBlock(r,n.mergeProps({key:1,class:"dito-button",to:{path:e.editPath}},e.getButtonAttributes(e.verbs.edit)),null,16,["to"])):n.createCommentVNode("",!0),e.isCreatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,path:e.createPath,verb:e.verbs.create,text:e.createButtonText},null,8,["schema","path","verb","text"])):n.createCommentVNode("",!0),e.isDeletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=h=>e.$emit("delete"))}),null,16)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store"])}const Vc="",Va=C.component("DitoEditButtons",{emits:["delete"],props:{draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null},buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggable(){return this.hasOption("draggable")},isEditable(){return this.hasOption("editable")&&!!this.editPath},isCreatable(){return this.hasOption("creatable")&&!!this.createPath},isDeletable(){return this.hasOption("deletable")},createButtonText(){var e;return((e=this.schema.creatable)==null?void 0:e.label)||this.formLabel&&`${c.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasOption(e){return!!(this[e]&&this.schema[e]!==!1)}}}),Sa=b(Va,[["render",wa]]),Pa={class:"dito-create-button"},Ea=["title"],Oa=["onMousedown","onMouseup"],Na=["type","title"];function La(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Pa,[e.showPulldown?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:"button",title:e.labelize(e.verb),onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},n.toDisplayString(e.text),43,Ea),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.forms,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(r)?n.withDirectives((n.openBlock(),n.createElementBlock("a",{key:0,class:n.normalizeClass(e.getFormClass(r,l)),onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(r)),43,Oa)),[[n.vShow,e.shouldShow(r)]]):n.createCommentVNode("",!0)]))),256))],2)],64)):(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:e.isInlined?"button":"submit",title:e.labelize(e.verb),onClick:t[1]||(t[1]=r=>e.createItem(e.forms.default))},n.toDisplayString(e.text),11,Na))])}const Sc="",Fa=C.component("DitoCreateButton",{mixins:[St],props:{schema:{type:Object,required:!0},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null}},computed:{forms(){return Q(this.schema,this.context)},isInlined(){return we(this.schema)},showPulldown(){return Object.keys(this.forms).length>1||!this.forms.default}},methods:{createItem(e,t=null){if(this.shouldRender(e)&&!this.shouldDisable(e))this.isInlined?this.sourceComponent.createItem(e,t):this.$router.push({path:`${this.path}/create`,query:{type:t}});else throw new Error("Not allowed to create item for given form")},getFormClass(e,t){return{[`dito-type-${t}`]:!0,"dito-disabled":this.shouldDisable(e)}},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),Ta=b(Fa,[["render",La]]),_a={key:0,class:"dito-clipboard dito-buttons dito-buttons-round"},ja=["disabled"],Ma=["disabled"];function Ra(e,t,o,s,a,i){return e.clipboard?(n.openBlock(),n.createElementBlock("div",_a,[n.createElementVNode("button",{class:"dito-button dito-button-copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...r)=>e.onCopy&&e.onCopy(...r))},null,8,ja),n.createElementVNode("button",{class:"dito-button dito-button-paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...r)=>e.onPaste&&e.onPaste(...r))},null,8,Ma)])):n.createCommentVNode("",!0)}const qa=C.component("DitoClipboard",{mixins:[v],props:{clipboard:{type:[Boolean,Object],default:!1},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null}},data(){return{copyEnabled:!1,pasteEnabled:!1,fixClipboard:!0}},computed:{clipboardOptions(){return c.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>c.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>t}},mounted(){this.domOn(document,{copy:this.checkClipboard}),this.domOn(window,{focus:this.checkClipboard}),this.$watch("data",{immediate:!0,handler:(e,t)=>{e!==t&&this.checkClipboard()}})},methods:{async getClipboardData(e){var a,i,r,l,d;let{clipboardData:t}=this.appState;try{const h=await((i=(a=navigator.clipboard)==null?void 0:a.readText)==null?void 0:i.call(a));this.fixClipboard&&h&&(await((l=(r=navigator.clipboard)==null?void 0:r.writeText)==null?void 0:l.call(r,h)),this.fixClipboard=!1),h&&(t=JSON.parse(h))}catch(h){e&&(console.error(h,h.name,h.message),h.name==="SyntaxError"&&alert(c.deindent`
3
3
  The data in the clipboard appears to be malformed:
4
4
  ${h.message}
5
- `))}const{$schema:o,...s}=t||{};return o===((d=this.schemaComponent)==null?void 0:d.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),Ia=b(qa,[["render",Ra]]),Nt={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Ot={mixins:[Ne,Nt],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return ot(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const i={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,i);const r={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(r);a(null,l)}catch(l){const{response:d}=l;if(!a(l,d)){const h=d==null?void 0:d.data,u=c.isString(h==null?void 0:h.type)?c.labelize(h.type):"Error",p=(h==null?void 0:h.message)??l;this.notify({type:"error",title:u,text:p})}}this.setLoading(!1,i)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:i,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:d=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(u,p)=>{const g=p==null?void 0:p.data;if(u){const f=this.isValidationError(p)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=c.isObject(g)?g:u;r==null||r(m),await this.emitButtonEvent(e,"error",{notify:d,error:m})}h(!1)}else a&&g&&this.setData(g),i==null||i(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),i=await e.emitEvent(t,{context:a});return o&&i===void 0&&!a.wasNotified&&o(s),i}}};function za(e){return new URL(`file:${e}`).pathname}const Aa=["data-resource"],Ua={type:"submit",disabled:""};function Ha(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),d=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(d,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ua,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,Aa)}const Wa=C.component("DitoForm",{mixins:[ft,Ot],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return re(c.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return ke(this.itemId,e)||e},breadcrumbPrefix(){return c.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=c.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];G(this.sourceSchema)&&a==="create"&&t.length--;for(let i=0,r=t.length;i<r&&e;i++){const l=t[i],d=/^:id/.test(s[i])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;i===r-1?this.sourceKey=d:e=e[d]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=c.clone(e)),e===null&&!this.isCreating&&G(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return G(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),i=a||this.resource,r=(i==null?void 0:i.method)||this.method,l=this.getPayloadData(e,r);let d;if(!a&&this.isTransient?d=await this.submitTransient(e,i,r,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${c.capitalize(h)}`:`Change ${c.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):d=await this.submitResource(e,i,r,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${c.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const u=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${u} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),d){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:za(`${this.path}/../${h}`)})}}return d},async submitTransient(e,t,o,s,{onSuccess:a,onError:i,notifySuccess:r,notifyError:l}){const d=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(d)a==null||a(),await this.emitButtonEvent(e,"success",{notify:r});else{const h="Could not submit transient item";i==null||i(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return d}}}),Lt=b(Wa,[["render",Ha]]),Pc="",Ka=C.component("DitoFormNested",{extends:Lt}),Ya={key:0,class:"dito-errors"};function Ja(e,t,o,s,a,i){return e.errors?(n.openBlock(),n.createElementBlock("div",Ya,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const Ec="",Qa=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Ga=b(Qa,[["render",Ja]]),Xa={class:"dito-scopes"},Za=["title","onClick"];function va(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Xa,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,d)=>(n.openBlock(),n.createBlock(r,{key:d,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,Za)]),_:2},1032,["to"]))),128))])}const Nc="",xa=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),er=b(xa,[["render",va]]);function tr(e,t,o,s,a,i){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const nr=C.component("DitoPagination",{components:{Pagination:xo},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),or=b(nr,[["render",tr]]),Oe={mixins:[Ne],data(){return{dragging:!1}},methods:{getSortableOptions(e=!1){return{animation:150,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:e,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let i=0;i<t.length;i++)t[i][s]=i+a}return t}}},sr=["id"],ar={key:0,class:"dito-tree-header"},rr=["innerHTML"],ir={key:1,class:"dito-tree-info"},lr={key:1,class:"dito-tree-leaf"},dr=["innerHTML"],cr={key:2,class:"dito-buttons dito-buttons-small"},hr={key:1,class:"dito-properties"};function ur(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),d=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",ar,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(u=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,rr),e.details?(n.openBlock(),n.createElementBlock("div",ir,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",lr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,dr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",cr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...u)=>e.onEdit&&e.onEdit(...u))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...u)=>e.onDelete&&e.onDelete(...u))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",hr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,u=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[u.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(u),label:e.getLabel(u)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:u,schema:u,dataPath:e.getPropertyDataPath(u),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(!0),draggable:e.childrenDraggable,"onUpdate:modelValue":t[3]||(t[3]=u=>e.childrenList=u)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(u,p)=>(n.openBlock(),n.createBlock(d,{key:e.getItemUid(e.childrenSchema,u.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,p),data:u.data,path:u.path,open:u.open,active:u.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,u.data,{index:p}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options","draggable"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,sr)}const Oc="",pr=C.component("DitoTreeItem",{mixins:[Oe],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return U(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,i)=>{const r=e.path&&`${this.path}/${e.path}/${i}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:a,path:r,open:l,active:o===r}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return L(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),mr=b(pr,[["render",ur]]),fr={class:"dito-table-head"},gr=["onClick"],br=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),yr={key:1},kr={key:0},Cr=[n.createElementVNode("span",null,null,-1)];function $r(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",fr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:d})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:d},[br,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,gr)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",yr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",kr,Cr)):n.createCommentVNode("",!0)])])}const Fc="",Br=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${c.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),Dr=b(Br,[["render",$r]]),wr=["innerHTML"];function Vr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,wr))],6)}const Sr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:L(this.dataPath,t)})):c.escapeHtml(s)}}}),Pr=b(Sr,[["render",Vr]]);var Er=Object.defineProperty,ce=Object.getOwnPropertySymbols,Ft=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,_t=(e,t,o)=>t in e?Er(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,jt=(e,t)=>{for(var o in t||(t={}))Ft.call(t,o)&&_t(e,o,t[o]);if(ce)for(var o of ce(t))Tt.call(t,o)&&_t(e,o,t[o]);return e},Nr=(e,t)=>{var o={};for(var s in e)Ft.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&ce)for(var s of ce(e))t.indexOf(s)<0&&Tt.call(e,s)&&(o[s]=e[s]);return o};function Or(e,t,o={}){let s;const a=o,{document:i=q.defaultDocument}=a,r=Nr(a,["document"]),l={onUpdate:u=>{Lr(t,u.oldIndex,u.newIndex)}},d=()=>{const u=typeof e=="string"?i==null?void 0:i.querySelector(e):q.unrefElement(e);u&&(s=new Wt(u,jt(jt({},l),r)))},h=()=>s==null?void 0:s.destroy();return q.tryOnMounted(d),q.tryOnScopeDispose(h),{stop:h,start:d}}function Lr(e,t,o){const s=q.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];F.nextTick(()=>s.splice(o,0,a))}}const Fr=F.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=q.useVModel(e,"modelValue"),s=F.ref(),a=F.reactive(Or(s,o,e.options));return()=>{if(t.default)return F.h(e.tag,{ref:s},t.default(a))}}});function Tr(e,t,o,s,a,i){const r=n.resolveComponent("UseSortable");return e.draggable?(n.openBlock(),n.createBlock(r,{key:0,tag:e.tag,modelValue:e.modelValue,options:e.options,"onUpdate:modelValue":t[0]||(t[0]=l=>e.$emit("update:modelValue",l))},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3},8,["tag","modelValue","options"])):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),{key:1},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3}))}const _r=C.component("DitoDraggable",{components:{UseSortable:Fr},emits:["update:modelValue"],props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0},draggable:{type:Boolean,default:!0}}}),jr=b(_r,[["render",Tr]]);function Mt({vnode:e}){return e}Mt.props={vnode:{type:Object,required:!0}};const Mr=C.component("DitoVnode",Mt),Rr=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:_s,DitoButtons:Da,DitoClipboard:Ia,DitoContainer:aa,DitoCreateButton:Ta,DitoDialog:wt,DitoDraggable:jr,DitoEditButtons:Sa,DitoElement:Rs,DitoErrors:Ga,DitoForm:Lt,DitoFormNested:Ka,DitoHeader:Ns,DitoLabel:As,DitoMenu:Bs,DitoPagination:or,DitoPane:ta,DitoPanel:pa,DitoPanels:ba,DitoRoot:Ee,DitoSchema:Ys,DitoSchemaInlined:Gs,DitoScopes:er,DitoTableCell:Pr,DitoTableHead:Dr,DitoTabs:da,DitoTreeItem:mr,DitoVNode:Mr,DitoView:gt},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[K],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,alignBottom:!0,omitPadding:!1,component:C.component,get:te,register(e,t={}){e=c.asArray(e);const o=this.component(`DitoType${c.camelize(e[0],!0)}`,t);for(const s of e)_n(s,o);return o}},qr=["id","type","title"];function Ir(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",e.buttonClass],id:e.dataPath,ref:"element",type:e.type,title:e.text},e.attributes),n.toDisplayString(e.text),17,qr)}const zr=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]},buttonClass(){return this.verb?`dito-button-${this.verb}`:null},text:y("text",{type:String,get(e){return e||c.labelize(this.verb)}}),closeForm:y("closeForm",{type:Boolean,default:!1}),events(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}}},methods:{async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Ie(this.schema)&&await this.submit()}}}),Ar=b(zr,[["render",Ir]]),Ur=["id"];function Hr(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,Ur)),[[n.vModelCheckbox,e.value]])}const Tc="",Wr=D.register("checkbox",{nativeField:!0}),Kr=b(Wr,[["render",Hr]]),Rt={mixins:[Nt],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,d;c.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:i=null}=e;const r=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((d=r.dependencyFunction)==null||d.call(r,this.context),r.resolveCounter>0){const{resolvedData:h}=r;return--r.resolveCounter===0&&(r.resolvedData=null),h}if(r.resolving)a=null;else if(a){if(c.isFunction(a)){const h=a(this.context);c.isFunction(h)?(r.dependencyFunction=a,a=h(this.context)):a=h}c.isPromise(a)&&(r.resolving=!0,this.resolveData(a,s).then(h=>{r.resolveCounter=o,r.resolvedData=h,r.resolving=!1}),a=null)}else i&&(a=c.getValueAtDataPath(this.rootData,c.normalizeDataPath(`${this.dataPath}/${i}`)));return a},async resolveData(e,t={}){this.setLoading(!0,t);let o=null;try{o=await(c.isFunction(e)?e():e)}catch(s){this.addError(s.message||s)}return this.setLoading(!1,t),o}}},he={mixins:[Rt],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=c.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||Bn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=c.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!c.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=c.isFunction(e)?{filter:e}:e;return o?c.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return c.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||$n(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let i=t[a];return i||(i=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(i)),i.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const i of o)if(a){const r=t(i.options,s,null);if(r)return r}else if(s===this.getValueForOption(i))return i};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):c.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const i=(a=e.options)==null?void 0:a.dataPath,r=i?c.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,r,e),r&&s.setSourceRelated(r);const l=d=>d&&{id:d.id};t=c.isArray(t)?t.map(l):l(t)}return t}},Yr=["id"],Jr=["value"];function Qr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},e.attributes),null,16,Jr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,Yr)}const _c="",Gr=D.register("checkboxes",{mixins:[he],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Xr=b(Gr,[["render",Qr]]),Zr=["id"];function vr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,Zr)}const jc="",xr=D.register("code",{mixins:[v],alignBottom:!1,computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Kt(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},i=()=>this.onFocus(),r=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:i,blur:r});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},d=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:d(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),ei=b(xr,[["render",vr]]),ti=["id"],ni={key:0,class:"dito-color-preview dito-inherit-focus"},oi=["disabled"];function si(e,t,o,s,a,i){const r=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=d=>e.showPopup=d),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=d=>e.hexValue=d),type:"input",size:"8"},e.attributes),null,16,ti),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",ni,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...d)=>e.clear&&e.clear(...d),["stop"]))},null,8,oi)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(r,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=d=>e.colorValue=d),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const Mc="",ai=D.register("color",{components:{Trigger:Pe,SketchPicker:Yt.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=ue(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=ue(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=ue(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),ri=b(ai,[["render",si]]);function ii(e,t,o,s,a,i){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const li=D.register("component",{defaultValue:()=>{},alignBottom:!1,ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await se(t)}}),di=b(li,[["render",ii]]),ci=["id","name","value","disabled"];function hi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,ci)}const ui=D.register(["computed","data","hidden"],{mixins:[Rt],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return K.computed.value.get.call(this)},set(e){K.computed.value.set.call(this,e)}}}}),pi=b(ui,[["render",hi]]),mi={class:"dito-date"};function fi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",mi,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=r=>e.dateValue=r),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const gi=D.register(["date","datetime","time"],{components:{DatePicker:kt,TimePicker:$t,DateTimePicker:Wo},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return c.isDate(t)?t.toISOString():t}}),bi=b(gi,[["render",fi]]),W={mixins:[Ot,pt],defaultValue(e){return X(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,unwrappingPrimitives:!1,ignoreRouteChange:!1}},computed:{sourceComponent(){return this},isObjectSource(){return G(this.type)},isListSource(){return X(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:Ce("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},c.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:Ce("total"),columns(){return U(this.schema.columns)},scopes(){return U(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=c.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(Q(this.schema,this.context))},view(){return Ze(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return re(this.schema.buttons)},isCompact(){return this.forms.every(xe)},isInlined(){return we(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&c.isArray(e)||this.isObjectSource&&c.isObject(e)?this.value=e:this.unwrapListData(e)||c.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&c.isObject(e)&&c.isNumber(e.total)&&c.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),i=ke(a,this.resource);i&&this.handleRequest({method:"delete",resource:i},r=>{r||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?c.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&c.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const i=s.getComponentsByDataPath(e);if(i.length>0&&((t==null?void 0:t(i))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o((t==null?void 0:t([l]))??!0)},i=c.parseDataPath(e);for(;i.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(c.normalizeDataPath(i))),{matched:l}=this.$router.match(r);l.length&&(this.$route.path===r?a():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(a)})),i.pop()}o(!1)})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){Je(e,t,o);const d=we(t);if(d&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,u={api:e,schema:t},p={...u,flatten:r,nested:i,param:h},g=await Un(e,t,a);if(l&&await l(g,a+1),I(t)&&!d){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,X(t)&&h),component:C.component(i?"DitoFormNested":"DitoForm"),meta:p};G(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:u});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:r}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Le={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",options:c.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,width:"40%"}:null,text:{type:"text",width:e.operators?"60%":"fill"}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"50%",dateFormat:e},to:{type:"datetime",width:"50%",dateFormat:e}}}};function yi(e,t,o){const s={type:"panel",label:"Filters",name:"$filters",target:t,disabled:!1,data(){return $i(s,o.query)},components:ki(e),buttons:{clear:{text:"Clear",events:{click({schemaComponent:a}){a.resetData(),a.applyFilters()}}},filter:{type:"submit",text:"Filter",events:{click({schemaComponent:a}){a.applyFilters()}}}},methods:{applyFilters(){o.query={...o.query,filter:Ci(this.schema,this.data),page:void 0}}}};return s}function ki(e){var o;const t={};for(const s of Object.values(e||{})){const{filter:a,...i}=s,r=a?(o=Le[a])==null?void 0:o.call(Le,s):s.components;if(r){i.type="form",i.components={};for(const[l,d]of Object.entries(r))if(d){const h=d.label||c.labelize(d.name||l);i.components[l]={...d,label:!1,placeholder:h}}t[s.name]={label:i.label,type:"object",default:()=>({}),form:i,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function qt(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function Ci(e,t){const o=[];for(const s in t){const a=t[s];if(a){const i=Object.keys(qt(e,s)).map(r=>a[r]??null);i.some(r=>r!==null)&&o.push(`${s}:${i.map(JSON.stringify).join(",")}`)}}return o.length?o:void 0}function $i(e,t){const o={};if(t)for(const a of c.asArray(t.filter)){const[,i,r]=a.match(/^(\w+):(.*)$/);try{o[i]=c.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const a in e.components){const i={},r=o[a];if(r){const l=qt(e,a);if(l){let d=0;for(const h in l)i[h]=r[d++]}}s[a]=i}return s}const Bi=["id"],Di={key:0,class:"dito-navigation"},wi={key:1,class:"dito-spacer"},Vi=["id"],Si={key:1},Pi=["innerHTML"],Ei=["innerHTML"],Ni={key:2,class:"dito-cell-edit-buttons"},Oi={key:1},Li=["colspan"];function Fi(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),d=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),u=n.resolveComponent("DitoSchemaInlined"),p=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("DitoDraggable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",Di,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",wi)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(d,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(!1),draggable:e.draggable,"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",Si,[e.isInlined?(n.openBlock(),n.createBlock(u,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,Pi)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,Ei))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",Ni,[n.createVNode(p,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,Vi))),128))]),_:1},8,["modelValue","options","draggable"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Oi,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(p,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,Li)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,Bi)):n.createCommentVNode("",!0)}const Rc="",Ti=D.register("list",{mixins:[W,Oe],alignBottom:!1,getSourceType(e){return e},getPanelSchema(e,t,o){const{filters:s}=e;if(s){const a=()=>o.getComponentByDataPath(t,i=>i.type==="list");return yi(U(s),t,{get query(){var i;return(i=a())==null?void 0:i.query},set query(i){const r=a();if(r){const l=d=>c.pickBy(d,h=>h!==void 0);c.equals(l(i),l(r.query))||(r.query=i,r.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return L(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=Yn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${c.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=L(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([se(t),Ye(t.columns),W.processSchema(e,t,o,s,a,i,r,l)])}}),_i=b(Ti,[["render",Fi]]);function ji(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const qc="",Mi=D.register("label",{excludeValue:!0,generateLabel:!1,alignBottom:!1}),Ri=b(Mi,[["render",ji]]),qi=["id"],Ii=["editor"],zi={key:0,class:"dito-buttons dito-buttons-toolbar"},Ai={class:"dito-button-group"},Ui=["onClick"];function Hi(e,t,o,s,a,i){const r=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",zi,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,d=>(n.openBlock(),n.createElementBlock("div",Ai,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d,({name:h,icon:u,isActive:p,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":p}]),key:h,onClick:g},[n.createVNode(r,{name:u},null,8,["name"])],10,Ui))),128))]))),256))])):n.createCommentVNode("",!0)],8,Ii),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...d)=>e.onDragResize&&e.onDragResize(...d),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,qi)}const Ic="",Wi=D.register("markup",{mixins:[v],components:{EditorContent:x.EditorContent,Icon:Yo},alignBottom:!1,data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return c.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},i=c.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),r=({editor:l})=>{i(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new x.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:r,extensions:this.getExtensions(),content:this.value||""})},beforeUnmount(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},i=this.domOn(document,{mousemove:a,mouseup(r){a(r),i.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:x.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Jt.Document,Qt.Text,an.Paragraph,e.bold&&Gt.Bold,e.italic&&Zt.Italic,e.underline&&en.Underline,e.strike&&xt.Strike,e.small&&Ki,e.code&&Xt.Code,e.link&&Yi,t.blockquote&&tn.Blockquote,t.codeBlock&&nn.CodeBlock,on.HardBreak,t.heading&&sn.Heading.configure({levels:t.heading}),t.horizontalRule&&rn.HorizontalRule,(t.orderedList||t.bulletList)&&cn.ListItem,t.bulletList&&dn.BulletList,t.orderedList&&ln.OrderedList,o.history&&hn.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:i,icon:r,attributes:l,ignoreActive:d,onClick:h})=>{o.push({name:i,icon:r,isActive:this.editor.isActive(i,l)&&(d==null||!d()),onClick:()=>{const u=`toggle${c.camelize(i,!0)}`;this.editor.commands[u]&&(h?h(this.editor,l):(g=>this.editor.chain()[u](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[i,r]of Object.entries(t)){const l=["undo","redo"].includes(i)?"history":i,d=a[l],h=c.underscore(i),u=c.hyphenate(i);if(d){if(r===!0)s({name:h,icon:u});else if(c.isObject(r)){const{attribute:p,values:g,ignoreActive:f,onClick:m}=r;if(p){if(c.isArray(g)&&c.isArray(d))for(const k of g)d.includes(k)&&s({name:h,icon:`${u}-${k}`,attributes:{[p]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:u,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),Ki=x.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Yi=vt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Ji=b(Wi,[["render",Hi]]),Qi=["disabled"];function Gi(e,t,o,s,a,i){const r=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(r,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),class:{"multiselect--show-highlight":e.showHighlight},showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Qi)):n.createCommentVNode("",!0)],2)}const zc="",Xi=D.register("multiselect",{mixins:[he],components:{VueMultiselect:un},data(){return{isMounted:!1,searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return c.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.isMounted=!0,this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||K.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),Zi=b(Xi,[["render",Gi]]),Fe={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){c.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:i}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(i){const r=(`${i}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}};function vi(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["id","modelValue","min","max","step"])}const Ac="",xi=D.register(["number","integer"],{mixins:[Fe],components:{InputField:Z},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),el=b(xi,[["render",vi]]),tl=["id"],nl={key:0,class:"dito-object-content"},ol=["innerHTML"],sl=["innerHTML"];function al(e,t,o,s,a,i){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",nl,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,ol)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,sl))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,tl)):n.createCommentVNode("",!0)}const Uc="",rl=D.register("object",{mixins:[W],alignBottom:!1,getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([se(t),W.processSchema(e,t,o,s,a,i,r,l)])}}),il=b(rl,[["render",al]]),ll=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,alignBottom:!1,omitPadding:!0,getPanelSchema(e){const{name:t,...o}=e;return o}}),dl=["id","value","max"];function cl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,dl)}const hl=D.register("progress",{mixins:[Fe],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),ul=b(hl,[["render",cl]]),pl=["id"],ml=["value"];function fl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},e.attributes),null,16,ml),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,pl)}const Hc="",gl=D.register("radio",{mixins:[he],nativeField:!0}),bl=b(gl,[["render",fl]]);function yl(e,t,o,s,a,i){const r=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(r,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const Wc="",kl=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,alignBottom:!1,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:De},async processSchema(e,t,o,s,a){await Y(e,t,s,a)}}),Cl=b(kl,[["render",yl]]),$l={class:"dito-select"},Bl=["id"],Dl=["label"],wl=["value"],Vl=["value"],Sl=["value"],Pl=["disabled"];function El(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",$l,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.selectedValue=r)},e.attributes,{onMousedown:t[1]||(t[1]=r=>e.populate=!0),onFocus:t[2]||(t[2]=r=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:r[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,wl))),256))],8,Dl)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(r)},n.toDisplayString(e.getLabelForOption(r)),9,Vl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,Sl)):n.createCommentVNode("",!0)],16,Bl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...r)=>e.clear&&e.clear(...r))},null,8,Pl)):n.createCommentVNode("",!0)])}const Kc="",Nl=D.register("select",{mixins:[he],nativeField:!0,data(){return{populate:!0}}}),Ol=b(Nl,[["render",El]]),Ll={class:"dito-slider"},Fl=["id","min","max","step"];function Tl(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",Ll,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,Fl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Yc="",_l=D.register("slider",{mixins:[Fe],components:{InputField:Z},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),jl=b(_l,[["render",Tl]]);function Ml(e,t,o,s,a,i){const r=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Jc="",Rl=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:as},computed:{labels(){return this.schema.labels}}}),ql=b(Rl,[["render",Ml]]);function Il(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:e.inputType},e.attributes),null,16,["id","modelValue","type"])}const zl="****************",Al=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:Z},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?zl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Ul=b(Al,[["render",Il]]),Hl=["id","rows"];function Wl(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,Hl)),[[n.vModelText,e.value]])}const Qc="",Kl=D.register("textarea",{nativeField:!0,textField:!0,alignBottom:!1,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Yl=b(Kl,[["render",Wl]]),Jl={class:"dito-tree-list"},Ql={class:"dito-tree-panel"},Gl={key:0,class:"dito-tree-form-container"};function Xl(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),d=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Jl,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Ql,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",Gl,[n.createVNode(d)])):n.createCommentVNode("",!0)])])}const Gc="",Zl=D.register(["tree-list","tree-object"],{mixins:[W],alignBottom:!1,provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>I(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,i=!0,r=!1,l=null){await Promise.all([Ye(t.properties),W.processSchema(e,t,o,s,a,i,r,(d,h)=>{const{children:u}=t;if(u)return u.type="tree-list",this.processSchema(e,u,u.name,d,h,i,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return Q(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),vl=b(Zl,[["render",Xl]]);function It(e){return mn.filesize(e,{base:10})}const xl={class:"dito-upload"},ed={class:"dito-table dito-table-separators dito-table-background"},td=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),nd=["innerHTML"],od={class:"dito-cell-edit-buttons"},sd={class:"dito-buttons dito-buttons-round"},ad=["onClick"],rd={colspan:4},id={class:"dito-upload-footer"},ld=["value"],dd={class:"dito-buttons dito-buttons-round"};function cd(e,t,o,s,a,i){const r=n.resolveComponent("DitoDraggable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",xl,[n.createElementVNode("table",ed,[td,n.createVNode(r,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=d=>e.files=d),tag:"tbody",options:e.getSortableOptions(!1),draggable:e.draggable},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(d,h)=>(n.openBlock(),n.createElementBlock("tr",{key:d.key},[n.createElementVNode("td",{innerHTML:e.renderFile(d,h)},null,8,nd),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(d.size)),1),n.createElementVNode("td",null,[d.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(d.upload.error),1)],64)):d.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):d.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",od,[n.createElementVNode("div",sd,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(d,h)}),null,16,ad)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options","draggable"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",rd,[n.createElementVNode("div",id,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,ld)):n.createCommentVNode("",!0),n.createElementVNode("div",dd,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(d=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(d=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=d=>e.uploads=d),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const Xc="",hd=D.register("upload",{mixins:[Oe],components:{VueUpload:fn},alignBottom:!1,data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return zt(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return c.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?pn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:It,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:L(this.dataPath,t)})):c.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${It(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=zt(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function zt(e){return e?c.asArray(e):[]}const ud=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:di,DitoTypeButton:Ar,DitoTypeCheckbox:Kr,DitoTypeCheckboxes:Xr,DitoTypeCode:ei,DitoTypeColor:ri,DitoTypeComputed:pi,DitoTypeDate:bi,DitoTypeLabel:Ri,DitoTypeList:_i,DitoTypeMarkup:Ji,DitoTypeMultiselect:Zi,DitoTypeNumber:el,DitoTypeObject:il,DitoTypePanel:ll,DitoTypeProgress:ul,DitoTypeRadio:bl,DitoTypeSection:Cl,DitoTypeSelect:Ol,DitoTypeSlider:jl,DitoTypeSwitch:ql,DitoTypeText:Ul,DitoTypeTextarea:Yl,DitoTypeTreeList:vl,DitoTypeUpload:b(hd,[["render",cd]])},Symbol.toStringTag,{value:"Module"})),At=new Set;function pd(e){At.has(e)||(At.add(e),console.warn(e))}const md=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","close","closed","cancel","cancelled","drag","dragged"].reduce((e,t)=>(e[t]=t,e),{});class fd{constructor(t,{dito:o={},api:s,views:a={},...i}={}){this.el=t,this.api=s=c.merge({base:"/"},o.api,s),this.options=i,s.locale||(s.locale="en-US"),s.formats=c.merge({},c.defaultFormats,s.formats),s.request||(s.request=d=>bd(s,d)),s.getApiUrl||(s.getApiUrl=d=>kd(s,d)),s.isApiUrl||(s.isApiUrl=d=>yd(s,d)),s.normalizePath||(s.normalizePath=s.normalizePaths?c.hyphenate:d=>d),s.denormalizePath||(s.denormalizePath=s.normalizePaths?c.camelize:d=>d),s.defaults||(s.defaults={});const r=T(s.users,{type:"collection"})||{};r.login=T(r.login||"login",{method:"post",parent:r}),r.logout=T(r.logout||"logout",{method:"post",parent:r}),r.session=T(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(d){const h=this[d==null?void 0:d.type]||this.default;return d&&h.call(this,d)},default(d){const h=this.any(d.parent);return h?`${h}/${d.path}`:d.path},collection(d){return this.default(d)},member(d){return`${d.path}/${d.id}`},upload(d){return`${this.collection(d.parent)}/upload/${d.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},c.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Ee,VueNotifications:R,...Rr,...ud},provide:{api:s,$verbs:()=>md,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Ee,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:i})});l.use(R,{name:"notify",componentName:"VueNotifications"}),l.use(O.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:O.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class gd extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function bd(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:i=null,data:r=null}){var h,u;s&&pd("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),d=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...r&&{body:JSON.stringify(r)},headers:{...l&&e.headers,...i},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((u=d.headers.get("Content-Type"))!=null&&u.includes("application/json")&&(d.data=await d.json()),!d.ok)throw new gd(d);return d}function yd(e,t){return!c.isAbsoluteUrl(t)||t.startsWith(e.url)}function kd(e,{url:t,query:o}){c.isAbsoluteUrl(t)||(t=Cd(e.url,t));const s=$d(o);return s?`${t}?${s}`:t}function Cd(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}function $d(e){const t=e?c.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const i of c.asArray(a))o.push([s,i]);return o},[])).toString()}return fd});
6
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVHJlZUl0ZW0udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYmxlSGVhZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVDZWxsLnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQubWpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0RyYWdnYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVk5vZGUudnVlIiwiLi4vc3JjL0RpdG9UeXBlQ29tcG9uZW50LmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQnV0dG9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNoZWNrYm94LnZ1ZSIsIi4uL3NyYy9taXhpbnMvRGF0YU1peGluLmpzIiwiLi4vc3JjL21peGlucy9PcHRpb25zTWl4aW4uanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveGVzLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvZGUudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29sb3IudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29tcG9uZW50LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXB1dGVkLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZURhdGUudnVlIiwiLi4vc3JjL21peGlucy9Tb3VyY2VNaXhpbi5qcyIsIi4uL3NyYy91dGlscy9maWx0ZXIuanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMaXN0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUxhYmVsLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU1hcmt1cC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNdWx0aXNlbGVjdC52dWUiLCIuLi9zcmMvbWl4aW5zL051bWJlck1peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTnVtYmVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU9iamVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQYW5lbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQcm9ncmVzcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVSYWRpby52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWN0aW9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVNlbGVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTbGlkZXIudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU3dpdGNoLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHQudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVGV4dGFyZWEudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVHJlZUxpc3QudnVlIiwiLi4vc3JjL3V0aWxzL3VuaXRzLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVXBsb2FkLnZ1ZSIsIi4uL3NyYy91dGlscy9kZXByZWNhdGUuanMiLCIuLi9zcmMvdmVyYnMuanMiLCIuLi9zcmMvRGl0b0FkbWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCByZWFjdGl2ZSh7XG4gIHRpdGxlOiAnJyxcbiAgcm91dGVDb21wb25lbnRzOiBbXSxcbiAgdXNlcjogbnVsbCxcbiAgbG9hZENhY2hlOiB7fSwgLy8gU2VlIFR5cGVNaXhpbi5sb2FkKClcbiAgYWN0aXZlTGFiZWw6IG51bGwsXG4gIGNsaXBib2FyZERhdGE6IG51bGxcbn0pXG4iLCJpbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCB0b2tlbikge1xuICByZXR1cm4gZGF0YVBhdGhcbiAgICA/IGAke2RhdGFQYXRofS8ke3Rva2VufWBcbiAgICA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICBwYXRoPy5wb3AoKVxuICByZXR1cm4gcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBuZXN0ZWQgPyBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSA6IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgaWYgKHBhdGgpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCB0b2tlbi4gSWYgaXQncyBhIG51bWJlciwgdGhlbiB3ZSdyZSBkZWFsaW5nIHdpdGggYW5cbiAgICAvLyBhcnJheSBhbmQgbmVlZCB0byByZW1vdmUgbW9yZSB0b2tlbnMgdW50aWwgd2UgbWVldCB0aGUgYWN0dWFsIHBhcmVudDpcbiAgICBsZXQgdG9rZW5cbiAgICBkbyB7XG4gICAgICB0b2tlbiA9IHBhdGgucG9wKClcbiAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIGlzSW50ZWdlcigrdG9rZW4pKVxuICAgIC8vIElmIHRoZSByZW1vdmVkIHRva2VuIGlzIHZhbGlkLCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGF0YTpcbiAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtKHJvb3RJdGVtLCBkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIHJldHVybiBwYXRoID8gZ2V0VmFsdWVBdERhdGFQYXRoKHJvb3RJdGVtLCBwYXRoKSA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICByZXR1cm4gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhOYW1lKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0TGFzdERhdGFQYXRoVG9rZW4oZGF0YVBhdGgpXG4gIHJldHVybiB0b2tlbiA9PSBudWxsIHx8IGlzSW50ZWdlcigrdG9rZW4pID8gbnVsbCA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhJbmRleChkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICBjb25zdCBpbmRleCA9IHRva2VuID09IG51bGwgPyBudWxsIDogK3Rva2VuXG4gIHJldHVybiBpc0ludGVnZXIoaW5kZXgpID8gaW5kZXggOiBudWxsXG59XG5cbmxldCB0ZW1wb3JhcnlJZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBzZXRUZW1wb3JhcnlJZChkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGlkcyBhcmUgbWFya2VkIHdpdGggYSAnQCcgYXQgdGhlIGJlZ2lubmluZy5cbiAgZGF0YVtpZEtleV0gPSBgQCR7Kyt0ZW1wb3JhcnlJZH1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBvcmFyeUlkKGlkKSB7XG4gIHJldHVybiAvXkAvLnRlc3QoaWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZmVyZW5jZShkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFuIG9iamVjdCB0aGF0IGhvbGRzIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGlkLlxuICByZXR1cm4gZGF0YT8uW2lkS2V5XSAhPSBudWxsICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMVxufVxuIiwiaW1wb3J0IHsgdG9SYXcgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7XG4gIGdldEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbURhdGFQYXRoLFxuICBnZXRQYXJlbnRJdGVtLFxuICBnZXRJdGVtLFxuICBnZXRMYXN0RGF0YVBhdGhOYW1lLFxuICBnZXRMYXN0RGF0YVBhdGhJbmRleFxufSBmcm9tICcuL3V0aWxzL2RhdGEuanMnXG5cbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGVcblxuLy8gYERpdG9Db250ZXh0YCBpbnN0YW5jZXMgYXJlIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCByYXcgYGNvbnRleHRgIG9iamVjdHMsXG4vLyB3aGljaCB0aGVtc2VsdmVzIGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgbGlua2VkIGBjb21wb25lbnRgIGluc3RhbmNlLCBzb1xuLy8gdGhhdCB0aGV5IG9ubHkgbmVlZCB0byBwcm92aWRlIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZGlmZmVyZW50IHRoYW5cbi8vIGluIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudC4gSW4gb3JkZXIgdG8gbm90IGV4cG9zZSBhbGwgZmllbGRzIGZyb20gdGhlXG4vLyBjb21wb25lbnQsIHRoZSB3cmFwcGVyIGlzIGludHJvZHVjZWQ6XG4vLyBVc2UgV2Vha01hcCBmb3IgdGhlIHJhdyBgY29udGV4dGAgb2JqZWN0cywgc28gd2UgZG9uJ3QgaGF2ZSB0byBwb2xsdXRlIHRoZVxuLy8gYWN0dWFsIGBEaXRvQ29udGV4dGAgaW5zdGFuY2Ugd2l0aCBpdC5cbmNvbnN0IGNvbnRleHRzID0gbmV3IFdlYWtNYXAoKVxuXG5mdW5jdGlvbiBnZXQoY29udGV4dCwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3Qgb2JqZWN0ID0gY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVxuICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldXG4gIC8vIElmIGBvYmplY3RgIGV4cGxpY2l0bHkgc2V0cyB0aGUga2V5IHRvIGB1bmRlZmluZWRgLCByZXR1cm4gaXQuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgICA/IGRlZmF1bHRWYWx1ZSgpXG4gICAgICA6IGRlZmF1bHRWYWx1ZVxufVxuXG5mdW5jdGlvbiBzZXQoY29udGV4dCwga2V5LCB2YWx1ZSkge1xuICBjb250ZXh0cy5nZXQodG9SYXcoY29udGV4dCkpW2tleV0gPSB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCwgY29udGV4dCkge1xuICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyYW1zIG9iamVjdCAvIGZ1bmN0aW9uLCBvciBjcmVhdGUgYSBuZXcgb25lOlxuICAgIGNvbnRleHQgPSBjb250ZXh0XG4gICAgICA/IGlzRnVuY3Rpb24oY29udGV4dClcbiAgICAgICAgPyBjb250ZXh0KClcbiAgICAgICAgOiB7IC4uLmNvbnRleHQgfVxuICAgICAgOiB7fVxuICAgIC8vIElmIG5vdCBleHBsaWNpdGx5IHNldCAodG8gZmFsc2UpLCBkZWZhdWx0IHRvIHRydWUgc28gd2UgZG9uJ3QgZmFsbCBiYWNrXG4gICAgLy8gdG8gYGNvbXBvbmVudGAgZm9yIGl0cyB2YWx1ZS5cbiAgICBjb250ZXh0Lm5lc3RlZCA/Pz0gdHJ1ZVxuICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50XG4gICAgLy8gSGF2ZSBgb2JqZWN0YCBpbmhlcml0IGZyb20gdGhlIGBjb21wb25lbnRgIGluc3RhbmNlLCBzbyBpdCBjYW4gb3ZlcnJpZGVcbiAgICAvLyBpdHMgdmFsdWVzIGFuZCBzdGlsbCByZXRyaWV2ZSBmcm9tIGl0LCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYHRoaXNgXG4gICAgLy8gdGhyb3VnaCBgY29udGV4dHNgIG1hcDpcbiAgICBjb25zdCBvYmplY3QgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoY29udGV4dCwgY29tcG9uZW50KVxuICAgIC8vIE5vIG5lZWQgZm9yIGB0b1Jhdyh0aGlzKWAgaGVyZSBhcyBpdCdzIGFsd2F5cyByYXcgaW5zaWRlIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb250ZXh0cy5zZXQodGhpcywgb2JqZWN0KVxuICB9XG5cbiAgc3RhdGljIGdldChjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIERpdG9Db250ZXh0XG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogbmV3IERpdG9Db250ZXh0KGNvbXBvbmVudCwgY29udGV4dClcbiAgfVxuXG4gIC8vIGBuZXN0ZWRgIGlzIGB0cnVlYCB3aGVuIHRoZSBkYXRhLXBhdGggcG9pbnRzIGEgdmFsdWUgaW5zaWRlIGFuIGl0ZW0sIGFuZFxuICAvLyBgZmFsc2VgIHdoZW4gaXQgcG9pbnRzIHRvIHRoZSBpdGVtIGl0c2VsZi5cbiAgZ2V0IG5lc3RlZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduZXN0ZWQnLCB0cnVlKVxuICB9XG5cbiAgZ2V0IHNjaGVtYSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZhbHVlJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IGRhdGFQYXRoKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RhdGFQYXRoJywgJycpXG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduYW1lJywgKCkgPT4gZ2V0TGFzdERhdGFQYXRoTmFtZSh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpbmRleCcsICgpID0+IGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuZGF0YVBhdGgpKVxuICB9XG5cbiAgZ2V0IGl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0UGFyZW50SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IGl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5pdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgcGFyZW50SXRlbUluZGV4KCkge1xuICAgIHJldHVybiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLnBhcmVudEl0ZW1EYXRhUGF0aClcbiAgfVxuXG4gIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAvLyBJZiBgZGF0YWAgaXNuJ3QgcHJvdmlkZWQsIHdlIGNhbiBkZXRlcm1pbmUgaXQgZnJvbSByb290RGF0YSAmIGRhdGFQYXRoOlxuICBnZXQgaXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhJywgKCkgPT5cbiAgICAgIGdldEl0ZW0odGhpcy5yb290SXRlbSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgKVxuICB9XG5cbiAgLy8gTk9URTogYHBhcmVudEl0ZW1gIGlzbid0IHRoZSBjbG9zZXN0IGRhdGEgcGFyZW50IHRvIGBpdGVtYCwgaXQncyB0aGVcbiAgLy8gY2xvc2VzdCBwYXJlbnQgdGhhdCBpc24ndCBhbiBhcnJheSwgZS5nLiBmb3IgcmVsYXRpb25zIG9yIG5lc3RlZCBKU09OIGRhdGEuXG4gIC8vIFRoaXMgaXMgd2h5IHRoZSB0ZXJtIGBpdGVtYCB3YXMgY2hvc2VuIG92ZXIgYGRhdGFgLCBlLmcuIFZTIHRoZSB1c2Ugb2ZcbiAgLy8gYHBhcmVudERhdGFgIGluIHNlcnZlci1zaWRlZCB2YWxpZGF0aW9uLCB3aGljaCBpcyB0aGUgY2xvc2VzdCBwYXJlbnQuIElmXG4gIC8vIG5lZWRlZCwgd2UgY291bGQgZXhwb3NlIHRoaXMgZGF0YSBoZXJlIHRvbywgYXMgd2UgY2FuIGRvIGFsbCBzb3J0cyBvZiBkYXRhXG4gIC8vIHByb2Nlc3Npbmcgd2l0aCBgcm9vdERhdGFgIGFuZCBgZGF0YVBhdGhgLlxuICBnZXQgcGFyZW50SXRlbSgpIHtcbiAgICBjb25zdCBpdGVtID0gKFxuICAgICAgZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZCkgfHxcbiAgICAgIG51bGxcbiAgICApXG4gICAgcmV0dXJuIGl0ZW0gIT09IHRoaXMuaXRlbSA/IGl0ZW0gOiBudWxsXG4gIH1cblxuICBnZXQgcm9vdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncm9vdERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvY2Vzc2VkRGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjbGlwYm9hcmREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3VzZXInLCBudWxsKVxuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdhcGknLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdzKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdzJywgbnVsbClcbiAgfVxuXG4gIGdldCBpdGVtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaXRlbUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZm9ybUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIC8vIE5PVEU6IExpa2UgJ29wdGlvbnMnLCB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgZG9lc24ndCBhbHdheXMgZXhpc3QsIGUuZy5cbiAgLy8gaW4gbmVzdGVkIGZvcm1zIGR1cmluZyBgcHJvY2Vzc0RhdGEoKWAuIEJ1dCBgc2NoZW1hYCBpcyBndWFyYW50ZWVkIHRvXG4gIC8vIGFsd2F5cyBiZSBhdmFpbGFibGUuXG4gIGdldCBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnY29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBgY29tcG9uZW50U2NoZW1hYCBnZXR0ZXIgZm9yIHRoZSBzY2hlbWEgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LFxuICAvLyBldmVuIHdoZW4gdGhlIGNvbXBvbmVudCBpc24ndCBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIENvbnNpZGVyIGFkZGluZ1xuICAvLyBgc291cmNlU2NoZW1hYCBhcyB3ZWxsP1xuXG4gIC8vIFRPRE86IEZpeCB1bmNsZWFyIG5hbWluZzogV2hpY2ggc2NoZW1hIGlzIHRoaXMsIHRoYXQgb2YgdGhlIGNvbXBvbmVudCBvciBvZlxuICAvLyBpdHMgcGFyZW50PyBJc24ndCBleHBvc2luZyBgZm9ybUNvbXBvbmVudGAgYW5kIGB2aWV3Q29tcG9uZW50YCBlbm91Z2gsIG9uY2VcbiAgLy8gd2Ugb2ZmZXIgYWNjZXNzIHRvIHRoZWlyIGNvbXBvbmVudHMgdGhlcmUgdGhyb3VnaCBgZ2V0Q29tcG9uZW50KClgICYgY28uIG9uXG4gIC8vIGBEaXRvTWl4aW5gIHBlcmhhcHM/ICBBbHNvLCB0aGVyZSBjb3VsZCBiZSBhIGB0YWJDb21wb25lbnRgIGdldHRlciBmb3JcbiAgLy8gc2NoZW1hcyBpbiB0YWJzP1xuICBnZXQgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NjaGVtYUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCB2aWV3Q29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkaWFsb2dDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHBhbmVsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3BhbmVsQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBXaGVuIHVzZWQgaW4gT3B0aW9uc01peGluIGZvciBgc2NoZW1hLm9wdGlvbnMudmFsdWUoKWAsXG4gIC8vIGBzY2hlbWEub3B0aW9ucy5sYWJlbCgpYCBhbmQgIGBzY2hlbWEuc2VhcmNoLmZpbHRlcigpYCBjYWxsYmFja3M6XG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9uJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9ucycsIHVuZGVmaW5lZClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbmFtZSB0aGlzIHRvIGBzZWFyY2hUZXJtYCBvciBgc2VhcmNoUXVlcnlgLCB0byBwZXJoYXBzIGZyZWUgYHF1ZXJ5YFxuICAvLyBmb3IgdGhlIGFjdHVhbCBgcmVzb3VyY2VDb21wb25lbnQucXVlcnlgIG9iamVjdD9cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3F1ZXJ5JywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSBjb250ZXh0IG9mIGJ1dHRvbnMgdGhhdCBzZW5kXG4gIC8vIHJlcXVlc3RzLCBzZWUgYFJlc291cmNlTWl4aW4uZW1pdEJ1dHRvbkV2ZW50KClgOlxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3InLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgd2FzTm90aWZpZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnd2FzTm90aWZpZWQnLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZHVyaW5nIGV2ZW50IGhhbmRsZXIgZm9yICcke2V2ZW50fSc6YCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcXVldWUgZm9yIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IGNvbXBsZXRlZCBieSB0aGUgd3JhcHBlciB0aGF0IGNhbGxlZCBgbmV4dCgpYFxuICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2goeyBhcmdzLCByZXNvbHZlIH0pXG4gICAgICAgICAgLy8gRm9yIG5ldyBxdWV1ZXMgKD0gb25seSBvbmUgZW50cnkpIGVtaXQgdGhlIGZpcnN0IGV2ZW50IGltbWVkaWF0ZWx5LFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgcXVldWUgcnVubmluZy5cbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZTpcbiAgICBoYXNMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVycyhldikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQubGVuZ3RoID4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZWdhdGUoZXZlbnQsIHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlKGV2LCB0YXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB0YXJnZXQuZW1pdChldmVudCwgLi4uYXJncykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgcGlja0J5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRSZXNvdXJjZShzY2hlbWEucmVzb3VyY2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZSwgZGVmYXVsdHMgPSB7fSkge1xuICBjb25zdCB7IHBhcmVudCwgLi4uZGVmcyB9ID0gZGVmYXVsdHNcbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgYXNBcnJheSxcbiAgZXF1YWxzLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBoeXBoZW5hdGUsXG4gIGZvcm1hdFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IGFwcFN0YXRlIGZyb20gJy4uL2FwcFN0YXRlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IEVtaXR0ZXJNaXhpbiBmcm9tICcuL0VtaXR0ZXJNaXhpbi5qcydcbmltcG9ydCB7IGlzTWF0Y2hpbmdUeXBlLCBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtFbWl0dGVyTWl4aW5dLFxuXG4gIGluamVjdDogW1xuICAgICdhcGknLFxuICAgICckdmVyYnMnLFxuICAgICckdmlld3MnLFxuICAgICckaXNQb3B1bGF0ZWQnLFxuICAgICckcGFyZW50Q29tcG9uZW50JyxcbiAgICAnJHNjaGVtYUNvbXBvbmVudCcsXG4gICAgJyRyb3V0ZUNvbXBvbmVudCcsXG4gICAgJyRkYXRhQ29tcG9uZW50JyxcbiAgICAnJHNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRyZXNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRkaWFsb2dDb21wb25lbnQnLFxuICAgICckcGFuZWxDb21wb25lbnQnLFxuICAgICckdGFiQ29tcG9uZW50J1xuICBdLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhXG4gICAgICA/IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgb3ZlcnJpZGVzOiBudWxsIC8vIFNlZSBhY2Nlc3Nvci5qc1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBSZXNvdXJjZU1peGluLCB1c2VkIGJ5IGxpc3RzLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNvdXJjZVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGE/LnNjaGVtYVxuICAgIH0sXG5cbiAgICB1c2VyKCkge1xuICAgICAgcmV0dXJuIGFwcFN0YXRlLnVzZXJcbiAgICB9LFxuXG4gICAgLy8gJHZlcmJzLCAkdmVyYnMgYW5kICRpc1BvcHVsYXRlZCBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlXG4gICAgLy8gcmVhY3RpdmVuZXNzIGFjcm9zcyBwcm92aWRlL2luamVjdC5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgIHZlcmJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHZlcmJzKClcbiAgICB9LFxuXG4gICAgdmlld3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmlld3MoKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudFJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5yb3V0ZUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBwYXJlbnRGb3JtQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LmZvcm1Db21wb25lbnRcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzXG4gICAgLy8gdGhhdCBsb2FkcyBpdHMgb3duIGRhdGEgZnJvbSBhbiBhc3NvY2lhdGVkIEFQSSByZXNvdXJjZS5cbiAgICByb290RGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFDb21wb25lbnQ/LmRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVpZFxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIC8vIFRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGlzIG9ubHkgYXZhaWxhYmxlIGR1cmluZyB0aGUgbGlmZS1jeWNsZSBvZiBhXG4gICAgLy8gY29tcG9uZW50LiBTb21lIGluZm9ybWF0aW9uIHdlIG5lZWQgYXZhaWxhYmxlIGxvbmdlciB0aGFuIHRoYXQsIGUuZy5cbiAgICAvLyBgcXVlcnlgICYgYHRvdGFsYCBvbiBUeXBlTGlzdCwgc28gdGhhdCB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIGZyb21cbiAgICAvLyBlZGl0aW5nIGFuIGl0ZW0gaW4gdGhlIGxpc3QsIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdCBpcyBzdGlsbCB0aGUgc2FtZS5cbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGlzIGluIGBkYXRhYCwgYXMgdGhpcyBpcyBhbHJlYWR5IHRoZSBwdXJlIGRhdGEgZnJvbSB0aGVcbiAgICAvLyBBUEkgc2VydmVyLiBUaGF0J3Mgd2hhdCB0aGUgYHN0b3JlYCBpcyBmb3I6IE1lbW9yeSB0aGF0J3MgYXZhaWxhYmxlIGFzXG4gICAgLy8gbG9uZyBhcyB0aGUgY3VycmVudCBlZGl0aW5nIHBhdGggaXMgc3RpbGwgdmFsaWQuIEZvciB0eXBlIGNvbXBvbmVudHMsXG4gICAgLy8gdGhpcyBtZW1vcnkgaXMgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCwgc2VlIFJvdXRlTWl4aW4gYW5kIERpdG9QYW5lLlxuICAgIGdldFN0b3JlKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XVxuICAgIH0sXG5cbiAgICBzZXRTdG9yZShrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLnN0b3JlW2tleV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcblxuICAgIGdldENoaWxkU3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZShrZXkpIHx8IHRoaXMuc2V0U3RvcmUoa2V5LCByZWFjdGl2ZSh7fSkpXG4gICAgfSxcblxuICAgIGdldFNjaGVtYVZhbHVlKFxuICAgICAga2V5T3JEYXRhUGF0aCxcbiAgICAgIHsgdHlwZSwgZGVmYXVsdDogZGVmLCBzY2hlbWEgPSB0aGlzLnNjaGVtYSwgY2FsbGJhY2sgPSB0cnVlIH0gPSB7fVxuICAgICkge1xuICAgICAgY29uc3QgdHlwZXMgPSB0eXBlICYmIGFzQXJyYXkodHlwZSlcbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBkYXRhLXBhdGhzIGluIGBrZXlPckRhdGFQYXRoYCBjYW4gb25seSBiZVxuICAgICAgLy8gcHJvdmlkZWQgaW4gaW4gYXJyYXkgZm9ybWF0IGhlcmU6XG4gICAgICBsZXQgdmFsdWUgPSBzY2hlbWFcbiAgICAgICAgPyBpc0FycmF5KGtleU9yRGF0YVBhdGgpXG4gICAgICAgICAgPyBnZXRWYWx1ZUF0RGF0YVBhdGgoc2NoZW1hLCBrZXlPckRhdGFQYXRoLCAoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgOiBzY2hlbWFba2V5T3JEYXRhUGF0aF1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oZGVmKSAmJiAhaXNNYXRjaGluZ1R5cGUodHlwZXMsIGRlZikpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9ucyBmb3IgYW55IHR5cGUgZXhjZXB0IGBGdW5jdGlvbmA6XG4gICAgICAgICAgZGVmID0gZGVmLmNhbGwodGhpcylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmXG4gICAgICB9XG5cbiAgICAgIGlmIChpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuICAgICAgLy8gQW55IHNjaGVtYSB2YWx1ZSBoYW5kbGVkIHRocm91Z2ggYGdldFNjaGVtYVZhbHVlKClgIGNhbiBwcm92aWRlXG4gICAgICAvLyBhIGZ1bmN0aW9uIHRoYXQncyByZXNvbHZlZCB3aGVuIHRoZSB2YWx1ZSBpcyBldmFsdWF0ZWQ6XG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSh0aGlzLmNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyBOb3cgZmluYWxseSBzZWUgaWYgd2UgY2FuIGNvbnZlcnQgdG8gdGhlIGV4cGVjdCB0eXBlcy5cbiAgICAgIGlmICh0eXBlcyAmJiB2YWx1ZSAhPSBudWxsICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKVxuICAgICAgICAgIGlmIChjb252ZXJ0ZWQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0TGFiZWwoc2NoZW1hLCBuYW1lKSB7XG4gICAgICByZXR1cm4gc2NoZW1hXG4gICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgnbGFiZWwnLCB7IHR5cGU6IFN0cmluZywgc2NoZW1hIH0pIHx8XG4gICAgICAgICAgbGFiZWxpemUobmFtZSB8fCBzY2hlbWEubmFtZSlcbiAgICAgICAgOiBsYWJlbGl6ZShuYW1lKSB8fCAnJ1xuICAgIH0sXG5cbiAgICBsYWJlbGl6ZSxcblxuICAgIGdldEJ1dHRvbkF0dHJpYnV0ZXMobmFtZSwgYnV0dG9uKSB7XG4gICAgICBjb25zdCB2ZXJiID0gdGhpcy52ZXJic1tuYW1lXSB8fCBuYW1lXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzczogYGRpdG8tYnV0dG9uLSR7dmVyYn1gLFxuICAgICAgICB0aXRsZTogYnV0dG9uPy50ZXh0IHx8IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCdpZicsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzaG91bGRTaG93KHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCd2aXNpYmxlJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBzY2hlbWFcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNob3VsZERpc2FibGUoc2NoZW1hID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2Rpc2FibGVkJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpIHtcbiAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAvLyBSZXNvdXJjZXMgd2l0aG91dCBhIHBhcmVudCBpbmhlcml0IHRoZSBvbmUgZnJvbSBgZGF0YUNvbXBvbmVudGBcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkuXG4gICAgICBpZiAocmVzb3VyY2UucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gdGhpcy5kYXRhQ29tcG9uZW50Py5yZXNvdXJjZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJlc291cmNlcy5hbnkoZ2V0UmVzb3VyY2UocmVzb3VyY2UpKVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVVybChyZXNvdXJjZSkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpXG4gICAgICByZXR1cm4gdXJsID8gdGhpcy5hcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeTogcmVzb3VyY2UucXVlcnkgfSkgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIHJlc291cmNlLCBxdWVyeSwgZGF0YSwgaW50ZXJuYWwgfSkge1xuICAgICAgdXJsIHx8PSB0aGlzLmdldFJlc291cmNlUGF0aChyZXNvdXJjZSlcbiAgICAgIG1ldGhvZCB8fD0gcmVzb3VyY2U/Lm1ldGhvZFxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gIWludGVybmFsICYmIHRoaXMuYXBpLmlzQXBpVXJsKHVybClcbiAgICAgIGlmIChjaGVja1VzZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmVuc3VyZVVzZXIoKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaS5yZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIGRhdGEsIHF1ZXJ5IH0pXG4gICAgICAvLyBEZXRlY3QgY2hhbmdlIG9mIHRoZSBvd24gdXNlciwgYW5kIGZldGNoIGl0IGFnYWluIGlmIGl0IHdhcyBjaGFuZ2VkLlxuICAgICAgaWYgKFxuICAgICAgICBjaGVja1VzZXIgJiZcbiAgICAgICAgbWV0aG9kID09PSAncGF0Y2gnICYmXG4gICAgICAgIGVxdWFscyhyZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy51c2VyLmlkLCB0aGlzLmFwaS51c2VycykpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmZldGNoVXNlcigpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGJ1dHRvbnMsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNldHRpbmdzXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICByZXF1ZXN0KHsgY2FjaGUsIC4uLm9wdGlvbnMgfSkge1xuICAgICAgLy8gQWxsb3cgY2FjaGluZyBvZiBsb2FkZWQgZGF0YSBvbiB0d28gbGV2ZWxzOlxuICAgICAgLy8gLSAnZ2xvYmFsJzogY2FjaGUgZ2xvYmFsbHksIGZvciB0aGUgZW50aXJlIGFkbWluIHNlc3Npb25cbiAgICAgIC8vIC0gJ2xvY2FsJzogY2FjaGUgbG9jYWxseSB3aXRoaW4gdGhlIGNsb3Nlc3Qgcm91dGUgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgIC8vICAgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGFuZCBsb2FkcyBpdHMgb3duIGRhdGEuXG4gICAgICBjb25zdCBjYWNoZVBhcmVudCA9IChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbDogdGhpcy5hcHBTdGF0ZSxcbiAgICAgICAgICBsb2NhbDogdGhpcy5kYXRhQ29tcG9uZW50XG4gICAgICAgIH1bY2FjaGVdXG4gICAgICApXG4gICAgICBjb25zdCBsb2FkQ2FjaGUgPSBjYWNoZVBhcmVudD8ubG9hZENhY2hlXG4gICAgICAvLyBCdWlsZCBhIGNhY2hlIGtleSBmcm9tIHRoZSBjb25maWc6XG4gICAgICBjb25zdCBjYWNoZUtleSA9IChcbiAgICAgICAgbG9hZENhY2hlICYmXG4gICAgICAgIGAke1xuICAgICAgICAgIG9wdGlvbnMubWV0aG9kIHx8ICdnZXQnXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBvcHRpb25zLnVybFxuICAgICAgICB9ICR7XG4gICAgICAgICAgLy8gVE9ETzogYHJlcXVlc3QucGFyYW1zYCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYHF1ZXJ5YCBvblxuICAgICAgICAgIC8vIDIwMjItMTEtMDEsIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5xdWVyeSB8fCBvcHRpb25zLnBhcmFtcyB8fCAnJylcbiAgICAgICAgfSAke1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSB8fCAnJylcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICAgIGlmIChsb2FkQ2FjaGUgJiYgKGNhY2hlS2V5IGluIGxvYWRDYWNoZSkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRDYWNoZVtjYWNoZUtleV1cbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IE5vIGF3YWl0IGhlcmUsIHJlcyBpcyBhIHByb21pc2UgdGhhdCB3ZSBjYW4gZWFzaWx5IGNhY2hlLlxuICAgICAgLy8gVGhhdCdzIGZpbmUgYmVjYXVzZSBwcm9taXNlcyBjYW4gYmUgcmVzb2x2ZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi5cbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuZGF0YSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGF4aW9zIGVycm9ycyB0byBub3JtYWwgZXJyb3JzXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGVycm9yLnJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgdGhyb3cgZGF0YVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UpLCBkYXRhKVxuICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICB9KVxuICAgICAgaWYgKGxvYWRDYWNoZSkge1xuICAgICAgICBsb2FkQ2FjaGVbY2FjaGVLZXldID0gcmVzXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfSxcblxuICAgIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgbG9jYWxlID0gdGhpcy5hcGkubG9jYWxlLFxuICAgICAgZGVmYXVsdHMgPSB0aGlzLmFwaS5mb3JtYXRzLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBuYXZpZ2F0ZShsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlci5wdXNoKGxvY2F0aW9uKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZChvcHRpb25zID0ge30pIHtcbiAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0geyB1cmw6IG9wdGlvbnMgfVxuICAgICAgfVxuICAgICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDk5MTcwNjYvMTE2MzcwOFxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgYS5ocmVmID0gdGhpcy5hcGkuZ2V0QXBpVXJsKG9wdGlvbnMpXG4gICAgICBhLmRvd25sb2FkID0gb3B0aW9ucy5maWxlbmFtZSA/PyBudWxsXG4gICAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgICBib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9LFxuXG4gICAgbm90aWZ5KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50LmNsb3NlTm90aWZpY2F0aW9ucygpXG4gICAgfSxcblxuICAgIHNldHVwU2NoZW1hRmllbGRzKCkge1xuICAgICAgdGhpcy5zZXR1cE1ldGhvZHMoKVxuICAgICAgdGhpcy5zZXR1cENvbXB1dGVkKClcbiAgICAgIHRoaXMuc2V0dXBFdmVudHMoKVxuICAgIH0sXG5cbiAgICBzZXR1cE1ldGhvZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5tZXRob2RzIHx8IHt9KSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgbWV0aG9kIGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwQ29tcHV0ZWQoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5jb21wdXRlZCB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgICAgICAgID8geyBnZXQ6IHZhbHVlIH1cbiAgICAgICAgICA6IGlzT2JqZWN0KHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmdldClcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoYWNjZXNzb3IpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBhY2Nlc3NvcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgY29tcHV0ZWQgcHJvcGVydHkgZGVmaW5pdGlvbjogJHtrZXl9OiAke3ZhbHVlfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0dXBFdmVudHMoKSB7XG4gICAgICBjb25zdCB7IHdhdGNoLCBldmVudHMgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAod2F0Y2gpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpc0Z1bmN0aW9uKHdhdGNoKSA/IHdhdGNoLmNhbGwodGhpcykgOiB3YXRjaFxuICAgICAgICBpZiAoaXNPYmplY3QoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgd2F0Y2ggaGFuZGxlcnMgaW4gdGhlIG5leHQgdGljaywgc28gYWxsIGNvbXBvbmVudHMgYXJlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBjaGVjayBhZ2FpbnN0IHRoZWlyIG5hbWVzLlxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgcHJvcGVydHkgbmFtZXMgdG8gJ2RhdGEucHJvcGVydHknOlxuICAgICAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlOYW1lKGtleSlcbiAgICAgICAgICAgICAgICA/IGBkYXRhLiR7a2V5fWBcbiAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICB0aGlzLiR3YXRjaChleHByLCBjYWxsYmFjaylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZEV2ZW50ID0gKGtleSwgZXZlbnQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgIHRoaXMub24oaHlwaGVuYXRlKGV2ZW50KSwgY2FsbGJhY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBldmVudCBkZWZpbml0aW9uOiAke2tleX06ICR7Y2FsbGJhY2t9YClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgICBhZGRFdmVudChrZXksIGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc2NhbiBzY2hlbWEgZm9yIGBvbltBLVpdYC1zdHlsZSBjYWxsYmFja3MgYW5kIGFkZCB0aGVtXG4gICAgICAvLyBUT0RPOiBEZXByZWNhdGUgb25lIGZvcm1hdCBvciB0aGUgb3RoZXIsIGluIGZhdm91ciBvZiBvbmx5IG9uZSB3YXkgb2ZcbiAgICAgIC8vIGRvaW5nIHRoaW5ncy4gRGVjaWRlIHdoaWNoIG9uZSB0byByZW1vdmUuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYSkpIHtcbiAgICAgICAgaWYgKC9eb25bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXkuc2xpY2UoMiksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRFdmVudChldmVudCwge1xuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBwYXJlbnQgPSBudWxsXG4gICAgfSA9IHt9KSB7XG4gICAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGNvbnN0IHBhcmVudEhhc0xpc3RlbmVycyA9IHBhcmVudD8uaGFzTGlzdGVuZXJzKGV2ZW50KVxuICAgICAgaWYgKGhhc0xpc3RlbmVycyB8fCBwYXJlbnRIYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gVGhlIGVmZmVjdHMgb2Ygc29tZSBldmVudHMgbmVlZCBzb21lIHRpbWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggVnVlLlxuICAgICAgICAvLyBVc2UgJG5leHRUaWNrKCkgdG8gbWFrZSBzdXJlIG91ciBoYW5kbGVycyBzZWUgdGhlc2UgY2hhbmdlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9jZXNzZWRJdGVtYCBpcyBvbmx5IGNvcnJlY3QgYWZ0ZXIgY29tcG9uZW50cyB0aGF0XG4gICAgICAgIC8vIGFyZSBuZXdseSByZW5kZXJlZCBkdWUgdG8gZGF0YSBjaGFuZ2VzIGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzLlxuICAgICAgICBpZiAoWydsb2FkJywgJ2NoYW5nZSddLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuJG5leHRUaWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PiAoY29udGV4dCA9IERpdG9Db250ZXh0LmdldCh0aGlzLCBjb250ZXh0KSlcbiAgICAgICAgY29uc3QgcmVzID0gaGFzTGlzdGVuZXJzXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmVtaXQoZXZlbnQsIGdldENvbnRleHQoKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAvLyBEb24ndCBidWJibGUgdG8gcGFyZW50IGlmIGhhbmRsZWQgZXZlbnQgcmV0dXJuZWQgYGZhbHNlYFxuICAgICAgICBpZiAocGFyZW50SGFzTGlzdGVuZXJzICYmIHJlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXJlbnQuZW1pdChldmVudCwgZ2V0Q29udGV4dCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudC5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9XG4gIH1cbn1cblxubGV0IG5leHRVaWQgPSAwXG4iLCJpbXBvcnQgeyBpc0NyZWRpdENhcmQgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgY3JlZGl0Y2FyZCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzQ3JlZGl0Q2FyZCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBpbnZhbGlkJ1xufVxuIiwiZXhwb3J0IGNvbnN0IGRlY2ltYWxzID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBkZWNpbWFscykgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gZGVjaW1hbHMgPT09ICcqJyA/ICcrJyA6IGB7MSwke2RlY2ltYWxzfX1gXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bLStdP1xcXFxkKihcXFxcLlxcXFxkJHttYXRjaH0pPyRgKS50ZXN0KHZhbHVlKVxuICB9LFxuXG4gIG1lc3NhZ2U6ICh2YWx1ZSwgZGVjaW1hbHMpID0+XG4gICAgYG11c3QgYmUgbnVtZXJpYyBhbmQgbWF5IGNvbnRhaW4gJHtcbiAgICAgICFkZWNpbWFscyB8fCBkZWNpbWFscyA9PT0gJyonID8gJycgOiBkZWNpbWFsc1xuICAgIH0gZGVjaW1hbCBwb2ludHNgXG59XG4iLCJpbXBvcnQgeyBpc0RvbWFpbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBkb21haW4gPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0RvbWFpbih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBkb21haW4nXG59XG4iLCJpbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGVtYWlsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNFbWFpbCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIGEgdmFsaWQgZW1haWwnXG59XG4iLCJpbXBvcnQgeyBpc0hvc3RuYW1lIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNIb3N0bmFtZSh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBob3N0IG5hbWUnXG59XG4iLCJpbXBvcnQgeyBpc0ludGVnZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaW50ZWdlciA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzSW50ZWdlcih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIHdob2xlIG51bWJlcidcbn1cbiIsImV4cG9ydCBjb25zdCBtYXggPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1heCkgPT4gdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBtYXgpIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttYXh9IG9yIGxlc3NgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBtaW4gPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1pbikgPT4gdmFsdWUgPj0gbWluLFxuICBtZXNzYWdlKHZhbHVlLCBtaW4pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttaW59IG9yIG1vcmVgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBwYXNzd29yZCA9IHtcbiAgLy8gQWxsb3cgYW55IHZhbHVlLiBGb3Igbm93IHRoaXMgaXMgb25seSB1c2VkIGFzIGEgbWFya2VyLCB0byBhbGxvdyB0aGVcbiAgLy8gcmVxdWlyZWQgdmFsaWRhdGlvbiB0byBoYW5kbGUgdW5jaGFuZ2VkIHBhc3N3b3JkcyBzZXBhcmF0ZWx5LlxuICB2YWxpZGF0ZTogKCkgPT4gdHJ1ZVxufVxuIiwiZXhwb3J0IGNvbnN0IHJhbmdlID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBbbWluLCBtYXhdKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBbbWluLCBtYXhdKSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCByZXF1aXJlZCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MsIHsgcGFzc3dvcmQgfSkgPT4gKFxuICAgICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJykgfHxcbiAgICAvLyBQYXNzd29yZCBmaWVsZHMgdXNlIGB1bmRlZmluZWRgIGFzIG9wcG9zZWQgdG8gYG51bGxgIHdoZW4gdGhleSdyZSBzZXRcbiAgICAvLyBidXQgdW5jaGFuZ2VkLCBhbGxvdyB0aGlzIHRvIHBhc3MgdGhyb3VnaDpcbiAgICAocGFzc3dvcmQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgKSxcbiAgbWVzc2FnZTogJ2lzIHJlcXVpcmVkJyxcbiAgbnVsbGlzaDogdHJ1ZVxufVxuIiwiaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgdXJsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNVcmwodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgVVJMJ1xufVxuIiwiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0aW9ucyBmcm9tICcuLi92YWxpZGF0aW9ucy9pbmRleC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsnZXJyb3JzJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgaXNWYWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIHRoaXMuaXNUb3VjaGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWRhdGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgdmFsaWRhdGUobm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlXG4gICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgfVxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlJywgdGhpcy5kYXRhUGF0aCwgdmFsdWUsIHRoaXMudmFsaWRhdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IFtydWxlLCBzZXR0aW5nXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uc1tydWxlXVxuICAgICAgICBpZiAodmFsaWRhdG9yICYmICh2YWxpZGF0b3IubnVsbGlzaCB8fCB2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsaWRhdGUsIG1lc3NhZ2UgfSA9IHZhbGlkYXRvclxuICAgICAgICAgIGlmICghdmFsaWRhdGUodmFsdWUsIHNldHRpbmcsIHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc0Z1bmN0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgPyBtZXNzYWdlKHZhbHVlLCBzZXR0aW5nLCB0aGlzKVxuICAgICAgICAgICAgICAgIDogbWVzc2FnZVxuICAgICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShmYWxzZSlcbiAgICB9LFxuXG4gICAgbWFya1RvdWNoZWQoKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWVcbiAgICB9LFxuXG4gICAgbWFya0RpcnR5KCkge1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgLy8gQ2xlYXIgY3VycmVudGx5IGRpc3BsYXllZCBlcnJvcnMgb24gbmV3IGlucHV0LlxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIGFkZEVycm9yKGVycm9yLCBhZGRMYWJlbCA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmVycm9ycyB8fD0gW11cbiAgICAgIGlmIChhZGRMYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMubGFiZWwgfHwgdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm5hbWVcbiAgICAgICAgZXJyb3IgPSBgVGhlICR7bGFiZWx9IGZpZWxkICR7ZXJyb3J9LmBcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgLy8gQ29udmVydCBmcm9tIEFKViBlcnJvcnMgb2JqZWN0cyB0byBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCB7IG1lc3NhZ2UgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihtZXNzYWdlLCB0cnVlKVxuICAgICAgfVxuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzID8gWy4uLnRoaXMuZXJyb3JzXSA6IG51bGxcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGxcbiAgICAgIHRoaXMuJGVtaXQoJ2Vycm9ycycsIHRoaXMuZXJyb3JzKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJpbmcsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFBY2Nlc3NvcihcbiAga2V5T3JEYXRhUGF0aCxcbiAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIGdldCwgc2V0LCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4pIHtcbiAgLy8gYGtleU9yRGF0YVBhdGhgIGNhbiBiZSBhIHNpbXBsZSBwcm9wZXJ0eSBrZXksXG4gIC8vIG9yIGEgZGF0YS1wYXRoIGludG8gc3ViLXByb3BlcnRpZXMsIGJvdGggaW4gYXJyYXkgb3Igc3RyaW5nIGZvcm1hdC5cbiAgaWYgKGlzU3RyaW5nKGtleU9yRGF0YVBhdGgpICYmIGtleU9yRGF0YVBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgIGtleU9yRGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGtleU9yRGF0YVBhdGgpXG4gIH1cbiAgLy8gVXNlIHRoZSBub3JtYWxpemVkIGRhdGEgcGF0aCBmb3IgdGhlIGhhbmRsaW5nIG92ZXJyaWRlc1xuICBjb25zdCBuYW1lID0gbm9ybWFsaXplRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBPbmx5IGRldGVybWluZSBzY2hlbWEgdmFsdWUgaWYgd2UgaGF2ZSBubyBnZXR0ZXIsIG9yIHRoZSBnZXR0ZXJcbiAgICAgIC8vIHdhbnRzIHRvIHJlY2VpdmUgdGhlIHZhbHVlIGFuZCBwcm9jZXNzIGl0IGZ1cnRoZXI6XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICFnZXQgfHwgZ2V0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IC8vIE5PVEU6IEJlY2F1c2UgYHNjaGVtYWAgb2JqZWN0cyBhcmUgcmV0cmlldmVkIGZyb20gYG1ldGFgLCB0aGV5XG4gICAgICAgICAgICAvLyBkb24ndCBzZWVtIHRvIGJlIHJlYWN0aXZlLiBUbyBhbGxvdyBjaGFuZ2VkIGluIGBzY2hlbWFgIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIGBzZXQoKWAgc3RvcmVzIGNoYW5nZWQgdmFsdWVzIGluIHRoZSBzZXBhcmF0ZSBgb3ZlcnJpZGVzYCBvYmplY3QuXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlcyAmJiBuYW1lIGluIHRoaXMub3ZlcnJpZGVzXG4gICAgICAgICAgICA/IHRoaXMub3ZlcnJpZGVzW25hbWVdXG4gICAgICAgICAgICA6IHRoaXMuZ2V0U2NoZW1hVmFsdWUoa2V5T3JEYXRhUGF0aCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fD0ge31cbiAgICAgICAgdGhpcy5vdmVycmlkZXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVBY2Nlc3NvcihuYW1lLCB7IGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQgfSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgZ2V0KCkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRTdG9yZShuYW1lKVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBgZGVmYXVsdCgpYCBmdW5jdGlvbnM6XG4gICAgICAgIHZhbHVlID0gaXNGdW5jdGlvbihkZWYpID8gZGVmLmNhbGwodGhpcykgOiBkZWZcbiAgICAgICAgLy8gVHJpZ2dlciBzZXR0ZXIgYnkgc2V0dGluZyB2YWx1ZSBhbmQgYWNjZXNzb3IgdG8gZGVmYXVsdDpcbiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgIC8vIE5vdyBhY2Nlc3Mgc3RvcmUgYWdhaW4sIGZvciByZWFjdGl2aXR5IHRyYWNraW5nXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBnZXR0ZXIgdG8gZnVydGhlciBjaGFuZ2Ugb3IgcHJvY2VzcyB0aGUgdmFsdWVcbiAgICAgIC8vIHJldHJpZXZlZCBmcm9tIHRoZSBzdG9yZTpcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBzZXR0ZXIgdG8gcmV0dXJuIGEgbmV3IHZhbHVlIHRvIHNldCwgb3IgZG8gdGhlXG4gICAgICAvLyBzZXR0aW5nIGl0c2VsZiwgYW5kIHRoZW4gcmV0dXJuIGB1bmRlZmluZWRgOlxuICAgICAgaWYgKCFzZXQgfHwgKHZhbHVlID0gc2V0LmNhbGwodGhpcywgdmFsdWUpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RvcmUobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGNvbXB1dGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEl0ZW0sIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0aW9uTWl4aW5dLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvLyBOT1RFOiBXaGlsZSBgZGF0YVBhdGhgIHBvaW50cyB0byB0aGUgYWN0dWFsIGB2YWx1ZWAsIGBkYXRhYCByZXByZXNlbnRzXG4gICAgLy8gdGhlIGBpdGVtYCBpbiB3aGljaCB0aGUgYHZhbHVlYCBpcyBjb250YWluZWQsIHVuZGVyIHRoZSBrZXkgYG5hbWVgLlxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2luZ2xlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2VkVmFsdWU6IG51bGwsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubmFtZVxuICAgIH0sXG5cbiAgICB0eXBlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IHRoaXMubmVzdGVkIH0pXG4gICAgfSxcblxuICAgIHZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29tcHV0ZVZhbHVlKFxuICAgICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAgICB7IGNvbXBvbmVudDogdGhpcyB9XG4gICAgICAgIClcbiAgICAgICAgY29uc3QgeyBmb3JtYXQgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIC8vIGBzY2hlbWEuZm9ybWF0YCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGluIHRoZSBsaWZlLWN5Y2xlXG4gICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQgYW5kIHRodXMgaXQncyBvayB0byBiaW5kIGl0IHRvIGB0aGlzYFxuICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgPyBmb3JtYXQuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyB2YWx1ZSB9KSlcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgICAgLy8gYHNjaGVtYS5wYXJzZWAgaXMgb25seSBldmVyIGNhbGxlZCBpbiB0aGUgbGlmZS1jeWNsZVxuICAgICAgICAvLyBvZiB0aGUgY29tcG9uZW50IGFuZCB0aHVzIGl0J3Mgb2sgdG8gYmluZCBpdCB0byBgdGhpc2BcbiAgICAgICAgdGhpcy5wYXJzZWRWYWx1ZSA9IHBhcnNlXG4gICAgICAgICAgPyBwYXJzZS5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1tdXRhdGluZy1wcm9wc1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHRoaXMucGFyc2VkVmFsdWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyZW50RGF0YSgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRQYXJlbnRJdGVtKHRoaXMucm9vdERhdGEsIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICAgICAgcmV0dXJuIGRhdGEgIT09IHRoaXMuZGF0YSA/IGRhdGEgOiBudWxsXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZERhdGEoKSB7XG4gICAgICAvLyBXZSBjYW4gb25seSBnZXQgdGhlIHByb2Nlc3NlZCBkYXRhIHRocm91Z2ggdGhlIHNjaGVtYUNvbXBvbmVudCwgYnV0XG4gICAgICAvLyB0aGF0J3Mgbm90IG5lY2Vzc2FyaWx5IHRoZSBpdGVtIHJlcHJlc2VudGVkIGJ5IHRoaXMgY29tcG9uZW50LlxuICAgICAgLy8gU29sdXRpb246IEZpbmQgdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBwcm9jZXNzZWQgc3ViLWl0ZW0gZnJvbSB0aGVyZTpcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50IH0gPSB0aGlzXG4gICAgICByZXR1cm4gZ2V0SXRlbShcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50LnByb2Nlc3NlZERhdGEsXG4gICAgICAgIC8vIEdldCB0aGUgZGF0YVBhdGggcmVsYXRpdmUgdG8gdGhlIHNjaGVtYUNvbXBvbmVudCdzIGRhdGE6XG4gICAgICAgIHRoaXMuZGF0YVBhdGguc2xpY2Uoc2NoZW1hQ29tcG9uZW50LmRhdGFQYXRoLmxlbmd0aCksXG4gICAgICAgIHRoaXMubmVzdGVkXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgc2ltaWxhciB0byBgRGl0b0NvbnRleHRgXG4gICAgLy8gcHJvcGVydGllcywgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZXNlIG9uIGB0aGlzYCBhcyB3ZWxsOlxuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnREYXRhXG4gICAgfSxcblxuICAgIHJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdERhdGFcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZERhdGFcbiAgICB9LFxuXG4gICAgbGFiZWw6IGdldFNjaGVtYUFjY2Vzc29yKCdsYWJlbCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgZ2V0KGxhYmVsKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhsYWJlbClcbiAgICAgICAgICA/IGxhYmVsXG4gICAgICAgICAgOiBsYWJlbCAhPT0gZmFsc2UgJiYgdGhpcy4kb3B0aW9ucy5nZW5lcmF0ZUxhYmVsXG4gICAgICAgICAgICA/IHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHdpZHRoOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdXG4gICAgfSksXG5cbiAgICB2aXNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndmlzaWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kb3B0aW9ucy5kZWZhdWx0VmlzaWJsZVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBleGNsdWRlZGAgZm9yIGNvbnNpc3RlbnQgbmFtaW5nP1xuICAgIGV4Y2x1ZGU6IGdldFNjaGVtYUFjY2Vzc29yKCdleGNsdWRlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICByZXF1aXJlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlcXVpcmVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBNb3ZlIHRoZXNlIHRvIGEgc3ViLWNsYXNzIGNvbXBvbmVudCB1c2VkIGZvciBhbGwgaW5wdXQgY29tcG9uZW50cz9cbiAgICByZWFkb25seTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlYWRvbmx5Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBhdXRvZm9jdXM6IGdldFNjaGVtYUFjY2Vzc29yKCdhdXRvZm9jdXMnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRvIGJlIHVzZWQgZm9yIHNlbGVjdHMgYW5kIGlucHV0cyBvbmx5P1xuICAgIGNsZWFyYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NsZWFyYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXI6IGdldFNjaGVtYUFjY2Vzc29yKCdwbGFjZWhvbGRlcicsIHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0pLFxuXG4gICAgYXV0b2NvbXBsZXRlOiBnZXRTY2hlbWFBY2Nlc3NvcignYXV0b2NvbXBsZXRlJywge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSksXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBldmVudHMoKSB7XG4gICAgICBjb25zdCB7IG9uRm9jdXMsIG9uQmx1ciwgb25JbnB1dCwgb25DaGFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7IG9uRm9jdXMsIG9uQmx1ciwgb25JbnB1dCwgb25DaGFuZ2UgfVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBuYXRpdmVGaWVsZCwgdGV4dEZpZWxkIH0gPSB0aGlzLiRvcHRpb25zXG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXZlbnRzLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuXG4gICAgICBpZiAobmF0aXZlRmllbGQpIHtcbiAgICAgICAgYXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lXG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy50aXRsZSA9IHRoaXMubGFiZWxcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seVxuICAgICAgICBhdHRyaWJ1dGVzLmF1dG9mb2N1cyA9IHRoaXMuYXV0b2ZvY3VzXG4gICAgICAgIGlmICh0ZXh0RmllbGQpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlclxuICAgICAgICAgIGF0dHJpYnV0ZXMuYXV0b2NvbXBsZXRlID0gdGhpcy5hdXRvY29tcGxldGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICB2YWxpZGF0aW9ucygpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0geyAuLi50aGlzLmdldFZhbGlkYXRpb25zKCkgfVxuICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmVxdWlyZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgZGVmYXVsdCBydWxlcyBhbmQgYWRkIGFueSBuZXcgb25lczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLnJ1bGVzIHx8IHt9KSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1trZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH0sXG5cbiAgICBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhcmFibGUgJiYgdGhpcy52YWx1ZSAhPSBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICB0aGlzLnNldHVwU2NoZW1hRmllbGRzKClcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBQcmV2ZW50IHVubmVzdGVkIHR5cGUgY29tcG9uZW50cyBmcm9tIG92ZXJyaWRpbmcgcGFyZW50IGRhdGEgcGF0aHNcbiAgICAgIGlmICh0aGlzLm5lc3RlZCkge1xuICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJDb21wb25lbnQodGhpcywgYWRkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBnZXRWYWxpZGF0aW9ucygpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGZvY3VzRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IFtlbGVtZW50XSA9IGFzQXJyYXkodGhpcy4kcmVmcy5lbGVtZW50KVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKVxuICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkLCBgZm9jdXMoKWAgd2lsbCBsaWtlbHkgbm90IGhhdmUgdGhlXG4gICAgICAgICAgLy8gZGVzaXJlZCBlZmZlY3QuIFVzZSBgc2Nyb2xsSW50b1ZpZXcoKWAgaWYgYXZhaWxhYmxlOlxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICA7KGVsZW1lbnQuJGVsIHx8IGVsZW1lbnQpLnNjcm9sbEludG9WaWV3Py4oKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAvLyBBbHNvIGZvY3VzIHRoaXMgY29tcG9uZW50J3Mgc2NoZW1hIGFuZCBwYW5lbCBpbiBjYXNlIGl0J3MgYSB0YWIuXG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5mb2N1cygpXG4gICAgICB0aGlzLnRhYkNvbXBvbmVudD8uZm9jdXMoKVxuICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoKVxuICAgIH0sXG5cbiAgICBjbGVhcigpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsXG4gICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICB9LFxuXG4gICAgb25Gb2N1cygpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWVcbiAgICAgIHRoaXMubWFya1RvdWNoZWQoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2ZvY3VzJylcbiAgICB9LFxuXG4gICAgb25CbHVyKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2VcbiAgICAgIHRoaXMudmFsaWRhdGUoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2JsdXInKVxuICAgIH0sXG5cbiAgICBvbklucHV0KCkge1xuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICB0aGlzLm1hcmtEaXJ0eSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnY2hhbmdlJywge1xuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgIHRoaXMucGFyc2VkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHZhbHVlOiB0aGlzLnBhcnNlZFZhbHVlIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgLy8gUGFzcyBgc2NoZW1hQ29tcG9uZW50YCBhcyBwYXJlbnQsIHNvIGNoYW5nZSBldmVudHMgY2FuIHByb3BhZ2F0ZSB1cC5cbiAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHVpZE1hcCA9IG5ldyBXZWFrTWFwKClcblxuLy8gR2VuZXJhdGVkIGFuZCByZW1lbWJlcnMgdW5pcXVlIGlkcyBwZXIgcGFzc2VkIG9iamVjdCB1c2luZyBhIHdlYWsgbWFwLlxubGV0IHVpZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQob2JqZWN0LCBpdGVtSWQpIHtcbiAgbGV0IGlkID0gdWlkTWFwLmdldChvYmplY3QpXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGl0ZW1JZCB8fCBgQCR7Kyt1aWR9YFxuICAgIHVpZE1hcC5zZXQob2JqZWN0LCBpZClcbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsImltcG9ydCB7IGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIGFzQXJyYXksXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xuXG4vLyBTY2hlbWFHcmFwaCBpcyBhIGNsYXNzIHRvIGNvbGxlY3Qgc2NoZW1hIGdyYXBoIG1ldGEgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG9cbi8vIHByb2Nlc3Mgc291cmNlcyBhbmQgcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0cyAnc2VydmVyJyBhbmQgJ2NsaXBib2FyZCcsXG4vLyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbi8vXG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VydmVyICAgIHwgY2xpcGJvYXJkIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiBmYWxzZSAgICAgICAgICAgfCBrZWVwIGlkICAgfCBrZWVwIGlkICAgfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogdHJ1ZSAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVmLCAjcmVmIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUsIHRlbXBvcmFyeSB8IHJlZiwgI3JlZiB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiBmYWxzZSAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZW1vdmUgaWQgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UsIHRlbXBvcmFyeSAgIHwgcmVmLCAjaWQgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IHRydWUgICAgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI2lkICB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlLCB0ZW1wb3JhcnkgICAgfCByZWYsICNpZCAgfCByZWYsICNpZCAgfFxuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcblxuZXhwb3J0IGNsYXNzIFNjaGVtYUdyYXBoIHtcbiAgZ3JhcGggPSB7fVxuICByZWZlcmVuY2VzID0ge31cblxuICBzZXQoZGF0YVBhdGgsIHNldHRpbmdzLCBkZWZhdWx0cykge1xuICAgIGRhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICBsZXQgc3ViR3JhcGggPSB0aGlzLmdyYXBoXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRhdGFQYXRoKSB7XG4gICAgICBjb25zdCBrZXkgPSBpc0ludGVnZXIoK3BhcnQpID8gJyonIDogcGFydFxuICAgICAgc3ViR3JhcGggPSBzdWJHcmFwaFtrZXldID8/PSB7fVxuICAgIH1cbiAgICBzdWJHcmFwaC4kc2V0dGluZ3MgPSB7XG4gICAgICAuLi5kZWZhdWx0cywgLy8gU2VlIGBhZGRTb3VyY2UoZGF0YVBhdGgpYFxuICAgICAgLi4uc3ViR3JhcGguJHNldHRpbmdzLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9XG4gIH1cblxuICBhZGRTb3VyY2UoZGF0YVBhdGgsIHNjaGVtYSkge1xuICAgIC8vIE9ubHkgc2V0IGByZWxhdGVkOiBmYWxzZWAgdGhyb3VnaCB0aGUgZGVmYXVsdHMsIGFzIGBzZXRTb3VyY2VSZWxhdGVkKClgXG4gICAgLy8gbWF5IGJlIGNhbGxlZCBiZWZvcmUgYGFkZFNvdXJjZSgpYCwgZGVwZW5kaW5nIG9uIHRoZSBncmFwaCBzdHJ1Y3R1cmUuXG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHsgdHlwZTogJ3NvdXJjZScsIHNjaGVtYSB9LCB7IHJlbGF0ZWQ6IGZhbHNlIH0pXG4gIH1cblxuICBzZXRTb3VyY2VSZWxhdGVkKGRhdGFQYXRoKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHJlbGF0ZWQ6IHRydWUsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBhZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICB0aGlzLnNldChkYXRhUGF0aCwge1xuICAgICAgdHlwZTogJ3JlbGF0aW9uJyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGludGVybmFsOiAhIXJlbGF0ZWREYXRhUGF0aCxcbiAgICAgIHJlZmVyZW5jZTogdGhpcy5nZXRSZWZlcmVuY2VQcmVmaXgocmVsYXRlZERhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBnZXRSZWZlcmVuY2VQcmVmaXgoZGF0YVBhdGgpIHtcbiAgICByZXR1cm4gZGF0YVBhdGhcbiAgICAgID8gKHRoaXMucmVmZXJlbmNlc1tkYXRhUGF0aF0gPz89IG5hbm9pZCg2KSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBmbGF0dGVuID0gZ3JhcGggPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHsgJHNldHRpbmdzLCAuLi5zdWJHcmFwaCB9XSBvZiBPYmplY3QuZW50cmllcyhncmFwaCkpIHtcbiAgICAgICAgaWYgKCRzZXR0aW5ncykge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCAkc2V0dGluZ3NdKVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc2V0dGluZ3NdIG9mIGZsYXR0ZW4oc3ViR3JhcGgpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtgJHtrZXl9LyR7c3ViS2V5fWAsIHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbih0aGlzLmdyYXBoKVxuICB9XG5cbiAgcHJvY2Vzcyhzb3VyY2VTY2hlbWEsIGRhdGEsIHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBjbGlwYm9hcmQgPSB0YXJnZXQgPT09ICdjbGlwYm9hcmQnXG4gICAgaWYgKGNsaXBib2FyZCkge1xuICAgICAgZGVsZXRlIGRhdGFbc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBzZXR0aW5nc10gb2YgdGhpcy5mbGF0dGVuKCkpIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2NoZW1hLCBpbnRlcm5hbCwgcmVsYXRlZCwgcmVmZXJlbmNlIH0gPSBzZXR0aW5nc1xuICAgICAgY29uc3Qgc291cmNlID0gdHlwZSA9PT0gJ3NvdXJjZSdcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdHlwZSA9PT0gJ3JlbGF0aW9uJ1xuICAgICAgaWYgKHNvdXJjZSB8fCByZWxhdGlvbiAmJiBpbnRlcm5hbCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoZGF0YSwgZGF0YVBhdGgsICgpID0+IG51bGwpXG4gICAgICAgIGNvbnN0IHJlbW92ZUlkID0gY2xpcGJvYXJkICYmIHNvdXJjZSAmJiAhcmVsYXRlZFxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IChcbiAgICAgICAgICBjbGlwYm9hcmQgJiYgKFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgaW50ZXJuYWwgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiByZWxhdGVkXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXNBcnJheSh2YWx1ZXMpLmZsYXQoKSkge1xuICAgICAgICAgIGNvbnN0IGlkS2V5ID0gKFxuICAgICAgICAgICAgc291cmNlICYmIHNjaGVtYS5pZEtleSB8fFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgc2NoZW1hLnJlbGF0ZUJ5IHx8XG4gICAgICAgICAgICAnaWQnXG4gICAgICAgICAgKVxuICAgICAgICAgIGxldCBpZCA9IHZhbHVlPy5baWRLZXldXG4gICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChyZW1vdmVJZCkge1xuICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbaWRLZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlSWQgfHwgaXNUZW1wb3JhcnlJZChpZCkpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBpZC5zbGljZSgxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlZktleSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gLy8gQ2xpcGJvYXJkIGp1c3QgbmVlZHMgdGVtcG9yYXJ5IGlkcyB1bmRlciB0aGUgYWN0dWFsIGBpZEtleWBcbiAgICAgICAgICAgICAgICAgIGlkS2V5XG4gICAgICAgICAgICAgICAgOiAvLyBTZXJ2ZXIgd2FudHMgT2JqZWN0aW9uLXN0eWxlICcjaWQnIC8gJyNyZWYnIHBhaXJzLlxuICAgICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICAgICAgICA/ICcjaWQnXG4gICAgICAgICAgICAgICAgICA6ICcjcmVmJ1xuICAgICAgICAgICAgICBjb25zdCByZXZWYWx1ZSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gYEAke2lkfWBcbiAgICAgICAgICAgICAgICA6IC8vIEtlZXAgdGhlIGlkcyB1bmlxdWUgaW4gcmVmZXJlbmNlIGdyb3Vwcywgc2luY2UgdGhleVxuICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFjcm9zcyB0aGUgZnVsbCBncmFwaC5cbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgPyBgJHtyZWZlcmVuY2V9LSR7aWR9YFxuICAgICAgICAgICAgICAgICAgOiBpZCAvLyBBIHRlbXBvcmFyeSBpZCB3aXRob3V0IGEgcmVsYXRlZCwganVzdCBwcmVzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgdmFsdWVbcmVmS2V5XSA9IHJldlZhbHVlXG4gICAgICAgICAgICAgIGlmIChyZWZLZXkgIT09IGlkS2V5KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RpdG9NaXhpbi5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IGdldFVpZCB9IGZyb20gJy4vdWlkLmpzJ1xuaW1wb3J0IHsgU2NoZW1hR3JhcGggfSBmcm9tICcuL1NjaGVtYUdyYXBoLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgaXNNb2R1bGUsXG4gIGNsb25lLFxuICBtZXJnZSxcbiAgY2FtZWxpemUsXG4gIG1hcENvbmN1cnJlbnRseVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbWFya1JhdyB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgdHlwZUNvbXBvbmVudHMgPSB7fVxuY29uc3QgdW5rbm93blR5cGVSZXBvcnRlZCA9IHt9XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR5cGVDb21wb25lbnQodHlwZSwgY29tcG9uZW50KSB7XG4gIHR5cGVDb21wb25lbnRzW3R5cGVdID0gY29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29tcG9uZW50KHR5cGUsIGFsbG93TnVsbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHR5cGVDb21wb25lbnRzW3R5cGVdIHx8IG51bGxcbiAgaWYgKCFjb21wb25lbnQgJiYgIWFsbG93TnVsbCAmJiAhdW5rbm93blR5cGVSZXBvcnRlZFt0eXBlXSkge1xuICAgIC8vIFJlcG9ydCBlYWNoIG1pc3NpbmcgdHlwZSBvbmx5IG9uY2UsIHRvIGF2b2lkIGZsb29kaW5nIHRoZSBjb25zb2xlOlxuICAgIHVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0gPSB0cnVlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERpdG8gY29tcG9uZW50IHR5cGU6ICcke3R5cGV9J2ApXG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hcywgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChpc1NpbmdsZUNvbXBvbmVudFZpZXcoc2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzID0gY2FsbGJhY2soc2NoZW1hLmNvbXBvbmVudCwgc2NoZW1hLm5hbWUsIDApXG4gICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5jb21wb25lbnRzIHx8IHt9KSkge1xuICAgICAgICBjb25zdCByZXMgPSBjYWxsYmFjayhjb21wb25lbnQsIG5hbWUsIDEpXG4gICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gc2NoZW1hXG4gICAgPyBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhbc2NoZW1hLCAuLi5nZXRBbGxUYWJTY2hlbWFzKHNjaGVtYSldLCBjYWxsYmFjaylcbiAgICA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyBjb21wb25lbnQgOiB1bmRlZmluZWQpXG4gICAgKSB8fCBudWxsXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWVTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdHJ1ZSA6IHVuZGVmaW5lZClcbiAgICApID09PSB0cnVlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5U2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IHVuZGVmaW5lZCA6IGZhbHNlKVxuICAgICkgIT09IGZhbHNlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBpc1N0cmluZyhzY2hlbWEudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICdmb3JtJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3ZpZXcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhYihzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd0YWInXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3BhbmVsJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5uYW1lIHx8IHNjaGVtYS5sYWJlbCB8fCBzY2hlbWEudHlwZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHVud3JhcE1vZHVsZSA9IGZhbHNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBuYW1lID0ga2V5c1swXVxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFbbmFtZV1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIHNjaGVtYS5uYW1lID0gbmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFzKFxuICB1bnJlc29sdmVkU2NoZW1hcyxcbiAgcmVzb2x2ZUl0ZW0gPSByZXNvbHZlU2NoZW1hXG4pIHtcbiAgbGV0IHNjaGVtYXMgPSBpc0Z1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWFzKVxuICAgID8gdW5yZXNvbHZlZFNjaGVtYXMoKVxuICAgIDogdW5yZXNvbHZlZFNjaGVtYXNcbiAgc2NoZW1hcyA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hcywgZmFsc2UpXG4gIGlmIChpc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgLy8gVHJhbnNsYXRlIGFuIGFycmF5IG9mIGR5bmFtaWMgaW1wb3J0LCBlYWNoIGltcG9ydGluZyBvbmUgbmFtZWQgc2NoZW1hXG4gICAgLy8gbW9kdWxlIHRvIGFuIG9iamVjdCB3aXRoIG5hbWVkIGVudHJpZXMuXG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW3NjaGVtYS5uYW1lLCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2NoZW1hcykpIHtcbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgYXN5bmMgKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBzY2hlbWFzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSkge1xuICAvLyBSZXNvbHZlcyBhc3luYyBzY2hlbWEgY29tcG9uZW50cyBhbmQgYWRkcyBEaXRvTWl4aW4gYW5kIFR5cGVNaXhpbiB0byB0aGVtLlxuICBsZXQgeyBjb21wb25lbnQgfSA9IHNjaGVtYVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShjb21wb25lbnQsIHRydWUpXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gUHJldmVudCB3YXJuaW5nOiBcIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlXG4gICAgICAvLyBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGRcbiAgICAgIC8vIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgXCI6XG4gICAgICBzY2hlbWEuY29tcG9uZW50ID0gbWFya1Jhdyh7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgbWl4aW5zOiBbRGl0b01peGluLCBUeXBlTWl4aW4sIC4uLihjb21wb25lbnQubWl4aW5zIHx8IFtdKV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzKSB7XG4gIC8vIGBzY2hlbWFzYCBhcmUgb2YgdGhlIHNhbWUgcG9zc2libGUgZm9ybXMgYXMgcGFzc2VkIHRvIGBnZXROYW1lZFNjaGVtYXMoKWBcbiAgYXdhaXQgbWFwQ29uY3VycmVudGx5KE9iamVjdC52YWx1ZXMoc2NoZW1hcyB8fCB7fSksIHJlc29sdmVTY2hlbWFDb21wb25lbnQpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbCkge1xuICBjb25zdCBwcm9taXNlcyA9IFtdXG4gIGNvbnN0IHByb2Nlc3MgPSAoY29tcG9uZW50LCBuYW1lLCByZWxhdGl2ZUxldmVsKSA9PiB7XG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoXG4gICAgICAgIGFwaSxcbiAgICAgICAgY29tcG9uZW50LFxuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGxldmVsICsgcmVsYXRpdmVMZXZlbFxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKHNjaGVtYSwgcHJvY2VzcylcbiAgaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoZ2V0QWxsUGFuZWxTY2hlbWFzKHNjaGVtYSksIHByb2Nlc3MpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50KGFwaSwgc2NoZW1hLCBuYW1lLCByb3V0ZXMsIGxldmVsKSB7XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcblxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLy8gQWxzbyBwcm9jZXNzIG5lc3RlZCBwYW5lbCBzY2hlbWFzLlxuICAgIG1hcENvbmN1cnJlbnRseShnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSwgcGFuZWwgPT5cbiAgICAgIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgcGFuZWwsIHJvdXRlcywgbGV2ZWwpXG4gICAgKSxcbiAgICAvLyBEZWxlZ2F0ZSBzY2hlbWEgcHJvY2Vzc2luZyB0byB0aGUgYWN0dWFsIHR5cGUgY29tcG9uZW50cy5cbiAgICBhd2FpdCBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5wcm9jZXNzU2NoZW1hPy4oXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWxcbiAgICApXG4gIF0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhjb21wb25lbnQsIGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIGlmICghaXNWaWV3KHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmlldyBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIGNoaWxkcmVuLCAwKVxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAvJHtzY2hlbWEucGF0aH1gLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudCxcbiAgICBtZXRhOiB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSkge1xuICBsZXQgZGVmYXVsdHMgPSBhcGkuZGVmYXVsdHNbc2NoZW1hLnR5cGVdXG4gIGlmIChkZWZhdWx0cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGRlZmF1bHRzKSkge1xuICAgICAgZGVmYXVsdHMgPSBkZWZhdWx0cyhzY2hlbWEpXG4gICAgfVxuICAgIGlmIChpc09iamVjdChkZWZhdWx0cykpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzKSkge1xuICAgICAgICBpZiAoc2NoZW1hW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2hlbWFba2V5XSA9IG1lcmdlKHZhbHVlLCBzY2hlbWFba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1JvdXRlU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIC8vIFVzZWQgZm9yIHZpZXcgYW5kIHNvdXJjZSBzY2hlbWFzLCBzZWUgU291cmNlTWl4aW4uXG4gIHNjaGVtYS5uYW1lID0gbmFtZVxuICBzY2hlbWEucGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGgobmFtZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGb3JtcyhhcGksIHNjaGVtYSwgbGV2ZWwpIHtcbiAgLy8gRmlyc3QgcmVzb2x2ZSB0aGUgZm9ybXMgYW5kIHN0b3JlIHRoZSByZXN1bHRzIGJhY2sgb24gdGhlIHNjaGVtYS5cbiAgbGV0IHsgZm9ybSwgZm9ybXMsIGNvbXBvbmVudHMgfSA9IHNjaGVtYVxuICBpZiAoZm9ybXMpIHtcbiAgICBmb3JtcyA9IHNjaGVtYS5mb3JtcyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKGZvcm1zLCBmb3JtID0+XG4gICAgICBwcm9jZXNzRm9ybShhcGksIGZvcm0pXG4gICAgKVxuICB9IGVsc2UgaWYgKGZvcm0pIHtcbiAgICBmb3JtID0gc2NoZW1hLmZvcm0gPSBhd2FpdCBwcm9jZXNzRm9ybShhcGksIGZvcm0pXG4gIH0gZWxzZSBpZiAoY29tcG9uZW50cykge1xuICAgIC8vIE5PVEU6IFByb2Nlc3NpbmcgZm9ybXMgaW4gY29tcHV0ZWQgY29tcG9uZW50cyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBpdFxuICAgIC8vIG9ubHkgY2FuIGJlIGNvbXB1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggYWN0dWFsIGRhdGEuXG4gICAgaWYgKGlzT2JqZWN0KGNvbXBvbmVudHMpKSB7XG4gICAgICBmb3JtID0geyBjb21wb25lbnRzIH1cbiAgICB9XG4gIH1cblxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH0gLy8gT25seSB1c2VkIGZvciBwcm9jZXNzIGxvb3AgYmVsb3cuXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgZm9yIChjb25zdCBmb3JtIG9mIE9iamVjdC52YWx1ZXMoZm9ybXMpKSB7XG4gICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBmb3JtLCBjaGlsZHJlbiwgbGV2ZWwpXG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRm9ybShhcGksIHNjaGVtYSkge1xuICBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdHJ1ZSlcbiAgaWYgKCFpc0Zvcm0oc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmb3JtIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NUYWIoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNUYWIoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWIgc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzUGFuZWwoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNQYW5lbChzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhbmVsIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpIHtcbiAgY29uc3QgeyB0YWJzLCBwYW5lbHMgfSA9IHNjaGVtYVxuICBpZiAodGFicykge1xuICAgIHNjaGVtYS50YWJzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICB0YWJzLFxuICAgICAgdGFiID0+IHByb2Nlc3NUYWIoYXBpLCB0YWIpXG4gICAgKVxuICB9XG4gIGlmIChwYW5lbHMpIHtcbiAgICBzY2hlbWEucGFuZWxzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICBwYW5lbHMsXG4gICAgICBwYW5lbCA9PiBwcm9jZXNzUGFuZWwoYXBpLCBwYW5lbClcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgYm90aCBzaW5nbGUgZm9ybSBhbmQgbXVsdGlwbGUgZm9ybXMgbm90YXRpb24sIGFzIHdlbGwgYXMgaW5saW5lZFxuICAvLyBjb21wb25lbnRzLlxuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBpc09iamVjdChzY2hlbWEuZm9ybSB8fCBzY2hlbWEuZm9ybXMgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc011bHRpcGxlRm9ybVNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgaXNTY2hlbWEoc2NoZW1hKSAmJlxuICAgIE9iamVjdC5rZXlzKHNjaGVtYT8uZm9ybXMgfHwge30pLmxlbmd0aCA+IDFcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzVmlldyhzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmNvbXBvbmVudClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdmlldyB9ID0gc2NoZW1hXG4gIGNvbnN0IHZpZXdTY2hlbWEgPSB2aWV3ICYmIGNvbnRleHQudmlld3Nbdmlld11cbiAgcmV0dXJuIHZpZXdTY2hlbWFcbiAgICA/IC8vIE5PVEU6IFZpZXdzIGNhbiBoYXZlIHRhYnMsIGluIHdoaWNoIGNhc2UgdGhlIHZpZXcgY29tcG9uZW50IGlzIG5lc3RlZFxuICAgICAgLy8gaW4gb25lIG9mIHRoZSB0YWJzLCBnbyBmaW5kIGl0LlxuICAgICAgZmluZFNjaGVtYUNvbXBvbmVudCh2aWV3U2NoZW1hLCBoYXNGb3JtU2NoZW1hKSB8fCBudWxsXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dCkge1xuICByZXR1cm4gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICAgID8gY29udGV4dC52aWV3c1tzY2hlbWEudmlld11cbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdFZGl0UGF0aChzY2hlbWEsIGNvbnRleHQpIHtcbiAgY29uc3QgdmlldyA9IGdldFZpZXdTY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICByZXR1cm4gdmlld1xuICAgID8gaXNTaW5nbGVDb21wb25lbnRWaWV3KHZpZXcpXG4gICAgICA/IGAvJHt2aWV3LnBhdGh9YFxuICAgICAgOiBgLyR7dmlldy5wYXRofS8ke3ZpZXcucGF0aH1gXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQsIG1vZGlmeUZvcm0pIHtcbiAgY29uc3Qgdmlld1NjaGVtYSA9IGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgaWYgKHZpZXdTY2hlbWEpIHtcbiAgICBzY2hlbWEgPSB2aWV3U2NoZW1hXG4gIH0gZWxzZSBpZiAoc2NoZW1hLnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmlldzogJyR7c2NoZW1hLnZpZXd9J2ApXG4gIH1cblxuICBsZXQgeyBmb3JtLCBmb3JtcywgY29tcG9uZW50cywgY29tcGFjdCB9ID0gc2NoZW1hXG4gIGlmICghZm9ybSAmJiAhZm9ybXMpIHtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgLy8gQ29udmVydCBpbmxpbmVkIGNvbXBvbmVudHMgdG8gZm9ybXMsIHN1cHBvcnRpbmcgYGNvbXBhY3RgIHNldHRpbmcuXG4gICAgICBmb3JtID0geyBjb21wb25lbnRzLCBjb21wYWN0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYGZvcm1zYCwgYGZvcm1gIG9yIGBjb21wb25lbnRzYCwgcmV0dXJuIGFuZCBlbXB0eSBgZm9ybXNgIG9iamVjdC5cbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmb3JtcykubWFwKChbdHlwZSwgZm9ybV0pID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYHNjaGVtYS5jb21wb25lbnRzYCBjYWxsYmFja3MgdG8gY3JlYXRlIGNvbXBvbmVudHMgb24gdGhlIGZseS5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGZvcm0uY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9ybSA9IHtcbiAgICAgICAgICAuLi5mb3JtLFxuICAgICAgICAgIGNvbXBvbmVudHM6IGZvcm0uY29tcG9uZW50cyhjb250ZXh0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIG1vZGlmeUZvcm0/Lihmb3JtKSA/PyBmb3JtXVxuICAgIH0pXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zKGZvcm1zLCBpdGVtKSB7XG4gIHJldHVybiBmb3Jtc1tpdGVtPy50eXBlXSB8fCBmb3Jtcy5kZWZhdWx0IHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dCkge1xuICByZXR1cm4gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZ2V0Rm9ybVNjaGVtYXMoc2NoZW1hLCBjb250ZXh0KSwgaXRlbSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGFjdChzY2hlbWEpIHtcbiAgcmV0dXJuICEhc2NoZW1hLmNvbXBhY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5saW5lZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5pbmxpbmVkIHx8IHNjaGVtYS5jb21wb25lbnRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWQoc2NoZW1hKSB7XG4gIHJldHVybiAhIShzY2hlbWEubmVzdGVkIHx8IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmRlZmF1bHROZXN0ZWQgPT09IHRydWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbWl0UGFkZGluZyhzY2hlbWEpIHtcbiAgcmV0dXJuICEhZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8ub21pdFBhZGRpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsaWduQm90dG9tKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5hbGlnbkJvdHRvbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSkge1xuICAvLyBTdXBwb3J0IGRlZmF1bHQgdmFsdWVzIGJvdGggb24gc2NoZW1hIGFuZCBvbiBjb21wb25lbnQgbGV2ZWwuXG4gIC8vIE5PVEU6IEF0IHRoZSB0aW1lIG9mIGNyZWF0aW9uLCBjb21wb25lbnRzIG1heSBub3QgYmUgaW5zdGFudGlhdGVkLCAoZS5nLiBpZlxuICAvLyBlbnRyaWVzIGFyZSBjcmVhdGVkIHRocm91Z2ggbmVzdGVkIGZvcm1zLCB0aGUgcGFyZW50IGZvcm0gaXNuJ3QgbW91bnRlZCkgc29cbiAgLy8gd2UgY2FuJ3QgdXNlIGBkYXRhUGF0aGAgdG8gZ2V0IHRvIGNvbXBvbmVudHMsIGFuZCB0aGUgYGRlZmF1bHRWYWx1ZWAgZnJvbVxuICAvLyB0aGVyZS4gVGhhdCdzIHdoeSBgZGVmYXVsdFZhbHVlYCBpcyBkZWZpbmVkIHN0YXRpY2FsbHkgaW4gdGhlIGNvbXBvbmVudHM6XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHNjaGVtYS5kZWZhdWx0XG4gIGNvbnN0IHZhbHVlID1cbiAgICBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZWZhdWx0VmFsdWVcbiAgICAgIDogZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdFZhbHVlXG4gIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgID8gdmFsdWUoc2NoZW1hKVxuICAgIDogY2xvbmUodmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSB7XG4gIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuICByZXR1cm4gISEoXG4gICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fCB0eXBlT3B0aW9ucz8uaWdub3JlTWlzc2luZ1ZhbHVlPy4oc2NoZW1hKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0VmFsdWVzKHNjaGVtYSwgZGF0YSA9IHt9LCBjb21wb25lbnQpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgY29tcG9uZW50LCByb290RGF0YTogZGF0YSB9XG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUpID0+IHtcbiAgICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgICAgZGF0YVtuYW1lXSA9IGdldERlZmF1bHRWYWx1ZShzY2hlbWEpXG4gICAgfVxuICB9XG5cbiAgLy8gU2V0cyB1cCBhIGRhdGEgb2JqZWN0IHRoYXQgaGFzIGtleXMgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsXG4gIC8vIGZvcm0gZmllbGRzLCBzbyB0aGV5IGNhbiBiZSBjb3JyZWN0bHkgd2F0Y2hlZCBmb3IgY2hhbmdlcy5cbiAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgIHNjaGVtYSxcbiAgICBkYXRhLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBwcm9jZXNzQmVmb3JlLFxuICAgIG51bGwsXG4gICAgb3B0aW9uc1xuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVmFsdWUoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwge1xuICBjb21wb25lbnQgPSBudWxsLFxuICByb290RGF0YSA9IGNvbXBvbmVudD8ucm9vdERhdGFcbn0gPSB7fSkge1xuICBjb25zdCB7IGNvbXB1dGUgfSA9IHNjaGVtYVxuICBpZiAoY29tcHV0ZSkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcHV0ZShcbiAgICAgIERpdG9Db250ZXh0LmdldChjb21wb25lbnQsIHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBPdmVycmlkZSB2YWx1ZSB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIHRocm91Z2ggY2FsbGluZyB0aGVcbiAgICAgICAgLy8gZ2V0dGVyIGZvciBgdGhpcy52YWx1ZWAgaW4gYERpdG9Db250ZXh0YDpcbiAgICAgICAgdmFsdWU6IGRhdGFbbmFtZV0sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICByb290RGF0YVxuICAgICAgfSlcbiAgICApXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEFjY2VzcyBgZGF0YVtuYW1lXWAgZGlyZWN0bHkgaW5zdGVhZCBvZiBgdGhpcy52YWx1ZSA9IOKApmAgdG8gdXBkYXRlIHRoZVxuICAgICAgLy8gdmFsdWUgd2l0aG91dCBjYWxsaW5nIHBhcnNlKCk6XG4gICAgICBkYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIHN0aWxsIG1pc3NpbmcgYWZ0ZXIgY29tcHV0ZSwgc2V0IHRoZSBkZWZhdWx0IGZvciBpdDpcbiAgaWYgKCEobmFtZSBpbiBkYXRhKSAmJiAhaWdub3JlTWlzc2luZ1ZhbHVlKHNjaGVtYSkpIHtcbiAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSlcbiAgfVxuICAvLyBOb3cgYWNjZXNzIHRoZSB2YWx1ZS4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHJlYWN0aXZpdHkgYW5kIG5lZWRzIHRvXG4gIC8vIGhhcHBlbiBhZnRlciBhbGwgcHJpb3IgbWFuaXB1bGF0aW9uIG9mIGBkYXRhW25hbWVdYCwgc2VlIGFib3ZlOlxuICByZXR1cm4gZGF0YVtuYW1lXVxufVxuXG5mdW5jdGlvbiBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBpdGVtLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnNjaGVtYU9ubHkpIHtcbiAgICBjb25zdCBjb3B5ID0ge31cbiAgICBjb25zdCB7IGlkS2V5ID0gJ2lkJywgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgIGNvbnN0IGlkID0gaXRlbVtpZEtleV1cbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29weVtpZEtleV0gPSBpZFxuICAgIH1cbiAgICAvLyBDb3B5IG92ZXIgdHlwZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZSBmb3JtcyB0byBjaG9vc2UgZnJvbS5cbiAgICBpZiAoaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyhzb3VyY2VTY2hlbWEpKSB7XG4gICAgICBjb3B5LnR5cGUgPSBpdGVtLnR5cGVcbiAgICB9XG4gICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICBjb3B5W29yZGVyS2V5XSA9IGl0ZW1bb3JkZXJLZXldXG4gICAgfVxuICAgIHJldHVybiBjb3B5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NEYXRhKHNjaGVtYSwgc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGF0aCwge1xuICBjb21wb25lbnQsXG4gIHNjaGVtYU9ubHksIC8vIHdoZXRoZXIgdG8gb25seSBpbmNsdWRlIGRhdGEgY292ZXJlZCBieSB0aGUgc2NoZW1hLCBvciBhbGwgZGF0YVxuICB0YXJnZXRcbn0gPSB7fSkge1xuICBjb25zdCBvcHRpb25zID0geyBjb21wb25lbnQsIHNjaGVtYU9ubHksIHRhcmdldCwgcm9vdERhdGE6IGRhdGEgfVxuICBjb25zdCBwcm9jZXNzZWREYXRhID0gY2xvbmVJdGVtKHNvdXJjZVNjaGVtYSwgZGF0YSwgb3B0aW9ucylcbiAgY29uc3QgZ3JhcGggPSBuZXcgU2NoZW1hR3JhcGgoKVxuXG4gIGNvbnN0IHByb2Nlc3NCZWZvcmUgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBvcHRpb25zKVxuICAgIC8vIFRoZSBzY2hlbWEgZXhwZWN0cyB0aGUgYHdyYXBQcmltaXRpdmVzYCB0cmFuc2Zvcm1hdGlvbnMgdG8gYmUgcHJlc2VudCBvblxuICAgIC8vIHRoZSBkYXRhIHRoYXQgaXQgaXMgYXBwbGllZCBvbiwgc28gd2FycCBiZWZvcmUgYW5kIHVud3JhcCBhZnRlci5cbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIG9yZGVyS2V5LCBpZEtleSA9ICdpZCcgfSA9IHNjaGVtYVxuICAgICAgaWYgKHdyYXBQcmltaXRpdmVzKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGVudHJ5ID0+ICh7XG4gICAgICAgICAgW3dyYXBQcmltaXRpdmVzXTogZW50cnlcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbHdheXMgc2hhbGxvdy1jbG9uZSBhcnJheSB2YWx1ZXM6XG4gICAgICAgIHZhbHVlID0gWy4uLnZhbHVlXVxuICAgICAgfVxuICAgICAgaWYgKG9yZGVyS2V5ICYmIHRhcmdldCA9PT0gJ2NsaXBib2FyZCcpIHtcbiAgICAgICAgLy8gU29ydCB0aGUgZGF0YSBiYWNrIGludG8gdGhlIG5hdHVyYWwgc2VxdWVuY2UgYXMgZGVmaW5lZCBieSB0aGVpciBpZHMsXG4gICAgICAgIC8vIHNvIGNvcHktcGFzdGluZyBiZXR3ZWVuIHNlcnZlcnMgKGUuZy4gbmVzdGVkIGZvbnQtY3V0cyBvbiBMaW5ldG8pXG4gICAgICAgIC8vIG5hdHVyYWxseSBnZXRzIG1hcHBlZCB0byB0aGUgc2FtZSBlbnRyaWVzIGluIHRoZSBncmFwaC5cbiAgICAgICAgdmFsdWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkMSA9IGE/LltpZEtleV1cbiAgICAgICAgICBjb25zdCBpZDIgPSBiPy5baWRLZXldXG4gICAgICAgICAgcmV0dXJuIGlkMSA9PSBudWxsIHx8IGlzVGVtcG9yYXJ5SWQoaWQxKVxuICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICA6IGlkMiA9PSBudWxsIHx8IGlzVGVtcG9yYXJ5SWQoaWQyKVxuICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgIDogaWQxIC0gaWQyXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3NlZERhdGFbbmFtZV0gPSB2YWx1ZVxuICB9XG5cbiAgY29uc3QgcHJvY2Vzc0FmdGVyID0gKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIHByb2Nlc3NlZERhdGEpID0+IHtcbiAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzLCBleGNsdWRlLCBwcm9jZXNzIH0gPSBzY2hlbWFcbiAgICBsZXQgdmFsdWUgPSBwcm9jZXNzZWREYXRhW25hbWVdXG5cbiAgICBjb25zdCB0eXBlT3B0aW9ucyA9IGdldFR5cGVPcHRpb25zKHNjaGVtYSlcblxuICAgIC8vIE5PVEU6IFdlIGRvbid0IGNhY2hlIHRoaXMgY29udGV4dCwgc2luY2UgYHZhbHVlYCBpcyBjaGFuZ2luZy5cbiAgICBjb25zdCBnZXRDb250ZXh0ID0gKCkgPT5cbiAgICAgIERpdG9Db250ZXh0LmdldChjb21wb25lbnQsIHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhLFxuICAgICAgICAvLyBQYXNzIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBkYXRhIHRvIGBwcm9jZXNzKClgLCBzbyBpdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgICAgLy8gdGhyb3VnaCBgcHJvY2Vzc2VkSXRlbWAgZnJvbSB0aGVyZS5cbiAgICAgICAgcHJvY2Vzc2VkRGF0YVxuICAgICAgfSlcblxuICAgIC8vIEZpcnN0IHVud3JhcCB0aGUgd3JhcHBlZCBwcmltaXRpdmVzIGFnYWluLCB0byBicmluZyB0aGUgZGF0YSBiYWNrIGludG9cbiAgICAvLyBpdHMgbmF0aXZlIGZvcm0uIFNlIGBwcm9jZXNzQmVmb3JlKClgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHVzZXIncyBgcHJvY2VzcygpYCBjYWxsYmFjayBmaXJzdCwgaWYgb25lIGlzIHByb3ZpZGVkLCBzbyB0aGF0XG4gICAgLy8gaXQgY2FuIG1vZGlmeSBkYXRhIGluIGBwcm9jZXNzZWREYXRhYCBldmVuIGlmIGl0IHByb3ZpZGVzIGBleGNsdWRlOiB0cnVlYFxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICB2YWx1ZSA9IHByb2Nlc3MoZ2V0Q29udGV4dCgpKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVPcHRpb25zPy5leGNsdWRlVmFsdWUgfHxcbiAgICAgIC8vIFN1cHBvcnQgZnVuY3Rpb25zIG5leHQgdG8gYm9vbGVhbnMgZm9yIGBzY2hlbWEuZXhjbHVkZWA6XG4gICAgICBleGNsdWRlID09PSB0cnVlIHx8XG4gICAgICBpc0Z1bmN0aW9uKGV4Y2x1ZGUpICYmIGV4Y2x1ZGUoZ2V0Q29udGV4dCgpKVxuICAgICkge1xuICAgICAgZGVsZXRlIHByb2Nlc3NlZERhdGFbbmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRWFjaCBjb21wb25lbnQgdHlwZSBjYW4gcHJvdmlkZSBpdHMgb3duIHN0YXRpYyBgcHJvY2Vzc1ZhbHVlKClgIG1ldGhvZFxuICAgICAgLy8gdG8gY29udmVydCB0aGUgZGF0YSBmb3Igc3RvcmFnZS5cbiAgICAgIGNvbnN0IHByb2Nlc3NWYWx1ZSA9IHR5cGVPcHRpb25zPy5wcm9jZXNzVmFsdWVcbiAgICAgIGlmIChwcm9jZXNzVmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgZGF0YVBhdGgsXG4gICAgcHJvY2Vzc2VkRGF0YSxcbiAgICBwcm9jZXNzQmVmb3JlLFxuICAgIHByb2Nlc3NBZnRlcixcbiAgICBvcHRpb25zXG4gIClcblxuICByZXR1cm4gZ3JhcGgucHJvY2Vzcyhzb3VyY2VTY2hlbWEsIHByb2Nlc3NlZERhdGEsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hRGF0YShcbiAgc2NoZW1hLFxuICBkYXRhLFxuICBkYXRhUGF0aCxcbiAgcHJvY2Vzc2VkRGF0YSxcbiAgcHJvY2Vzc0JlZm9yZSxcbiAgcHJvY2Vzc0FmdGVyLFxuICBvcHRpb25zXG4pIHtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudHMgPSBjb21wb25lbnRzID0+IHtcbiAgICBjb25zdCBnZXREYXRhUGF0aCA9IChkYXRhUGF0aCwgdG9rZW4pID0+XG4gICAgICBkYXRhUGF0aCAhPSBudWxsXG4gICAgICAgID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHRva2VuKVxuICAgICAgICA6IG51bGxcblxuICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudHMpKSB7XG4gICAgICAgIGlmICghaXNOZXN0ZWQoY29tcG9uZW50U2NoZW1hKSkge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgZGF0YSBvbiB1bm5lc3RlZCBjb21wb25lbnRzLlxuICAgICAgICAgIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICBwcm9jZXNzQWZ0ZXIsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERhdGFQYXRoID0gZ2V0RGF0YVBhdGgoZGF0YVBhdGgsIG5hbWUpXG5cbiAgICAgICAgICBjb25zdCBwcm9jZXNzSXRlbSA9IChpdGVtLCBpbmRleCA9IG51bGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFQYXRoID1cbiAgICAgICAgICAgICAgaW5kZXggIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGdldERhdGFQYXRoKGNvbXBvbmVudERhdGFQYXRoLCBpbmRleClcbiAgICAgICAgICAgICAgICA6IGNvbXBvbmVudERhdGFQYXRoXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gRGl0b0NvbnRleHQuZ2V0KG9wdGlvbnMuY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgIHNjaGVtYTogY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICByb290RGF0YTogb3B0aW9ucy5yb290RGF0YVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IGdldEZvcm1zID0gKFxuICAgICAgICAgICAgICBnZXRUeXBlT3B0aW9ucyhjb21wb25lbnRTY2hlbWEpPy5nZXRGb3JtU2NoZW1hc0ZvclByb2Nlc3NpbmcgfHxcbiAgICAgICAgICAgICAgZ2V0Rm9ybVNjaGVtYXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGZvcm1zID0gZ2V0Rm9ybXMoY29tcG9uZW50U2NoZW1hLCBjb250ZXh0KVxuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zKGZvcm1zLCBpdGVtKVxuICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkSXRlbSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IGNsb25lSXRlbShjb21wb25lbnRTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSXRlbSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQmVmb3JlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEl0ZW1zIHdpdGhvdXQgZm9ybXMgc3RpbGwgZ2V0IGZ1bGx5IChidXQgc2hhbGxvd2x5KSBjbG9uZWQuXG4gICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IG9mIHRoaXMgaXMgYWN0dWFsbHkgbmVlZGVkIC8gdXNlZCBhdCBhbGw/XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW0gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHByb2Nlc3NCZWZvcmU/LihcbiAgICAgICAgICAgIGNvbXBvbmVudFNjaGVtYSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50RGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICAgICAgKVxuICAgICAgICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGEgPyBwcm9jZXNzZWREYXRhW25hbWVdIDogZGF0YVtuYW1lXVxuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGhhc0Zvcm1TY2hlbWEoY29tcG9uZW50U2NoZW1hKSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIG5lc3RlZCBmb3JtIGl0ZW1zLlxuICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogTm8gbmVlZCB0byBjb2xsZWN0IHZhbHVlcyBpZiB3ZSdyZSBub3QgY2xvbmluZyFcbiAgICAgICAgICAgICAgdmFsdWUgPSBwcm9jZXNzZWREYXRhXG4gICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICAgICAgOiB2YWx1ZS5mb3JFYWNoKHByb2Nlc3NJdGVtKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBwcm9jZXNzSXRlbSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWREYXRhKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9jZXNzQWZ0ZXI/LihcbiAgICAgICAgICAgIGNvbXBvbmVudFNjaGVtYSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50RGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc0NvbXBvbmVudHMoc2NoZW1hLmNvbXBvbmVudHMpXG4gIGZvciAoY29uc3QgdGFiIG9mIGdldEFsbFRhYlNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHRhYi5jb21wb25lbnRzKVxuICB9XG4gIGZvciAoY29uc3QgcGFuZWwgb2YgZ2V0QWxsUGFuZWxTY2hlbWFzKHNjaGVtYSkpIHtcbiAgICBwcm9jZXNzQ29tcG9uZW50cyhwYW5lbC5jb21wb25lbnRzKVxuICB9XG5cbiAgcmV0dXJuIHByb2Nlc3NlZERhdGEgfHwgZGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRTY2hlbWFzKHNjaGVtYXMsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHRvT2JqZWN0ID0gKGFycmF5LCB0b1NjaGVtYSkgPT4ge1xuICAgIHJldHVybiBhcnJheS5sZW5ndGggPiAwXG4gICAgICA/IGFycmF5LnJlZHVjZSgob2JqZWN0LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRvU2NoZW1hKHZhbHVlKVxuICAgICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICAgIG9iamVjdFtzY2hlbWEubmFtZV0gPVxuICAgICAgICAgICAgICBzY2hlbWEgJiYgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICA/IHsgLi4uZGVmYXVsdHMsIC4uLnNjaGVtYSB9XG4gICAgICAgICAgICAgICAgOiBzY2hlbWFcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iamVjdFxuICAgICAgICB9LCB7fSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIGlzQXJyYXkoc2NoZW1hcylcbiAgICA/IHRvT2JqZWN0KHNjaGVtYXMsIHZhbHVlID0+XG4gICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbmFtZTogY2FtZWxpemUodmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgKVxuICAgIDogaXNPYmplY3Qoc2NoZW1hcylcbiAgICAgID8gdG9PYmplY3QoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hcyksXG4gICAgICAgICAgKFtuYW1lLCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBpc09iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogaXNTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICApXG4gICAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1dHRvblNjaGVtYXMoYnV0dG9ucykge1xuICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKFxuICAgIGJ1dHRvbnMsXG4gICAgeyB0eXBlOiAnYnV0dG9uJyB9IC8vIERlZmF1bHRzXG4gIClcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZShzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHNjaGVtYU9yVHlwZSkgPyBzY2hlbWFPclR5cGUudHlwZSA6IHNjaGVtYU9yVHlwZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRUeXBlQ29tcG9uZW50KGdldFR5cGUoc2NoZW1hT3JUeXBlKSwgdHJ1ZSkgPz8gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVHlwZShzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIChcbiAgICBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpPy5nZXRTb3VyY2VUeXBlPy4oZ2V0VHlwZShzY2hlbWFPclR5cGUpKSA/P1xuICAgIG51bGxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyeShzY2hlbWEsIGRhdGFQYXRoID0gbnVsbCwgdGFiQ29tcG9uZW50ID0gbnVsbCkge1xuICByZXR1cm4gc2NoZW1hXG4gICAgPyB7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgLy8gSWYgdGhlIHBhbmVsIHByb3ZpZGVzIGl0cyBvd24gbmFtZSwgYXBwZW5kIGl0IHRvIHRoZSBkYXRhUGF0aC5cbiAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGUuZy4gZm9yICRmaWx0ZXJzIHBhbmVscy5cbiAgICAgICAgZGF0YVBhdGg6XG4gICAgICAgICAgZGF0YVBhdGggIT0gbnVsbCAmJiBzY2hlbWEubmFtZVxuICAgICAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgc2NoZW1hLm5hbWUpXG4gICAgICAgICAgICA6IGRhdGFQYXRoLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbmVsRW50cmllcyhcbiAgcGFuZWxTY2hlbWFzLFxuICBkYXRhUGF0aCA9IG51bGwsXG4gIHRhYkNvbXBvbmVudCA9IG51bGwsXG4gIHBhbmVsRW50cmllcyA9IFtdXG4pIHtcbiAgaWYgKHBhbmVsU2NoZW1hcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgc2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhwYW5lbFNjaGVtYXMpKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGdldFBhbmVsRW50cnkoXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgZGF0YVBhdGggIT0gbnVsbCA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBrZXkpIDogbnVsbCxcbiAgICAgICAgdGFiQ29tcG9uZW50XG4gICAgICApXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgcGFuZWxFbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYW5lbEVudHJpZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFRhYlNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiBzY2hlbWE/LnRhYnMgPyBPYmplY3QudmFsdWVzKHNjaGVtYS50YWJzKSA6IFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiBnZXRBbGxQYW5lbEVudHJpZXMoc2NoZW1hKS5tYXAoZW50cnkgPT4gZW50cnkuc2NoZW1hKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUGFuZWxFbnRyaWVzKFxuICBzY2hlbWEsXG4gIGRhdGFQYXRoID0gbnVsbCxcbiAgc2NoZW1hQ29tcG9uZW50ID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbFxuKSB7XG4gIGNvbnN0IHBhbmVsU2NoZW1hID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZ2V0UGFuZWxTY2hlbWE/LihcbiAgICBzY2hlbWEsXG4gICAgZGF0YVBhdGgsXG4gICAgc2NoZW1hQ29tcG9uZW50XG4gIClcbiAgY29uc3QgcGFuZWxFbnRyaWVzID0gcGFuZWxTY2hlbWFcbiAgICA/IFtnZXRQYW5lbEVudHJ5KHBhbmVsU2NoZW1hLCBkYXRhUGF0aCwgdGFiQ29tcG9uZW50KV1cbiAgICA6IFtdXG4gIC8vIEFsbG93IGVhY2ggY29tcG9uZW50IHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcGFuZWxzLCBpblxuICAvLyBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBvbmUgKGUuZy4gZ2V0RmlsdGVyc1BhbmVsKCksICRmaWx0ZXJzKTpcbiAgZ2V0UGFuZWxFbnRyaWVzKHNjaGVtYT8ucGFuZWxzLCBkYXRhUGF0aCwgdGFiQ29tcG9uZW50LCBwYW5lbEVudHJpZXMpXG4gIHJldHVybiBwYW5lbEVudHJpZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0U291cmNlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gZ2V0U291cmNlVHlwZShzY2hlbWFPclR5cGUpID09PSAnb2JqZWN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0U291cmNlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gZ2V0U291cmNlVHlwZShzY2hlbWFPclR5cGUpID09PSAnbGlzdCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgY29uc3QgaWQgPSBpdGVtW3NvdXJjZVNjaGVtYS5pZEtleSB8fCAnaWQnXVxuICByZXR1cm4gaWQgIT0gbnVsbCA/IFN0cmluZyhpZCkgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1VaWQoc291cmNlU2NoZW1hLCBpdGVtKSB7XG4gIC8vIFRyeSB0byB1c2UgdGhlIGl0ZW0gaWQgYXMgdGhlIHVpZCwgZmFsbGluZyBiYWNrIG9uIGF1dG8tZ2VuZXJhdGVkIGlkcywgYnV0XG4gIC8vIGVpdGhlciB3YXksIHBhc3MgdGhyb3VnaCBgZ2V0VWlkKClgIHNvIHRoYXQgdGhlIGlkcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAvLyBpdGVtIHRocm91Z2ggYSB3ZWFrIG1hcCwgYXMgdGhlIGlkcyBjYW4gYmUgZmlsdGVyZWQgb3V0IGluIGBwcm9jZXNzRGF0YSgpYFxuICAvLyB3aGlsZSB0aGUgY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgdWlkcyBhcyBrZXkgYXJlIHN0aWxsIHZpc2libGUuXG4gIHJldHVybiBnZXRVaWQoaXRlbSwgZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkpXG59XG4iLCIvLyBBIG1pbmktcmVwbGljYXRpb24gb2YgdnVlJ3MgaW50ZXJuYWwgYHJlc29sdmVNZXJnZWRPcHRpb25zKClgIGJ1dCBvbmx5XG4vLyBoYW5kbGluZyBvdXIgb3duIGFkZGVkIG9wdGlvbnMgcHJvcGVydGllcyBhbmQgbWVyZ2luZyB0aGVtIGVhcmx5IGluc3RlYWRcbi8vIG9mIGxhemlseS5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNZXJnZWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgY29uc3QgeyBtaXhpbnMgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIG1peGlucyB8fCBvcHRpb25zLmV4dGVuZHNcbiAgICA/IG1lcmdlT3B0aW9ucyhcbiAgICAgICAgeyAuLi5vcHRpb25zIH0sXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICA6IG9wdGlvbnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAoZnJvbS5leHRlbmRzKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBmcm9tLmV4dGVuZHMpXG4gIH1cbiAgaWYgKGZyb20ubWl4aW5zKSB7XG4gICAgZm9yIChjb25zdCBtaXhpbiBvZiBmcm9tLm1peGlucykge1xuICAgICAgbWVyZ2VPcHRpb25zKHRvLCBtaXhpbilcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgZGl0b09wdGlvbktleXMpIHtcbiAgICBpZiAoa2V5IGluIGZyb20pIHtcbiAgICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbmNvbnN0IGRpdG9PcHRpb25LZXlzID0gW1xuICAnZGVmYXVsdFZhbHVlJyxcbiAgJ2RlZmF1bHROZXN0ZWQnLFxuICAnZGVmYXVsdFZpc2libGUnLFxuICAnZ2VuZXJhdGVMYWJlbCcsXG4gICdleGNsdWRlVmFsdWUnLFxuICAnaWdub3JlTWlzc2luZ1ZhbHVlJyxcbiAgJ2FsaWduQm90dG9tJyxcbiAgJ29taXRQYWRkaW5nJyxcbiAgJ3Byb2Nlc3NWYWx1ZScsXG4gICdwcm9jZXNzU2NoZW1hJyxcbiAgJ2dldFBhbmVsU2NoZW1hJyxcbiAgJ2dldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZycsXG4gIC8vIFZ1ZSAzIC8gVnVlLXJvdXRlciA0IGZvcmdldHMgdGhlc2UuXG4gIC8vIFRPRE86IENyZWF0ZSBidWctcmVwb3J0P1xuICAnYmVmb3JlUm91dGVVcGRhdGUnLFxuICAnYmVmb3JlUm91dGVMZWF2ZSdcbl1cbiIsImltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi9taXhpbnMvRGl0b01peGluLmpzJ1xuaW1wb3J0IHsgZ2V0VHlwZUNvbXBvbmVudCB9IGZyb20gJy4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZU1lcmdlZE9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL29wdGlvbnMuanMnXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgY29tcG9uZW50cyA9IHt9XG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RpdG9NaXhpbl0sXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IHJlZ2lzdGVyZWQgY29tcG9uZW50cyBhcmUgcHJlc2VudCBpbiBhbGwgRGl0b0NvbXBvbmVudC5cbiAgY29tcG9uZW50cyxcblxuICBjb21wb25lbnQobmFtZSwgZGVmaW5pdGlvbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChkZWZpbml0aW9uKSkge1xuICAgICAgICBkZWZpbml0aW9uID0gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoe1xuICAgICAgICAgIGV4dGVuZHM6IHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAuLi5kZWZpbml0aW9uXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb21wb25lbnRzW25hbWVdID0gZGVmaW5pdGlvblxuICAgIH1cbiAgICBpZiAoIShuYW1lIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBub3QgcmVnaXN0ZXJlZGApXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRzW25hbWVdXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFR5cGVDb21wb25lbnRcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b1VzZXIge1xuICBoYXNSb2xlKC4uLnJvbGVzKSB7XG4gICAgaWYgKHRoaXMucm9sZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgICBpZiAodGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRzY2hlbWFQYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1hQ29tcG9uZW50czogW11cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtYWluU2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50c1swXVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGBEaXRvU2NoZW1hLmNyZWF0ZWQoKS91bm1vdW50ZWQoKWAgb24gaXRzXG4gICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnRgLCBpZiB0aGUgcGFyZW50IHVzZXMgdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHNjaGVtYUNvbXBvbmVudCwgYWRkKSB7XG4gICAgICBjb25zdCB7IHNjaGVtYUNvbXBvbmVudHMgfSA9IHRoaXNcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5wdXNoKHNjaGVtYUNvbXBvbmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYUNvbXBvbmVudHMuc3BsaWNlKHNjaGVtYUNvbXBvbmVudHMuaW5kZXhPZihzY2hlbWFDb21wb25lbnQpLCAxKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNjaGVtYVBhcmVudE1peGluIGZyb20gJy4vU2NoZW1hUGFyZW50TWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW1NjaGVtYVBhcmVudE1peGluXSxcblxuICBjb21wdXRlZDoge1xuICAgIGVycm9ycygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMucmVkdWNlKFxuICAgICAgICAocmVzdWx0LCB7IGVycm9ycyB9KSA9PlxuICAgICAgICAgIGVycm9ycyAmJiByZXN1bHQgPyByZXN1bHQuY29uY2F0KGVycm9ycykgOiBlcnJvcnMsXG4gICAgICAgIG51bGxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNUb3VjaGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuc29tZShpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQuaXNWYWxpZClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkgPSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LnZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkpKVxuICAgIH0sXG5cbiAgICB2ZXJpZnlBbGwobWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmVyaWZ5QWxsKG1hdGNoKSlcbiAgICB9LFxuXG4gICAgcmVzZXRWYWxpZGF0aW9uKCkge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnRzLmZvckVhY2goaXQgPT4gaXQucmVzZXRWYWxpZGF0aW9uKCkpXG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnRzLmZvckVhY2goaXQgPT4gaXQuY2xlYXJFcnJvcnMoKSlcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnRzLmZvckVhY2goXG4gICAgICAgIGl0ID0+IGl0LnNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgZm9jdXMpXG4gICAgICApXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0Q29tbW9uUHJlZml4IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdG9yTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyb3V0ZUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRWFjaCByb3V0ZS1jb21wb25lbnQgZGVmaW5lcyBhIHN0b3JlIHRoYXQgZ2V0cyBwYXNzZWQgb24gdG8gaXRzXG4gICAgICAvLyBjaGlsZCBjb21wb25lbnRzLCBzbyB0aGV5IGNhbiBzdG9yZSB2YWx1ZXMgaW4gdGhlbSB0aGF0IGxpdmUgYmV5b25kXG4gICAgICAvLyB0aGVpciBsaWZlLWN5Y2xlLiBTZWU6IERpdG9QYW5lLCBTb3VyY2VNaXhpblxuICAgICAgc3RvcmU6IHt9LFxuICAgICAgbG9hZENhY2hlOiB7fSAvLyBTZWUgVHlwZU1peGluLmxvYWQoKVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgLy8gT3ZlcnJpZGUgRGl0b01peGluJ3Mgcm91dGVDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHJvdXRlTGV2ZWwoKSB7XG4gICAgICBsZXQgbGV2ZWwgPSAwXG4gICAgICBsZXQgcm91dGVDb21wb25lbnQgPSB0aGlzXG4gICAgICB3aGlsZSAoKHJvdXRlQ29tcG9uZW50ID0gcm91dGVDb21wb25lbnQucGFyZW50Q29tcG9uZW50LnJvdXRlQ29tcG9uZW50KSkge1xuICAgICAgICBsZXZlbCsrXG4gICAgICB9XG4gICAgICByZXR1cm4gbGV2ZWxcbiAgICB9LFxuXG4gICAgcm91dGVSZWNvcmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUubWF0Y2hlZFt0aGlzLnJvdXRlTGV2ZWxdXG4gICAgfSxcblxuICAgIGlzTGFzdFJvdXRlKCkge1xuICAgICAgLy8gUmV0dXJucyB0cnVlIHdoZW4gdGhpcyByb3V0ZXIgY29tcG9uZW50IGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm91dGUuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVJlY29yZCA9PT0gbWF0Y2hlZFttYXRjaGVkLmxlbmd0aCAtIDFdXG4gICAgfSxcblxuICAgIGlzTGFzdFVubmVzdGVkUm91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZSB0aGF0XG4gICAgICAvLyBuZWVkcyBpdHMgb3duIHJvdXRlci12aWV3ICg9IGlzIG5vdCBuZXN0ZWQpLlxuICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgZm9yIChsZXQgaSA9IG1hdGNoZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gbWF0Y2hlZFtpXVxuICAgICAgICBpZiAoIXJlY29yZC5tZXRhLm5lc3RlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSByZWNvcmRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGlzTmVzdGVkUm91dGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLm5lc3RlZFxuICAgIH0sXG5cbiAgICBpc1ZpZXcoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgbWV0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkPy5tZXRhXG4gICAgfSxcblxuICAgIHBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSb3V0ZVBhdGgodGhpcy5yb3V0ZVJlY29yZC5wYXRoKVxuICAgIH0sXG5cbiAgICBsYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iKCkge1xuICAgICAgY29uc3QgeyBicmVhZGNydW1iIH0gPSB0aGlzLnNjaGVtYSB8fCB7fVxuICAgICAgcmV0dXJuIGJyZWFkY3J1bWIgfHwgYCR7dGhpcy5icmVhZGNydW1iUHJlZml4fSAke3RoaXMubGFiZWx9YFxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iUHJlZml4KCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfSxcblxuICAgIHBhcmFtKCkge1xuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdnVlLXJvdXRlciBub3QgYmVpbmcgYWJsZSB0byBtYXAgbXVsdGlwbGUgdXJsIHBhcmFtZXRlcnNcbiAgICAgIC8vIHdpdGggdGhlIHNhbWUgbmFtZSB0byBtdWx0aXBsZSBjb21wb25lbnRzLCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhcmFtc1t0aGlzLm1ldGE/LnBhcmFtXSB8fCBudWxsXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZSwgc2VlIERpdG9Gb3JtXG4gICAgaXNNdXRhdGluZygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVSb3V0ZVVwZGF0ZSh0bywgZnJvbSwgbmV4dCkge1xuICAgIHRoaXM/LmJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KVxuICB9LFxuXG4gIGJlZm9yZVJvdXRlTGVhdmUodG8sIGZyb20sIG5leHQpIHtcbiAgICB0aGlzPy5iZWZvcmVSb3V0ZUNoYW5nZSh0bywgZnJvbSwgbmV4dClcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIC8vIEtlZXAgYSBzaGFyZWQgc3RhY2sgb2Ygcm9vdCBjb21wb25lbnRzIGZvciBEaXRvVHJhaWwgdG8gdXNlIHRvIHJlbmRlclxuICAgIC8vIGxhYmVscy4gQ2FuJ3QgcmVseSBvbiAkcm91dGUubWF0Y2hlZFtpXS5pbnN0YW5jZXMuZGVmYXVsdCB1bmZvcnR1bmF0ZWx5LFxuICAgIC8vIGFzIGluc3RhbmNlcyBhcmVuJ3QgaW1tZWRpYXRlbHkgcmVhZHksIGFuZCBpbnN0YW5jZXMgaXMgbm90IHJlYWN0aXZlLlxuICAgIHRoaXMuYXBwU3RhdGUucm91dGVDb21wb25lbnRzLnB1c2godGhpcylcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgY29uc3QgeyByb3V0ZUNvbXBvbmVudHMgfSA9IHRoaXMuYXBwU3RhdGVcbiAgICByb3V0ZUNvbXBvbmVudHMuc3BsaWNlKHJvdXRlQ29tcG9uZW50cy5pbmRleE9mKHRoaXMpLCAxKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBiZWZvcmVSb3V0ZUNoYW5nZSh0bywgZnJvbSwgbmV4dCkge1xuICAgICAgbGV0IG9rID0gdHJ1ZVxuICAgICAgY29uc3QgaXNDbG9zaW5nID0gKFxuICAgICAgICAvLyBPbmx5IGhhbmRsZSB0aGlzIHJvdXRlIGNoYW5nZSBpZiB0aGUgZm9ybSBpcyBhY3R1YWxseSBtYXBwZWQgdG8gdGhlXG4gICAgICAgIC8vIGBmcm9tYCByb3V0ZSwgYnV0IGluY2x1ZGUgcGFyZW50IGZvcm1zIG9mIGNsb3NpbmcgbmVzdGVkIGZvcm1zIGFzIGFzXG4gICAgICAgIC8vIHdlbGwsIGJ5IG1hdGNoaW5nIHRoZSB0aGUgc3RhcnQgb2YgZnJvbS90byBwYXRoIGFnYWluc3QgYHRoaXMucGF0aGA6XG4gICAgICAgIGZyb20ucGF0aC5zdGFydHNXaXRoKHRoaXMucGF0aCkgJiZcbiAgICAgICAgIXRvLnBhdGguc3RhcnRzV2l0aCh0aGlzLnBhdGgpICYmXG4gICAgICAgIC8vIEV4Y2x1ZGUgaGFzaCBjaGFuZ2VzIG9ubHkgKD0gdGFiIGNoYW5nZXMpOlxuICAgICAgICBmcm9tLnBhdGggIT09IHRvLnBhdGggJiYgKFxuICAgICAgICAgIHRoaXMuaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pIHx8XG4gICAgICAgICAgLy8gRGVjaWRlIGlmIHdlJ3JlIG1vdmluZyB0b3dhcmRzIGEgbmV3IG5lc3RlZCBmb3JtLCBvciBjbG9zaW5nIC9cbiAgICAgICAgICAvLyByZXBsYWNpbmcgYW4gYWxyZWFkeSBvcGVuIG9uZSBieSBjb21wYXJpbmcgcGF0aCBsZW5ndGhzLlxuICAgICAgICAgIC8vIFRoZSBjYXNlIG9mIGA9YCBtYXRjaGVzIHRoZSByZXBsYWNpbmcgb2YgYW4gYWxyZWFkeSBvcGVuIG9uZS5cbiAgICAgICAgICB0by5wYXRoLmxlbmd0aCA8PSBmcm9tLnBhdGgubGVuZ3RoXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIGlmIChpc0Nsb3NpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdXRhdGluZykge1xuICAgICAgICAgIC8vIEZvciBhY3RpdmUgZGlyZWN0bHkgbXV0YXRpbmcgKG5lc3RlZCkgZm9ybXMgdGhhdCB3ZXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgICAvLyB5ZXQsIHZhbGlkYXRlIHRoZW0gb25jZS4gSWYgdGhlIHVzZXIgdGhlbiBzdGlsbCB3YW50cyB0byBsZWF2ZVxuICAgICAgICAgIC8vIHRoZW0sIHRoZXkgY2FuIGNsaWNrIGNsb3NlIC8gbmF2aWdhdGUgYXdheSBhZ2Fpbi5cbiAgICAgICAgICBvayA9IChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZGF0ZWQgfHxcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVBbGwoKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgZm9ybSBkb2Vzbid0IGRpcmVjdGx5IG11dGF0ZSBkYXRhLiBJZiBpdCBpcyBkaXJ0eSwgYXNrIGlmIHVzZXJcbiAgICAgICAgICAvLyB3YW50cyB0byBwZXJzaXN0IGRhdGEgZmlyc3QuXG4gICAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSkge1xuICAgICAgICAgICAgb2sgPSB3aW5kb3cuY29uZmlybShcbiAgICAgICAgICAgICAgYFlvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gRG8geW91IHJlYWxseSB3YW50IHRvICR7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJicy5jYW5jZWxcbiAgICAgICAgICAgICAgfT9gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXh0KG9rKVxuICAgIH0sXG5cbiAgICBnZXRSb3V0ZVBhdGgodGVtcGxhdGVQYXRoKSB7XG4gICAgICAvLyBNYXBzIHRoZSByb3V0ZSdzIGFjdHVhbCBwYXRoIHRvIHRoZSBtYXRjaGVkIHJvdXRlcyBieSBjb3VudGluZyBpdHNcbiAgICAgIC8vIHBhcnRzIHNlcGFyYXRlZCBieSAnLycsIHNwbGl0dGluZyB0aGUgcGF0aCBpbnRvIHRoZSBtYXBwZWQgcGFydHNcbiAgICAgIC8vIGNvbnRhaW5pbmcgYWN0dWFsIHBhcmFtZXRlcnMuXG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucGF0aFxuICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAuc2xpY2UoMCwgdGVtcGxhdGVQYXRoLnNwbGl0KCcvJykubGVuZ3RoKVxuICAgICAgICAuam9pbignLycpXG4gICAgfSxcblxuICAgIGdldENoaWxkUGF0aChwYXRoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wYXRofS8ke3BhdGh9YFxuICAgIH0sXG5cbiAgICBpc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkge1xuICAgICAgLy8gVGhlIHJvdXRlIHBhdGggaXMgdGhlIHBhdGggdXAgdG8gdGhlIGZpcnN0IC8gKGV4Y2x1ZGluZyB0aGUgaW5pdGlhbCAvKTpcbiAgICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5wYXRoLm1hdGNoKC9eKFxcL1teL10qKS8pWzFdXG4gICAgICByZXR1cm4gIWdldENvbW1vblByZWZpeCh0by5wYXRoLCBmcm9tLnBhdGgpLnN0YXJ0c1dpdGgocm9vdFBhdGgpXG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGVtcGxhdGUoXG4gIHYtaWY9XCJ1c2VyXCJcbilcbiAgLy8tIE9ubHkgcmVuZGVyIERpdG9WaWV3IHdoZW4gaXQgaXMgYWN0aXZlLCBvdGhlcndpc2UgYSBub3JtYWwgcm91dGVyLXZpZXdcbiAgLy8tIGluc3RlYWQsIHRvIG5lc3QgZnVydGhlciByb3V0ZSBjb21wb25lbnRzLlxuICAvLy0gTk9URTogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaGFuZGxpbmcgaW4gRGl0b0Zvcm0sIHdoZXJlIGB2LXNob3dgIGlzXG4gIC8vLSB1c2VkIHRvIGFsd2F5cyByZW5kZXIgZm9ybXMgZXZlbiB3aGVuIG90aGVyIG5lc3RlZCBmb3JtcyBhcmUgcHJlc2VudC5cbiAgUm91dGVyVmlldyhcbiAgICB2LWlmPVwiIWlzTGFzdFJvdXRlXCJcbiAgICA6a2V5PVwibmFtZVwiXG4gIClcbiAgLmRpdG8tdmlldy5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgdi1lbHNlLWlmPVwic2hvdWxkUmVuZGVyKHZpZXdTY2hlbWEpXCJcbiAgICA6ZGF0YS1yZXNvdXJjZT1cInNvdXJjZVNjaGVtYS5wYXRoXCJcbiAgKVxuICAgIERpdG9TY2hlbWEuZGl0by1zY3JvbGwoXG4gICAgICA6c2NoZW1hPVwidmlld1NjaGVtYVwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUobmFtZSlcIlxuICAgICAgOmRpc2FibGVkPVwiaXNMb2FkaW5nXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImZhbHNlXCJcbiAgICAgIDptZW51SGVhZGVyPVwidHJ1ZVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUm91dGVNaXhpbiBmcm9tICcuLi9taXhpbnMvUm91dGVNaXhpbi5qcydcbmltcG9ydCB7IHNvbWVTY2hlbWFDb21wb25lbnQsIGlzU2luZ2xlQ29tcG9uZW50VmlldyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGhhc1Jlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1ZpZXcnLCB7XG4gIG1peGluczogW1JvdXRlTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgLy8gUmVkaXJlY3QgJHNvdXJjZUNvbXBvbmVudCBhbmQgJHJlc291cmNlQ29tcG9uZW50IHRvIHRoZSBtYWluIGNvbXBvbmVudDpcbiAgICByZXR1cm4ge1xuICAgICAgJHNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcy5tYWluQ29tcG9uZW50Py5zb3VyY2VDb21wb25lbnQgfHwgbnVsbCxcbiAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcy5tYWluQ29tcG9uZW50Py5yZXNvdXJjZUNvbXBvbmVudCB8fCBudWxsXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFVwZGF0ZWQgZnJvbSBMb2FkaW5nTWl4aW4gdGhyb3VnaCBgc2V0TG9hZGluZyhpc0xvYWRpbmcpYDpcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAvLyBOT1RFOiBEYXRhIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHZpZXdzIGJlY2F1c2UgdGhlIHJvdXRlciByZWN5Y2xlcyB0aGVcbiAgICAgIC8vIERpdG9WaWV3IGNvbXBvbmVudC5cbiAgICAgIGRhdGE6IHt9XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YS5zY2hlbWFcbiAgICB9LFxuXG4gICAgbmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5uYW1lXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIGlzU2luZ2xlQ29tcG9uZW50VmlldygpIHtcbiAgICAgIHJldHVybiBpc1NpbmdsZUNvbXBvbmVudFZpZXcodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIG1haW5Db21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudEJ5RGF0YVBhdGgodGhpcy5uYW1lKVxuICAgIH0sXG5cbiAgICB2aWV3U2NoZW1hKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnQsIC4uLnNjaGVtYSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIC8vIFRyYW5zbGF0ZSBzaW5nbGUtY29tcG9uZW50IHNjaGVtYXMgaW50byBtdWx0aS1jb21wb25lbnQgc2NoZW1hcyxcbiAgICAgIC8vIHNvIHRoZXkgY2FuIGJlIHJlbmRlcmVkIGRpcmVjdGx5IHRocm91Z2ggRGl0b1NjaGVtYSBhbHNvOlxuICAgICAgcmV0dXJuIHRoaXMuaXNTaW5nbGVDb21wb25lbnRWaWV3XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICBbc2NoZW1hLm5hbWVdOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2NoZW1hLm5hbWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHNjaGVtYVxuICAgIH0sXG5cbiAgICBwcm92aWRlc0RhdGEoKSB7XG4gICAgICByZXR1cm4gc29tZVNjaGVtYUNvbXBvbmVudCh0aGlzLnZpZXdTY2hlbWEsIGhhc1Jlc291cmNlKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgLy8gU2VlIGlmIHRoZSByb3V0ZSBjaGFuZ2VzIGNvbXBsZXRlbHksIGFuZCBjbGVhciB0aGUgZGF0YSBpZiBpdCBkb2VzLlxuICAgICAgaWYgKHRoaXMuaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5kYXRhID0ge31cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIH0sXG5cbiAgICBnZXRDaGlsZFBhdGgocGF0aCkge1xuICAgICAgLy8gTGlzdHMgaW5zaWRlIHNpbmdsZS1jb21wb25lbnQgdmlld3MgdXNlIHRoZSB2aWV3J3MgcGF0aCBmb3Igc3ViLXBhdGhzOlxuICAgICAgcmV0dXJuIHRoaXMuaXNTaW5nbGVDb21wb25lbnRWaWV3XG4gICAgICAgID8gdGhpcy5wYXRoXG4gICAgICAgIDogYCR7dGhpcy5wYXRofS8ke3BhdGh9YFxuICAgIH0sXG5cbiAgICBzZXRMb2FkaW5nKGlzTG9hZGluZykge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IHsgaXNEYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlEYXRlKGRhdGUsIHtcbiAgeWVhciA9IGRhdGU/LmdldEZ1bGxZZWFyKCkgPz8gMCxcbiAgbW9udGggPSBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gIGRheSA9IGRhdGU/LmdldERhdGUoKSA/PyAwLFxuICBob3VyID0gZGF0ZT8uZ2V0SG91cnMoKSA/PyAwLFxuICBtaW51dGUgPSBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgc2Vjb25kID0gZGF0ZT8uZ2V0U2Vjb25kcygpID8/IDAsXG4gIG1pbGxpc2Vjb25kID0gZGF0ZT8uZ2V0TWlsbGlzZWNvbmRzKCkgPz8gMFxufSA9IHt9KSB7XG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGF0ZShkYXRlKSB7XG4gIHJldHVybiBpc0RhdGUoZGF0ZSkgPyBkYXRlIDogZGF0ZSA/IG5ldyBEYXRlKGRhdGUpIDogbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jYWxlbmRhclxuICAuZGl0by1jYWxlbmRhci1wb3B1cFxuICAgIC5kaXRvLWNhbGVuZGFyLWlubmVyXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImN1cnJlbnRNb2RlID09PSAnZGF5J1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogMSB9KSB9fVxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1tb250aChcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgnbW9udGgnKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgbW9udGg6IDEgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItd2Vla2RheXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwid2Vla2RheSBpbiB3ZWVrZGF5TmFtZXNcIlxuICAgICAgICAgICAgKSB7eyB3ZWVrZGF5LnNob3J0IH19XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItZGF0ZXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiZGF0ZSBpbiBkYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJkYXRlLnN0YXRlICYmIGBkaXRvLWNhbGVuZGFyLWl0ZW0tJHtkYXRlLnN0YXRlfWBcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKGRhdGUuZGF0ZSwgZGF0ZS5zdGF0ZSwgdHJ1ZSlcIlxuICAgICAgICAgICAgKSB7eyBkYXRlLnRleHQgfX1cbiAgICAgICAgLmRpdG8tY2FsZW5kYXItZm9vdGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC10b2RheShcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOnRpdGxlPVwiZGF0ZVRvU3RyaW5nKG5ldyBEYXRlKCksIHsgeWVhcjogMSwgbW9udGg6IDEsIGRheTogMSB9KVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICdtb250aCdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IDEgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLW1vbnRoc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCIobW9udGgsIGluZGV4KSBpbiBtb250aE5hbWVzXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0TW9udGhDbGFzcyhpbmRleClcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RNb250aChpbmRleClcIlxuICAgICAgICAgICAgKSB7eyBtb250aC5zaG9ydCB9fVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAneWVhcidcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuIHt7IGRlY2FkZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXIteWVhcnNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwieWVhciBpbiB5ZWFyUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRZZWFyQ2xhc3MoeWVhcilcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICkge3sgeWVhciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGNvcHlEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RheScgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyB3ZWVrZGF5TmFtZXMsIG1vbnRoTmFtZXMgfSA9IGdldExvY2FsZU5hbWVzKHRoaXMubG9jYWxlKVxuICAgIHJldHVybiB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzLFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcbiAgICAgIHllYXJSYW5nZTogW10sXG4gICAgICBjdXJyZW50VmFsdWU6IChcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlIHx8XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB1c2UgY3VycmVudCBkYXRlIGJ1dCBjbGVhciB0aW1lIGZpZWxkczpcbiAgICAgICAgY29weURhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgICksXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5tb2RlXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0byB8fCBuZXcgRGF0ZSgpXG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGRpc2FibGVkRGF0ZTogJ3VwZGF0ZURhdGVSYW5nZScsXG5cbiAgICBtb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNb250aENsYXNzKG1vbnRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiZcbiAgICAgICAgICBtb250aCA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldE1vbnRoKCkgJiZcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiBtb250aCA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRZZWFyQ2xhc3MoeWVhcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmIHllYXIgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IHllYXIgPT09IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0RGF0ZShvdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gY29weURhdGUodGhpcy5jdXJyZW50VmFsdWUsIG92ZXJyaWRlcylcbiAgICB9LFxuXG4gICAgc3RlcERlY2FkZShzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIDEwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZXRNb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfSxcblxuICAgIHN0ZXBNb250aChzdGVwKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeyB5ZWFyLCBtb250aCB9ID0gdGhpcy5nZXRZZWFyTW9udGgoXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXBcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXk6IE1hdGgubWluKFxuICAgICAgICAgIHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpLFxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldERhdGUoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzdGVwWWVhcihzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0RGF0ZShkYXRlLCBzdGF0ZSwgY29weSA9IGZhbHNlKSB7XG4gICAgICBpZiAoc3RhdGUgIT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgbW9udGg6IGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRheTogZGF0ZS5nZXREYXRlKClcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlbGVjdE1vbnRoKG1vbnRoKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAvLyBTZXQgZGF5IHRvIDEgdG8gYXZvaWQgc2VsZWN0aW5nIGEgZGF0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlXG4gICAgICAvLyBuZXcgbW9udGgsIGUuZy4gRmViIDMxIC0+IE1hciAzLlxuICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGgsIGRheTogMSB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3RZZWFyKHllYXIpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgdGhpcy5zZXREYXRlKHsgeWVhciB9KVxuICAgIH0sXG5cbiAgICBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgIHllYXIrK1xuICAgICAgICBtb250aCA9IDBcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG4gICAgICAgIHllYXItLVxuICAgICAgICBtb250aCA9IDExXG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyLCBtb250aCB9XG4gICAgfSxcblxuICAgIGRhdGVUb1N0cmluZyhkYXRlLCB7IHllYXIsIG1vbnRoLCBkYXkgfSkge1xuICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgeWVhcjogeWVhciAmJiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiBtb250aCAmJiAnbG9uZycsXG4gICAgICAgIGRheTogZGF5ICYmICdudW1lcmljJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZGVjYWRlVG9TdHJpbmcoZGF0ZSkge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICAgICAgcmV0dXJuIGAke3llYXJ9IOKAkyAke3llYXIgKyA5fWBcbiAgICB9LFxuXG4gICAgZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKVxuICAgIH0sXG5cbiAgICBnZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKSB7XG4gICAgICBjb25zdCB5ZWFyU3RyID0geWVhci50b1N0cmluZygpXG4gICAgICByZXR1cm4gK2Ake3llYXJTdHIuc2xpY2UoMCwgLTEpfTBgXG4gICAgfSxcblxuICAgIG5hdmlnYXRlKHsgaG9yLCB2ZXIsIGVudGVyIH0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudE1vZGUsIGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgaWYgKGhvciB8fCB2ZXIpIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50TW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICAgICAgICBkYXk6IGN1cnJlbnRWYWx1ZS5nZXREYXRlKCkgKyBob3IgKyB2ZXIgKiA3XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICAgICAgICBtb250aDogY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBob3IgKyB2ZXIgKiA2XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIHllYXI6IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgaG9yICsgdmVyICogNVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50TW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZURhdGVSYW5nZSgpIHtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW11cbiAgICAgIHRoaXMueWVhclJhbmdlID0gW11cblxuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgY29uc3QgbW9udGggPSBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlLnB1c2goc3RhcnRZZWFyICsgaSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICBsZXQgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG4gICAgICAgIGZpcnN0RGF5V2VlayA9IDdcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggLSAxKVxuICAgICAgICBjb25zdCBwcmV2TW9udGhOdW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aChcbiAgICAgICAgICBwcmV2TW9udGgueWVhcixcbiAgICAgICAgICBwcmV2TW9udGgubW9udGhcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpcnN0RGF5V2VlazsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcHJldk1vbnRoTnVtRGF5cyAtIGZpcnN0RGF5V2VlayArIGkgKyAxXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZXZNb250aC55ZWFyLCBwcmV2TW9udGgubW9udGgsIGRheSlcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGRheSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bURheXM7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGkpXG4gICAgICAgIGNvbnN0IGlzRGF5ID0gZGF0ZSA9PiAoXG4gICAgICAgICAgZGF0ZSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID09PSBpICYmXG4gICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBtb250aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNEYXkodGhpcy5tb2RlbFZhbHVlKVxuICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICA6IGlzRGF5KHRvZGF5KVxuICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICA6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpXG4gICAgICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgICA6IGlzRGF5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgICAgICA/ICdjdXJyZW50J1xuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoXG4gICAgICBpZiAobmV4dE1vbnRoTmVlZCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgaSlcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbG9jYWxlTmFtZXMgPSB7fVxuXG4vLyBDYWxsaW5nIGB0b0xvY2FsZVN0cmluZygpYCB0aGlzIG11Y2ggYXBwZWFycyB0byBiZSBleHBlbnNpdmUsIHNvIGNhY2hlIGl0OlxuZnVuY3Rpb24gZ2V0TG9jYWxlTmFtZXMobG9jYWxlKSB7XG4gIGxldCBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV1cbiAgaWYgKCFuYW1lcykge1xuICAgIGNvbnN0IHdlZWtkYXlOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCAwLCBpKVxuICAgICAgd2Vla2RheU5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBtb250aE5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgaSwgMClcbiAgICAgIG1vbnRoTmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdID0ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lc1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXNcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNhbGVuZGFyIHtcbiAgbWluLXdpZHRoOiAyNDBweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmRpdG8tY2FsZW5kYXItcG9wdXAge1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB6LWluZGV4OiAxMDAwO1xufVxuXG4uZGl0by1jYWxlbmRhci1ib2R5IHtcbiAgcGFkZGluZzogMCAwLjVlbTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDcpO1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBsaW5lLWhlaWdodDogY2FsYygjeyRpbnB1dC1oZWlnaHR9IC0gMnB4KTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLXRvZGF5IHtcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlIHtcbiAgICAmLFxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkLFxuICAuZGl0by1jYWxlbmRhci1pdGVtLWdyYXkge1xuICAgIGNvbG9yOiAjOTk5OTk5O1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLW1vbnRocyxcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHtcbiAgc3BhbiB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDQpO1xuICAgIG1hcmdpbjogMC41ZW0gMDtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDUpO1xufVxuXG4uZGl0by1jYWxlbmRhciBhLFxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHNwYW4ge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgYSB7XG4gICAgcGFkZGluZzogMCAwLjJlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXI6bm90KDpob3ZlcikgLmRpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50IHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItd2Vla2RheXMgc3BhbiB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyLFxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgQGV4dGVuZCAlaW5wdXQtaGVpZ2h0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBib3JkZXItdG9wOiAkYm9yZGVyLXN0eWxlO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgZGlzcGxheTogZmxleDtcblxuICA+IHNwYW4ge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuICB9XG5cbiAgYSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYsXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA1JTtcbiAgbWluLXdpZHRoOiAyZW07XG4gIG1heC13aWR0aDogM2VtO1xuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuSc7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8KrJztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuic7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8K7JztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zZWxlY3QtdG9kYXkge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ05vdyc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJleHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRzKHRhcmdldCwgZXZlbnRzKSB7XG4gIGZvciAoY29uc3QgdHlwZSBpbiBldmVudHMpIHtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudHNbdHlwZV0sIGZhbHNlKVxuICB9XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cykge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudHNbdHlwZV0sIGZhbHNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgMzc6ICdsZWZ0JyxcbiAgICAzODogJ3VwJyxcbiAgICAzOTogJ3JpZ2h0JyxcbiAgICA0MDogJ2Rvd24nLFxuICAgIDEzOiAnZW50ZXInXG4gIH1bZXZlbnQua2V5Q29kZV1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleU5hdmlnYXRpb24oZXZlbnQpIHtcbiAgY29uc3Qga2V5ID0gZ2V0S2V5KGV2ZW50KVxuICByZXR1cm4ge1xuICAgIGhvcjogeyBsZWZ0OiAtMSwgcmlnaHQ6IDEgfVtrZXldIHx8IDAsXG4gICAgdmVyOiB7IHVwOiAtMSwgZG93bjogMSB9W2tleV0gfHwgMCxcbiAgICBlbnRlcjoga2V5ID09PSAnZW50ZXInXG4gIH1cbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJpZ2dlci1jb250YWluZXJcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWlmPVwiYWx3YXlzU2hvd1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnY2xpY2snXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnZm9jdXMnIHx8IHRyaWdnZXIgPT09ICdhbHdheXMnXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICBUcmFuc2l0aW9uKDpuYW1lPVwidHJhbnNpdGlvblwiKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWVsc2VcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGlzU3RyaW5nLCBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnNob3cnXSxcblxuICBwcm9wczoge1xuICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tJyB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjdXN0b21DbGFzczogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB6SW5kZXg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAga2VlcEluVmlldzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGlkZVdoZW5DbGlja091dHNpZGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGFsd2F5c1Nob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb3ZlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGhpZGVEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpZ2dlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tdHJpZ2dlci1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdXBDbGFzcygpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgIFtgZGl0by1wb3B1cC0ke2h5cGhlbmF0ZSh0aGlzLnBsYWNlbWVudCl9YF06IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICAgIGNsYXNzZXNbdGhpcy5jdXN0b21DbGFzc10gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBwb3B1cFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID8gYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCA6ICcnXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3cgfHwgdGhpcy5hbHdheXNTaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgICBpZiAodG8pIHtcbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdHJpZ2dlci5xdWVyeVNlbGVjdG9yKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICB0aGlzLmZvY3VzRXZlbnRzID0gYWRkRXZlbnRzKHRhcmdldCwge1xuICAgICAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGlkZVdoZW5DbGlja091dHNpZGUgJiYgIXRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgLy8gVXNlICdtb3VzZXVwJyBpbnN0ZWFkIG9mICdjbGljaycsIHNpbmNlIGNsaWNrIGFwcGVhcnMgdG8gaGFwcGVuIGFmdGVyXG4gICAgICAvLyB0aGUgRE9NIGluc2lkZSBvZiBwb3B1cHMgY291bGQgY2hhbmdlIGluIGEgd2F5IHNvIHRoYXQgdGhlIGNoZWNrXG4gICAgICAvLyBgcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWAgd291bGQgZmFpbDpcbiAgICAgIHRoaXMuY2xvc2VFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCAmJlxuICAgICAgICAgICAgIXBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3dQb3B1cCA9IHRoaXMuc2hvd1xuICB9LFxuXG4gIGJlZm9yZVVubW91bnQoKSB7XG4gICAgdGhpcy5mb2N1c0V2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLmNsb3NlRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMubW91c2VMZWF2ZVRpbWVyID0gbnVsbFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICAgIGlmICh0aGlzLnNob3cgJiYgcG9wdXAub2Zmc2V0V2lkdGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBpc1N0cmluZyh0aGlzLnRhcmdldClcbiAgICAgICAgPyB0aGlzLiRyZWZzW3RoaXMudGFyZ2V0XVxuICAgICAgICA6IHRoaXMudGFyZ2V0XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIC8vIEFjdHVhbGx5IHJlc2l6ZSB0aGUgcG9wdXAncyBmaXJzdCBjaGlsZCwgc28gdGhleSBjYW4gc2V0IHNpemUgbGltaXRzLlxuICAgICAgICBjb25zdCBlbCA9IHRhcmdldCA9PT0gcG9wdXAgPyB0cmlnZ2VyIDogcG9wdXAuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgZWwuc3R5bGUud2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCkud2lkdGhcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBib3VuZHMgPSAodGFyZ2V0IHx8IHRyaWdnZXIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCB0cmlnZ2VyTGVmdCA9IGJvdW5kcy5sZWZ0ICsgd2luZG93LnNjcm9sbFhcbiAgICAgIGNvbnN0IHRyaWdnZXJUb3AgPSBib3VuZHMudG9wICsgd2luZG93LnNjcm9sbFlcbiAgICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IGJvdW5kcy53aWR0aFxuICAgICAgY29uc3QgdHJpZ2dlckhlaWdodCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cC5vZmZzZXRXaWR0aFxuICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cC5vZmZzZXRIZWlnaHRcblxuICAgICAgbGV0IFtwYXJ0MSwgcGFydDJdID0gdGhpcy5wb3B1cFBsYWNlbWVudC5zcGxpdCgnLScpIHx8IFtdXG4gICAgICBpZiAodGhpcy5rZWVwSW5WaWV3KSB7XG4gICAgICAgIGNvbnN0IHdpbldpZHRoID0gd2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgY29uc3Qgd2luSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQyID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgKyB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0ICsgdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGxlZnQgPSAwXG4gICAgICBsZXQgdG9wID0gMFxuICAgICAgc3dpdGNoIChwYXJ0MSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0ICs9IHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwYXJ0Mikge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoIC0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHQgLSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvdmVyKSB7XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHRvcCAtPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSB0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3VuZHMgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGxlZnQgKz0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyQm91bmRzLmxlZnRcbiAgICAgICAgdG9wICs9IHRyaWdnZXJUb3AgLSB0cmlnZ2VyQm91bmRzLnRvcFxuICAgICAgfVxuICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgXG4gICAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgXG4gICAgfSxcblxuICAgIG9uQ2xpY2soKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSAhdGhpcy5zaG93UG9wdXBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Ib3ZlcihlbnRlcikge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlTGVhdmVUaW1lcilcbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGlkZURlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLmhpZGVEZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJy4uL3N0eWxlcy90cmFuc2l0aW9ucy9pbmRleC5zY3NzJztcblxuLmRpdG8tdHJpZ2dlci1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kaXRvLXRyaWdnZXItZGlzYWJsZWQge1xuICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICAqIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICY6Zm9jdXMge1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tcG9wdXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAwMDtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8taW5wdXRcbiAgaW5wdXQoXG4gICAgOmlkPVwiaWRcIlxuICAgIHJlZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICA6dHlwZT1cInR5cGVcIlxuICAgIDpuYW1lPVwibmFtZVwiXG4gICAgOnRpdGxlPVwidGl0bGVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIDphdXRvY29tcGxldGU9XCJhdXRvY29tcGxldGVcIlxuICAgIDphcmlhLWxhYmVsPVwidGl0bGVcIlxuICAgIHYtYmluZD1cIiRhdHRyc1wiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYXV0b2ZvY3VzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYXV0b2NvbXBsZXRlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ29mZicgfVxuICAgIC8qXG4gICAgY2xlYXJhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgICBzdWZmaXhJY29uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHByZWZpeEljb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgICAqL1xuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgaG92ZXJpbmc6IGZhbHNlLFxuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzaXplKCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHNpemUgYmFzZWQgb24gbWluICYgbWF4IHNldHRpbmdzLCBpZiB0aGV5J3JlIHByb3ZpZGVkLlxuICAgICAgY29uc3QgeyBzaXplLCBtaW4sIG1heCB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIGNvbnN0IGdldExlbmd0aCA9IHZhbHVlID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7dmFsdWV9YC5sZW5ndGggOiAwKVxuICAgICAgcmV0dXJuIHNpemUgfHwgZ2V0TGVuZ3RoKG1pbikgfHwgZ2V0TGVuZ3RoKG1heCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1pbnB1dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICBAZXh0ZW5kICVpbnB1dDtcblxuICBpbnB1dCB7XG4gICAgLy8gSW5oZXJpdCBhbGwgc3R5bGluZyBmcm9tIC5kaXRvLWlucHV0XG4gICAgYWxsOiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by1kYXRlLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJjbGlja1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBJbnB1dEZpZWxkLmRpdG8tZGF0ZS1waWNrZXItaW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcmVhZG9ubHlcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBzaG93UG9wdXAgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImlucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJpbnB1dEZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgKVxuICAvLyBpY29uKHR5cGU9XCJjYWxlbmRhclwiIDpjb2xvcj1cImljb25Db2xvclwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgQ2FsZW5kYXIuZGl0by1kYXRlLXBpY2tlci1wb3B1cChcbiAgICAgIHJlZj1cImNhbGVuZGFyXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1iaW5kPVwieyBsb2NhbGUsIGRpc2FibGVkRGF0ZSB9XCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IENhbGVuZGFyIGZyb20gJy4vQ2FsZW5kYXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIENhbGVuZGFyLCBJbnB1dEZpZWxkIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkYXRlRm9ybWF0OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gZGVmYXVsdEZvcm1hdHMuZGF0ZSB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICBkYXRlOiB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgICAgdGltZTogZmFsc2VcbiAgICAgICAgfSkgfHwgJydcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmICgrY3VycmVudFZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgLy8gVE9ETzogVGhpcyBzZWVtcyB0byBjb250cmFkaWN0IHRoZSBgY3VycmVudFZhbHVlKClgIHdhdGNoZXIgYWJvdmUuXG4gICAgICAgICAgLy8gICAgICAgSXMgdGhpcyBuZWVkZWQgYXQgYWxsP1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy4kcmVmcy5jYWxlbmRhcj8ubmF2aWdhdGUoZ2V0S2V5TmF2aWdhdGlvbihldmVudCkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXBpY2tlciB7XG4gIG1pbi13aWR0aDogMTBlbTtcblxuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbikge1xuICBjb25zdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAoXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGFyZ3VtZW50c1swXSwgMTApXG4gICAgfVxuICApXG4gIGlmIChkdXJhdGlvbiA8PSAwKSB7XG4gICAgZWxlbWVudC5zY3JvbGxUb3AgPSB0b1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0byAtIGVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgY29uc3QgcGVyVGljayA9IGRpZmZlcmVuY2UgLyBkdXJhdGlvbiAqIDEwXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gZWxlbWVudC5zY3JvbGxUb3AgKyBwZXJUaWNrXG4gICAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgPT09IHRvKSByZXR1cm5cbiAgICAgIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbiAtIDEwKVxuICAgIH0pXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oZmllbGQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKGZpZWxkLmNyZWF0ZVRleHRSYW5nZSkge1xuICAgIGNvbnN0IHJhbmdlID0gZmllbGQuY3JlYXRlVGV4dFJhbmdlKClcbiAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpXG4gICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kKVxuICAgIHJhbmdlLnNlbGVjdCgpXG4gICAgZmllbGQuZm9jdXMoKVxuICB9IGVsc2UgaWYgKGZpZWxkLnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgZmllbGQuZm9jdXMoKVxuICAgIGZpZWxkLnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBmaWVsZCkge1xuICAgIGZpZWxkLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnRcbiAgICBmaWVsZC5zZWxlY3Rpb25FbmQgPSBlbmRcbiAgICBmaWVsZC5mb2N1cygpXG4gIH1cbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImNsaWNrXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIElucHV0RmllbGQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICByZWFkb25seVxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IHNob3dQb3B1cCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkIH1cIlxuICAgICAgQGZvY3VzPVwiaW5wdXRGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImlucHV0Rm9jdXNlZCA9IGZhbHNlXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICApXG4gICAgLy8tIGljb24odHlwZT1cInRpbWVcIlxuICAgIC8vLSA6Y29sb3I9XCJkaXNhYmxlZCA/ICcjYmZiZmJmJyA6ICh0ZXh0ID8gJyM2NjYnIDogJyNiZmJmYmYnKVwiXG4gICAgLy8tIClcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwXG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLWhvdXIoXG4gICAgICAgICAgcmVmPVwiaG91clwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDBcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDI0XCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZEhvdXIoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IGhvdXIgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaG91ciA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1taW51dGUoXG4gICAgICAgICAgcmVmPVwibWludXRlXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMVwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkTWludXRlKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBtaW51dGUgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwibWludXRlID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLXNlY29uZChcbiAgICAgICAgICByZWY9XCJzZWNvbmRcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAyXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IHNlY29uZCA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWNvbmQgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCB7IGNvcHlEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IHNjcm9sbFRvIH0gZnJvbSAnLi4vdXRpbHMvc2Nyb2xsLmpzJ1xuaW1wb3J0IHsgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgSW5wdXRGaWVsZCB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgZGlzYWJsZWRIb3VyOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkTWludXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkU2Vjb25kOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBzZWxlY3Rpb246IDAsXG4gICAgICBjaGFuZ2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWVcbiAgICAgICAgPyBgJHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLmhvdXIpXG4gICAgICAgICAgfToke1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFkKHRoaXMubWludXRlKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLnNlY29uZClcbiAgICAgICAgICB9YFxuICAgICAgICA6ICcnXG4gICAgfSxcblxuICAgIGN1cnJlbnREYXRlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgfHxcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGUoKSBvYmplY3Qgd2l0aCB0aGUgdGltZSBzZXQgdG8gMCwgdG8gYmUgdXNlZCB3aGVuXG4gICAgICAgIC8vIGZpcnN0IHNldHRpbmcgYW55IG9mIHRoZSB0aW1lcywgZm9yIG1lYW5pbmdmdWwgZGF0ZXMgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gb2JqZWN0IGlzIHNoYXJlZCB3aXRoIGEgRGF0ZVBpY2tlciwgZS5nLiB0aHJvdWdoIERhdGVUaW1lUGlja2VyLlxuICAgICAgICBjb3B5RGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBob3VyOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldEhvdXJzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChob3VyKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IGhvdXIgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWludXRlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KG1pbnV0ZSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBtaW51dGUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2Vjb25kOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KHNlY29uZCkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBzZWNvbmQgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShkYXRlKSB7XG4gICAgICBpZiAoK2RhdGUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGRhdGUpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6ICd1cGRhdGVTZWxlY3Rpb24nLFxuXG4gICAgc2VsZWN0aW9uOiAndXBkYXRlU2VsZWN0aW9uJyxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKClcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwoMClcbiAgICAgIH1cbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgICAgaWYgKCF0byAmJiB0aGlzLmNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBsZWZ0UGFkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKCcwJyArIHZhbHVlKS5zbGljZSgtMilcbiAgICB9LFxuXG4gICAgc2V0VGltZShvdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gY29weURhdGUodGhpcy5jdXJyZW50RGF0ZSwge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB1cGRhdGVTZWxlY3Rpb24oZm9yY2UgPSBmYWxzZSkge1xuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwIHx8IGZvcmNlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gMyAqIHRoaXMuc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLiRyZWZzLmlucHV0LCBzdGFydCwgc3RhcnQgKyAyKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2Nyb2xsQWxsKGR1cmF0aW9uID0gMTAwKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSAocmVmLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRyZWZzW3JlZl1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIC8vIEZpcnN0IGFuZCBsYXN0IG9uZSBhZGQgMyB0aW1lcyB0aGUgbWFyZ2luXG4gICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHRhcmdldC5zY3JvbGxIZWlnaHQgLyAodGFyZ2V0LmNoaWxkcmVuLmxlbmd0aCArIDYpXG4gICAgICAgICAgc2Nyb2xsVG8odGFyZ2V0LCBNYXRoLnJvdW5kKHZhbHVlICogbGluZUhlaWdodCksIGR1cmF0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHNjcm9sbCgnaG91cicsIHRoaXMuaG91cilcbiAgICAgICAgc2Nyb2xsKCdtaW51dGUnLCB0aGlzLm1pbnV0ZSlcbiAgICAgICAgc2Nyb2xsKCdzZWNvbmQnLCB0aGlzLnNlY29uZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCddW3RoaXMuc2VsZWN0aW9uXVxuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHsgaG9yLCB2ZXIsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgICBpZiAoaG9yKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGlvbiArIGhvclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdmFsdWUgPCAwID8gMiA6IHZhbHVlID4gMiA/IDAgOiB2YWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKHZlcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tzZWxlY3RlZF0gKyB2ZXJcbiAgICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gdGhpcy4kcmVmc1tzZWxlY3RlZF0uY2hpbGRyZW5cbiAgICAgICAgICB0aGlzW3NlbGVjdGVkXSA9XG4gICAgICAgICAgICB2YWx1ZSA8IDBcbiAgICAgICAgICAgICAgPyB2YWx1ZSArIGxlbmd0aFxuICAgICAgICAgICAgICA6IHZhbHVlID49IGxlbmd0aFxuICAgICAgICAgICAgICAgID8gdmFsdWUgLSBsZW5ndGhcbiAgICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChob3IgfHwgdmVyIHx8IGVudGVyKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odHJ1ZSlcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIG1heC13aWR0aDogMTYwcHg7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cblxuJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0OiAyNHB4O1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC5kaXRvLWljb24tdGltZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiA3cHg7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAgLmRpdG8tdGltZS1waWNrZXItcGFuZWwge1xuICBmbG9hdDogbGVmdDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogY2FsYygxMDAlIC8gMyArIDFweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gIH1cblxuICB1bCB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDA7XG4gICAgLy8gSGlkZSBzY3JvbGxiYXI6XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgcGFkZGluZzogMCAxN3B4IDAgMDtcbiAgICBoZWlnaHQ6IDcgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG5cbiAgICAmID4gbGkge1xuICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgICB9XG5cbiAgICAgICYuc2VsZWN0ZWQsXG4gICAgICAmLnNlbGVjdGVkOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIocmVmPVwicGlja2VyXCIpXG4gIC5kaXRvLXBpY2tlcnMoOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiKVxuICAgIERhdGVQaWNrZXIoXG4gICAgICByZWY9XCJkYXRlXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd0RhdGVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlaG9sZGVyLCBsb2NhbGUsIGRhdGVGb3JtYXQsIGRpc2FibGVkIH1cIlxuICAgICAgQGZvY3VzPVwiZGF0ZUZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiZGF0ZUZvY3VzZWQgPSBmYWxzZVwiXG4gICAgKVxuICAgIFRpbWVQaWNrZXIoXG4gICAgICByZWY9XCJ0aW1lXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd1RpbWVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cInRpbWVGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cInRpbWVGb2N1c2VkID0gZmFsc2VcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tICcuL0RhdGVQaWNrZXIudnVlJ1xuaW1wb3J0IFRpbWVQaWNrZXIgZnJvbSAnLi9UaW1lUGlja2VyLnZ1ZSdcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IERhdGVQaWNrZXIsIFRpbWVQaWNrZXIgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0ZUZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+IGRlZmF1bHRGb3JtYXRzLmRhdGUgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd0RhdGU6IGZhbHNlLFxuICAgICAgc2hvd1RpbWU6IGZhbHNlLFxuICAgICAgZGF0ZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgdGltZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0ZUZvY3VzZWQgfHwgdGhpcy50aW1lRm9jdXNlZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGRhdGUpIHtcbiAgICAgIGlmICgrZGF0ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgZGF0ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgICAgaWYgKCF0byAmJiB0aGlzLmNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuZGF0ZS5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmRhdGUuYmx1cigpXG4gICAgICB0aGlzLiRyZWZzLnRpbWUuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8tcGlja2VycyB7XG4gICAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgICBwYWRkaW5nOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG5cbiAgICAuZGl0by1pbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAwO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWRhdGUtcGlja2VyIHtcbiAgICB3aWR0aDogNjAlO1xuICAgIG1pbi13aWR0aDogNi45ZW07XG5cbiAgICAuZGl0by1pbnB1dCB7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXRpbWUtcGlja2VyIHtcbiAgICB3aWR0aDogNDAlO1xuICAgIG1pbi13aWR0aDogNS40ZW07XG5cbiAgICAuZGl0by1pbnB1dCB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaS5kaXRvLWljb24oOmNsYXNzPVwiYGRpdG8taWNvbi0ke25hbWV9YFwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLy8gYHlhcm4gYnVpbGQ6aWNvbnNgIGNvbnZlcnRzIHRoZSBpY29uIFNWRyBmaWxlcyB0byBzaWxlbnQgY2xhc3NlcyBpbnNpZGVcbi8vIGBzcmMvc3R5bGVzL21peGlucy9faWNvbnMuc2Nzc2AsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgb3RoZXIgc2Fzc1xuLy8gY29kZSB0aHJvdWdoIGBfaW1wb3J0c2AuXG4vLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG5vcm1hbCBDU1MgY2xhc3NlcywgY29udmVydCB0aGVtIGhlcmU6XG5AZWFjaCAkbmFtZSBpbiAkaWNvbnMge1xuICAuZGl0by1pY29uLSN7JG5hbWV9IHtcbiAgICBAZXh0ZW5kICVpY29uLSN7JG5hbWV9O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvbm8tdGVtcGxhdGUtc2hhZG93IC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXBhZ2luYXRpb25cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbChcbiAgICB2LWlmPVwic2hvd1RvdGFsXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInRvdGFsID4gMFwiXG4gICAgKSB7eyBmaXJzdCB9fSDigJMge3sgbGFzdCB9fVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1lbHNlXG4gICAgKSAwXG4gICAgfCAvIHt7IHRvdGFsIH19XG4gIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdi1mb3I9XCJwYWdlIGluIHBhZ2VSYW5nZVwiXG4gICAgICA6Y2xhc3M9XCJnZXRQYWdlQ2xhc3MocGFnZSlcIlxuICAgICAgOmRpc2FibGVkPVwicGFnZS5kaXNhYmxlZFwiXG4gICAgICBAY2xpY2s9XCJvbkNsaWNrUGFnZShwYWdlKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cInBhZ2UudGV4dFwiXG4gICAgICApIHt7IHBhZ2UudGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnBhZ2UnXSxcblxuICBwcm9wczoge1xuICAgIHRvdGFsOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIHBhZ2U6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxIH0sXG4gICAgcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMCB9LFxuICAgIHNob3dUb3RhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlUmFuZ2U6IFtdLFxuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIG51bVBhZ2VzOiAwLFxuICAgICAgY3VycmVudFBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZpcnN0KCkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLmN1cnJlbnRQYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5jdXJyZW50UGFnZVNpemUgLSAxLCB0aGlzLnRvdGFsKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHRvdGFsOiAndXBkYXRlUGFnZVJhbmdlJyxcbiAgICBzaG93UHJldjogJ3VwZGF0ZVBhZ2VSYW5nZScsXG4gICAgc2hvd05leHQ6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuXG4gICAgcGFnZShwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxuICAgIH0sXG5cbiAgICBwYWdlU2l6ZShwYWdlU2l6ZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZVNpemUgPSBwYWdlU2l6ZVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZVNpemUoY3VycmVudFBhZ2VTaXplKSB7XG4gICAgICB0aGlzLm51bVBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWwgLyBjdXJyZW50UGFnZVNpemUpXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMubnVtUGFnZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubnVtUGFnZXNcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2UodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpwYWdlJywgdG8pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZVxuICAgIHRoaXMuY3VycmVudFBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkNsaWNrUGFnZShwYWdlKSB7XG4gICAgICBpZiAocGFnZS5pbmRleCAmJiAhcGFnZS5kaXNhYmxlZCAmJiBwYWdlLmluZGV4ICE9PSB0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlLmluZGV4XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFBhZ2VDbGFzcyhwYWdlKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICAnZGl0by1zZWxlY3RlZCc6IHBhZ2UuYWN0aXZlXG4gICAgICB9XG4gICAgICBpZiAocGFnZS50eXBlKSB7XG4gICAgICAgIGNsYXNzZXNbYGRpdG8tYnV0dG9uLSR7cGFnZS50eXBlfWBdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgdXBkYXRlUGFnZVJhbmdlKCkge1xuICAgICAgY29uc3QgeyBzaG93UHJldiwgc2hvd05leHQsIHRvdGFsLCBjdXJyZW50UGFnZVNpemUsIGN1cnJlbnRQYWdlIH0gPSB0aGlzXG4gICAgICBjb25zdCBzaG93TGVuZ3RoID0gc2hvd1ByZXYgKyBzaG93TmV4dCArIDFcbiAgICAgIGNvbnN0IG51bVBhZ2VzID0gKHRoaXMubnVtUGFnZXMgPSBNYXRoLmNlaWwodG90YWwgLyBjdXJyZW50UGFnZVNpemUpKVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kID0gMVxuICAgICAgaWYgKG51bVBhZ2VzIDw9IHNob3dMZW5ndGgpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPD0gc2hvd1ByZXYgKyAxKSB7XG4gICAgICAgIGVuZCA9IHNob3dMZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPj0gbnVtUGFnZXMgLSBzaG93TmV4dCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgICBzdGFydCA9IG51bVBhZ2VzIC0gc2hvd0xlbmd0aCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gY3VycmVudFBhZ2UgLSBzaG93UHJldlxuICAgICAgICBlbmQgPSBjdXJyZW50UGFnZSArIHNob3dOZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZ2VSYW5nZSA9IFtdXG4gICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIHR5cGU6ICdwcmV2JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlIDw9IDFcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhcnQgPj0gMikge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7IGluZGV4OiAxLCB0ZXh0OiAxIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPiAyKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5tYXgoMSwgY3VycmVudFBhZ2UgLSAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLXByZXYnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgYWN0aXZlOiBpID09PSBjdXJyZW50UGFnZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWluKG51bVBhZ2VzLCBjdXJyZW50UGFnZSArIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtbmV4dCdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPD0gbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHsgaW5kZXg6IG51bVBhZ2VzLCB0ZXh0OiBudW1QYWdlcyB9KVxuICAgICAgfVxuICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgKyAxLFxuICAgICAgICB0eXBlOiAnbmV4dCcsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA+PSBudW1QYWdlc1xuICAgICAgfSlcblxuICAgICAgdGhpcy5wYWdlUmFuZ2UgPSBwYWdlUmFuZ2VcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwge1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgbWFyZ2luOiAwIDAuNWVtO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlLCBjb2xvciAwcywgYmFja2dyb3VuZCAwcywgYm9yZGVyIDBzO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgcGFkZGluZzogMCAwLjVlbTtcblxuICAgICYtcHJldixcbiAgICAmLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1hcnJvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2LFxuICAgICYtZWxsaXBzaXMtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWVsbGlwc2lzO1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWNoZXZyb25zO1xuICAgICAgfVxuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcblxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zd2l0Y2goXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKVxuICAuZGl0by1zd2l0Y2gtcGFuZVxuICAgIGlucHV0KFxuICAgICAgOmlkPVwiaWRcIlxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcbiAgICAgIHYtbW9kZWw9XCJjaGVja2VkXCJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICA6bmFtZT1cIm5hbWVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uXG4gICAgc3Bhbi5kaXRvLXN3aXRjaC1sYWJlbChcbiAgICAgIHYtaWY9XCJsYWJlbHNcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJjaGVja2VkXCJcbiAgICAgICAgbmFtZT1cImNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMuY2hlY2tlZCB8fCAnb24nIH19XG4gICAgICBzbG90KFxuICAgICAgICB2LWVsc2VcbiAgICAgICAgbmFtZT1cInVuY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy51bmNoZWNrZWQgfHwgJ29mZicgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbHM6IHsgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja2VkOiB0aGlzLm1vZGVsVmFsdWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgY29uc3QgeyBjaGVja2VkLCBkaXNhYmxlZCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2hlY2tlZCc6IGNoZWNrZWQsXG4gICAgICAgICdkaXRvLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3R5bGVzKCkge1xuICAgICAgY29uc3QgeyBsYWJlbHM6IHsgY2hlY2tlZCwgdW5jaGVja2VkIH0gPSB7fSB9ID0gdGhpc1xuICAgICAgLy8gQ2FsY3VsYXRlIGAtLXN3aXRjaC13aWR0aGAgaW4gYHJlbWAsIGJhc2VkIG9uIGxhYmVsIGxlbmd0aC5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDAsIGNoZWNrZWQ/Lmxlbmd0aCwgdW5jaGVja2VkPy5sZW5ndGgpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnLS1zd2l0Y2gtd2lkdGgnOiBsZW5ndGggPyBgJHtsZW5ndGggKiAxLjV9cmVtYCA6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKG1vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IG1vZGVsVmFsdWVcbiAgICB9LFxuXG4gICAgY2hlY2tlZChjaGVja2VkKSB7XG4gICAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY2hlY2tlZClcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY2hlY2tlZClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAvLyBVc2Ugd2hvbGUgbXVsdGlwbGVzIG9mIGByZW1gIGZvciBzaXplcyBhbmQgYHB4YCBtYXJnaW5zL3BhZGRpbmcgYWxvbmdcbiAgLy8gd2l0aCBgY2FsYygpYCB0byBlbmQgdXAgd2l0aCBldmVuIHBpeGVsIHNpemVzLiBgcmVtYCBpcyBuZWVkZWQgYmVjYXVzZSB3ZVxuICAvLyBjaGFuZ2UgYGZvbnQtc2l6ZWAgaW5zaWRlIGAuZGl0by1zd2l0Y2gtYnV0dG9uYFxuICAtLXN3aXRjaC13aWR0aDogNHJlbTtcbiAgLS1zd2l0Y2gtaGVpZ2h0OiAycmVtO1xuICAtLXN3aXRjaC1tYXJnaW46IDJweDtcbiAgLS1zd2l0Y2gtcGFkZGluZzogM3B4O1xuICAtLXN3aXRjaC1zcGVlZDogMzAwbXM7XG4gIC0tbGFiZWwtbWFyZ2luOiAwLjVlbTtcbiAgLS13aWR0aDogY2FsYyh2YXIoLS1zd2l0Y2gtd2lkdGgpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1oZWlnaHQ6IGNhbGModmFyKC0tc3dpdGNoLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLW9mZnNldDogY2FsYyh2YXIoLS13aWR0aCkgLSB2YXIoLS1oZWlnaHQpKTtcblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiB2YXIoLS1zd2l0Y2gtaGVpZ2h0KTtcbiAgLy8gVG8gbWFrZSBpbmxpbmUgbGFiZWxzIGFwcGVhciBvbiBjb25zaXN0ZW50IGJhc2VsaW5lOlxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAuZGl0by1zd2l0Y2gtcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiB2YXIoLS13aWR0aCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUsXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB9XG5cbiAgaW5wdXQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0O1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzLCBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgLy8gU2V0IGZvbnQtc2l6ZSB0byBoZWlnaHQsIHNvIHdlIGNhbiB1c2Ugd2lkdGgvaGVpZ2h0ID0gMWVtIGZvciBjaXJjbGU6XG4gICAgZm9udC1zaXplOiBjYWxjKHZhcigtLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLXBhZGRpbmcpKTtcbiAgICB0b3A6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICBsZWZ0OiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBib3JkZXItcmFkaXVzOiAwLjVlbTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tc3dpdGNoLXNwZWVkKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgJi5kaXRvLWNoZWNrZWQge1xuICAgIGlucHV0IHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgodmFyKC0tb2Zmc2V0KSk7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICAgIGxlZnQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgICByaWdodDogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkIHtcbiAgICBAZXh0ZW5kICVidXR0b24tZGlzYWJsZWQ7XG4gIH1cblxuICAmOmZvY3VzLXdpdGhpbjpub3QoOmhvdmVyKSB7XG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgeyBoIGFzIGNyZWF0ZUVsZW1lbnQsIFRyYW5zaXRpb24gfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBUcmFuc2l0aW9uSGVpZ2h0KHsgZW5hYmxlZCB9LCB7IHNsb3RzIH0pIHtcbiAgcmV0dXJuIGVuYWJsZWRcbiAgICA/IGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwgcHJvcHMsIHNsb3RzKVxuICAgIDogc2xvdHMuZGVmYXVsdCgpXG59XG5cblRyYW5zaXRpb25IZWlnaHQucHJvcHMgPSB7XG4gIGVuYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25IZWlnaHRcblxuY29uc3Qgc2V0U3R5bGUgPSAoZWxlbWVudCwgc3R5bGUpID0+IE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpXG5cbi8vIEZvcmNlIHJlcGFpbnQgdG8gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGNvcnJlY3RseS5cbmNvbnN0IGZvcmNlUmVwYWludCA9IGVsZW1lbnQgPT4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHRcblxuY29uc3QgcHJvcHMgPSB7XG4gIG5hbWU6ICdoZWlnaHQnLFxuXG4gIG9uQWZ0ZXJFbnRlcihlbGVtZW50KSB7XG4gICAgLy8gQSB0aW1lb3V0IGJlZm9yZSBzZXR0aW5nIHN0eWxlIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCBhZnRlciBjYWxscyB0b1xuICAgIC8vIGBmb3JjZVJlcGFpbnQoKWAsIGJ1dCB1c2luZyBvbmUgaGVyZSB0b28gcHJlc2VydmVzIGV4ZWN1dGlvbiBzZXF1ZW5jZSBzb1xuICAgIC8vIHRoYXQgdGhlIGNhbGwgZnJvbSBgZW50ZXIoKWAgY2FuIG5ldmVyIG91dHJ1biB0aGUgb25lIGZyb20gYGFmdGVyRW50ZXIoKWBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiAnYXV0bycgfSkpXG4gIH0sXG5cbiAgb25FbnRlcihlbGVtZW50KSB7XG4gICAgY29uc3QgeyB3aWR0aCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfSlcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICB2aXNpYmlsaXR5OiBudWxsLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfSlcbiAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICBzZXRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pKVxuICB9LFxuXG4gIG9uTGVhdmUoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSlcbiAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICBzZXRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiAwIH0pKVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kZHVyYXRpb246IDAuMTVzO1xuXG4uaGVpZ2h0LWVudGVyLWFjdGl2ZSxcbi5oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogaGVpZ2h0ICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5oZWlnaHQtZW50ZXItYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBzbGlkZS1lbnRlciAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uaGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogc2xpZGUtbGVhdmUgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmhlaWdodC1lbnRlci1mcm9tLFxuLmhlaWdodC1sZWF2ZS10byB7XG4gIGhlaWdodDogMDtcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIHJlZiwgd2F0Y2gsIG9uU2NvcGVEaXNwb3NlLCBoIH0gZnJvbSAndnVlLWRlbWknO1xuaW1wb3J0IHsgY3JlYXRlRm9jdXNUcmFwIH0gZnJvbSAnZm9jdXMtdHJhcCc7XG5pbXBvcnQgeyB1bnJlZkVsZW1lbnQgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuXG5jb25zdCBVc2VGb2N1c1RyYXAgPSAvKiBAX19QVVJFX18gKi8gLyogI19fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiVXNlRm9jdXNUcmFwXCIsXG4gIHByb3BzOiBbXCJhc1wiLCBcIm9wdGlvbnNcIl0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBsZXQgdHJhcDtcbiAgICBjb25zdCB0YXJnZXQgPSByZWYoKTtcbiAgICBjb25zdCBhY3RpdmF0ZSA9ICgpID0+IHRyYXAgJiYgdHJhcC5hY3RpdmF0ZSgpO1xuICAgIGNvbnN0IGRlYWN0aXZhdGUgPSAoKSA9PiB0cmFwICYmIHRyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksXG4gICAgICAoZWwpID0+IHtcbiAgICAgICAgaWYgKCFlbClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRyYXAgPSBjcmVhdGVGb2N1c1RyYXAoZWwsIHByb3BzLm9wdGlvbnMgfHwge30pO1xuICAgICAgICBhY3RpdmF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHsgZmx1c2g6IFwicG9zdFwiIH1cbiAgICApO1xuICAgIG9uU2NvcGVEaXNwb3NlKCgpID0+IGRlYWN0aXZhdGUoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChzbG90cy5kZWZhdWx0KVxuICAgICAgICByZXR1cm4gaChwcm9wcy5hcyB8fCBcImRpdlwiLCB7IHJlZjogdGFyZ2V0IH0sIHNsb3RzLmRlZmF1bHQoKSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IFVzZUZvY3VzVHJhcCB9O1xuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRpYWxvZyhcbiAgcmVmPVwiZGlhbG9nXCJcbiAgcm9sZT1cImRpYWxvZ1wiXG4gIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCJcbiAgYXJpYS1tb2RhbD1cInRydWVcIlxuICA6c3R5bGU9XCJ7ICctLXdpZHRoJzogYCR7c2V0dGluZ3Mud2lkdGh9cHhgIH1cIlxuICBAbW91c2V1cD1cIm9uTW91c2VVcFwiXG4pXG4gIFVzZUZvY3VzVHJhcC5kaXRvLWRpYWxvZ19fZm9jdXMtdHJhcChcbiAgICA6b3B0aW9ucz1cInsgaW1tZWRpYXRlOiB0cnVlLCBmYWxsYmFja0ZvY3VzOiAoKSA9PiAkcmVmcy5kaWFsb2cgfVwiXG4gIClcbiAgICBmb3JtLmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgICAgIEBzdWJtaXQucHJldmVudD1cInN1Ym1pdFwiXG4gICAgKVxuICAgICAgRGl0b1NjaGVtYS5kaXRvLXNjcm9sbChcbiAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgIDpkYXRhPVwiZGlhbG9nRGF0YVwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgICAgIERpdG9CdXR0b25zLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICAgICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgICAgICA6ZGF0YT1cImRpYWxvZ0RhdGFcIlxuICAgICAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRCdXR0b25TY2hlbWFzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgVXNlRm9jdXNUcmFwIH0gZnJvbSAnQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlRm9jdXNUcmFwL2NvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRGlhbG9nJywge1xuICBjb21wb25lbnRzOiB7IFVzZUZvY3VzVHJhcCB9LFxuICBlbWl0czogWydyZW1vdmUnXSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkZGlhbG9nQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgY29tcG9uZW50czogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcHJvbWlzZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgY2xpY2tUb0Nsb3NlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICAvLyBNYWtlIHN1cmUgZGlhbG9nIGRhdGEgY29udGFpbnMgYWxsIHRoZSBleHBlY3RlZCBrZXlzXG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IGNsb25lKHRoaXMuZGF0YSlcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBkaWFsb2dEYXRhKSkge1xuICAgICAgICBkaWFsb2dEYXRhW2tleV0gPSBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB3aW5kb3dFdmVudHM6IG51bGwsXG4gICAgICBkaWFsb2dEYXRhXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZGlhbG9nQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgc2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcG9uZW50czogdGhpcy5jb21wb25lbnRzXG4gICAgICB9XG4gICAgfSxcblxuICAgIGJ1dHRvblNjaGVtYXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhnZXRCdXR0b25TY2hlbWFzKHRoaXMuYnV0dG9ucykpLm1hcChcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBidXR0b24gc2NoZW1hcyB0byBhZGQgZGVmYXVsdCBjbGljayBldmVudHNcbiAgICAgICAgICAvLyBmb3IgYm90aCAnc3VibWl0JyBhbmQgJ2NhbmNlbCcgYnV0dG9uczpcbiAgICAgICAgICAoW2tleSwgc2NoZW1hXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2NhbmNlbCcgJiYgIXNjaGVtYS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYnV0dG9uU2NoZW1hcykubGVuZ3RoID4gMFxuICAgIH0sXG5cbiAgICBoYXNDYW5jZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmJ1dHRvblNjaGVtYXMuY2FuY2VsXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy53aW5kb3dFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICBrZXl1cDogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoKHRoaXMuaGFzQ2FuY2VsIHx8ICF0aGlzLmhhc0J1dHRvbnMpICYmIGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgdGhpcy5jYW5jZWwoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy53aW5kb3dFdmVudHMucmVtb3ZlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgdGhpcy4kZW1pdCgncmVtb3ZlJylcbiAgICB9LFxuXG4gICAgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgdGhpcy5wcm9taXNlLnJlc29sdmUodmFsdWUpXG4gICAgICB0aGlzLnJlbW92ZSgpXG4gICAgfSxcblxuICAgIHJlamVjdCh2YWx1ZSkge1xuICAgICAgdGhpcy5wcm9taXNlLnJlamVjdCh2YWx1ZSlcbiAgICAgIHRoaXMucmVtb3ZlKClcbiAgICB9LFxuXG4gICAgc3VibWl0KCkge1xuICAgICAgdGhpcy5yZXNvbHZlKHRoaXMuZGlhbG9nRGF0YSlcbiAgICB9LFxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgdGhpcy5yZXNvbHZlKG51bGwpXG4gICAgfSxcblxuICAgIGNsb3NlKCkge1xuICAgICAgdGhpcy5jYW5jZWwoKVxuICAgIH0sXG5cbiAgICBvbk1vdXNlVXAoKSB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5jbGlja1RvQ2xvc2UpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGlhbG9nIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBkaXNwbGF5OiBmbGV4O1xuICBpbnNldDogMDtcbiAgei1pbmRleDogMjAwMDtcbiAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIC8vIFByZXZlbnQgc2Nyb2xsaW5nIG9mIHRoZSBwYWdlIGJlaGluZCB0aGUgZGlhbG9nOlxuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7XG5cbiAgJl9fZm9jdXMtdHJhcCB7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC8vIFRPRE86IGAmX19pbm5lcmBcbiAgZm9ybSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBtYXgtd2lkdGg6IHZhcigtLXdpZHRoLCA0ODBweCk7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICBib3gtc2hhZG93OiAwIDIwcHggNjBweCAtMnB4IHJnYmEoMjcsIDMzLCA1OCwgMC40KTtcbiAgfVxufVxuXG4uZGl0by1kaWFsb2ctZW50ZXItYWN0aXZlLFxuLmRpdG8tZGlhbG9nLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXM7XG5cbiAgZm9ybSB7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMjVzO1xuICB9XG59XG5cbi5kaXRvLWRpYWxvZy1lbnRlci1mcm9tLFxuLmRpdG8tZGlhbG9nLWxlYXZlLXRvIHtcbiAgb3BhY2l0eTogMDtcblxuICBmb3JtIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwcHgpO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbUhhbmRsZXJzOiBbXVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIGZvciAoY29uc3QgeyByZW1vdmUgfSBvZiB0aGlzLmRvbUhhbmRsZXJzKSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgICB0aGlzLmRvbUhhbmRsZXJzID0gW11cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZG9tT24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWRkRXZlbnRzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBpc09iamVjdCh0eXBlKSA/IHR5cGUgOiB7IFt0eXBlXTogaGFuZGxlciB9XG4gICAgICApXG4gICAgICB0aGlzLmRvbUhhbmRsZXJzLnB1c2gocmVzdWx0KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXJvb3RcbiAgVnVlTm90aWZpY2F0aW9ucy5kaXRvLW5vdGlmaWNhdGlvbnMoXG4gICAgcmVmPVwibm90aWZpY2F0aW9uc1wiXG4gICAgcG9zaXRpb249XCJ0b3AgcmlnaHRcIlxuICAgIGNsYXNzZXM9XCJkaXRvLW5vdGlmaWNhdGlvblwiXG4gIClcbiAgVHJhbnNpdGlvbkdyb3VwKG5hbWU9XCJkaXRvLWRpYWxvZ1wiKVxuICAgIERpdG9EaWFsb2coXG4gICAgICB2LWZvcj1cIihkaWFsb2csIGtleSkgaW4gZGlhbG9nc1wiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDpjb21wb25lbnRzPVwiZGlhbG9nLmNvbXBvbmVudHNcIlxuICAgICAgOmJ1dHRvbnM9XCJkaWFsb2cuYnV0dG9uc1wiXG4gICAgICA6cHJvbWlzZT1cImRpYWxvZy5wcm9taXNlXCJcbiAgICAgIDpkYXRhPVwiZGlhbG9nLmRhdGFcIlxuICAgICAgOnNldHRpbmdzPVwiZGlhbG9nLnNldHRpbmdzXCJcbiAgICAgIEByZW1vdmU9XCJyZW1vdmVEaWFsb2coa2V5KVwiXG4gICAgKVxuICBEaXRvTWVudVxuICBtYWluLmRpdG8tcGFnZS5kaXRvLXNjcm9sbC1wYXJlbnRcbiAgICBEaXRvSGVhZGVyKFxuICAgICAgOnNwaW5uZXI9XCJvcHRpb25zLnNwaW5uZXJcIlxuICAgICAgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgKVxuICAgICAgRGl0b0FjY291bnQoXG4gICAgICAgIHYtaWY9XCJ1c2VyXCJcbiAgICAgIClcbiAgICAgIGEuZGl0by1sb2dpbihcbiAgICAgICAgdi1lbHNlLWlmPVwiYWxsb3dMb2dpblwiXG4gICAgICAgIEBjbGljaz1cInJvb3RDb21wb25lbnQubG9naW4oKVwiXG4gICAgICApXG4gICAgICAgIHNwYW4gTG9naW5cbiAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgYXNBcnJheSwgbWFwQ29uY3VycmVudGx5LCBzdHJpcFRhZ3MgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvVXNlciBmcm9tICcuLi9EaXRvVXNlci5qcydcbmltcG9ydCBEaXRvVmlldyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9WaWV3LnZ1ZSdcbmltcG9ydCBEaXRvRGlhbG9nIGZyb20gJy4vRGl0b0RpYWxvZy52dWUnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1ZpZXcsXG4gIHJlc29sdmVTY2hlbWFzLFxuICBwcm9jZXNzU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Jvb3QnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czogeyBEaXRvRGlhbG9nIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHZpZXdzOiAoKSA9PiB0aGlzLnJlc29sdmVkVmlld3NcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB1bnJlc29sdmVkVmlld3M6IHsgdHlwZTogW09iamVjdCwgRnVuY3Rpb24sIFByb21pc2VdLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZFZpZXdzOiB7fSxcbiAgICAgIHJlbW92ZVJvdXRlczogbnVsbCxcbiAgICAgIGRpYWxvZ3M6IHt9LFxuICAgICAgYWxsb3dMb2dpbjogZmFsc2UsXG4gICAgICBsb2FkaW5nQ291bnQ6IDBcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBub3RpZmljYXRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMubm90aWZpY2F0aW9uc1xuICAgIH0sXG5cbiAgICBpc0xvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkaW5nQ291bnQgPiAwXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5hcHBTdGF0ZS50aXRsZSA9IGRvY3VtZW50LnRpdGxlIHx8ICdEaXRvLmpzIEFkbWluJ1xuICAgIC8vIFdpdGggaG90LXJlbG9hZGluZywgaXQgbG9va3MgbGlrZSBkZXN0cm95ZWQgaG9va3MgYXJlbid0IGFsd2F5cyBjYWxsZWRcbiAgICAvLyBmb3Igcm91dGUgY29tcG9uZW50cyBzbyByZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGluc3RlYWQuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMgPSBbXVxuICB9LFxuXG4gIGFzeW5jIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGxhYmVsIG1hcmtlZCBhcyBhY3RpdmUgb24gYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMsIGV4Y2VwdFxuICAgIC8vIHRoZSBvbmVzIHRoYXQgRGl0b0xhYmVsIGl0c2VsZiBpbnRlcmNlcHRzLlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNsaWNrOiBldmVudCA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kaXRvLWxhYmVsJykpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBrZXl1cDogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gZmFsc2VcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZldGNoVXNlcigpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICAgIHRoaXMuYWxsb3dMb2dpbiA9IHRydWVcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbm90aWZ5KHsgdHlwZSA9ICdpbmZvJywgdGl0bGUsIHRleHQgfSA9IHt9KSB7XG4gICAgICB0aXRsZSB8fD0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ1dhcm5pbmcnLFxuICAgICAgICAgIGVycm9yOiAnRXJyb3InLFxuICAgICAgICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgICAgICAgc3VjY2VzczogJ1N1Y2Nlc3MnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ05vdGlmaWNhdGlvbidcbiAgICAgIClcbiAgICAgIHRleHQgPSBgPHA+JHtcbiAgICAgICAgYXNBcnJheSh0ZXh0KS5qb2luKCc8L3A+IDxwPicpXG4gICAgICB9PC9wPmAucmVwbGFjZSgvXFxufFxcclxcbnxcXHIvZywgJzxicj4nKVxuICAgICAgY29uc3QgbG9nID0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ3dhcm4nLFxuICAgICAgICAgIGVycm9yOiAnZXJyb3InLFxuICAgICAgICAgIGluZm86ICdsb2cnLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdsb2cnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ2Vycm9yJ1xuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGVbbG9nXShzdHJpcFRhZ3ModGV4dCkpXG4gICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbnMgPSB0cnVlIH0gPSB0aGlzLmFwaVxuICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRpc3BsYXktZHVyYXRpb24gZm9yIHRoZSBub3RpZmljYXRpb24gYmFzZWQgb24gaXRzIGNvbnRlbnRcbiAgICAgICAgLy8gYW5kIHRoZSBzZXR0aW5nIG9mIHRoZSBgZHVyYXRpb25GYWN0b3JgIGNvbmZpZ3VyYXRpb24uIEl0IGRlZmluZXMgdGhlXG4gICAgICAgIC8vIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgbXVsdGlwbGllZCB3aXRoIHRoZSBhbW91bnQgb2YgY2hhcmFjdGVyc1xuICAgICAgICAvLyBkaXNwbGF5ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbiwgcGx1cyA0MCAoNDAgKyB0aXRsZSArIG1lc3NhZ2UpOlxuICAgICAgICBjb25zdCB7IGR1cmF0aW9uRmFjdG9yID0gMjAgfSA9IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoNDAgKyB0ZXh0Lmxlbmd0aCArIHRpdGxlLmxlbmd0aCkgKiBkdXJhdGlvbkZhY3RvclxuICAgICAgICB0aGlzLiRub3RpZnkoeyB0eXBlLCB0aXRsZSwgdGV4dCwgZHVyYXRpb24gfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmRlc3Ryb3lBbGwoKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmdDb3VudCArPSBpc0xvYWRpbmcgPyAxIDogLTFcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIC8vIFNob3dzIGEgZGl0by1kaWFsb2cgY29tcG9uZW50IGFuZCB3cmFwcyBpdCBpbiBhIHByb21pc2Ugc28gdGhhdCB0aGVcbiAgICAgIC8vIGJ1dHRvbnMgaW4gdGhlIGRpYWxvZyBjYW4gdXNlIGBkaWFsb2cucmVzb2x2ZSgpYCBhbmQgYGRpYWxvZy5yZWplY3QoKWBcbiAgICAgIC8vIHRvIGNsb3NlIHRoZSBtb2RhbCBkaWFsb2cgYW5kIHJlc29sdmUgLyByZWplY3QgdGhlIHByb21pc2UgYXQgb25jZS5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIC8vIFByb2Nlc3MgY29tcG9uZW50cyB0byByZXNvbHZlIGFzeW5jIHNjaGVtYXMuXG4gICAgICAgICAgY29uc3Qgcm91dGVzID0gW11cbiAgICAgICAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyh0aGlzLmFwaSwgeyBjb21wb25lbnRzIH0sIHJvdXRlcywgMClcbiAgICAgICAgICBpZiAocm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0RpYWxvZ3MgZG8gbm90IHN1cHBvcnQgY29tcG9uZW50cyB0aGF0IHByb2R1Y2Ugcm91dGVzJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBrZXkgPSBgZGlhbG9nLSR7KytkaWFsb2dJZH1gXG4gICAgICAgICAgdGhpcy5kaWFsb2dzW2tleV0gPSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHByb21pc2U6IHsgcmVzb2x2ZSwgcmVqZWN0IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgcmVtb3ZlRGlhbG9nKGtleSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlhbG9nc1trZXldXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ2luKCkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICAgICAgY29uc3Qge1xuICAgICAgICBhZGRpdGlvbmFsQ29tcG9uZW50cyxcbiAgICAgICAgcmVkaXJlY3RBZnRlckxvZ2luXG4gICAgICB9ID0gdGhpcy5vcHRpb25zLmxvZ2luIHx8IHt9XG4gICAgICBjb25zdCBsb2dpbkRhdGEgPSBhd2FpdCB0aGlzLnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFkZGl0aW9uYWxDb21wb25lbnRzXG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHt9LFxuICAgICAgICAgIGxvZ2luOiB7IHR5cGU6ICdzdWJtaXQnIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmIChsb2dpbkRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMuYXBpLnVzZXJzLmxvZ2luLFxuICAgICAgICAgICAgZGF0YTogbG9naW5EYXRhLFxuICAgICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChyZWRpcmVjdEFmdGVyTG9naW4pIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlcGxhY2UocmVkaXJlY3RBZnRlckxvZ2luKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFVzZXIocmVzcG9uc2UuZGF0YS51c2VyKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlVmlld3MoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIucmVzcG9uc2U/LmRhdGE/LmVycm9yXG4gICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHRpdGxlOiAnQXV0aGVudGljYXRpb24gRXJyb3InLFxuICAgICAgICAgICAgdGV4dDogZXJyb3IgfHwgZXJyXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLnJlc3BvbnNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZ2luKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZUhvbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZSgnLycpXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ291dCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgcmVzb3VyY2U6IHRoaXMuYXBpLnVzZXJzLmxvZ291dCxcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zZXRVc2VyKG51bGwpXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZUhvbWUoKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoVXNlcigpIHtcbiAgICAgIGxldCB1c2VyID0gbnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMuc2Vzc2lvbixcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB1c2VyID0gcmVzcG9uc2UuZGF0YS51c2VyIHx8IG51bGxcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICB0aXRsZTogJ0F1dGhlbnRpY2F0aW9uIEVycm9yJyxcbiAgICAgICAgICB0ZXh0OiBlcnJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0VXNlcih1c2VyKVxuICAgICAgcmV0dXJuIHVzZXJcbiAgICB9LFxuXG4gICAgc2V0VXNlcih1c2VyKSB7XG4gICAgICB0aGlzLmFwcFN0YXRlLnVzZXIgPSAoXG4gICAgICAgIHVzZXIgJiZcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHVzZXIsIERpdG9Vc2VyLnByb3RvdHlwZSlcbiAgICAgIClcbiAgICAgIC8vIENsZWFyIHJlc29sdmVkIHZpZXdzIHdoZW4gdXNlciBpcyBsb2dnZWQgb3V0LlxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRWaWV3cyA9IHt9XG4gICAgICAgIHRoaXMubmF2aWdhdGVIb21lKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlVXNlcigpIHtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuZmV0Y2hVc2VyKCkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXNvbHZlVmlld3MoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlc29sdmVkVmlld3MgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyh0aGlzLnVucmVzb2x2ZWRWaWV3cylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghZXJyb3IucmVxdWVzdCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9naW4oKVxuICAgICAgfVxuICAgICAgLy8gQ29sbGVjdCBhbGwgcm91dGVzIGZyb20gdGhlIHJvb3Qgc2NoZW1hIGNvbXBvbmVudHNcbiAgICAgIGNvbnN0IHJvdXRlcyA9IGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZXNvbHZlZFZpZXdzKSxcbiAgICAgICAgKFtuYW1lLCBzY2hlbWFdKSA9PiBwcm9jZXNzVmlldyhEaXRvVmlldywgdGhpcy5hcGksIHNjaGVtYSwgbmFtZSlcbiAgICAgIClcbiAgICAgIC8vIE5vdyB0aGF0IHRoZSByb3V0ZXMgYXJlIGxvYWRlZCwgcmVwbGFjZSBhbGwgZXhpc3Rpbmcgcm91dGVzIHdpdGggdGhlXG4gICAgICAvLyBuZXcgcm91dGVzLCBhbmQgcmVzdG9yZSB0aGUgY3VycmVudCBwYXRoLlxuICAgICAgY29uc3QgeyBmdWxsUGF0aCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHRoaXMucmVtb3ZlUm91dGVzPy4oKVxuICAgICAgdGhpcy5yZW1vdmVSb3V0ZXMgPSBhZGRSb3V0ZXModGhpcy4kcm91dGVyLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncm9vdCcsXG4gICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgIGNvbXBvbmVudHM6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLnJvdXRlc1xuICAgICAgXSlcbiAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKGZ1bGxQYXRoKVxuICAgIH1cbiAgfVxufSlcblxubGV0IGRpYWxvZ0lkID0gMFxuXG5mdW5jdGlvbiBhZGRSb3V0ZXMocm91dGVyLCByb3V0ZXMpIHtcbiAgY29uc3QgcmVtb3ZlcnMgPSBbXVxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIGNvbnN0IHJlbW92ZVJvdXRlID0gcm91dGVyLmFkZFJvdXRlKHJvdXRlKVxuICAgIHJlbW92ZXJzLnB1c2gocmVtb3ZlUm91dGUpXG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgcmVtb3ZlIG9mIHJlbW92ZXJzKSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL3N0eWxlJztcblxuLmRpdG8tYXBwLFxuLmRpdG8tcm9vdCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5kaXRvLXJvb3Qge1xuICAuZGl0by1wYWdlIHtcbiAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIC8vIFRoZSByb290LWxldmVsIHZpZXdzIGFuZCBmb3JtcyBtYXkgaGF2ZSBhIGAuZGl0by1zY2hlbWEtaGVhZGVyYCB0aGF0XG4gICAgLy8gc2hvdWxkIGFwcGVhciBsYXllcmVkIG92ZXIgYC5kaXRvLW1lbnVgLCB3aGlsZSBoYXZpbmcgYG92ZXJsYXk6IGhpZGRlbmBcbiAgICAvLyBzZXQgYnkgYC5kaXRvLXNjcm9sbC1wYXJlbnRgIHRvIGRlbGVnYXRlIHNjcm9sbGluZyB0byBgLmRpdG8tc2Nyb2xsYC5cbiAgICAvLyBJbiBvcmRlciB0byBub3QgaGF2ZSB0aGUgaGVhZGVyIGNsaXBwZWQsIGFkanVzdCB0aGUgdG9wIGhlcmU6XG4gICAgPiAuZGl0by1mb3JtLFxuICAgID4gLmRpdG8tdmlldyB7XG4gICAgICBtYXJnaW4tdG9wOiAtJG1lbnUtaGVpZ2h0O1xuICAgICAgcGFkZGluZy10b3A6ICRtZW51LWhlaWdodDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxubmF2LmRpdG8tbWVudS5kaXRvLXNjcm9sbC1wYXJlbnRcbiAgaDEge3sgYXBwU3RhdGUudGl0bGUgfX1cbiAgdWwuZGl0by1zY3JvbGxcbiAgICBsaShcbiAgICAgIHYtZm9yPVwidmlldyBpbiB2aWV3c1wiXG4gICAgKVxuICAgICAgUm91dGVyTGluay5kaXRvLWxpbmsoXG4gICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIodmlldylcIlxuICAgICAgICA6dG89XCJgLyR7dmlldy5wYXRofWBcIlxuICAgICAgICBhY3RpdmVDbGFzcz1cImRpdG8tYWN0aXZlXCJcbiAgICAgICkge3sgZ2V0TGFiZWwodmlldykgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9NZW51Jywge30pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1tZW51IHtcbiAgZmxleDogaW5pdGlhbDtcbiAgZm9udC1zaXplOiAkbWVudS1mb250LXNpemU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHVsIHtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlcjtcbiAgICBib3JkZXItcmlnaHQ6ICRib3JkZXItc3R5bGU7XG4gIH1cblxuICBhLFxuICBoMSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICBoMSB7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWRhcmtlcjtcbiAgICBib3JkZXItcmlnaHQ6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWRhcmtlc3Q7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gIC5kaXRvLWxpbmsge1xuICAgIHBhZGRpbmc6ICRtZW51LXBhZGRpbmc7XG4gICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuXG4gICAgJi5kaXRvLWFjdGl2ZSB7XG4gICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tbGluayB7XG4gICY6Zm9jdXM6bm90KDphY3RpdmUsIC5kaXRvLWFjdGl2ZSkge1xuICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctZm9jdXM7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3Bpbm5lcihcbiAgdi1zaG93PVwibG9hZGluZ1wiXG4pXG4gIC8vLSBUT0RPOiBDb252ZXJ0IHRvIEJFTVxuICAudi1wdWxzZS52LXB1bHNlMSg6c3R5bGU9XCJbc3Bpbm5lclN0eWxlLCBzcGlubmVyRGVsYXkxXVwiKVxuICAudi1wdWxzZS52LXB1bHNlMig6c3R5bGU9XCJbc3Bpbm5lclN0eWxlLCBzcGlubmVyRGVsYXkyXVwiKVxuICAudi1wdWxzZS52LXB1bHNlMyg6c3R5bGU9XCJbc3Bpbm5lclN0eWxlLCBzcGlubmVyRGVsYXkzXVwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBsb2FkaW5nOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgY29sb3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcjNWRjNTk2J1xuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzE1cHgnXG4gICAgfSxcbiAgICBtYXJnaW46IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcycHgnXG4gICAgfSxcbiAgICByYWRpdXM6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcxMDAlJ1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIC8vIFRPRE86IENvbnZlcnQgdG8gdXNpbmcgb25seSBjbGFzc2VzXG4gICAgcmV0dXJuIHtcbiAgICAgIHNwaW5uZXJTdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuY29sb3IsXG4gICAgICAgIHdpZHRoOiB0aGlzLnNpemUsXG4gICAgICAgIGhlaWdodDogdGhpcy5zaXplLFxuICAgICAgICBtYXJnaW46IHRoaXMubWFyZ2luLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRoaXMucmFkaXVzLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogJ3YtcHVsc2VTdHJldGNoRGVsYXknLFxuICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogJzAuNzVzJyxcbiAgICAgICAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ICdpbmZpbml0ZScsXG4gICAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiAnY3ViaWMtYmV6aWVyKC4yLC42OCwuMTgsMS4wOCknLFxuICAgICAgICBhbmltYXRpb25GaWxsTW9kZTogJ2JvdGgnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5MToge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMTJzJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTI6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjI0cydcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkzOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4zNnMnXG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5Aa2V5ZnJhbWVzIHYtcHVsc2VTdHJldGNoRGVsYXkge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cblxuQGtleWZyYW1lcyB2LXB1bHNlU3RyZXRjaERlbGF5IHtcbiAgMCUsXG4gIDgwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgNDUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XG4gICAgb3BhY2l0eTogMC43O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbm5hdi5kaXRvLWhlYWRlclxuICAuZGl0by10cmFpbFxuICAgIHVsXG4gICAgICBsaShcbiAgICAgICAgdi1mb3I9XCIoY29tcG9uZW50LCBpbmRleCkgaW4gdHJhaWxcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWlmPVwiaW5kZXggPT09IHRyYWlsLmxlbmd0aCAtIDFcIlxuICAgICAgICApXG4gICAgICAgICAgc3Bhbig6Y2xhc3M9XCJnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KVwiKVxuICAgICAgICAgICAgfCB7eyBjb21wb25lbnQuYnJlYWRjcnVtYiB9fVxuICAgICAgICBSb3V0ZXJMaW5rLmRpdG8tYnJlYWRjcnVtYihcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICA6dG89XCJjb21wb25lbnQucGF0aFwiXG4gICAgICAgIClcbiAgICAgICAgICBzcGFuKDpjbGFzcz1cImdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpXCIpXG4gICAgICAgICAgICB8IHt7IGNvbXBvbmVudC5icmVhZGNydW1iIH19XG4gICAgRGl0b1NwaW5uZXIoXG4gICAgICB2LWlmPVwiaXNMb2FkaW5nXCJcbiAgICApXG4gIHNsb3RcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9TcGlubmVyIGZyb20gJy4vRGl0b1NwaW5uZXIudnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9IZWFkZXInLCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1NwaW5uZXIgfSxcblxuICBwcm9wczoge1xuICAgIHNwaW5uZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICB9LFxuICAgIGlzTG9hZGluZzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJhaWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMuZmlsdGVyKFxuICAgICAgICBjb21wb25lbnQgPT4gISFjb21wb25lbnQucm91dGVSZWNvcmRcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaXplID0gJzhweCcsXG4gICAgICBjb2xvciA9ICcjOTk5J1xuICAgIH0gPSB0aGlzLnNwaW5uZXIgfHwge31cbiAgICAvLyBUT0RPOiBUaGlzIGlzIGEgaGFjayB0byBzZXQgdGhlIGRlZmF1bHQgcHJvcHMgZm9yIHRoZSBEaXRvU3Bpbm5lci5cbiAgICAvLyBQYXNzIHRoZW0gb24gdGhyb3VnaCB0aGUgdGVtcGxhdGUgaW5zdGVhZCFcbiAgICBjb25zdCB7IHByb3BzIH0gPSBEaXRvU3Bpbm5lclxuICAgIHByb3BzLnNpemUuZGVmYXVsdCA9IHNpemVcbiAgICBwcm9wcy5jb2xvci5kZWZhdWx0ID0gY29sb3JcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tZGlydHknOiBjb21wb25lbnQuaXNEaXJ0eVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWhlYWRlciB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1ibGFjaztcbiAgZm9udC1zaXplOiAkbWVudS1mb250LXNpemU7XG4gIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcbiAgei1pbmRleDogJG1lbnUtei1pbmRleDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6ICRtZW51LXBhZGRpbmc7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gIC5kaXRvLXRyYWlsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgaGVpZ2h0OiAzZW07XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiAkY29udGVudC13aWR0aCArICRjb250ZW50LXBhZGRpbmc7XG5cbiAgICB1bCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgIH1cblxuICAgIGEge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwLjRlbTtcblxuICAgICAgJGFuZ2xlOiAzM2RlZztcblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAjOTk5OTk5O1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUsXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMS4yZW07XG4gICAgICAgIHJpZ2h0OiAtMXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFyaztcbiAgICAgIH1cblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKCRhbmdsZSk7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcDtcbiAgICAgIH1cblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBib3R0b206IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLSRhbmdsZSk7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGl0by1zcGlubmVyIHtcbiAgICBtYXJnaW4tdG9wOiAkbWVudS1wYWRkaW5nLXZlcjtcbiAgfVxuXG4gIC5kaXRvLWRpcnR5IHtcbiAgICAmOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgIHdpZHRoOiA4cHg7XG4gICAgICBoZWlnaHQ6IDhweDtcbiAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IDAuNWVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1hY2NvdW50LFxuICAuZGl0by1sb2dpbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cblxuICAuZGl0by1hY2NvdW50IHtcbiAgICBsZWZ0OiAkY29udGVudC13aWR0aCArICRjb250ZW50LXBhZGRpbmcgKiAyO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IERvbU1peGluIGZyb20gJy4vRG9tTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwdWxsZG93bjoge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgc3RhcnRUaW1lOiAwLFxuICAgICAgICBjaGVja1RpbWU6IHRydWUsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIG1vdXNlZG93bjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4oZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uUHVsbGRvd25Nb3VzZVVwKG51bGwpKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZXJzOiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvblB1bGxkb3duTW91c2VEb3duKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKHRydWUpXG4gICAgICAgIHRoaXMuY2hlY2tUaW1lID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGVja1RpbWUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblB1bGxkb3duTW91c2VVcCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyBzdGFydFRpbWUgfSA9IHRoaXMucHVsbGRvd25cbiAgICAgIGlmICghdGhpcy5jaGVja1RpbWUgfHwgc3RhcnRUaW1lICYmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gMjUwKSkge1xuICAgICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5vblB1bGxkb3duU2VsZWN0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QoLyogdmFsdWUgKi8pIHtcbiAgICAgIC8vIE5PVEU6IFRvIGJlIG92ZXJyaWRkZW4uXG4gICAgfSxcblxuICAgIHNldFB1bGxkb3duT3BlbihvcGVuKSB7XG4gICAgICB0aGlzLnB1bGxkb3duLm9wZW4gPSBvcGVuXG4gICAgICB0aGlzLnB1bGxkb3duLnN0YXJ0VGltZSA9IG9wZW4gPyBEYXRlLm5vdygpIDogMFxuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycyA9IHRoaXMuZG9tT24oZG9jdW1lbnQsIHRoaXMucHVsbGRvd24uZXZlbnRzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWFjY291bnRcbiAgYShcbiAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKClcIlxuICApXG4gICAgc3BhbiB7eyB1c2VyLnVzZXJuYW1lIH19XG4gIHVsLmRpdG8tcHVsbGRvd24oOmNsYXNzPVwieyAnZGl0by1vcGVuJzogcHVsbGRvd24ub3BlbiB9XCIpXG4gICAgbGkoXG4gICAgICB2LWZvcj1cIihsYWJlbCwgdmFsdWUpIG9mIGl0ZW1zXCJcbiAgICApXG4gICAgICBhKFxuICAgICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKHZhbHVlKVwiXG4gICAgICAgIEBtb3VzZXVwPVwib25QdWxsZG93bk1vdXNlVXAodmFsdWUpXCJcbiAgICAgICkge3sgbGFiZWwgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFB1bGxkb3duTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1B1bGxkb3duTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0FjY291bnQnLCB7XG4gIG1peGluczogW1B1bGxkb3duTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHNldHRpbmdzOiAnU2V0dGluZ3MnLFxuICAgICAgICBsb2dvdXQ6ICdMb2dvdXQnXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvblB1bGxkb3duU2VsZWN0KHZhbHVlKSB7XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xvZ291dCc6XG4gICAgICAgICAgdGhpcy5yb290Q29tcG9uZW50LmxvZ291dCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc2V0dGluZ3MnOlxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnVE9ETzogSW1wbGVtZW50IFNldHRpbmdzJylcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWFjY291bnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmRpdG8tcHVsbGRvd24ge1xuICAgIHRvcDogJHB1bGxkb3duLXBhZGRpbmctdmVyO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmNvbXBvbmVudChcbiAgdi1pZj1cImNvbnRlbnRcIlxuICA6aXM9XCJvcHRpb25zLnRhZyB8fCB0YWdcIlxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbikge3sgb3B0aW9ucy50ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0VsZW1lbnQnLCB7XG4gIHByb3BzOiB7XG4gICAgdGFnOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NwYW4nIH0sXG4gICAgY29udGVudDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9wdGlvbnMoKSB7XG4gICAgICBjb25zdCB7IGNvbnRlbnQgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc09iamVjdChjb250ZW50KSA/IGNvbnRlbnQgOiB7IHRleHQ6IGNvbnRlbnQgfVxuICAgIH0sXG5cbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy4kYXR0cnMuY2xhc3MsXG4gICAgICAgIC4uLmFzT2JqZWN0KHRoaXMub3B0aW9ucy5jbGFzcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3R5bGVzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy4kYXR0cnMuc3R5bGUsXG4gICAgICAgIC4uLmFzT2JqZWN0KHRoaXMub3B0aW9ucy5zdHlsZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGFzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBhc0FycmF5KHZhbHVlKS5yZWR1Y2UoKG9iamVjdCwgZW50cnkpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcoZW50cnkpKSB7XG4gICAgICBvYmplY3RbZW50cnldID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZW50cnkpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9iamVjdCwgZW50cnkpXG4gICAgfVxuICAgIHJldHVybiBvYmplY3RcbiAgfSwge30pXG59XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQuZGl0by1sYWJlbChcbiAgdi1pZj1cInRleHQgfHwgY29sbGFwc2libGVcIlxuICA6aXM9XCJ0YWdcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgOmNsYXNzPVwieyAnZGl0by1hY3RpdmUnOiBpc0FjdGl2ZSB9XCJcbilcbiAgLmRpdG8tY2hldnJvbihcbiAgICB2LWlmPVwiY29sbGFwc2libGVcIlxuICAgIDpjbGFzcz1cInsgJ2RpdG8tb3BlbmVkJzogIWNvbGxhcHNlZCB9XCJcbiAgKVxuICBEaXRvRWxlbWVudC5kaXRvLWxhYmVsLXByZWZpeChcbiAgICB2LWZvcj1cIihwcmVmaXgsIGluZGV4KSBvZiBwcmVmaXhlc1wiXG4gICAgOmtleT1cImBwcmVmaXgtJHtpbmRleH1gXCJcbiAgICB0YWc9XCJzcGFuXCJcbiAgICA6Y29udGVudD1cInByZWZpeFwiXG4gIClcbiAgbGFiZWwoXG4gICAgOmZvcj1cImRhdGFQYXRoXCJcbiAgICB2LWh0bWw9XCJ0ZXh0XCJcbiAgKVxuICBEaXRvRWxlbWVudC5kaXRvLWxhYmVsLXN1ZmZpeChcbiAgICB2LWZvcj1cIihzdWZmaXgsIGluZGV4KSBvZiBzdWZmaXhlc1wiXG4gICAgOmtleT1cImBzdWZmaXgtJHtpbmRleH1gXCJcbiAgICB0YWc9XCJzcGFuXCJcbiAgICA6Y29udGVudD1cInN1ZmZpeFwiXG4gIClcbiAgc2xvdChuYW1lPVwiZWRpdC1idXR0b25zXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTGFiZWwnLCB7XG4gIGVtaXRzOiBbJ2V4cGFuZCddLFxuXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRhZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlID8gJ2EnIDogJ2RpdidcbiAgICB9LFxuXG4gICAgdGV4dCgpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc09iamVjdChsYWJlbCkgPyBsYWJlbD8udGV4dCA6IGxhYmVsXG4gICAgfSxcblxuICAgIHByZWZpeGVzKCkge1xuICAgICAgcmV0dXJuIGFzQXJyYXkodGhpcy5sYWJlbD8ucHJlZml4KVxuICAgIH0sXG5cbiAgICBzdWZmaXhlcygpIHtcbiAgICAgIHJldHVybiBhc0FycmF5KHRoaXMubGFiZWw/LnN1ZmZpeClcbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlID8geyBvbkNsaWNrOiB0aGlzLm9uQ2xpY2sgfSA6IHt9XG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPT09IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2soKSB7XG4gICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gdGhpc1xuICAgICAgdGhpcy4kZW1pdCgnZXhwYW5kJywgdGhpcy5jb2xsYXBzZWQpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbGFiZWwge1xuICAtLWxhYmVsLXBhZGRpbmc6IDA7XG4gIC8vIEZvciBidXR0b25zIGFuZCBjaGV2cm9uIHRvIGFsaWduIHJpZ2h0OlxuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8vIFZlcnRpY2FsbHkgY2VudGVyIGFsbCBpdGVtcyBpbiB0aGUgbGFiZWwsIGUuZy4gY2hldnJvbiwgZWRpdC1idXR0b25zLlxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiB2YXIoLS1sYWJlbC1wYWRkaW5nKTtcbiAgbWFyZ2luOiAwIDAgJGZvcm0tc3BhY2luZy1oYWxmIDA7XG5cbiAgbGFiZWwge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBjdXJzb3I6IGluaGVyaXQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIGxhYmVsLFxuICAuZGl0by1sYWJlbC1wcmVmaXgsXG4gIC5kaXRvLWxhYmVsLXN1ZmZpeCB7XG4gICAgJjpudGgtbGFzdC1jaGlsZCgyKSB7XG4gICAgICAvLyBUbyBzdHJldGNoIGVpdGhlciBsYWJlbCBvciAuZGl0by1sYWJlbC1zdWZmaXggdG8gZnVsbCBhdmFpbGFibGUgd2lkdGhcbiAgICAgIC8vIHNvIHRoYXQgYnV0dG9ucyBhbHdheXMgYXBwZWFyIHJpZ2h0LWFsaWduZWQ6XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnXFxhMCc7IC8vICZuYnNwOztcbiAgICB9XG4gIH1cblxuICAuZGl0by1sYWJlbC1wcmVmaXgsXG4gIC5kaXRvLWxhYmVsLXN1ZmZpeCB7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG4gIH1cblxuICAuZGl0by1idXR0b25zIHtcbiAgICAvLyBNb3ZlIHRoZSBsYWJlbCBwYWRkaW5nIGluc2lkZSAuZGl0by1idXR0b25zLCBzbyB0aGF0IGl0IGNhcHR1cmVzIGFsbFxuICAgIC8vIG5lYXIgbW91c2UgZXZlbnRzOlxuICAgIG1hcmdpbjogY2FsYygtMSAqIHZhcigtLWxhYmVsLXBhZGRpbmcpKTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1sYWJlbC1wYWRkaW5nKTtcbiAgfVxuXG4gICYuZGl0by13aWR0aC1maWxsIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICAvLyBJbiBvcmRlciBmb3IgZWxsaXBzaXMgdG8gd29yayBvbiBsYWJlbHMgd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXIgbGF5b3V0LFxuICAgIC8vIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYWJzb2x1dGVseSBpbnNpZGUgaXRzIGNvbnRhaW5lci5cbiAgICBsYWJlbCB7XG4gICAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgICY6OmFmdGVyIHtcbiAgICAgIC8vIFNpbmNlIDxsYWJlbD4gdXNlcyBgcG9zaXRpb246IGFic29sdXRlYCwgc2V0IGNvbnRlbnQgdG8gYSB6ZXJvLXdpZHRoXG4gICAgICAvLyBzcGFjZSBvbiBpdHMgcGFyZW50IHRvIGVuZm9yY2UgdGhlIHJpZ2h0IHRleHQgaGVpZ2h0IGluIHRoZSBjb250YWluZXJcbiAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgIH1cbiAgfVxufVxuXG5hLmRpdG8tbGFiZWwge1xuICAmOmhvdmVyIHtcbiAgICAuZGl0by1jaGV2cm9uIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItZGFya2VyO1xuICAgIH1cbiAgfVxuXG4gICY6Zm9jdXM6bm90KDphY3RpdmUsIC5kaXRvLWFjdGl2ZSkge1xuICAgIC5kaXRvLWNoZXZyb24ge1xuICAgICAgLXdlYmtpdC10ZXh0LXN0cm9rZTogJGJvcmRlci13aWR0aCAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgICAvLyBEaXNwbGF5IGxhYmVscyBpbiBjb21wYWN0IHNjaGVtYSBhcyBpbmxpbmUtYmxvY2tzLCB0byBhbGxvdyBjb21wYWN0XG4gICAgLy8gbGF5b3V0cyB3aXRoIGB3aWR0aDogJ2F1dG8nYCBlbGVtZW50czpcbiAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byBjb250cm9sIHRoaXMgYmVoYXZpb3IuXG4gIH1cbn1cblxuLmRpdG8tc2NoZW1hLWNvbXBhY3Qge1xuICA+IC5kaXRvLXNjaGVtYS1jb250ZW50IHtcbiAgICA+IC5kaXRvLXBhbmUge1xuICAgICAgPiAuZGl0by1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHtcbiAgZ2V0SXRlbUZvcm1TY2hlbWEsXG4gIGdldEl0ZW1JZCxcbiAgZ2V0SXRlbVVpZCxcbiAgaXNMaXN0U291cmNlXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtRm9ybVNjaGVtYSxcblxuICAgIGdldEl0ZW1VaWQsXG5cbiAgICBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtLCBpbmRleCA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVHJhbnNpZW50ICYmIGluZGV4ICE9PSBudWxsXG4gICAgICAgID8gU3RyaW5nKGluZGV4KVxuICAgICAgICA6IGdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0pXG4gICAgfSxcblxuICAgIGdldEl0ZW1EYXRhUGF0aChzb3VyY2VTY2hlbWEsIGluZGV4KSB7XG4gICAgICBsZXQgeyBkYXRhUGF0aCB9ID0gdGhpc1xuICAgICAgaWYgKHNvdXJjZVNjaGVtYSAhPT0gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgZGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgc291cmNlU2NoZW1hLm5hbWUpXG4gICAgICB9XG4gICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICBkYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBpbmRleClcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhUGF0aFxuICAgIH0sXG5cbiAgICBmaW5kSXRlbUlkSW5kZXgoc291cmNlU2NoZW1hLCBkYXRhLCBpdGVtSWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pc1RyYW5zaWVudFxuICAgICAgICA/IC8vIEZvciB0cmFuc2llbnQgZGF0YSwgdGhlIGluZGV4IGlzIHVzZWQgYXMgdGhlIGlkXG4gICAgICAgICAgaXRlbUlkXG4gICAgICAgIDogZGF0YT8uZmluZEluZGV4KFxuICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSwgaW5kZXgpID09PSBpdGVtSWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gaW5kZXggOiBudWxsXG4gICAgfSxcblxuICAgIGdldEl0ZW1MYWJlbChzb3VyY2VTY2hlbWEsIGl0ZW0sIHtcbiAgICAgIGluZGV4ID0gbnVsbCxcbiAgICAgIGV4dGVuZGVkID0gZmFsc2UsXG4gICAgICBhc09iamVjdCA9IGZhbHNlXG4gICAgfSA9IHt9KSB7XG4gICAgICBjb25zdCB7IGl0ZW1MYWJlbCB9ID0gc291cmNlU2NoZW1hXG4gICAgICBpZiAoIWl0ZW0gfHwgIWV4dGVuZGVkICYmIGl0ZW1MYWJlbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgbGV0IGRhdGFQYXRoXG4gICAgICBjb25zdCBnZXREYXRhUGF0aCA9ICgpID0+XG4gICAgICAgIChkYXRhUGF0aCB8fD0gdGhpcy5nZXRJdGVtRGF0YVBhdGgoc291cmNlU2NoZW1hLCBpbmRleCkpXG5cbiAgICAgIGxldCBmb3JtTGFiZWxcbiAgICAgIGNvbnN0IGdldEZvcm1MYWJlbCA9ICgpID0+XG4gICAgICAgIChmb3JtTGFiZWwgfHw9IHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgICAgZ2V0SXRlbUZvcm1TY2hlbWEoc291cmNlU2NoZW1hLCBpdGVtLCB0aGlzLmNvbnRleHQpXG4gICAgICAgICkpXG5cbiAgICAgIGxldCB0ZXh0XG4gICAgICBsZXQgcHJlZml4XG4gICAgICBsZXQgc3VmZml4XG4gICAgICBpZiAoaXNGdW5jdGlvbihpdGVtTGFiZWwpKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaXRlbUxhYmVsLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgbmVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgIGluZGV4LFxuXG4gICAgICAgICAgICBnZXQgZGF0YVBhdGgoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXREYXRhUGF0aCgpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXQgZm9ybUxhYmVsKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Rm9ybUxhYmVsKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIGlmIChpc09iamVjdChsYWJlbCkpIHtcbiAgICAgICAgICA7KHsgdGV4dCwgcHJlZml4LCBzdWZmaXggfSA9IGxhYmVsKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSBsYWJlbFxuICAgICAgICB9XG4gICAgICAgIC8vIEl0J3MgdXAgdG8gYGl0ZW1MYWJlbCgpYCBlbnRpcmVseSB0byBwcm9kdWNlIHRoZSBsYWJlbDpcbiAgICAgICAgZXh0ZW5kZWQgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhpdGVtTGFiZWwpICYmICEoaXRlbUxhYmVsIGluIGl0ZW0pKSB7XG4gICAgICAgIC8vIGBpdGVtTGFiZWxgIGNhbiBiZSBib3RoIGEga2V5LCBvciBzaW1wbHkgYSBsYWJlbC5cbiAgICAgICAgdGV4dCA9IGl0ZW1MYWJlbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTG9vayB1cCB0aGUgbmFtZSBvbiB0aGUgaXRlbSwgYnkgdGhlc2UgcnVsZXM6XG4gICAgICAgIC8vIDEuIElmIGBpdGVtTGFiZWxgIGlzIGEgc3RyaW5nLCB1c2UgaXQgYXMgdGhlIHByb3BlcnR5IGtleVxuICAgICAgICAvLyAyLiBPdGhlcndpc2UsIGlmIHRoZXJlIGFyZSBjb2x1bW5zLCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdFxuICAgICAgICAvLyAzLiBPdGhlcndpc2UsIHNlZSBpZiB0aGUgaXRlbSBoYXMgYSBwcm9wZXJ0eSBuYW1lZCAnbmFtZSdcbiAgICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgICAgY29uc3Qga2V5ID0gKFxuICAgICAgICAgIGlzU3RyaW5nKGl0ZW1MYWJlbCkgJiYgaXRlbUxhYmVsIHx8XG4gICAgICAgICAgaXNMaXN0U291cmNlKHNvdXJjZVNjaGVtYSkgJiYgY29sdW1ucyAmJiBPYmplY3Qua2V5cyhjb2x1bW5zKVswXSB8fFxuICAgICAgICAgICduYW1lJ1xuICAgICAgICApXG4gICAgICAgIHRleHQgPSBpdGVtW2tleV1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhZExhYmVsID0gISF0ZXh0XG4gICAgICAvLyBJZiBubyBsYWJlbCB3YXMgZm91bmQgc28gZmFyLCB0cnkgdG8gcHJvZHVjZSBvbmUgZnJvbSB0aGUgaW5kZXguXG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIC8vIEFsd2F5cyB1c2UgZXh0ZW5kZWQgc3R5bGUgd2hlbiBhdXRvLWdlbmVyYXRpbmcgbGFiZWxzIGZyb20gaW5kZXgvaWQ6XG4gICAgICAgIGV4dGVuZGVkID0gdHJ1ZVxuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICBpc0xpc3RTb3VyY2Uoc291cmNlU2NoZW1hKSAmJiBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgPyAodGV4dCA9IGAke2luZGV4ICsgMX1gKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgfVxuICAgICAgaWYgKGV4dGVuZGVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm1MYWJlbCA9IGdldEZvcm1MYWJlbCgpXG4gICAgICAgIGlmIChmb3JtTGFiZWwpIHtcbiAgICAgICAgICAvLyBJZiBhIGxhYmVsIHdhcyBwcm92aWRlZCwgcHV0IGluIHF1b3RlcyB3aGVuIHByZWZpeGVkIHdpdGggdGhlXG4gICAgICAgICAgLy8gZm9ybSBsYWJlbCBmb3IgdGhlIGV4dGVuZGVkIHN0eWxlOlxuICAgICAgICAgIHRleHQgPSBgJHtmb3JtTGFiZWx9ICR7aGFkTGFiZWwgPyBgJyR7dGV4dH0nYCA6IHRleHR9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXNPYmplY3QgPyB7IHRleHQsIHByZWZpeCwgc3VmZml4IH0gOiB0ZXh0XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NoZW1hXG4gIC5kaXRvLXNjaGVtYS1jb250ZW50XG4gICAgLmRpdG8tc2NoZW1hLWhlYWRlcihcbiAgICAgIHYtaWY9XCJoYXNMYWJlbCB8fCBoYXNUYWJzIHx8IGNsaXBib2FyZFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1tZW51LWhlYWRlcic6IG1lbnVIZWFkZXIgfVwiXG4gICAgKVxuICAgICAgRGl0b0xhYmVsKFxuICAgICAgICB2LWlmPVwiaGFzTGFiZWxcIlxuICAgICAgICA6bGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgICA6Y29sbGFwc2VkPVwiIW9wZW5lZFwiXG4gICAgICAgIEBleHBhbmQ9XCJvbkV4cGFuZFwiXG4gICAgICApXG4gICAgICAgIC8vLSBQYXNzIGVkaXQtYnV0dG9ucyB0aHJvdWdoIHRvIGRpdG8tbGFiZWwncyBvd24gZWRpdC1idXR0b25zIHNsb3Q6XG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJpbmxpbmVkXCJcbiAgICAgICAgICAjZWRpdC1idXR0b25zXG4gICAgICAgIClcbiAgICAgICAgICBzbG90KG5hbWU9XCJlZGl0LWJ1dHRvbnNcIilcbiAgICAgIERpdG9UYWJzKFxuICAgICAgICB2LWlmPVwidGFic1wiXG4gICAgICAgIDp0YWJzPVwidGFic1wiXG4gICAgICAgIDpzZWxlY3RlZFRhYj1cInNlbGVjdGVkVGFiXCJcbiAgICAgIClcbiAgICAgIERpdG9DbGlwYm9hcmQoXG4gICAgICAgIDpjbGlwYm9hcmQ9XCJjbGlwYm9hcmRcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwiaGFzVGFic1wiXG4gICAgKVxuICAgICAgRGl0b1BhbmUuZGl0by1wYW5lLXRhYihcbiAgICAgICAgdi1mb3I9XCIodGFiU2NoZW1hLCB0YWIpIGluIHRhYnNcIlxuICAgICAgICByZWY9XCJ0YWJzXCJcbiAgICAgICAgOmtleT1cInRhYlwiXG4gICAgICAgIDp2aXNpYmxlPVwic2VsZWN0ZWRUYWIgPT09IHRhYlwiXG4gICAgICAgIDp0YWI9XCJ0YWJcIlxuICAgICAgICA6c2NoZW1hPVwidGFiU2NoZW1hXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpzaW5nbGU9XCIhaW5saW5lZCAmJiAhaGFzTWFpblBhbmVcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICAgIClcbiAgICBUcmFuc2l0aW9uSGVpZ2h0KDplbmFibGVkPVwiaW5saW5lZFwiKVxuICAgICAgRGl0b1BhbmUuZGl0by1wYW5lLW1haW4oXG4gICAgICAgIHYtaWY9XCJoYXNNYWluUGFuZSAmJiBvcGVuZWRcIlxuICAgICAgICByZWY9XCJjb21wb25lbnRzXCJcbiAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6c2luZ2xlPVwiIWlubGluZWQgJiYgIWhhc1RhYnNcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICAgIClcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiFpbmxpbmVkICYmIGlzUG9wdWxhdGVkXCJcbiAgICAgIG5hbWU9XCJidXR0b25zXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtaWY9XCJpbmxpbmVkXCJcbiAgKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiIWhhc0xhYmVsXCJcbiAgICAgIG5hbWU9XCJlZGl0LWJ1dHRvbnNcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1lbHNlLWlmPVwiaXNQb3B1bGF0ZWRcIlxuICApXG4gICAgRGl0b1BhbmVscyhcbiAgICAgIDpwYW5lbHM9XCJwYW5lbEVudHJpZXNcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc0Z1bmN0aW9uLFxuICBpc1JlZ0V4cCxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBUcmFuc2l0aW9uSGVpZ2h0IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuLi9taXhpbnMvSXRlbU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0TmFtZWRTY2hlbWFzLFxuICBnZXRQYW5lbEVudHJpZXMsXG4gIHNldERlZmF1bHRWYWx1ZXMsXG4gIHByb2Nlc3NEYXRhXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFN0b3JlQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvU2NoZW1hJywge1xuICBtaXhpbnM6IFtJdGVtTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFRyYW5zaXRpb25IZWlnaHQgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGluamVjdDogW1xuICAgICckc2NoZW1hUGFyZW50Q29tcG9uZW50J1xuICBdLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBpbmxpbmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGdlbmVyYXRlTGFiZWxzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoYXNPd25EYXRhOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbWVudUhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXMuc2NoZW1hXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBwcm92aWRlIG1vcmUgZGF0YSB0aHJvdWdoIGBzY2hlbWEuZGF0YWAsIHZ1ZS1zdHlsZTpcbiAgICAgIC4uLihcbiAgICAgICAgZGF0YSAmJiBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgICAgPyBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBzY2hlbWFDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHBhcmVudFNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIERvbid0IHJldHVybiB0aGUgYWN0dWFsIHBhcmVudCBzY2hlbWEgaXMgdGhpcyBzY2hlbWEgaGFuZGxlcyBpdHMgb3duXG4gICAgICAvLyBkYXRhLiBUaGlzIHByZXZlbnRzIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoZSBwYXJlbnQsIGFuZCByZWdpc3RlcmluZ1xuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIHRoZSBwYXJlbnQgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBzZXQgaXNEaXJ0eSBmbGFncy5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyBudWxsIDogdGhpcy5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIGNvbnN0IHBhbmVsRW50cmllcyA9IGdldFBhbmVsRW50cmllcyh0aGlzLnNjaGVtYS5wYW5lbHMsICcnKVxuICAgICAgZm9yIChjb25zdCBwYW5lIG9mIHRoaXMucGFuZXMpIHtcbiAgICAgICAgcGFuZWxFbnRyaWVzLnB1c2goLi4ucGFuZS5wYW5lbEVudHJpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFuZWxFbnRyaWVzXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIHNlbGVjdGVkVGFiKCkge1xuICAgICAgY29uc3QgY3VycmVudFRhYiA9IHRoaXMuJHJvdXRlLmhhc2g/LnNsaWNlKDEpIHx8IG51bGxcbiAgICAgIGNvbnN0IHRhYiA9XG4gICAgICAgIGN1cnJlbnRUYWIgJiYgdGhpcy5zaG91bGRSZW5kZXIodGhpcy50YWJzW2N1cnJlbnRUYWJdKVxuICAgICAgICAgID8gY3VycmVudFRhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiPy5uYW1lIHx8IG51bGxcbiAgICAgIGlmICh0YWIgIT09IGN1cnJlbnRUYWIpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHdhdGNoZXIhXG4gICAgICAgIC8vIEFueSB0YWIgY2hhbmdlIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcm91dGVyIGFsc28uXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgaGFzaDogYCMke3RhYn1gIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGFiXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIE9iamVjdC52YWx1ZXModGhpcy50YWJzKSkge1xuICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFRhYiB9ID0gdGFiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGdW5jdGlvbihkZWZhdWx0VGFiKVxuICAgICAgICAgICAgICA/IGRlZmF1bHRUYWIodGhpcy5jb250ZXh0KVxuICAgICAgICAgICAgICA6IGRlZmF1bHRUYWJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSB0YWJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWE/LmNsaXBib2FyZFxuICAgIH0sXG5cbiAgICBwYXJlbnREYXRhKCkge1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmVudEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgZmFsc2UpXG4gICAgICByZXR1cm4gZGF0YSAhPT0gdGhpcy5kYXRhID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHsgdGFyZ2V0OiAnc2VydmVyJywgc2NoZW1hT25seTogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmREYXRhKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHNjaGVtYTogdGhpcy5zY2hlbWEubmFtZSxcbiAgICAgICAgLi4udGhpcy5wcm9jZXNzRGF0YSh7IHRhcmdldDogJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHk6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgLy8gTk9URTogV2hpbGUgaW50ZXJuYWxseSwgd2Ugc3BlYWsgb2YgYGRhdGFgLCBpbiB0aGUgQVBJIHN1cmZhY2UgdGhlXG4gICAgLy8gdGVybSBgaXRlbWAgaXMgdXNlZCBmb3IgdGhlIGRhdGEgdGhhdCByZWxhdGVzIHRvIGVkaXRpbmcgb2JqZWN0cy5cbiAgICAvLyBOT1RFOiBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzOlxuICAgIC8vIHJldHVybiBnZXRJdGVtKHRoaXMucm9vdERhdGEsIHRoaXMuZGF0YVBhdGgsIGZhbHNlKVxuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnREYXRhXG4gICAgfSxcblxuICAgIHJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdERhdGFcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZERhdGFcbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsaXBib2FyZERhdGFcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZGF0ZWQpXG4gICAgfSxcblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxhYmVsIHx8IHRoaXMuY29sbGFwc2libGVcbiAgICB9LFxuXG4gICAgaGFzVGFicygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pbmxpbmVkICYmICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGhhc01haW5QYW5lKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuICEhY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIG9wZW5lZDogZ2V0U3RvcmVBY2Nlc3Nvcignb3BlbmVkJywge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbGxhcHNlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50cygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50c0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgIHRoaXMuZGVsZWdhdGUoJ2NoYW5nZScsIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50KVxuICAgIHRoaXMuZW1pdEV2ZW50KCdpbml0aWFsaXplJykgLy8gTm90IGAnY3JlYXRlJ2AsIHNpbmNlIHRoYXQncyBmb3IgZGF0YS5cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZW1pdEV2ZW50KCdkZXN0cm95JylcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHNCeU5hbWUoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5TmFtZSh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5TmFtZShuYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXModGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnQoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLnBhbmVsc0J5RGF0YVBhdGgsIGRhdGFQYXRoT3JOYW1lLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0UGFuZWwoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIHNvbWVDb21wb25lbnQoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmlzUG9wdWxhdGVkICYmIHRoaXMuY29tcG9uZW50cy5zb21lKGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBldmVyeUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLmV2ZXJ5KGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBvbkV4cGFuZChleHBhbmQpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdleHBhbmQnLCB7XG4gICAgICAgIC8vIFRPRE86IEFjdHVhbGx5IGV4cG9zZSB0aGlzIG9uIERpdG9Db250ZXh0P1xuICAgICAgICBjb250ZXh0OiB7IGV4cGFuZCB9XG4gICAgICB9KVxuICAgICAgLy8gUHJldmVudCBjbG9zaW5nIHRoZSBzY2hlbWEgd2l0aCBpbnZhbGlkIGRhdGEsIHNpbmNlIHRoZSBpbi1jb21wb25lbnRcbiAgICAgIC8vIHZhbGlkYXRpb24gd2lsbCBub3QgYmUgZXhlY3V0ZWQgb25jZSBpdCdzIGNsb3NlZC5cblxuICAgICAgLy8gVE9ETzogTW92ZSB2YWxpZGF0aW9uIG91dCBvZiBjb21wb25lbnRzLCB0byBzY2hlbWEsIGp1c3QgbGlrZVxuICAgICAgLy8gcHJvY2Vzc2luZywgYW5kIHVzZSBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgZm9yIHRoZSByZXN1bHRpbmcgZXJyb3JzLFxuICAgICAgLy8gdGhlbiByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgc2luY2Ugd2UgY2FuIHZhbGlkYXRlIGNsb3NlZCBmb3JtcyBhbmRcbiAgICAgIC8vIHNjaGVtYXMgdGhlbi5cbiAgICAgIGlmICghdGhpcy5vcGVuZWQgfHwgZXhwYW5kIHx8IHRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICB0aGlzLm9wZW5lZCA9IGV4cGFuZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/LmZvY3VzKClcbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZUFsbChtYXRjaCwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzQnlEYXRhUGF0aCB9ID0gdGhpc1xuICAgICAgbGV0IGRhdGFQYXRoc1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gaXNGdW5jdGlvbihtYXRjaClcbiAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgOiBpc1JlZ0V4cChtYXRjaClcbiAgICAgICAgICAgID8gZmllbGQgPT4gbWF0Y2gudGVzdChmaWVsZClcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBkYXRhUGF0aHMgPSBjaGVja1xuICAgICAgICAgID8gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpLmZpbHRlcihjaGVjaylcbiAgICAgICAgICA6IGlzQXJyYXkobWF0Y2gpXG4gICAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgICA6IFttYXRjaF1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWVcbiAgICAgIGxldCBmaXJzdCA9IHRydWVcbiAgICAgIGRhdGFQYXRocyB8fD0gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpXG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIG9mIGRhdGFQYXRocykge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aClcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmICghY29tcG9uZW50LnZhbGlkYXRlKG5vdGlmeSkpIHtcbiAgICAgICAgICAgIC8vIEZvY3VzIGZpcnN0IGVycm9yIGZpZWxkXG4gICAgICAgICAgICBpZiAobm90aWZ5ICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5mb2N1cygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkgJiYgIWlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlFcnJvcnMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzVmFsaWRcbiAgICB9LFxuXG4gICAgdmVyaWZ5QWxsKG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFsbChtYXRjaCwgZmFsc2UpXG4gICAgfSxcblxuICAgIGFzeW5jIHNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgZm9jdXMpIHtcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgY29uc3QgdW5tYXRjaGVkID0gW11cbiAgICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBlcnJzXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIC8vIElmIHRoZSBzY2hlbWEgaXMgYSBkYXRhLXJvb3QsIHByZWZpeCBpdHMgb3duIGRhdGFQYXRoIHRvIGFsbCBlcnJvcnMsXG4gICAgICAgIC8vIHNpbmNlIHRoZSBkYXRhIHRoYXQgaXQgc2VuZHMgYW5kIHZhbGlkYXRlcyB3aWxsIGJlIHVucHJlZml4ZWQuXG4gICAgICAgIGNvbnN0IGZ1bGxEYXRhUGF0aCA9IHRoaXMuaGFzT3duRGF0YVxuICAgICAgICAgID8gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgZGF0YVBhdGgpXG4gICAgICAgICAgOiBkYXRhUGF0aFxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLCB0aGlzLmRhdGFQYXRoLCB0aGlzLmhhc093bkRhdGEsIGZ1bGxEYXRhUGF0aClcbiAgICAgICAgLy8gQ29udmVydCBmcm9tIEphdmFTY3JpcHQgcHJvcGVydHkgYWNjZXNzIG5vdGF0aW9uLCB0byBvdXIgb3duIGZvcm1cbiAgICAgICAgLy8gb2YgcmVsYXRpdmUgSlNPTiBwb2ludGVycyBhcyBkYXRhLXBhdGhzOlxuICAgICAgICBjb25zdCBkYXRhUGF0aFBhcnRzID0gcGFyc2VEYXRhUGF0aChmdWxsRGF0YVBhdGgpXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNob3dWYWxpZGF0aW9uRXJyb3JzKGVycnMsIGZpcnN0ICYmIGZvY3VzKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlXG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGEgY29tcG9uZW50IGluIGFuIGFjdGl2ZSBmb3JtIGZvciB0aGUgZ2l2ZW4gZGF0YVBhdGguXG4gICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBmaW5kIGEgY29tcG9uZW50IHNlcnZpbmcgYSBwYXJ0IG9mIHRoZSBkYXRhUGF0aCxcbiAgICAgICAgICAvLyBhbmQgdGFrZSBpdCBmcm9tIHRoZXJlOlxuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZGF0YVBhdGhQYXJ0cy5wb3AoKVxuICAgICAgICAgIHdoaWxlIChkYXRhUGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhd2FpdCBjb21wb25lbnQubmF2aWdhdGVUb0NvbXBvbmVudD8uKFxuICAgICAgICAgICAgICAgICAgZnVsbERhdGFQYXRoLFxuICAgICAgICAgICAgICAgICAgc3ViQ29tcG9uZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHN1YkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJzID0gZXJyb3JzW2NvbXBvbmVudC5kYXRhUGF0aF1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5lc3RlZCBmb3JtIHRvIGRpc3BsYXkgYXQgbGVhc3QgcGFydHMgZm8gdGhlIGVycm9ycy5cbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBzaG93IGFsbCBlcnJvcnMgYXQgb25jZSwgc28gd2UncmUgZG9uZS4gRG9uJ3QgY2FsbFxuICAgICAgICAgICAgICAgIC8vIGBub3RpZnlFcnJvcnMoKWAgeWV0LCBhcyB3ZSBjYW4gb25seSBkaXNwbGF5IGl0IG9uY2VcbiAgICAgICAgICAgICAgICAvLyBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgd2FzIGNhbGxlZCBmcm9tIGBEaXRvRm9ybS5tb3VudGVkKClgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0aWxsIGhlcmUsIHNvIGtlZXAgcmVtb3ZpbmcgdGhlIGxhc3QgcGFydCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gICAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdoZW4gdGhlIGVycm9yIGNhbid0IGJlIG1hdGNoZWQsIGFkZCBpdCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkXG4gICAgICAgICAgLy8gZXJyb3JzIHdpdGggZGVjZW50IG1lc3NhZ2UsIHRvIHJlcG9ydCBhdCB0aGUgZW5kLlxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbGFiZWxpemUocHJvcGVydHkpXG4gICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJycykge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gZmllbGRcbiAgICAgICAgICAgICAgPyBgVGhlIGZpZWxkICR7ZmllbGR9YFxuICAgICAgICAgICAgICA6IGBUaGUgJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICAgICB1bm1hdGNoZWQucHVzaChgJHtwcmVmaXh9ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycyh1bm1hdGNoZWQuam9pbignXFxuJykpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG5vdGlmeUVycm9ycyhtZXNzYWdlKSB7XG4gICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIHRpdGxlOiAnVmFsaWRhdGlvbiBFcnJvcnMnLFxuICAgICAgICB0ZXh0OiBtZXNzYWdlIHx8ICdQbGVhc2UgY29ycmVjdCB0aGUgaGlnaGxpZ2h0ZWQgZXJyb3JzLidcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlc2V0RGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbid0IHNldCBgdGhpcy5kYXRhID0gLi4uYCBiZWNhdXNlIGl0J3MgYSBwcm9wZXJ0eSwgYnV0IHdlIGNhbiBzZXRcbiAgICAgIC8vIGFsbCBrbm93biBwcm9wZXJ0aWVzIG9uIGl0IHRvIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnlcbiAgICAgIC8vIGBzZXREZWZhdWx0VmFsdWVzKClgLCBhcyB0aGV5IGFyZSBhbGwgcmVhY3RpdmUgYWxyZWFkeSBmcm9tIHRoZSBzdGFydHM6XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGF0YSwgc2V0RGVmYXVsdFZhbHVlcyh0aGlzLnNjaGVtYSwge30sIHRoaXMpKVxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1tdXRhdGluZy1wcm9wc1xuICAgICAgICAgIHRoaXMuZGF0YVtuYW1lXSA9IGRhdGFbbmFtZV1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHNCeU5hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5tYXJrRGlydHkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmaWx0ZXJEYXRhKGRhdGEpIHtcbiAgICAgIC8vIEZpbHRlcnMgb3V0IGFycmF5cyBhbmQgb2JqZWN0cyB0aGF0IGFyZSBiYWNrIGJ5IGRhdGEgcmVzb3VyY2VzXG4gICAgICAvLyB0aGVtc2VsdmVzLCBhcyB0aG9zZSBhcmUgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aHJvdWdoIHRoZWlyIG93biBBUElcbiAgICAgIC8vIHJlc291cmNlIGVuZC1wb2ludHMgYW5kIHNob3VsZG4ndCBiZSBzZXQuXG4gICAgICBjb25zdCBjb3B5ID0ge31cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKVxuICAgICAgICAgIGlmIChjb21wb25lbnRzLnNvbWUoY29tcG9uZW50ID0+IGNvbXBvbmVudC5wcm92aWRlc0RhdGEpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb3B5W25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5XG4gICAgfSxcblxuICAgIHByb2Nlc3NEYXRhKHsgdGFyZ2V0ID0gJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHkgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NEYXRhKFxuICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgdGhpcy5zb3VyY2VTY2hlbWEsXG4gICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAge1xuICAgICAgICAgIC8vIE5lZWRlZCBmb3IgRGl0b0NvbnRleHQgaGFuZGxpbmcgaW5zaWRlIGBwcm9jZXNzRGF0YWAgYW5kXG4gICAgICAgICAgLy8gYHByb2Nlc3NTY2hlbWFEYXRhKClgOlxuICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICBzY2hlbWFPbmx5LFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIGAkc2NoZW1hUGFyZW50Q29tcG9uZW50KClgIGlzIG9ubHkgc2V0IGlmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIHVzZXNcbiAgICAgIC8vIHRoZSBgU2NoZW1hUGFyZW50TWl4aW5gOlxuICAgICAgdGhpcy4kc2NoZW1hUGFyZW50Q29tcG9uZW50KCk/Ll9yZWdpc3RlclNjaGVtYUNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZCkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJFbnRyeSh0aGlzLmNvbXBvbmVudHNSZWdpc3RyeSwgY29tcG9uZW50LCBhZGQpXG4gICAgICAvLyBPbmx5IHJlZ2lzdGVyIHdpdGggdGhlIHBhcmVudCBpZiBzY2hlbWEgc2hhcmVzIGRhdGEgd2l0aCBpdC5cbiAgICAgIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50Py5fcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50LCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmUocGFuZSwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZXNSZWdpc3RyeSwgcGFuZSwgYWRkKVxuICAgIH0sXG5cbiAgICBfcmVnaXN0ZXJQYW5lbChwYW5lbCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZWxzUmVnaXN0cnksIHBhbmVsLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckVudHJ5KHJlZ2lzdHJ5LCBlbnRyeSwgYWRkKSB7XG4gICAgICBjb25zdCB1aWQgPSBlbnRyeS4kdWlkXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHJlZ2lzdHJ5W3VpZF0gPSBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W3VpZF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2xpc3RFbnRyaWVzQnlEYXRhUGF0aChyZWdpc3RyeSkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVnaXN0cnkpLnJlZHVjZSgoZW50cmllc0J5RGF0YVBhdGgsIGVudHJ5KSA9PiB7XG4gICAgICAgIC8vIE11bHRpcGxlIGVudHJpZXMgY2FuIGJlIGxpbmtlZCB0byB0aGUgc2FtZSBkYXRhLXBhdGgsIGUuZy4gd2hlblxuICAgICAgICAvLyB0aGVyZSBhcmUgdGFicy4gTGluayBlYWNoIGRhdGEtcGF0aCB0byBhbiBhcnJheSBvZiBlbnRyaWVzLlxuICAgICAgICBjb25zdCB7IGRhdGFQYXRoIH0gPSBlbnRyeVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gKGVudHJpZXNCeURhdGFQYXRoW2RhdGFQYXRoXSB8fD0gW10pXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgcmV0dXJuIGVudHJpZXNCeURhdGFQYXRoXG4gICAgICB9LCB7fSlcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXMoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoKS5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgID8gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICAgICAgOiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIF9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpXSB8fCBbXSxcbiAgICAgICAgbWF0Y2hcbiAgICAgIClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgbmFtZSldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZmlsdGVyRW50cmllcyhlbnRyaWVzLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoID8gZW50cmllcy5maWx0ZXIobWF0Y2gpIDogZW50cmllc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8vIFRvIGRpc3BsYXkgc2NoZW1hIG5leHQgdG8gcGFuZWxzOlxuICBkaXNwbGF5OiBmbGV4O1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuXG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgIGZsZXg6IDEgMSAxMDAlO1xuICAgIC8vIFNvIHRoYXQgc2NoZW1hIGJ1dHRvbnMgY2FuIGJlIHN0aWNreSB0byB0aGUgYm90dG9tOlxuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudDtcblxuICAgID4gKjpvbmx5LWNoaWxkIHtcbiAgICAgIGdyaWQtcm93LWVuZDogbm9uZTtcbiAgICB9XG5cbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMsXG4gID4gLmRpdG8tcGFuZWxzIHtcbiAgICBmbGV4OiAxIDEgMCU7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG5cbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmcgJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nIDA7XG4gIH1cblxuICAvLyBEaXNwbGF5IGEgcnVsZXIgYmV0d2VlbiB0YWJiZWQgY29tcG9uZW50cyBhbmQgdG93YXJkcyB0aGUgLmRpdG8tYnV0dG9uc1xuICAuZGl0by1wYW5lLXRhYiArIC5kaXRvLXBhbmUtbWFpbiB7XG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIC8vIFVzZSBhIHBzZXVkbyBlbGVtZW50IHRvIGRpc3BsYXkgYSBydWxlciB3aXRoIHByb3BlciBtYXJnaW5zXG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpbiB0byB0aGUgcnVsZXJcbiAgICAgIG1hcmdpbjogJGNvbnRlbnQtcGFkZGluZyAkZm9ybS1zcGFjaW5nLWhhbGYgJGZvcm0tc3BhY2luZy1oYWxmO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gIC5kaXRvLXRhYnMsXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgfVxuXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgJjpvbmx5LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIH1cblxuICAgIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW46IDAgMCAkdGFiLW1hcmdpbiAkdGFiLW1hcmdpbjtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyIHtcbiAgICAvLyBCcmluZyB0aGUgdGFicyB1cCB0byB0aGUgbWVudS5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaGVpZ2h0OiAkbWVudS1oZWlnaHQ7XG4gICAgcGFkZGluZzogMCAkbWVudS1wYWRkaW5nLWhvcjtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6ICRtZW51LXotaW5kZXg7XG4gICAgLy8gVHVybiBvZmYgcG9pbnRlciBldmVudHMgc28gdGhhdCBEaXRvVHJhaWwga2VlcHMgcmVjZWl2aW5nIGV2ZW50cy4uLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC8vIC4uLmJ1dCBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0YWJzIGFuZCBidXR0b25zIChlLmcuIGNsaXBib2FyZClcbiAgICAvLyBsYXllcmVkIG9uIHRvcCBvZiBEaXRvVHJhaWwuXG4gICAgLmRpdG8tdGFicyxcbiAgICAuZGl0by1idXR0b25zIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICAgICAgZm9udC1zaXplOiAkbWVudS1mb250LXNpemU7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uLmRpdG8tbGFiZWwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIENhdGNoIGFsbCBjbGlja3MsIGV2ZW4gd2hlbiBpdCB3b3VsZCBiZSBwYXJ0aWFsbHkgY292ZXJlZCBieSBzY2hlbWEuXG4gICAgei1pbmRleDogMTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvU2NoZW1hLmRpdG8tc2NoZW1hLWlubGluZWQoXG4gIDpzY2hlbWE9XCJzY2hlbWFcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gIDpkYXRhPVwiZGF0YVwiXG4gIDptZXRhPVwibWV0YVwiXG4gIDpzdG9yZT1cInN0b3JlXCJcbiAgOmxhYmVsPVwiaXNDb21wYWN0ID8gbnVsbCA6IGxhYmVsXCJcbiAgOmlubGluZWQ9XCJ0cnVlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICA6Z2VuZXJhdGVMYWJlbHM9XCIhaXNDb21wYWN0XCJcbiAgOmNsYXNzPVwieyAnZGl0by1zY2hlbWEtY29tcGFjdCc6IGlzQ29tcGFjdCB9XCJcbilcbiAgLy8tIFJlbmRlciBkaXRvLWVkaXQtYnV0dG9ucyBmb3IgaW5saW5lZCBzY2hlbWFzIHNlcGFyYXRlbHkgZnJvbSBhbGxcbiAgLy8tIG90aGVycyBpbiBgVHlwZUxpc3RgIGFzIGEgc2NvcGUsIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgbGF5b3V0LlxuICB0ZW1wbGF0ZSgjZWRpdC1idXR0b25zKVxuICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgIHYtaWY9XCJkZWxldGFibGUgfHwgZHJhZ2dhYmxlIHx8IGVkaXRhYmxlXCJcbiAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICA6ZWRpdGFibGU9XCJlZGl0YWJsZVwiXG4gICAgICA6ZWRpdFBhdGg9XCJlZGl0UGF0aFwiXG4gICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgQGRlbGV0ZT1cIiRlbWl0KCdkZWxldGUnKVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc0NvbXBhY3QgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY2hlbWFJbmxpbmVkJywge1xuICBlbWl0czogWydkZWxldGUnXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRyYWdnYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGVsZXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdFBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiBpc0NvbXBhY3QodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIGhhc0xhYmVsKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzQ29tcGFjdCAmJiAhIXRoaXMubGFiZWxcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY2hlbWEtaW5saW5lZCB7XG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgIHBhZGRpbmc6IDA7XG5cbiAgICA+IC5kaXRvLXNjaGVtYS1oZWFkZXIge1xuICAgICAgLy8gQ2hhbmdlIHNwYWNpbmcgc28gLmRpdG8tbGFiZWwgY292ZXJzIHRoZSBmdWxsIC5kaXRvLXNjaGVtYS1oZWFkZXIuXG4gICAgICBtYXJnaW46IC0kZm9ybS1zcGFjaW5nO1xuXG4gICAgICAuZGl0by1sYWJlbCB7XG4gICAgICAgIC8vIEFkZCByZW1vdmVkICRmb3JtLXNwYWNpbmcgYWdhaW5cbiAgICAgICAgLS1sYWJlbC1wYWRkaW5nOiAjeyRmb3JtLXNwYWNpbmd9O1xuXG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgICAvLyBCZWNhdXNlIHRhYmxlcyBoYXZlIGEgZnVubnkgd2F5IG9mIGFsbG93aW5nIHRvbyBtdWNoIHdpZHRoIGdyb3d0aDpcbiAgICAgICAgbWF4LXdpZHRoOiAkY29udGVudC13aWR0aDtcbiAgICAgICAgLy8gUHJldmVudCBjb2xsYXBzaW5nIHRvIG1pbi1oZWlnaHQgd2hlbiBhbG9uZSBpblxuICAgICAgICAvLyAuZGl0by1zY2hlbWEtY29udGVudCwgZHVlIHRvIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnRcbiAgICAgICAgbWluLWhlaWdodDogMmVtO1xuICAgICAgfVxuXG4gICAgICAmICsgLmRpdG8tcGFuZSB7XG4gICAgICAgIC8vIE5lZWRlZCBmb3IgdHJhbnNpdGlvbi1oZWlnaHQgaW4gRGl0b1NjaGVtYTpcbiAgICAgICAgbWluLWhlaWdodDogJGZvcm0tc3BhY2luZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFuZShcbiAgdi1pZj1cImlzUG9wdWxhdGVkICYmIGNvbXBvbmVudFNjaGVtYXMubGVuZ3RoID4gMFwiXG4gIHYtc2hvdz1cInZpc2libGVcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1ge1xuICAgICAgc2NoZW1hLFxuICAgICAgZGF0YVBhdGgsXG4gICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgIG5lc3RlZCxcbiAgICAgIHN0b3JlXG4gICAgfSBpbiBjb21wb25lbnRTY2hlbWFzYFxuICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYmVmb3JlJ1wiXG4gICAgKVxuICAgIERpdG9Db250YWluZXIoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHNjaGVtYSlcIlxuICAgICAgOmtleT1cIm5lc3RlZERhdGFQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6c2luZ2xlPVwiaXNTaW5nbGVDb21wb25lbnRcIlxuICAgICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJnZW5lcmF0ZUxhYmVsc1wiXG4gICAgKVxuICAgIC5kaXRvLWJyZWFrKFxuICAgICAgdi1pZj1cInNjaGVtYS5icmVhayA9PT0gJ2FmdGVyJ1wiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBnZXRBbGxQYW5lbEVudHJpZXMsIGlzTmVzdGVkIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYW5lJywge1xuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiB0aGlzLnRhYkNvbXBvbmVudFxuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRhYjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaW5nbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB2aXNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGdlbmVyYXRlTGFiZWxzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGFiQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFiID8gdGhpcyA6IHRoaXMuJHRhYkNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIGNvbXBvbmVudFNjaGVtYXMoKSB7XG4gICAgICAvLyBDb21wdXRlIGEgY29tcG9uZW50cyBsaXN0IHdoaWNoIGhhcyB0aGUgZGF0YVBhdGggYmFrZWQgaW50byBpdHMga2V5c1xuICAgICAgLy8gYW5kIGFkZHMgdGhlIGtleSBhcyB0aGUgbmFtZSB0byBlYWNoIGNvbXBvbmVudCwgdXNlZCBmb3IgbGFiZWxzLCBldGMuXG4gICAgICAvLyBOT1RFOiBzY2hlbWEgY2FuIGJlIG51bGwgd2hpbGUgbXVsdGktZm9ybSBsaXN0cyBsb2FkIHRoZWlyIGRhdGEsXG4gICAgICAvLyBiZWNhdXNlIG9ubHkgdGhlIGF2YWlsYWJsZSBkYXRhIHdpbGwgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGZvcm0uXG4gICAgICAvLyBXaGVuIGVkaXRpbmcgcHJpbWl0aXZlIHZhbHVlcyB0aHJvdWdoIGEgZm9ybSwgZG8gbm90IGFwcGVuZCAnbmFtZScgdG9cbiAgICAgIC8vIHRoZSBjb21wb25lbnQncyBkYXRhUGF0aCBzbyBpdCBjYW4gYmUgbWFwcGVkIHRvIGZyb20gdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAgICAvLyBOT1RFOiBOb3QgYWxsIHNjaGVtYXMgLyBjb21wb25lbnRzIGhhdmUgYSBzb3VyY2VTY2hlbWEsIGUuZy4gZGlhbG9ncy5cbiAgICAgIGNvbnN0IHdyYXBQcmltaXRpdmVzID0gdGhpcy5zb3VyY2VTY2hlbWE/LndyYXBQcmltaXRpdmVzXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWE/LmNvbXBvbmVudHMgfHwge30pLm1hcChcbiAgICAgICAgKFtuYW1lLCBzY2hlbWFdKSA9PiB7XG4gICAgICAgICAgLy8gQWx3YXlzIGFkZCBuYW1lIHRvIGNvbXBvbmVudCBzY2hlbWEuXG4gICAgICAgICAgc2NoZW1hLm5hbWUgPSBuYW1lXG4gICAgICAgICAgLy8gU2hhcmUgZGF0YVBhdGggYW5kIHN0b3JlIHdpdGggcGFyZW50IGlmIG5vdCBuZXN0ZWQ6XG4gICAgICAgICAgY29uc3QgbmVzdGVkID0gaXNOZXN0ZWQoc2NoZW1hKVxuICAgICAgICAgIGNvbnN0IG5lc3RlZERhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgbmFtZSlcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgZGF0YVBhdGg6XG4gICAgICAgICAgICAgIG5lc3RlZCAmJiAhd3JhcFByaW1pdGl2ZXNcbiAgICAgICAgICAgICAgICA/IG5lc3RlZERhdGFQYXRoXG4gICAgICAgICAgICAgICAgOiB0aGlzLmRhdGFQYXRoLFxuICAgICAgICAgICAgbmVzdGVkRGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgICBzdG9yZTogbmVzdGVkID8gdGhpcy5nZXRDaGlsZFN0b3JlKG5hbWUpIDogdGhpcy5zdG9yZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBwYW5lbEVudHJpZXMoKSB7XG4gICAgICAvLyBHYXRoZXIgYWxsIHBhbmVsIHNjaGVtYXMgZnJvbSBhbGwgY29tcG9uZW50IHNjaGVtYXMsIGJ5IGZpbmRpbmcgdGhvc2VcbiAgICAgIC8vIHRoYXQgd2FudCB0byBwcm92aWRlIGEgcGFuZWwuIFNlZSBgZ2V0QWxsUGFuZWxFbnRyaWVzKClgIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U2NoZW1hcy5mbGF0TWFwKFxuICAgICAgICAoeyBzY2hlbWEsIG5lc3RlZERhdGFQYXRoOiBkYXRhUGF0aCB9KSA9PlxuICAgICAgICAgIGdldEFsbFBhbmVsRW50cmllcyhcbiAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQsXG4gICAgICAgICAgICB0aGlzLnRhYkNvbXBvbmVudFxuICAgICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaW5nbGUgJiYgdGhpcy5jb21wb25lbnRTY2hlbWFzLmxlbmd0aCA9PT0gMVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZSh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMudGFiKSB7XG4gICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgaGFzaDogYCMke3RoaXMudGFifWAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lIHtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIC8vIFJlbW92ZSB0aGUgcGFkZGluZyBhZGRlZCBieSBgLmRpdG8tY29udGFpbmVyYCBpbnNpZGUgYC5kaXRvLXBhbmVgOlxuICBtYXJnaW46ICgtJGZvcm0tc3BhY2luZykgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAvLyBBZGQgcmVtb3ZlZCBob3Jpem9udGFsIG1hcmdpbiBhZ2FpbiB0byBtYXgtd2lkdGg6XG4gIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGggKyAyICogJGZvcm0tc3BhY2luZy1oYWxmO1xuICAvLyBVc2UgYGZsZXg6IDAlYCBmb3IgYWxsIGAuZGl0by1wYW5lYCBleGNlcHQgYC5kaXRvLXBhbmUtbWFpbmAsXG4gIC8vIHNvIHRoYXQgdGhlIGAuZGl0by1idXR0b25zLW1haW5gIGNhbiBiZSBtb3ZlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tLlxuICBmbGV4OiAwJTtcblxuICAmLmRpdG8tcGFuZS1tYWluIHtcbiAgICBmbGV4OiAxMDAlO1xuICB9XG5cbiAgLmRpdG8tc2NoZW1hLWhlYWRlcjpub3QoLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyKSArICYge1xuICAgIC8vIENsZWFyIHRvcC1tYXJnaW4gaWYgdGhlIGNvbXBvbmVudHMgYXJlIHByZWNlZGVkIGJ5IGEgc2NoZW1hIGhlYWRlci5cbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG5cbiAgLmRpdG8tY29udGFpbmVyLS1vbWl0LXBhZGRpbmcgPiAmIHtcbiAgICAvLyBDbGVhciBtYXJnaW5zIHNldCBhYm92ZSBhZ2FpbiBpZiBwYXJlbnQgaXMgb21pdHRpbmcgcGFkZGluZy5cbiAgICBtYXJnaW46IDA7XG4gICAgbWF4LXdpZHRoOiB1bnNldDtcbiAgfVxuXG4gIC5kaXRvLWJyZWFrIHtcbiAgICBmbGV4OiAxMDAlO1xuICAgIGhlaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJhY3Rpb24odmFsdWUpIHtcbiAgY29uc3QgbWF0Y2ggPSAoXG4gICAgaXNTdHJpbmcodmFsdWUpICYmXG4gICAgdmFsdWUubWF0Y2goL15cXHMqKFsrLV0/XFxkKylcXHMqXFwvXFxzKihbKy1dP1xcZCspXFxzKiQvKVxuICApXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IFssIGRpdmlkZW5kLCBkaXZpc29yXSA9IG1hdGNoXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZGl2aWRlbmQpIC8gcGFyc2VGbG9hdChkaXZpc29yKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29udGFpbmVyKFxuICB2LXNob3c9XCJjb21wb25lbnRWaXNpYmxlXCJcbiAgOmNsYXNzPVwiY29udGFpbmVyQ2xhc3NcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZVwiXG4pXG4gIERpdG9MYWJlbChcbiAgICB2LWlmPVwiaGFzTGFiZWxcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gIClcbiAgY29tcG9uZW50LmRpdG8tY29tcG9uZW50KFxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpzaW5nbGU9XCJzaW5nbGVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpkaXNhYmxlZD1cImNvbXBvbmVudERpc2FibGVkXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gICAgQGVycm9ycz1cIm9uRXJyb3JzXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50LCBhbGlnbkJvdHRvbSwgb21pdFBhZGRpbmcgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBwYXJzZUZyYWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvbWF0aC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ29udGFpbmVyJywge1xuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzaW5nbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IHRoaXMubmVzdGVkIH0pXG4gICAgfSxcblxuICAgIHR5cGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0VHlwZUNvbXBvbmVudCh0aGlzLnNjaGVtYS50eXBlKVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsYWJlbCAhPT0gZmFsc2UgJiYgKFxuICAgICAgICAgICEhbGFiZWwgfHxcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTGFiZWxzICYmIHRoaXMudHlwZUNvbXBvbmVudD8uZ2VuZXJhdGVMYWJlbFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGFiZWwgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKSA6IG51bGxcbiAgICB9LFxuXG4gICAgbGFiZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIFVubmVzdGVkIHR5cGVzIGRvbid0IGhhdmUgYSBkYXRhUGF0aCBmb3IgdGhlbXNlbHZlcywgZG9uJ3QgdXNlIGl0OlxuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy5kYXRhUGF0aCA6IG51bGxcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlQ29tcG9uZW50Py5kZWZhdWx0V2lkdGhcbiAgICAgIH0sXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgLy8gVXNlIDEwMCUgPT0gMS4wIGFzIGRlZmF1bHQgd2lkdGggd2hlbiBub3RoaW5nIGlzIHNldDpcbiAgICAgICAgcmV0dXJuIHdpZHRoID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDEuMFxuICAgICAgICAgIDogaXNTdHJpbmcod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoLm1hdGNoKC9eXFxzKls8Pl0/XFxzKiguKikkLylbMV0gLy8gUmVtb3ZlIHdpZHRoIG9wZXJhdG9yXG4gICAgICAgICAgICA6IHdpZHRoXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRXaWR0aE9wZXJhdG9yOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHdpZHRoKVxuICAgICAgICAgID8gd2lkdGgubWF0Y2goL15cXHMqKFs8Pl0/KS8pWzFdIHx8IG51bGxcbiAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudFZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVDb21wb25lbnQ/LmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnREaXNhYmxlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Rpc2FibGVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiBkaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb250YWluZXJDbGFzcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IGNvbnRhaW5lckNsYXNzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tY29udGFpbmVyJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLXNpbmdsZWBdOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWhhcy1sYWJlbGBdOiB0aGlzLmhhc0xhYmVsLFxuICAgICAgICBbYCR7cHJlZml4fS0tYWxpZ24tYm90dG9tYF06IGFsaWduQm90dG9tKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLW9taXQtcGFkZGluZ2BdOiBvbWl0UGFkZGluZyh0aGlzLnNjaGVtYSksXG4gICAgICAgIC4uLihcbiAgICAgICAgICBpc1N0cmluZyhjb250YWluZXJDbGFzcylcbiAgICAgICAgICAgID8geyBbY29udGFpbmVyQ2xhc3NdOiB0cnVlIH1cbiAgICAgICAgICAgIDogY29udGFpbmVyQ2xhc3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb21wb25lbnRXaWR0aFxuICAgICAgLy8gJ2F1dG8nID0gbm8gZml0dGluZzpcbiAgICAgIGNvbnN0IGJhc2lzID0gW251bGwsICdhdXRvJywgJ2ZpbGwnXS5pbmNsdWRlcyh3aWR0aClcbiAgICAgICAgPyAnYXV0bydcbiAgICAgICAgOiAvJSQvLnRlc3Qod2lkdGgpXG4gICAgICAgICAgPyBwYXJzZUZsb2F0KHdpZHRoKSAvLyBwZXJjZW50YWdlXG4gICAgICAgICAgOiAvW2Etel0vLnRlc3Qod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoIC8vIG5hdGl2ZSB1bml0c1xuICAgICAgICAgICAgOiBwYXJzZUZyYWN0aW9uKHdpZHRoKSAqIDEwMCAvLyBmcmFjdGlvblxuICAgICAgcmV0dXJuIGlzTnVtYmVyKGJhc2lzKSA/IGAke2Jhc2lzfSVgIDogYmFzaXNcbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGUoKSB7XG4gICAgICAvLyBJbnRlcnByZXQgJz41MCUnIGFzICc1MCUsIGZsZXgtZ3JvdzogMWBcbiAgICAgIGNvbnN0IGdyb3cgPSAoXG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJz4nIHx8XG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJ1xuICAgICAgKVxuICAgICAgLy8gSW50ZXJwcmV0ICc8NTAlJyBhcyAnNTAlLCBmbGV4LXNocmluazogMWBcbiAgICAgIGNvbnN0IHNocmluayA9IHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJzwnXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGV4OiBgJHtncm93ID8gMSA6IDB9ICR7c2hyaW5rID8gMSA6IDB9ICR7dGhpcy5jb21wb25lbnRCYXNpc31gXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzKCkge1xuICAgICAgY29uc3QgYmFzaXNJc0F1dG8gPSB0aGlzLmNvbXBvbmVudEJhc2lzID09PSAnYXV0bydcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRPRE86IEJFTVxuICAgICAgICAnZGl0by1zaW5nbGUnOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLmNvbXBvbmVudERpc2FibGVkLFxuICAgICAgICAnZGl0by13aWR0aC1maWxsJzogIWJhc2lzSXNBdXRvIHx8IHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJyxcbiAgICAgICAgJ2RpdG8td2lkdGgtYXV0byc6IGJhc2lzSXNBdXRvLFxuICAgICAgICAnZGl0by1oYXMtZXJyb3JzJzogISF0aGlzLmVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25FcnJvcnMoZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9yc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uO1xuICAvLyBOZWVkZWQgZm9yIGJldHRlciB2ZXJ0aWNhbCBhbGlnbm1lbnQ6XG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8vIFRvIHByZXZlbnQgbGlzdCB0YWJsZXMgZnJvbSBibG93aW5nIG91dCBvZiB0aGVpciBmbGV4IGJveCBjb250YWluZXJzLlxuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8vIENhbm5vdCB1c2UgbWFyZ2luIGhlcmUgYXMgaXQgbmVlZHMgdG8gYmUgcGFydCBvZiBib3gtc2l6aW5nIGZvclxuICAvLyBwZXJjZW50YWdlcyBpbiBmbGV4LWJhc2lzIHRvIHdvcmsuXG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmcgJGZvcm0tc3BhY2luZy1oYWxmO1xuXG4gICY6ZW1wdHkge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAmLS1hbGlnbi1ib3R0b20ge1xuICAgIGp1c3RpZnktY29udGVudDogZW5kOyAvLyBUbyBhbGlnbiBjb21wb25lbnRzIHdpdGggYW5kIHdpdGhvdXQgbGFiZWxzLlxuICB9XG5cbiAgJi0tb21pdC1wYWRkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgPiAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46ICRmb3JtLXNwYWNpbmcgJGZvcm0tc3BhY2luZy1oYWxmIDA7XG4gICAgfVxuICB9XG5cbiAgJi0tc2luZ2xlIHtcbiAgICBoZWlnaHQ6IDEwMCU7IC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgYXQgdGhlIGJvdHRvbTtcbiAgfVxufVxuXG4vLyBOT1RFOiBUaGlzIGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGAuZGl0by1jb250YWluZXJgIHNvIHRoYXQgb3RoZXJcbi8vIHR5cGUgY29tcG9uZW50cyBjYW4gb3ZlcnJpZGUgYC5kaXRvLXdpZHRoLWZpbGxgIGNsYXNzIChmaWx0ZXIgcHJlY2VkZW5jZSkuXG4uZGl0by1jb21wb25lbnQge1xuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAmLmRpdG8tY2hlY2tib3gsXG4gICAgJi5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgICAvLyBXZWJLaXQgZG9lc24ndCBsaWtlIGNoYW5nZWQgd2lkdGggb24gY2hlY2tib3hlcyBhbmQgcmFkaW9zLCBvdmVycmlkZTpcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10YWJzXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwiKHRhYlNjaGVtYSwga2V5KSBpbiB0YWJzXCJcbiAgKVxuICAgIFJvdXRlckxpbmsuZGl0by1saW5rKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcih0YWJTY2hlbWEpXCJcbiAgICAgIDprZXk9XCJrZXlcIlxuICAgICAgOnRvPVwieyBoYXNoOiBgIyR7a2V5fWAgfVwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IHNlbGVjdGVkVGFiID09PSBrZXkgfVwiXG4gICAgKSB7eyBnZXRMYWJlbCh0YWJTY2hlbWEsIGtleSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJzJywge1xuICBwcm9wczoge1xuICAgIHRhYnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2VsZWN0ZWRUYWI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbiR0YWItY29sb3ItYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXN0O1xuJHRhYi1jb2xvci1pbmFjdGl2ZTogJGNvbG9yLWxpZ2h0O1xuJHRhYi1jb2xvci1hY3RpdmU6ICRjb2xvci1saWdodGVzdDtcbiR0YWItY29sb3ItaG92ZXI6ICRjb2xvci13aGl0ZTtcblxuLmRpdG8tdGFicyB7XG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlcGVuLmlvL3Rob2xleC9wZW4vaHZlQngvXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuXG4gIGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1pbmFjdGl2ZTtcbiAgICBwYWRkaW5nOiAkdGFiLXBhZGRpbmctdmVyICR0YWItcGFkZGluZy1ob3I7XG4gICAgbWFyZ2luLWxlZnQ6ICR0YWItbWFyZ2luO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkdGFiLXJhZGl1cztcblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1ob3ZlcjtcbiAgICB9XG5cbiAgICAmOmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAmLmRpdG8tYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItYmFja2dyb3VuZDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIE9ubHkgc2hvdyBwYW5lbHMgaW4gdGFicyB3aGVuIHRoZSB0YWJzIGFyZSBhbHNvIHZpc2libGUuXG5jb21wb25lbnQuZGl0by1wYW5lbChcbiAgdi1zaG93PVwidmlzaWJsZSAmJiAoIXBhbmVsVGFiQ29tcG9uZW50IHx8IHBhbmVsVGFiQ29tcG9uZW50LnZpc2libGUpXCJcbiAgOmlzPVwicGFuZWxUYWdcIlxuICBAc3VibWl0LnByZXZlbnRcbilcbiAgbGFiZWwuZGl0by1wYW5lbC10aXRsZSB7eyBnZXRMYWJlbChzY2hlbWEpIH19XG4gIERpdG9TY2hlbWEuZGl0by1wYW5lbC1zY2hlbWEoXG4gICAgOnNjaGVtYT1cInBhbmVsU2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICA6ZGF0YT1cInBhbmVsRGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpoYXNPd25EYXRhPVwiaGFzT3duRGF0YVwiXG4gIClcbiAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgIERpdG9CdXR0b25zKFxuICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVsJywge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhbmVsVGFiQ29tcG9uZW50OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhbmVsQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgdGFiQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWxUYWJDb21wb25lbnRcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIHRhcmdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS50YXJnZXQgfHwgdGhpcy5kYXRhUGF0aFxuICAgIH0sXG5cbiAgICBoYXNPd25EYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5vd25EYXRhXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm93bkRhdGEgfHwgdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhbmVsU2NoZW1hKCkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duRGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBgZGF0YWAgZnJvbSB0aGUgc2NoZW1hLCBzbyB0aGF0IERpdG9TY2hlbWEgaXNuJ3QgdXNpbmcgaXQgdG9cbiAgICAgICAgLy8gcHJvZHVjZSBpdHMgb3duIGRhdGEuIFNlZSAkZmlsdGVycyBwYW5lbCBmb3IgbW9yZSBkZXRhaWxzIG9uIGRhdGEuXG4gICAgICAgIGNvbnN0IHsgZGF0YSwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICByZXR1cm4gc2NoZW1hXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhbmVsVGFnKCkge1xuICAgICAgLy8gUGFuZWxzIHRoYXQgcHJvdmlkZSB0aGVpciBvd24gZGF0YSBuZWVkIHRoZWlyIG93biBmb3JtLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/ICdmb3JtJyA6ICdkaXYnXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YVBhdGgoKSB7XG4gICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBkYXRhLCB0aGVuIGl0IG5lZWRzIHRvIHByZWZpeCBhbGxcbiAgICAgIC8vIGNvbXBvbmVudHMgd2l0aCBpdHMgZGF0YS1wYXRoLCBidXQgaWYgaXQgc2hhcmVzIGRhdGEgd2l0aCB0aGUgc2NoZW1hXG4gICAgICAvLyBjb21wb25lbnQsIHRoZW4gaXQgc2hvdWxkIHNoYXJlIHRoZSBkYXRhLXBhdGggbmFtZSBzcGFjZSB0b28uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gdGhpcy5kYXRhUGF0aCA6IHRoaXMuc2NoZW1hQ29tcG9uZW50LmRhdGFQYXRoXG4gICAgfSxcblxuICAgIHZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBgc2NoZW1hLmRhdGFgIGhhbmRsaW5nIGluIERpdG9TY2hlbWEsXG4gICAgLy8gd2hlcmUgdGhlIGRhdGEgaXMgYWRkZWQgdG8gdGhlIGFjdHVhbCBjb21wb25lbnQuXG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLm93bkRhdGEgPSBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgID8gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgIDogZGF0YVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgcGFuZWxzIHNvIHRoYXQgb3RoZXIgY29tcG9uZW50cyBjYW4gZmluZCB0aGVtIGJ5IHRoZWlyXG4gICAgICAvLyBkYXRhLXBhdGgsIGUuZy4gaW4gVHlwZUxpc3Qub25GaWx0ZXJFcnJvcnMoKVxuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZWwodGhpcywgYWRkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVsIHtcbiAgbWFyZ2luLWJvdHRvbTogJGNvbnRlbnQtcGFkZGluZztcblxuICAuZGl0by1wYW5lbC10aXRsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kOiAkYnV0dG9uLWNvbG9yO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIH1cblxuICAuZGl0by1wYW5lbC1zY2hlbWEge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblxuICAgID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmICRmb3JtLXNwYWNpbmc7XG5cbiAgICAgID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgICAgIC0tYnV0dG9uLW1hcmdpbjogI3skZm9ybS1zcGFjaW5nfTtcblxuICAgICAgICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1vYmplY3Qge1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgIGxhYmVsIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1wYW5lIHtcbiAgICAgIG1hcmdpbjogMCAoLSRmb3JtLXNwYWNpbmctaGFsZik7XG4gICAgfVxuXG4gICAgLmRpdG8tY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFuZWxzKFxuICB2LWlmPVwicGFuZWxzLmxlbmd0aCA+IDBcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cInsgc2NoZW1hLCBkYXRhUGF0aCwgdGFiQ29tcG9uZW50IH0gaW4gcGFuZWxzXCJcbiAgKVxuICAgIERpdG9QYW5lbChcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwiZ2V0UGFuZWxLZXkoZGF0YVBhdGgsIHRhYkNvbXBvbmVudClcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoc2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cInNjaGVtYS5kaXNhYmxlZCAhPSBudWxsID8gc2NoZW1hLmRpc2FibGVkIDogZGlzYWJsZWRcIlxuICAgICAgOnBhbmVsVGFiQ29tcG9uZW50PVwidGFiQ29tcG9uZW50XCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvUGFuZWxzJywge1xuICBwcm9wczoge1xuICAgIHBhbmVsczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFBhbmVsS2V5KGRhdGFQYXRoLCB0YWJDb21wb25lbnQpIHtcbiAgICAgIC8vIEFsbG93IHNlcGFyYXRlIHRhYnMgdG8gdXNlIHBhbmVscyBvZiB0aGUgc2FtZSBuYW1lLCBieVxuICAgICAgLy8gcHJlZml4aW5nIHRoZWlyIGtleSB3aXRoIHRoZSB0YWIgbmFtZS5cbiAgICAgIHJldHVybiB0YWJDb21wb25lbnQgPyBgJHt0YWJDb21wb25lbnQudGFifV8ke2RhdGFQYXRofWAgOiBkYXRhUGF0aFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVscyB7XG4gIG1heC13aWR0aDogJGNvbnRlbnQtc2lkZWJhci13aWR0aDtcbiAgbWluLXdpZHRoOiBjYWxjKCRjb250ZW50LXNpZGViYXItd2lkdGggLyAyKTtcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyB1c2VTbG90cywgQ29tbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZOb2RlQ29udGVudCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUgJiYgYXNBcnJheSh2bm9kZSkuc29tZSh2bm9kZSA9PiB2bm9kZS50eXBlICE9PSBDb21tZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2xvdENvbnRlbnQoc2xvdCwgcHJvcHMgPSB7fSkge1xuICBzbG90ID0gaXNTdHJpbmcoc2xvdCkgPyB1c2VTbG90cygpW3Nsb3RdIDogc2xvdFxuICByZXR1cm4gaGFzVk5vZGVDb250ZW50KHNsb3Q/Lihwcm9wcykpXG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tYnV0dG9ucyhcbiAgdi1pZj1cImJ1dHRvblNjaGVtYXMgfHwgaGFzU2xvdENvbnRlbnQoJHNsb3RzLmRlZmF1bHQpXCJcbilcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCIoYnV0dG9uU2NoZW1hLCBidXR0b25EYXRhUGF0aCkgaW4gYnV0dG9uU2NoZW1hc1wiXG4gIClcbiAgICBEaXRvQ29udGFpbmVyKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihidXR0b25TY2hlbWEpXCJcbiAgICAgIDprZXk9XCJidXR0b25EYXRhUGF0aFwiXG4gICAgICA6c2NoZW1hPVwiYnV0dG9uU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImJ1dHRvbkRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShidXR0b25TY2hlbWEubmFtZSlcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZmFsc2VcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCJ2bm9kZSBvZiAkc2xvdHMuZGVmYXVsdD8uKClcIlxuICApXG4gICAgLy8tIFJlbmRlciBlYWNoIG5vZGUgaW4gdGhlIGRlZmF1bHQgc2xvdCB0aHJvdWdoIGBkaXRvLXZub2RlYCxcbiAgICAvLy0gc28gaXQgY2FuIGJlIHdyYXBwZWQgaW4gYSBgLmRpdG8tY29udGFpbmVyYCBjbGFzcy5cbiAgICAuZGl0by1jb250YWluZXIoXG4gICAgICB2LWlmPVwiaGFzVk5vZGVDb250ZW50KHZub2RlKVwiXG4gICAgKVxuICAgICAgRGl0b1Zub2RlKDp2bm9kZT1cInZub2RlXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGhhc1Nsb3RDb250ZW50LCBoYXNWTm9kZUNvbnRlbnQgfSBmcm9tICcuLi91dGlscy92dWUuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0J1dHRvbnMnLCB7XG4gIHByb3ZpZGU6IHtcbiAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiBudWxsXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBidXR0b25zIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzLlxuICAgICAgY29uc3QgeyBkYXRhUGF0aCwgYnV0dG9ucyB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGJ1dHRvbnNcbiAgICAgICAgPyBPYmplY3QudmFsdWVzKGJ1dHRvbnMpLnJlZHVjZSgoc2NoZW1hcywgYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBzY2hlbWFzW2FwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBidXR0b24ubmFtZSldID0gYnV0dG9uXG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hc1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc1Nsb3RDb250ZW50LFxuICAgIGhhc1ZOb2RlQ29udGVudFxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tYnV0dG9ucyB7XG4gID4gLmRpdG8tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBTZXQgYEBjbGljay5zdG9wYCB0byBwcmV2ZW50IGNsaWNrIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIGRpdG8tbGFiZWwuXG5EaXRvQnV0dG9ucy5kaXRvLWVkaXQtYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQoXG4gIDpidXR0b25zPVwiYnV0dG9uc1wiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICBAY2xpY2suc3RvcFxuKVxuICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICBhLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0RyYWdnYWJsZVwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gIClcbiAgUm91dGVyTGluay5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNFZGl0YWJsZVwiXG4gICAgOnRvPVwieyBwYXRoOiBlZGl0UGF0aCB9XCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmVkaXQpXCJcbiAgKVxuICBEaXRvQ3JlYXRlQnV0dG9uKFxuICAgIHYtaWY9XCJpc0NyZWF0YWJsZVwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOnBhdGg9XCJjcmVhdGVQYXRoXCJcbiAgICA6dmVyYj1cInZlcmJzLmNyZWF0ZVwiXG4gICAgOnRleHQ9XCJjcmVhdGVCdXR0b25UZXh0XCJcbiAgKVxuICBidXR0b24uZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRGVsZXRhYmxlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgIEBjbGljaz1cIiRlbWl0KCdkZWxldGUnKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0VkaXRCdXR0b25zJywge1xuICBlbWl0czogWydkZWxldGUnXSxcblxuICBwcm9wczoge1xuICAgIGRyYWdnYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY3JlYXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGVsZXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdFBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3JlYXRlUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb3JtTGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYS5mb3JtKVxuICAgIH0sXG5cbiAgICBpc0RyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZHJhZ2dhYmxlJylcbiAgICB9LFxuXG4gICAgaXNFZGl0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZWRpdGFibGUnKSAmJiAhIXRoaXMuZWRpdFBhdGhcbiAgICB9LFxuXG4gICAgaXNDcmVhdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2NyZWF0YWJsZScpICYmICEhdGhpcy5jcmVhdGVQYXRoXG4gICAgfSxcblxuICAgIGlzRGVsZXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdkZWxldGFibGUnKVxuICAgIH0sXG5cbiAgICBjcmVhdGVCdXR0b25UZXh0KCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gQWxsb3cgc2NoZW1hIHRvIG92ZXJyaWRlIGNyZWF0ZSBidXR0b24gdGhyb3VnaCBjcmVhdGFibGUgb2JqZWN0OlxuICAgICAgICB0aGlzLnNjaGVtYS5jcmVhdGFibGU/LmxhYmVsIHx8IChcbiAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlIGNyZWF0ZSBidXR0b24gbGFiZWxzIGZyb20gZnJvbSBsYWJlbHMgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzIHdpdGggb25seSBvbmUgZm9ybTpcbiAgICAgICAgICB0aGlzLmZvcm1MYWJlbCAmJlxuICAgICAgICAgIGAke2NhcGl0YWxpemUodGhpcy52ZXJicy5jcmVhdGUpfSAke3RoaXMuZm9ybUxhYmVsfWBcbiAgICAgICAgKSB8fFxuICAgICAgICBudWxsXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNPcHRpb24obmFtZSkge1xuICAgICAgLy8gVGhlIG9wdGlvbnMgb2YgdGhlIG91dGVyIGNvbXBvbmVudCBhcmUgcGFzc2VkIHRvIHRoZSBidXR0b25zIGNvbXBvbmVudFxuICAgICAgLy8gdGhyb3VnaCBwcm9wZXJ0aWVzIGB0aGlzW25hbWVdYCwgYnV0IGNhbiBiZSBkaXNhYmxlZCBvbiBhIHBlci1mb3JtXG4gICAgICAvLyBiYXNpcyBieSBzZXR0aW5nIGBzY2hlbWFbbmFtZV1gIHRvIGBmYWxzZWAuXG4gICAgICByZXR1cm4gISEodGhpc1tuYW1lXSAmJiB0aGlzLnNjaGVtYVtuYW1lXSAhPT0gZmFsc2UpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZWRpdC1idXR0b25zIHtcbiAgLy8gT3ZlcnJpZGUgY3Vyc29yIGZyb20gY29sbGFwc2libGUgZGl0by1sYWJlbDpcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmbGV4OiBub25lO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uXG4gIHRlbXBsYXRlKFxuICAgIHYtaWY9XCJzaG93UHVsbGRvd25cIlxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJgZGl0by1idXR0b24tJHt2ZXJifWBcIlxuICAgICAgOnRpdGxlPVwibGFiZWxpemUodmVyYilcIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bigpXCJcbiAgICApIHt7IHRleHQgfX1cbiAgICB1bC5kaXRvLXB1bGxkb3duKDpjbGFzcz1cInsgJ2RpdG8tb3Blbic6IHB1bGxkb3duLm9wZW4gfVwiKVxuICAgICAgbGkoXG4gICAgICAgIHYtZm9yPVwiKGZvcm0sIHR5cGUpIGluIGZvcm1zXCJcbiAgICAgIClcbiAgICAgICAgYShcbiAgICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGZvcm0pXCJcbiAgICAgICAgICB2LXNob3c9XCJzaG91bGRTaG93KGZvcm0pXCJcbiAgICAgICAgICA6Y2xhc3M9XCJnZXRGb3JtQ2xhc3MoZm9ybSwgdHlwZSlcIlxuICAgICAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24odHlwZSlcIlxuICAgICAgICAgIEBtb3VzZXVwPVwib25QdWxsZG93bk1vdXNlVXAodHlwZSlcIlxuICAgICAgICApIHt7IGdldExhYmVsKGZvcm0pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICB2LWVsc2VcbiAgICA6dHlwZT1cImlzSW5saW5lZCA/ICdidXR0b24nIDogJ3N1Ym1pdCdcIlxuICAgIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gICAgOnRpdGxlPVwibGFiZWxpemUodmVyYilcIlxuICAgIEBjbGljaz1cImNyZWF0ZUl0ZW0oZm9ybXMuZGVmYXVsdClcIlxuICApIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFB1bGxkb3duTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1B1bGxkb3duTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRGb3JtU2NoZW1hcywgaXNJbmxpbmVkIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9DcmVhdGVCdXR0b24nLCB7XG4gIG1peGluczogW1B1bGxkb3duTWl4aW5dLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB2ZXJiOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb3JtcygpIHtcbiAgICAgIHJldHVybiBnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KVxuICAgIH0sXG5cbiAgICBpc0lubGluZWQoKSB7XG4gICAgICByZXR1cm4gaXNJbmxpbmVkKHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBzaG93UHVsbGRvd24oKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mb3JtcykubGVuZ3RoID4gMSB8fCAhdGhpcy5mb3Jtcy5kZWZhdWx0XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBjcmVhdGVJdGVtKGZvcm0sIHR5cGUgPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRSZW5kZXIoZm9ybSkgJiYgIXRoaXMuc2hvdWxkRGlzYWJsZShmb3JtKSkge1xuICAgICAgICBpZiAodGhpcy5pc0lubGluZWQpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNvbXBvbmVudC5jcmVhdGVJdGVtKGZvcm0sIHR5cGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgLFxuICAgICAgICAgICAgcXVlcnk6IHsgdHlwZSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsb3dlZCB0byBjcmVhdGUgaXRlbSBmb3IgZ2l2ZW4gZm9ybScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEZvcm1DbGFzcyhmb3JtLCB0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYGRpdG8tdHlwZS0ke3R5cGV9YF06IHRydWUsXG4gICAgICAgICdkaXRvLWRpc2FibGVkJzogdGhpcy5zaG91bGREaXNhYmxlKGZvcm0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QodHlwZSkge1xuICAgICAgdGhpcy5jcmVhdGVJdGVtKHRoaXMuZm9ybXNbdHlwZV0sIHR5cGUpXG4gICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICByaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jbGlwYm9hcmQuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgdi1pZj1cImNsaXBib2FyZFwiXG4pXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1jb3B5KFxuICAgIHJlZj1cImNvcHlEYXRhXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIkNvcHkgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIWNvcHlFbmFibGVkXCJcbiAgICBAY2xpY2s9XCJvbkNvcHlcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1wYXN0ZShcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIlBhc3RlIERhdGFcIlxuICAgIDpkaXNhYmxlZD1cIiFwYXN0ZUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uUGFzdGVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNPYmplY3QsIGNsb25lLCBkZWluZGVudCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ2xpcGJvYXJkJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBjbGlwYm9hcmQ6IHsgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3B5RW5hYmxlZDogZmFsc2UsXG4gICAgICBwYXN0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZml4Q2xpcGJvYXJkOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xpcGJvYXJkT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBpc09iamVjdCh0aGlzLmNsaXBib2FyZCkgPyB0aGlzLmNsaXBib2FyZCA6IHt9XG4gICAgfSxcblxuICAgIGNvcHlEYXRhKCkge1xuICAgICAgY29uc3QgeyBjb3B5IH0gPSB0aGlzLmNsaXBib2FyZE9wdGlvbnNcbiAgICAgIHJldHVybiBjb3B5XG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgY29weS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsb25lKGNsaXBib2FyZERhdGEpXG4gICAgfSxcblxuICAgIHBhc3RlRGF0YSgpIHtcbiAgICAgIGNvbnN0IHsgcGFzdGUgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIHBhc3RlXG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgcGFzdGUuY2FsbChcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIDogY2xpcGJvYXJkRGF0YSA9PiBjbGlwYm9hcmREYXRhXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2hlY2sgY2xpcGJvYXJkIGNvbnRlbnQgd2hlbmV2ZXIgc29tZXRoaW5nIGdldHMgY29waWVkIG9yIHRoZSB3aW5kb3cgZ2V0c1xuICAgIC8vIChyZSlhY3RpdmF0ZWQsIGFzIHRob3NlIGFyZSB0aGUgbW9tZW50cyB3aGVuIHRoZSBjbGlwYm9hcmQgY2FuIGNoYW5nZTpcbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjb3B5OiB0aGlzLmNoZWNrQ2xpcGJvYXJkXG4gICAgfSlcbiAgICB0aGlzLmRvbU9uKHdpbmRvdywge1xuICAgICAgZm9jdXM6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuJHdhdGNoKCdkYXRhJywge1xuICAgICAgLy8gQ2hlY2sgcmlnaHQgYXdheSBhbHNvIGluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGRhdGEgKGUuZy4gY3JlYXRlIGZvcm0pLlxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogKHRvLCBmcm9tKSA9PiB7XG4gICAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYXN5bmMgZ2V0Q2xpcGJvYXJkRGF0YShyZXBvcnQpIHtcbiAgICAgIC8vIFVzZSB0aGUgaW50ZXJuYWwgY2xpcGJvYXJkIGFzIGZhbGxiYWNrLlxuICAgICAgbGV0IHsgY2xpcGJvYXJkRGF0YSB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LnJlYWRUZXh0Py4oKVxuICAgICAgICBpZiAodGhpcy5maXhDbGlwYm9hcmQgJiYganNvbikge1xuICAgICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBuZWVkZWQgb24gU2FmYXJpIHRvIHByZXZlbnQgYSBzdHJhbmdlIFwiUGFzdGVcIlxuICAgICAgICAgIC8vIGJ1dHRvbiBmcm9tIGFwcGVhcmluZyB3aGVuIHRoZSBjbGlwYm9hcmQgaXMgYWNjZXNzZWQgKHdoeT8hKS5cbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIHRoaXMuZml4Q2xpcGJvYXJkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgIGNsaXBib2FyZERhdGEgPSBKU09OLnBhcnNlKGpzb24pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5uYW1lLCBlcnIubWVzc2FnZSlcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIGFsZXJ0KGRlaW5kZW50YFxuICAgICAgICAgICAgICBUaGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIGFwcGVhcnMgdG8gYmUgbWFsZm9ybWVkOlxuICAgICAgICAgICAgICAke2Vyci5tZXNzYWdlfVxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgJHNjaGVtYSwgLi4uZGF0YSB9ID0gY2xpcGJvYXJkRGF0YSB8fCB7fVxuICAgICAgcmV0dXJuICRzY2hlbWEgPT09IHRoaXMuc2NoZW1hQ29tcG9uZW50Py5zY2hlbWEubmFtZSA/IGRhdGEgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIGNoZWNrQ2xpcGJvYXJkKCkge1xuICAgICAgdGhpcy5jb3B5RW5hYmxlZCA9ICEhdGhpcy5kYXRhXG4gICAgICAvLyBTZWUgaWYgdGhlIGNsaXBib2FyZCBjb250ZW50IGlzIHZhbGlkIEpTT04gZGF0YSB0aGF0IGlzIGNvbXBhdGlibGVcbiAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0IHNjaGVtYSwgYW5kIG9ubHkgdGhlbiBhY3RpdmF0ZSB0aGUgcGFzdGluZzpcbiAgICAgIHRoaXMucGFzdGVFbmFibGVkID0gISEoYXdhaXQgdGhpcy5nZXRDbGlwYm9hcmREYXRhKGZhbHNlKSkgLy8gZG9uJ3QgcmVwb3J0XG4gICAgfSxcblxuICAgIGFzeW5jIG9uQ29weSgpIHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LmNsaXBib2FyZERhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMuY29weURhdGEoZGF0YSlcbiAgICAgICAgLy8gS2VlcCBhbiBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY2xpcGJvYXJkRGF0YSA9IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gYWN0aXZhdGUgdGhlIHBhc3RlIGJ1dHRvbiwgZGVwZW5kaW5nIG9uIGJyb3dzZXJzOlxuICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblBhc3RlKCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEodHJ1ZSkgLy8gcmVwb3J0XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gZGF0YSAmJiB0aGlzLnBhc3RlRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LnNldERhdGEoZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nLCB7IHVwZGF0ZVJvb3QgPSBmYWxzZSwgdXBkYXRlVmlldyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZyBeICFpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gQm9vbGVhbiB4b3JcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgICAgICBpZiAodXBkYXRlUm9vdCkge1xuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5yZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVWaWV3KSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldExvYWRpbmcodGhpcy5pc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuaW1wb3J0IHsgc2V0RGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgbGFiZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluLCBMb2FkaW5nTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcyxcbiAgICAgIC8vIFBhc3MgbG9jYWwgdmVyYnMgb3ZlcnJpZGVzIG9uIHRvIGNoaWxkcmVuLCBzZWUgdmVyYnMoKSBjb21wdXRlZCBwcm9wLlxuICAgICAgJHZlcmJzOiAoKSA9PiB0aGlzLnZlcmJzLFxuICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0aGlzLmhhc0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGVkRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJlc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZSBmb3IgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIHNvdXJjZSBzY2hlbWEuXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGEgZGF0YS1zb3VyY2UgaWYgaXQgaGFzIGFuIGFzc29jaWF0ZWQgQVBJIHJlc291cmNlOlxuICAgICAgcmV0dXJuICEhdGhpcy5yZXNvdXJjZVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIC8vIFJldHVybnMgYGZhbHNlYGhlcmUsIGJ1dCBpcyBvdmVycmlkZGVuIHRvIHJldHVybiBgdHJ1ZWAgaW5cbiAgICAgIC8vIGBTb3VyY2VNaXhpbmAgZm9yIGNvbXBvbmVudCB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyIG93biBkYXRhLCBidXRcbiAgICAgIC8vIGVkaXQgdGhlaXIgaXRlbXMgdGhyb3VnaCBhIGxpbmtlZCB2aWV3LiAgSW4gdGhpcyBjYXNlLCByZWFsIGlkcyBuZWVkIHRvXG4gICAgICAvLyBiZSB1c2VkLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgLy8gQ2hlY2sgdGhlIGZvcm0gdGhhdCB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvIGFzIHdlbGwsIHNpbmNlIGl0IG1heSBiZVxuICAgICAgLy8gaW4gY3JlYXRpb24gbW9kZSwgd2hpY2ggbWFrZXMgaXQgdHJhbnNpZW50LlxuICAgICAgLy8gTk9URTogVGhpcyBkb2VzIG5vdCBsb29wIGVuZGxlc3NseSBiZWNhdXNlIERpdG9Gb3JtIHJlZGVmaW5lc1xuICAgICAgLy8gYGlzVHJhbnNpZW50KClgIHRvIG9ubHkgcmV0dXJuIGAhdGhpcy5wcm92aWRlc0RhdGFgLlxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUNvbXBvbmVudFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMucHJvdmlkZXNEYXRhICYmXG4gICAgICAgICF0aGlzLmxpbmtzVG9WaWV3IHx8XG4gICAgICAgIGZvcm0gJiYgKFxuICAgICAgICAgIGZvcm0uaXNUcmFuc2llbnQgfHxcbiAgICAgICAgICBmb3JtLmlzQ3JlYXRpbmdcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0cmFuc2llbnROb3RlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJiAoXG4gICAgICAgICAgJzxiPk5vdGU8L2I+OiB0aGUgcGFyZW50IHN0aWxsIG5lZWRzIHRvIGJlIHNhdmVkICcgK1xuICAgICAgICAgICdpbiBvcmRlciB0byBwZXJzaXN0IHRoaXMgY2hhbmdlLidcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBzaG91bGRMb2FkKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMuaXNUcmFuc2llbnQgJiZcbiAgICAgICAgIXRoaXMuaXNMb2FkaW5nXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAvLyBCYXNlIGRlZmluaXRpb24sIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW5cbiAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkRGF0YVxuICAgIH0sXG5cbiAgICB2ZXJicygpIHtcbiAgICAgIC8vIFRoZSBhY3R1YWwgY29kZSBpcyB0aGUgYGdldFZlcmJzKClgIG1ldGhvZCwgZm9yIGVhc2llciBvdmVycmlkaW5nIG9mXG4gICAgICAvLyB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGluIGNvbXBvbmVudHMgdGhhdCB1c2UgdGhlIFJlc291cmNlTWl4aW4uXG4gICAgICByZXR1cm4gdGhpcy5nZXRWZXJicygpXG4gICAgfSxcblxuICAgIHBhZ2luYXRpb25SYW5nZSgpIHtcbiAgICAgIC8vIE9ubHkgYXBwbHkgcGFnaW5hdGlvbiB0byBsaXN0cy5cbiAgICAgIGNvbnN0IHsgcGFnaW5hdGU6IGFtb3VudCB9ID0gdGhpcy5zb3VyY2VTY2hlbWFcbiAgICAgIGlmICh0aGlzLmlzTGlzdFNvdXJjZSAmJiBhbW91bnQpIHtcbiAgICAgICAgY29uc3QgeyBwYWdlID0gMCB9ID0gdGhpcy5xdWVyeSB8fCB7fVxuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2UgKiBhbW91bnRcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyBhbW91bnQgLSAxXVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgcXVlcnlQYXJhbXMoKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMucGFnaW5hdGlvblJhbmdlXG4gICAgICBjb25zdCB7IHBhZ2UsIC4uLnF1ZXJ5IH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5xdWVyeSwgLy8gUXVlcnkgbWF5IG92ZXJyaWRlIHNjb3BlLlxuICAgICAgICAuLi4ocmFuZ2UgJiYge1xuICAgICAgICAgIC8vIFBhc3MgcGFnaW5hdGlvbiBhcyByYW5nZSwgc28gdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGdldCBPYmplY3Rpb24nc1xuICAgICAgICAgIC8vIHJlc3VsdHMgY291bnRpbmc6XG4gICAgICAgICAgcmFuZ2U6IHJhbmdlLmpvaW4oJywnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIC8vIFdoZW4gY3JlYXRpbmcgbmVzdGVkIGRhdGEsIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzZXR1cERhdGEoKVxuICAgIGlmICh0aGlzLnByb3ZpZGVzRGF0YSB8fCB0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFJlc291cmNlKCkge1xuICAgICAgLy8gVGhpcyBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHNvIHRoZSBjb21wdXRlZCBgcmVzb3VyY2VgIGdldHRlciBjYW5cbiAgICAgIC8vIGJlIG92ZXJyaWRkZW4gYW5kIGBzdXBlcmAgZnVuY3Rpb25hbGl0eSBjYW4gc3RpbGwgYmUgYWNjZXNzZWQuXG4gICAgICByZXR1cm4gZ2V0UmVzb3VyY2UodGhpcy5zb3VyY2VTY2hlbWE/LnJlc291cmNlLCB7XG4gICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudEZvcm1Db21wb25lbnQ/LnJlc291cmNlID8/IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldFZlcmJzKCkge1xuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLiR2ZXJicygpXG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnZlcmJzLFxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdCB2ZXJicyB3aXRoIHRoZWlyIHRyYW5zaWVudCB2ZXJzaW9uczpcbiAgICAgICAgICAgIGNyZWF0ZTogJ2FkZCcsXG4gICAgICAgICAgICBjcmVhdGVkOiAnYWRkZWQnLFxuICAgICAgICAgICAgc2F2ZTogJ2FwcGx5JyxcbiAgICAgICAgICAgIHNhdmVkOiAnYXBwbGllZCcsXG4gICAgICAgICAgICBkZWxldGU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgZGVsZXRlZDogJ3JlbW92ZWQnXG4gICAgICAgICAgfVxuICAgICAgICA6IHZlcmJzXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIC8vIEFjdHVhbCBjb2RlIGlzIGluIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0J3MgZWFzZXIgdG8gb3ZlcnJpZGVcbiAgICAgIC8vIGBzZXR1cERhdGEoKWAgYW5kIGFuZCBjYWxsIGBlbnN1cmVEYXRhKClgIGZyb20gdGhlIG92ZXJyaWRlcyxcbiAgICAgIC8vIHNlZSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW4uXG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICBlbnN1cmVEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkTG9hZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKSB7XG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoZmFsc2UpXG4gICAgfSxcblxuICAgIGxvYWREYXRhKGNsZWFyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckRhdGEoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSkge1xuICAgICAgcmV0dXJuIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCB0eXBlID8geyB0eXBlIH0gOiB7fSwgdGhpcylcbiAgICB9LFxuXG4gICAgcmVxdWVzdERhdGEoKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnlQYXJhbXNcbiAgICAgIHRoaXMuaGFuZGxlUmVxdWVzdCh7IG1ldGhvZDogJ2dldCcsIHF1ZXJ5IH0sIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YT8udHlwZSA9PT0gJ0ZpbHRlclZhbGlkYXRpb24nICYmXG4gICAgICAgICAgICAgIHRoaXMub25GaWx0ZXJFcnJvcnM/LihkYXRhLmVycm9ycylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVW5hdXRob3JpemVkRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IENhbiB3ZSByZWFsbHkgc3dhbGxvdyB0aGVzZSBlcnJvcnM/XG4gICAgICAgICAgICAgIC8vIElzIGNhbGxpbmcgYGVuc3VyZVVzZXIoKWAgaW4gYG9uQmVmb3JlUmVxdWVzdCgpYCBlbm91Z2g/XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YShyZXNwb25zZS5kYXRhKVxuICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdsb2FkJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgaXNWYWxpZGF0aW9uRXJyb3IocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDBcbiAgICB9LFxuXG4gICAgaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVSZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja1xuICAgICkge1xuICAgICAgY29uc3QgbG9hZGluZ09wdGlvbnMgPSB7XG4gICAgICAgIHVwZGF0ZVJvb3Q6IHRydWUsIC8vIERpc3BsYXkgc3Bpbm5lciBpbiBoZWFkZXIgd2hlbiBsb2FkaW5nIGluIHJlc291cmNlc1xuICAgICAgICB1cGRhdGVWaWV3OiB0aGlzLmlzSW5WaWV3IC8vIE5vdGlmeSB2aWV3IG9mIGxvYWRpbmcgZm9yIHZpZXcgY29tcG9uZW50c1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSwgcXVlcnkgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFBhc3MgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgY2FsbGJhY2ssIHNvIHRoZXkgY2FuIGJlXG4gICAgICAgIC8vIGV4cG9zZWQgdG8gZnVydGhlciBjYWxsYmFja3MgdGhyb3VnaCBEaXRvQ29udGV4dC5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBjYWxsYmFjayByZXR1cm5zIHRydWUsIGVycm9ycyB3ZXJlIGFscmVhZHkgaGFuZGxlZC5cbiAgICAgICAgY29uc3QgeyByZXNwb25zZSB9ID0gZXJyb3JcbiAgICAgICAgaWYgKCFjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBpc1N0cmluZyhkYXRhPy50eXBlKVxuICAgICAgICAgICAgPyBsYWJlbGl6ZShkYXRhLnR5cGUpXG4gICAgICAgICAgICA6ICdFcnJvcidcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YT8ubWVzc2FnZSA/PyBlcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHsgdHlwZTogJ2Vycm9yJywgdGl0bGUsIHRleHQgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICB9LFxuXG4gICAgZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpIHtcbiAgICAgIC8vIENvbnZlbnRpb246IG9ubHkgcG9zdCwgcHV0IGFuZCBwYXRjaCByZXF1ZXN0cyBwYXNzIHRoZSBkYXRhIGFzIHBheWxvYWQuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5jbHVkZXMobWV0aG9kKSAmJiAoXG4gICAgICAgICAgLy8gVE9ETzogVXNlIGBoYW5kbGVEYXRhU2NoZW1hKClgIGFzeW5jaHJvbm91c2x5IGhlcmUgaW5zdGVhZCwgdG9cbiAgICAgICAgICAvLyBvZmZlciB0aGUgc2FtZSBhbW91bnQgb2YgcG9zc2liaWxpdGllcyBmb3IgZGF0YSBsb2FkaW5nLlxuICAgICAgICAgIGJ1dHRvbi5nZXRTY2hlbWFWYWx1ZShbJ3Jlc291cmNlJywgJ2RhdGEnXSkgfHxcbiAgICAgICAgICBidXR0b24ucHJvY2Vzc2VkSXRlbVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24pIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoYnV0dG9uLnNjaGVtYS5yZXNvdXJjZSwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMucmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgeyBtZXRob2QgfSA9IHJlc291cmNlXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBheWxvYWREYXRhKGJ1dHRvbiwgbWV0aG9kKVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICBzZXREYXRhID0gZmFsc2UsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyA9ICgpID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IFN1Y2Nlc3NmdWwnLFxuICAgICAgICAgIHRleHQ6ICdSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgc2VudC4nXG4gICAgICAgIH0pLFxuICAgICAgbm90aWZ5RXJyb3IgPSBlcnJvciA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgIGBVbmFibGUgdG8gc2VuZCByZXF1ZXN0JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KFxuICAgICAgICAgIHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSB9LFxuICAgICAgICAgIGFzeW5jIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIERpdG8gdmFsaWRhdGlvbiBlcnJvcjpcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5pc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkgJiYgZGF0YS5lcnJvcnNcbiAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNPYmplY3QoZGF0YSkgPyBkYXRhIDogZXJyXG4gICAgICAgICAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlFcnJvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmRlcmx5aW5nIGRhdGEgYmVmb3JlIGNhbGxpbmcgYG5vdGlmeSgpYCBvclxuICAgICAgICAgICAgICAvLyBgdGhpcy5pdGVtTGFiZWxgLCBzbyBpZCBpcyBzZXQgYWZ0ZXIgY3JlYXRpbmcgbmV3IGl0ZW1zLlxuICAgICAgICAgICAgICBpZiAoc2V0RGF0YSAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCBldmVudCwgeyBub3RpZnksIGVycm9yIH0pIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBvdXRzaWRlIG9mIGBlbWl0RXZlbnQoKWAsIHNvIHRoYXRcbiAgICAgIC8vIGBjb250ZXh0Lndhc05vdGlmaWVkYCBjYW4gYmUgY2hlY2tlZCBhZnRlci5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRGl0b0NvbnRleHQoYnV0dG9uLCB7XG4gICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgaXRlbUxhYmVsOiB0aGlzLml0ZW1MYWJlbCxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBidXR0b24uZW1pdEV2ZW50KGV2ZW50LCB7IGNvbnRleHQgfSlcbiAgICAgIGlmIChcbiAgICAgICAgbm90aWZ5ICYmXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBpZiBhbnl0aGluZyB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgLy8gRG8gbm90IGRpc3BsYXkgZGVmYXVsdCBub3RpZmljYXRpb24gaWYgdGhlIGV2ZW50IGhhbmRsZXIgYWxyZWFkeVxuICAgICAgICAvLyBkaXNwbGF5ZWQgYSBub3RpZmljYXRpb24uXG4gICAgICAgICFjb250ZXh0Lndhc05vdGlmaWVkXG4gICAgICApIHtcbiAgICAgICAgbm90aWZ5KGVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhdGgpIHtcbiAgLy8gRm9yIHBhdGhzIHN0YXJpbmcgd2l0aCBgL2AsIHdlIGNhbiB1c2UgdGhlIG5hdGl2ZSBgVVJMKClgIGNsYXNzIHRvIHJlc29sdmVcbiAgLy8gdGhlIHBhdGgsIHdoaWNoIHdpbGwgYWxzbyBoYW5kbGUgYC4uYCBhbmQgYC5gIHNlZ21lbnRzOlxuICByZXR1cm4gbmV3IFVSTChgZmlsZToke3BhdGh9YCkucGF0aG5hbWVcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1mb3JtLmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgOmNsYXNzPVwieyAnZGl0by1mb3JtLW5lc3RlZCc6IGlzTmVzdGVkUm91dGUgfVwiXG4gIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuKVxuICAvLy0gTk9URTogTmVzdGVkIGZvcm0gY29tcG9uZW50cyBhcmUga2VwdCBhbGl2ZSBieSB1c2luZyBgdi1zaG93YCBpbnN0ZWFkIG9mXG4gIC8vLSBgdi1pZmAgaGVyZSwgc28gZXZlbnQgaGFuZGxpbmcgYW5kIG90aGVyIHRoaW5ncyBzdGlsbCB3b3JrIHdpdGggbmVzdGVkXG4gIC8vLSBlZGl0aW5nLiBPbmx5IHJlbmRlciBhIHJvdXRlci12aWV3IGhlcmUgaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBkYXRhIHJvdXRlXG4gIC8vLSBhbmQgbm90IGEgbmVzdGVkIGZvcm0gcm91dGUsIHdoaWNoIHdpbGwgYXBwZWFyIGVsc2V3aGVyZSBpbiBpdHMgb3duIHZpZXcuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiEoaXNMYXN0VW5uZXN0ZWRSb3V0ZSB8fCBpc05lc3RlZFJvdXRlKVwiXG4gICAgdi1zaG93PVwiIWlzQWN0aXZlXCJcbiAgKVxuICAvLy0gVXNlIGEgPGRpdj4gZm9yIGlubGluZWQgZm9ybXMsIGFzIHdlIHNob3VsZG4ndCBuZXN0IGFjdHVhbCA8Zm9ybT4gdGFncy5cbiAgY29tcG9uZW50LmRpdG8tc2Nyb2xsKFxuICAgIHYtc2hvdz1cImlzQWN0aXZlXCJcbiAgICA6aXM9XCJpc05lc3RlZFJvdXRlID8gJ2RpdicgOiAnZm9ybSdcIlxuICAgIEBzdWJtaXQucHJldmVudFxuICApXG4gICAgRGl0b1NjaGVtYShcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgRGl0b0J1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICAgIClcbiAgICAvLy0gUHJldmVudCBpbXBsaWNpdCBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtLCBmb3IgZXhhbXBsZSB3aGVuIHR5cGluZyBlbnRlclxuICAgIC8vLSBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICAvLy0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUxNTA3ODA2XG4gICAgYnV0dG9uKFxuICAgICAgdi1zaG93PVwiZmFsc2VcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBkaXNhYmxlZFxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSwgY2FwaXRhbGl6ZSwgcGFyc2VEYXRhUGF0aCwgbWVyZ2UgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1Jlc291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGdldEJ1dHRvblNjaGVtYXMsIGlzT2JqZWN0U291cmNlIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Gb3JtJywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluLCBSZXNvdXJjZU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkRGF0YTogbnVsbCxcbiAgICAgIGNsb25lZERhdGE6IHVuZGVmaW5lZCxcbiAgICAgIHNvdXJjZUtleTogbnVsbCxcbiAgICAgIGlzRm9ybTogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHZlcmJzKCkge1xuICAgICAgLy8gQWRkIHN1Ym1pdCAvIHN1Ym1pdHRlZCB0byB0aGUgdmVyYnMgcmV0dXJuZWQgYnkgUmVzb3VyY2VNaXhpblxuICAgICAgLy8gTk9URTogVGhlc2UgZ2V0IHBhc3NlZCBvbiB0byBjaGlsZHJlbiB0aHJvdWdoOlxuICAgICAgLy8gYHByb3ZpZGUoKSAuLi4geyAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMgfWAgaW4gUmVzb3VyY2VNaXhpblxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLmdldFZlcmJzKClcbiAgICAgIGNvbnN0IHsgaXNDcmVhdGluZywgcHJvdmlkZXNEYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi52ZXJicyxcbiAgICAgICAgc3VibWl0OiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlIDogdmVyYnMuc2F2ZSxcbiAgICAgICAgc3VibWl0dGVkOiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlZCA6IHZlcmJzLnNhdmVkLFxuICAgICAgICBjYW5jZWw6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbCA6IHZlcmJzLmNsb3NlLFxuICAgICAgICBjYW5jZWxsZWQ6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbGxlZCA6IHZlcmJzLmNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldEl0ZW1Gb3JtU2NoZW1hKFxuICAgICAgICAgIHRoaXMuc291cmNlU2NoZW1hLFxuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgeWV0LCBwcm92aWRlIGFuIGVtcHR5IG9iamVjdCB3aXRoIGp1c3QgdGhlXG4gICAgICAgICAgLy8gcmlnaHQgdHlwZSBzZXQsIHNvIHRoZSBmb3JtIGNhbiBhbHdheXMgYmUgZGV0ZXJtaW5lZC5cbiAgICAgICAgICB0aGlzLmRhdGEgfHwgeyB0eXBlOiB0aGlzLnR5cGUgfSxcbiAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgKSB8fCB7fVxuICAgICAgKSAvLyBBbHdheXMgcmV0dXJuIGEgc2NoZW1hIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdC5cbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN1Ym1pdDogIXRoaXMuaXNNdXRhdGluZyAmJiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgICAgICAvLyBTdWJtaXQgYnV0dG9ucyBjbG9zZSB0aGUgZm9ybSBieSBkZWZhdWx0OlxuICAgICAgICAgICAgICBjbG9zZUZvcm06IHRydWUsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoeyBjb21wb25lbnQ6IGJ1dHRvbiB9KSA9PiBidXR0b24uc3VibWl0KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zY2hlbWEuYnV0dG9uc1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0Um91dGUgfHwgdGhpcy5pc0xhc3RVbm5lc3RlZFJvdXRlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnByb3ZpZGVzRGF0YVxuICAgIH0sXG5cbiAgICBpc0NyZWF0aW5nKCkge1xuICAgICAgLy8gdGhpcy5wYXJhbSBpcyBpbmhlcml0ZWQgZnJvbSBSb3V0ZU1peGluXG4gICAgICByZXR1cm4gdGhpcy5wYXJhbSA9PT0gJ2NyZWF0ZSdcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc011dGF0aW5nICYmICEhdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5pc0RpcnR5XG4gICAgfSxcblxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICAvLyBXaGVuIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCB0aGUgZm9ybSBlZGl0cyB0aGUgaW5oZXJpdGVkIGRhdGFcbiAgICAgIC8vIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBmb3IgcGVyc2lzdGVuY2UgdXBvbiBzdWJtaXNzaW9uLlxuICAgICAgLy8gU2VlIGBpbmhlcml0ZWREYXRhKClgIGNvbXB1dGVkIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gISF0aGlzLnNvdXJjZVNjaGVtYS5tdXRhdGVcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5zZWxlY3RlZFRhYiB8fCBudWxsXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICAvLyBUaGUgdHlwZSBvZiBmb3JtIHRvIGNyZWF0ZSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGVcbiAgICB9LFxuXG4gICAgaXRlbUlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLnBhcmFtID8/IG51bGxcbiAgICB9LFxuXG4gICAgbWV0aG9kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZyA/ICdwb3N0JyA6ICdwYXRjaCdcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoKVxuICAgICAgcmV0dXJuIGdldE1lbWJlclJlc291cmNlKHRoaXMuaXRlbUlkLCByZXNvdXJjZSkgfHwgcmVzb3VyY2VcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMuaXNDcmVhdGluZyA/IHRoaXMudmVyYnMuY3JlYXRlIDogdGhpcy52ZXJicy5lZGl0KVxuICAgIH0sXG5cbiAgICBkYXRhKCkge1xuICAgICAgLy8gUmV0dXJuIGRpZmZlcmVudCBkYXRhIFwiY29udGFpbmVyc1wiIGJhc2VkIG9uIGRpZmZlcmVudCBzY2VuYXJpb3M6XG4gICAgICAvLyAxLiBjcmVhdGVkRGF0YSwgaWYgd2UncmUgaW4gYSBmb3JtIGZvciBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuICAgICAgLy8gMi4gbG9hZGVkRGF0YSwgaWYgdGhlIGZvcm0gaXRzZWxmIGlzIHRoZSByb290IG9mIHRoZSBkYXRhIChlLmcuIHdoZW5cbiAgICAgIC8vICAgIGRpcmVjdGx5IGxvYWRpbmcgYW4gZWRpdGluZyByb290KS5cbiAgICAgIC8vIDMuIFRoZSBkYXRhIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIHdoaWNoIGl0c2VsZiBtYXkgYmUgZWl0aGVyIGFcbiAgICAgIC8vICAgIHZpZXcgdGhhdCBsb2FkZWQgdGhlIGRhdGEsIG9yIGEgZm9ybSB0aGF0IGVpdGhlciBsb2FkZWQgdGhlIGRhdGEsIG9yXG4gICAgICAvLyAgICBhbHNvIGluaGVyaXRlZCBpdCBmcm9tIGl0cyBwYXJlbnQuIE5vdGUgdGhhdCB3ZSB1c2UgYSBjbG9uZSBvZiBpdCxcbiAgICAgIC8vICAgIHNvLCBkYXRhIGNoYW5nZXMgYXJlbid0IGFwcGxpZWQgdW50aWwgc2V0U291cmNlRGF0YSgpIGlzIGNhbGxlZC5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZWREYXRhIHx8IHRoaXMubG9hZGVkRGF0YSB8fCB0aGlzLmluaGVyaXRlZERhdGEgfHwgbnVsbFxuICAgIH0sXG5cbiAgICBkYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGFQYXRoRnJvbSh0aGlzLmRhdGFDb21wb25lbnQpXG4gICAgfSxcblxuICAgIHNvdXJjZURhdGEoKSB7XG4gICAgICAvLyBQb3NzaWJsZSBwYXJlbnRzIGFyZSBEaXRvRm9ybSBmb3IgZm9ybXMsIG9yIERpdG9WaWV3IGZvciByb290IGxpc3RzLlxuICAgICAgLy8gQm90aCBoYXZlIGEgZGF0YSBwcm9wZXJ0eSB3aGljaCBhYnN0cmFjdHMgYXdheSBsb2FkaW5nIGFuZCBpbmhlcml0aW5nXG4gICAgICAvLyBvZiBkYXRhLlxuICAgICAgLy8gRm9ybXMgdGhhdCBhcmUgYWJvdXQgdG8gYmUgZGVzdHJveWVkIGR1ZSB0byBuYXZpZ2F0aW9uIGxvb3NlIHRoZWlyXG4gICAgICAvLyByb3V0ZS1yZWNvcmQsIGJ1dCBtaWdodCBzdGlsbCB0cmlnZ2VyIHRoaXMgZ2V0dGVyLiBGaWx0ZXIgdGhvc2Ugb3V0LlxuICAgICAgbGV0IGRhdGEgPSB0aGlzLnJvdXRlUmVjb3JkID8gdGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5kYXRhIDogbnVsbFxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBkYXRhIGJ5IHNwbGl0dGluZyB0aGUgZGF0YVBhdGgsIGl0ZXJhdGUgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gYWN0dWFsIGRhdGEgYW5kIGxvb2sgbmVzdCBjaGlsZC1kYXRhIHVwLlxuICAgICAgICBjb25zdCBkYXRhUGFydHMgPSBwYXJzZURhdGFQYXRoKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMucGFyZW50Um91dGVDb21wb25lbnQpXG4gICAgICAgIClcbiAgICAgICAgLy8gQ29tcGFyZSBkYXRhUGFydHMgYWdhaW5zdCBtYXRjaGVkIHJvdXRlUGF0aCBwYXJ0cywgdG8gaWRlbnRpZnkgdGhvc2VcbiAgICAgICAgLy8gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHRyZWF0ZWQgbGlrZSBpZHMgYW5kIG1hcHBlZCB0byBpbmRpY2VzIGluIGRhdGEuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucm91dGVSZWNvcmQucGF0aC5zcGxpdCgnLycpXG4gICAgICAgIGNvbnN0IHJvdXRlUGFydHMgPSBwYXRoUGFydHMuc2xpY2UocGF0aFBhcnRzLmxlbmd0aCAtIGRhdGFQYXJ0cy5sZW5ndGgpXG4gICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICB0aGlzLnNvdXJjZUtleSA9IG51bGxcbiAgICAgICAgY29uc3QgbGFzdERhdGFQYXJ0ID0gZGF0YVBhcnRzW2RhdGFQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpICYmIGxhc3REYXRhUGFydCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9iamVjdCBzb3VyY2UgYW5kIGFyZSBjcmVhdGluZywgdGhlIGRhdGFQYXRoIG5lZWRzIHRvXG4gICAgICAgICAgLy8gYmUgc2hvcnRlbmVkIGJ5IHRoZSAnY3JlYXRlJyBlbnRyeS4gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzLCBhcyB0aGVyZSB0aGUgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgaXRlbSBpZC5cbiAgICAgICAgICBkYXRhUGFydHMubGVuZ3RoLS1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRhdGFQYXJ0cy5sZW5ndGg7IGkgPCBsICYmIGRhdGE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gZGF0YVBhcnRzW2ldXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiA6aWQgcGFydCwgZmluZCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gd2l0aCBnaXZlbiBpZC5cbiAgICAgICAgICBjb25zdCBrZXkgPSAvXjppZC8udGVzdChyb3V0ZVBhcnRzW2ldKVxuICAgICAgICAgICAgPyBkYXRhUGFydCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgICAgPyBudWxsIC8vIFRoZXJlJ3Mgbm8gaW5kZXggZm9yIGVudHJpZXMgYWJvdXQgdG8gYmUgY3JlYXRlZFxuICAgICAgICAgICAgICA6IHRoaXMuZmluZEl0ZW1JZEluZGV4KHRoaXMuc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGFydClcbiAgICAgICAgICAgIDogZGF0YVBhcnRcbiAgICAgICAgICAvLyBTa2lwIHRoZSBmaW5hbCBsb29rdXAgYnV0IHJlbWVtYmVyIGBzb3VyY2VLZXlgLCBhcyB3ZSB3YW50IHRoZVxuICAgICAgICAgIC8vIHBhcmVudCBkYXRhIHNvIHdlIGNhbiByZXBsYWNlIHRoZSBlbnRyeSBhdCBgc291cmNlS2V5YCBvbiBpdC5cbiAgICAgICAgICBpZiAoaSA9PT0gbCAtIDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy5zb3VyY2VLZXkgPSBrZXlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgaW5oZXJpdGVkRGF0YSgpIHtcbiAgICAgIC8vIERhdGEgaW5oZXJpdGVkIGZyb20gcGFyZW50LCBhbmQgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdCByZWFjdGl2ZVxuICAgICAgLy8gY2hhbmdlcyB1bnRpbCBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRocm91Z2ggc2V0U291cmNlRGF0YSgpLCB1bmxlc3NcbiAgICAgIC8vIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGRhdGEgaXMgbXV0YXRlZCBkaXJlY3RseS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICB0aGlzLmNsb25lZERhdGEgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLnNvdXJjZURhdGEgJiZcbiAgICAgICAgdGhpcy5zb3VyY2VLZXkgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV1cbiAgICAgICAgaWYgKCF0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBVc2UgYSB0cmljayB0byBzdG9yZSBjbG9uZWQgaW5oZXJpdGVkIGRhdGEgaW4gY2xvbmVkRGF0YSwgdG8gbWFrZVxuICAgICAgICAgIC8vIGl0IHJlYWN0aXZlIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgY2xvbmVkIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gZGF0YSA9IGNsb25lKGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEgPT09IG51bGwgJiZcbiAgICAgICAgICAhdGhpcy5pc0NyZWF0aW5nICYmXG4gICAgICAgICAgaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGRhdGEgb2YgYW4gb2JqZWN0IHNvdXJjZSBpcyBudWxsLCByZWRpcmVjdCB0byBpdHMgY3JlYXRlIHJvdXRlLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVkRGF0YVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5oYXNEYXRhKClcbiAgICBoYXNEYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIGl0ZW1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNvdXJjZVNjaGVtYSwgdGhpcy5kYXRhLCB7IGV4dGVuZGVkOiB0cnVlIH0pXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc291cmNlRGF0YTogJ2NsZWFyQ2xvbmVkRGF0YScsXG4gICAgLy8gTmVlZGVkIGZvciB0aGUgJ2NyZWF0ZScgcmVkaXJlY3QgaW4gYGluaGVyaXRlZERhdGEoKWAgdG8gd29yazpcbiAgICBjcmVhdGU6ICdzZXR1cERhdGEnXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50LmVtaXRFdmVudChldmVudCwgcGFyYW1zKVxuICAgIH0sXG5cbiAgICBnZXREYXRhUGF0aEZyb20ocm91dGUpIHtcbiAgICAgIC8vIEdldCB0aGUgZGF0YSBwYXRoIGJ5IGRlbm9ybWFsaXplUGF0aCB0aGUgcmVsYXRpdmUgcm91dGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXMuYXBpLmRlbm9ybWFsaXplUGF0aChcbiAgICAgICAgdGhpcy5wYXRoXG4gICAgICAgICAgLy8gRGl0b1ZpZXdzIGhhdmUgbmVzdGVkIHJvdXRlcywgc28gZG9uJ3QgcmVtb3ZlIHRoZWlyIHBhdGguXG4gICAgICAgICAgLnNsaWNlKChyb3V0ZS5pc1ZpZXcgPyAwIDogcm91dGUucGF0aC5sZW5ndGgpICsgMSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0dXBEYXRhKClcbiAgICBzZXR1cERhdGEoKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0aW5nKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgfHw9IHRoaXMuY3JlYXRlRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy50eXBlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U291cmNlRGF0YShkYXRhKSB7XG4gICAgICBpZiAodGhpcy5zb3VyY2VEYXRhICYmIHRoaXMuc291cmNlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWFpblNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFbdGhpcy5zb3VyY2VLZXldID0gbWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKGRhdGEpXG4gICAgICAgIG1haW5TY2hlbWFDb21wb25lbnQub25DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFkZFNvdXJjZURhdGEoZGF0YSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMuc291cmNlU2NoZW1hKVxuICAgICAgICA/IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgICA6ICEhdGhpcy5zb3VyY2VEYXRhPy5wdXNoKGRhdGEpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmNsZWFyRGF0YSgpXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5zZXREYXRhKG51bGwpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLnNldERhdGEoKVxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgLy8gc2V0RGF0YSgpIGlzIGNhbGxlZCBhZnRlciBzdWJtaXQgd2hlbiBkYXRhIGhhcyBjaGFuZ2VkLlxuICAgICAgaWYgKHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aCB0cmFuc2llbnQgZGF0YSwgbW9kaWZ5IHRoaXMuc291cmNlRGF0YS5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZWREYXRhID0gbnVsbFxuICAgICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyQ2xvbmVkRGF0YSh0bywgZnJvbSkge1xuICAgICAgLy8gT25seSBjbGVhciBpZiB0aGUgd2F0Y2hlZCBzb3VyY2VEYXRhIGl0c2VsZiBjaGFuZ2VzIGluIHRoZSBmb3JtLlxuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZSgpXG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUodGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5wYXRoKVxuICAgIH0sXG5cbiAgICBnZXRTdWJtaXRWZXJiKHByZXNlbnQgPSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gcHJlc2VudFxuICAgICAgICAgID8gJ2NyZWF0ZSdcbiAgICAgICAgICA6ICdjcmVhdGVkJ1xuICAgICAgICA6IHByZXNlbnRcbiAgICAgICAgICA/ICdzdWJtaXQnXG4gICAgICAgICAgOiAnc3VibWl0dGVkJ1xuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXQoYnV0dG9uLCB7IHZhbGlkYXRlID0gdHJ1ZSwgY2xvc2VGb3JtID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0VmVyYiA9IHByZXNlbnQgPT4gdGhpcy52ZXJic1t0aGlzLmdldFN1Ym1pdFZlcmIocHJlc2VudCldXG5cbiAgICAgIC8vIEFsbG93IGJ1dHRvbnMgdG8gb3ZlcnJpZGUgYm90aCBtZXRob2QgYW5kIHJlc291cmNlIHBhdGggdG8gc3VibWl0IHRvOlxuICAgICAgY29uc3QgYnV0dG9uUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc291cmNlID0gYnV0dG9uUmVzb3VyY2UgfHwgdGhpcy5yZXNvdXJjZVxuICAgICAgY29uc3QgbWV0aG9kID0gcmVzb3VyY2U/Lm1ldGhvZCB8fCB0aGlzLm1ldGhvZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICBsZXQgc3VjY2Vzc1xuICAgICAgaWYgKCFidXR0b25SZXNvdXJjZSAmJiB0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zaWVudChidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICA/IGBJdGVtICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gXG4gICAgICAgICAgICAgICAgOiBgQ2hhbmdlICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgICAgICAgICAgICA/IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICAgICAgICA6IGBDaGFuZ2VzIHRvICR7dGhpcy5pdGVtTGFiZWx9IHdlcmUgJHt2ZXJifS5gLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpZW50Tm90ZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgICAgIHRleHQ6IGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfS5gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIHNldERhdGE6IHRydWUsXG4gICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB0aGlzLmVtaXRTY2hlbWFFdmVudCh0aGlzLmdldFN1Ym1pdFZlcmIoKSksXG4gICAgICAgICAgb25FcnJvcjogZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBlcnJvciB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBub3RpZnlTdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICB0aXRsZTogYFN1Y2Nlc3NmdWxseSAke2NhcGl0YWxpemUodmVyYil9YCxcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfSR7ZXJyb3IgPyAnOicgOiAnJ31gLFxuICAgICAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5yZXNldFZhbGlkYXRpb24oKVxuICAgICAgICBpZiAoY2xvc2VGb3JtIHx8IGJ1dHRvbi5jbG9zZUZvcm0pIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAvLyBSZWRpcmVjdCB0byB0aGUgZm9ybSBlZGl0aW5nIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW06XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldEl0ZW1JZCh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhKVxuICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgcGF0aDogcmVzb2x2ZVBhdGgoYCR7dGhpcy5wYXRofS8uLi8ke2lkfWApIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdFRyYW5zaWVudChidXR0b24sIF9yZXNvdXJjZSwgX21ldGhvZCwgZGF0YSwge1xuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25FcnJvcixcbiAgICAgIG5vdGlmeVN1Y2Nlc3MsXG4gICAgICBub3RpZnlFcnJvclxuICAgIH0pIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZGVmYXVsdCBcInN1Ym1pdHRpbmdcIiBvZiB0cmFuc2llbnQsIG5lc3RlZCBkYXRhOlxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IHRoaXMuYWRkU291cmNlRGF0YShkYXRhKVxuICAgICAgICA6IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAnQ291bGQgbm90IHN1Ym1pdCB0cmFuc2llbnQgaXRlbSdcbiAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdlcnJvcicsIHtcbiAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0Zvcm0gZnJvbSAnLi9EaXRvRm9ybS52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1OZXN0ZWQnLCB7XG4gIGV4dGVuZHM6IERpdG9Gb3JtXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZm9ybS1uZXN0ZWQge1xuICAmLFxuICAuZGl0by1zY3JvbGwge1xuICAgIC8vIE5vIHNjcm9sbGluZyBpbnNpZGUgbmVzdGVkIGZvcm1zLCBhbmQgcHJldmVudCBvcGVuIC5tdWx0aXNlbGVjdCBmcm9tXG4gICAgLy8gYmVpbmcgY3JvcHBlZC5cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1lcnJvcnMoXG4gIHYtaWY9XCJlcnJvcnNcIlxuKVxuICB1bFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJlcnJvciBvZiBlcnJvcnNcIlxuICAgIClcbiAgICAgIHwge3sgZXJyb3IgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FcnJvcnMnLCB7XG4gIHByb3BzOiB7XG4gICAgZXJyb3JzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWVycm9ycyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcblxuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIGNvbG9yOiAkY29sb3ItZXJyb3I7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NvcGVzXG4gIFJvdXRlckxpbmsoXG4gICAgdi1mb3I9XCIoc2NvcGUsIGtleSkgaW4gc2NvcGVzXCJcbiAgICA6a2V5PVwia2V5XCJcbiAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgIDp0bz1cImdldFNjb3BlTGluayhzY29wZSlcIlxuICAgIGN1c3RvbVxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXNlbGVjdGVkJzogc2NvcGUubmFtZSA9PT0gcXVlcnkuc2NvcGUgfVwiXG4gICAgICA6dGl0bGU9XCJzY29wZS5oaW50IHx8IGdldExhYmVsKHNjb3BlKVwiXG4gICAgICBAY2xpY2s9XCJuYXZpZ2F0ZVwiXG4gICAgKSB7eyBnZXRMYWJlbChzY29wZSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY29wZXMnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjb3BlczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U2NvcGVMaW5rKHNjb3BlKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4udGhpcy5xdWVyeSwgc2NvcGU6IHNjb3BlLm5hbWUgfVxuICAgICAgaWYgKHF1ZXJ5LnBhZ2UpIHtcbiAgICAgICAgcXVlcnkucGFnZSA9IDBcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayhxdWVyeSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY29wZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC8vIEEgYml0IG1vcmUgdGhhbiB0aGUgd2lkdGggb2YgZWxsaXBzaXMsIHRvIHByZXZlbnQgcmVwbGFjaW5nIHNob3J0IHdvcmRzXG4gICAgLy8gd2l0aCBlbGxpcHNpcy5cbiAgICBtaW4td2lkdGg6IDNlbTtcbiAgICBmbGV4OiAwIDEgYXV0bztcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgIH1cblxuICAgICYgKyAuZGl0by1idXR0b24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfSAvLyBEb24ndCBjb3ZlciB0aGUgZm9jdXNlZCBib3JkZXIgb2YgYnV0dG9uczpcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblBhZ2luYXRpb24oXG4gIHYtbW9kZWw6cGFnZT1cInBhZ2VcIlxuICA6cGFnZVNpemU9XCJsaW1pdFwiXG4gIDp0b3RhbD1cInRvdGFsXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYWdpbmF0aW9uJywge1xuICBjb21wb25lbnRzOiB7IFBhZ2luYXRpb24gfSxcblxuICBwcm9wczoge1xuICAgIHF1ZXJ5OiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwYWdlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAoK3RoaXMucXVlcnkucGFnZSB8fCAwKSArIDFcbiAgICAgIH0sXG5cbiAgICAgIHNldChwYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChcbiAgICAgICAgICAgIHRoaXMuZ2V0UXVlcnlMaW5rKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSAtIDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgSXRlbU1peGluIGZyb20gJy4vSXRlbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U29ydGFibGVPcHRpb25zKGZvcmNlRmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGhhbmRsZTogJy5kaXRvLWJ1dHRvbi1kcmFnJyxcbiAgICAgICAgZHJhZ0NsYXNzOiAnZGl0by1zb3J0YWJsZS1hY3RpdmUnLFxuICAgICAgICBjaG9zZW5DbGFzczogJ2RpdG8tc29ydGFibGUtY2hvc2VuJyxcbiAgICAgICAgZ2hvc3RDbGFzczogJ2RpdG8tc29ydGFibGUtZ2hvc3QnLFxuICAgICAgICBmYWxsYmFja0NsYXNzOiAnZGl0by1zb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgICAgIGZvcmNlRmFsbGJhY2ssXG4gICAgICAgIG9uU3RhcnQ6IHRoaXMub25TdGFydERyYWcsXG4gICAgICAgIG9uRW5kOiB0aGlzLm9uRW5kRHJhZ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblN0YXJ0RHJhZygpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlXG4gICAgfSxcblxuICAgIG9uRW5kRHJhZyh7IG9sZEluZGV4LCBuZXdJbmRleCB9KSB7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2VcbiAgICAgIGlmIChvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdCwgcGFnaW5hdGlvblJhbmdlKSB7XG4gICAgICBjb25zdCB7IG9yZGVyS2V5IH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmIChvcmRlcktleSkge1xuICAgICAgICAvLyBSZW9yZGVyIHRoZSBjaGFuZ2VkIGVudHJpZXMgYnkgdGhlaXIgb3JkZXIga2V5LCB0YWtpbmcgcGFnaW5hdGlvblxuICAgICAgICAvLyBvZmZzZXRzIGludG8gYWNjb3VudDpcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFnaW5hdGlvblJhbmdlPy5bMF0gfHwgMFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsaXN0W2ldW29yZGVyS2V5XSA9IGkgKyBvZmZzZXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmVlLWl0ZW0oXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPWB7XG4gICAgJ2RpdG8tZHJhZ2dpbmcnOiBkcmFnZ2luZyxcbiAgICAnZGl0by1hY3RpdmUnOiBhY3RpdmVcbiAgfWBcbiAgOnN0eWxlPVwibGV2ZWwgPiAwICYmIHsgJy0tbGV2ZWwnOiBsZXZlbCB9XCJcbilcbiAgLmRpdG8tdHJlZS1oZWFkZXIoXG4gICAgdi1pZj1cImxhYmVsXCJcbiAgKVxuICAgIC5kaXRvLXRyZWUtYnJhbmNoKFxuICAgICAgdi1pZj1cIm51bUVudHJpZXNcIlxuICAgICAgQGNsaWNrLnN0b3A9XCJvcGVuZWQgPSAhb3BlbmVkXCJcbiAgICApXG4gICAgICAuZGl0by1jaGV2cm9uKFxuICAgICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICAgIDpjbGFzcz1cInsgJ2RpdG8tb3BlbmVkJzogb3BlbmVkIH1cIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1sYWJlbChcbiAgICAgICAgdi1odG1sPVwibGFiZWxcIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1pbmZvKFxuICAgICAgICB2LWlmPVwiZGV0YWlsc1wiXG4gICAgICApIHt7IGRldGFpbHMgfX1cbiAgICAuZGl0by10cmVlLWxlYWYoXG4gICAgICB2LWVsc2VcbiAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtc21hbGwoXG4gICAgICB2LWlmPVwiaGFzRWRpdEJ1dHRvbnNcIlxuICAgIClcbiAgICAgIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gICAgICBhLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gICAgICApXG4gICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJlZGl0YWJsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmVkaXQpXCJcbiAgICAgICAgQGNsaWNrPVwib25FZGl0XCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImRlbGV0YWJsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgICAgICBAY2xpY2s9XCJvbkRlbGV0ZVwiXG4gICAgICApXG4gIHRhYmxlLmRpdG8tcHJvcGVydGllcyhcbiAgICB2LWlmPVwicHJvcGVydGllc1wiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgKVxuICAgIHRyKFxuICAgICAgdi1mb3I9XCJwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzXCJcbiAgICApXG4gICAgICB0ZFxuICAgICAgICBEaXRvTGFiZWwoXG4gICAgICAgICAgdi1pZj1cInByb3BlcnR5LmxhYmVsICE9PSBmYWxzZVwiXG4gICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSlcIlxuICAgICAgICAgIDpsYWJlbD1cImdldExhYmVsKHByb3BlcnR5KVwiXG4gICAgICAgIClcbiAgICAgIERpdG9UYWJsZUNlbGwoXG4gICAgICAgIDpjZWxsPVwicHJvcGVydHlcIlxuICAgICAgICA6c2NoZW1hPVwicHJvcGVydHlcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgKVxuICBEaXRvRHJhZ2dhYmxlKFxuICAgIHYtaWY9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKGNoaWxkcmVuU2NoZW1hLCBjaGlsZHJlbkxpc3QpXCJcbiAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyh0cnVlKVwiXG4gICAgOmRyYWdnYWJsZT1cImNoaWxkcmVuRHJhZ2dhYmxlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCJ2YWx1ZSA9PiAoY2hpbGRyZW5MaXN0ID0gdmFsdWUpXCJcbiAgKVxuICAgIERpdG9UcmVlSXRlbShcbiAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjaGlsZHJlbkl0ZW1zXCJcbiAgICAgIDprZXk9XCJnZXRJdGVtVWlkKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEpXCJcbiAgICAgIDpzY2hlbWE9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJnZXRJdGVtRGF0YVBhdGgoY2hpbGRyZW5TY2hlbWEsIGluZGV4KVwiXG4gICAgICA6ZGF0YT1cIml0ZW0uZGF0YVwiXG4gICAgICA6cGF0aD1cIml0ZW0ucGF0aFwiXG4gICAgICA6b3Blbj1cIml0ZW0ub3BlblwiXG4gICAgICA6YWN0aXZlPVwiaXRlbS5hY3RpdmVcIlxuICAgICAgOmRyYWdnYWJsZT1cImNoaWxkcmVuRHJhZ2dhYmxlXCJcbiAgICAgIDpsYWJlbD1cImdldEl0ZW1MYWJlbChjaGlsZHJlblNjaGVtYSwgaXRlbS5kYXRhLCB7IGluZGV4IH0pXCJcbiAgICAgIDpsZXZlbD1cImxldmVsICsgMVwiXG4gICAgKVxuICAgIC8vLSBUT0RPOiBDb252ZXJ0IGRpdG8tdHJlZS1pdGVtIHRvIHVzZSBkaXRvLWxhYmVsIGludGVybmFsbHksIGFuZCB0aGVuXG4gICAgLy8tIHBhc3MgYGFzT2JqZWN0OiB0cnVlYCBpbiB0aGUgYGdldEl0ZW1MYWJlbCgpYCBjYWxsIGFib3ZlLlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXROYW1lZFNjaGVtYXMsIGhhc0Zvcm1TY2hlbWEgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RyZWVJdGVtJywge1xuICBtaXhpbnM6IFtTb3J0YWJsZU1peGluXSxcbiAgaW5qZWN0OiBbJ2NvbnRhaW5lciddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbQXJyYXksIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBwYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcbiAgICBvcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYWN0aXZlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbGV2ZWw6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVuZWQ6IHRoaXMub3BlbiB8fCB0aGlzLnNjaGVtYS5vcGVuXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbWV0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5tZXRhXG4gICAgfSxcblxuICAgIHN0b3JlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnN0b3JlXG4gICAgfSxcblxuICAgIGRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRpc2FibGVkXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiBnZXROYW1lZFNjaGVtYXModGhpcy5zY2hlbWEucHJvcGVydGllcylcbiAgICB9LFxuXG4gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgbmFtZWQgYHNvdXJjZVNjaGVtYWAgaW5zdGVhZD8gVXNlIFNvdXJjZU1peGluP1xuICAgIGNoaWxkcmVuU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmNoaWxkcmVuXG4gICAgfSxcblxuICAgIGNoaWxkcmVuTGlzdCgpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNoaWxkcmVuU2NoZW1hPy5uYW1lXG4gICAgICByZXR1cm4gbmFtZSAmJiB0aGlzLmRhdGFbbmFtZV1cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5EcmFnZ2FibGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoID4gMSAmJlxuICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdkcmFnZ2FibGUnLCB7XG4gICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuY2hpbGRyZW5TY2hlbWFcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgbnVtQ2hpbGRyZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbkxpc3Q/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bVByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzPy5sZW5ndGggfHwgMFxuICAgIH0sXG5cbiAgICBudW1FbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtUHJvcGVydGllcyArIHRoaXMubnVtQ2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5JdGVtcygpIHtcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdCB9ID0gdGhpc1xuICAgICAgaWYgKGNoaWxkcmVuU2NoZW1hICYmIGNoaWxkcmVuTGlzdCkge1xuICAgICAgICBjb25zdCB7IGVkaXRQYXRoIH0gPSB0aGlzLmNvbnRhaW5lclxuICAgICAgICBjb25zdCBjaGlsZHJlbk9wZW4gPSAhdGhpcy5wYXRoICYmIGNoaWxkcmVuU2NoZW1hLm9wZW5cbiAgICAgICAgLy8gQnVpbGQgYSBjaGlsZHJlbiBsaXN0IHdpdGggY2hpbGQgbWV0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcihcbiAgICAgICAgICBjaGlsZHJlblNjaGVtYSxcbiAgICAgICAgICBjaGlsZHJlbkxpc3QubWFwKChkYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IChcbiAgICAgICAgICAgICAgY2hpbGRyZW5TY2hlbWEucGF0aCAmJlxuICAgICAgICAgICAgICBgJHt0aGlzLnBhdGh9LyR7Y2hpbGRyZW5TY2hlbWEucGF0aH0vJHtpbmRleH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcGVuID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlbk9wZW4gfHxcbiAgICAgICAgICAgICAgLy8gT25seSBjb3VudCBhcyBcImluIGVkaXQgcGF0aFwiIHdoZW4gaXQncyBub3QgdGhlIGZ1bGwgZWRpdCBwYXRoLlxuICAgICAgICAgICAgICBlZGl0UGF0aC5zdGFydHNXaXRoKHBhdGgpICYmIHBhdGgubGVuZ3RoIDwgZWRpdFBhdGgubGVuZ3RoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBhY3RpdmUgPSBlZGl0UGF0aCA9PT0gcGF0aFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgb3BlbixcbiAgICAgICAgICAgICAgYWN0aXZlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtdXG4gICAgfSxcblxuICAgIGRldGFpbHMoKSB7XG4gICAgICBjb25zdCB7IG51bUNoaWxkcmVuIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBudW1DaGlsZHJlbiAmJlxuICAgICAgICBgJHtudW1DaGlsZHJlbn0gJHtcbiAgICAgICAgICBudW1DaGlsZHJlbiA9PT0gMSA/ICdpdGVtJyA6ICdpdGVtcydcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcmFnZ2FibGUgfHwgdGhpcy5lZGl0YWJsZSB8fCB0aGlzLmRlbGV0YWJsZVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTdXBwb3J0IGNyZWF0YWJsZSFcbiAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgY3JlYXRhYmxlLCBlZGl0YWJsZSBhbmQgZGVsZXRhYmxlIG92ZXJyaWRlcyBvbiB0aGVcbiAgICAvLyBhc3NvY2lhdGVkIGZvcm1zLCBqdXN0IGxpa2UgaW4gYFR5cGVMaXN0YCBhbmQgYFR5cGVPYmplY3RgLCB0aHJvdWdoXG4gICAgLy8gYERpdG9FZGl0QnV0dG9uc2AuIEl0IHdvdWxkIGJlIGJlc3QgdG8gdXNlIGBEaXRvRWRpdEJ1dHRvbnNgIGhlcmUgdG9vLlxuICAgIGNyZWF0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NyZWF0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChjcmVhdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZWRpdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdlZGl0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWRpdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRlbGV0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlbGV0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBwcm9wZXJ0eS5uYW1lKVxuICAgIH0sXG5cbiAgICBvbkVkaXQoKSB7XG4gICAgICAvLyBBbGwgd2UgZ290IHRvIGRvIGlzIHB1c2ggdGhlIHJpZ2h0IGVkaXQgcGF0aCB0byB0aGUgcm91dGVyLCB0aGUgcmVzdFxuICAgICAgLy8gaXMgaGFuZGxlZCBieSBvdXIgcm91dGVzLCBhbGxvd2luZyByZWxvYWRzIGFzIHdlbGwuXG4gICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7XG4gICAgICAgIHBhdGg6IGAke3RoaXMuY29udGFpbmVyLnBhdGh9JHt0aGlzLnBhdGh9YCxcbiAgICAgICAgLy8gUHJlc2VydmUgY3VycmVudCBxdWVyeVxuICAgICAgICBxdWVyeTogdGhpcy4kcm91dGUucXVlcnlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRGVsZXRlKCkge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm9uQ2hhbmdlKClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10cmVlLWl0ZW0ge1xuICAtLWNoZXZyb24taW5kZW50OiAjeyRjaGV2cm9uLWluZGVudH07XG5cbiAgPiAuZGl0by10cmVlLWhlYWRlciB7XG4gICAgPiAuZGl0by10cmVlLWJyYW5jaCxcbiAgICA+IC5kaXRvLXRyZWUtbGVhZiB7XG4gICAgICAvLyBVc2UgYC0tbGV2ZWxgIENTUyB2YXJpYWJsZSB0byBjYWxjdWxhdGVkIHRoZSBhY2N1bXVsYXRlZCBpbmRlbnRcbiAgICAgIC8vIHBhZGRpbmcgZGlyZWN0bHkgaW5zdGVhZCBvZiBoYXZpbmcgaXQgYWNjdW11bGF0ZSBpbiBuZXN0ZWQgQ1NTLlxuICAgICAgLy8gVGhpcyB3YXksIHdlIGNhbiBrZWVwIHRoZSAuZGl0by1hY3RpdmUgYXJlYSBjb3ZlciB0aGUgZnVsbCB3aWR0aDpcbiAgICAgIHBhZGRpbmctbGVmdDogY2FsYyh2YXIoLS1jaGV2cm9uLWluZGVudCkgKiAodmFyKC0tbGV2ZWwsIDEpIC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cblxuICAuZGl0by10cmVlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cblxuICAuZGl0by10cmVlLWJyYW5jaCxcbiAgLmRpdG8tdHJlZS1sZWFmIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IGF1dG87XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMXB4IDA7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG4gIH1cblxuICAuZGl0by10cmVlLWxhYmVsLFxuICAuZGl0by10cmVlLWluZm8ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICAuZGl0by10cmVlLWluZm8ge1xuICAgIHBhZGRpbmctbGVmdDogMC4zNWVtO1xuICAgIGNvbG9yOiByZ2JhKCRjb2xvci1ibGFjaywgMC4yKTtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtYXJnaW46IDFweCAwIDFweCAxZW07XG4gIH1cblxuICAuZGl0by10cmVlLWhlYWRlcjpob3ZlciB7XG4gICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgfSAvLyBIaWRlIGJ1dHRvbnMgZHVyaW5nIGRyYWdnaW5nXG4gIH1cblxuICAmLmRpdG8tZHJhZ2dpbmcge1xuICAgIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICAgID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmLmRpdG8tYWN0aXZlIHtcbiAgICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBwYWRkaW5nOiAwICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICAgIG1hcmdpbjogMCAoLSRpbnB1dC1wYWRkaW5nLWhvcik7XG5cbiAgICAgID4gLmRpdG8tdHJlZS1icmFuY2gge1xuICAgICAgICA+IC5kaXRvLWNoZXZyb246OmJlZm9yZSB7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA+ICogPiAuZGl0by10cmVlLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGl0by1wcm9wZXJ0aWVzIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tbGVmdDogJGNoZXZyb24taW5kZW50O1xuXG4gICAgPiB0ciB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICc6ICc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRoZWFkLmRpdG8tdGFibGUtaGVhZFxuICB0clxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1mb3I9XCJjb2x1bW4gaW4gY29sdW1uc1wiXG4gICAgKVxuICAgICAgdGgoXG4gICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoY29sdW1uKVwiXG4gICAgICAgIDpjbGFzcz1cImdldENvbHVtbkNsYXNzKGNvbHVtbilcIlxuICAgICAgKVxuICAgICAgICBSb3V0ZXJMaW5rKFxuICAgICAgICAgIHYtaWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgIHYtc2xvdD1cInsgbmF2aWdhdGUgfVwiXG4gICAgICAgICAgOnRvPVwiZ2V0U29ydExpbmsoY29sdW1uKVwiXG4gICAgICAgICAgY3VzdG9tXG4gICAgICAgIClcbiAgICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDpjbGFzcz1cImdldFNvcnRDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgICAgIEBjbGljaz1cIm5hdmlnYXRlXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICAuZGl0by1vcmRlci1hcnJvd3NcbiAgICAgICAgICAgIHNwYW4ge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgICAgICBzcGFuKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICApIHt7IGdldExhYmVsKGNvbHVtbikgfX1cbiAgICB0aChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEVtcHR5IDxzcGFuPiBpcyBuZWVkZWQgZm9yIHN0eWxpbmcsIHNlZSBfdGFibGUuc2Nzc1xuICAgICAgc3BhblxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJsZUhlYWQnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbHVtbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGhhc0VkaXRCdXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvcnQoKSB7XG4gICAgICBjb25zdCBvcmRlciA9ICh0aGlzLnF1ZXJ5Lm9yZGVyIHx8ICcnKS5zcGxpdCgvXFxzKy8pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBvcmRlclswXSxcbiAgICAgICAgb3JkZXI6IG9yZGVyWzFdXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb2x1bW5DbGFzcyhjb2x1bW4pIHtcbiAgICAgIHJldHVybiBgZGl0by1jb2x1bW4tJHtoeXBoZW5hdGUoY29sdW1uLm5hbWUpfWBcbiAgICB9LFxuXG4gICAgZ2V0U29ydENsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydC5uYW1lID09PSBjb2x1bW4ubmFtZVxuICAgICAgICA/IGBkaXRvLXNlbGVjdGVkIGRpdG8tb3JkZXItJHt0aGlzLnNvcnQub3JkZXJ9YFxuICAgICAgICA6IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0U29ydExpbmsoY29sdW1uKSB7XG4gICAgICAvLyBUb2dnbGUgb3JkZXIgaWYgdGhlIHNhbWUgY29sdW1uIGlzIGNsaWNrZWQgYWdhaW4uXG4gICAgICBjb25zdCBvcmRlciA9XG4gICAgICAgIHRoaXMuc29ydC5uYW1lID09PSBjb2x1bW4ubmFtZSAmJiB0aGlzLnNvcnQub3JkZXIgPT09ICdhc2MnXG4gICAgICAgICAgPyAnZGVzYydcbiAgICAgICAgICA6ICdhc2MnXG4gICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeUxpbmsoe1xuICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICBvcmRlcjogYCR7Y29sdW1uLm5hbWV9ICR7b3JkZXJ9YFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10YWJsZS1oZWFkIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgdHIge1xuICAgIHRoIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgICAgIC5kaXRvLWJ1dHRvbiB7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZywgc2VlIGJlbG93XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICBzcGFuIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAvLyBDb252ZW50aW9uOiBOZXN0ZWQgc3BhbnMgaGFuZGxlIHBhZGRpbmdcbiAgICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAgICAgJjplbXB0eTo6YWZ0ZXIge1xuICAgICAgICAgIC8vIFByZXZlbnQgZW1wdHkgPHRoPiBmcm9tIGNvbGxhcHNpbmdcbiAgICAgICAgICBjb250ZW50OiAnXFwyMDBiJzsgLy8gemVyby13aWR0aCBzcGFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGQoXG4gIDpjbGFzcz1cImNlbGwuY2xhc3NcIlxuICA6c3R5bGU9XCJjZWxsLnN0eWxlXCJcbilcbiAgLy8tIFRPRE86IEltcGxlbWVudCBpbmxpbmVkIGNvbXBvbmVudHMgaW4gY2VsbCBtb2RlIVxuICBjb21wb25lbnQoXG4gICAgdi1pZj1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6aXM9XCJjZWxsLmNvbXBvbmVudFwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG4gIHNwYW4oXG4gICAgdi1lbHNlXG4gICAgdi1odG1sPVwicmVuZGVyQ2VsbChkYXRhKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlQ2VsbCcsIHtcbiAgcHJvcHM6IHtcbiAgICBjZWxsOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbmRlckNlbGwoaXRlbSkge1xuICAgICAgY29uc3QgeyBuYW1lLCByZW5kZXIgfSA9IHRoaXMuY2VsbFxuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW25hbWVdXG4gICAgICByZXR1cm4gcmVuZGVyXG4gICAgICAgID8gcmVuZGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgIGRhdGFQYXRoOiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIDogZXNjYXBlSHRtbCh2YWx1ZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCB7IG5leHRUaWNrLCBkZWZpbmVDb21wb25lbnQsIHJlZiwgcmVhY3RpdmUsIGggfSBmcm9tICd2dWUtZGVtaSc7XG5pbXBvcnQgeyB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB1bnJlZkVsZW1lbnQsIGRlZmF1bHREb2N1bWVudCwgdG9WYWx1ZSwgdXNlVk1vZGVsIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcbmltcG9ydCBTb3J0YWJsZSBmcm9tICdzb3J0YWJsZWpzJztcblxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7XG52YXIgX19zcHJlYWRWYWx1ZXMgPSAoYSwgYikgPT4ge1xuICBmb3IgKHZhciBwcm9wIGluIGIgfHwgKGIgPSB7fSkpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKGIsIHByb3ApKVxuICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICBpZiAoX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoYikpIHtcbiAgICAgIGlmIChfX3Byb3BJc0VudW0uY2FsbChiLCBwcm9wKSlcbiAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICAgIH1cbiAgcmV0dXJuIGE7XG59O1xudmFyIF9fb2JqUmVzdCA9IChzb3VyY2UsIGV4Y2x1ZGUpID0+IHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSAmJiBleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwKVxuICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICBpZiAoc291cmNlICE9IG51bGwgJiYgX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoc291cmNlKSkge1xuICAgICAgaWYgKGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDAgJiYgX19wcm9wSXNFbnVtLmNhbGwoc291cmNlLCBwcm9wKSlcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5mdW5jdGlvbiB1c2VTb3J0YWJsZShlbCwgbGlzdCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBzb3J0YWJsZTtcbiAgY29uc3QgX2EgPSBvcHRpb25zLCB7IGRvY3VtZW50ID0gZGVmYXVsdERvY3VtZW50IH0gPSBfYSwgcmVzZXRPcHRpb25zID0gX19vYmpSZXN0KF9hLCBbXCJkb2N1bWVudFwiXSk7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG9uVXBkYXRlOiAoZSkgPT4ge1xuICAgICAgbW92ZUFycmF5RWxlbWVudChsaXN0LCBlLm9sZEluZGV4LCBlLm5ld0luZGV4KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKSA6IHVucmVmRWxlbWVudChlbCk7XG4gICAgaWYgKCF0YXJnZXQpXG4gICAgICByZXR1cm47XG4gICAgc29ydGFibGUgPSBuZXcgU29ydGFibGUodGFyZ2V0LCBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgZGVmYXVsdE9wdGlvbnMpLCByZXNldE9wdGlvbnMpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcCA9ICgpID0+IHNvcnRhYmxlID09IG51bGwgPyB2b2lkIDAgOiBzb3J0YWJsZS5kZXN0cm95KCk7XG4gIHRyeU9uTW91bnRlZChzdGFydCk7XG4gIHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuICByZXR1cm4geyBzdG9wLCBzdGFydCB9O1xufVxuZnVuY3Rpb24gbW92ZUFycmF5RWxlbWVudChsaXN0LCBmcm9tLCB0bykge1xuICBjb25zdCBhcnJheSA9IHRvVmFsdWUobGlzdCk7XG4gIGlmICh0byA+PSAwICYmIHRvIDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5LnNwbGljZShmcm9tLCAxKVswXTtcbiAgICBuZXh0VGljaygoKSA9PiBhcnJheS5zcGxpY2UodG8sIDAsIGVsZW1lbnQpKTtcbiAgfVxufVxuXG5jb25zdCBVc2VTb3J0YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyAvKiAjX19QVVJFX18gKi8gZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJVc2VTb3J0YWJsZVwiLFxuICBtb2RlbDoge1xuICAgIC8vIENvbXBhdGlibGUgd2l0aCB2dWUyXG4gICAgcHJvcDogXCJtb2RlbFZhbHVlXCIsXG4gICAgZXZlbnQ6IFwidXBkYXRlOm1vZGVsVmFsdWVcIlxuICB9LFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJkaXZcIlxuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBsaXN0ID0gdXNlVk1vZGVsKHByb3BzLCBcIm1vZGVsVmFsdWVcIik7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgZGF0YSA9IHJlYWN0aXZlKHVzZVNvcnRhYmxlKHRhcmdldCwgbGlzdCwgcHJvcHMub3B0aW9ucykpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMudGFnLCB7IHJlZjogdGFyZ2V0IH0sIHNsb3RzLmRlZmF1bHQoZGF0YSkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VTb3J0YWJsZSB9O1xuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblVzZVNvcnRhYmxlKFxuICB2LWlmPVwiZHJhZ2dhYmxlXCJcbiAgOnRhZz1cInRhZ1wiXG4gIDptb2RlbFZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gIDpvcHRpb25zPVwib3B0aW9uc1wiXG4gIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsICRldmVudClcIlxuKVxuICBzbG90XG5jb21wb25lbnQoXG4gIHYtZWxzZVxuICA6aXM9XCJ0YWdcIlxuKVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudCdcbmltcG9ydCB7IFVzZVNvcnRhYmxlIH0gZnJvbSAnQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlU29ydGFibGUvY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9EcmFnZ2FibGUnLCB7XG4gIGNvbXBvbmVudHM6IHsgVXNlU29ydGFibGUgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RpdidcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBkcmFnZ2FibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmZ1bmN0aW9uIERpdG9WTm9kZSh7IHZub2RlIH0pIHtcbiAgcmV0dXJuIHZub2RlXG59XG5cbkRpdG9WTm9kZS5wcm9wcyA9IHtcbiAgdm5vZGU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVm5vZGUnLCBEaXRvVk5vZGUpXG48L3NjcmlwdD5cbiIsIi8vIERpdG9UeXBlQ29tcG9uZW50IGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNvbXBvbmVudCBmb3IgYWxsIG90aGVyIHR5cGVcbi8vIGNvbXBvbmVudHMgaW5zaWRlIHRoZSB0eXBlcy8gZm9sZGVyLiBUaGVyZSdzIGFsc28gYSBzZXBhcmF0ZSBjb25jcmV0ZVxuLy8gYERpdG9UeXBlQ29tcG9uZW50LnZ1ZWAgY29tcG9uZW50LCB1c2UgdG8gcmVuZGVyIGB7IHR5cGU6ICdjb21wb25lbnQnIH1gXG5pbXBvcnQgeyBhc0FycmF5LCBjYW1lbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVHlwZU1peGluIGZyb20gJy4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IHJlZ2lzdGVyVHlwZUNvbXBvbmVudCwgZ2V0VHlwZUNvbXBvbmVudCB9IGZyb20gJy4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBleHRlbmRzOiBEaXRvQ29tcG9uZW50LFxuICBtaXhpbnM6IFtUeXBlTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiBmYWxzZSxcbiAgdGV4dEZpZWxkOiBmYWxzZSxcbiAgLy8gU2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIGFsbCBvZiB0aGVzZSB0aGF0IGFyZSB1c2VkIGJ5IG1vc3QgdHlwZVxuICAvLyBjb21wb25lbnRzLiBUaGVzZSBvbmx5IG5lZWQgZGVmaW5pbmcgaW4gc3ViLWNsYXNzZXMgd2hlbiB0aGV5IGRpZmZlci5cbiAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICBkZWZhdWx0TmVzdGVkOiB0cnVlLFxuICBkZWZhdWx0VmlzaWJsZTogdHJ1ZSxcbiAgZ2VuZXJhdGVMYWJlbDogdHJ1ZSxcbiAgZXhjbHVkZVZhbHVlOiBmYWxzZSxcbiAgaWdub3JlTWlzc2luZ1ZhbHVlOiBudWxsLFxuICBhbGlnbkJvdHRvbTogdHJ1ZSxcbiAgb21pdFBhZGRpbmc6IGZhbHNlLFxuXG4gIGNvbXBvbmVudDogRGl0b0NvbXBvbmVudC5jb21wb25lbnQsXG5cbiAgZ2V0OiBnZXRUeXBlQ29tcG9uZW50LFxuXG4gIHJlZ2lzdGVyKHR5cGVzLCBkZWZpbml0aW9uID0ge30pIHtcbiAgICB0eXBlcyA9IGFzQXJyYXkodHlwZXMpXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoXG4gICAgICBgRGl0b1R5cGUke2NhbWVsaXplKHR5cGVzWzBdLCB0cnVlKX1gLFxuICAgICAgZGVmaW5pdGlvblxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnR5cGU9XCJ0eXBlXCJcbiAgOnRpdGxlPVwidGV4dFwiXG4gIDpjbGFzcz1cImJ1dHRvbkNsYXNzXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnYnV0dG9uJywgJ3N1Ym1pdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gICAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICAgIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICAgIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHZlcmIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmJzW3RoaXMubmFtZV1cbiAgICAgIH0sXG5cbiAgICAgIGJ1dHRvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJiID8gYGRpdG8tYnV0dG9uLSR7dGhpcy52ZXJifWAgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICB0ZXh0OiBnZXRTY2hlbWFBY2Nlc3NvcigndGV4dCcsIHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBnZXQodGV4dCkge1xuICAgICAgICAgIHJldHVybiB0ZXh0IHx8IGxhYmVsaXplKHRoaXMudmVyYilcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIGNsb3NlRm9ybTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Nsb3NlRm9ybScsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0pLFxuXG4gICAgICAvLyBAb3ZlcnJpZGVcbiAgICAgIGV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgeyBvbkZvY3VzLCBvbkJsdXIsIG9uQ2xpY2sgfSA9IHRoaXNcbiAgICAgICAgcmV0dXJuIHsgb25Gb2N1cywgb25CbHVyLCBvbkNsaWNrIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgYXN5bmMgc3VibWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VDb21wb25lbnQ/LnN1Ym1pdCh0aGlzLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgb25DbGljaygpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5lbWl0RXZlbnQoJ2NsaWNrJywge1xuICAgICAgICAgIHBhcmVudDogdGhpcy5zY2hlbWFDb21wb25lbnRcbiAgICAgICAgfSlcbiAgICAgICAgLy8gSGF2ZSBidXR0b25zIHRoYXQgZGVmaW5lIHJlc291cmNlcyBjYWxsIGB0aGlzLnN1Ym1pdCgpYCBieSBkZWZhdWx0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiYgLy8gTWVhbmluZzogZG9uJ3QgcHJldmVudCBkZWZhdWx0LlxuICAgICAgICAgIGhhc1Jlc291cmNlKHRoaXMuc2NoZW1hKVxuICAgICAgICApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmlucHV0LmRpdG8tY2hlY2tib3goXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIHR5cGU9XCJjaGVja2JveFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjaGVja2JveCcsIHtcbiAgbmF0aXZlRmllbGQ6IHRydWVcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jaGVja2JveCB7XG4gIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtMb2FkaW5nTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBhc3luY0RhdGFFbnRyaWVzOiB7fVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlRGF0YVNjaGVtYShzY2hlbWEsIG5hbWUsIHtcbiAgICAgIHJlc29sdmVDb3VudGVyID0gMSxcbiAgICAgIC4uLmxvYWRpbmdPcHRpb25zXG4gICAgfSA9IHt9KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgc2NoZW1hID0geyBkYXRhOiBzY2hlbWEgfVxuICAgICAgfVxuICAgICAgbGV0IHsgZGF0YSA9IHVuZGVmaW5lZCwgZGF0YVBhdGggPSBudWxsIH0gPSBzY2hlbWFcbiAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhc3luYyBkYXRhIGxvYWRpbmcgYWxyZWFkeSBpbiBwcm9jZXNzLlxuICAgICAgY29uc3QgYXN5bmNFbnRyeSA9ICh0aGlzLmFzeW5jRGF0YUVudHJpZXNbbmFtZV0gfHw9IHJlYWN0aXZlKHtcbiAgICAgICAgZGVwZW5kZW5jeUZ1bmN0aW9uOiBudWxsLFxuICAgICAgICByZXNvbHZlQ291bnRlcjogMCxcbiAgICAgICAgcmVzb2x2ZWREYXRhOiBudWxsLFxuICAgICAgICByZXNvbHZpbmc6IGZhbHNlXG4gICAgICB9KSlcbiAgICAgIC8vIElmIHRoZSBkYXRhIGNhbGxiYWNrIHByb3ZpZGVkIGEgZGVwZW5kZW5jeSBmdW5jdGlvbiB3aGVuIGl0IHdhcyBjYWxsZWQsXG4gICAgICAvLyBjYWwgaXQgaW4gZXZlcnkgY2FsbCBvZiBgaGFuZGxlRGF0YVNjaGVtYSgpYCB0byBmb3JjZSBWdWUgdG8ga2VlcCB0cmFja1xuICAgICAgLy8gb2YgdGhlIGFzeW5jIGRlcGVuZGVuY2llcy5cbiAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uPy4odGhpcy5jb250ZXh0KVxuXG4gICAgICBpZiAoYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGRhdGEgd2FzIHJlc29sdmVkIGFscmVhZHksIHJldHVybiBpdCBhbmQgY2xlYXIgdGhlIHZhbHVlIG9uY2VcbiAgICAgICAgLy8gYHJlc29sdmVDb3VudGVyYCByZWFjaGVzIHplcm8uIENvdW50aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGRlcGVuZGluZ1xuICAgICAgICAvLyBvbiB0aGUgdXNlIG9mIGRhdGEgYW5kIHJlYWN0aXZpdHksIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBjb21wdXRlZFxuICAgICAgICAvLyBnZXR0ZXIgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhIGlzIGNoYW5naW5nLiBDbGVhcmluZyB0aGUgcmVzb2x2ZWRcbiAgICAgICAgLy8gZGF0YSB3b3JrcyBiZWNhdXNlIFZ1ZSBjYWNoZXMgdGhlIHJlc3VsdCBvZiBjb21wdXRlZCBnZXR0ZXJzIGFuZCBvbmx5XG4gICAgICAgIC8vIHJlZXZhbHVhdGVzIGlmIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZWQuIFRoaXMgaXMgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgYSBjYWNoZWQgdmFsdWUgaGVyZSBkb2Vzbid0IGJsb2NrIC8gb3ZlcnJpZGUgcmVldmFsdWF0aW9uOlxuICAgICAgICBjb25zdCB7IHJlc29sdmVkRGF0YSB9ID0gYXN5bmNFbnRyeVxuICAgICAgICBpZiAoLS1hc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgY2FsbGluZyB0aGUgZGF0YSBmdW5jdGlvbiB0d2ljZTpcbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmluZykge1xuICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgZGF0YSBmdW5jdGlvbiBpcyBhbm90aGVyIGZ1bmN0aW9uLCB0aGVuIHRoZVxuICAgICAgICAgIC8vIGZpcnN0IGRhdGEgZnVuY3Rpb24gaXMgdGhlcmUgdG8gdHJhY2sgZGVwZW5kZW5jaWVzIGFuZCB0aGUgcmVhbFxuICAgICAgICAgIC8vIGRhdGEgbG9hZGluZyBoYXBwZW5zIGluIHRoZSBmdW5jdGlvbiB0aGF0IGl0IHJldHVybmVkLiBLZWVwIHRyYWNrXG4gICAgICAgICAgLy8gaXQgaW4gYGRlcGVuZGVuY3lGdW5jdGlvbmAgc28gaXQgY2FuIGJlIGNhbGxlZCBvbiBlYWNoIGNhbGwgb2ZcbiAgICAgICAgICAvLyBgaGFuZGxlRGF0YVNjaGVtYSgpYCB0byBrZWVwIHRoZSBkZXBlbmRlbmNpZXMgaW50YWN0LCBhbmQgY2FsbFxuICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiB0aGF0IGl0IHJldHVybmVkIG9uY2UgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YTpcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXN1bHQpKSB7XG4gICAgICAgICAgICBhc3luY0VudHJ5LmRlcGVuZGVuY3lGdW5jdGlvbiA9IGRhdGFcbiAgICAgICAgICAgIGRhdGEgPSByZXN1bHQodGhpcy5jb250ZXh0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGF0YSBpcyBhc3luY2hyb25vdXMsIGl0IGNhbid0IGJlIHJldHVybmVkIHN0cmFpZ2h0IGF3YXkuXG4gICAgICAgICAgLy8gQnV0IHdlIGNhbiBjaGVhdCB1c2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCBgcmVzb2x2ZWREYXRhYCxcbiAgICAgICAgICAvLyB3aGljaCBpcyBnb2luZyB0byByZWNlaXZlIHRoZSBsb2FkZWQgZGF0YSBhc3luY2hyb25vdXNseSxcbiAgICAgICAgICAvLyB0cmlnZ2VyaW5nIGEgcmVjb21wdXRlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGxzXG4gICAgICAgICAgLy8gYGhhbmRsZURhdGFTY2hlbWEoKWAuXG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZpbmcgPSB0cnVlXG4gICAgICAgICAgdGhpcy5yZXNvbHZlRGF0YShkYXRhLCBsb2FkaW5nT3B0aW9ucykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZUNvdW50ZXIgPSByZXNvbHZlQ291bnRlclxuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBkYXRhXG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyBDbGVhciBkYXRhIHVudGlsIHByb21pc2UgaXMgcmVzb2x2ZWQgYW5kIGByZXNvbHZlZERhdGFgIGlzIHNldFxuICAgICAgICAgIGRhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVBhdGgpIHtcbiAgICAgICAgZGF0YSA9IGdldFZhbHVlQXREYXRhUGF0aChcbiAgICAgICAgICB0aGlzLnJvb3REYXRhLFxuICAgICAgICAgIG5vcm1hbGl6ZURhdGFQYXRoKGAke3RoaXMuZGF0YVBhdGh9LyR7ZGF0YVBhdGh9YClcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzb2x2ZURhdGEobG9hZCwgbG9hZGluZ09wdGlvbnMgPSB7fSkge1xuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgbGV0IGRhdGEgPSBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gYXdhaXQgKGlzRnVuY3Rpb24obG9hZCkgPyBsb2FkKCkgOiBsb2FkKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihlcnJvci5tZXNzYWdlIHx8IGVycm9yKVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRGF0YU1peGluIGZyb20gJy4vRGF0YU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IHNldFRlbXBvcmFyeUlkLCBpc1JlZmVyZW5jZSB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNBcnJheSxcbiAgaXNTdHJpbmcsXG4gIGlzRnVuY3Rpb24sXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBsYWJlbGl6ZSxcbiAgZGVib3VuY2VBc3luY1xufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtEYXRhTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc09wdGlvbnM6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2VsZWN0ZWRWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zdCBjb252ZXJ0VmFsdWUgPSB2YWx1ZSA9PlxuICAgICAgICAgIHRoaXMucmVsYXRlXG4gICAgICAgICAgICA/IHRoaXMuaGFzT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGlzQXJyYXkodGhpcy52YWx1ZSlcbiAgICAgICAgICA/IHRoaXMudmFsdWUubWFwKGNvbnZlcnRWYWx1ZSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKVxuICAgICAgICAgIDogY29udmVydFZhbHVlKHRoaXMudmFsdWUpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBXaGVuIHJlbGF0aW5nIGFuZCBhcyBzb29uIGFzIHRoZSBvcHRpb25zIGFyZSBhdmFpbGFibGUuLi5cbiAgICAgICAgICB0aGlzLnJlbGF0ZSAmJlxuICAgICAgICAgIHRoaXMuaGFzT3B0aW9ucyAmJiAoXG4gICAgICAgICAgICAvLyAuLi5pZiB0aGUgdmFsdWUgaXMgZm9yY2VkIHRvIG51bGwgYmVjYXVzZSBhIGRpc2FwcGVhcmVkIG9wdGlvbi4uLlxuICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgLy8gLi4ub3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVmZXJlbmNlLCByZXBsYWNlIGl0IHdpdGggaXRzIG9wdGlvblxuICAgICAgICAgICAgLy8gdmFsdWUsIHNvIHRoYXQgaXQnbGwgaG9sZCBhY3R1YWwgZGF0YSwgbm90IGp1c3QgYSByZWZlcmVuY2UgaWQuXG4gICAgICAgICAgICBpc1JlZmVyZW5jZSh0aGlzLnZhbHVlKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnQgPSB2YWx1ZSA9PlxuICAgICAgICAgIHRoaXMucmVsYXRlXG4gICAgICAgICAgICA/IHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIHRoaXMudmFsdWUgPSBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUubWFwKGNvbnZlcnQpXG4gICAgICAgICAgOiBjb252ZXJ0KHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWxlY3RlZE9wdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHRoaXMuc2VsZWN0ZWRWYWx1ZSlcbiAgICB9LFxuXG4gICAgb3B0aW9ucygpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEodGhpcy5zY2hlbWEub3B0aW9ucywgJ29wdGlvbnMnLCB7XG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAxXG4gICAgICB9KSA/PyBbXVxuICAgICAgaWYgKCFpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb25zIGRhdGEsIHNob3VsZCBiZSBhcnJheTogJHtkYXRhfWApXG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICB0aGlzLmhhc09wdGlvbnMgPSBkYXRhLmxlbmd0aCA+IDBcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NPcHRpb25zKGRhdGEpXG4gICAgfSxcblxuICAgIGFjdGl2ZU9wdGlvbnMoKSB7XG4gICAgICAvLyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gYFR5cGVNdWx0aXNlbGVjdGAgdG8gcmV0dXJuIHRoZSBgc2VhcmNoZWRPcHRpb25zYFxuICAgICAgLy8gd2hlbiBhIHNlYXJjaCBmaWx0ZXIgd2FzIGFwcGxpZWQuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXG4gICAgfSxcblxuICAgIHJlbGF0ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlbGF0ZScsIHtcbiAgICAgIC8vIFRPRE86IENvbnZlcnQgdG8gYHJlbGF0ZUJ5OiAnaWQnYFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgLy8gV2UgY2Fubm90IHVzZSBzY2hlbWEgYWNjZXNzb3IgY2FsbGJhY2sgbWFnaWMgZm9yIGByZWxhdGVgIGFzIHdlIG5lZWRcbiAgICAgIC8vIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50J3MgbGlmZS1zcGFuLCBzZWUgYHByb2Nlc3NEYXRhKClgIGJlbG93LlxuICAgICAgY2FsbGJhY2s6IGZhbHNlXG4gICAgfSksXG5cbiAgICBncm91cEJ5OiBnZXRTY2hlbWFBY2Nlc3NvcignZ3JvdXBCeScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgb3B0aW9ucy5sYWJlbEtleWAgLyBgb3B0aW9uTGFiZWxLZXlgP1xuICAgIG9wdGlvbkxhYmVsOiBnZXRTY2hlbWFBY2Nlc3Nvcignb3B0aW9ucy5sYWJlbCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgLy8gSWYgbm8gYGxhYmVsYCB3YXMgcHJvdmlkZWQgYnV0IHRoZSBvcHRpb25zIGFyZSBvYmplY3RzLCBhc3N1bWUgYVxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlIG9mICdsYWJlbCc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbGFiZWwgfHxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbktleSgnbGFiZWwnKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBvcHRpb25zLnZhbHVlS2V5YCAvIGBvcHRpb25WYWx1ZUtleWA/XG4gICAgb3B0aW9uVmFsdWU6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLnZhbHVlJywge1xuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldCh2YWx1ZSkge1xuICAgICAgICAvLyBJZiBubyBgbGFiZWxgIHdhcyBwcm92aWRlZCBidXQgdGhlIG9wdGlvbnMgYXJlIG9iamVjdHMsIGFzc3VtZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgJ3ZhbHVlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZSB8fFxuICAgICAgICAgIHRoaXMucmVsYXRlICYmICdpZCcgfHxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbktleSgndmFsdWUnKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHNlYXJjaCB0byBgb3B0aW9ucy5zZWFyY2hgP1xuICAgIHNlYXJjaEZpbHRlcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3NlYXJjaCcsIHtcbiAgICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQoc2VhcmNoKSB7XG4gICAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbHRlciwgZGVib3VuY2UgfSA9IGlzRnVuY3Rpb24oc2VhcmNoKVxuICAgICAgICAgICAgPyB7IGZpbHRlcjogc2VhcmNoIH1cbiAgICAgICAgICAgIDogc2VhcmNoXG4gICAgICAgICAgcmV0dXJuIGRlYm91bmNlID8gZGVib3VuY2VBc3luYyhmaWx0ZXIsIGRlYm91bmNlKSA6IGZpbHRlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBncm91cEJ5TGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cEJ5ID8gJ2xhYmVsJyA6IG51bGxcbiAgICB9LFxuXG4gICAgZ3JvdXBCeU9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cEJ5ID8gJ29wdGlvbnMnIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0T3B0aW9uS2V5KGtleSkge1xuICAgICAgY29uc3QgW29wdGlvbl0gPSB0aGlzLmFjdGl2ZU9wdGlvbnNcbiAgICAgIHJldHVybiBpc09iamVjdChvcHRpb24pICYmIGtleSBpbiBvcHRpb24gPyBrZXkgOiBudWxsXG4gICAgfSxcblxuICAgIHByb2Nlc3NPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5yZWxhdGUpIHtcbiAgICAgICAgICAvLyBJZiBpZHMgYXJlIG1pc3NpbmcgYW5kIHdlIHdhbnQgdG8gcmVsYXRlLCBzZXQgdGVtcG9yYXJ5IGlkcy5cbiAgICAgICAgICAvLyBOT1RFOiBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgYWN0dWFsIGRhdGEsIG1ha2luZyBhIGNvcHkgd29uJ3Qgd29ya1xuICAgICAgICAgIC8vIGFzIGl0IHdvbid0IHByb3BhZ2F0ZS5cbiAgICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGRhdGEgaXMgZnJvbSB0aGUgZ3JhcGggdGhhdFxuICAgICAgICAgIC8vIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nLlxuICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghKCdpZCcgaW4gb3B0aW9uKSkge1xuICAgICAgICAgICAgICBzZXRUZW1wb3JhcnlJZChvcHRpb24sICdpZCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwQnkpIHtcbiAgICAgICAgICBjb25zdCBncm91cGVkID0ge31cbiAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0cywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gb3B0aW9uW3RoaXMuZ3JvdXBCeV1cbiAgICAgICAgICAgICAgbGV0IGVudHJ5ID0gZ3JvdXBlZFtncm91cF1cbiAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gZ3JvdXBlZFtncm91cF0gPSB7XG4gICAgICAgICAgICAgICAgICBbdGhpcy5ncm91cEJ5TGFiZWxdOiBncm91cCxcbiAgICAgICAgICAgICAgICAgIFt0aGlzLmdyb3VwQnlPcHRpb25zXTogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVudHJ5Lm9wdGlvbnMucHVzaChvcHRpb24pXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW11cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zXG4gICAgfSxcblxuICAgIGhhc09wdGlvbihvcHRpb24pIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKVxuICAgIH0sXG5cbiAgICBnZXRPcHRpb25Gb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgY29uc3QgZmluZE9wdGlvbiA9IChvcHRpb25zLCB2YWx1ZSwgZ3JvdXBCeSkgPT4ge1xuICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBvcHRpb24gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHZhbHVlIGFuZCByZXR1cm4gdGhlXG4gICAgICAgIC8vIHdob2xlIG9iamVjdC5cbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IGZpbmRPcHRpb24ob3B0aW9uLm9wdGlvbnMsIHZhbHVlLCBudWxsKVxuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25WYWx1ZVxuICAgICAgICA/IGZpbmRPcHRpb24odGhpcy5hY3RpdmVPcHRpb25zLCB2YWx1ZSwgdGhpcy5ncm91cEJ5KVxuICAgICAgICA6IHZhbHVlXG4gICAgfSxcblxuICAgIGdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikge1xuICAgICAgY29uc3QgeyBvcHRpb25WYWx1ZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvblZhbHVlKVxuICAgICAgICA/IG9wdGlvbj8uW29wdGlvblZhbHVlXVxuICAgICAgICA6IGlzRnVuY3Rpb24ob3B0aW9uVmFsdWUpXG4gICAgICAgICAgPyBvcHRpb25WYWx1ZS5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG9wdGlvbiB9KSlcbiAgICAgICAgICA6IG9wdGlvblxuICAgIH0sXG5cbiAgICBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9uTGFiZWwgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc1N0cmluZyhvcHRpb25MYWJlbClcbiAgICAgICAgPyBvcHRpb24/LltvcHRpb25MYWJlbF1cbiAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdGlvbkxhYmVsKVxuICAgICAgICAgID8gb3B0aW9uTGFiZWwuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBvcHRpb24gfSkpXG4gICAgICAgICAgOiBsYWJlbGl6ZShgJHtvcHRpb259YClcbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHNjaGVtYSwgdmFsdWUsIGRhdGFQYXRoLCBncmFwaCkge1xuICAgIGlmIChzY2hlbWEucmVsYXRlKSB7XG4gICAgICAvLyBGb3IgaW50ZXJuYWxseSByZWxhdGluZyBkYXRhIChgc2NoZW1hLm9wdGlvbnMuZGF0YVBhdGhgKSwgd2UgbmVlZCB0b1xuICAgICAgLy8gcHJvY2VzcyBib3RoIHRoZSBvcHRpb25zIChmb3IgJyNyZWYnKSBhbmQgdGhlIHZhbHVlICgnI2lkJykuXG4gICAgICAvLyBTZWUgYERhdGFNaXhpbi5oYW5kbGVEYXRhU2NoZW1hKClgOlxuICAgICAgY29uc3QgcGF0aCA9IHNjaGVtYS5vcHRpb25zPy5kYXRhUGF0aFxuICAgICAgY29uc3QgcmVsYXRlZERhdGFQYXRoID0gcGF0aFxuICAgICAgICA/IG5vcm1hbGl6ZURhdGFQYXRoKGAke2RhdGFQYXRofS8ke3BhdGh9YClcbiAgICAgICAgOiBudWxsXG4gICAgICBncmFwaC5hZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpXG4gICAgICBpZiAocmVsYXRlZERhdGFQYXRoKSB7XG4gICAgICAgIGdyYXBoLnNldFNvdXJjZVJlbGF0ZWQocmVsYXRlZERhdGFQYXRoKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCByZWxhdGluZyBvYmplY3RzIHRvIGEgc2hhbGxvdyBjb3B5IHdpdGggb25seSB0aGUgaWQgbGVmdC5cbiAgICAgIC8vIFRPRE86IENvbnZlcnQgdG8gdXNpbmcgYHJlbGF0ZUJ5YDpcbiAgICAgIGNvbnN0IHByb2Nlc3NSZWxhdGUgPSB2YWx1ZSA9PiAodmFsdWUgPyB7IGlkOiB2YWx1ZS5pZCB9IDogdmFsdWUpXG4gICAgICAvLyBTZWxlY3RlZCBvcHRpb25zIGNhbiBiZSBib3RoIG9iamVjdHMgJiBhcnJheXMsIGUuZy4gJ2NoZWNrYm94ZXMnOlxuICAgICAgdmFsdWUgPSBpc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzUmVsYXRlKVxuICAgICAgICA6IHByb2Nlc3NSZWxhdGUodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1jaGVja2JveGVzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1jaGVja2JveChcbiAgICAgICAgcmVmPVwiZWxlbWVudFwiXG4gICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICApXG4gICAgICB8IHt7IGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY2hlY2tib3hlcycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgZGVmYXVsdFZhbHVlOiBbXSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkT3B0aW9uczoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRWYWx1ZSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlKVxuICAgICAgfSxcblxuICAgICAgc2V0KG9wdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBvcHRpb24gfHwgW11cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jaGVja2JveGVzIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICAuZGl0by1jaGVja2JveCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNvZGUoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiY29kZVwiXG4gIDpzdHlsZT1cInN0eWxlXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IENvZGVGbGFzayBmcm9tICdjb2RlZmxhc2snXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29kZScsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCAzXG4gICAgfSxcblxuICAgIHN0eWxlKCkge1xuICAgICAgcmV0dXJuIGBoZWlnaHQ6IGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCBmbGFzayA9IG5ldyBDb2RlRmxhc2sodGhpcy4kcmVmcy5jb2RlLCB7XG4gICAgICBsYW5ndWFnZTogdGhpcy5zY2hlbWEubGFuZ3VhZ2UgfHwgJ2phdmFzY3JpcHQnLFxuICAgICAgdGFiU2l6ZTogdGhpcy5zY2hlbWEuaW5kZW50U2l6ZSB8fCAyLFxuICAgICAgbGluZU51bWJlcnM6IGZhbHNlXG4gICAgfSlcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgIGxldCBpZ25vcmVVcGRhdGUgPSBmYWxzZVxuXG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbkZvY3VzID0gKCkgPT4gdGhpcy5vbkZvY3VzKClcblxuICAgIGNvbnN0IG9uQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIG9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICB0aGlzLmRvbU9uKHRoaXMuJHJlZnMuY29kZS5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLCB7XG4gICAgICBmb2N1czogb25Gb2N1cyxcbiAgICAgIGJsdXI6IG9uQmx1clxuICAgIH0pXG5cbiAgICBjb25zdCBzZXRDb2RlID0gY29kZSA9PiB7XG4gICAgICBpZiAoY29kZSAhPT0gZmxhc2suY29kZSkge1xuICAgICAgICBpZ25vcmVVcGRhdGUgPSB0cnVlXG4gICAgICAgIGZsYXNrLnVwZGF0ZUNvZGUoY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICBpZ25vcmVXYXRjaCA9IHRydWVcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIG9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbGFzay5vblVwZGF0ZSh2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlVXBkYXRlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRWYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy4kd2F0Y2goJ3ZhbHVlJywgdmFsdWUgPT4ge1xuICAgICAgaWYgKGlnbm9yZVdhdGNoKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENvZGUodmFsdWUgfHwgJycpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHNldENvZGUodGhpcy52YWx1ZSB8fCAnJylcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKT8uZm9jdXMoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvZGUge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8vIEZvciBwcm9wZXIgc2l6aW5nIG9mIGNvbnRlbnQgYWxvbmcgd2l0aCA6c3R5bGU9XCJzdHlsZVwiIHNldHRpbmcgYWJvdmUsXG4gIC8vIGZvciBwcm9wZXIgbGluZS1oZWlnaHQgY2FsY3VsYXRpb24uXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuXG4gICYuZGl0by13aWR0aC1maWxsIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuXG4gIC5jb2RlZmxhc2sge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgLy8gSWdub3JlIHRoZSBwYXJlbnQgcGFkZGluZyBkZWZpbmVkIGFib3ZlIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHRvIHNldFxuICAgIC8vIHRoZSBkZXNpcmVkIGhlaWdodCB3aXRoIDpzdHlsZT1cInN0eWxlXCIuXG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICAuY29kZWZsYXNrX190ZXh0YXJlYSxcbiAgLmNvZGVmbGFza19fcHJlIHtcbiAgICAvLyBVc2Ugc2FtZSBwYWRkaW5nIGFzIC5kaXRvLWNvZGVcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19jb2RlLFxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplKTtcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpO1xuICB9XG5cbiAgLmNvZGVmbGFza19fbGluZXMge1xuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by1jb2xvcihcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImNsaWNrXCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgLmRpdG8taW5wdXQoOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IHNob3dQb3B1cCB9XCIpXG4gICAgICBpbnB1dChcbiAgICAgICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cImhleFZhbHVlXCJcbiAgICAgICAgdHlwZT1cImlucHV0XCJcbiAgICAgICAgc2l6ZT1cIjhcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIC5kaXRvLWNvbG9yLXByZXZpZXcuZGl0by1pbmhlcml0LWZvY3VzKFxuICAgICAgICB2LWlmPVwidmFsdWVcIlxuICAgICAgKVxuICAgICAgICBkaXYoOnN0eWxlPVwieyBiYWNrZ3JvdW5kOiBgIyR7aGV4VmFsdWUgfHwgJzAwMDAwMDAwJ31gIH1cIilcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgICAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICBAY2xpY2suc3RvcD1cImNsZWFyXCJcbiAgICAgIClcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIFNrZXRjaFBpY2tlci5kaXRvLWNvbG9yLXBpY2tlcihcbiAgICAgIHYtbW9kZWw9XCJjb2xvclZhbHVlXCJcbiAgICAgIDpkaXNhYmxlQWxwaGE9XCIhYWxwaGFcIlxuICAgICAgOmRpc2FibGVGaWVsZHM9XCIhaW5wdXRzXCJcbiAgICAgIDpwcmVzZXRDb2xvcnM9XCJwcmVzZXRzXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHRpbnljb2xvciBmcm9tICd0aW55Y29sb3IyJ1xuaW1wb3J0IHsgU2tldGNoIGFzIFNrZXRjaFBpY2tlciB9IGZyb20gJ0Bsazc3L3Z1ZTMtY29sb3InXG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBUcmlnZ2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvbG9yJywge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIFNrZXRjaFBpY2tlciB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogZmFsc2UsXG4gICAgICBjb252ZXJ0ZWRIZXhWYWx1ZTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNvbG9yVmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwge31cbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmNvbG9yRm9ybWF0XG4gICAgICAgIGNvbnN0IGtleSA9IChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBOT1RFOiB2dWUzLWNvbG9yIGNhbGxzIGl0ICdoZXgnLCB3aGlsZSB0aW55Y29sb3IgY2FsbHMgaXQgJ2hleDYnXG4gICAgICAgICAgICBoZXg6IHZhbHVlPy5hIDwgMSA/ICdoZXg4JyA6ICdoZXgnLFxuICAgICAgICAgICAgcmdiOiAncmdiYSdcbiAgICAgICAgICB9W2Zvcm1hdF0gfHxcbiAgICAgICAgICBmb3JtYXRcbiAgICAgICAgKVxuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGlueWNvbG9yKHZhbHVlKS50b1N0cmluZyhmb3JtYXQpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGhleFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBudWxsXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gdGlueWNvbG9yKHRoaXMudmFsdWUpXG4gICAgICAgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmNvbnZlcnRlZEhleFZhbHVlID0gY29sb3JcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKGNvbG9yLmdldEFscGhhKCkgPCAxID8gJ2hleDgnIDogJ2hleDYnKVxuICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkSGV4VmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmNvbnZlcnRlZEhleFZhbHVlID0gdmFsdWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVE9ETzogYGZvcm1hdGAgY2xhc2hlcyB3aXRoIFR5cGVNaXhpbi5mb3JtYXQoKWAsIHdoaWNoIHNoYWxsIGJlIHJlbmFtZWRcbiAgICAvLyBzb29uIHRvIGBmb3JtYXRWYWx1ZSgpYC4gUmVuYW1lIGBjb2xvckZvcm1hdGAgYmFjayB0byBgZm9ybWF0YCBhZnRlci5cbiAgICBjb2xvckZvcm1hdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Zvcm1hdCcsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdoZXgnXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dBbHBoYWA/XG4gICAgYWxwaGE6IGdldFNjaGVtYUFjY2Vzc29yKCdhbHBoYScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRzYD9cbiAgICBpbnB1dHM6IGdldFNjaGVtYUFjY2Vzc29yKCdpbnB1dHMnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pLFxuXG4gICAgcHJlc2V0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ3ByZXNldHMnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IFtcbiAgICAgICAgJyNmZmZmZmYnLFxuICAgICAgICAnI2MzYzNjMycsXG4gICAgICAgICcjN2Y3ZjdmJyxcbiAgICAgICAgJyMwMDAwMDAnLFxuICAgICAgICAnIzg4MDAxNScsXG4gICAgICAgICcjZWQxYzI0JyxcbiAgICAgICAgJyNmZjdmMjcnLFxuICAgICAgICAnI2ZmZjIwMCcsXG5cbiAgICAgICAgJyMyMmIxNGMnLFxuICAgICAgICAnIzAwYTJlOCcsXG4gICAgICAgICcjM2Y0OGNjJyxcbiAgICAgICAgJyNhMzQ5YTQnLFxuICAgICAgICAnI2I5N2E1NycsXG4gICAgICAgICcjZmZhZWM5JyxcbiAgICAgICAgJyNmZmM5MGUnLFxuICAgICAgICAnIzAwMDAwMDAwJ1xuICAgICAgXVxuICAgIH0pXG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBmb2N1c2VkKGZvY3VzZWQpIHtcbiAgICAgIGlmICghZm9jdXNlZCAmJiB0aGlzLmNvbnZlcnRlZEhleFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGlueWNvbG9yKGAjJHt0aGlzLmNvbnZlcnRlZEhleFZhbHVlfWApXG4gICAgICAgIGlmIChjb2xvcj8uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IGNvbG9yLnRvU3RyaW5nKHRoaXMuY29sb3JGb3JtYXQpXG4gICAgICAgICAgLy8gVE9ETzogRW1pdCAnaW5wdXQnIGhlcmUgaW5zdGVhZCwgYW5kICdjaGFuZ2UnIGluIGJsdXIsIGxpa2Ugb3RoZXJzLlxuICAgICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGNvbG9yLXN3YXRjaC13aWR0aDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5LXNpemU7XG4kY29sb3Itc3dhdGNoLXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAkYm9yZGVyLXdpZHRoO1xuXG4uZGl0by1jb2xvciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICBpbnB1dCB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYnV0dG9uLWNsZWFyIHtcbiAgICBtYXJnaW4tcmlnaHQ6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gIH1cblxuICAuZGl0by1jb2xvci1waWNrZXIge1xuICAgIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB9XG5cbiAgLmRpdG8tY29sb3ItcHJldmlldyB7XG4gICAgYmFja2dyb3VuZDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5O1xuICAgIGJvcmRlci1sZWZ0OiAkYm9yZGVyLXN0eWxlO1xuXG4gICAgJixcbiAgICBkaXYge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkY29sb3Itc3dhdGNoLXJhZGl1cztcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkY29sb3Itc3dhdGNoLXJhZGl1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgdi1iaW5kPVwiJHByb3BzXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4vLyBUaGlzIGlzIHRoZSBnZW5lcmFsIHB1cnBvc2UgJ2NvbXBvbmVudCcgdHlwZSwgd2hpY2ggY2FuIHJlc29sdmUgdG8gYW55IGN1c3RvbVxuLy8gY29tcG9uZW50IHRocm91Z2ggYHNjaGVtYS5jb21wb25lbnRgLCBzZWUgYHJlc29sdmVTY2hlbWFDb21wb25lbnQoKWAuIFRoaXNcbi8vIGNhbiBiZSB1c2VkIHRvIG5lc3QgYXJiaXRyYXJ5IHZ1ZSBjb21wb25lbnRzIGluIHNjaGVtYTpcbi8vIHtcbi8vICAgdHlwZTogJ2NvbXBvbmVudCcsXG4vLyAgIGNvbXBvbmVudDogaW1wb3J0KCcuL2NvbXBvbmVudCcpXG4vLyB9XG5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IHJlc29sdmVTY2hlbWFDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29tcG9uZW50Jywge1xuICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgYGRlZmF1bHRWYWx1ZTogbnVsbGAgdG8gbm90IHNldCBhbnkgZGF0YSBmb3IgY3VzdG9tXG4gIC8vIGNvbXBvbmVudHMsIHVubGVzcyB0aGV5IHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlLlxuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEpIHtcbiAgICBhd2FpdCByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0cmlnZ2VyIGV2YWx1YXRpb24gb2YgYHZhbHVlYCB0aGF0IGRvc2Ugbm90XG4vLy0gaW52b2x2ZSBhY3R1YWxseSByZW5kZXJpbmcgaXQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCB2aXNpYmxlLlxuaW5wdXQuZGl0by10ZXh0LmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDpuYW1lPVwibmFtZVwiXG4gIHR5cGU9XCJ0ZXh0XCJcbiAgOnZhbHVlPVwidmFsdWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpyZWFkb25seT1cInRydWVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RhdGFNaXhpbi5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnY29tcHV0ZWQnLCAnZGF0YScsICdoaWRkZW4nXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgICBkZWZhdWx0VmlzaWJsZTogZmFsc2UsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzXG4gICAgICAgICAgaWYgKHNjaGVtYS5kYXRhIHx8IHNjaGVtYS5kYXRhUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEoc2NoZW1hLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgICAvLyBNb2RpZnlpbmcgYHRoaXMuZGF0YWAgYmVsb3cgdHJpZ2dlcnMgYW5vdGhlciBjYWxsIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgdmFsdWVgIGdldHRlciwgc28gdXNlIGEgdmFsdWUgb2YgMiBmb3IgYHJlc29sdmVDb3VudGVyYCB0b1xuICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc29sdmVkIGRhdGEgdHdpY2UuXG4gICAgICAgICAgICAgIHJlc29sdmVDb3VudGVyOiAyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuZ2V0LmNhbGwodGhpcylcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGVcbiAgY29tcG9uZW50KFxuICAgIDppcz1cImdldENvbXBvbmVudCh0eXBlKVwiXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJkYXRlVmFsdWVcIlxuICAgIDpsb2NhbGU9XCJsb2NhbGVcIlxuICAgIDpkYXRlRm9ybWF0PVwieyAuLi5hcGkuZm9ybWF0cy5kYXRlLCAuLi5kYXRlRm9ybWF0IH1cIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIERhdGVUaW1lUGlja2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSxcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG9ubHkgaGVyZSBzbyB3ZSBnZXQgcGxhY2Vob2xkZXIgYWRkZWQuIENvbWUgdXAgd2l0aCBhXG4gICAgLy8gYmV0dGVyIHdheSB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgcGVyIGNvbXBvbmVudCAoYSBsaXN0IG9mIGFjdHVhbGx5XG4gICAgLy8gc3VwcG9ydGVkIGF0dHJpYnV0ZXMpXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRhdGVWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRhdGVGb3JtYXQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkYXRlRm9ybWF0Jywge1xuICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldENvbXBvbmVudCh0eXBlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0ZTogJ2RhdGUtcGlja2VyJyxcbiAgICAgICAgICB0aW1lOiAndGltZS1waWNrZXInLFxuICAgICAgICAgIGRhdGV0aW1lOiAnZGF0ZS10aW1lLXBpY2tlcidcbiAgICAgICAgfVt0eXBlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzRGF0ZSh2YWx1ZSkgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogdmFsdWVcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4vUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTY2hlbWFQYXJlbnRNaXhpbiBmcm9tICcuLi9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciwgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYSxcbiAgcHJvY2Vzc0Zvcm1zLFxuICBnZXROYW1lZFNjaGVtYXMsXG4gIGdldEJ1dHRvblNjaGVtYXMsXG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICBnZXRWaWV3U2NoZW1hLFxuICBpc0NvbXBhY3QsXG4gIGlzSW5saW5lZCxcbiAgaXNPYmplY3RTb3VyY2UsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzTnVtYmVyLFxuICBlcXVhbHMsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW1Jlc291cmNlTWl4aW4sIFNjaGVtYVBhcmVudE1peGluXSxcblxuICBkZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gICAgcmV0dXJuIGlzTGlzdFNvdXJjZShzY2hlbWEpID8gW10gOiBudWxsXG4gIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB3cmFwcGVkUHJpbWl0aXZlczogbnVsbCxcbiAgICAgIHVud3JhcHBpbmdQcmltaXRpdmVzOiBmYWxzZSxcbiAgICAgIGlnbm9yZVJvdXRlQ2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIGlzT2JqZWN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgaXNMaXN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzTGlzdFNvdXJjZSh0aGlzLnR5cGUpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmhhc0RhdGEoKVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZhbHVlXG4gICAgfSxcblxuICAgIGlzUmVhZHkoKSB7XG4gICAgICAvLyBMaXN0cyB0aGF0IGhhdmUgbm8gZGF0YSBhbmQgbm8gYXNzb2NpYXRlZCByZXNvdXJjZSBzaG91bGQgc3RpbGwgcmVuZGVyLFxuICAgICAgLy8gYXMgdGhleSBtYXkgYmUgZ2V0dGluZyB0aGVpciBkYXRhIGVsc2V3aGVyZSwgZS5nLiBgY29tcHV0ZSgpYC5cbiAgICAgIHJldHVybiB0aGlzLmhhc0RhdGEgfHwgIXRoaXMucHJvdmlkZXNEYXRhXG4gICAgfSxcblxuICAgIGlzSW5WaWV3KCkge1xuICAgICAgcmV0dXJuICEhdGhpcy52aWV3Q29tcG9uZW50XG4gICAgfSxcblxuICAgIHdyYXBQcmltaXRpdmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLndyYXBQcmltaXRpdmVzXG4gICAgfSxcblxuICAgIGxpc3REYXRhOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy52YWx1ZVxuICAgICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gbGlzdCBhcnJheS5cbiAgICAgICAgICBkYXRhID0gZGF0YSAhPSBudWxsID8gW2RhdGFdIDogW11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBkYXRhIGdldHMgaW5oZXJpdGVkIGZyb20gcGFyZW50LCB1bndyYXBwaW5nIGlzIG5vdCBoYXBwZW5pbmdcbiAgICAgICAgICAvLyBhdCB0aGUgcm9vdCBpbiBgc2V0RGF0YSgpYCwgYnV0IGhlcmUgaW5zdGVhZC5cbiAgICAgICAgICBkYXRhID0gdGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSB8fCBkYXRhXG4gICAgICAgIH1cbiAgICAgICAgZGF0YSB8fD0gW11cbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgICBpZiAodGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcykge1xuICAgICAgICAgICAgLy8gV2UncmUgZG9uZSB1bndyYXBwaW5nIG9uY2UgYGxpc3REYXRhYCBpcyByZWV2YWx1YXRlZCwgc28gc2V0XG4gICAgICAgICAgICAvLyB0aGlzIHRvIGBmYWxzZWAgYWdhaW4uIFNlZSBgd3JhcHBlZFByaW1pdGl2ZXNgIHdhdGNoZXIgYWJvdmUuXG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgdG8gYSBsaXN0IG9mIHdyYXBwZWQgcHJpbWl0aXZlcywgYW5kIHJldHVybiBpdC5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy53cmFwcGVkUHJpbWl0aXZlcyA9IGRhdGEubWFwKHZhbHVlID0+ICh7XG4gICAgICAgICAgICAgIFt3cmFwUHJpbWl0aXZlc106IHZhbHVlXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZFByaW1pdGl2ZXNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMud3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmlzT2JqZWN0U291cmNlXG4gICAgICAgICAgICA/IGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gZGF0YVswXVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogZGF0YVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9iamVjdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gQWx3YXlzIGdvIHRocm91Z2ggYGxpc3REYXRhYCBpbnRlcm5hbGx5LCB3aGljaCBkb2VzIGFsbCB0aGVcbiAgICAgICAgLy8gcHJvY2Vzc2luZyBvZiBgd3JhcFByaW1pdGl2ZXNgLCBldGMuXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3REYXRhWzBdIHx8IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHNldChkYXRhKSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEgPSBkYXRhID8gW2RhdGFdIDogW11cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc291cmNlU2NoZW1hKCkge1xuICAgICAgLy8gVGhlIHNvdXJjZVNjaGVtYSBvZiBhIGxpc3QgaXMgdGhlIGxpc3QncyBzY2hlbWEgaXRzZWxmLlxuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hXG4gICAgfSxcblxuICAgIHBhdGgoKSB7XG4gICAgICAvLyBUaGlzIGlzIHVzZWQgaW4gVHlwZUxpc3QgZm9yIERpdG9Gb3JtQ2hvb3Nlci5cbiAgICAgIHJldHVybiB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aCh0aGlzLnNjaGVtYS5wYXRoKVxuICAgIH0sXG5cbiAgICBkZWZhdWx0UXVlcnkoKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHRPcmRlcjogb3JkZXIgfSA9IHRoaXNcbiAgICAgIHJldHVybiBvcmRlciA/IHsgb3JkZXIgfSA6IHt9XG4gICAgfSxcblxuICAgIHF1ZXJ5OiBnZXRTdG9yZUFjY2Vzc29yKCdxdWVyeScsIHtcbiAgICAgIGdldChxdWVyeSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdFF1ZXJ5LFxuICAgICAgICAgIC4uLnF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHNldChxdWVyeSkge1xuICAgICAgICAvLyBBbHdheXMga2VlcCB0aGUgZGlzcGxheWVkIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gc3luYyB3aXRoIHRoZSBzdG9yZWRcbiAgICAgICAgLy8gb25lcy4gVXNlIHNjb3BlIGFuZCBwYWdlIGZyb20gdGhlIGxpc3Qgc2NoZW1hIGFzIGRlZmF1bHRzLCBidXQgYWxsb3dcbiAgICAgICAgLy8gdGhlIHJvdXRlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gb3ZlcnJpZGUgdGhlbS5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHNjb3BlID0gdGhpcy5kZWZhdWx0U2NvcGU/Lm5hbWUsXG4gICAgICAgICAgcGFnZSA9IHRoaXMuc2NoZW1hLnBhZ2VcbiAgICAgICAgfSA9IHRoaXMucXVlcnlcbiAgICAgICAgLy8gUHJlc2VydmUgLyBtZXJnZSBjdXJyZW50bHkgc3RvcmVkIHZhbHVlcy5cbiAgICAgICAgcXVlcnkgPSB7XG4gICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAuLi4oc2NvcGUgIT0gbnVsbCAmJiB7IHNjb3BlIH0pLFxuICAgICAgICAgIC4uLihwYWdlICE9IG51bGwgJiYgeyBwYWdlIH0pLFxuICAgICAgICAgIC4uLnF1ZXJ5XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlcXVhbHMocXVlcnksIHRoaXMuJHJvdXRlLnF1ZXJ5KSkge1xuICAgICAgICAgIC8vIFRlbGwgdGhlIGAkcm91dGVgIHdhdGNoZXIgdG8gaWdub3JlIHRoZSBjaGFuZ2VkIHRyaWdnZXJlZCBoZXJlOlxuICAgICAgICAgIHRoaXMuaWdub3JlUm91dGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoeyBxdWVyeSwgaGFzaDogdGhpcy4kcm91dGUuaGFzaCB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeSAvLyBMZXQgZ2V0U3RvcmVBY2Nlc3NvcigpIGRvIHRoZSBhY3R1YWwgc2V0dGluZ1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgdG90YWw6IGdldFN0b3JlQWNjZXNzb3IoJ3RvdGFsJyksXG5cbiAgICBjb2x1bW5zKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5jb2x1bW5zKVxuICAgIH0sXG5cbiAgICBzY29wZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnNjb3BlcylcbiAgICB9LFxuXG4gICAgZGVmYXVsdFNjb3BlKCkge1xuICAgICAgbGV0IGZpcnN0ID0gbnVsbFxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNjb3BlcykpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuZGVmYXVsdFNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGRlZmF1bHRPcmRlcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0U29ydCB9ID0gY29sdW1uXG4gICAgICAgICAgaWYgKGRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1N0cmluZyhkZWZhdWx0U29ydCkgPyBkZWZhdWx0U29ydCA6ICdhc2MnXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29sdW1uLm5hbWV9ICR7ZGlyZWN0aW9ufWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KSlcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGlua2VkIHZpZXcgc2NoZW1hIGlmIHRoaXMgc291cmNlIGVkaXRzIGl0IGl0cyBpdGVtcyB0aHJvdWdoXG4gICAgLy8gYSBsaW5rZWQgdmlldy5cbiAgICB2aWV3KCkge1xuICAgICAgcmV0dXJuIGdldFZpZXdTY2hlbWEodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgbGlua3NUb1ZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbXBvbmVudHMgPSB7XG4gICd0ZXh0JyhmaWx0ZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvbnRhaW5zJyxcbiAgICAgICAgdmFsdWU6ICdjb250YWlucydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZXF1YWxzJyxcbiAgICAgICAgdmFsdWU6ICdlcXVhbHMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N0YXJ0cyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdzdGFydHMtd2l0aCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZW5kcyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdlbmRzLXdpdGgnXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogaXNBcnJheShmaWx0ZXIub3BlcmF0b3JzKVxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IGZpbHRlci5vcGVyYXRvcnMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLFxuICAgICAgICAgICAgd2lkdGg6ICc0MCUnXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgd2lkdGg6IGZpbHRlci5vcGVyYXRvcnMgPyAnNjAlJyA6ICdmaWxsJ1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzUGFuZWwoZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIHR5cGU6ICdwYW5lbCcsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBuYW1lOiAnJGZpbHRlcnMnLFxuICAgIHRhcmdldDogZGF0YVBhdGgsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBwcm94eS5xdWVyeVxuICAgICAgKVxuICAgIH0sXG4gICAgY29tcG9uZW50czogZ2V0RmlsdGVyc0NvbXBvbmVudHMoZmlsdGVycyksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xlYXI6IHtcbiAgICAgICAgdGV4dDogJ0NsZWFyJyxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgY2xpY2soeyBzY2hlbWFDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50LnJlc2V0RGF0YSgpXG4gICAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGZpbHRlcjoge1xuICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgdGV4dDogJ0ZpbHRlcicsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAgIHNjaGVtYUNvbXBvbmVudC5hcHBseUZpbHRlcnMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgYXBwbHlGaWx0ZXJzKCkge1xuICAgICAgICBwcm94eS5xdWVyeSA9IHtcbiAgICAgICAgICAuLi5wcm94eS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IGZvcm1hdEZpbHRlcnNEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpLFxuICAgICAgICAgIC8vIENsZWFyIHBhZ2luYXRpb24gd2hlbiBhcHBseWluZyBvciBjbGVhcmluZyBmaWx0ZXJzOlxuICAgICAgICAgIHBhZ2U6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYW5lbFxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJzKSB7XG4gIGNvbnN0IGNvbXBzID0ge31cbiAgZm9yIChjb25zdCBmaWx0ZXIgb2YgT2JqZWN0LnZhbHVlcyhmaWx0ZXJzIHx8IHt9KSkge1xuICAgIC8vIFN1cHBvcnQgYm90aCBjdXN0b20gZm9ybXMgYW5kIGRlZmF1bHQgZmlsdGVyIGNvbXBvbmVudHMsIHRocm91Z2ggdGhlXG4gICAgLy8gYGZpbHRlckNvbXBvbmVudHNgIHJlZ2lzdHJ5LiBFdmVuIGZvciBkZWZhdWx0IGZpbHRlcnMsIHN0aWxsIHVzZSB0aGVcbiAgICAvLyBwcm9wZXJ0aWVzIGluIGBmaWx0ZXJgIGFzIHRoZSBiYXNlIGZvciBgZm9ybWAsIHNvIHRoaW5ncyBsaWtlIGBsYWJlbGBcbiAgICAvLyBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgcmVzdWx0aW5nIGZvcm0uXG4gICAgY29uc3QgeyBmaWx0ZXI6IHR5cGUsIC4uLmZvcm0gfSA9IGZpbHRlclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlXG4gICAgICA/IGZpbHRlckNvbXBvbmVudHNbdHlwZV0/LihmaWx0ZXIpXG4gICAgICA6IGZpbHRlci5jb21wb25lbnRzXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvcm0udHlwZSA9ICdmb3JtJ1xuICAgICAgZm9ybS5jb21wb25lbnRzID0ge31cbiAgICAgIC8vIENvbnZlcnQgbGFiZWxzIHRvIHBsYWNlaG9sZGVyczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjb21wb25lbnQubGFiZWwgfHwgbGFiZWxpemUoY29tcG9uZW50Lm5hbWUgfHwga2V5KVxuICAgICAgICAgIGZvcm0uY29tcG9uZW50c1trZXldID0ge1xuICAgICAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wc1tmaWx0ZXIubmFtZV0gPSB7XG4gICAgICAgIGxhYmVsOiBmb3JtLmxhYmVsLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KSxcbiAgICAgICAgZm9ybSxcbiAgICAgICAgaW5saW5lZDogdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZpbHRlciAnJHtmaWx0ZXIubmFtZX0nOiBVbmtub3duIGZpbHRlciB0eXBlICcke3R5cGV9Jy5gXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wc1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkge1xuICBjb25zdCBjb21wb25lbnQgPSBzY2hlbWEuY29tcG9uZW50c1tuYW1lXVxuICByZXR1cm4gY29tcG9uZW50Py5mb3JtPy5jb21wb25lbnRzXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbHRlcnNEYXRhKHNjaGVtYSwgZGF0YSkge1xuICBjb25zdCBmaWx0ZXJzID0gW11cbiAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICBjb25zdCBlbnRyeSA9IGRhdGFbbmFtZV1cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIC8vIE1hcCBjb21wb25lbnRzIHNlcXVlbmNlIHRvIGFyZ3VtZW50czpcbiAgICAgIGNvbnN0IGFyZ3MgPSBPYmplY3Qua2V5cyhnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkpLm1hcChcbiAgICAgICAga2V5ID0+IGVudHJ5W2tleV0gPz8gbnVsbFxuICAgICAgKVxuICAgICAgLy8gT25seSBhcHBseSBmaWx0ZXIgaWYgdGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHRoYXQgYXJlbid0IG51bGw6XG4gICAgICBpZiAoYXJncy5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICBmaWx0ZXJzLnB1c2goYCR7bmFtZX06JHthcmdzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbignLCcpfWApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJzLmxlbmd0aCA/IGZpbHRlcnMgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXJzRGF0YShzY2hlbWEsIHF1ZXJ5KSB7XG4gIGNvbnN0IGZpbHRlcnMgPSB7fVxuICAvLyBTYW1lIGFzIEBkaXRvanMvc2VydmVyJ3MgUXVlcnlQYXJhbWV0ZXJzLmZpbHRlcjogVHJhbnNsYXRlIHRoZSBzdHJpbmcgZGF0YVxuICAvLyBmcm9tICRyb3V0ZS5xdWVyeSBiYWNrIHRvIHBhcmFtIGxpc3RzIHBlciBmaWx0ZXI6XG4gIGlmIChxdWVyeSkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGFzQXJyYXkocXVlcnkuZmlsdGVyKSkge1xuICAgICAgY29uc3QgWywgbmFtZSwganNvbl0gPSBmaWx0ZXIubWF0Y2goL14oXFx3Kyk6KC4qKSQvKVxuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsdGVyc1tuYW1lXSA9IGFzQXJyYXkoSlNPTi5wYXJzZShgWyR7anNvbn1dYCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICB9XG4gIH1cbiAgY29uc3QgZmlsdGVyc0RhdGEgPSB7fVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gc2NoZW1hLmNvbXBvbmVudHMpIHtcbiAgICBjb25zdCBkYXRhID0ge31cbiAgICAvLyBJZiB3ZSBoYXZlIHJldHJpZXZlZCBwYXJhbXMgZnJvbSB0aGUgcXVlcnksIGZldGNoIHRoZSBhc3NvY2lhdGVkXG4gICAgLy8gZm9ybSBjb21wb25lbnRzIHNvIHdlIGNhbiBtYXAgdGhlIHZhbHVlcyBiYWNrIHRvIG9iamVjdCBrZXlzOlxuICAgIGNvbnN0IGFyZ3MgPSBmaWx0ZXJzW25hbWVdXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSlcbiAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgICAgIGRhdGFba2V5XSA9IGFyZ3NbaW5kZXgrK11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJzRGF0YVtuYW1lXSA9IGRhdGFcbiAgfVxuICByZXR1cm4gZmlsdGVyc0RhdGFcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1saXN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwic2NoZW1hLmNsYXNzXCJcbiAgOnN0eWxlPVwic2NoZW1hLnN0eWxlXCJcbilcbiAgLmRpdG8tbmF2aWdhdGlvbihcbiAgICB2LWlmPVwic2NvcGVzIHx8IGhhc1BhZ2luYXRpb25cIlxuICApXG4gICAgRGl0b1Njb3BlcyhcbiAgICAgIHYtaWY9XCJzY29wZXNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOnNjb3Blcz1cInNjb3Blc1wiXG4gICAgKVxuICAgIC8vLSBXaGVuIHRoZXJlJ3Mgb25seSBwYWdpbmF0aW9uIHdpdGhvdXQgc2NvcGVzLCB3ZSBuZWVkIGEgZ29vZCBvbCcgc3BhY2VyXG4gICAgLy8tIGRpdiwgZm9yIHRoZSBsYXlvdXQgbm90IHRvIGJyZWFrLi4uXG4gICAgLmRpdG8tc3BhY2VyKFxuICAgICAgdi1lbHNlLWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgKVxuICAgIERpdG9QYWdpbmF0aW9uKFxuICAgICAgdi1pZj1cImhhc1BhZ2luYXRpb25cIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmxpbWl0PVwicGFnaW5hdGVcIlxuICAgICAgOnRvdGFsPVwidG90YWwgfHwgMFwiXG4gICAgKVxuICB0YWJsZS5kaXRvLXRhYmxlKFxuICAgIDpjbGFzcz1ge1xuICAgICAgJ2RpdG8tdGFibGUtc2VwYXJhdG9ycyc6IGlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWxhcmdlci1wYWRkaW5nJzogaGFzRWRpdEJ1dHRvbnMgJiYgIWlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWFsdGVybmF0ZS1jb2xvcnMnOiAhaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtZXZlbi1jb3VudCc6IGhhc0V2ZW5Db3VudFxuICAgIH1gXG4gIClcbiAgICBEaXRvVGFibGVIZWFkKFxuICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpoYXNFZGl0QnV0dG9ucz1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgRGl0b0RyYWdnYWJsZShcbiAgICAgIHRhZz1cInRib2R5XCJcbiAgICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0RGF0YSwgcGFnaW5hdGlvblJhbmdlKVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhmYWxzZSlcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCJ2YWx1ZSA9PiAobGlzdERhdGEgPSB2YWx1ZSlcIlxuICAgIClcbiAgICAgIHRyKFxuICAgICAgICB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gbGlzdERhdGFcIlxuICAgICAgICA6aWQ9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICA6a2V5PVwiZ2V0SXRlbVVpZChzY2hlbWEsIGl0ZW0pXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBEaXRvVGFibGVDZWxsKFxuICAgICAgICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGNvbHVtbilcIlxuICAgICAgICAgICAgICA6a2V5PVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRDZWxsQ2xhc3MoY29sdW1uKVwiXG4gICAgICAgICAgICAgIDpjZWxsPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgIClcbiAgICAgICAgICB0ZFxuICAgICAgICAgICAgRGl0b1NjaGVtYUlubGluZWQoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc0lubGluZWRcIlxuICAgICAgICAgICAgICA6bGFiZWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4LCBhc09iamVjdDogdHJ1ZSB9KVwiXG4gICAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShpbmRleClcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbXBvbmVudChcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgICAgICAgICAgdi1odG1sPVwicmVuZGVyKGdldENvbnRleHQoaXRlbSwgaW5kZXgpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgaXRlbSwgeyBpbmRleCB9KVwiXG4gICAgICAgICAgICApXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoXG4gICAgICAgICAgdi1pZj1cImhhc0NlbGxFZGl0QnV0dG9uc1wiXG4gICAgICAgIClcbiAgICAgICAgICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoaW5kZXgpXCJcbiAgICAgICAgICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgKVxuICAgIC8vLSBSZW5kZXIgY3JlYXRlIGJ1dHRvbnMgaW5zaWRlIHRhYmxlIHdoZW4gbm90IGluIGEgc2luZ2xlIGNvbXBvbmVudCB2aWV3OlxuICAgIHRmb290KFxuICAgICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmICFzaW5nbGVcIlxuICAgIClcbiAgICAgIHRyXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoOmNvbHNwYW49XCJudW1Db2x1bW5zXCIpXG4gICAgICAgICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgICAgICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgICAgICAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgICAgICAgICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgOmRhdGE9XCJsaXN0RGF0YVwiXG4gICAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIClcbiAgLy8tIFJlbmRlciBjcmVhdGUgYnV0dG9ucyBvdXRzaWRlIHRhYmxlIHdoZW4gaW4gYSBzaW5nbGUgY29tcG9uZW50IHZpZXc6XG4gIERpdG9FZGl0QnV0dG9ucy5kaXRvLWJ1dHRvbnMtbWFpbi5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmIHNpbmdsZVwiXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImxpc3REYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0Vmlld0VkaXRQYXRoLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50LFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRGaWx0ZXJzUGFuZWwgfSBmcm9tICcuLi91dGlscy9maWx0ZXIuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBwaWNrQnksIGVxdWFscywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsaXN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbiwgU29ydGFibGVNaXhpbl0sXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAvLyBObyBuZWVkIGZvciB0cmFuc2Zvcm1hdGlvbiBoZXJlLiBTZWUgVHlwZVRyZWVMaXN0IGZvciBkZXRhaWxzLlxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgZ2V0UGFuZWxTY2hlbWEoc2NoZW1hLCBkYXRhUGF0aCwgc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBmaWx0ZXJzIH0gPSBzY2hlbWFcbiAgICAvLyBTZWUgaWYgdGhpcyBsaXN0IGNvbXBvbmVudCB3YW50cyB0byBkaXNwbGF5IGEgZmlsdGVyIHBhbmVsLCBhbmQgaWYgc28sXG4gICAgLy8gY3JlYXRlIHRoZSBwYW5lbCBzY2hlbWEgZm9yIGl0IHRocm91Z2ggYGdldEZpbHRlcnNQYW5lbCgpYC5cbiAgICBpZiAoZmlsdGVycykge1xuICAgICAgLy8gQXQgdGhlIHRpbWUgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBwYW5lbCBzY2hlbWEsIHRoZSBzY2hlbWFDb21wb25lbnQgaXNcbiAgICAgIC8vIG5vdCBmaWxsZWQgeWV0LCBzbyB3ZSBjYW4ndCBnZXQgdGhlIHRhcmdldCBjb21wb25lbnQgKGRhdGFQYXRoKSByaWdodFxuICAgICAgLy8gYXdheS4gVXNlIGEgcHJveHkgYW5kIGEgZ2V0dGVyIGluc3RlYWQsIHRvIGdldCBhcm91bmQgdGhpczpcbiAgICAgIGNvbnN0IGdldExpc3RDb21wb25lbnQgPSAoKSA9PlxuICAgICAgICBzY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aChcbiAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICBjb21wb25lbnQgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgICApXG5cbiAgICAgIHJldHVybiBnZXRGaWx0ZXJzUGFuZWwoXG4gICAgICAgIGdldE5hbWVkU2NoZW1hcyhmaWx0ZXJzKSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJveHkgdG8gZ2V0IC8gc2V0IHRoZSBxdWVyeSwgc2VlIGdldEZpbHRlcnNQYW5lbCgpXG4gICAgICAgICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldExpc3RDb21wb25lbnQoKT8ucXVlcnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldCBxdWVyeShxdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZ2V0TGlzdENvbXBvbmVudCgpXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmb3IgY29tcGFyaW5nIHdpdGggZXF1YWxzKClcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gb2JqID0+IHBpY2tCeShvYmosIHZhbHVlID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIGlmICghZXF1YWxzKGZpbHRlcihxdWVyeSksIGZpbHRlcihjb21wb25lbnQucXVlcnkpKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5xdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmxvYWREYXRhKGZhbHNlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUGFnaW5hdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRlICYmIHRoaXMudG90YWwgPiB0aGlzLnBhZ2luYXRlXG4gICAgfSxcblxuICAgIGhhc0xpc3RCdXR0b25zKCkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuYnV0dG9uU2NoZW1hcyB8fCB0aGlzLmNyZWF0YWJsZSlcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IGxpc3REYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsaXN0RGF0YS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kZWxldGFibGUgfHxcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0NlbGxFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0lubGluZWQgJiYgdGhpcy5oYXNFZGl0QnV0dG9uc1xuICAgIH0sXG5cbiAgICBoYXNFdmVuQ291bnQoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLmxpc3REYXRhLmxlbmd0aCAlIDIpXG4gICAgfSxcblxuICAgIG51bUNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5jb2x1bW5zID8gT2JqZWN0LmtleXModGhpcy5jb2x1bW5zKS5sZW5ndGggOiAxKSArXG4gICAgICAgICh0aGlzLmhhc0NlbGxFZGl0QnV0dG9ucyA/IDEgOiAwKVxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGF0YVBhdGgoaW5kZXgpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICB9LFxuXG4gICAgZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRWaWV3RWRpdFBhdGgodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dCkgfHwgdGhpcy5wYXRoXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0sIGluZGV4KVxuICAgICAgICByZXR1cm4gYCR7cGF0aH0vJHtpZH1gXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDZWxsQ2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gYGRpdG8tY2VsbC0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIGluZGV4LFxuICAgICAgICBkYXRhUGF0aDogdGhpcy5nZXREYXRhUGF0aChpbmRleClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRmlsdGVyRXJyb3JzKGVycm9ycykge1xuICAgICAgY29uc3QgZmlsdGVyc0RhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgJyRmaWx0ZXJzJylcbiAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0UGFuZWxCeURhdGFQYXRoKGZpbHRlcnNEYXRhUGF0aClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLmNvbHVtbnMpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1saXN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLW5hdmlnYXRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmctYm90dG9tOiAkY29udGVudC1wYWRkaW5nLWhhbGY7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc2NvcGVzLFxuICAgIC5kaXRvLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDAgMSBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgdG8gdGhlIGJvdHRvbTpcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9MYWJlbC5kaXRvLWxhYmVsLWNvbXBvbmVudChcbiAgOmxhYmVsPVwidmFsdWVcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xhYmVsJywge1xuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBhbGlnbkJvdHRvbTogZmFsc2Vcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1sYWJlbC1jb21wb25lbnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDJlbTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbWFya3VwKDppZD1cImRhdGFQYXRoXCIpXG4gIC5kaXRvLW1hcmt1cC10b29sYmFyKDplZGl0b3I9XCJlZGl0b3JcIilcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy10b29sYmFyKFxuICAgICAgdi1pZj1cImdyb3VwZWRCdXR0b25zLmxlbmd0aCA+IDBcIlxuICAgIClcbiAgICAgIC5kaXRvLWJ1dHRvbi1ncm91cChcbiAgICAgICAgdi1mb3I9XCJidXR0b25zIGluIGdyb3VwZWRCdXR0b25zXCJcbiAgICAgIClcbiAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgIHYtZm9yPVwieyBuYW1lLCBpY29uLCBpc0FjdGl2ZSwgb25DbGljayB9IGluIGJ1dHRvbnNcIlxuICAgICAgICAgIDprZXk9XCJuYW1lXCJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuICAgICAgICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICAgICAgICApXG4gICAgICAgICAgSWNvbig6bmFtZT1cImljb25cIilcbiAgRWRpdG9yQ29udGVudC5kaXRvLW1hcmt1cC1lZGl0b3IoXG4gICAgcmVmPVwiZWRpdG9yXCJcbiAgICA6ZWRpdG9yPVwiZWRpdG9yXCJcbiAgICA6c3R5bGU9XCJzdHlsZXNcIlxuICApXG4gIC5kaXRvLXJlc2l6ZShcbiAgICB2LWlmPVwicmVzaXphYmxlXCJcbiAgICBAbW91c2Vkb3duLnN0b3AucHJldmVudD1cIm9uRHJhZ1Jlc2l6ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IEVkaXRvciwgRWRpdG9yQ29udGVudCwgTWFyaywgZ2V0TWFya0F0dHJpYnV0ZXMgfSBmcm9tICdAdGlwdGFwL3Z1ZS0zJ1xuLy8gaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3RpcHRhcC1jb21tYW5kcydcbi8vIEVzc2VudGlhbHM6XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50J1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQnXG4vLyBNYXJrczpcbmltcG9ydCB7IEJvbGQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ib2xkJ1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUnXG5pbXBvcnQgeyBJdGFsaWMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pdGFsaWMnXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGluaydcbmltcG9ydCB7IFN0cmlrZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN0cmlrZSdcbmltcG9ydCB7IFVuZGVybGluZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXVuZGVybGluZSdcbi8vIE5vZGVzOlxuaW1wb3J0IHsgQmxvY2txdW90ZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJsb2NrcXVvdGUnXG5pbXBvcnQgeyBDb2RlQmxvY2sgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrJ1xuaW1wb3J0IHsgSGFyZEJyZWFrIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGFyZC1icmVhaydcbmltcG9ydCB7IEhlYWRpbmcgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oZWFkaW5nJ1xuaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tcGFyYWdyYXBoJ1xuaW1wb3J0IHsgSG9yaXpvbnRhbFJ1bGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ob3Jpem9udGFsLXJ1bGUnXG5pbXBvcnQgeyBPcmRlcmVkTGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLW9yZGVyZWQtbGlzdCdcbmltcG9ydCB7IEJ1bGxldExpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1idWxsZXQtbGlzdCdcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGlzdC1pdGVtJ1xuLy8gVE9ETzpcbi8vIGltcG9ydCB7IEltYWdlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taW1hZ2UnXG4vLyBpbXBvcnQgeyBNZW50aW9uIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbWVudGlvbidcbi8vIGltcG9ydCB7IENvZGVCbG9ja0hpZ2hsaWdodCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2staGlnaGxpZ2h0J1xuLy8gaW1wb3J0IHsgVGFibGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZSdcbi8vIGltcG9ydCB7IFRhYmxlQ2VsbCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWNlbGwnXG4vLyBpbXBvcnQgeyBUYWJsZUhlYWRlciB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWhlYWRlcidcbi8vIGltcG9ydCB7IFRhYmxlTm9kZXMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1ub2Rlcydcbi8vIGltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtcm93J1xuLy8gaW1wb3J0IHsgVGFza0xpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YXNrLWxpc3QnXG4vLyBpbXBvcnQgeyBUYXNrSXRlbSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhc2staXRlbSdcbi8vIFRvb2xzOlxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhpc3RvcnknXG5cbmltcG9ydCB7IEljb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7XG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICB1bmRlcnNjb3JlLFxuICBoeXBoZW5hdGUsXG4gIGRlYm91bmNlLFxuICBjYW1lbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ21hcmt1cCcsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBjb21wb25lbnRzOiB7XG4gICAgRWRpdG9yQ29udGVudCxcbiAgICBJY29uXG4gIH0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRvcjogbnVsbCxcbiAgICAgIGhlaWdodDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDEwXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQgfHwgYGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWFya0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdtYXJrcycsIHtcbiAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgaXRhbGljOiB0cnVlLFxuICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgIHN0cmlrZTogdHJ1ZSxcbiAgICAgICAgc21hbGw6IHRydWUsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICBvbkNsaWNrOiBlZGl0b3IgPT4gdGhpcy5vbkNsaWNrTGluayhlZGl0b3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGJhc2ljTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhlIHBhcmFncmFwaCBjb21tYW5kIGFzIGFjdGl2ZSBpZiBhbnkgb2YgdGhlIGJsb2NrXG4gICAgICAgICAgLy8gY29tbWFuZHMgYXJlIGFsc28gYWN0aXZlOlxuICAgICAgICAgIGlnbm9yZUFjdGl2ZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMub3RoZXJOb2RlQnV0dG9ucy5zb21lKGJ1dHRvbiA9PiBidXR0b24uaXNBY3RpdmUpXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRpbmc6IHtcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdsZXZlbCcsXG4gICAgICAgICAgdmFsdWVzOiBbMSwgMiwgMywgNCwgNSwgNl1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb3RoZXJOb2RlQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ25vZGVzJywge1xuICAgICAgICBidWxsZXRMaXN0OiB0cnVlLFxuICAgICAgICBvcmRlcmVkTGlzdDogdHJ1ZSxcbiAgICAgICAgYmxvY2txdW90ZTogdHJ1ZSxcbiAgICAgICAgY29kZUJsb2NrOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB0b29sQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ3Rvb2xzJywge1xuICAgICAgICB1bmRvOiB0cnVlLFxuICAgICAgICByZWRvOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBncm91cGVkQnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICB9ID0gdGhpc1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICBdLmZpbHRlcihidXR0b25zID0+IGJ1dHRvbnMubGVuZ3RoID4gMClcbiAgICB9LFxuXG4gICAgcGFyc2VPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiB7XG4gICAgICAgICAgJ2NvbGxhcHNlJzogZmFsc2UsXG4gICAgICAgICAgJ3ByZXNlcnZlJzogdHJ1ZSxcbiAgICAgICAgICAncHJlc2VydmUtYWxsJzogJ2Z1bGwnXG4gICAgICAgIH1bdGhpcy53aGl0ZXNwYWNlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlZGl0b3JPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRpdGFibGU6ICF0aGlzLnJlYWR5b25seSxcbiAgICAgICAgYXV0b0ZvY3VzOiB0aGlzLmF1dG9mb2N1cyxcbiAgICAgICAgZGlzYWJsZUlucHV0UnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLmlucHV0LFxuICAgICAgICBkaXNhYmxlUGFzdGVSdWxlczogIXRoaXMuZW5hYmxlUnVsZXMucGFzdGUsXG4gICAgICAgIHBhcnNlT3B0aW9uczogdGhpcy5wYXJzZU9wdGlvbnNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB3aGl0ZXNwYWNlOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2hpdGVzcGFjZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdjb2xsYXBzZSdcbiAgICAgIC8vIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICdjb2xsYXBzZScsICdwcmVzZXJ2ZScsICdwcmVzZXJ2ZS1hbGwnXG4gICAgfSksXG5cbiAgICBlbmFibGVSdWxlczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VuYWJsZVJ1bGVzJywge1xuICAgICAgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlbmFibGVSdWxlcykge1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoZW5hYmxlUnVsZXMpXG4gICAgICAgICAgPyBlbmFibGVSdWxlc1xuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpbnB1dDogISFlbmFibGVSdWxlcyxcbiAgICAgICAgICAgICAgcGFzdGU6ICEhZW5hYmxlUnVsZXNcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVhZHlvbmx5OiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgYXV0b2ZvY3VzOiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgZW5hYmxlUnVsZXM6ICd1cGRhdGVFZGl0b3JPcHRpb25zJ1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlRGVib3VuY2VkID0gZGVib3VuY2UoZWRpdG9yID0+IHtcbiAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKClcbiAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICBvbkNoYW5nZSgpXG4gICAgfSwgMTAwKVxuXG4gICAgY29uc3Qgb25VcGRhdGUgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgc2V0VmFsdWVEZWJvdW5jZWQoZWRpdG9yKVxuICAgICAgdGhpcy5vbklucHV0KClcbiAgICB9XG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSwgZmFsc2UsIHRoaXMucGFyc2VPcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5lZGl0b3JPcHRpb25zLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uVXBkYXRlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5nZXRFeHRlbnNpb25zKCksXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlIHx8ICcnXG4gICAgfSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkRyYWdSZXNpemUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGdldFBvaW50ID0gKHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KSA9PiAoeyB4LCB5IH0pXG5cbiAgICAgIGxldCBwcmV2WSA9IGdldFBvaW50KGV2ZW50KS55XG4gICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuJHJlZnMuZWRpdG9yLiRlbCkuaGVpZ2h0KVxuXG4gICAgICBjb25zdCBtb3VzZW1vdmUgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHsgeSB9ID0gZ2V0UG9pbnQoZXZlbnQpXG4gICAgICAgIGhlaWdodCArPSB5IC0gcHJldllcbiAgICAgICAgcHJldlkgPSB5XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoaGVpZ2h0LCAwKX1weGBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIG1vdXNlbW92ZSxcblxuICAgICAgICBtb3VzZXVwKGV2ZW50KSB7XG4gICAgICAgICAgbW91c2Vtb3ZlKGV2ZW50KVxuICAgICAgICAgIGhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHVwZGF0ZUVkaXRvck9wdGlvbnMoKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRPcHRpb25zKHRoaXMuZWRpdG9yT3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgb25DbGlja0xpbmsoZWRpdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgaHJlZjoge1xuICAgICAgICAgICAgdHlwZTogJ3VybCcsXG4gICAgICAgICAgICBsYWJlbDogJ0xpbmsnLFxuICAgICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgbGFiZWw6ICdUaXRsZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHt9LFxuICAgICAgICAgIGFwcGx5OiB7IHR5cGU6ICdzdWJtaXQnIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgY2xpY2soeyBkaWFsb2dDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudC5yZXNvbHZlKG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGdldE1hcmtBdHRyaWJ1dGVzKHRoaXMuZWRpdG9yLnN0YXRlLCAnbGluaycpXG4gICAgICB9KVxuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IHsgaHJlZiwgdGl0bGUgfSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAvLyBTZWUgaWYgYGhyZWZgIGNhbiBiZSBwYXJzZWQgYXMgYSBVUkwsIGFuZCBpZiBub3QsXG4gICAgICAgICAgLy8gcHJlZml4IGl0IHdpdGggYSBkZWZhdWx0IHByb3RvY29sLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgVVJMKGhyZWYpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBocmVmID0gYGh0dHBzOi8vJHtocmVmfWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnNldExpbmsoeyBocmVmLCB0aXRsZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVuc2V0TGluaygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV4dGVuc2lvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtzID0ge30sXG4gICAgICAgIG5vZGVzID0ge30sXG4gICAgICAgIHRvb2xzID0ge31cbiAgICAgIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gRXNzZW50aWFsczpcbiAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFBhcmFncmFwaCwgLy8gYnV0dG9uIGNhbiBiZSBjb250cm9sbGVkLCBidXQgbm9kZSBuZWVkcyB0byBiZSBvbi5cblxuICAgICAgICAvLyBNYXJrczogYHNjaGVtYS5tYXJrc2BcbiAgICAgICAgbWFya3MuYm9sZCAmJiBCb2xkLFxuICAgICAgICBtYXJrcy5pdGFsaWMgJiYgSXRhbGljLFxuICAgICAgICBtYXJrcy51bmRlcmxpbmUgJiYgVW5kZXJsaW5lLFxuICAgICAgICBtYXJrcy5zdHJpa2UgJiYgU3RyaWtlLFxuICAgICAgICBtYXJrcy5zbWFsbCAmJiBTbWFsbCxcbiAgICAgICAgbWFya3MuY29kZSAmJiBDb2RlLFxuICAgICAgICBtYXJrcy5saW5rICYmIExpbmtXaXRoVGl0bGUsXG5cbiAgICAgICAgLy8gTm9kZXM6IGBzY2hlbWEubm9kZXNgXG4gICAgICAgIG5vZGVzLmJsb2NrcXVvdGUgJiYgQmxvY2txdW90ZSxcbiAgICAgICAgbm9kZXMuY29kZUJsb2NrICYmIENvZGVCbG9jayxcbiAgICAgICAgSGFyZEJyZWFrLCAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbHdheXMgb24/XG4gICAgICAgIG5vZGVzLmhlYWRpbmcgJiYgSGVhZGluZy5jb25maWd1cmUoeyBsZXZlbHM6IG5vZGVzLmhlYWRpbmcgfSksXG4gICAgICAgIG5vZGVzLmhvcml6b250YWxSdWxlICYmIEhvcml6b250YWxSdWxlLFxuICAgICAgICAobm9kZXMub3JkZXJlZExpc3QgfHwgbm9kZXMuYnVsbGV0TGlzdCkgJiYgTGlzdEl0ZW0sXG4gICAgICAgIG5vZGVzLmJ1bGxldExpc3QgJiYgQnVsbGV0TGlzdCxcbiAgICAgICAgbm9kZXMub3JkZXJlZExpc3QgJiYgT3JkZXJlZExpc3QsXG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9JdGVtLFxuICAgICAgICAvLyBub2Rlcy50b2RvTGlzdCAmJiBUb2RvTGlzdCxcblxuICAgICAgICAvLyBUb29sczogYHNjaGVtYS50b29sc2BcbiAgICAgICAgdG9vbHMuaGlzdG9yeSAmJiBIaXN0b3J5XG4gICAgICBdLmZpbHRlcihleHRlbnNpb24gPT4gISFleHRlbnNpb24pXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbnMoc2V0dGluZ3NOYW1lLCBkZXNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXVxuXG4gICAgICBjb25zdCBhZGRCdXR0b24gPSAoeyBuYW1lLCBpY29uLCBhdHRyaWJ1dGVzLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSkgPT4ge1xuICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBpc0FjdGl2ZTogKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaXNBY3RpdmUobmFtZSwgYXR0cmlidXRlcykgJiZcbiAgICAgICAgICAgIChpZ25vcmVBY3RpdmUgPT0gbnVsbCB8fCAhaWdub3JlQWN0aXZlKCkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgdG9nZ2xlJHtjYW1lbGl6ZShuYW1lLCB0cnVlKX1gXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IuY29tbWFuZHNba2V5XSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYXR0cmlidXRlcyA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKClba2V5XShhdHRyaWJ1dGVzKS5mb2N1cygpLnJ1bigpXG4gICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICA/IG9uQ2xpY2sodGhpcy5lZGl0b3IsIGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgOiBjb21tYW5kKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2NoZW1hW3NldHRpbmdzTmFtZV1cbiAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlc2NyaXB0aW9uXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdGlvbnMpKSB7XG4gICAgICAgICAgY29uc3Qgc2V0dGluZ05hbWUgPSBbJ3VuZG8nLCAncmVkbyddLmluY2x1ZGVzKGtleSkgPyAnaGlzdG9yeScgOiBrZXlcbiAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHVuZGVyc2NvcmUoa2V5KVxuICAgICAgICAgIGNvbnN0IGljb24gPSBoeXBoZW5hdGUoa2V5KVxuICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGUsIHZhbHVlcywgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWVzKSAmJiBpc0FycmF5KHNldHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IGhlYWRpbmcgbGV2ZWwgYXR0cnM6XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhZGRCdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGAke2ljb259LSR7dmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgW2F0dHJpYnV0ZV06IHZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRCdXR0b24oeyBuYW1lLCBpY29uLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuXG5jb25zdCBTbWFsbCA9IE1hcmsuY3JlYXRlKHtcbiAgbmFtZTogJ3NtYWxsJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3NtYWxsJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoKSB7XG4gICAgcmV0dXJuIFsnc21hbGwnLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTbWFsbDpcbiAgICAgICAgYXR0cmlidXRlcyA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgTGlua1dpdGhUaXRsZSA9IExpbmsuZXh0ZW5kKHtcbiAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgc2NoZW1hOiB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGhyZWY6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2EnLFxuICAgICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+ICh7XG4gICAgICAgICAgICBocmVmOiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpLFxuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKG5vZGUpIHtcbiAgICAgIHJldHVybiBbJ2EnLCBub2RlLmF0dHJzLCAwXVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1hcmt1cCB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1yZXNpemUge1xuICAgIEBleHRlbmQgJWljb24tcmVzaXplO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdW5zZXQ7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gIH1cblxuICAuUHJvc2VNaXJyb3Ige1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5cbiAgLmRpdG8tbWFya3VwLWVkaXRvciB7XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIC8vIE1vdmUgcGFkZGluZyBcImluc2lkZVwiIGVkaXRvciB0byBjb3JyZWN0bHkgcG9zaXRpb24gc2Nyb2xsYmFyXG4gICAgbWFyZ2luLXJpZ2h0OiAtJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIHBhZGRpbmctcmlnaHQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMtdG9vbGJhciB7XG4gICAgbWFyZ2luOiAkaW5wdXQtcGFkZGluZy12ZXIgMDtcbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMsXG4gIHAsXG4gIHVsLFxuICBvbCxcbiAgcHJlLFxuICBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDFyZW0gMDtcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG4gIH1cblxuICBoMSxcbiAgaDIsXG4gIGgzIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgfVxuXG4gIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICB9XG5cbiAgY29kZSB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICB9XG5cbiAgcHJlIHtcbiAgICBwYWRkaW5nOiAwLjdyZW0gMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcblxuICAgIGNvZGUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgcCBjb2RlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogMCAwLjNyZW07XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gIH1cblxuICBhIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgY29sb3I6IGJsdWU7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIH1cblxuICB1bCxcbiAgb2wge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIGxpIHtcbiAgICAmID4gcCxcbiAgICAmID4gb2wsXG4gICAgJiA+IHVsIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlIHtcbiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICRjb2xvci1saWdodGVyO1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG5cbiAgICBwIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbXVsdGlzZWxlY3QoXG4gIDpjbGFzcz1ge1xuICAgICdkaXRvLW11bHRpc2VsZWN0LXNpbmdsZSc6ICFtdWx0aXBsZSxcbiAgICAnZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlXG4gIH1gXG4pXG4gIFZ1ZU11bHRpc2VsZWN0KFxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgIDpjbGFzcz1cInsgJ211bHRpc2VsZWN0LS1zaG93LWhpZ2hsaWdodCc6IHNob3dIaWdobGlnaHQgfVwiXG4gICAgOnNob3dMYWJlbHM9XCJmYWxzZVwiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIHRhZ1BsYWNlaG9sZGVyPVwiUHJlc3MgZW50ZXIgdG8gYWRkIG5ldyB0YWdcIlxuICAgIDpvcHRpb25zPVwicG9wdWxhdGUgJiYgYWN0aXZlT3B0aW9ucyB8fCBbXVwiXG4gICAgOmN1c3RvbUxhYmVsPVwiZ2V0TGFiZWxGb3JPcHRpb25cIlxuICAgIDp0cmFja0J5PVwib3B0aW9uVmFsdWVcIlxuICAgIDpncm91cExhYmVsPVwiZ3JvdXBCeUxhYmVsXCJcbiAgICA6Z3JvdXBWYWx1ZXM9XCJncm91cEJ5T3B0aW9uc1wiXG4gICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgIDp0YWdnYWJsZT1cInRhZ2dhYmxlXCJcbiAgICA6c2VhcmNoYWJsZT1cInNlYXJjaGFibGVcIlxuICAgIDppbnRlcm5hbFNlYXJjaD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpwcmVzZXJ2ZVNlYXJjaD1cIiEhc2VhcmNoRmlsdGVyXCJcbiAgICA6Y2xlYXJPblNlbGVjdD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpjbG9zZU9uU2VsZWN0PVwiIXN0YXlPcGVuXCJcbiAgICA6bG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG9wZW49XCJvbk9wZW5cIlxuICAgIEBjbG9zZT1cIm9uQ2xvc2VcIlxuICAgIEB0YWc9XCJvbkFkZFRhZ1wiXG4gICAgQHNlYXJjaC1jaGFuZ2U9XCJvblNlYXJjaENoYW5nZVwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgdi1pZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIEBjbGljaz1cImNsZWFyXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcbmltcG9ydCBWdWVNdWx0aXNlbGVjdCBmcm9tICd2dWUtbXVsdGlzZWxlY3QnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaXNCb29sZWFuIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtdWx0aXNlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcbiAgY29tcG9uZW50czogeyBWdWVNdWx0aXNlbGVjdCB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICBzZWFyY2hlZE9wdGlvbnM6IG51bGwsXG4gICAgICBwb3B1bGF0ZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGVcbiAgICAgICAgICA/ICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gb3B0aW9uIGNhbm5vdCBiZSBmb3VuZCwgd2UgbWF5IGJlIGluIHRhZ2dhYmxlIG1vZGUgYW5kXG4gICAgICAgICAgICAgICAgLy8gY2FuIGFkZCBpdC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB8fCB0aGlzLmFkZFRhZ09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBvcHRpb25zIHRoYXQgd2UgY291bGRuJ3QgbWF0Y2guXG4gICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkaXNwbGF5IGFuIGVycm9yIGluc3RlYWQ/XG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRPcHRpb25cbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBvcHRpb25zIG9iamVjdCwgc2luY2UgdnVlLW11bHRpc2VsZWN0IGNhbid0IG1hcCB0aGF0XG4gICAgICAgIC8vIGl0c2VsZiB1bmZvcnR1bmF0ZWx5LiBgdHJhY2stYnlgIGlzIHVzZWQgZm9yIDprZXkgbWFwcGluZyBpdCBzZWVtcy5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKG9wdGlvbiB8fCBbXSkubWFwKHZhbHVlID0+IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpKVxuICAgICAgICAgIDogdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoZWRPcHRpb25zIHx8IHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzZWFyY2hhYmxlOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgdGFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCd0YWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc3RheU9wZW46IGdldFNjaGVtYUFjY2Vzc29yKCdzdGF5T3BlbicsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXIoKSB7XG4gICAgICBsZXQgeyBwbGFjZWhvbGRlciwgc2VhcmNoYWJsZSwgdGFnZ2FibGUgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAoaXNCb29sZWFuKHBsYWNlaG9sZGVyKSkge1xuICAgICAgICBwbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyID8gdW5kZWZpbmVkIDogbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzZWFyY2hhYmxlICYmIHRhZ2dhYmxlXG4gICAgICAgICAgPyBgU2VhcmNoIG9yIGFkZCBhICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgOiBzZWFyY2hhYmxlXG4gICAgICAgICAgICA/IGBTZWxlY3Qgb3Igc2VhcmNoICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICA6IHBsYWNlaG9sZGVyXG4gICAgfSxcblxuICAgIHNob3dIaWdobGlnaHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc01vdW50ZWQgJiYgdGhpcy4kcmVmcy5lbGVtZW50LnBvaW50ZXJEaXJ0eVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaXNNb3VudGVkID0gdHJ1ZVxuICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xuICAgICAgLy8gdnVlLW11bHRpc2VsZWN0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYXV0b2ZvY3VzIGF0dHJpYnV0ZS4gV2UgbmVlZCB0b1xuICAgICAgLy8gaGFuZGxlIGl0IGhlcmUuXG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFkZFRhZ09wdGlvbih0YWcpIHtcbiAgICAgIGlmICh0aGlzLnRhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uTGFiZWwsIG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICAgICAgb3B0aW9uTGFiZWwgJiYgb3B0aW9uVmFsdWVcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF06IHRhZyxcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZWZpbmUgYSBzaW1wbGUgc2NoZW1hIG9wdGlvbiB0byBjb252ZXJ0IHRoZSB0YWcgdmFsdWVcbiAgICAgICAgICAgICAgICAvLyB0byBzb21ldGhpbmcgZWxzZSwgZS5nLiBgdG9UYWc6IHRhZyA9PiB1bmRlcnNjb3JlKHRhZylgXG4gICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXTogdGFnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdGFnXG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIG9wdGlvblxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRyZWZzLmVsZW1lbnQuYWN0aXZhdGUoKVxuICAgIH0sXG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgZmlyZSBibHVyIGV2ZW50cyB3aGlsZSB0aGUgbXVsdGlzZWxlY3QgaXMgb3BlbiAoc2VlXG4gICAgICAvLyBiZWxvdyksIHdlIG5lZWQgdG8gZG8gaXQgaGVyZSwgd2hlbiBpdCdzIGFjdHVhbGx5IGNsb3NlZC5cbiAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICBpZiAoIXRoaXMuJHJlZnMuZWxlbWVudC5pc09wZW4pIHtcbiAgICAgICAgVHlwZU1peGluLm1ldGhvZHMub25CbHVyLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25BZGRUYWcodGFnKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmFkZFRhZ09wdGlvbih0YWcpXG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uU2VhcmNoQ2hhbmdlKHF1ZXJ5KSB7XG4gICAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIpIHtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgLy8gU2V0IGBzZWFyY2hlZE9wdGlvbnNgIHRvIGFuIGVtcHR5IGFycmF5LCBiZWZvcmUgaXQgd2lsbCBiZVxuICAgICAgICAgIC8vIHBvcHVsYXRlZCBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBhY3R1YWwgcmVzdWx0cy5cbiAgICAgICAgICB0aGlzLnNlYXJjaGVkT3B0aW9ucyA9IFtdXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBhd2FpdCB0aGlzLnJlc29sdmVEYXRhKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5zZWFyY2hGaWx0ZXIobmV3IERpdG9Db250ZXh0KHRoaXMsIHsgcXVlcnkgfSkpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFyIGBzZWFyY2hlZE9wdGlvbnNgIHdoZW4gdGhlIHF1ZXJ5IGlzIGNsZWFyZWQuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAndnVlLW11bHRpc2VsZWN0L2Rpc3QvdnVlLW11bHRpc2VsZWN0LmNzcyc7XG5cbiRzcGlubmVyLXdpZHRoOiAkc2VsZWN0LWFycm93LXdpZHRoO1xuJHRhZy1pY29uLXdpZHRoOiAxLjhlbTtcbiR0YWctbWFyZ2luOiAycHg7XG4kdGFnLXBhZGRpbmc6IDNweDtcbiR0YWctbGluZS1oZWlnaHQ6IDFlbTtcblxuLmRpdG8tbXVsdGlzZWxlY3Qge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJi5kaXRvLW11bHRpc2VsZWN0LXNpbmdsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogMTAwJTtcbiAgfVxuXG4gICYuZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogYXV0bztcbiAgfVxuXG4gICYuZGl0by1oYXMtZXJyb3JzIHtcbiAgICAmX190YWdzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbi1jbGVhciB7XG4gICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0IHtcbiAgICAkc2VsZjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiAkY29sb3ItYmxhY2s7XG5cbiAgICAmLS1hY3RpdmUge1xuICAgICAgI3skc2VsZn1fX3BsYWNlaG9sZGVyIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBkaXNwbGF5OiBub25lYCB0byBoaWRlIHBsYWNlLWhvbGRlciwgYXMgdGhlIGxheW91dCB3b3VsZFxuICAgICAgICAvLyBjb2xsYXBzZS5cbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19zaW5nbGUsXG4gICAgICAjeyRzZWxmfV9faW5wdXQge1xuICAgICAgICAvLyBTYWRseSwgdnVlLXNlbGVjdCBzZXRzIGBzdHlsZT1cIndpZHRoXCJgIGluIGFkZGl0aW9uIHRvIHVzaW5nIGNsYXNzZXNcbiAgICAgICAgLy8gc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgICAgd2lkdGg6IHZhcigtLWlucHV0LXdpZHRoKSAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICAgICAgbWFyZ2luOiAtMXB4IDAgMDtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICYjeyRzZWxmfS0tYWJvdmUge1xuICAgICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgfVxuXG4gICAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXItY29sb3I7XG4gICAgICAgICAgbWFyZ2luOiAwIDAgLTFweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFncyB7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBwYWRkaW5nOiAwICRzcGlubmVyLXdpZHRoIDAgMDtcbiAgICAgIC8vIFNvIHRhZ3MgY2FuIGZsb2F0IG9uIG11bHRpcGxlIGxpbmVzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zOlxuICAgICAgcGFkZGluZy1ib3R0b206ICR0YWctbWFyZ2luO1xuICAgIH1cblxuICAgICZfX3RhZyB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgIG1hcmdpbjogJHRhZy1tYXJnaW4gMCAwICR0YWctbWFyZ2luO1xuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZzogJHRhZy1wYWRkaW5nICR0YWctaWNvbi13aWR0aCAkdGFnLXBhZGRpbmcgMC44ZW07XG4gICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIGhlaWdodDogY2FsYygkaW5wdXQtaGVpZ2h0IC0gMiAqICR0YWctcGFkZGluZyk7XG4gICAgfVxuXG4gICAgJl9fdGFncy13cmFwIHtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgfVxuXG4gICAgJl9fc2luZ2xlLFxuICAgICZfX3BsYWNlaG9sZGVyLFxuICAgICZfX2lucHV0IHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1hcmdpbjogMCAwIDFweCAwO1xuICAgICAgLy8gU2FkbHksIHZ1ZS1zZWxlY3Qgc2V0cyBzdHlsZT1cInBhZGRpbmc6IC4uLjtcIiBpbiBhZGRpdGlvbiB0byB1c2luZ1xuICAgICAgLy8gY2xhc3Nlcywgc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nICFpbXBvcnRhbnQ7XG4gICAgICAvLyBTbyBpbnB1dCBjYW4gZmxvYXQgbmV4dCB0byB0YWdzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zIHdpdGhcbiAgICAgIC8vICZfX3RhZ3M6XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlcixcbiAgICAmX19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlciB7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIEVuZm9yY2UgYWN0dWFsIGxpbmUtaGVpZ2h0IGZvciBwb3NpdGlvbmluZy5cbiAgICAgICAgY29udGVudDogJ1xcMjAwYic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0LFxuICAgICZfX3NwaW5uZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIC8vICRib3JkZXItd2lkdGggdG8gcHJldmVudCBtYXNraW5nIGJvcmRlciB3aXRoICZfX3NwaW5uZXJcbiAgICAgIHRvcDogJGJvcmRlci13aWR0aDtcbiAgICAgIHJpZ2h0OiAkYm9yZGVyLXdpZHRoO1xuICAgICAgYm90dG9tOiAkYm9yZGVyLXdpZHRoO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKCRzZWxlY3QtYXJyb3ctd2lkdGggLyAyKTtcblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgICAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgICAgICByaWdodDogY2FsYygtMSAqICRzZWxlY3QtYXJyb3ctc2l6ZSAvIDIpO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3NwaW5uZXIge1xuICAgICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuXG4gICAgICAmOjpiZWZvcmUsXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGxvYWRpbmcgc3Bpbm5lclxuICAgICAgICBib3JkZXItd2lkdGg6IDNweDtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19vcHRpb24ge1xuICAgICAgJG9wdGlvbjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgICAgbWluLWhlaWdodDogdW5zZXQ7XG4gICAgICBoZWlnaHQ6IHVuc2V0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAvLyBJbnN0cnVjdGlvbiB0ZXh0IGZvciBvcHRpb25zXG4gICAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICAgICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBzaG93IHRoZSBoaWdobGlnaHQgb25jZSB0aGUgcHVsbGRvd24gaGFzIHJlY2VpdmVkIG1vdXNlIG9yXG4gICAgICAvLyBrZXlib2FyZCBpbnRlcmFjdGlvbiwgaW4gd2hpY2ggY2FzZSBgJi0tc2hvdy1oaWdobGlnaHRgIHdpbGwgYmUgc2V0LFxuICAgICAgLy8gd2hpY2ggaXMgY29udHJvbGxlZCBieSBgcG9pbnRlckRpcnR5YCBpbiB2dWUtbXVsdGlzZWxlY3QuXG4gICAgICAvLyBVbnRpbCB0aGVuLCBjbGVhciB0aGUgaGlnaGxpZ2h0IHN0eWxlLCBidXQgb25seSBpZiBpdCBpc24ndCBhbHNvXG4gICAgICAvLyBkaXNhYmxlZCBvciBzZWxlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0eWxlLlxuICAgICAgQGF0LXJvb3QgI3skc2VsZn06bm90KCN7JHNlbGZ9LS1zaG93LWhpZ2hsaWdodClcbiAgICAgICAgICAjeyRvcHRpb259Om5vdCgjeyRvcHRpb259LS1kaXNhYmxlZCk6bm90KCN7JG9wdGlvbn0tLXNlbGVjdGVkKSB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgICYtLWhpZ2hsaWdodCB7XG4gICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEBhdC1yb290ICN7JHNlbGZ9I3skc2VsZn0tLXNob3ctaGlnaGxpZ2h0ICN7bGFzdC1zZWxlY3RvcigmKX0ge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYtLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuXG4gICAgICAgICYjeyRvcHRpb259LS1oaWdobGlnaHQge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmLS1kaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFnIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgJl9fdGFnLWljb24ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICAgIHdpZHRoOiAkdGFnLWljb24td2lkdGg7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jbGVhcjtcblxuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3RhZ3MsXG4gICAgJl9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9PSBudWxsID8gdGhpcy52YWx1ZSA6ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdmFsdWUgIT09ICcnXG4gICAgICAgICAgICA/IHRoaXMuaXNJbnRlZ2VyXG4gICAgICAgICAgICAgID8gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlRmxvYXQodmFsdWUpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaXNJbnRlZ2VyKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHN0ZXBWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXAgPT0gbnVsbCAmJiAhdGhpcy5pc0ludGVnZXIgPyAnYW55JyA6IHRoaXMuc3RlcFxuICAgIH0sXG5cbiAgICBkZWNpbWFsczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlY2ltYWxzJywge1xuICAgICAgdHlwZTogTnVtYmVyXG4gICAgfSksXG5cbiAgICBzdGVwOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RlcCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChzdGVwKSB7XG4gICAgICAgIC8vIEZvciBpbnRlZ2Vycywgcm91bmQgdGhlIHN0ZXBzIHRvIHRoZSBuZXh0IGJpZ2dlciBpbnRlZ2VyIHZhbHVlOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgc3RlcCAhPSBudWxsID8gTWF0aC5jZWlsKHN0ZXApIDogc3RlcFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWluOiBnZXRTY2hlbWFBY2Nlc3NvcignbWluJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZ2V0KG1pbikge1xuICAgICAgICBtaW4gPVxuICAgICAgICAgIG1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3JhbmdlJywgeyB0eXBlOiBBcnJheSB9KT8uWzBdXG4gICAgICAgICAgICA6IG1pblxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgbWluICE9IG51bGwgPyBNYXRoLmZsb29yKG1pbikgOiBtaW5cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heDogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtYXgpIHtcbiAgICAgICAgbWF4ID1cbiAgICAgICAgICBtYXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlsxXVxuICAgICAgICAgICAgOiBtYXhcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1heCAhPSBudWxsID8gTWF0aC5jZWlsKG1heCkgOiBtYXhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHJhbmdlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmFuZ2UnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gYHRoaXMubWluYCwgYHRoaXMubWF4YCBhbHJlYWR5IHN1cHBvcnQgYHNjaGVtYS5yYW5nZWAsXG4gICAgICAgIC8vIHNvIHJlZGlyZWN0IHRoZXJlLlxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzXG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/IFttaW4sIG1heF0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG5cbiAgICAgIHNldChyYW5nZSkge1xuICAgICAgICAvLyBQcm92aWRlIGEgc2V0dGVyIHRoYXQgZGVsZWdhdGVzIHRvIGBbdGhpcy5taW4sIHRoaXMubWF4XWAsXG4gICAgICAgIC8vIHNpbmNlIHRob3NlIGFscmVhZHkgaGFuZGxlIGBzY2hlbWEucmFuZ2VgLlxuICAgICAgICBpZiAoaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICA7W3RoaXMubWluLCB0aGlzLm1heF0gPSByYW5nZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHt9XG4gICAgICBjb25zdCB7IHJhbmdlLCBtaW4sIG1heCwgZGVjaW1hbHMsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yYW5nZSA9IHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5taW4gPSBtaW5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5tYXggPSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY2ltYWxzICE9IG51bGwpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuZGVjaW1hbHMgPSBkZWNpbWFsc1xuICAgICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzID0gKGAke3N0ZXB9YC5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGhcbiAgICAgICAgaWYgKGRlY2ltYWxzID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5pbnRlZ2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludGVnZXIpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by1udW1iZXIoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6bWluPVwibWluXCJcbiAgOm1heD1cIm1heFwiXG4gIDpzdGVwPVwic3RlcFZhbHVlXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydudW1iZXInLCAnaW50ZWdlciddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpc0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdpbnRlZ2VyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLy8gT25seSBzaG93IHNwaW4gYnV0dG9ucyBpZiB0aGUgbnVtYmVyIGNvbXBvbmVudCBkZWZpbmVzIGEgc3RlcCBzaXplLlxuaW5wdXRbdHlwZT0nbnVtYmVyJ106bm90KFtzdGVwXSkge1xuICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAmOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW9iamVjdChcbiAgdi1pZj1cImlzUmVhZHlcIlxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cInNjaGVtYS5jbGFzc1wiXG4gIDpzdHlsZT1cInNjaGVtYS5zdHlsZVwiXG4pXG4gIC5kaXRvLW9iamVjdC1jb250ZW50KFxuICAgIHYtaWY9XCJvYmplY3REYXRhXCJcbiAgKVxuICAgIC8vLSBTdXBwb3J0IHRoZSBzYW1lIHJlbmRlcmluZyBvcHRpb25zIGFzIFR5cGVMaXN0OlxuICAgIERpdG9TY2hlbWFJbmxpbmVkKFxuICAgICAgdi1pZj1cImlzSW5saW5lZFwiXG4gICAgICA6bGFiZWw9XCJvYmplY3RMYWJlbFwiXG4gICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBvYmplY3REYXRhLCBjb250ZXh0KVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICApXG4gICAgY29tcG9uZW50KFxuICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgIClcbiAgICBzcGFuKFxuICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgIHYtaHRtbD1cInJlbmRlcihnZXRDb250ZXh0KCkpXCJcbiAgICApXG4gICAgc3BhbihcbiAgICAgIHYtZWxzZVxuICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgb2JqZWN0RGF0YSlcIlxuICAgIClcbiAgRGl0b0VkaXRCdXR0b25zKFxuICAgIDpjcmVhdGFibGU9XCJjcmVhdGFibGVcIlxuICAgIDpkZWxldGFibGU9XCJvYmplY3REYXRhICYmIGRlbGV0YWJsZVwiXG4gICAgOmVkaXRhYmxlPVwib2JqZWN0RGF0YSAmJiBlZGl0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6ZWRpdFBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgIDpwYXRoPVwicGF0aFwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0ob2JqZWN0RGF0YSlcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7IHJlc29sdmVTY2hlbWFDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignb2JqZWN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbl0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgIC8vIE5vIG5lZWQgZm9yIHRyYW5zZm9ybWF0aW9uIGhlcmUuIFNlZSBUeXBlVHJlZUxpc3QgZm9yIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9iamVjdExhYmVsKCkge1xuICAgICAgLy8gT25seSBzaG93IGEgbGFiZWwgaWYgdGhlIG9iamVjdCBpcyBjb2xsYXBzaWJsZS5cbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICAgID8gdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIHRoaXMub2JqZWN0RGF0YSwgeyBhc09iamVjdDogdHJ1ZSB9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgZGF0YTogdGhpcy5vYmplY3REYXRhIH0pXG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1vYmplY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQge1xuICAgIGZsZXg6IDAgMSAxMDAlO1xuICB9XG5cbiAgPiAuZGl0by1idXR0b25zIHtcbiAgICBmbGV4OiAxIDAgMCU7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3BhbmVsJywge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiBmYWxzZSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuICBvbWl0UGFkZGluZzogdHJ1ZSxcblxuICBnZXRQYW5lbFNjaGVtYShzY2hlbWEpIHtcbiAgICAvLyBGb3IgYSBUeXBlUGFuZWwsIHRoZSBjb21wb25lbnQgc2NoZW1hIGlzIGFsc28gdGhlIHBhbmVsIHNjaGVtYSwgYnV0XG4gICAgLy8gcmVtb3ZlIHRoZSBhZGRlZCBuYW1lLCBzbyBpdCBkb2Vzbid0IGdldCBhcHBlbmRlZCB0d2ljZSB0byBkYXRhLXBhdGguXG4gICAgY29uc3QgeyBuYW1lLCAuLi5wYW5lbCB9ID0gc2NoZW1hXG4gICAgcmV0dXJuIHBhbmVsXG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5wcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dmFsdWU9XCJwcm9ncmVzc1ZhbHVlXCJcbiAgOm1heD1cInByb2dyZXNzTWF4XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdwcm9ncmVzcycsIHtcbiAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICBjb21wdXRlZDoge1xuICAgIHByb2dyZXNzVmFsdWUoKSB7XG4gICAgICBsZXQgeyB2YWx1ZSwgcmFuZ2UsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICB2YWx1ZSAtPSByYW5nZVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gc3RlcCkgKiBzdGVwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJydcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBwcm9ncmVzc01heCgpIHtcbiAgICAgIGNvbnN0IHsgcmFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiByYW5nZSA/IHJhbmdlWzFdIC0gcmFuZ2VbMF0gOiBudWxsXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1yYWRpby1idXR0b25zKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1yYWRpby1idXR0b24oXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdyYWRpbycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXJhZGlvLWJ1dHRvbnMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNlY3Rpb24oOmNsYXNzPVwieyAnZGl0by1zZWN0aW9uLWxhYmVsbGVkJzogISFzY2hlbWEubGFiZWwgfVwiKVxuICBEaXRvUGFuZS5kaXRvLXNlY3Rpb24tcGFuZShcbiAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0SXRlbUZvcm1TY2hlbWEsIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlY3Rpb24nLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhc2NoZW1hLm5lc3RlZCAmJiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuICBkZWZhdWx0TmVzdGVkOiBmYWxzZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXN0ZWQgPyB0aGlzLnZhbHVlIDogdGhpcy5kYXRhXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtRm9ybVNjaGVtYVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgICAvLyBQcm9jZXNzIHNlY3Rpb24gY29tcG9uZW50cyBzbyB0aGVpciBmb3JtcyBnZXQgcmVzb2x2ZWQgdG9vLlxuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgc2NoZW1hLCByb3V0ZXMsIGxldmVsKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2VjdGlvbiB7XG4gICYuZGl0by1zZWN0aW9uLWxhYmVsbGVkIHtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBOZXN0aW5nIGlzIG5lZWRlZCB0byBtYWtlIGFuIGFycm93IGFwcGVhciBvdmVyIHRoZSBzZWxlY3QgaXRlbTpcbi5kaXRvLXNlbGVjdFxuICBzZWxlY3QoXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZFZhbHVlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICBAbW91c2Vkb3duPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgICBAZm9jdXM9XCJwb3B1bGF0ZSA9IHRydWVcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwicG9wdWxhdGVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgICAgIClcbiAgICAgICAgb3B0Z3JvdXAoXG4gICAgICAgICAgdi1pZj1cImdyb3VwQnlcIlxuICAgICAgICAgIDpsYWJlbD1cIm9wdGlvbltncm91cEJ5TGFiZWxdXCJcbiAgICAgICAgKVxuICAgICAgICAgIG9wdGlvbihcbiAgICAgICAgICAgIHYtZm9yPVwib3B0IGluIG9wdGlvbltncm91cEJ5T3B0aW9uc11cIlxuICAgICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0KVwiXG4gICAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHQpIH19XG4gICAgICAgIG9wdGlvbihcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWVsc2UtaWY9XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgKVxuICAgICAgb3B0aW9uKDp2YWx1ZT1cInNlbGVjdGVkVmFsdWVcIikge3sgZ2V0TGFiZWxGb3JPcHRpb24oc2VsZWN0ZWRPcHRpb24pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2VsZWN0Jywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIERpc2FibGUgbGF6eS1wb3B1bGF0aW9uIGZvciBub3cuXG4gICAgICAvLyBUT0RPOiBTZXQgdG8gYGZhbHNlYCBPbmNlIGxpbmV0byBlMmUgdGVzdHMgYWRkcmVzcyB0aGVpciBpc3N1ZXMuXG4gICAgICBwb3B1bGF0ZTogdHJ1ZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIFRPRE86IE1vdmUgdG8gZGl0by11aVxuJHNlbGVjdC1hcnJvdy1yaWdodDogY2FsYygoJHNlbGVjdC1hcnJvdy13aWR0aCAtICRzZWxlY3QtYXJyb3ctc2l6ZSkgLyAyKTtcblxuLmRpdG8tc2VsZWN0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgc2VsZWN0IHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkc2VsZWN0LWFycm93LXdpZHRoO1xuICB9XG4gIC8vIEhhbmRsZSAuZGl0by13aWR0aC1maWxsIHNlcGFyYXRlbHkgZHVlIHRvIHJlcXVpcmVkIG5lc3Rpbmcgb2Ygc2VsZWN0OlxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgcmlnaHQ6IGNhbGMoI3skc2VsZWN0LWFycm93LXJpZ2h0fSArICN7JGJvcmRlci13aWR0aH0pO1xuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNsaWRlclxuICBpbnB1dC5kaXRvLXJhbmdlKFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbiAgSW5wdXRGaWVsZC5kaXRvLW51bWJlcihcbiAgICB2LWlmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgICB0eXBlPVwibnVtYmVyXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzbGlkZXInLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRgP1xuICAgIGlucHV0OiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zbGlkZXIge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXJhbmdlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpO1xuICB9XG5cbiAgLmRpdG8tbnVtYmVyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblN3aXRjaEJ1dHRvbi5kaXRvLXN3aXRjaChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgOmxhYmVscz1cImxhYmVsc1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFN3aXRjaEJ1dHRvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3N3aXRjaCcsIHtcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG5cbiAgY29tcG9uZW50czoge1xuICAgIFN3aXRjaEJ1dHRvblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxhYmVsc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by10ZXh0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIDp0eXBlPVwiaW5wdXRUeXBlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5jb25zdCBtYXNrZWRQYXNzd29yZCA9ICcqKioqKioqKioqKioqKioqJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgW1xuICAgICd0ZXh0JyxcbiAgICAnZW1haWwnLFxuICAgICd1cmwnLFxuICAgICdob3N0bmFtZScsXG4gICAgJ2RvbWFpbicsXG4gICAgJ3RlbCcsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnY3JlZGl0Y2FyZCdcbiAgXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcbiAgICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiBzY2hlbWEudHlwZSA9PT0gJ3Bhc3N3b3JkJyxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpbnB1dFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3JlZGl0Y2FyZDogJ3RleHQnLFxuICAgICAgICAgICAgaG9zdG5hbWU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRvbWFpbjogJ3RleHQnXG4gICAgICAgICAgfVt0aGlzLnR5cGVdIHx8XG4gICAgICAgICAgdGhpcy50eXBlXG4gICAgICAgIClcbiAgICAgIH0sXG5cbiAgICAgIGlucHV0VmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnR5cGUgPT09ICdwYXNzd29yZCcgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIXRoaXMuZm9jdXNlZFxuICAgICAgICAgIClcbiAgICAgICAgICAgID8gbWFza2VkUGFzc3dvcmRcbiAgICAgICAgICAgIDogdGhpcy52YWx1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgICBjb25zdCBydWxlID0ge1xuICAgICAgICAgIGVtYWlsOiAnZW1haWwnLFxuICAgICAgICAgIHVybDogJ3VybCcsXG4gICAgICAgICAgaG9zdG5hbWU6ICdob3N0bmFtZScsXG4gICAgICAgICAgZG9tYWluOiAnZG9tYWluJyxcbiAgICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICBjcmVkaXRjYXJkOiAnY3JlZGl0Y2FyZCdcbiAgICAgICAgfVt0aGlzLnR5cGVdXG4gICAgICAgIHJldHVybiBydWxlID8geyBbcnVsZV06IHRydWUgfSA6IHt9XG4gICAgICB9XG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZXh0YXJlYS5kaXRvLXRleHRhcmVhLmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6cm93cz1cImxpbmVzXCJcbiAgOmNsYXNzPVwieyAnZGl0by1yZXNpemFibGUnOiByZXNpemFibGUgfVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd0ZXh0YXJlYScsIHtcbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIHRleHRGaWVsZDogdHJ1ZSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGluZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubGluZXMgfHwgNFxuICAgIH0sXG5cbiAgICByZXNpemFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXNpemFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGV4dGFyZWEge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcmVzaXplOiBub25lO1xuICBtaW4taGVpZ2h0OiBjYWxjKDFlbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSArICN7MiAqICRpbnB1dC1wYWRkaW5nLXZlcn0pO1xuXG4gICYuZGl0by1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogdmVydGljYWw7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJlZS1saXN0XG4gIERpdG9TY29wZXMoXG4gICAgdi1pZj1cInNjb3Blc1wiXG4gICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgIDpzY29wZXM9XCJzY29wZXNcIlxuICApXG4gIC5kaXRvLXRyZWUtcGFuZWxcbiAgICBEaXRvVHJlZUl0ZW0oXG4gICAgICA6c2NoZW1hPVwidHJlZVNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJ0cmVlRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJ0cmVlRGF0YVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDpvcGVuPVwidHJ1ZVwiXG4gICAgKVxuICAgIC5kaXRvLXRyZWUtZm9ybS1jb250YWluZXIoXG4gICAgICB2LWlmPVwiaGFzRWRpdGFibGVGb3Jtc1wiXG4gICAgKVxuICAgICAgLy8tIEluY2x1ZGUgYSByb3V0ZXItdmlldyBmb3IgdGhlIG9wdGlvbmFsIERpdG9Gb3JtSW5saW5lZFxuICAgICAgUm91dGVyVmlld1xuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQge1xuICBoYXNGb3JtU2NoZW1hLFxuICBnZXRGb3JtU2NoZW1hcyxcbiAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWyd0cmVlLWxpc3QnLCAndHJlZS1vYmplY3QnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW1NvdXJjZU1peGluXSxcblxuICAgIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICAgIHByb3ZpZGUoKSB7XG4gICAgICByZXR1cm4geyBjb250YWluZXI6IHRoaXMgfVxuICAgIH0sXG5cbiAgICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlID09PSAndHJlZS1vYmplY3QnID8gJ29iamVjdCcgOiAnbGlzdCdcbiAgICB9LFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5wYXRoYDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGF0aFxuICAgICAgfSxcblxuICAgICAgZWRpdFBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5lZGl0UGF0aGA6XG4gICAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoLnNsaWNlKHRoaXMucGF0aD8ubGVuZ3RoKVxuICAgICAgfSxcblxuICAgICAgdHJlZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8geyBbdGhpcy5uYW1lXTogdGhpcy52YWx1ZSB9XG4gICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICB9LFxuXG4gICAgICB0cmVlRGF0YVBhdGgoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBgbmFtZWAgZnJvbSBgZGF0YVBhdGhgLCBhcyBpdCBpcyBhZGRlZFxuICAgICAgICAvLyB0byBgdHJlZURhdGFgIGFuZCBgdHJlZVNjaGVtYWBcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB0aGlzLmRhdGFQYXRoLnNsaWNlKDAsIHRoaXMuZGF0YVBhdGgubGVuZ3RoIC0gdGhpcy5uYW1lLmxlbmd0aClcbiAgICAgICAgICA6IHRoaXMuZGF0YVBhdGhcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjaGlsZHJlbjoge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnNjaGVtYVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB0aGlzLnNjaGVtYVxuICAgICAgfSxcblxuICAgICAgaGFzRWRpdGFibGVGb3JtcygpIHtcbiAgICAgICAgY29uc3QgaGFzRWRpdGFibGVGb3JtcyA9IHNjaGVtYSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSAmJiAoXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2VkaXRhYmxlJywge1xuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2NoZW1hXG4gICAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICAgIHNjaGVtYS5jaGlsZHJlbiAmJlxuICAgICAgICAgICAgICBoYXNFZGl0YWJsZUZvcm1zKHNjaGVtYS5jaGlsZHJlbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0VkaXRhYmxlRm9ybXModGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWwsXG4gICAgICBuZXN0ZWQgPSB0cnVlLFxuICAgICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgICAgcHJvY2VzcyA9IG51bGxcbiAgICApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLnByb3BlcnRpZXMpLFxuICAgICAgICBTb3VyY2VNaXhpbi5wcm9jZXNzU2NoZW1hKFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgbmVzdGVkLFxuICAgICAgICAgIGZsYXR0ZW4sXG4gICAgICAgICAgLy8gUGFzcyBwcm9jZXNzKCkgdG8gYWRkIG1vcmUgcm91dGVzIHRvIGNoaWxkUm91dGVzOlxuICAgICAgICAgIChjaGlsZFJvdXRlcywgbGV2ZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCBgdHlwZWAgdG8gdGhlIG5lc3RlZCB0cmVlIGxpc3QuXG4gICAgICAgICAgICAgIGNoaWxkcmVuLnR5cGUgPSAndHJlZS1saXN0J1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjYWxsIGBwcm9jZXNzU2NoZW1hKClgIGZvciB0aGUgbmVzdGVkIHRyZWUgbGlzdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZFJvdXRlcyxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgICAgICAgdHJ1ZSwgLy8gUGFzcyBgdHJ1ZWAgZm9yIGBmbGF0dGVuYCBpbiB0cmVlIGxpc3RzLlxuICAgICAgICAgICAgICAgIHByb2Nlc3NcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICB9LFxuXG4gICAgZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nKHNjaGVtYSwgY29udGV4dCkge1xuICAgICAgLy8gQ29udmVydCBuZXN0ZWQgY2hpbGRyZW4gc2NoZW1hIHRvIHN0YW5kLWFsb25lIHNjaGVtYSBjb21wb25lbnQsXG4gICAgICAvLyBwcmVzZW50IGluIGVhY2ggb2YgdGhlIGZvcm1zLCBhcyByZXF1aXJlZCBieSBgcHJvY2Vzc1NjaGVtYURhdGEoKWBcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgcmV0dXJuIGdldEZvcm1TY2hlbWFzKFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgPyBmb3JtID0+ICh7XG4gICAgICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAuLi5mb3JtLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgW2NoaWxkcmVuLm5hbWVdOiBjaGlsZHJlblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgKVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdHJlZS1saXN0IHtcbiAgQGV4dGVuZCAlZmllbGQ7XG5cbiAgLmRpdG8tdHJlZS1wYW5lbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgICA+IC5kaXRvLXRyZWUtaXRlbSB7XG4gICAgICBmbGV4OiAxIDEgMjUlO1xuICAgIH1cblxuICAgID4gLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lciB7XG4gICAgICBmbGV4OiAwIDEgNzUlO1xuICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgICBib3JkZXItbGVmdDogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtIDE7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAxO1xuICAgICAgbWFyZ2luOiAoLSRpbnB1dC1wYWRkaW5nLXZlcikgKC0kaW5wdXQtcGFkZGluZy1ob3IpO1xuICAgICAgbWFyZ2luLWxlZnQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBmaWxlc2l6ZSB9IGZyb20gJ2ZpbGVzaXplJ1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoc2l6ZSkge1xuICByZXR1cm4gZmlsZXNpemUoc2l6ZSwgeyBiYXNlOiAxMCB9KVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXVwbG9hZFxuICB0YWJsZS5kaXRvLXRhYmxlLmRpdG8tdGFibGUtc2VwYXJhdG9ycy5kaXRvLXRhYmxlLWJhY2tncm91bmRcbiAgICAvLy0gU3R5bGluZyBjb21lcyBmcm9tIERpdG9UYWJsZUhlYWRcbiAgICB0aGVhZC5kaXRvLXRhYmxlLWhlYWRcbiAgICAgIHRyXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBOYW1lXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTaXplXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTdGF0dXNcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuXG4gICAgRGl0b0RyYWdnYWJsZShcbiAgICAgIHYtbW9kZWw9XCJmaWxlc1wiXG4gICAgICB0YWc9XCJ0Ym9keVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhmYWxzZSlcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgKVxuICAgICAgdHIoXG4gICAgICAgIHYtZm9yPVwiKGZpbGUsIGluZGV4KSBpbiBmaWxlc1wiXG4gICAgICAgIDprZXk9XCJmaWxlLmtleVwiXG4gICAgICApXG4gICAgICAgIHRkKFxuICAgICAgICAgIHYtaHRtbD1cInJlbmRlckZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgKVxuICAgICAgICB0ZCB7eyBmb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpIH19XG4gICAgICAgIHRkXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWQuZXJyb3JcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IEVycm9yOiB7eyBmaWxlLnVwbG9hZC5lcnJvciB9fVxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImZpbGUudXBsb2FkLmFjdGl2ZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkaW5nLi4uXG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZmlsZS51cGxvYWQuc3VjY2Vzc1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkZWRcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHwgU3RvcmVkXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnNcbiAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgICAgICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgICAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgdi1pZj1cImRlbGV0YWJsZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkZWxldGVGaWxlKGZpbGUsIGluZGV4KVwiXG4gICAgICAgICAgICApXG4gICAgdGZvb3RcbiAgICAgIHRyXG4gICAgICAgIHRkKDpjb2xzcGFuPVwiNFwiKVxuICAgICAgICAgIC5kaXRvLXVwbG9hZC1mb290ZXJcbiAgICAgICAgICAgIHByb2dyZXNzLmRpdG8tcHJvZ3Jlc3MoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgIDp2YWx1ZT1cInVwbG9hZFByb2dyZXNzXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwidXBsb2FkLmFjdGl2ZSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgKSBDYW5jZWwgQWxsXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJpc1VwbG9hZFJlYWR5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cInVwbG9hZC5hY3RpdmUgPSB0cnVlXCJcbiAgICAgICAgICAgICAgKSBVcGxvYWQgQWxsXG4gICAgICAgICAgICAgIFZ1ZVVwbG9hZC5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1hZGQtdXBsb2FkKFxuICAgICAgICAgICAgICAgIHJlZj1cInVwbG9hZFwiXG4gICAgICAgICAgICAgICAgdi1tb2RlbD1cInVwbG9hZHNcIlxuICAgICAgICAgICAgICAgIDppbnB1dElkPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpuYW1lPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA6cG9zdEFjdGlvbj1cInVwbG9hZFBhdGhcIlxuICAgICAgICAgICAgICAgIDpleHRlbnNpb25zPVwiZXh0ZW5zaW9uc1wiXG4gICAgICAgICAgICAgICAgOmFjY2VwdD1cImFjY2VwdFwiXG4gICAgICAgICAgICAgICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIDpzaXplPVwibWF4U2l6ZVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJVcGxvYWQgRmlsZXNcIlxuICAgICAgICAgICAgICAgIEBpbnB1dC1maWx0ZXI9XCJpbnB1dEZpbHRlclwiXG4gICAgICAgICAgICAgICAgQGlucHV0LWZpbGU9XCJpbnB1dEZpbGVcIlxuICAgICAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvcnRhYmxlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMnXG5pbXBvcnQgcGFyc2VGaWxlU2l6ZSBmcm9tICdmaWxlc2l6ZS1wYXJzZXInXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZm9ybWF0RmlsZVNpemUgfSBmcm9tICcuLi91dGlscy91bml0cy5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGVzY2FwZUh0bWwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFZ1ZVVwbG9hZCBmcm9tICd2dWUtdXBsb2FkLWNvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd1cGxvYWQnLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFZ1ZVVwbG9hZCB9LFxuXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cGxvYWRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHVwbG9hZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLnVwbG9hZFxuICAgIH0sXG5cbiAgICBmaWxlcygpIHtcbiAgICAgIHJldHVybiBhc0ZpbGVzKHRoaXMudmFsdWUpXG4gICAgfSxcblxuICAgIG11bHRpcGxlOiBnZXRTY2hlbWFBY2Nlc3NvcignbXVsdGlwbGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAvLyBObyBjYWxsYmFjayBhcyBpdCdzIHVzZWQgaW4gYHByb2Nlc3NWYWx1ZSgpYFxuICAgICAgY2FsbGJhY2s6IGZhbHNlXG4gICAgfSksXG5cbiAgICBleHRlbnNpb25zOiBnZXRTY2hlbWFBY2Nlc3NvcignZXh0ZW5zaW9ucycsIHtcbiAgICAgIHR5cGU6IFtBcnJheSwgU3RyaW5nLCBSZWdFeHBdXG4gICAgfSksXG5cbiAgICBhY2NlcHQ6IGdldFNjaGVtYUFjY2Vzc29yKCdhY2NlcHQnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldChhY2NlcHQpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkoYWNjZXB0KSA/IGFjY2VwdC5qb2luKCcsJykgOiBhY2NlcHRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heFNpemU6IGdldFNjaGVtYUFjY2Vzc29yKCdtYXhTaXplJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGdldChtYXhTaXplKSB7XG4gICAgICAgIHJldHVybiBtYXhTaXplID8gcGFyc2VGaWxlU2l6ZShtYXhTaXplKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZHJhZ2dhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZHJhZ2dhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGRyYWdnYWJsZSkge1xuICAgICAgICByZXR1cm4gZHJhZ2dhYmxlICYmIHRoaXMuZmlsZXMubGVuZ3RoID4gMVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBpc1VwbG9hZFJlYWR5KCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy51cGxvYWRzLmxlbmd0aCAmJlxuICAgICAgICAhKHRoaXMudXBsb2FkLmFjdGl2ZSB8fCB0aGlzLnVwbG9hZC51cGxvYWRlZClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNVcGxvYWRBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRzLmxlbmd0aCAmJiB0aGlzLnVwbG9hZC5hY3RpdmVcbiAgICB9LFxuXG4gICAgdXBsb2FkUHJvZ3Jlc3MoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnVwbG9hZHMucmVkdWNlKCh0b3RhbCwgZmlsZSkgPT4gdG90YWwgKyBmaWxlLnByb2dyZXNzLCAwKSAvXG4gICAgICAgIHRoaXMudXBsb2Fkcy5sZW5ndGhcbiAgICAgIClcbiAgICB9LFxuXG4gICAgdXBsb2FkUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVXJsKHtcbiAgICAgICAgdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgIHBhdGg6IHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgodGhpcy5kYXRhUGF0aClcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb3JtYXRGaWxlU2l6ZSxcblxuICAgIHJlbmRlckZpbGUoZmlsZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IHsgcmVuZGVyIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIHJlbmRlclxuICAgICAgICA/IHJlbmRlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBmaWxlLFxuICAgICAgICAgICAgICBkYXRhOiB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIDogZXNjYXBlSHRtbChmaWxlLm5hbWUpXG4gICAgfSxcblxuICAgIGRlbGV0ZUZpbGUoZmlsZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gZmlsZVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZpbGUgJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMucmVtb3ZlfSAke25hbWV9P2BcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZS51cGxvYWQpIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZC5yZW1vdmUoZmlsZS51cGxvYWQpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgdGl0bGU6ICdTdWNjZXNzZnVsbHkgUmVtb3ZlZCcsXG4gICAgICAgICAgdGV4dDogYCR7bmFtZX0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpbGVJbmRleChmaWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbHVlXG4gICAgICAgID8gdGhpcy52YWx1ZS5maW5kSW5kZXgoaXQgPT4gaXQuaWQgPT09IGZpbGUuaWQpXG4gICAgICAgIDogLTFcbiAgICB9LFxuXG4gICAgYWRkRmlsZShmaWxlKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUucHVzaChmaWxlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBbZmlsZV1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZpbGVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVwbGFjZUZpbGUoZmlsZSwgbmV3RmlsZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEZpbGVJbmRleChmaWxlKVxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlmIChuZXdGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlW2luZGV4XSA9IG5ld0ZpbGVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3RmlsZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW1vdmVGaWxlKGZpbGUpIHtcbiAgICAgIHRoaXMucmVwbGFjZUZpbGUoZmlsZSwgbnVsbClcbiAgICB9LFxuXG4gICAgaW5wdXRGaWxlKG5ld0ZpbGUsIG9sZEZpbGUpIHtcbiAgICAgIGlmIChuZXdGaWxlICYmICFvbGRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHsgaWQsIG5hbWUsIHNpemUgfSA9IG5ld0ZpbGVcbiAgICAgICAgdGhpcy5hZGRGaWxlKHsgaWQsIG5hbWUsIHNpemUsIHVwbG9hZDogbmV3RmlsZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG5ld0ZpbGUgJiYgb2xkRmlsZSkge1xuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MsIGVycm9yIH0gPSBuZXdGaWxlXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ld0ZpbGUucmVzcG9uc2VbMF1cbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgZmlsZS51cGxvYWQgPSBuZXdGaWxlXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSB1cGxvYWQgZmlsZSBvYmplY3Qgd2l0aCB0aGUgZmlsZSBvYmplY3QgcmVjZWl2ZWRcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHVwbG9hZCByZXNwb25zZS5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUZpbGUobmV3RmlsZSwgZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWJvcnQ6ICdVcGxvYWQgYWJvcnRlZCcsXG4gICAgICAgICAgICAgIGRlbmllZDogJ1VwbG9hZCBkZW5pZWQnLFxuICAgICAgICAgICAgICBleHRlbnNpb246IGBVbnN1cHBvcnRlZCBmaWxlLXR5cGU6ICR7bmV3RmlsZS5uYW1lfWAsXG4gICAgICAgICAgICAgIG5ldHdvcms6ICdOZXR3b3JrIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB1cGxvYWQnLFxuICAgICAgICAgICAgICBzZXJ2ZXI6ICdTZXJ2ZXIgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHVwbG9hZCcsXG4gICAgICAgICAgICAgIHNpemU6IGBGaWxlIGlzIHRvbyBsYXJnZTogJHtmb3JtYXRGaWxlU2l6ZShuZXdGaWxlLnNpemUpfWAsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6ICdUaW1lb3V0IG9jY3VycmVkIGR1cmluZyB1cGxvYWQnXG4gICAgICAgICAgICB9W2Vycm9yXSB8fFxuICAgICAgICAgICAgYFVua25vd24gRmlsZSBVcGxvYWQgRXJyb3I6ICcke2Vycm9yfSdgXG4gICAgICAgICAgKVxuICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICB0aXRsZTogJ0ZpbGUgVXBsb2FkIEVycm9yJyxcbiAgICAgICAgICAgIHRleHRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMucmVtb3ZlRmlsZShuZXdGaWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGlucHV0RmlsdGVyKG5ld0ZpbGUgLyosIG9sZEZpbGUsIHByZXZlbnQgKi8pIHtcbiAgICAgIGNvbnN0IHhociA9IG5ld0ZpbGU/LnhoclxuICAgICAgaWYgKHRoaXMuYXBpLmNvcnM/LmNyZWRlbnRpYWxzICYmIHhociAmJiAheGhyLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgIC8vIEZpbHRlciBvdXQgYWxsIG5ld2x5IGFkZGVkIGZpbGVzIHRoYXQgd2VyZW4ndCBhY3R1YWxseSB1cGxvYWRlZC5cbiAgICBjb25zdCBmaWxlcyA9IGFzRmlsZXModmFsdWUpXG4gICAgICAubWFwKCh7IHVwbG9hZCwgLi4uZmlsZSB9KSA9PiAoIXVwbG9hZCB8fCB1cGxvYWQuc3VjY2VzcyA/IGZpbGUgOiBudWxsKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiBmaWxlKVxuICAgIHJldHVybiBzY2hlbWEubXVsdGlwbGUgPyBmaWxlcyA6IGZpbGVzWzBdIHx8IG51bGxcbiAgfVxufSlcblxuZnVuY3Rpb24gYXNGaWxlcyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyBhc0FycmF5KHZhbHVlKSA6IFtdXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by11cGxvYWQge1xuICAuZGl0by10YWJsZSB7XG4gICAgdHIge1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tYWRkLXVwbG9hZCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gKiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdXBsb2FkLWZvb3RlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAuZGl0by1wcm9ncmVzcyB7XG4gICAgICBmbGV4OiBhdXRvO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImNvbnN0IGxvZ2dlZERlcHJlY2F0aW9ucyA9IG5ldyBTZXQoKVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlKG1lc3NhZ2UpIHtcbiAgLy8gT25seSBsb2cgZGVwcmVjYXRpb24gbWVzc2FnZXMgb25jZS5cbiAgaWYgKCFsb2dnZWREZXByZWNhdGlvbnMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgbG9nZ2VkRGVwcmVjYXRpb25zLmFkZChtZXNzYWdlKVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBbXG4gICdjcmVhdGUnLCAnY3JlYXRlZCcsXG4gICdzYXZlJywgJ3NhdmVkJyxcbiAgJ3N1Ym1pdCcsICdzdWJtaXR0ZWQnLFxuICAnZGVsZXRlJywgJ2RlbGV0ZWQnLFxuICAnZWRpdCcsICdlZGl0ZWQnLFxuICAnY2xvc2UnLCAnY2xvc2VkJyxcbiAgJ2NhbmNlbCcsICdjYW5jZWxsZWQnLFxuICAnZHJhZycsICdkcmFnZ2VkJ1xuXS5yZWR1Y2UoKHZlcmJzLCB2ZXJiKSA9PiB7XG4gIHZlcmJzW3ZlcmJdID0gdmVyYlxuICByZXR1cm4gdmVyYnNcbn0sIHt9KVxuIiwiaW1wb3J0IHsgY3JlYXRlQXBwLCBoIGFzIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXIsIGNyZWF0ZVdlYkhpc3RvcnkgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IFZ1ZU5vdGlmaWNhdGlvbnMgZnJvbSAnQGt5dmcvdnVlMy1ub3RpZmljYXRpb24nXG5pbXBvcnQge1xuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgYXNBcnJheSxcbiAgaXNBYnNvbHV0ZVVybCxcbiAgbWVyZ2UsXG4gIGh5cGhlbmF0ZSxcbiAgY2FtZWxpemUsXG4gIGRlZmF1bHRGb3JtYXRzXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyBjb21wb25lbnRzIGZyb20gJy4vY29tcG9uZW50cy9pbmRleC5qcydcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4vdHlwZXMvaW5kZXguanMnXG5pbXBvcnQgRGl0b1Jvb3QgZnJvbSAnLi9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSdcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgZGVwcmVjYXRlIH0gZnJvbSAnLi91dGlscy9kZXByZWNhdGUuanMnXG5pbXBvcnQgdmVyYnMgZnJvbSAnLi92ZXJicy5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0FkbWluIHtcbiAgY29uc3RydWN0b3IoZWwsIHtcbiAgICAvLyBgZGl0b2AgY29udGFpbnMgdGhlIGJhc2UgYW5kIGFwaSBzZXR0aW5ncyBwYXNzZWQgZnJvbSBgQWRtaW5Db250cm9sbGVyYFxuICAgIGRpdG8gPSB7fSxcbiAgICBhcGksXG4gICAgdmlld3MgPSB7fSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIC8vIE1lcmdlIGluIGBhcGlgIHNldHRpbmdzIGFzIHBhc3NlZCBmcm9tIGBjb25maWcuYWRtaW5gIGFuZCB0aHJvdWdoIHRoZVxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgIHdpdGggYGFwaWAgdmFsdWVzIGZyb20gZnJvbSAnYWRtaW4vaW5kZXguanMnXG4gICAgLy8gTk9URTogYEFkbWluQ29udHJvbGxlcmAgcHJvdmlkZXMgYGRpdG8uYXBpLmJhc2VgXG4gICAgdGhpcy5hcGkgPSBhcGkgPSBtZXJnZSh7IGJhc2U6ICcvJyB9LCBkaXRvLmFwaSwgYXBpKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcblxuICAgIC8vIFNldHVwIGRlZmF1bHQgYXBpIHNldHRpbmdzOlxuICAgIGFwaS5sb2NhbGUgfHw9ICdlbi1VUydcbiAgICBhcGkuZm9ybWF0cyA9IG1lcmdlKHt9LCBkZWZhdWx0Rm9ybWF0cywgYXBpLmZvcm1hdHMpXG4gICAgYXBpLnJlcXVlc3QgfHw9IG9wdGlvbnMgPT4gcmVxdWVzdChhcGksIG9wdGlvbnMpXG4gICAgYXBpLmdldEFwaVVybCB8fD0gb3B0aW9ucyA9PiBnZXRBcGlVcmwoYXBpLCBvcHRpb25zKVxuICAgIGFwaS5pc0FwaVVybCB8fD0gdXJsID0+IGlzQXBpVXJsKGFwaSwgdXJsKVxuICAgIC8vIFNldHRpbmcgYGFwaS5ub3JtYWxpemVQYXRocyA9IHRydWUgKHBsdXJhbCkgc2V0cyBib3RoOlxuICAgIC8vIGBhcGkubm9ybWFsaXplUGF0aCA9IGh5cGhlbmF0ZWAgYW5kIGBhcGkuZGVub3JtYWxpemVQYXRoID0gY2FtZWxpemVgXG4gICAgYXBpLm5vcm1hbGl6ZVBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZSA6IHZhbCA9PiB2YWxcbiAgICBhcGkuZGVub3JtYWxpemVQYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aHMgPyBjYW1lbGl6ZSA6IHZhbCA9PiB2YWxcblxuICAgIC8vIEFsbG93IGRlZmluaXRpb24gb2YgZGVmYXVsdHMgZm9yIGFkbWluIGNvbXBvbmVudCB0eXBlcywgbmVzdGVkIHBlciB0eXBlOlxuICAgIC8vIGFwaS5kZWZhdWx0cyA9IHtcbiAgICAvLyAgICdtdWx0aXNlbGVjdCc6IHtcbiAgICAvLyAgICAgc2VsZWN0YWJsZTogdHJ1ZVxuICAgIC8vICAgfSxcbiAgICAvLyAgICdmYWtlLXR5cGUnOiBzY2hlbWEgPT4ge1xuICAgIC8vICAgICAvLyBSZXR1cm4gZGVmYXVsdHMsIG9yIGRpcmVjdGx5IG1vZGlmeSB0aGUgc2NoZW1hOlxuICAgIC8vICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwge1xuICAgIC8vICAgICAgIHR5cGU6ICdyZWFsLXR5cGUnLFxuICAgIC8vICAgICAgIGZvcm1hdDogKHsgdmFsdWUgfSkgPT4gYEZvcm1hdHRlZCAke3ZhbHVlfWAsXG4gICAgLy8gICAgICAgcHJvY2VzczogKHsgdmFsdWUgfSkgPT4gYFByb2Nlc3NlZCAke3ZhbHVlfWBcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBhcGkuZGVmYXVsdHMgfHw9IHt9XG5cbiAgICAvLyBBbGxvdyB0aGUgY29uZmlndXJhdGlvbiBvZiBhbGwgYXV0aCByZXNvdXJjZXMsIGxpa2Ugc286XG4gICAgLy8gYXBpLnVzZXJzID0ge1xuICAgIC8vICAgcGF0aDogJy9hZG1pbnMnLFxuICAgIC8vICAgLy8gVGhlc2UgYXJlIHRoZSBkZWZhdWx0czpcbiAgICAvLyAgIGxvZ2luOiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dpbicsXG4gICAgLy8gICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgLy8gICB9LFxuICAgIC8vICAgbG9nb3V0OiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dvdXQnLFxuICAgIC8vICAgICBtZXRob2Q6ICdwb3N0J1xuICAgIC8vICAgfSxcbiAgICAvLyAgIHNlc3Npb246IHtcbiAgICAvLyAgICAgcGF0aDogJ3Nlc3Npb24nLFxuICAgIC8vICAgICBtZXRob2Q6ICdnZXQnXG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIGNvbnN0IHVzZXJzID0gZ2V0UmVzb3VyY2UoYXBpLnVzZXJzLCB7XG4gICAgICB0eXBlOiAnY29sbGVjdGlvbidcbiAgICB9KSB8fCB7fVxuICAgIHVzZXJzLmxvZ2luID0gZ2V0UmVzb3VyY2UodXNlcnMubG9naW4gfHwgJ2xvZ2luJywge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICB1c2Vycy5sb2dvdXQgPSBnZXRSZXNvdXJjZSh1c2Vycy5sb2dvdXQgfHwgJ2xvZ291dCcsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgdXNlcnMuc2Vzc2lvbiA9IGdldFJlc291cmNlKHVzZXJzLnNlc3Npb24gfHwgJ3Nlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgYXBpLnVzZXJzID0gdXNlcnNcblxuICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgb2YgcmVzb3VyY2UgcGF0aCBoYW5kbGVyczpcbiAgICAvLyBhcGkucmVzb3VyY2VzID0ge1xuICAgIC8vICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgIC8vICAgICByZXR1cm4gcmVzb3VyY2UucGFyZW50XG4gICAgLy8gICAgICAgPyBgJHtyZXNvdXJjZS5wYXRofT8ke3Jlc291cmNlLnBhcmVudC5wYXRofV9pZD0ke1xuICAgIC8vICAgICAgICAgIHJlc291cmNlLnBhcmVudC5pZH1gXG4gICAgLy8gICAgICAgOiByZXNvdXJjZS5wYXRoXG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgYXBpLnJlc291cmNlcyA9IHtcbiAgICAgIGFueShyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tyZXNvdXJjZT8udHlwZV0gfHwgdGhpcy5kZWZhdWx0XG4gICAgICAgIHJldHVybiByZXNvdXJjZSAmJiBoYW5kbGVyLmNhbGwodGhpcywgcmVzb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBkZWZhdWx0KHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0aGlzLmFueShyZXNvdXJjZS5wYXJlbnQpXG4gICAgICAgIHJldHVybiBwYXJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtwYXJlbnRQYXRofS8ke3Jlc291cmNlLnBhdGh9YFxuICAgICAgICAgIDogcmVzb3VyY2UucGF0aFxuICAgICAgfSxcblxuICAgICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHJlc291cmNlKVxuICAgICAgfSxcblxuICAgICAgbWVtYmVyKHJlc291cmNlKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFzc3VtZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgcm9vdC1sZXZlbCBjb2xsZWN0aW9uIHJvdXRlcyxcbiAgICAgICAgLy8gdG8gYXZvaWQgZXhjZXNzaXZlIG5lc3Rpbmcgb2YgKHN1Yi0pY29sbGVjdGlvbiByb3V0ZXMuXG4gICAgICAgIHJldHVybiBgJHtyZXNvdXJjZS5wYXRofS8ke3Jlc291cmNlLmlkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVwbG9hZChyZXNvdXJjZSkge1xuICAgICAgICAvLyBEaXRvIFNlcnZlciBoYW5kbGVzIHVwbG9hZCByb3V0ZXMgb24gdGhlIGNvbGxlY3Rpb24gcmVzb3VyY2U6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbGxlY3Rpb24ocmVzb3VyY2UucGFyZW50KX0vdXBsb2FkLyR7cmVzb3VyY2UucGF0aH1gXG4gICAgICB9LFxuXG4gICAgICAuLi5hcGkucmVzb3VyY2VzXG4gICAgfVxuXG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyAvIGV4dGVuZGluZyBvZiBoZWFkZXJzOlxuICAgIC8vIGFwaS5oZWFkZXJzID0ge1xuICAgIC8vICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIC8vIH1cbiAgICBhcGkuaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5hcGkuaGVhZGVyc1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhlbCkpIHtcbiAgICAgIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbClcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSAodGhpcy5hcHAgPSBjcmVhdGVBcHAoe1xuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBEaXRvUm9vdCxcbiAgICAgICAgVnVlTm90aWZpY2F0aW9ucyxcbiAgICAgICAgLy8gVGhpcyBtYXkgb25seSBiZSBuZWVkZWQgdG8gYXZvaWQgdHJlZS1zaGFja2luZyBvZiB0aGVzZSBjb21wb25lbnRzLFxuICAgICAgICAvLyBzaW5jZSB0aGV5IGFjdHVhbGx5IGhhbmRsZSByZWdpc3RyeSBpbnRlcm5hbGx5IGFscmVhZHkuXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9uY2Ugd2UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbi5cbiAgICAgICAgLi4uY29tcG9uZW50cyxcbiAgICAgICAgLi4udHlwZXNcbiAgICAgIH0sXG5cbiAgICAgIC8vIE1vc3QgaW5qZWN0cyBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlIHJlYWN0aXZlbmVzcyBhY3Jvc3NcbiAgICAgIC8vIHByb3ZpZGUvaW5qZWN0LCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy83MDE3I2lzc3VlY29tbWVudC00ODA5MDY2OTFcbiAgICAgIHByb3ZpZGU6IHtcbiAgICAgICAgYXBpLFxuICAgICAgICAvLyBBIGRlZmF1bHQgbGlzdCBvZiB2ZXJicyBhcmUgcHJvdmlkZWQgYnkgJHZlcmJzKCkgYW5kIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGF0IGFueSBwb2ludCBpbiB0aGUgY29tcG9uZW50IGhpZXJhcmNoeS5cbiAgICAgICAgJHZlcmJzOiAoKSA9PiB2ZXJicyxcbiAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0cyBzbyBEaXRvTWl4aW4gY2FuIGluamVjdCB0aGVtIGZvciBhbGwgY29tcG9uZW50czpcbiAgICAgICAgLy8gICBpbmplY3Q6IFsgICckaXNQb3B1bGF0ZWQnLCAnJHNjaGVtYUNvbXBvbmVudCcsICckcm91dGVDb21wb25lbnQnIF1cbiAgICAgICAgJHZpZXdzOiAoKSA9PiB7fSxcbiAgICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0cnVlLFxuICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hUGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcm91dGVDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcmVzb3VyY2VDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkaWFsb2dDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRwYW5lbENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVuZGVyOiAoKSA9PlxuICAgICAgICBjcmVhdGVFbGVtZW50KERpdG9Sb290LCB7XG4gICAgICAgICAgcmVmOiAncm9vdCcsXG4gICAgICAgICAgY2xhc3M6IGRpdG8uc2V0dGluZ3Mucm9vdENsYXNzLFxuICAgICAgICAgIHVucmVzb2x2ZWRWaWV3czogdmlld3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9KVxuICAgIH0pKVxuXG4gICAgYXBwLnVzZShWdWVOb3RpZmljYXRpb25zLCB7XG4gICAgICBuYW1lOiAnbm90aWZ5JyxcbiAgICAgIGNvbXBvbmVudE5hbWU6ICdWdWVOb3RpZmljYXRpb25zJ1xuICAgIH0pXG5cbiAgICAvLyByb290LmNvbXBvbmVudCgndnVlLW1vZGFsJywgVnVlTW9kYWwpXG5cbiAgICBhcHAudXNlKFxuICAgICAgY3JlYXRlUm91dGVyKHtcbiAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNhdGNoLWFsbCByb3V0ZSwgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCByb3V0ZXNcbiAgICAgICAgLy8gb25jZSB0aGUgc2NoZW1hcyBhcmUgbG9hZGVkLCB0byBwcmV2ZW50IHZ1ZS1yb3V0ZXIgZnJvbSBjb21wbGFpbmluZyxcbiAgICAgICAgLy8gc2VlOiBgcmVzb2x2ZVZpZXdzKClgIGluIGBEaXRvUm9vdGAgZm9yIHRoZSBhY3R1YWwgcm91dGUgc2V0dXAuXG4gICAgICAgIHJvdXRlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdjYXRjaC1hbGwnLFxuICAgICAgICAgICAgcGF0aDogJy86XyguKiknLFxuICAgICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGhpc3Rvcnk6IGNyZWF0ZVdlYkhpc3RvcnkoZGl0by5iYXNlKSxcbiAgICAgICAgbGlua0FjdGl2ZUNsYXNzOiAnJyxcbiAgICAgICAgbGlua0V4YWN0QWN0aXZlQ2xhc3M6ICcnXG4gICAgICB9KVxuICAgIClcblxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2RpdG8tYXBwJylcbiAgICBhcHAubW91bnQoZWwpXG4gIH1cblxuICByZWdpc3Rlcih0eXBlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpXG4gIH1cbn1cblxuY2xhc3MgUmVxdWVzdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIHN1cGVyKFxuICAgICAgYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfSAoJHtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgfSlgXG4gICAgKVxuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoYXBpLCB7XG4gIHVybCxcbiAgbWV0aG9kID0gJ2dldCcsXG4gIC8vIFRPRE86IGByZXF1ZXN0LnBhcmFtc2Agd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBxdWVyeWAgb24gMjAyMi0xMS0wMSxcbiAgLy8gcmVtb3ZlIG9uY2Ugbm90IGluIHVzZSBhbnl3aGVyZSBhbnkgbW9yZS5cbiAgcGFyYW1zID0gbnVsbCxcbiAgcXVlcnkgPSBwYXJhbXMgfHwgbnVsbCxcbiAgaGVhZGVycyA9IG51bGwsXG4gIGRhdGEgPSBudWxsXG59KSB7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICBgcmVxdWVzdC5wYXJhbXMgaXMgZGVwcmVjYXRlZC4gVXNlIGFjdGlvbi5tZXRob2QgYW5kIGFjdGlvbi5wYXRoIGluc3RlYWQuYFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGlzQXBpVXJsID0gYXBpLmlzQXBpVXJsKHVybClcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFwaS5nZXRBcGlVcmwoeyB1cmwsIHF1ZXJ5IH0pLCB7XG4gICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAuLi4oZGF0YSAmJiB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihpc0FwaVVybCAmJiBhcGkuaGVhZGVycyksXG4gICAgICAuLi5oZWFkZXJzXG4gICAgfSxcbiAgICBjcmVkZW50aWFsczpcbiAgICAgIGlzQXBpVXJsICYmIGFwaS5jb3JzPy5jcmVkZW50aWFsc1xuICAgICAgICA/ICdpbmNsdWRlJ1xuICAgICAgICA6ICdzYW1lLW9yaWdpbidcbiAgfSlcblxuICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmVzcG9uc2UuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IocmVzcG9uc2UpXG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmZ1bmN0aW9uIGlzQXBpVXJsKGFwaSwgdXJsKSB7XG4gIHJldHVybiAhaXNBYnNvbHV0ZVVybCh1cmwpIHx8IHVybC5zdGFydHNXaXRoKGFwaS51cmwpXG59XG5cbmZ1bmN0aW9uIGdldEFwaVVybChhcGksIHsgdXJsLCBxdWVyeSB9KSB7XG4gIGlmICghaXNBYnNvbHV0ZVVybCh1cmwpKSB7XG4gICAgdXJsID0gY29tYmluZVVybHMoYXBpLnVybCwgdXJsKVxuICB9XG4gIC8vIFN1cHBvcnQgb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycywgdG8gYmUgYXJlIGFkZGVkIHRvIHRoZSBVUkwuXG4gIGNvbnN0IHNlYXJjaCA9IGZvcm1hdFF1ZXJ5KHF1ZXJ5KVxuICByZXR1cm4gc2VhcmNoID8gYCR7dXJsfT8ke3NlYXJjaH1gIDogdXJsXG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVVcmxzKGJhc2VVcmwsIHJlbGF0aXZlVXJsKSB7XG4gIC8vIFVzZSBzYW1lIGFwcHJvYWNoIGFzIGF4aW9zIGBjb21iaW5lVVJMcygpYCB0byBqb2luIGJhc2VVcmwgJiByZWxhdGl2ZVVybDpcbiAgcmV0dXJuIGAke2Jhc2VVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyl9LyR7cmVsYXRpdmVVcmwucmVwbGFjZSgvXlxcLysvLCAnJyl9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRRdWVyeShxdWVyeSkge1xuICBjb25zdCBlbnRyaWVzID0gcXVlcnlcbiAgICA/IGlzQXJyYXkocXVlcnkpXG4gICAgICA/IHF1ZXJ5XG4gICAgICA6IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgIDogW11cbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoXG4gICAgLy8gRXhwYW5kIGFycmF5IHZhbHVlcyBpbnRvIG11bHRpcGxlIGVudHJpZXMgdW5kZXIgdGhlIHNhbWUga2V5LCBzb1xuICAgIC8vIGBmb3JtYXRRdWVyeSh7IGZvbzogWzEsIDJdLCBiYXI6IDMgfSlgID0+ICdmb289MSZmb289MiZiYXI9MycuXG4gICAgZW50cmllcy5yZWR1Y2UoXG4gICAgICAoZW50cmllcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIGFzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHZhbF0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgIH0sXG4gICAgICBbXVxuICAgIClcbiAgKS50b1N0cmluZygpXG59XG4iXSwibmFtZXMiOlsiYXBwU3RhdGUiLCJyZWFjdGl2ZSIsImFwcGVuZERhdGFQYXRoIiwiZGF0YVBhdGgiLCJ0b2tlbiIsInBhcnNlUGFyZW50RGF0YVBhdGgiLCJwYXRoIiwicGFyc2VEYXRhUGF0aCIsInBhcnNlSXRlbURhdGFQYXRoIiwibmVzdGVkIiwiZ2V0SXRlbURhdGFQYXRoIiwibm9ybWFsaXplRGF0YVBhdGgiLCJwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aCIsImlzSW50ZWdlciIsImdldFBhcmVudEl0ZW1EYXRhUGF0aCIsImdldEl0ZW0iLCJyb290SXRlbSIsImdldFZhbHVlQXREYXRhUGF0aCIsImdldFBhcmVudEl0ZW0iLCJnZXRMYXN0RGF0YVBhdGhUb2tlbiIsImdldExhc3REYXRhUGF0aE5hbWUiLCJnZXRMYXN0RGF0YVBhdGhJbmRleCIsImluZGV4IiwidGVtcG9yYXJ5SWQiLCJzZXRUZW1wb3JhcnlJZCIsImRhdGEiLCJpZEtleSIsImlzVGVtcG9yYXJ5SWQiLCJpZCIsImlzUmVmZXJlbmNlIiwiaGFzT3duUHJvcGVydHkiLCJjb250ZXh0cyIsImdldCIsImNvbnRleHQiLCJrZXkiLCJkZWZhdWx0VmFsdWUiLCJvYmplY3QiLCJ0b1JhdyIsInZhbHVlIiwiaXNGdW5jdGlvbiIsInNldCIsIkRpdG9Db250ZXh0IiwiY29tcG9uZW50IiwiaXRlbSIsIm9wdGlvbnMiLCJsb2NhdGlvbiIsInJlc291cmNlIiwiRW1pdHRlck1peGluIiwiZXZlbnQiLCJjYWxsYmFjayIsImlzQXJyYXkiLCJldiIsImlzUGxhaW5PYmplY3QiLCJsaXN0ZW5lcnMiLCJjYWxsYmFja3MiLCJvbiIsImFyZ3MiLCJlbnRyeSIsIl9hIiwiY2IiLCJxdWV1ZSIsInJlc29sdmUiLCJuZXh0IiwicmVzdWx0IiwicmVzIiwiZXJyb3IiLCJ0YXJnZXQiLCJ0eXBlQ2hlY2tlcnMiLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNEYXRlIiwiaXNPYmplY3QiLCJpc1JlZ0V4cCIsInR5cGVDb252ZXJ0ZXJzIiwiYXNBcnJheSIsImlzTWF0Y2hpbmdUeXBlIiwidHlwZXMiLCJ0eXBlIiwiY29udmVydFR5cGUiLCJjb252ZXJ0ZXIiLCJoYXNSZXNvdXJjZSIsInNjaGVtYSIsImdldFJlc291cmNlIiwiZGVmYXVsdHMiLCJwYXJlbnQiLCJkZWZzIiwiZ2V0TWVtYmVyUmVzb3VyY2UiLCJwaWNrQnkiLCJEaXRvTWl4aW4iLCJ1aWQiLCJuZXh0VWlkIiwia2V5T3JEYXRhUGF0aCIsImRlZiIsImNvbnZlcnRlZCIsIm5hbWUiLCJsYWJlbGl6ZSIsImJ1dHRvbiIsInZlcmIiLCJxdWVyeSIsInVybCIsIm1ldGhvZCIsImludGVybmFsIiwiY2hlY2tVc2VyIiwicmVzcG9uc2UiLCJlcXVhbHMiLCJjb21wb25lbnRzIiwiYnV0dG9ucyIsInNldHRpbmdzIiwiY2FjaGUiLCJjYWNoZVBhcmVudCIsImxvYWRDYWNoZSIsImNhY2hlS2V5IiwibG9jYWxlIiwiZm9ybWF0IiwiYSIsImJvZHkiLCJhY2Nlc3NvciIsIndhdGNoIiwiZXZlbnRzIiwiaGFuZGxlcnMiLCJleHByIiwiYWRkRXZlbnQiLCJoeXBoZW5hdGUiLCJoYXNMaXN0ZW5lcnMiLCJwYXJlbnRIYXNMaXN0ZW5lcnMiLCJnZXRDb250ZXh0IiwicGFyYW1zIiwiaXNDcmVkaXRDYXJkIiwiZGVjaW1hbHMiLCJtYXRjaCIsImlzRG9tYWluIiwiaXNFbWFpbCIsImlzSG9zdG5hbWUiLCJtYXgiLCJtaW4iLCJwYXNzd29yZCIsImlzVXJsIiwiVmFsaWRhdGlvbk1peGluIiwibm90aWZ5IiwiaXNWYWxpZCIsInJ1bGUiLCJzZXR0aW5nIiwidmFsaWRhdG9yIiwidmFsaWRhdGlvbnMiLCJ2YWxpZGF0ZSIsIm1lc3NhZ2UiLCJhZGRMYWJlbCIsImVycm9ycyIsImZvY3VzIiwiZ2V0U2NoZW1hQWNjZXNzb3IiLCJnZXRTdG9yZUFjY2Vzc29yIiwiVHlwZU1peGluIiwiY29tcHV0ZVZhbHVlIiwicGFyc2UiLCJzY2hlbWFDb21wb25lbnQiLCJsYWJlbCIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbklucHV0Iiwib25DaGFuZ2UiLCJuYXRpdmVGaWVsZCIsInRleHRGaWVsZCIsImF0dHJpYnV0ZXMiLCJhZGQiLCJlbGVtZW50IiwiX2IiLCJ1aWRNYXAiLCJnZXRVaWQiLCJpdGVtSWQiLCJTY2hlbWFHcmFwaCIsIl9fcHVibGljRmllbGQiLCJzdWJHcmFwaCIsInBhcnQiLCJyZWxhdGVkRGF0YVBhdGgiLCJuYW5vaWQiLCJmbGF0dGVuIiwiZ3JhcGgiLCJlbnRyaWVzIiwiJHNldHRpbmdzIiwic3ViS2V5Iiwic291cmNlU2NoZW1hIiwiY2xpcGJvYXJkIiwicmVsYXRlZCIsInJlZmVyZW5jZSIsInNvdXJjZSIsInJlbGF0aW9uIiwidmFsdWVzIiwicmVtb3ZlSWQiLCJyZWZlcmVuY2VJZCIsInJlZktleSIsInJldlZhbHVlIiwidHlwZUNvbXBvbmVudHMiLCJ1bmtub3duVHlwZVJlcG9ydGVkIiwicmVnaXN0ZXJUeXBlQ29tcG9uZW50IiwiZ2V0VHlwZUNvbXBvbmVudCIsImFsbG93TnVsbCIsIml0ZXJhdGVTY2hlbWFDb21wb25lbnRzIiwic2NoZW1hcyIsImlzU2luZ2xlQ29tcG9uZW50VmlldyIsIml0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzIiwiZ2V0QWxsVGFiU2NoZW1hcyIsImZpbmRTY2hlbWFDb21wb25lbnQiLCJzb21lU2NoZW1hQ29tcG9uZW50IiwiaXNTY2hlbWEiLCJpc0Zvcm0iLCJpc1ZpZXciLCJpc1RhYiIsImlzUGFuZWwiLCJnZXRTY2hlbWFJZGVudGlmaWVyIiwicmVzb2x2ZVNjaGVtYSIsInVud3JhcE1vZHVsZSIsImlzUHJvbWlzZSIsImlzTW9kdWxlIiwia2V5cyIsInJlc29sdmVTY2hlbWFzIiwidW5yZXNvbHZlZFNjaGVtYXMiLCJyZXNvbHZlSXRlbSIsIm1hcENvbmN1cnJlbnRseSIsInJlc29sdmVTY2hlbWFDb21wb25lbnQiLCJtYXJrUmF3IiwicmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyIsImFwaSIsInJvdXRlcyIsImxldmVsIiwicHJvbWlzZXMiLCJwcm9jZXNzIiwicmVsYXRpdmVMZXZlbCIsInByb2Nlc3NTY2hlbWFDb21wb25lbnQiLCJnZXRBbGxQYW5lbFNjaGVtYXMiLCJwcm9jZXNzRGVmYXVsdHMiLCJwYW5lbCIsImdldFR5cGVPcHRpb25zIiwicHJvY2Vzc1ZpZXciLCJwcm9jZXNzUm91dGVTY2hlbWEiLCJyZXNvbHZlTmVzdGVkU2NoZW1hcyIsImNoaWxkcmVuIiwibWVyZ2UiLCJwcm9jZXNzRm9ybXMiLCJmb3JtIiwiZm9ybXMiLCJwcm9jZXNzRm9ybSIsInByb2Nlc3NUYWIiLCJwcm9jZXNzUGFuZWwiLCJ0YWJzIiwicGFuZWxzIiwidGFiIiwiaGFzRm9ybVNjaGVtYSIsImhhc011bHRpcGxlRm9ybVNjaGVtYXMiLCJnZXRWaWV3Rm9ybVNjaGVtYSIsInZpZXciLCJ2aWV3U2NoZW1hIiwiZ2V0Vmlld1NjaGVtYSIsImdldFZpZXdFZGl0UGF0aCIsImdldEZvcm1TY2hlbWFzIiwibW9kaWZ5Rm9ybSIsImNvbXBhY3QiLCJnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyIsImdldEl0ZW1Gb3JtU2NoZW1hIiwiaXNDb21wYWN0IiwiaXNJbmxpbmVkIiwiaXNOZXN0ZWQiLCJvbWl0UGFkZGluZyIsImFsaWduQm90dG9tIiwiZ2V0RGVmYXVsdFZhbHVlIiwiY2xvbmUiLCJpZ25vcmVNaXNzaW5nVmFsdWUiLCJ0eXBlT3B0aW9ucyIsInNldERlZmF1bHRWYWx1ZXMiLCJwcm9jZXNzU2NoZW1hRGF0YSIsInJvb3REYXRhIiwiY29tcHV0ZSIsImNsb25lSXRlbSIsImNvcHkiLCJvcmRlcktleSIsInByb2Nlc3NEYXRhIiwic2NoZW1hT25seSIsInByb2Nlc3NlZERhdGEiLCJ3cmFwUHJpbWl0aXZlcyIsImIiLCJpZDEiLCJpZDIiLCJleGNsdWRlIiwicHJvY2Vzc1ZhbHVlIiwicHJvY2Vzc0JlZm9yZSIsInByb2Nlc3NBZnRlciIsInByb2Nlc3NDb21wb25lbnRzIiwiZ2V0RGF0YVBhdGgiLCJjb21wb25lbnRTY2hlbWEiLCJjb21wb25lbnREYXRhUGF0aCIsInByb2Nlc3NJdGVtIiwicHJvY2Vzc2VkSXRlbSIsImdldE5hbWVkU2NoZW1hcyIsInRvT2JqZWN0IiwiYXJyYXkiLCJ0b1NjaGVtYSIsImNhbWVsaXplIiwiZ2V0QnV0dG9uU2NoZW1hcyIsImdldFR5cGUiLCJzY2hlbWFPclR5cGUiLCJnZXRTb3VyY2VUeXBlIiwiZ2V0UGFuZWxFbnRyeSIsInRhYkNvbXBvbmVudCIsImdldFBhbmVsRW50cmllcyIsInBhbmVsU2NoZW1hcyIsInBhbmVsRW50cmllcyIsImdldEFsbFBhbmVsRW50cmllcyIsInBhbmVsU2NoZW1hIiwiaXNPYmplY3RTb3VyY2UiLCJpc0xpc3RTb3VyY2UiLCJnZXRJdGVtSWQiLCJnZXRJdGVtVWlkIiwicmVzb2x2ZU1lcmdlZE9wdGlvbnMiLCJtaXhpbnMiLCJtZXJnZU9wdGlvbnMiLCJ0byIsImZyb20iLCJtaXhpbiIsImRpdG9PcHRpb25LZXlzIiwiRGl0b0NvbXBvbmVudCIsImRlZmluaXRpb24iLCJEaXRvVXNlciIsInJvbGVzIiwicm9sZSIsIlNjaGVtYVBhcmVudE1peGluIiwic2NoZW1hQ29tcG9uZW50cyIsIlZhbGlkYXRvck1peGluIiwiaXQiLCJSb3V0ZU1peGluIiwicm91dGVDb21wb25lbnQiLCJtYXRjaGVkIiwiaSIsInJlY29yZCIsImJyZWFkY3J1bWIiLCJyb3V0ZUNvbXBvbmVudHMiLCJvayIsInRlbXBsYXRlUGF0aCIsInJvb3RQYXRoIiwiZ2V0Q29tbW9uUHJlZml4IiwiaXNMb2FkaW5nIiwiY29weURhdGUiLCJkYXRlIiwieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwibW9kZSIsIm92ZXJyaWRlcyIsInN0ZXAiLCJjdXJyZW50VmFsdWUiLCJzdGF0ZSIsImhvciIsInZlciIsImVudGVyIiwiY3VycmVudE1vZGUiLCJzdGFydFllYXIiLCJmaXJzdERheVdlZWsiLCJudW1EYXlzIiwicHJldk1vbnRoIiwicHJldk1vbnRoTnVtRGF5cyIsInRvZGF5IiwiaXNEYXkiLCJuZXh0TW9udGhOZWVkIiwibmV4dE1vbnRoIiwibG9jYWxlTmFtZXMiLCJuYW1lcyIsImFkZEV2ZW50cyIsImdldEtleSIsImdldEtleU5hdmlnYXRpb24iLCJjbGFzc2VzIiwic2hvdyIsInRyaWdnZXIiLCJwb3B1cCIsImVsIiwiYm91bmRzIiwidHJpZ2dlckxlZnQiLCJ0cmlnZ2VyVG9wIiwidHJpZ2dlcldpZHRoIiwidHJpZ2dlckhlaWdodCIsInBvcHVwV2lkdGgiLCJwb3B1cEhlaWdodCIsInBhcnQxIiwicGFydDIiLCJ3aW5XaWR0aCIsIndpbkhlaWdodCIsImxlZnQiLCJ0b3AiLCJ0cmlnZ2VyQm91bmRzIiwic2l6ZSIsImdldExlbmd0aCIsIlRyaWdnZXIiLCJDYWxlbmRhciIsIklucHV0RmllbGQiLCJkZWZhdWx0Rm9ybWF0cyIsInNjcm9sbFRvIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJwZXJUaWNrIiwic2V0U2VsZWN0aW9uIiwiZmllbGQiLCJzdGFydCIsImVuZCIsInJhbmdlIiwiZm9yY2UiLCJzY3JvbGwiLCJyZWYiLCJsaW5lSGVpZ2h0Iiwic2VsZWN0ZWQiLCJsZW5ndGgiLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsInBhZ2UiLCJwYWdlU2l6ZSIsImN1cnJlbnRQYWdlU2l6ZSIsInNob3dQcmV2Iiwic2hvd05leHQiLCJ0b3RhbCIsImN1cnJlbnRQYWdlIiwic2hvd0xlbmd0aCIsIm51bVBhZ2VzIiwicGFnZVJhbmdlIiwiY2hlY2tlZCIsImRpc2FibGVkIiwidW5jaGVja2VkIiwibW9kZWxWYWx1ZSIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwic2xvdHMiLCJjcmVhdGVFbGVtZW50IiwiVHJhbnNpdGlvbiIsInByb3BzIiwic2V0U3R5bGUiLCJzdHlsZSIsImZvcmNlUmVwYWludCIsIndpZHRoIiwiaGVpZ2h0IiwiVXNlRm9jdXNUcmFwIiwiZGVmaW5lQ29tcG9uZW50IiwidHJhcCIsImFjdGl2YXRlIiwiZGVhY3RpdmF0ZSIsInVucmVmRWxlbWVudCIsImNyZWF0ZUZvY3VzVHJhcCIsIm9uU2NvcGVEaXNwb3NlIiwiaCIsImRpYWxvZ0RhdGEiLCJEb21NaXhpbiIsInJlbW92ZSIsImhhbmRsZXIiLCJEaXRvRGlhbG9nIiwiZXJyIiwidGl0bGUiLCJ0ZXh0IiwibG9nIiwic3RyaXBUYWdzIiwibm90aWZpY2F0aW9ucyIsImR1cmF0aW9uRmFjdG9yIiwicmVqZWN0IiwiZGlhbG9nSWQiLCJhZGRpdGlvbmFsQ29tcG9uZW50cyIsInJlZGlyZWN0QWZ0ZXJMb2dpbiIsImxvZ2luRGF0YSIsInVzZXIiLCJEaXRvVmlldyIsImZ1bGxQYXRoIiwiYWRkUm91dGVzIiwicm91dGVyIiwicmVtb3ZlcnMiLCJyb3V0ZSIsInJlbW92ZVJvdXRlIiwiRGl0b1NwaW5uZXIiLCJjb2xvciIsIlB1bGxkb3duTWl4aW4iLCJzdGFydFRpbWUiLCJvcGVuIiwiY29udGVudCIsImFzT2JqZWN0IiwiSXRlbU1peGluIiwiZXh0ZW5kZWQiLCJpdGVtTGFiZWwiLCJmb3JtTGFiZWwiLCJnZXRGb3JtTGFiZWwiLCJwcmVmaXgiLCJzdWZmaXgiLCJjb2x1bW5zIiwiaGFkTGFiZWwiLCJwYW5lIiwiY3VycmVudFRhYiIsImZpcnN0IiwiZGVmYXVsdFRhYiIsImRhdGFQYXRoT3JOYW1lIiwiZXhwYW5kIiwiY29tcG9uZW50c0J5RGF0YVBhdGgiLCJkYXRhUGF0aHMiLCJjaGVjayIsInVubWF0Y2hlZCIsImVycnMiLCJmdWxsRGF0YVBhdGgiLCJkYXRhUGF0aFBhcnRzIiwiZm91bmQiLCJwcm9wZXJ0eSIsInN1YkNvbXBvbmVudHMiLCJyZWdpc3RyeSIsImVudHJpZXNCeURhdGFQYXRoIiwiX2hvaXN0ZWRfMSIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX0ZyYWdtZW50IiwiX3JlbmRlckxpc3QiLCJfY3R4IiwiX2hvaXN0ZWRfMiIsIl9jcmVhdGVCbG9jayIsIl9jb21wb25lbnRfRGl0b0NvbnRhaW5lciIsIm5lc3RlZERhdGFQYXRoIiwic3RvcmUiLCJfaG9pc3RlZF8zIiwicGFyc2VGcmFjdGlvbiIsImRpdmlkZW5kIiwiZGl2aXNvciIsImNvbnRhaW5lckNsYXNzIiwiYmFzaXMiLCJncm93Iiwic2hyaW5rIiwiYmFzaXNJc0F1dG8iLCJoYXNWTm9kZUNvbnRlbnQiLCJ2bm9kZSIsIkNvbW1lbnQiLCJoYXNTbG90Q29udGVudCIsInNsb3QiLCJ1c2VTbG90cyIsImNhcGl0YWxpemUiLCJjbGlwYm9hcmREYXRhIiwicGFzdGUiLCJyZXBvcnQiLCJqc29uIiwiX2QiLCJfYyIsImRlaW5kZW50IiwiJHNjaGVtYSIsIl9lIiwiTG9hZGluZ01peGluIiwidXBkYXRlUm9vdCIsInVwZGF0ZVZpZXciLCJSZXNvdXJjZU1peGluIiwiYW1vdW50IiwidmVyYnMiLCJjbGVhciIsImxvYWRpbmdPcHRpb25zIiwicmVxdWVzdCIsInNldERhdGEiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwibm90aWZ5U3VjY2VzcyIsIm5vdGlmeUVycm9yIiwicmVzb2x2ZVBhdGgiLCJpc0NyZWF0aW5nIiwicHJvdmlkZXNEYXRhIiwiZGF0YVBhcnRzIiwicGF0aFBhcnRzIiwicm91dGVQYXJ0cyIsImxhc3REYXRhUGFydCIsImwiLCJkYXRhUGFydCIsIm1haW5TY2hlbWFDb21wb25lbnQiLCJwcmVzZW50IiwiY2xvc2VGb3JtIiwiZ2V0VmVyYiIsImJ1dHRvblJlc291cmNlIiwic3VjY2VzcyIsIl9yZXNvdXJjZSIsIl9tZXRob2QiLCJEaXRvRm9ybSIsInNjb3BlIiwiUGFnaW5hdGlvbiIsIlNvcnRhYmxlTWl4aW4iLCJmb3JjZUZhbGxiYWNrIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsImxpc3QiLCJwYWdpbmF0aW9uUmFuZ2UiLCJvZmZzZXQiLCJfbm9ybWFsaXplU3R5bGUiLCJfY2FjaGUiLCJfd2l0aE1vZGlmaWVycyIsIiRldmVudCIsIl9ub3JtYWxpemVDbGFzcyIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfaG9pc3RlZF80IiwiX3RvRGlzcGxheVN0cmluZyIsIl9ob2lzdGVkXzUiLCJfaG9pc3RlZF83IiwiX21lcmdlUHJvcHMiLCJfd2l0aERpcmVjdGl2ZXMiLCJfaG9pc3RlZF84IiwiX2NvbXBvbmVudF9EaXRvTGFiZWwiLCJfY3JlYXRlVk5vZGUiLCJfY29tcG9uZW50X0RpdG9UYWJsZUNlbGwiLCJfY29tcG9uZW50X0RpdG9EcmFnZ2FibGUiLCJfY29tcG9uZW50X0RpdG9UcmVlSXRlbSIsImNoaWxkcmVuU2NoZW1hIiwiY2hpbGRyZW5MaXN0IiwiZWRpdFBhdGgiLCJjaGlsZHJlbk9wZW4iLCJudW1DaGlsZHJlbiIsImNyZWF0YWJsZSIsImVkaXRhYmxlIiwib3JkZXIiLCJjb2x1bW4iLCJyZW5kZXIiLCJlc2NhcGVIdG1sIiwiX19kZWZQcm9wIiwiX19nZXRPd25Qcm9wU3ltYm9scyIsIl9faGFzT3duUHJvcCIsIl9fcHJvcElzRW51bSIsIl9fZGVmTm9ybWFsUHJvcCIsIm9iaiIsIl9fc3ByZWFkVmFsdWVzIiwicHJvcCIsIl9fb2JqUmVzdCIsInVzZVNvcnRhYmxlIiwic29ydGFibGUiLCJkb2N1bWVudCIsImRlZmF1bHREb2N1bWVudCIsInJlc2V0T3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiZSIsIm1vdmVBcnJheUVsZW1lbnQiLCJTb3J0YWJsZSIsInN0b3AiLCJ0cnlPbk1vdW50ZWQiLCJ0cnlPblNjb3BlRGlzcG9zZSIsInRvVmFsdWUiLCJuZXh0VGljayIsIlVzZVNvcnRhYmxlIiwidXNlVk1vZGVsIiwiRGl0b1ZOb2RlIiwiRGl0b1R5cGVDb21wb25lbnQkMSIsIkRpdG9UeXBlQ29tcG9uZW50Iiwib25DbGljayIsIkRhdGFNaXhpbiIsInJlc29sdmVDb3VudGVyIiwiYXN5bmNFbnRyeSIsInJlc29sdmVkRGF0YSIsImxvYWQiLCJPcHRpb25zTWl4aW4iLCJjb252ZXJ0VmFsdWUiLCJjb252ZXJ0Iiwic2VhcmNoIiwiZmlsdGVyIiwiZGVib3VuY2UiLCJkZWJvdW5jZUFzeW5jIiwib3B0aW9uIiwiZ3JvdXBlZCIsInJlc3VsdHMiLCJncm91cCIsImZpbmRPcHRpb24iLCJncm91cEJ5Iiwib3B0aW9uVmFsdWUiLCJvcHRpb25MYWJlbCIsInByb2Nlc3NSZWxhdGUiLCJmbGFzayIsIkNvZGVGbGFzayIsImNoYW5nZWQiLCJpZ25vcmVXYXRjaCIsImlnbm9yZVVwZGF0ZSIsInNldENvZGUiLCJjb2RlIiwic2V0VmFsdWUiLCJTa2V0Y2hQaWNrZXIiLCJ0aW55Y29sb3IiLCJmb2N1c2VkIiwiRGF0ZVRpbWVQaWNrZXIiLCJTb3VyY2VNaXhpbiIsImRlZmF1bHRTb3J0IiwiZGlyZWN0aW9uIiwiZHJhZ2dhYmxlIiwiY29sbGFwc2libGUiLCJsaXN0RGF0YSIsIm9uQ29tcGxldGUiLCJvcGVuZWQiLCJjYWxsT25Db21wbGV0ZSIsImlubGluZWQiLCJwYXJhbSIsIm1ldGEiLCJmb3JtTWV0YSIsImNoaWxkUm91dGVzIiwiZ2V0UGF0aFdpdGhQYXJhbSIsInNvdXJjZVBhdGgiLCJmb3JtUm91dGUiLCJmbGF0Um91dGVzIiwic3ViUm91dGVzIiwiY2hpbGRSb3V0ZSIsImZpbHRlckNvbXBvbmVudHMiLCJkYXRlRm9ybWF0IiwiZ2V0RmlsdGVyc1BhbmVsIiwiZmlsdGVycyIsInByb3h5IiwicGFyc2VGaWx0ZXJzRGF0YSIsImdldEZpbHRlcnNDb21wb25lbnRzIiwiZm9ybWF0RmlsdGVyc0RhdGEiLCJjb21wcyIsImdldENvbXBvbmVudHNGb3JGaWx0ZXIiLCJmaWx0ZXJzRGF0YSIsIl9jb21wb25lbnRfRGl0b1RhYmxlSGVhZCIsIl9jb21wb25lbnRfRGl0b1NjaGVtYUlubGluZWQiLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJfY29tcG9uZW50X0RpdG9FZGl0QnV0dG9ucyIsIl9ob2lzdGVkXzkiLCJnZXRMaXN0Q29tcG9uZW50IiwiZmlsdGVyc0RhdGFQYXRoIiwiRWRpdG9yQ29udGVudCIsIkljb24iLCJlZGl0b3IiLCJtYXJrQnV0dG9ucyIsImJhc2ljTm9kZUJ1dHRvbnMiLCJvdGhlck5vZGVCdXR0b25zIiwidG9vbEJ1dHRvbnMiLCJlbmFibGVSdWxlcyIsInNldFZhbHVlRGVib3VuY2VkIiwib25VcGRhdGUiLCJFZGl0b3IiLCJnZXRQb2ludCIsIngiLCJ5IiwicHJldlkiLCJtb3VzZW1vdmUiLCJkaWFsb2dDb21wb25lbnQiLCJnZXRNYXJrQXR0cmlidXRlcyIsImhyZWYiLCJtYXJrcyIsIm5vZGVzIiwidG9vbHMiLCJEb2N1bWVudCIsIlRleHQiLCJQYXJhZ3JhcGgiLCJCb2xkIiwiSXRhbGljIiwiVW5kZXJsaW5lIiwiU3RyaWtlIiwiU21hbGwiLCJDb2RlIiwiTGlua1dpdGhUaXRsZSIsIkJsb2NrcXVvdGUiLCJDb2RlQmxvY2siLCJIYXJkQnJlYWsiLCJIZWFkaW5nIiwiSG9yaXpvbnRhbFJ1bGUiLCJMaXN0SXRlbSIsIkJ1bGxldExpc3QiLCJPcmRlcmVkTGlzdCIsIkhpc3RvcnkiLCJleHRlbnNpb24iLCJzZXR0aW5nc05hbWUiLCJkZXNjcmlwdGlvbnMiLCJhZGRCdXR0b24iLCJpY29uIiwiaWdub3JlQWN0aXZlIiwiZGVzY3JpcHRpb24iLCJzZXR0aW5nTmFtZSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJNYXJrIiwiY29tbWFuZHMiLCJMaW5rIiwibm9kZSIsIl9jb21wb25lbnRfVnVlTXVsdGlzZWxlY3QiLCJWdWVNdWx0aXNlbGVjdCIsInBsYWNlaG9sZGVyIiwic2VhcmNoYWJsZSIsInRhZ2dhYmxlIiwidGFnIiwiTnVtYmVyTWl4aW4iLCJTd2l0Y2hCdXR0b24iLCJtYXNrZWRQYXNzd29yZCIsImhhc0VkaXRhYmxlRm9ybXMiLCJmb3JtYXRGaWxlU2l6ZSIsImZpbGVzaXplIiwiVnVlVXBsb2FkIiwiYXNGaWxlcyIsImFjY2VwdCIsIm1heFNpemUiLCJwYXJzZUZpbGVTaXplIiwiZmlsZSIsIm5ld0ZpbGUiLCJvbGRGaWxlIiwieGhyIiwiZmlsZXMiLCJ1cGxvYWQiLCJsb2dnZWREZXByZWNhdGlvbnMiLCJkZXByZWNhdGUiLCJEaXRvQWRtaW4iLCJkaXRvIiwidmlld3MiLCJnZXRBcGlVcmwiLCJpc0FwaVVybCIsInZhbCIsInVzZXJzIiwicGFyZW50UGF0aCIsImFwcCIsImNyZWF0ZUFwcCIsIkRpdG9Sb290IiwiVnVlTm90aWZpY2F0aW9ucyIsImNyZWF0ZVJvdXRlciIsImNyZWF0ZVdlYkhpc3RvcnkiLCJSZXF1ZXN0RXJyb3IiLCJoZWFkZXJzIiwiaXNBYnNvbHV0ZVVybCIsImNvbWJpbmVVcmxzIiwiZm9ybWF0UXVlcnkiLCJiYXNlVXJsIiwicmVsYXRpdmVVcmwiXSwibWFwcGluZ3MiOiJtcEdBRUEsTUFBQUEsR0FBZUMsV0FBUyxDQUN0QixNQUFPLEdBQ1AsZ0JBQWlCLENBQUUsRUFDbkIsS0FBTSxLQUNOLFVBQVcsQ0FBRSxFQUNiLFlBQWEsS0FDYixjQUFlLElBQ2pCLENBQUMsRUNGTSxTQUFTQyxFQUFlQyxFQUFVQyxFQUFPLENBQzlDLE9BQU9ELEVBQ0gsR0FBR0EsS0FBWUMsSUFDZkEsQ0FDTixDQUVPLFNBQVNDLEdBQW9CRixFQUFVLENBQzVDLE1BQU1HLEVBQU9DLEVBQWEsY0FBQ0osQ0FBUSxFQUNuQyxPQUFBRyxHQUFBLE1BQUFBLEVBQU0sTUFDQ0EsQ0FDVCxDQU1PLFNBQVNFLEdBQWtCTCxFQUFVTSxFQUFTLEdBQU8sQ0FDMUQsT0FBT0EsRUFBU0osR0FBb0JGLENBQVEsRUFBSUksRUFBQUEsY0FBY0osQ0FBUSxDQUN4RSxDQUVPLFNBQVNPLEdBQWdCUCxFQUFVTSxFQUFTLEdBQU8sQ0FDeEQsT0FBT0Usb0JBQWtCSCxHQUFrQkwsRUFBVU0sQ0FBTSxDQUFDLENBQzlELENBRU8sU0FBU0csR0FBd0JULEVBQVVNLEVBQVMsR0FBTyxDQUNoRSxNQUFNSCxFQUFPRSxHQUFrQkwsRUFBVU0sQ0FBTSxFQUMvQyxHQUFJSCxFQUFNLENBR1IsSUFBSUYsRUFDSixHQUNFQSxFQUFRRSxFQUFLLElBQUssUUFDWEYsR0FBUyxNQUFRUyxZQUFVLENBQUNULENBQUssR0FFMUMsR0FBSUEsR0FBUyxLQUNYLE9BQU9FLEVBR1gsT0FBTyxJQUNULENBRU8sU0FBU1EsR0FBc0JYLEVBQVVNLEVBQVMsR0FBTyxDQUM5RCxPQUFPRSxvQkFBa0JDLEdBQXdCVCxFQUFVTSxDQUFNLENBQUMsQ0FDcEUsQ0FFTyxTQUFTTSxHQUFRQyxFQUFVYixFQUFVTSxFQUFTLEdBQU8sQ0FDMUQsTUFBTUgsRUFBT0UsR0FBa0JMLEVBQVVNLENBQU0sRUFDL0MsT0FBT0gsRUFBT1csRUFBa0IsbUJBQUNELEVBQVVWLENBQUksRUFBSSxJQUNyRCxDQUVPLFNBQVNZLEdBQWNGLEVBQVViLEVBQVVNLEVBQVMsR0FBTyxDQUNoRSxNQUFNSCxFQUFPTSxHQUF3QlQsRUFBVU0sQ0FBTSxFQUNyRCxPQUFPSCxFQUFPVyxFQUFrQixtQkFBQ0QsRUFBVVYsQ0FBSSxFQUFJLElBQ3JELENBRU8sU0FBU2EsR0FBcUJoQixFQUFVLENBQzdDLE1BQU1HLEVBQU9DLEVBQWEsY0FBQ0osQ0FBUSxFQUNuQyxPQUFPRyxFQUFLQSxFQUFLLE9BQVMsQ0FBQyxDQUM3QixDQUVPLFNBQVNjLEdBQW9CakIsRUFBVSxDQUM1QyxNQUFNQyxFQUFRZSxHQUFxQmhCLENBQVEsRUFDM0MsT0FBT0MsR0FBUyxNQUFRUyxFQUFBQSxVQUFVLENBQUNULENBQUssRUFBSSxLQUFPQSxDQUNyRCxDQUVPLFNBQVNpQixHQUFxQmxCLEVBQVUsQ0FDN0MsTUFBTUMsRUFBUWUsR0FBcUJoQixDQUFRLEVBQ3JDbUIsRUFBUWxCLEdBQVMsS0FBTyxLQUFPLENBQUNBLEVBQ3RDLE9BQU9TLFlBQVVTLENBQUssRUFBSUEsRUFBUSxJQUNwQyxDQUVBLElBQUlDLEdBQWMsRUFDWCxTQUFTQyxHQUFlQyxFQUFNQyxFQUFRLEtBQU0sQ0FFakRELEVBQUtDLENBQUssRUFBSSxJQUFJLEVBQUVILElBQ3RCLENBRU8sU0FBU0ksR0FBY0MsRUFBSSxDQUNoQyxNQUFPLEtBQUssS0FBS0EsQ0FBRSxDQUNyQixDQUVPLFNBQVNDLEdBQVlKLEVBQU1DLEVBQVEsS0FBTSxDQUU5QyxPQUFPRCxHQUFBLFlBQUFBLEVBQU9DLEtBQVUsTUFBUSxPQUFPLEtBQUtELENBQUksRUFBRSxTQUFXLENBQy9ELENDaEZBLEtBQU0sQ0FBRSxlQUFBSyxFQUFjLEVBQUssT0FBTyxVQVM1QkMsR0FBVyxJQUFJLFFBRXJCLFNBQVNDLEVBQUlDLEVBQVNDLEVBQUtDLEVBQWMsQ0FDdkMsTUFBTUMsRUFBU0wsR0FBUyxJQUFJTSxFQUFLLE1BQUNKLENBQU8sQ0FBQyxFQUNwQ0ssRUFBUUYsRUFBT0YsQ0FBRyxFQUV4QixPQUFPSSxJQUFVLFFBQWFSLEdBQWUsS0FBS00sRUFBUUYsQ0FBRyxFQUN6REksRUFDQUMsRUFBQUEsV0FBV0osQ0FBWSxFQUNyQkEsRUFBYyxFQUNkQSxDQUNSLENBRUEsU0FBU0ssR0FBSVAsRUFBU0MsRUFBS0ksRUFBTyxDQUNoQ1AsR0FBUyxJQUFJTSxFQUFLLE1BQUNKLENBQU8sQ0FBQyxFQUFFQyxDQUFHLEVBQUlJLENBQ3RDLENBRWUsTUFBTUcsQ0FBWSxDQUMvQixZQUFZQyxFQUFXVCxFQUFTLENBRTlCQSxFQUFVQSxFQUNOTSxFQUFBQSxXQUFXTixDQUFPLEVBQ2hCQSxFQUFTLEVBQ1QsQ0FBRSxHQUFHQSxDQUFTLEVBQ2hCLENBQUUsRUFHTkEsRUFBUSxTQUFSQSxFQUFRLE9BQVcsSUFDbkJBLEVBQVEsVUFBWVMsRUFJcEIsTUFBTU4sRUFBUyxPQUFPLGVBQWVILEVBQVNTLENBQVMsRUFFdkRYLEdBQVMsSUFBSSxLQUFNSyxDQUFNLENBQzFCLENBRUQsT0FBTyxJQUFJTSxFQUFXVCxFQUFTLENBQzdCLE9BQU9BLGFBQW1CUSxFQUN0QlIsRUFDQSxJQUFJUSxFQUFZQyxFQUFXVCxDQUFPLENBQ3ZDLENBSUQsSUFBSSxRQUFTLENBQ1gsT0FBT0QsRUFBSSxLQUFNLFNBQVUsRUFBSSxDQUNoQyxDQUVELElBQUksUUFBUyxDQUNYLE9BQU9BLEVBQUksS0FBTSxTQUFVLElBQUksQ0FDaEMsQ0FFRCxJQUFJLE9BQVEsQ0FDVixPQUFPQSxFQUFJLEtBQU0sUUFBUyxNQUFTLENBQ3BDLENBRUQsSUFBSSxVQUFXLENBQ2IsT0FBT0EsRUFBSSxLQUFNLFdBQVksRUFBRSxDQUNoQyxDQUVELElBQUksTUFBTyxDQUNULE9BQU9BLEVBQUksS0FBTSxPQUFRLElBQU1aLEdBQW9CLEtBQUssUUFBUSxDQUFDLENBQ2xFLENBRUQsSUFBSSxPQUFRLENBQ1YsT0FBT1ksRUFBSSxLQUFNLFFBQVMsSUFBTVgsR0FBcUIsS0FBSyxRQUFRLENBQUMsQ0FDcEUsQ0FFRCxJQUFJLGNBQWUsQ0FDakIsT0FBT1gsR0FBZ0IsS0FBSyxTQUFVLEtBQUssTUFBTSxDQUNsRCxDQUVELElBQUksb0JBQXFCLENBQ3ZCLE9BQU9JLEdBQXNCLEtBQUssU0FBVSxLQUFLLE1BQU0sQ0FDeEQsQ0FFRCxJQUFJLFdBQVksQ0FDZCxPQUFPTyxHQUFxQixLQUFLLFlBQVksQ0FDOUMsQ0FFRCxJQUFJLGlCQUFrQixDQUNwQixPQUFPQSxHQUFxQixLQUFLLGtCQUFrQixDQUNwRCxDQUtELElBQUksTUFBTyxDQUNULE9BQU9XLEVBQUksS0FBTSxPQUFRLElBQ3ZCakIsR0FBUSxLQUFLLFNBQVUsS0FBSyxTQUFVLEtBQUssTUFBTSxDQUNsRCxDQUNGLENBUUQsSUFBSSxZQUFhLENBQ2YsTUFBTTRCLEVBQ0p6QixHQUFjLEtBQUssU0FBVSxLQUFLLFNBQVUsS0FBSyxNQUFNLEdBQ3ZELEtBRUYsT0FBT3lCLElBQVMsS0FBSyxLQUFPQSxFQUFPLElBQ3BDLENBRUQsSUFBSSxVQUFXLENBQ2IsT0FBT1gsRUFBSSxLQUFNLFdBQVksSUFBSSxDQUNsQyxDQUVELElBQUksZUFBZ0IsQ0FDbEIsT0FBT0EsRUFBSSxLQUFNLGdCQUFpQixJQUFJLENBQ3ZDLENBRUQsSUFBSSxlQUFnQixDQUNsQixPQUFPQSxFQUFJLEtBQU0sZ0JBQWlCLElBQUksQ0FDdkMsQ0FFRCxJQUFJLE1BQU8sQ0FDVCxPQUFPQSxFQUFJLEtBQU0sT0FBUSxJQUFJLENBQzlCLENBRUQsSUFBSSxLQUFNLENBQ1IsT0FBT0EsRUFBSSxLQUFNLE1BQU8sSUFBSSxDQUM3QixDQUVELElBQUksT0FBUSxDQUNWLE9BQU9BLEVBQUksS0FBTSxRQUFTLElBQUksQ0FDL0IsQ0FFRCxJQUFJLFdBQVksQ0FDZCxPQUFPQSxFQUFJLEtBQU0sWUFBYSxJQUFJLENBQ25DLENBRUQsSUFBSSxXQUFZLENBQ2QsT0FBT0EsRUFBSSxLQUFNLFlBQWEsSUFBSSxDQUNuQyxDQUtELElBQUksV0FBWSxDQUNkLE9BQU9BLEVBQUksS0FBTSxZQUFhLElBQUksQ0FDbkMsQ0FXRCxJQUFJLGlCQUFrQixDQUNwQixPQUFPQSxFQUFJLEtBQU0sa0JBQW1CLElBQUksQ0FDekMsQ0FFRCxJQUFJLGVBQWdCLENBQ2xCLE9BQU9BLEVBQUksS0FBTSxnQkFBaUIsSUFBSSxDQUN2QyxDQUVELElBQUksZUFBZ0IsQ0FDbEIsT0FBT0EsRUFBSSxLQUFNLGdCQUFpQixJQUFJLENBQ3ZDLENBRUQsSUFBSSxpQkFBa0IsQ0FDcEIsT0FBT0EsRUFBSSxLQUFNLGtCQUFtQixJQUFJLENBQ3pDLENBRUQsSUFBSSxnQkFBaUIsQ0FDbkIsT0FBT0EsRUFBSSxLQUFNLGlCQUFrQixJQUFJLENBQ3hDLENBRUQsSUFBSSxtQkFBb0IsQ0FDdEIsT0FBT0EsRUFBSSxLQUFNLG9CQUFxQixJQUFJLENBQzNDLENBRUQsSUFBSSxpQkFBa0IsQ0FDcEIsT0FBT0EsRUFBSSxLQUFNLGtCQUFtQixJQUFJLENBQ3pDLENBSUQsSUFBSSxRQUFTLENBQ1gsT0FBT0EsRUFBSSxLQUFNLFNBQVUsTUFBUyxDQUNyQyxDQUVELElBQUksU0FBVSxDQUNaLE9BQU9BLEVBQUksS0FBTSxVQUFXLE1BQVMsQ0FDdEMsQ0FJRCxJQUFJLE9BQVEsQ0FDVixPQUFPQSxFQUFJLEtBQU0sUUFBUyxNQUFTLENBQ3BDLENBSUQsSUFBSSxPQUFRLENBQ1YsT0FBT0EsRUFBSSxLQUFNLFFBQVMsTUFBUyxDQUNwQyxDQUVELElBQUksYUFBYyxDQUNoQixPQUFPQSxFQUFJLEtBQU0sY0FBZSxFQUFLLENBQ3RDLENBSUQsSUFBSSxTQUFVLENBQ1osT0FBT1ksR0FBVyxLQUFLLFVBQVUsUUFBUUEsQ0FBTyxDQUNqRCxDQUVELElBQUksUUFBUyxDQUNYLE1BQU8sQ0FBQ04sRUFBT00sSUFBWSxLQUFLLFVBQVUsT0FBT04sRUFBT00sQ0FBTyxDQUNoRSxDQUVELElBQUksVUFBVyxDQUNiLE9BQU9DLEdBQVksS0FBSyxVQUFVLFNBQVNBLENBQVEsQ0FDcEQsQ0FFRCxJQUFJLFVBQVcsQ0FDYixPQUFPRCxHQUFXLEtBQUssVUFBVSxTQUFTQSxDQUFPLENBQ2xELENBRUQsSUFBSSxnQkFBaUIsQ0FDbkIsT0FBT0UsR0FBWSxLQUFLLFVBQVUsZUFBZUEsQ0FBUSxDQUMxRCxDQUVELElBQUksUUFBUyxDQUNYLE9BQU9GLEdBQVcsQ0FDaEIsS0FBSyxVQUFVLE9BQU9BLENBQU8sRUFDN0JKLEdBQUksS0FBTSxjQUFlLEVBQUksQ0FDOUIsQ0FDRixDQUNILENDL1BlLE1BQUFPLEdBQUEsQ0FDYixNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsSUFDWixDQUNGLEVBRUQsUUFBUyxDQU9QLEdBQUdDLEVBQU9DLEVBQVUsQ0FDbEIsR0FBSUMsRUFBQUEsUUFBUUYsQ0FBSyxFQUNmLFVBQVdHLEtBQU1ILEVBQ2YsS0FBSyxHQUFHRyxFQUFJRixDQUFRLFVBRWJHLEVBQUFBLGNBQWNKLENBQUssRUFDNUIsVUFBV2QsS0FBT2MsRUFDaEIsS0FBSyxHQUFHZCxFQUFLYyxFQUFNZCxDQUFHLENBQUMsTUFFcEIsQ0FDTCxNQUFNbUIsRUFBYSxLQUFLLFlBQUwsS0FBSyxVQUFjLE9BQU8sT0FBTyxJQUFJLEdBQ2xELENBQUUsVUFBQUMsQ0FBUyxFQUFNRCxFQUFBTCxLQUFBSyxFQUFBTCxHQUFxQixDQUMxQyxVQUFXLENBQUUsRUFDYixNQUFPLENBQUUsQ0FDbkIsR0FDUU0sRUFBVSxLQUFLTCxDQUFRLEVBRXpCLE9BQU8sSUFDUixFQUVELEtBQUtELEVBQU9DLEVBQVUsQ0FDcEIsTUFBTU0sRUFBSyxJQUFJQyxLQUNiLEtBQUssSUFBSVIsRUFBT08sQ0FBRSxFQUNYTixFQUFTLE1BQU0sS0FBTU8sQ0FBSSxHQUVsQyxPQUFBRCxFQUFHLFNBQVdOLEVBQ1AsS0FBSyxHQUFHRCxFQUFPTyxDQUFFLENBQ3pCLEVBRUQsSUFBSVAsRUFBT0MsRUFBVSxPQUNuQixHQUFJLENBQUMsVUFBVSxPQUViLE9BQU8sS0FBSyxrQkFDSEMsRUFBQUEsUUFBUUYsQ0FBSyxFQUN0QixVQUFXRyxLQUFNSCxFQUNmLEtBQUssSUFBSUcsRUFBSUYsQ0FBUSxVQUVkRyxFQUFBQSxjQUFjSixDQUFLLEVBQzVCLFVBQVdkLEtBQU9jLEVBQ2hCLEtBQUssSUFBSWQsRUFBS2MsRUFBTWQsQ0FBRyxDQUFDLE1BRXJCLENBRUwsTUFBTXVCLEdBQVFDLEVBQUEsS0FBSyxZQUFMLFlBQUFBLEVBQWlCVixHQUMvQixHQUFJUyxFQUNGLEdBQUksQ0FBQ1IsRUFFSCxPQUFPLEtBQUssVUFBVUQsQ0FBSyxNQUN0QixDQUVMLEtBQU0sQ0FBRSxVQUFBTSxDQUFTLEVBQUtHLEVBQ2hCbkMsRUFBUWdDLEVBQVUsVUFFdEJLLEdBQU1BLElBQU9WLEdBQVlVLEVBQUcsV0FBYVYsQ0FDMUMsRUFDRzNCLElBQVUsSUFDWmdDLEVBQVUsT0FBT2hDLEVBQU8sQ0FBQyxHQUtqQyxPQUFPLElBQ1IsRUFFRCxLQUFLMEIsS0FBVVEsRUFBTSxPQUVuQixNQUFNQyxHQUFRQyxFQUFBLEtBQUssWUFBTCxZQUFBQSxFQUFpQlYsR0FDL0IsR0FBSVMsRUFBTyxDQUNULEtBQU0sQ0FBRSxNQUFBRyxFQUFPLFVBQUFOLENBQVMsRUFBS0csRUFDN0IsT0FBTyxJQUFJLFFBQVFJLEdBQVcsQ0FDNUIsTUFBTUMsRUFBTyxTQUFZLENBR3ZCLE1BQU1MLEVBQVFHLEVBQU0sTUFBTyxFQUMzQixHQUFJSCxFQUFPLENBQ1QsSUFBSU0sRUFDSixVQUFXZCxLQUFZSyxFQUNyQixHQUFJLENBQ0YsTUFBTVUsRUFBTSxNQUFNZixFQUFTLE1BQU0sS0FBTVEsRUFBTSxJQUFJLEVBQzdDTyxJQUFRLFNBQ1ZELEVBQVNDLEVBRVosT0FBUUMsRUFBUCxDQUNBLFFBQVEsTUFDTixtQ0FBbUNqQixNQUNuQ2lCLENBQ0QsQ0FDRixDQUlIUixFQUFNLFFBQVFNLENBQU0sRUFDcEJELEVBQU0sRUFFVCxFQUNERixFQUFNLEtBQUssQ0FBRSxLQUFBSixFQUFNLFFBQUFLLENBQU8sQ0FBRSxFQUd4QkQsRUFBTSxTQUFXLEdBQ25CRSxFQUFNLENBRWxCLENBQVMsRUFFSixFQUdELGFBQWFkLEVBQU8sT0FDbEIsR0FBSUUsRUFBQUEsUUFBUUYsQ0FBSyxFQUFHLENBQ2xCLFVBQVdHLEtBQU1ILEVBQ2YsR0FBSSxDQUFDLEtBQUssYUFBYUcsQ0FBRSxFQUN2QixNQUFPLEdBR1gsT0FBT0gsRUFBTSxPQUFTLE1BRXRCLE9BQU8sQ0FBQyxHQUFDVSxFQUFBLEtBQUssWUFBTCxNQUFBQSxFQUFpQlYsR0FFN0IsRUFFRCxTQUFTQSxFQUFPa0IsRUFBUSxDQUN0QixHQUFJQSxFQUNGLEdBQUloQixFQUFBQSxRQUFRRixDQUFLLEVBQ2YsVUFBV0csS0FBTUgsRUFDZixLQUFLLFNBQVNHLEVBQUllLENBQU0sT0FHMUIsS0FBSyxHQUFHbEIsRUFBTyxJQUFJUSxJQUFTVSxFQUFPLEtBQUtsQixFQUFPLEdBQUdRLENBQUksQ0FBQyxFQUczRCxPQUFPLElBQ1IsQ0FDRixDQUNILEVDeklNVyxHQUFlLENBQ25CLFFBQVNDLEVBQVMsVUFDbEIsT0FBUUMsRUFBUSxTQUNoQixPQUFRQyxFQUFRLFNBQ2hCLEtBQU1DLEVBQU0sT0FDWixNQUFPckIsRUFBTyxRQUNkLE9BQVFzQixFQUFRLFNBQ2hCLE9BQVFDLEVBQVEsU0FDaEIsU0FBVWxDLEVBQVUsVUFDdEIsRUFrQ01tQyxHQUFpQixDQUNyQixRQS9CZ0JwQyxHQUFTLENBQUMsQ0FBQ0EsRUFnQzNCLE9BL0JlQSxHQUFTLENBQUNBLEVBZ0N6QixPQS9CZUEsR0FBUyxPQUFPQSxDQUFLLEVBZ0NwQyxLQTlCYUEsR0FDYmlDLEVBQUFBLE9BQU9qQyxDQUFLLEVBQ1JBLEVBQ0EsSUFBSSxLQUFLQSxDQUFLLEVBNEJsQixNQTFCY0EsR0FDZFksRUFBQUEsUUFBUVosQ0FBSyxFQUNUQSxFQUNBZ0MsRUFBQUEsU0FBU2hDLENBQUssRUFDWkEsRUFBTSxNQUFNLEdBQUcsRUFDZnFDLEVBQUFBLFFBQVFyQyxDQUFLLEVBc0JuQixPQXBCZUEsR0FDZmtDLEVBQUFBLFNBQVNsQyxDQUFLLEVBQ1ZBLEVBR0FBLElBQVUsR0FDUixDQUFFLEVBQ0YsS0FjTixPQVplQSxHQUNmbUMsRUFBQUEsU0FBU25DLENBQUssRUFDVkEsRUFDQSxJQUFJLE9BQU9BLENBQUssQ0FVdEIsRUFFTyxTQUFTc0MsR0FBZUMsRUFBT3ZDLEVBQU8sT0FFM0MsR0FBSXVDLEdBQVN2QyxHQUFTLE1BQ3BCLFVBQVd3QyxLQUFRRCxFQUNqQixJQUFJbkIsRUFBQVMsR0FBYVcsRUFBSyxRQUFsQixNQUFBcEIsRUFBQSxLQUFBUyxHQUEwQjdCLEdBQzVCLE1BQU8sR0FJYixNQUFPLEVBQ1QsQ0FFTyxTQUFTeUMsR0FBWUQsRUFBTXhDLEVBQU8sQ0FDdkMsTUFBTTBDLEVBQVlGLEdBQVFKLEdBQWVJLEVBQUssTUFBUUEsQ0FBSSxFQUMxRCxPQUFPRSxFQUFZQSxFQUFVMUMsQ0FBSyxFQUFJQSxDQUN4QyxDQzlFTyxTQUFTMkMsR0FBWUMsRUFBUSxDQUNsQyxNQUFPLENBQUMsQ0FBQ0MsRUFBWUQsRUFBTyxRQUFRLENBQ3RDLENBRU8sU0FBU0MsRUFBWXJDLEVBQVVzQyxFQUFXLEdBQUksT0FDbkQsS0FBTSxDQUFFLE9BQUFDLEVBQVEsR0FBR0MsQ0FBSSxFQUFLRixFQUM1QixPQUFBdEMsRUFBVzBCLEVBQVEsU0FBQzFCLENBQVEsRUFDeEIsQ0FBRSxHQUFHd0MsRUFBTSxHQUFHeEMsQ0FBVSxFQUN4QndCLEVBQUFBLFNBQVN4QixDQUFRLEVBQ2YsQ0FBRSxHQUFHd0MsRUFBTSxLQUFNeEMsQ0FBVSxFQUMzQixLQUlKQSxHQUNBdUMsSUFBVyxRQUNYdkMsRUFBUyxTQUFXLFFBQ3BCLEdBQUNZLEVBQUFaLEVBQVMsT0FBVCxNQUFBWSxFQUFlLFdBQVcsUUFFM0JaLEVBQVMsT0FBU3VDLEVBQ2J2QyxFQUFTLE9BQ1pBLEVBQVMsS0FBTyxNQUdiQSxDQUNULENBRU8sU0FBU3lDLEdBQWtCM0QsRUFBSWtCLEVBQVUsQ0FDOUMsT0FBT2xCLEdBQU0sT0FBUWtCLEdBQUEsWUFBQUEsRUFBVSxRQUFTLGFBQ3BDLENBQ0UsS0FBTSxTQUNOLEdBQUcwQyxFQUFNLE9BQ1AxQyxFQUNBLENBQUNSLEVBQU9KLElBQVEsQ0FBQyxTQUFVLE9BQVEsUUFBUSxFQUFFLFNBQVNBLENBQUcsQ0FDMUQsRUFDRCxHQUFJLEdBQUdOLEdBQ1IsRUFDRCxJQUNOLENDcEJlLE1BQUE2RCxHQUFBLENBQ2IsT0FBUSxDQUFDMUMsRUFBWSxFQUVyQixPQUFRLENBQ04sTUFDQSxTQUNBLFNBQ0EsZUFDQSxtQkFDQSxtQkFDQSxrQkFDQSxpQkFDQSxtQkFDQSxxQkFDQSxtQkFDQSxrQkFDQSxlQUNELEVBRUQsU0FBVSxDQUNSLE9BQU8sS0FBSyxhQUNSLENBQ0UsaUJBQWtCLElBQU0sS0FDeEIsZUFBZ0IsSUFBTSxJQUN2QixFQUNELENBQ0UsaUJBQWtCLElBQU0sSUFDekIsQ0FDTixFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsU0FBQS9DLEdBQ0EsVUFBVyxJQUNaLENBQ0YsRUFFRCxTQUFVLENBQ1IsY0FBZSxDQUViLE1BQU8sRUFDUixFQUVELGNBQWUsT0FDYixPQUFPMEQsRUFBQSxLQUFLLE9BQUwsWUFBQUEsRUFBVyxNQUNuQixFQUVELE1BQU8sQ0FDTCxPQUFPMUQsR0FBUyxJQUNqQixFQUtELE9BQVEsQ0FDTixPQUFPLEtBQUssT0FBUSxDQUNyQixFQUVELE9BQVEsQ0FDTixPQUFPLEtBQUssT0FBUSxDQUNyQixFQUVELGFBQWMsQ0FDWixPQUFPLEtBQUssYUFBYyxDQUMzQixFQUVELFFBQVMsQ0FDUCxPQUFPLEtBQUssSUFBSSxNQUNqQixFQUVELFNBQVUsQ0FDUixPQUFPLElBQUl5QyxFQUFZLEtBQU0sQ0FBRSxPQUFRLEVBQUssQ0FBRSxDQUMvQyxFQUVELGVBQWdCLENBQ2QsT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUN6QixFQUlELGlCQUFrQixDQUNoQixPQUFPLEtBQUssaUJBQWtCLENBQy9CLEVBRUQsaUJBQWtCLENBQ2hCLE9BQU8sS0FBSyxpQkFBa0IsQ0FDL0IsRUFFRCxnQkFBaUIsQ0FDZixPQUFPLEtBQUssZ0JBQWlCLENBQzlCLEVBRUQsZUFBZ0IsQ0FDZCxNQUFNQyxFQUFZLEtBQUssZUFDdkIsT0FBT0EsR0FBQSxNQUFBQSxFQUFXLE9BQVNBLEVBQVksSUFDeEMsRUFFRCxlQUFnQixDQUNkLE1BQU1BLEVBQVksS0FBSyxlQUN2QixPQUFPQSxHQUFBLE1BQUFBLEVBQVcsT0FBU0EsRUFBWSxJQUN4QyxFQUtELGVBQWdCLENBQ2QsT0FBTyxLQUFLLGFBQWUsS0FBTyxLQUFLLGVBQWdCLENBQ3hELEVBRUQsaUJBQWtCLENBQ2hCLE9BQU8sS0FBSyxpQkFBa0IsQ0FDL0IsRUFFRCxtQkFBb0IsQ0FDbEIsT0FBTyxLQUFLLG1CQUFvQixDQUNqQyxFQUVELGlCQUFrQixDQUNoQixPQUFPLEtBQUssaUJBQWtCLENBQy9CLEVBRUQsZ0JBQWlCLENBQ2YsT0FBTyxLQUFLLGdCQUFpQixDQUM5QixFQUVELGNBQWUsQ0FDYixPQUFPLEtBQUssY0FBZSxDQUM1QixFQUVELHVCQUF3QixPQUN0QixPQUFPZ0IsRUFBQSxLQUFLLGtCQUFMLFlBQUFBLEVBQXNCLGdCQUFnQixlQUM5QyxFQUVELHNCQUF1QixPQUNyQixPQUFPQSxFQUFBLEtBQUssaUJBQUwsWUFBQUEsRUFBcUIsZ0JBQWdCLGNBQzdDLEVBRUQscUJBQXNCLE9BQ3BCLE9BQU9BLEVBQUEsS0FBSyxnQkFBTCxZQUFBQSxFQUFvQixnQkFBZ0IsYUFDNUMsRUFJRCxVQUFXLE9BQ1QsT0FBT0EsRUFBQSxLQUFLLGdCQUFMLFlBQUFBLEVBQW9CLElBQzVCLENBQ0YsRUFFRCxjQUFlLENBQ2IsTUFBTWdDLEVBQU1DLEtBQ1osT0FBTyxlQUFlLEtBQU0sT0FBUSxDQUNsQyxLQUFNLENBQ0osT0FBT0QsQ0FDUixDQUNQLENBQUssQ0FDRixFQUVELFFBQVMsQ0FTUCxTQUFTeEQsRUFBSyxDQUNaLE9BQU8sS0FBSyxNQUFNQSxDQUFHLENBQ3RCLEVBRUQsU0FBU0EsRUFBS0ksRUFBTyxDQUNuQixZQUFLLE1BQU1KLENBQUcsRUFBSUksRUFDWEEsQ0FDUixFQUVELGNBQWNKLEVBQUssQ0FDakIsT0FBTyxLQUFLLFNBQVNBLENBQUcsR0FBSyxLQUFLLFNBQVNBLEVBQUtqQyxXQUFTLENBQUEsQ0FBRSxDQUFDLENBQzdELEVBRUQsZUFDRTJGLEVBQ0EsQ0FBRSxLQUFBZCxFQUFNLFFBQVNlLEVBQUssT0FBQVgsRUFBUyxLQUFLLE9BQVEsU0FBQWpDLEVBQVcsRUFBSSxFQUFLLENBQUUsRUFDbEUsQ0FDQSxNQUFNNEIsRUFBUUMsR0FBUUgsRUFBTyxRQUFDRyxDQUFJLEVBR2xDLElBQUl4QyxFQUFRNEMsRUFDUmhDLEVBQUFBLFFBQVEwQyxDQUFhLEVBQ25CM0UsRUFBQUEsbUJBQW1CaUUsRUFBUVUsRUFBZSxJQUFBLEVBQWUsRUFDekRWLEVBQU9VLENBQWEsRUFDdEIsT0FFSixHQUFJdEQsSUFBVSxRQUFhdUQsSUFBUSxPQUNqQyxPQUFJNUMsR0FBWVYsRUFBQUEsV0FBV3NELENBQUcsR0FBSyxDQUFDakIsR0FBZUMsRUFBT2dCLENBQUcsSUFFM0RBLEVBQU1BLEVBQUksS0FBSyxJQUFJLEdBRWRBLEVBR1QsR0FBSWpCLEdBQWVDLEVBQU92QyxDQUFLLEVBQzdCLE9BQU9BLEVBUVQsR0FKSVcsR0FBWVYsYUFBV0QsQ0FBSyxJQUM5QkEsRUFBUUEsRUFBTSxLQUFLLE9BQU8sR0FHeEJ1QyxHQUFTdkMsR0FBUyxNQUFRLENBQUNzQyxHQUFlQyxFQUFPdkMsQ0FBSyxFQUN4RCxVQUFXd0MsS0FBUUQsRUFBTyxDQUN4QixNQUFNaUIsRUFBWWYsR0FBWUQsRUFBTXhDLENBQUssRUFDekMsR0FBSXdELElBQWN4RCxFQUNoQixPQUFPd0QsRUFJYixPQUFPeEQsQ0FDUixFQUVELFNBQVM0QyxFQUFRYSxFQUFNLENBQ3JCLE9BQU9iLEVBQ0gsS0FBSyxlQUFlLFFBQVMsQ0FBRSxLQUFNLE9BQVEsT0FBQUEsRUFBUSxHQUNyRGMsV0FBU0QsR0FBUWIsRUFBTyxJQUFJLEVBQzVCYyxFQUFRLFNBQUNELENBQUksR0FBSyxFQUN2QixFQUVMLFNBQUlDLEVBQVEsU0FFUixvQkFBb0JELEVBQU1FLEVBQVEsQ0FDaEMsTUFBTUMsRUFBTyxLQUFLLE1BQU1ILENBQUksR0FBS0EsRUFDakMsTUFBTyxDQUNMLE1BQU8sZUFBZUcsSUFDdEIsT0FBT0QsR0FBQSxZQUFBQSxFQUFRLE9BQVFELEVBQUFBLFNBQVNFLENBQUksQ0FDckMsQ0FDRixFQUdELGFBQWFDLEVBQU8sQ0FDbEIsTUFBTyxDQUNMLE1BQUFBLEVBRUEsS0FBTSxLQUFLLE9BQU8sSUFDbkIsQ0FDRixFQUVELGFBQWFqQixFQUFTLEtBQU0sQ0FDMUIsT0FBTyxLQUFLLGVBQWUsS0FBTSxDQUMvQixLQUFNLFFBQ04sUUFBUyxHQUNULE9BQUFBLENBQ1IsQ0FBTyxDQUNGLEVBRUQsV0FBV0EsRUFBUyxLQUFNLENBQ3hCLE9BQU8sS0FBSyxlQUFlLFVBQVcsQ0FDcEMsS0FBTSxRQUNOLFFBQVMsR0FDVCxPQUFBQSxDQUNSLENBQU8sQ0FDRixFQUVELGNBQWNBLEVBQVMsS0FBTSxDQUMzQixPQUFPLEtBQUssZUFBZSxXQUFZLENBQ3JDLEtBQU0sUUFDTixRQUFTLEdBQ1QsT0FBQUEsQ0FDUixDQUFPLENBQ0YsRUFFRCxnQkFBZ0JwQyxFQUFVLE9BQ3hCLE9BQUFBLEVBQVdxQyxFQUFZckMsQ0FBUSxFQUczQkEsRUFBUyxTQUFXLFNBQ3RCQSxFQUFTLFFBQVNZLEVBQUEsS0FBSyxnQkFBTCxZQUFBQSxFQUFvQixVQUVqQyxLQUFLLElBQUksVUFBVSxJQUFJeUIsRUFBWXJDLENBQVEsQ0FBQyxDQUNwRCxFQUVELGVBQWVBLEVBQVUsQ0FDdkIsTUFBTXNELEVBQU0sS0FBSyxnQkFBZ0J0RCxDQUFRLEVBQ3pDLE9BQU9zRCxFQUFNLEtBQUssSUFBSSxVQUFVLENBQUUsSUFBQUEsRUFBSyxNQUFPdEQsRUFBUyxLQUFPLENBQUEsRUFBSSxJQUNuRSxFQUVELE1BQU0sWUFBWSxDQUFFLE9BQUF1RCxFQUFRLElBQUFELEVBQUssU0FBQXRELEVBQVUsTUFBQXFELEVBQU8sS0FBQTFFLEVBQU0sU0FBQTZFLEdBQVksQ0FDbEVGLE1BQVEsS0FBSyxnQkFBZ0J0RCxDQUFRLEdBQ3JDdUQsTUFBV3ZELEdBQUEsWUFBQUEsRUFBVSxRQUNyQixNQUFNeUQsRUFBWSxDQUFDRCxHQUFZLEtBQUssSUFBSSxTQUFTRixDQUFHLEVBQ2hERyxHQUNGLE1BQU0sS0FBSyxjQUFjLFdBQVksRUFFdkMsTUFBTUMsRUFBVyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUUsT0FBQUgsRUFBUSxJQUFBRCxFQUFLLEtBQUEzRSxFQUFNLE1BQUEwRSxFQUFPLEVBRXBFLE9BQ0VJLEdBQ0FGLElBQVcsU0FDWEksU0FBTzNELEVBQVV5QyxHQUFrQixLQUFLLEtBQUssR0FBSSxLQUFLLElBQUksS0FBSyxDQUFDLEdBRWhFLE1BQU0sS0FBSyxjQUFjLFVBQVcsRUFFL0JpQixDQUNSLEVBRUQsV0FBVyxDQUFFLFdBQUFFLEVBQVksUUFBQUMsRUFBUyxLQUFBbEYsRUFBTSxTQUFBbUYsQ0FBUSxFQUFJLENBQ2xELE9BQU8sS0FBSyxjQUFjLFdBQVcsQ0FDbkMsV0FBQUYsRUFDQSxRQUFBQyxFQUNBLEtBQUFsRixFQUNBLFNBQUFtRixDQUNSLENBQU8sQ0FDRixFQUVELFFBQVEsQ0FBRSxNQUFBQyxFQUFPLEdBQUdqRSxHQUFXLENBSzdCLE1BQU1rRSxFQUNKRCxHQUNBLENBQ0UsT0FBUSxLQUFLLFNBQ2IsTUFBTyxLQUFLLGFBQ2IsRUFBQ0EsQ0FBSyxFQUVIRSxFQUFZRCxHQUFBLFlBQUFBLEVBQWEsVUFFekJFLEVBQ0pELEdBQ0EsR0FDRW5FLEVBQVEsUUFBVSxTQUVsQkEsRUFBUSxPQUlSLEtBQUssVUFBVUEsRUFBUSxPQUFTQSxFQUFRLFFBQVUsRUFBRSxLQUVwRCxLQUFLLFVBQVVBLEVBQVEsTUFBUSxFQUFFLElBR3JDLEdBQUltRSxHQUFjQyxLQUFZRCxFQUM1QixPQUFPQSxFQUFVQyxDQUFRLEVBSTNCLE1BQU1oRCxFQUFNLEtBQUssWUFBWXBCLENBQU8sRUFDakMsS0FBSzRELEdBQVlBLEVBQVMsSUFBSSxFQUM5QixNQUFNdkMsR0FBUyxPQUVkLE1BQU14QyxHQUFPaUMsRUFBQU8sRUFBTSxXQUFOLFlBQUFQLEVBQWdCLEtBQzdCLE1BQU1qQyxFQUNGLE9BQU8sT0FBTyxJQUFJLE1BQU1BLEVBQUssT0FBTyxFQUFHQSxDQUFJLEVBQzNDd0MsQ0FDZCxDQUFTLEVBQ0gsT0FBSThDLElBQ0ZBLEVBQVVDLENBQVEsRUFBSWhELEdBRWpCQSxDQUNSLEVBRUQsT0FBTzFCLEVBQU8sQ0FDWixPQUFBMkUsRUFBUyxLQUFLLElBQUksT0FDbEIsU0FBQTdCLEVBQVcsS0FBSyxJQUFJLFFBQ3BCLEdBQUd4QyxDQUNKLEVBQUcsR0FBSSxDQUNOLE9BQU9zRSxFQUFBQSxPQUFPNUUsRUFBTyxDQUNuQixPQUFBMkUsRUFDQSxTQUFBN0IsRUFDQSxHQUFHeEMsQ0FDWCxDQUFPLENBQ0YsRUFFRCxNQUFNLFNBQVNDLEVBQVUsQ0FDdkIsT0FBTyxLQUFLLFFBQVEsS0FBS0EsQ0FBUSxDQUNsQyxFQUVELFNBQVNELEVBQVUsR0FBSSxDQUNqQjBCLEVBQUFBLFNBQVMxQixDQUFPLElBQ2xCQSxFQUFVLENBQUUsSUFBS0EsQ0FBUyxHQUc1QixNQUFNdUUsRUFBSSxTQUFTLGNBQWMsR0FBRyxFQUNwQ0EsRUFBRSxLQUFPLEtBQUssSUFBSSxVQUFVdkUsQ0FBTyxFQUNuQ3VFLEVBQUUsU0FBV3ZFLEVBQVEsVUFBWSxLQUNqQyxLQUFNLENBQUUsS0FBQXdFLENBQUksRUFBSyxTQUNqQkEsRUFBSyxZQUFZRCxDQUFDLEVBQ2xCQSxFQUFFLE1BQU8sRUFDVEMsRUFBSyxZQUFZRCxDQUFDLENBQ25CLEVBRUQsT0FBT3ZFLEVBQVMsQ0FDZCxLQUFLLGNBQWMsT0FBT0EsQ0FBTyxDQUNsQyxFQUVELG9CQUFxQixDQUNuQixLQUFLLGNBQWMsbUJBQW9CLENBQ3hDLEVBRUQsbUJBQW9CLENBQ2xCLEtBQUssYUFBYyxFQUNuQixLQUFLLGNBQWUsRUFDcEIsS0FBSyxZQUFhLENBQ25CLEVBRUQsY0FBZSxDQUNiLFNBQVcsQ0FBQ1YsRUFBS0ksQ0FBSyxJQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sU0FBVyxDQUFBLENBQUUsRUFDN0RDLEVBQUFBLFdBQVdELENBQUssRUFDbEIsS0FBS0osQ0FBRyxFQUFJSSxFQUVaLFFBQVEsTUFBTSw4QkFBOEJKLE1BQVFJLEdBQU8sQ0FHaEUsRUFFRCxlQUFnQixDQUNkLFNBQVcsQ0FBQ0osRUFBS0ksQ0FBSyxJQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sVUFBWSxDQUFBLENBQUUsRUFBRyxDQUNyRSxNQUFNK0UsRUFBVzlFLEVBQVUsV0FBQ0QsQ0FBSyxFQUM3QixDQUFFLElBQUtBLENBQU8sRUFDZGtDLEVBQUFBLFNBQVNsQyxDQUFLLEdBQUtDLGFBQVdELEVBQU0sR0FBRyxFQUNyQ0EsRUFDQSxLQUNGK0UsRUFDRixPQUFPLGVBQWUsS0FBTW5GLEVBQUttRixDQUFRLEVBRXpDLFFBQVEsTUFDTix5Q0FBeUNuRixNQUFRSSxHQUNsRCxFQUdOLEVBRUQsYUFBYyxDQUNaLEtBQU0sQ0FBRSxNQUFBZ0YsRUFBTyxPQUFBQyxDQUFRLEVBQUcsS0FBSyxPQUMvQixHQUFJRCxFQUFPLENBQ1QsTUFBTUUsRUFBV2pGLEVBQUFBLFdBQVcrRSxDQUFLLEVBQUlBLEVBQU0sS0FBSyxJQUFJLEVBQUlBLEVBQ3BEOUMsRUFBQUEsU0FBU2dELENBQVEsR0FHbkIsS0FBSyxVQUFVLElBQU0sQ0FDbkIsU0FBVyxDQUFDdEYsRUFBS2UsQ0FBUSxJQUFLLE9BQU8sUUFBUXVFLENBQVEsRUFBRyxDQUV0RCxNQUFNQyxFQUFPLEtBQUssZ0JBQWdCLG1CQUFtQnZGLENBQUcsRUFDcEQsUUFBUUEsSUFDUkEsRUFDSixLQUFLLE9BQU91RixFQUFNeEUsQ0FBUSxFQUV4QyxDQUFXLEVBSUwsTUFBTXlFLEVBQVcsQ0FBQ3hGLEVBQUtjLEVBQU9DLElBQWEsQ0FDckNWLEVBQUFBLFdBQVdVLENBQVEsRUFDckIsS0FBSyxHQUFHMEUsRUFBQUEsVUFBVTNFLENBQUssRUFBR0MsQ0FBUSxFQUVsQyxRQUFRLE1BQU0sNkJBQTZCZixNQUFRZSxHQUFVLENBRWhFLEVBRUQsR0FBSXNFLEVBQ0YsU0FBVyxDQUFDckYsRUFBS0ksQ0FBSyxJQUFLLE9BQU8sUUFBUWlGLENBQU0sRUFDOUNHLEVBQVN4RixFQUFLQSxFQUFLSSxDQUFLLEVBTTVCLFNBQVcsQ0FBQ0osRUFBS0ksQ0FBSyxJQUFLLE9BQU8sUUFBUSxLQUFLLE1BQU0sRUFDL0MsV0FBVyxLQUFLSixDQUFHLEdBQ3JCd0YsRUFBU3hGLEVBQUtBLEVBQUksTUFBTSxDQUFDLEVBQUdJLENBQUssQ0FHdEMsRUFFRCxNQUFNLFVBQVVVLEVBQU8sQ0FDckIsUUFBQWYsRUFBVSxLQUNWLE9BQUFvRCxFQUFTLElBQ1YsRUFBRyxHQUFJLENBQ04sTUFBTXVDLEVBQWUsS0FBSyxhQUFhNUUsQ0FBSyxFQUN0QzZFLEVBQXFCeEMsR0FBQSxZQUFBQSxFQUFRLGFBQWFyQyxHQUNoRCxHQUFJNEUsR0FBZ0JDLEVBQW9CLENBS2xDLENBQUMsT0FBUSxRQUFRLEVBQUUsU0FBUzdFLENBQUssR0FDbkMsTUFBTSxLQUFLLFVBQVcsRUFHeEIsTUFBTThFLEVBQWEsSUFBTzdGLEVBQVVRLEVBQVksSUFBSSxLQUFNUixDQUFPLEVBQzNEK0IsRUFBTTRELEVBQ1IsTUFBTSxLQUFLLEtBQUs1RSxFQUFPOEUsRUFBVSxDQUFFLEVBQ25DLE9BRUosT0FBSUQsR0FBc0I3RCxJQUFRLElBQ2hDcUIsRUFBTyxLQUFLckMsRUFBTzhFLEdBQVksRUFFMUI5RCxFQUVWLEVBRUQsZ0JBQWdCaEIsRUFBTytFLEVBQVEsQ0FDN0IsT0FBTyxLQUFLLGdCQUFnQixVQUFVL0UsRUFBTytFLENBQU0sQ0FDcEQsQ0FDRixDQUNILEVBRUEsSUFBSXBDLEdBQVUsMEVDN2dCWSxDQUN4QixTQUFVckQsR0FBUzBGLEVBQVksYUFBQzFGLENBQUssRUFDckMsUUFBUyxZQUNYLFdDTHdCLENBQ3RCLFNBQVUsQ0FBQ0EsRUFBTzJGLElBQWEsQ0FDN0IsTUFBTUMsRUFBUUQsSUFBYSxJQUFNLElBQU0sTUFBTUEsS0FDN0MsT0FBTyxJQUFJLE9BQU8sb0JBQW9CQyxNQUFVLEVBQUUsS0FBSzVGLENBQUssQ0FDN0QsRUFFRCxRQUFTLENBQUNBLEVBQU8yRixJQUNmLG1DQUNFLENBQUNBLEdBQVlBLElBQWEsSUFBTSxHQUFLQSxrQkFFM0MsU0NSc0IsQ0FDcEIsU0FBVTNGLEdBQVM2RixFQUFRLFNBQUM3RixDQUFLLEVBQ2pDLFFBQVMsaUJBQ1gsUUNIcUIsQ0FDbkIsU0FBVUEsR0FBUzhGLEVBQU8sUUFBQzlGLENBQUssRUFDaEMsUUFBUyx1QkFDWCxXQ0h3QixDQUN0QixTQUFVQSxHQUFTK0YsRUFBVSxXQUFDL0YsQ0FBSyxFQUNuQyxRQUFTLG9CQUNYLFVDSHVCLENBQ3JCLFNBQVVBLEdBQVN6QixFQUFTLFVBQUN5QixDQUFLLEVBQ2xDLFFBQVMsc0JBQ1gsTUNMbUIsQ0FDakIsU0FBVSxDQUFDQSxFQUFPZ0csSUFBUWhHLEdBQVNnRyxFQUNuQyxRQUFRaEcsRUFBT2dHLEVBQUssQ0FDbEIsTUFBTyxXQUFXQSxXQUNuQixDQUNILE1DTG1CLENBQ2pCLFNBQVUsQ0FBQ2hHLEVBQU9pRyxJQUFRakcsR0FBU2lHLEVBQ25DLFFBQVFqRyxFQUFPaUcsRUFBSyxDQUNsQixNQUFPLFdBQVdBLFdBQ25CLENBQ0gsV0NMd0IsQ0FHdEIsU0FBVSxJQUFNLEVBQ2xCLFFDSnFCLENBQ25CLFNBQVUsQ0FBQ2pHLEVBQU8sQ0FBQ2lHLEVBQUtELENBQUcsSUFBTWhHLEdBQVNpRyxHQUFPakcsR0FBU2dHLEVBQzFELFFBQVFoRyxFQUFPLENBQUNpRyxFQUFLRCxDQUFHLEVBQUcsQ0FDekIsTUFBTyxtQkFBbUJDLFNBQVdELEdBQ3RDLENBQ0gsV0NMd0IsQ0FDdEIsU0FBVSxDQUFDaEcsRUFBT3NFLEVBQVUsQ0FBRSxTQUFBNEIsQ0FBVSxJQUNyQ2xHLEdBQVMsTUFBUUEsSUFBVSxJQUczQmtHLEdBQVlsRyxJQUFVLE9BRXpCLFFBQVMsY0FDVCxRQUFTLEVBQ1gsTUNQbUIsQ0FDakIsU0FBVUEsR0FBU21HLEVBQUssTUFBQ25HLENBQUssRUFDOUIsUUFBUyxvQkFDWCx5Q0NEZW9HLEdBQUEsQ0FDYixNQUFPLENBQUMsUUFBUSxFQUVoQixNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsR0FDWCxRQUFTLEdBQ1QsWUFBYSxHQUNiLFFBQVMsR0FDVCxPQUFRLElBQ1QsQ0FDRixFQUVELFFBQVMsQ0FDUCxpQkFBa0IsQ0FDaEIsS0FBSyxVQUFZLEdBQ2pCLEtBQUssUUFBVSxHQUNmLEtBQUssWUFBYyxHQUNuQixLQUFLLFFBQVUsR0FDZixLQUFLLFlBQWEsQ0FDbkIsRUFFRCxTQUFTQyxFQUFTLEdBQU0sQ0FDdEIsSUFBSUMsRUFBVSxHQUNWRCxHQUNGLEtBQUssWUFBYSxFQUVwQixLQUFNLENBQUUsTUFBQXJHLENBQUssRUFBSyxLQUVsQixTQUFXLENBQUN1RyxFQUFNQyxDQUFPLElBQUssT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFHLENBRTlELE1BQU1DLEVBQVlDLEdBQVlILENBQUksRUFDbEMsR0FBSUUsSUFBY0EsRUFBVSxTQUFXekcsR0FBUyxNQUFPLENBQ3JELEtBQU0sQ0FBRSxTQUFBMkcsRUFBVSxRQUFBQyxDQUFPLEVBQUtILEVBQzlCLEdBQUksQ0FBQ0UsRUFBUzNHLEVBQU93RyxFQUFTLEtBQUssV0FBVyxJQUM1Q0YsRUFBVSxHQUNORCxHQUFRLENBQ1YsTUFBTTFFLEVBQVExQixFQUFVLFdBQUMyRyxDQUFPLEVBQzVCQSxFQUFRNUcsRUFBT3dHLEVBQVMsSUFBSSxFQUM1QkksRUFDSixLQUFLLFNBQVNqRixFQUFPLEVBQUksSUFLakMsT0FBSTBFLElBQ0YsS0FBSyxZQUFjLEdBQ25CLEtBQUssUUFBVUMsR0FFVkEsQ0FDUixFQUVELFFBQVMsQ0FDUCxPQUFPLEtBQUssU0FBUyxFQUFLLENBQzNCLEVBRUQsYUFBYyxDQUNaLEtBQUssVUFBWSxFQUNsQixFQUVELFdBQVksQ0FDVixLQUFLLFFBQVUsR0FDZixLQUFLLFlBQWMsR0FDbkIsS0FBSyxRQUFVLEdBRWYsS0FBSyxZQUFhLENBQ25CLEVBRUQsU0FBUzNFLEVBQU9rRixFQUFXLEdBQU8sQ0FDaEMsS0FBSyxTQUFMLEtBQUssT0FBVyxDQUFFLEdBQ2RBLElBRUZsRixFQUFRLE9BRE0sS0FBSyxPQUFTLEtBQUssYUFBZSxLQUFLLGNBQ3ZCQSxNQUVoQyxLQUFLLE9BQU8sS0FBS0EsQ0FBSyxFQUN0QixLQUFLLE1BQU0sU0FBVSxLQUFLLE1BQU0sQ0FDakMsRUFFRCxxQkFBcUJtRixFQUFRQyxFQUFPLENBRWxDLEtBQUssT0FBUyxDQUFFLEVBQ2hCLFNBQVcsQ0FBRSxRQUFBSCxDQUFTLElBQUlFLEVBQ3hCLEtBQUssU0FBU0YsRUFBUyxFQUFJLEVBRTdCLE9BQUlHLEdBQ0YsS0FBSyxNQUFPLEVBRVAsRUFDUixFQUVELFdBQVksQ0FDVixPQUFPLEtBQUssT0FBUyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUksSUFDekMsRUFFRCxhQUFjLENBQ1osS0FBSyxPQUFTLEtBQ2QsS0FBSyxNQUFNLFNBQVUsS0FBSyxNQUFNLENBQ2pDLENBQ0YsQ0FDSCxFQ2hHTyxTQUFTQyxFQUNkMUQsRUFDQSxDQUFFLEtBQUFkLEVBQU0sUUFBU2UsRUFBSyxJQUFBN0QsRUFBSyxJQUFBUSxFQUFLLFNBQUFTLEVBQVcsRUFBSSxFQUFLLENBQUUsRUFDdEQsQ0FHSXFCLEVBQUFBLFNBQVNzQixDQUFhLEdBQUtBLEVBQWMsU0FBUyxHQUFHLElBQ3ZEQSxFQUFnQnJGLEVBQWEsY0FBQ3FGLENBQWEsR0FHN0MsTUFBTUcsRUFBT3BGLEVBQWlCLGtCQUFDaUYsQ0FBYSxFQUM1QyxNQUFPLENBQ0wsS0FBTSxDQUdKLE1BQU10RCxFQUNKLENBQUNOLEdBQU9BLEVBQUksT0FBUyxFQUlqQixLQUFLLFdBQWErRCxLQUFRLEtBQUssVUFDN0IsS0FBSyxVQUFVQSxDQUFJLEVBQ25CLEtBQUssZUFBZUgsRUFBZSxDQUNqQyxLQUFBZCxFQUNBLFFBQVNlLEVBQ1QsU0FBQTVDLENBQ2hCLENBQWUsRUFDSCxPQUNOLE9BQU9qQixFQUFNQSxFQUFJLEtBQUssS0FBTU0sQ0FBSyxFQUFJQSxDQUN0QyxFQUVELElBQUlBLEVBQU8sQ0FDTEUsRUFDRkEsRUFBSSxLQUFLLEtBQU1GLENBQUssR0FFcEIsS0FBSyxZQUFMLEtBQUssVUFBYyxDQUFFLEdBQ3JCLEtBQUssVUFBVXlELENBQUksRUFBSXpELEVBRTFCLENBQ0YsQ0FDSCxDQUVPLFNBQVNpSCxHQUFpQnhELEVBQU0sQ0FBRSxRQUFTRixFQUFLLElBQUE3RCxFQUFLLElBQUFRLENBQUssRUFBRyxHQUFJLENBQ3RFLE1BQU8sQ0FDTCxLQUFNLENBQ0osSUFBSUYsRUFBUSxLQUFLLFNBQVN5RCxDQUFJLEVBQzlCLE9BQUl6RCxJQUFVLFFBQWF1RCxJQUFRLFNBRWpDdkQsRUFBUUMsRUFBVSxXQUFDc0QsQ0FBRyxFQUFJQSxFQUFJLEtBQUssSUFBSSxFQUFJQSxFQUUzQyxLQUFLRSxDQUFJLEVBQUl6RCxFQUViLEtBQUssU0FBU3lELENBQUksR0FJYi9ELEVBQU1BLEVBQUksS0FBSyxLQUFNTSxDQUFLLEVBQUlBLENBQ3RDLEVBRUQsSUFBSUEsRUFBTyxFQUdMLENBQUNFLElBQVFGLEVBQVFFLEVBQUksS0FBSyxLQUFNRixDQUFLLEtBQU8sU0FDOUMsS0FBSyxTQUFTeUQsRUFBTXpELENBQUssQ0FFNUIsQ0FDRixDQUNILENDbEVlLE1BQUFrSCxFQUFBLENBQ2IsT0FBUSxDQUFDZCxFQUFlLEVBRXhCLE1BQU8sQ0FDTCxPQUFRLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUd4QyxTQUFVLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUMxQyxLQUFNLENBQUUsS0FBTSxDQUFDLE9BQVEsS0FBSyxFQUFHLFNBQVUsRUFBTSxFQUMvQyxLQUFNLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN0QyxNQUFPLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN2QyxPQUFRLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN6QyxPQUFRLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxDQUM1QyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsWUFBYSxLQUNiLFFBQVMsRUFDVixDQUNGLEVBRUQsU0FBVSxDQUNSLE1BQU8sQ0FDTCxPQUFPLEtBQUssT0FBTyxJQUNwQixFQUVELE1BQU8sQ0FDTCxPQUFPLEtBQUssT0FBTyxJQUNwQixFQUVELFNBQVUsQ0FDUixPQUFPLElBQUlqRyxFQUFZLEtBQU0sQ0FBRSxPQUFRLEtBQUssT0FBUSxDQUNyRCxFQUVELE1BQU8sQ0FDTCxLQUFNLENBQ0osTUFBTUgsRUFBUW1ILEdBQ1osS0FBSyxPQUNMLEtBQUssS0FDTCxLQUFLLEtBQ0wsS0FBSyxTQUNMLENBQUUsVUFBVyxJQUFNLENBQ3BCLEVBQ0ssQ0FBRSxPQUFBdkMsR0FBVyxLQUFLLE9BR3hCLE9BQU9BLEVBQ0hBLEVBQU8sS0FBSyxLQUFNLElBQUl6RSxFQUFZLEtBQU0sQ0FBRSxNQUFBSCxDQUFLLENBQUUsQ0FBQyxFQUNsREEsQ0FDTCxFQUVELElBQUlBLEVBQU8sQ0FDVCxLQUFNLENBQUUsTUFBQW9ILEdBQVUsS0FBSyxPQUd2QixLQUFLLFlBQWNBLEVBQ2ZBLEVBQU0sS0FBSyxLQUFNLElBQUlqSCxFQUFZLEtBQU0sQ0FBRSxNQUFBSCxDQUFLLENBQUUsQ0FBQyxFQUNqREEsRUFFSixLQUFLLEtBQUssS0FBSyxJQUFJLEVBQUksS0FBSyxXQUM3QixDQUNGLEVBRUQsWUFBYSxDQUNYLE1BQU1iLEVBQU9QLEdBQWMsS0FBSyxTQUFVLEtBQUssU0FBVSxLQUFLLE1BQU0sRUFDcEUsT0FBT08sSUFBUyxLQUFLLEtBQU9BLEVBQU8sSUFDcEMsRUFFRCxlQUFnQixDQUlkLEtBQU0sQ0FBRSxnQkFBQWtJLENBQWUsRUFBSyxLQUM1QixPQUFPNUksR0FDTDRJLEVBQWdCLGNBRWhCLEtBQUssU0FBUyxNQUFNQSxFQUFnQixTQUFTLE1BQU0sRUFDbkQsS0FBSyxNQUNOLENBQ0YsRUFJRCxNQUFPLENBQ0wsT0FBTyxLQUFLLElBQ2IsRUFFRCxZQUFhLENBQ1gsT0FBTyxLQUFLLFVBQ2IsRUFFRCxVQUFXLENBQ1QsT0FBTyxLQUFLLFFBQ2IsRUFFRCxlQUFnQixDQUNkLE9BQU8sS0FBSyxhQUNiLEVBRUQsTUFBT0wsRUFBa0IsUUFBUyxDQUNoQyxLQUFNLENBQUMsT0FBUSxPQUFPLEVBQ3RCLElBQUlNLEVBQU8sQ0FDVCxPQUFPdEYsRUFBQUEsU0FBU3NGLENBQUssRUFDakJBLEVBQ0FBLElBQVUsSUFBUyxLQUFLLFNBQVMsY0FDL0IsS0FBSyxTQUFTLEtBQUssTUFBTSxFQUN6QixJQUNQLENBQ1AsQ0FBSyxFQUVELE1BQU9OLEVBQWtCLFFBQVMsQ0FDaEMsS0FBTSxDQUFDLE9BQVEsTUFBTSxDQUMzQixDQUFLLEVBRUQsUUFBU0EsRUFBa0IsVUFBVyxDQUNwQyxLQUFNLFFBQ04sU0FBVSxDQUNSLE9BQU8sS0FBSyxTQUFTLGNBQ3RCLENBQ1AsQ0FBSyxFQUdELFFBQVNBLEVBQWtCLFVBQVcsQ0FDcEMsS0FBTSxRQUNOLFFBQVMsRUFDZixDQUFLLEVBRUQsU0FBVUEsRUFBa0IsV0FBWSxDQUN0QyxLQUFNLFFBQ04sUUFBUyxFQUNmLENBQUssRUFHRCxTQUFVQSxFQUFrQixXQUFZLENBQ3RDLEtBQU0sUUFDTixRQUFTLEVBQ2YsQ0FBSyxFQUVELFVBQVdBLEVBQWtCLFlBQWEsQ0FDeEMsS0FBTSxRQUNOLFFBQVMsRUFDZixDQUFLLEVBR0QsVUFBV0EsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxFQUNmLENBQUssRUFFRCxZQUFhQSxFQUFrQixjQUFlLENBQzVDLEtBQU0sTUFDWixDQUFLLEVBRUQsYUFBY0EsRUFBa0IsZUFBZ0IsQ0FDOUMsS0FBTSxNQUNaLENBQUssRUFHRCxRQUFTLENBQ1AsS0FBTSxDQUFFLFFBQUFPLEVBQVMsT0FBQUMsRUFBUSxRQUFBQyxFQUFTLFNBQUFDLENBQVUsRUFBRyxLQUMvQyxNQUFPLENBQUUsUUFBQUgsRUFBUyxPQUFBQyxFQUFRLFFBQUFDLEVBQVMsU0FBQUMsQ0FBVSxDQUM5QyxFQUVELFlBQWEsQ0FDWCxLQUFNLENBQUUsWUFBQUMsRUFBYSxVQUFBQyxDQUFXLEVBQUcsS0FBSyxTQUVsQ0MsRUFBYSxDQUNqQixHQUFHLEtBQUssT0FDUixTQUFVLEtBQUssUUFDaEIsRUFFRCxPQUFJRixJQUNGRSxFQUFXLEtBQU8sS0FBSyxLQUNuQixLQUFLLFFBQ1BBLEVBQVcsTUFBUSxLQUFLLE9BRTFCQSxFQUFXLFNBQVcsS0FBSyxTQUMzQkEsRUFBVyxVQUFZLEtBQUssVUFDeEJELElBQ0ZDLEVBQVcsWUFBYyxLQUFLLFlBQzlCQSxFQUFXLGFBQWUsS0FBSyxlQUk1QkEsQ0FDUixFQUVELGFBQWMsQ0FDWixNQUFNbkIsRUFBYyxDQUFFLEdBQUcsS0FBSyxlQUFjLENBQUksRUFDNUMsS0FBSyxXQUNQQSxFQUFZLFNBQVcsSUFHekIsU0FBVyxDQUFDOUcsRUFBS0ksQ0FBSyxJQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sT0FBUyxDQUFBLENBQUUsRUFDM0RBLElBQVUsT0FDWixPQUFPMEcsRUFBWTlHLENBQUcsRUFFdEI4RyxFQUFZOUcsQ0FBRyxFQUFJSSxFQUd2QixPQUFPMEcsQ0FDUixFQUVELGlCQUFrQixDQUNoQixPQUFPLEtBQUssV0FBYSxLQUFLLE9BQVMsSUFDeEMsQ0FDRixFQUVELFNBQVUsQ0FDUixLQUFLLFVBQVUsRUFBSSxFQUNuQixLQUFLLGtCQUFtQixDQUN6QixFQUVELGVBQWdCLENBQ2QsS0FBSyxVQUFVLEVBQUssQ0FDckIsRUFFRCxRQUFTLENBQ1AsVUFBVW9CLEVBQUssQ0FFVCxLQUFLLFFBQ1AsS0FBSyxnQkFBZ0IsbUJBQW1CLEtBQU1BLENBQUcsQ0FFcEQsRUFHRCxnQkFBaUIsQ0FDZixPQUFPLElBQ1IsRUFHRCxjQUFlLENBQ2IsS0FBTSxDQUFDQyxDQUFPLEVBQUkxRixFQUFBQSxRQUFRLEtBQUssTUFBTSxPQUFPLEVBQ3hDMEYsR0FDRixLQUFLLFVBQVUsSUFBTSxTQUNuQkEsRUFBUSxNQUFPLEVBR1gsS0FBSyxZQUNMQyxHQUFBNUcsRUFBQTJHLEVBQVEsS0FBT0EsR0FBUyxpQkFBeEIsTUFBQUMsRUFBQSxLQUFBNUcsR0FFZCxDQUFTLENBRUosRUFFRCxPQUFRLE9BRU4sS0FBSyxnQkFBZ0IsTUFBTyxHQUM1QkEsRUFBQSxLQUFLLGVBQUwsTUFBQUEsRUFBbUIsUUFDbkIsS0FBSyxhQUFjLENBQ3BCLEVBRUQsT0FBUSxDQUNOLEtBQUssTUFBUSxLQUNiLEtBQUssU0FBVSxDQUNoQixFQUVELFNBQVUsQ0FDUixLQUFLLFFBQVUsR0FDZixLQUFLLFlBQWEsRUFDbEIsS0FBSyxVQUFVLE9BQU8sQ0FDdkIsRUFFRCxRQUFTLENBQ1AsS0FBSyxRQUFVLEdBQ2YsS0FBSyxTQUFVLEVBQ2YsS0FBSyxVQUFVLE1BQU0sQ0FDdEIsRUFFRCxTQUFVLENBQ1IsS0FBSyxVQUFXLEVBQ2hCLEtBQUssVUFBVSxPQUFPLENBQ3ZCLEVBRUQsVUFBVyxDQUNULEtBQUssVUFBVyxFQUNoQixLQUFLLFVBQVUsU0FBVSxDQUN2QixRQUNFLEtBQUssY0FBZ0IsT0FDakIsQ0FBRSxNQUFPLEtBQUssV0FBYSxFQUMzQixLQUVOLE9BQVEsS0FBSyxlQUNyQixDQUFPLENBQ0YsQ0FDRixDQUNILEVDeFNNNkcsR0FBUyxJQUFJLFFBR25CLElBQUk3RSxHQUFNLEVBQ0gsU0FBUzhFLEdBQU9wSSxFQUFRcUksRUFBUSxDQUNyQyxJQUFJN0ksRUFBSzJJLEdBQU8sSUFBSW5JLENBQU0sRUFDMUIsT0FBS1IsSUFDSEEsRUFBSzZJLEdBQVUsSUFBSSxFQUFFL0UsS0FDckI2RSxHQUFPLElBQUluSSxFQUFRUixDQUFFLEdBRWhCQSxDQUNULENDY08sTUFBTThJLEVBQVksQ0FBbEIsY0FDTEMsR0FBQSxhQUFRLENBQUUsR0FDVkEsR0FBQSxrQkFBYSxDQUFFLEdBRWYsSUFBSXhLLEVBQVV5RyxFQUFVeEIsRUFBVSxDQUNoQ2pGLEVBQVdJLEVBQWEsY0FBQ0osQ0FBUSxFQUNqQyxJQUFJeUssRUFBVyxLQUFLLE1BQ3BCLFVBQVdDLEtBQVExSyxFQUFVLENBQzNCLE1BQU0rQixFQUFNckIsRUFBUyxVQUFDLENBQUNnSyxDQUFJLEVBQUksSUFBTUEsRUFDckNELEVBQVdBLEVBQUExSSxLQUFBMEksRUFBQTFJLEdBQWtCLENBQUUsR0FFakMwSSxFQUFTLFVBQVksQ0FDbkIsR0FBR3hGLEVBQ0gsR0FBR3dGLEVBQVMsVUFDWixHQUFHaEUsQ0FDSixDQUNGLENBRUQsVUFBVXpHLEVBQVUrRSxFQUFRLENBRzFCLEtBQUssSUFBSS9FLEVBQVUsQ0FBRSxLQUFNLFNBQVUsT0FBQStFLEdBQVUsQ0FBRSxRQUFTLEdBQU8sQ0FDbEUsQ0FFRCxpQkFBaUIvRSxFQUFVLENBQ3pCLEtBQUssSUFBSUEsRUFBVSxDQUNqQixRQUFTLEdBQ1QsVUFBVyxLQUFLLG1CQUFtQkEsQ0FBUSxDQUNqRCxDQUFLLENBQ0YsQ0FFRCxZQUFZQSxFQUFVMkssRUFBaUI1RixFQUFRLENBQzdDLEtBQUssSUFBSS9FLEVBQVUsQ0FDakIsS0FBTSxXQUNOLE9BQUErRSxFQUNBLFNBQVUsQ0FBQyxDQUFDNEYsRUFDWixVQUFXLEtBQUssbUJBQW1CQSxDQUFlLENBQ3hELENBQUssQ0FDRixDQUVELG1CQUFtQjNLLEVBQVUsT0FDM0IsT0FBT0EsR0FDRnVELEVBQUEsS0FBSyxZQUFMdkQsS0FBQXVELEVBQUF2RCxHQUE4QjRLLEdBQUFBLE9BQU8sQ0FBQyxHQUN2QyxJQUNMLENBRUQsU0FBVSxDQUNSLE1BQU1DLEVBQVVDLEdBQVMsQ0FDdkIsTUFBTUMsRUFBVSxDQUFFLEVBQ2xCLFNBQVcsQ0FBQ2hKLEVBQUssQ0FBRSxVQUFBaUosRUFBVyxHQUFHUCxDQUFVLENBQUEsSUFBSyxPQUFPLFFBQVFLLENBQUssRUFBRyxDQUNqRUUsR0FDRkQsRUFBUSxLQUFLLENBQUNoSixFQUFLaUosQ0FBUyxDQUFDLEVBRS9CLFNBQVcsQ0FBQ0MsRUFBUXhFLENBQVEsSUFBS29FLEVBQVFKLENBQVEsRUFDL0NNLEVBQVEsS0FBSyxDQUFDLEdBQUdoSixLQUFPa0osSUFBVXhFLENBQVEsQ0FBQyxFQUcvQyxPQUFPc0UsQ0FDUixFQUVELE9BQU9GLEVBQVEsS0FBSyxLQUFLLENBQzFCLENBRUQsUUFBUUssRUFBYzVKLEVBQU0sQ0FBRSxPQUFBeUMsQ0FBTSxFQUFJLENBQ3RDLE1BQU1vSCxFQUFZcEgsSUFBVyxZQUN6Qm9ILEdBQ0YsT0FBTzdKLEVBQUs0SixFQUFhLE9BQVMsSUFBSSxFQUV4QyxTQUFXLENBQUNsTCxFQUFVeUcsQ0FBUSxJQUFLLEtBQUssUUFBTyxFQUFJLENBQ2pELEtBQU0sQ0FBRSxLQUFBOUIsRUFBTSxPQUFBSSxFQUFRLFNBQUFvQixFQUFVLFFBQUFpRixFQUFTLFVBQUFDLENBQVMsRUFBSzVFLEVBQ2pENkUsRUFBUzNHLElBQVMsU0FDbEI0RyxFQUFXNUcsSUFBUyxXQUMxQixHQUFJMkcsR0FBVUMsR0FBWXBGLEVBQVUsQ0FDbEMsTUFBTXFGLEVBQVMxSyxFQUFrQixtQkFBQ1EsRUFBTXRCLEVBQVUsSUFBTSxJQUFJLEVBQ3REeUwsRUFBV04sR0FBYUcsR0FBVSxDQUFDRixFQUNuQ00sRUFDSlAsSUFDRUksR0FBWXBGLEdBQ1ptRixHQUFVRixHQUdkLFVBQVdqSixLQUFTcUMsRUFBQUEsUUFBUWdILENBQU0sRUFBRSxLQUFJLEVBQUksQ0FDMUMsTUFBTWpLLEVBQ0orSixHQUFVdkcsRUFBTyxPQUNqQndHLEdBQVl4RyxFQUFPLFVBQ25CLEtBRUYsSUFBSXRELEVBQUtVLEdBQUEsWUFBQUEsRUFBUVosR0FDakIsR0FBSUUsR0FBTSxPQUNKZ0ssR0FDRixPQUFPdEosRUFBTVosQ0FBSyxFQUVoQm1LLEdBQWVsSyxHQUFjQyxDQUFFLEdBQUcsQ0FDaENELEdBQWNDLENBQUUsSUFDbEJBLEVBQUtBLEVBQUcsTUFBTSxDQUFDLEdBRWpCLE1BQU1rSyxFQUFTUixFQUVYNUosRUFFQStKLEVBQ0UsTUFDQSxPQUNBTSxFQUFXVCxFQUNiLElBQUkxSixJQUdKNEosRUFDRSxHQUFHQSxLQUFhNUosSUFDaEJBLEVBQ05VLEVBQU13SixDQUFNLEVBQUlDLEVBQ1pELElBQVdwSyxHQUNiLE9BQU9ZLEVBQU1aLENBQUssS0FPOUIsT0FBT0QsQ0FDUixDQUNILENDOUhBLE1BQU11SyxHQUFpQixDQUFFLEVBQ25CQyxHQUFzQixDQUFFLEVBRXZCLFNBQVNDLEdBQXNCcEgsRUFBTXBDLEVBQVcsQ0FDckRzSixHQUFlbEgsQ0FBSSxFQUFJcEMsQ0FDekIsQ0FFTyxTQUFTeUosR0FBaUJySCxFQUFNc0gsRUFBWSxHQUFPLENBQ3hELE1BQU0xSixFQUFZc0osR0FBZWxILENBQUksR0FBSyxLQUMxQyxHQUFJLENBQUNwQyxHQUFhLENBQUMwSixHQUFhLENBQUNILEdBQW9CbkgsQ0FBSSxFQUV2RCxNQUFBbUgsR0FBb0JuSCxDQUFJLEVBQUksR0FDdEIsSUFBSSxNQUFNLGlDQUFpQ0EsSUFBTyxFQUUxRCxPQUFPcEMsQ0FDVCxDQUVPLFNBQVMySixHQUF3QkMsRUFBU3JKLEVBQVUsQ0FDekQsVUFBV2lDLEtBQVVvSCxFQUNuQixHQUFJQyxHQUFzQnJILENBQU0sRUFBRyxDQUNqQyxNQUFNbEIsRUFBTWYsRUFBU2lDLEVBQU8sVUFBV0EsRUFBTyxLQUFNLENBQUMsRUFDckQsR0FBSWxCLElBQVEsT0FDVixPQUFPQSxNQUdULFVBQVcsQ0FBQytCLEVBQU1yRCxDQUFTLElBQUssT0FBTyxRQUFRd0MsRUFBTyxZQUFjLENBQUEsQ0FBRSxFQUFHLENBQ3ZFLE1BQU1sQixFQUFNZixFQUFTUCxFQUFXcUQsRUFBTSxDQUFDLEVBQ3ZDLEdBQUkvQixJQUFRLE9BQ1YsT0FBT0EsRUFLakIsQ0FFTyxTQUFTd0ksR0FBOEJ0SCxFQUFRakMsRUFBVSxDQUM5RCxPQUFPaUMsRUFDSG1ILEdBQXdCLENBQUNuSCxFQUFRLEdBQUd1SCxHQUFpQnZILENBQU0sQ0FBQyxFQUFHakMsQ0FBUSxFQUN2RSxNQUNOLENBRU8sU0FBU3lKLEdBQW9CeEgsRUFBUWpDLEVBQVUsQ0FDcEQsT0FDRXVKLEdBQ0V0SCxFQUNBeEMsR0FBY08sRUFBU1AsQ0FBUyxFQUFJQSxFQUFZLE1BQ3RELEdBQVMsSUFFVCxDQUVPLFNBQVNpSyxHQUFvQnpILEVBQVFqQyxFQUFVLENBQ3BELE9BQ0V1SixHQUNFdEgsRUFDQXhDLEdBQWNPLEVBQVNQLENBQVMsRUFBSSxHQUFPLE1BQ2pELElBQVUsRUFFVixDQVdPLFNBQVNrSyxFQUFTMUgsRUFBUSxDQUMvQixPQUFPVixFQUFRLFNBQUNVLENBQU0sR0FBS1osRUFBQUEsU0FBU1ksRUFBTyxJQUFJLENBQ2pELENBRU8sU0FBUzJILEdBQU8zSCxFQUFRLENBQzdCLE9BQU8wSCxFQUFTMUgsQ0FBTSxHQUFLQSxFQUFPLE9BQVMsTUFDN0MsQ0FFTyxTQUFTNEgsR0FBTzVILEVBQVEsQ0FDN0IsT0FBTzBILEVBQVMxSCxDQUFNLEdBQUtBLEVBQU8sT0FBUyxNQUM3QyxDQUVPLFNBQVM2SCxHQUFNN0gsRUFBUSxDQUM1QixPQUFPMEgsRUFBUzFILENBQU0sR0FBS0EsRUFBTyxPQUFTLEtBQzdDLENBRU8sU0FBUzhILEdBQVE5SCxFQUFRLENBQzlCLE9BQU8wSCxFQUFTMUgsQ0FBTSxHQUFLQSxFQUFPLE9BQVMsT0FDN0MsQ0FFTyxTQUFTK0gsR0FBb0IvSCxFQUFRLENBQzFDLE9BQU9BLEVBQU8sTUFBUUEsRUFBTyxPQUFTQSxFQUFPLElBQy9DLENBRU8sZUFBZWdJLEVBQWNoSSxFQUFRaUksRUFBZSxHQUFPLENBT2hFLEdBTkk1SyxFQUFBQSxXQUFXMkMsQ0FBTSxJQUNuQkEsRUFBU0EsRUFBUSxHQUVma0ksRUFBQUEsVUFBVWxJLENBQU0sSUFDbEJBLEVBQVMsTUFBTUEsR0FFYm1JLEVBQUFBLFNBQVNuSSxDQUFNLElBRWpCQSxFQUFTLENBQUUsR0FBR0EsQ0FBUSxFQUVsQixDQUFDQSxFQUFPLE9BQVNpSSxHQUFnQmpJLEVBQU8sVUFBVSxDQUNwRCxNQUFNb0ksRUFBTyxPQUFPLEtBQUtwSSxDQUFNLEVBQy9CLEdBQUlvSSxFQUFLLFNBQVcsRUFBRyxDQUNyQixNQUFNdkgsRUFBT3VILEVBQUssQ0FBQyxFQUNuQnBJLEVBQVNBLEVBQU9hLENBQUksRUFDaEJBLElBQVMsWUFDWGIsRUFBTyxLQUFPYSxJQUt0QixPQUFPYixDQUNULENBRU8sZUFBZXFJLEdBQ3BCQyxFQUNBQyxFQUFjUCxFQUNkLENBQ0EsSUFBSVosRUFBVS9KLEVBQVUsV0FBQ2lMLENBQWlCLEVBQ3RDQSxFQUFtQixFQUNuQkEsRUFDSixPQUFBbEIsRUFBVSxNQUFNWSxFQUFjWixFQUFTLEVBQUssRUFDeENwSixFQUFBQSxRQUFRb0osQ0FBTyxFQUdqQkEsRUFBVSxPQUFPLFlBQ2YsTUFBTW9CLEVBQWUsZ0JBQ25CcEIsRUFDQSxNQUFNM0osR0FBUSxDQUNaLE1BQU11QyxFQUFTLE1BQU11SSxFQUFZOUssRUFBTSxFQUFJLEVBQzNDLE1BQU8sQ0FBQ3VDLEVBQU8sS0FBTUEsQ0FBTSxDQUM1QixDQUNGLENBQ0YsRUFDUVYsRUFBQUEsU0FBUzhILENBQU8sSUFDekJBLEVBQVUsT0FBTyxZQUNmLE1BQU1vQixFQUFlLGdCQUNuQixPQUFPLFFBQVFwQixDQUFPLEVBQ3RCLE1BQU8sQ0FBQ3BLLEVBQUtTLENBQUksSUFBTSxDQUNyQixNQUFNdUMsRUFBUyxNQUFNdUksRUFBWTlLLEVBQU0sRUFBSSxFQUMzQyxNQUFPLENBQUNULEVBQUtnRCxDQUFNLENBQ3BCLENBQ0YsQ0FDRixHQUVJb0gsQ0FDVCxDQUVPLGVBQWVxQixHQUF1QnpJLEVBQVEsQ0FFbkQsR0FBSSxDQUFFLFVBQUF4QyxDQUFTLEVBQUt3QyxFQUNoQnhDLElBQ0ZBLEVBQVksTUFBTXdLLEVBQWN4SyxFQUFXLEVBQUksRUFDM0NBLElBSUZ3QyxFQUFPLFVBQVkwSSxVQUFRLENBQ3pCLEdBQUdsTCxFQUNILE9BQVEsQ0FBQytDLEdBQVcrRCxFQUFXLEdBQUk5RyxFQUFVLFFBQVUsQ0FBQSxDQUFHLENBQ2xFLENBQU8sR0FHUCxDQUVPLGVBQWVtTCxHQUF3QnZCLEVBQVMsQ0FFckQsTUFBTW9CLEVBQUFBLGdCQUFnQixPQUFPLE9BQU9wQixHQUFXLENBQUEsQ0FBRSxFQUFHcUIsRUFBc0IsQ0FDNUUsQ0FFTyxlQUFlRyxFQUF3QkMsRUFBSzdJLEVBQVE4SSxFQUFRQyxFQUFPLENBQ3hFLE1BQU1DLEVBQVcsQ0FBRSxFQUNiQyxFQUFVLENBQUN6TCxFQUFXcUQsRUFBTXFJLElBQWtCLENBQ2xERixFQUFTLEtBQ1BHLEdBQ0VOLEVBQ0FyTCxFQUNBcUQsRUFDQWlJLEVBQ0FDLEVBQVFHLENBQ1QsQ0FDRixDQUNGLEVBRUQ1QixHQUE4QnRILEVBQVFpSixDQUFPLEVBQzdDOUIsR0FBd0JpQyxHQUFtQnBKLENBQU0sRUFBR2lKLENBQU8sRUFFM0QsTUFBTSxRQUFRLElBQUlELENBQVEsQ0FDNUIsQ0FFTyxlQUFlRyxHQUF1Qk4sRUFBSzdJLEVBQVFhLEVBQU1pSSxFQUFRQyxFQUFPLFNBQzdFTSxFQUFnQlIsRUFBSzdJLENBQU0sRUFFM0IsTUFBTSxRQUFRLElBQUksQ0FFaEJ3SSxrQkFBZ0JZLEdBQW1CcEosQ0FBTSxFQUFHc0osR0FDMUNWLEVBQXdCQyxFQUFLUyxFQUFPUixFQUFRQyxDQUFLLENBQ2xELEVBRUQsT0FBTTNELEdBQUE1RyxFQUFBK0ssRUFBZXZKLENBQU0sSUFBckIsWUFBQXhCLEVBQXdCLGdCQUF4QixZQUFBNEcsRUFBQSxLQUFBNUcsRUFDSnFLLEVBQ0E3SSxFQUNBYSxFQUNBaUksRUFDQUMsR0FFTixDQUFHLENBQ0gsQ0FFTyxlQUFlUyxHQUFZaE0sRUFBV3FMLEVBQUs3SSxFQUFRYSxFQUFNLENBQzlELEdBQUksQ0FBQytHLEdBQU81SCxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxNQUFNLHlCQUF5QitILEdBQW9CL0gsQ0FBTSxJQUFJLEVBRXpFeUosR0FBbUJaLEVBQUs3SSxFQUFRYSxDQUFJLEVBQ3BDd0ksRUFBZ0JSLEVBQUs3SSxDQUFNLEVBQzNCLE1BQU0wSixHQUFxQmIsRUFBSzdJLENBQU0sRUFDdEMsTUFBTTJKLEVBQVcsQ0FBRSxFQUNuQixhQUFNZixFQUF3QkMsRUFBSzdJLEVBQVEySixFQUFVLENBQUMsRUFDL0MsQ0FDTCxLQUFNLElBQUkzSixFQUFPLE9BQ2pCLFNBQUEySixFQUNBLFVBQUFuTSxFQUNBLEtBQU0sQ0FDSixJQUFBcUwsRUFDQSxPQUFBN0ksQ0FDRCxDQUNGLENBQ0gsQ0FFTyxTQUFTcUosRUFBZ0JSLEVBQUs3SSxFQUFRLENBQzNDLElBQUlFLEVBQVcySSxFQUFJLFNBQVM3SSxFQUFPLElBQUksRUFDdkMsR0FBSUUsSUFDRTdDLEVBQUFBLFdBQVc2QyxDQUFRLElBQ3JCQSxFQUFXQSxFQUFTRixDQUFNLEdBRXhCVixFQUFBQSxTQUFTWSxDQUFRLEdBQ25CLFNBQVcsQ0FBQ2xELEVBQUtJLENBQUssSUFBSyxPQUFPLFFBQVE4QyxDQUFRLEVBQzVDRixFQUFPaEQsQ0FBRyxJQUFNLE9BQ2xCZ0QsRUFBT2hELENBQUcsRUFBSUksRUFFZDRDLEVBQU9oRCxDQUFHLEVBQUk0TSxFQUFBQSxNQUFNeE0sRUFBTzRDLEVBQU9oRCxDQUFHLENBQUMsQ0FLaEQsQ0FFTyxTQUFTeU0sR0FBbUJaLEVBQUs3SSxFQUFRYSxFQUFNLENBRXBEYixFQUFPLEtBQU9hLEVBQ2RiLEVBQU8sT0FBUEEsRUFBTyxLQUFTNkksRUFBSSxjQUFjaEksQ0FBSSxFQUN4QyxDQUVPLGVBQWVnSixHQUFhaEIsRUFBSzdJLEVBQVErSSxFQUFPLENBRXJELEdBQUksQ0FBRSxLQUFBZSxFQUFNLE1BQUFDLEVBQU8sV0FBQXZJLENBQVksRUFBR3hCLEVBQzlCK0osRUFDRkEsRUFBUS9KLEVBQU8sTUFBUSxNQUFNcUksR0FBZTBCLEVBQU9ELEdBQ2pERSxHQUFZbkIsRUFBS2lCLENBQUksQ0FDdEIsRUFDUUEsRUFDVEEsRUFBTzlKLEVBQU8sS0FBTyxNQUFNZ0ssR0FBWW5CLEVBQUtpQixDQUFJLEVBQ3ZDdEksR0FHTGxDLEVBQUFBLFNBQVNrQyxDQUFVLElBQ3JCc0ksRUFBTyxDQUFFLFdBQUF0SSxDQUFZLEdBSXpCdUksTUFBVSxDQUFFLFFBQVNELENBQU0sR0FDM0IsTUFBTUgsRUFBVyxDQUFFLEVBQ25CLFVBQVdHLEtBQVEsT0FBTyxPQUFPQyxDQUFLLEVBQ3BDLE1BQU1uQixFQUF3QkMsRUFBS2lCLEVBQU1ILEVBQVVaLENBQUssRUFFMUQsT0FBT1ksQ0FDVCxDQUVPLGVBQWVLLEdBQVluQixFQUFLN0ksRUFBUSxDQUU3QyxHQURBQSxFQUFTLE1BQU1nSSxFQUFjaEksRUFBUSxFQUFJLEVBQ3JDLENBQUMySCxHQUFPM0gsQ0FBTSxFQUNoQixNQUFNLElBQUksTUFBTSx5QkFBeUIrSCxHQUFvQi9ILENBQU0sSUFBSSxFQUV6RSxPQUFBcUosRUFBZ0JSLEVBQUs3SSxDQUFNLEVBQzNCLE1BQU0wSixHQUFxQmIsRUFBSzdJLENBQU0sRUFDL0JBLENBQ1QsQ0FFTyxlQUFlaUssR0FBV3BCLEVBQUs3SSxFQUFRLENBRTVDLEdBREFBLEVBQVMsTUFBTWdJLEVBQWNoSSxFQUFRLEVBQUksRUFDckMsQ0FBQzZILEdBQU03SCxDQUFNLEVBQ2YsTUFBTSxJQUFJLE1BQU0sd0JBQXdCK0gsR0FBb0IvSCxDQUFNLElBQUksRUFFeEUsT0FBQXFKLEVBQWdCUixFQUFLN0ksQ0FBTSxFQUNwQkEsQ0FDVCxDQUVPLGVBQWVrSyxHQUFhckIsRUFBSzdJLEVBQVEsQ0FFOUMsR0FEQUEsRUFBUyxNQUFNZ0ksRUFBY2hJLEVBQVEsRUFBSSxFQUNyQyxDQUFDOEgsR0FBUTlILENBQU0sRUFDakIsTUFBTSxJQUFJLE1BQU0sMEJBQTBCK0gsR0FBb0IvSCxDQUFNLElBQUksRUFFMUUsT0FBQXFKLEVBQWdCUixFQUFLN0ksQ0FBTSxFQUNwQkEsQ0FDVCxDQUVPLGVBQWUwSixHQUFxQmIsRUFBSzdJLEVBQVEsQ0FDdEQsS0FBTSxDQUFFLEtBQUFtSyxFQUFNLE9BQUFDLENBQU0sRUFBS3BLLEVBQ3JCbUssSUFDRm5LLEVBQU8sS0FBTyxNQUFNcUksR0FDbEI4QixFQUNBRSxHQUFPSixHQUFXcEIsRUFBS3dCLENBQUcsQ0FDM0IsR0FFQ0QsSUFDRnBLLEVBQU8sT0FBUyxNQUFNcUksR0FDcEIrQixFQUNBZCxHQUFTWSxHQUFhckIsRUFBS1MsQ0FBSyxDQUNqQyxFQUVMLENBRU8sU0FBU2dCLEVBQWN0SyxFQUFRLENBR3BDLE9BQ0UwSCxFQUFTMUgsQ0FBTSxHQUNmVixFQUFRLFNBQUNVLEVBQU8sTUFBUUEsRUFBTyxPQUFTQSxFQUFPLFVBQVUsQ0FFN0QsQ0FFTyxTQUFTdUssR0FBdUJ2SyxFQUFRLENBQzdDLE9BQ0UwSCxFQUFTMUgsQ0FBTSxHQUNmLE9BQU8sTUFBS0EsR0FBQSxZQUFBQSxFQUFRLFFBQVMsQ0FBRSxDQUFBLEVBQUUsT0FBUyxDQUU5QyxDQUVPLFNBQVNxSCxHQUFzQnJILEVBQVEsQ0FDNUMsT0FDRTRILEdBQU81SCxDQUFNLEdBQ2JWLEVBQVEsU0FBQ1UsRUFBTyxTQUFTLENBRTdCLENBRU8sU0FBU3dLLEdBQWtCeEssRUFBUWpELEVBQVMsQ0FDakQsS0FBTSxDQUFFLEtBQUEwTixDQUFJLEVBQUt6SyxFQUNYMEssRUFBYUQsR0FBUTFOLEVBQVEsTUFBTTBOLENBQUksRUFDN0MsT0FBT0MsR0FHSGxELEdBQW9Ca0QsRUFBWUosQ0FBYSxHQUFLLElBRXhELENBRU8sU0FBU0ssR0FBYzNLLEVBQVFqRCxFQUFTLENBQzdDLE9BQU95TixHQUFrQnhLLEVBQVFqRCxDQUFPLEVBQ3BDQSxFQUFRLE1BQU1pRCxFQUFPLElBQUksRUFDekIsSUFDTixDQUVPLFNBQVM0SyxHQUFnQjVLLEVBQVFqRCxFQUFTLENBQy9DLE1BQU0wTixFQUFPRSxHQUFjM0ssRUFBUWpELENBQU8sRUFDMUMsT0FBTzBOLEVBQ0hwRCxHQUFzQm9ELENBQUksRUFDeEIsSUFBSUEsRUFBSyxPQUNULElBQUlBLEVBQUssUUFBUUEsRUFBSyxPQUN4QixJQUNOLENBRU8sU0FBU0ksRUFBZTdLLEVBQVFqRCxFQUFTK04sRUFBWSxDQUMxRCxNQUFNSixFQUFhRixHQUFrQnhLLEVBQVFqRCxDQUFPLEVBQ3BELEdBQUkyTixFQUNGMUssRUFBUzBLLFVBQ0ExSyxFQUFPLEtBQ2hCLE1BQU0sSUFBSSxNQUFNLGtCQUFrQkEsRUFBTyxPQUFPLEVBR2xELEdBQUksQ0FBRSxLQUFBOEosRUFBTSxNQUFBQyxFQUFPLFdBQUF2SSxFQUFZLFFBQUF1SixDQUFTLEVBQUcvSyxFQUMzQyxHQUFJLENBQUM4SixHQUFRLENBQUNDLEVBQ1osR0FBSXZJLEVBRUZzSSxFQUFPLENBQUUsV0FBQXRJLEVBQVksUUFBQXVKLENBQVMsTUFHOUIsT0FBTyxDQUFFLEVBR2IsT0FBQWhCLE1BQVUsQ0FBRSxRQUFTRCxDQUFNLEdBQ3BCLE9BQU8sWUFDWixPQUFPLFFBQVFDLENBQUssRUFBRSxJQUFJLENBQUMsQ0FBQ25LLEVBQU1rSyxDQUFJLEtBRWhDek0sRUFBVSxXQUFDeU0sRUFBSyxVQUFVLElBQzVCQSxFQUFPLENBQ0wsR0FBR0EsRUFDSCxXQUFZQSxFQUFLLFdBQVcvTSxDQUFPLENBQ3BDLEdBRUksQ0FBQzZDLEdBQU1rTCxHQUFBLFlBQUFBLEVBQWFoQixLQUFTQSxDQUFJLEVBQ3pDLENBQ0YsQ0FDSCxDQUVPLFNBQVNrQixHQUEyQmpCLEVBQU90TSxFQUFNLENBQ3RELE9BQU9zTSxFQUFNdE0sR0FBQSxZQUFBQSxFQUFNLElBQUksR0FBS3NNLEVBQU0sU0FBVyxJQUMvQyxDQUVPLFNBQVNrQixHQUFrQmpMLEVBQVF2QyxFQUFNVixFQUFTLENBQ3ZELE9BQU9pTyxHQUEyQkgsRUFBZTdLLEVBQVFqRCxDQUFPLEVBQUdVLENBQUksQ0FDekUsQ0FFTyxTQUFTeU4sR0FBVWxMLEVBQVEsQ0FDaEMsTUFBTyxDQUFDLENBQUNBLEVBQU8sT0FDbEIsQ0FFTyxTQUFTbUwsR0FBVW5MLEVBQVEsQ0FDaEMsTUFBTyxDQUFDLEVBQUVBLEVBQU8sU0FBV0EsRUFBTyxXQUNyQyxDQUVPLFNBQVNvTCxHQUFTcEwsRUFBUSxPQUMvQixNQUFPLENBQUMsRUFBRUEsRUFBTyxVQUFVeEIsRUFBQStLLEVBQWV2SixDQUFNLElBQXJCLFlBQUF4QixFQUF3QixpQkFBa0IsR0FDdkUsQ0FFTyxTQUFTNk0sR0FBWXJMLEVBQVEsT0FDbEMsTUFBTyxDQUFDLEdBQUN4QixFQUFBK0ssRUFBZXZKLENBQU0sSUFBckIsTUFBQXhCLEVBQXdCLFlBQ25DLENBRU8sU0FBUzhNLEdBQVl0TCxFQUFRLE9BQ2xDLE1BQU8sQ0FBQyxHQUFDeEIsRUFBQStLLEVBQWV2SixDQUFNLElBQXJCLE1BQUF4QixFQUF3QixZQUNuQyxDQUVPLFNBQVMrTSxHQUFnQnZMLEVBQVEsT0FNdEMsTUFBTS9DLEVBQWUrQyxFQUFPLFFBQ3RCNUMsRUFDSkgsSUFBaUIsT0FDYkEsR0FDQXVCLEVBQUErSyxFQUFldkosQ0FBTSxJQUFyQixZQUFBeEIsRUFBd0IsYUFDOUIsT0FBT25CLEVBQUFBLFdBQVdELENBQUssRUFDbkJBLEVBQU00QyxDQUFNLEVBQ1p3TCxFQUFBQSxNQUFNcE8sQ0FBSyxDQUNqQixDQUVPLFNBQVNxTyxHQUFtQnpMLEVBQVEsT0FDekMsTUFBTTBMLEVBQWNuQyxFQUFldkosQ0FBTSxFQUN6QyxNQUFPLENBQUMsRUFDTjBMLEdBQUEsTUFBQUEsRUFBYSxlQUFnQmxOLEVBQUFrTixHQUFBLFlBQUFBLEVBQWEscUJBQWIsTUFBQWxOLEVBQUEsS0FBQWtOLEVBQWtDMUwsR0FFbkUsQ0FFTyxTQUFTMkwsR0FBaUIzTCxFQUFRekQsRUFBTyxDQUFBLEVBQUlpQixFQUFXLENBVzdELE9BQU9vTyxHQUNMNUwsRUFDQXpELEVBQ0EsS0FDQSxLQVpvQixDQUFDeUQsRUFBUXpELEVBQU1zRSxJQUFTLENBQ3hDLEVBQUVBLEtBQVF0RSxJQUFTLENBQUNrUCxHQUFtQnpMLENBQU0sSUFDL0N6RCxFQUFLc0UsQ0FBSSxFQUFJMEssR0FBZ0J2TCxDQUFNLEVBRXRDLEVBVUMsS0FoQmMsQ0FBRSxVQUFBeEMsRUFBVyxTQUFVakIsQ0FBTSxDQWtCNUMsQ0FDSCxDQUVPLFNBQVNnSSxHQUFhdkUsRUFBUXpELEVBQU1zRSxFQUFNNUYsRUFBVSxDQUN6RCxVQUFBdUMsRUFBWSxLQUNaLFNBQUFxTyxFQUFXck8sR0FBQSxZQUFBQSxFQUFXLFFBQ3hCLEVBQUksR0FBSSxDQUNOLEtBQU0sQ0FBRSxRQUFBc08sQ0FBTyxFQUFLOUwsRUFDcEIsR0FBSThMLEVBQVMsQ0FDWCxNQUFNMU8sRUFBUTBPLEVBQ1p2TyxFQUFZLElBQUlDLEVBQVcsQ0FDekIsT0FBQXdDLEVBR0EsTUFBT3pELEVBQUtzRSxDQUFJLEVBQ2hCLEtBQUFBLEVBQ0EsS0FBQXRFLEVBQ0EsU0FBQXRCLEVBQ0EsU0FBQTRRLENBQ1IsQ0FBTyxDQUNGLEVBQ0d6TyxJQUFVLFNBR1piLEVBQUtzRSxDQUFJLEVBQUl6RCxHQUlqQixNQUFJLEVBQUV5RCxLQUFRdEUsSUFBUyxDQUFDa1AsR0FBbUJ6TCxDQUFNLElBQy9DekQsRUFBS3NFLENBQUksRUFBSTBLLEdBQWdCdkwsQ0FBTSxHQUk5QnpELEVBQUtzRSxDQUFJLENBQ2xCLENBRUEsU0FBU2tMLEdBQVU1RixFQUFjMUksRUFBTUMsRUFBUyxDQUM5QyxHQUFJQSxFQUFRLFdBQVksQ0FDdEIsTUFBTXNPLEVBQU8sQ0FBRSxFQUNULENBQUUsTUFBQXhQLEVBQVEsS0FBTSxTQUFBeVAsQ0FBVSxFQUFHOUYsRUFDN0J6SixFQUFLZSxFQUFLakIsQ0FBSyxFQUNyQixPQUFJRSxJQUFPLFNBQ1RzUCxFQUFLeFAsQ0FBSyxFQUFJRSxHQUdaNk4sR0FBdUJwRSxDQUFZLElBQ3JDNkYsRUFBSyxLQUFPdk8sRUFBSyxNQUVmd08sSUFDRkQsRUFBS0MsQ0FBUSxFQUFJeE8sRUFBS3dPLENBQVEsR0FFekJELE1BRVAsT0FBTyxDQUFFLEdBQUd2TyxDQUFNLENBRXRCLENBRU8sU0FBU3lPLEdBQVlsTSxFQUFRbUcsRUFBYzVKLEVBQU10QixFQUFVLENBQ2hFLFVBQUF1QyxFQUNBLFdBQUEyTyxFQUNBLE9BQUFuTixDQUNGLEVBQUksR0FBSSxDQUNOLE1BQU10QixFQUFVLENBQUUsVUFBQUYsRUFBVyxXQUFBMk8sRUFBWSxPQUFBbk4sRUFBUSxTQUFVekMsQ0FBTSxFQUMzRDZQLEVBQWdCTCxHQUFVNUYsRUFBYzVKLEVBQU1tQixDQUFPLEVBQ3JEcUksRUFBUSxJQUFJUCxHQW9GbEIsT0FBQW9HLEdBQ0U1TCxFQUNBekQsRUFDQXRCLEVBQ0FtUixFQXRGb0IsQ0FBQ3BNLEVBQVF6RCxFQUFNc0UsRUFBTTVGLEVBQVVtUixJQUFrQixDQUNyRSxJQUFJaFAsRUFBUW1ILEdBQWF2RSxFQUFRekQsRUFBTXNFLEVBQU01RixFQUFVeUMsQ0FBTyxFQUc5RCxHQUFJTSxFQUFBQSxRQUFRWixDQUFLLEVBQUcsQ0FDbEIsS0FBTSxDQUFFLGVBQUFpUCxFQUFnQixTQUFBSixFQUFVLE1BQUF6UCxFQUFRLElBQU0sRUFBR3dELEVBQy9DcU0sRUFDRmpQLEVBQVFBLEVBQU0sSUFBSW1CLElBQVUsQ0FDMUIsQ0FBQzhOLENBQWMsRUFBRzlOLENBQzVCLEVBQVUsRUFHRm5CLEVBQVEsQ0FBQyxHQUFHQSxDQUFLLEVBRWY2TyxHQUFZak4sSUFBVyxhQUl6QjVCLEVBQU0sS0FBSyxDQUFDNkUsRUFBR3FLLElBQU0sQ0FDbkIsTUFBTUMsRUFBTXRLLEdBQUEsWUFBQUEsRUFBSXpGLEdBQ1ZnUSxHQUFNRixHQUFBLFlBQUFBLEVBQUk5UCxHQUNoQixPQUFPK1AsR0FBTyxNQUFROVAsR0FBYzhQLENBQUcsRUFDbkMsRUFDQUMsSUFBTyxNQUFRL1AsR0FBYytQLEVBQUcsRUFDOUIsR0FDQUQsRUFBTUMsRUFDdEIsQ0FBUyxFQUdMSixFQUFjdkwsQ0FBSSxFQUFJekQsQ0FDdkIsRUFFb0IsQ0FBQzRDLEVBQVF6RCxFQUFNc0UsRUFBTTVGLEVBQVVtUixJQUFrQixDQUNwRSxLQUFNLENBQUUsZUFBQUMsRUFBZ0IsUUFBQUksRUFBUyxRQUFBeEQsQ0FBUyxFQUFHakosRUFDN0MsSUFBSTVDLEVBQVFnUCxFQUFjdkwsQ0FBSSxFQUU5QixNQUFNNkssRUFBY25DLEVBQWV2SixDQUFNLEVBR25DNEMsRUFBYSxJQUNqQnJGLEVBQVksSUFBSUMsRUFBVyxDQUN6QixPQUFBd0MsRUFDQSxNQUFBNUMsRUFDQSxLQUFBeUQsRUFDQSxLQUFBdEUsRUFDQSxTQUFBdEIsRUFDQSxTQUFVeUMsRUFBUSxTQUdsQixjQUFBME8sQ0FDUixDQUFPLEVBY0gsR0FWSUMsR0FBa0JyTyxVQUFRWixDQUFLLElBQ2pDQSxFQUFRQSxFQUFNLElBQUlGLEdBQVVBLEVBQU9tUCxDQUFjLENBQUMsR0FLaERwRCxJQUNGN0wsRUFBUTZMLEVBQVFyRyxHQUFZLEdBSTVCOEksR0FBQSxNQUFBQSxFQUFhLGNBRWJlLElBQVksSUFDWnBQLEVBQUFBLFdBQVdvUCxDQUFPLEdBQUtBLEVBQVE3SixFQUFVLENBQUUsRUFFM0MsT0FBT3dKLEVBQWN2TCxDQUFJLE1BQ3BCLENBR0wsTUFBTTZMLEVBQWVoQixHQUFBLFlBQUFBLEVBQWEsYUFDOUJnQixJQUNGdFAsRUFBUXNQLEVBQWExTSxFQUFRNUMsRUFBT25DLEVBQVU4SyxDQUFLLEdBRXJEcUcsRUFBY3ZMLENBQUksRUFBSXpELEVBRXpCLEVBU0NNLENBQ0QsRUFFTXFJLEVBQU0sUUFBUUksRUFBY2lHLEVBQWUxTyxDQUFPLENBQzNELENBRU8sU0FBU2tPLEdBQ2Q1TCxFQUNBekQsRUFDQXRCLEVBQ0FtUixFQUNBTyxFQUNBQyxFQUNBbFAsRUFDQSxDQUNBLE1BQU1tUCxFQUFvQnJMLEdBQWMsQ0FDdEMsTUFBTXNMLEVBQWMsQ0FBQzdSLEVBQVVDLElBQzdCRCxHQUFZLEtBQ1JELEVBQWVDLEVBQVVDLENBQUssRUFDOUIsS0FFTixHQUFJc0csRUFDRixTQUFXLENBQUNYLEVBQU1rTSxDQUFlLElBQUssT0FBTyxRQUFRdkwsQ0FBVSxFQUM3RCxHQUFJLENBQUM0SixHQUFTMkIsQ0FBZSxFQUUzQm5CLEdBQ0VtQixFQUNBeFEsRUFDQXRCLEVBQ0FtUixFQUNBTyxFQUNBQyxFQUNBbFAsQ0FDRCxNQUNJLENBQ0wsTUFBTXNQLEVBQW9CRixFQUFZN1IsRUFBVTRGLENBQUksRUFFOUNvTSxFQUFjLENBQUN4UCxFQUFNckIsRUFBUSxPQUFTLE9BQzFDLE1BQU1uQixFQUNKbUIsSUFBVSxLQUNOMFEsRUFBWUUsRUFBbUI1USxDQUFLLEVBQ3BDNFEsRUFDQWpRLEVBQVVRLEVBQVksSUFBSUcsRUFBUSxVQUFXLENBQ2pELE9BQVFxUCxFQUNSLEtBQUF4USxFQUNBLE1BQU9rQixFQUNQLFNBQUF4QyxFQUNBLE1BQUFtQixFQUNBLFNBQVVzQixFQUFRLFFBQ2hDLENBQWEsRUFLS3FNLEtBSEp2TCxFQUFBK0ssRUFBZXdELENBQWUsSUFBOUIsWUFBQXZPLEVBQWlDLDhCQUNqQ3FNLEdBRXFCa0MsRUFBaUJoUSxDQUFPLEVBQ3pDK00sRUFBT2tCLEdBQTJCakIsRUFBT3RNLENBQUksRUFDbkQsR0FBSXFNLEVBQU0sQ0FDUixNQUFNb0QsRUFBZ0JkLEVBQ2xCTCxHQUFVZ0IsRUFBaUJ0UCxFQUFNQyxDQUFPLEVBQ3hDLEtBQ0osT0FBT2tPLEdBQ0w5QixFQUNBck0sRUFDQXhDLEVBQ0FpUyxFQUNBUCxFQUNBQyxFQUNBbFAsQ0FDRCxNQUlELE9BQU8sQ0FBRSxHQUFHRCxDQUFNLENBRXJCLEVBRURrUCxHQUFBLE1BQUFBLEVBQ0VJLEVBQ0F4USxFQUNBc0UsRUFDQW1NLEVBQ0FaLEdBRUYsSUFBSWhQLEVBQVFnUCxFQUFnQkEsRUFBY3ZMLENBQUksRUFBSXRFLEVBQUtzRSxDQUFJLEVBQ3ZEekQsR0FBUyxNQUFRa04sRUFBY3lDLENBQWUsSUFFNUMvTyxFQUFBQSxRQUFRWixDQUFLLEVBRWZBLEVBQVFnUCxFQUNKaFAsRUFBTSxJQUFJNlAsQ0FBVyxFQUNyQjdQLEVBQU0sUUFBUTZQLENBQVcsRUFFN0I3UCxFQUFRNlAsRUFBWTdQLENBQUssRUFFdkJnUCxJQUNGQSxFQUFjdkwsQ0FBSSxFQUFJekQsSUFHMUJ3UCxHQUFBLE1BQUFBLEVBQ0VHLEVBQ0F4USxFQUNBc0UsRUFDQW1NLEVBQ0FaLEdBS1QsRUFFRFMsRUFBa0I3TSxFQUFPLFVBQVUsRUFDbkMsVUFBV3FLLEtBQU85QyxHQUFpQnZILENBQU0sRUFDdkM2TSxFQUFrQnhDLEVBQUksVUFBVSxFQUVsQyxVQUFXZixLQUFTRixHQUFtQnBKLENBQU0sRUFDM0M2TSxFQUFrQnZELEVBQU0sVUFBVSxFQUdwQyxPQUFPOEMsR0FBaUI3UCxDQUMxQixDQUVPLFNBQVM0USxFQUFnQi9GLEVBQVNsSCxFQUFVLENBQ2pELE1BQU1rTixFQUFXLENBQUNDLEVBQU9DLElBQ2hCRCxFQUFNLE9BQVMsRUFDbEJBLEVBQU0sT0FBTyxDQUFDblEsRUFBUUUsSUFBVSxDQUM5QixNQUFNNEMsRUFBU3NOLEVBQVNsUSxDQUFLLEVBQzdCLE9BQUk0QyxJQUNGOUMsRUFBTzhDLEVBQU8sSUFBSSxFQUNoQkEsR0FBVUUsRUFDTixDQUFFLEdBQUdBLEVBQVUsR0FBR0YsQ0FBUSxFQUMxQkEsR0FFRDlDLENBQ1IsRUFBRSxFQUFFLEVBQ0wsS0FHTixPQUFPYyxFQUFBQSxRQUFRb0osQ0FBTyxFQUNsQmdHLEVBQVNoRyxFQUFTaEssR0FDaEJrQyxFQUFBQSxTQUFTbEMsQ0FBSyxFQUNWQSxFQUNBLENBQ0UsS0FBTW1RLEVBQUFBLFNBQVNuUSxFQUFPLEVBQUssQ0FDNUIsQ0FDTixFQUNEa0MsRUFBQUEsU0FBUzhILENBQU8sRUFDZGdHLEVBQ0UsT0FBTyxRQUFRaEcsQ0FBTyxFQUN0QixDQUFDLENBQUN2RyxFQUFNekQsQ0FBSyxJQUNYa0MsRUFBQUEsU0FBU2xDLENBQUssRUFDVixDQUNFLEtBQUF5RCxFQUNBLEdBQUd6RCxDQUNKLEVBQ0RnQyxFQUFBQSxTQUFTaEMsQ0FBSyxFQUNaLENBQ0UsS0FBQXlELEVBQ0EsTUFBT3pELENBQ1IsRUFDRCxJQUNULEVBQ0QsSUFDUixDQUVPLFNBQVNvUSxHQUFpQi9MLEVBQVMsQ0FDeEMsT0FBTzBMLEVBQ0wxTCxFQUNBLENBQUUsS0FBTSxRQUFVLENBQ25CLENBQ0gsQ0FFQSxTQUFTZ00sR0FBUUMsRUFBYyxDQUM3QixPQUFPcE8sRUFBUSxTQUFDb08sQ0FBWSxFQUFJQSxFQUFhLEtBQU9BLENBQ3RELENBRU8sU0FBU25FLEVBQWVtRSxFQUFjLENBQzNDLE9BQU96RyxHQUFpQndHLEdBQVFDLENBQVksRUFBRyxFQUFJLEdBQUssSUFDMUQsQ0FFTyxTQUFTQyxHQUFjRCxFQUFjLFNBQzFDLFFBQ0V0SSxHQUFBNUcsRUFBQStLLEVBQWVtRSxDQUFZLElBQTNCLFlBQUFsUCxFQUE4QixnQkFBOUIsWUFBQTRHLEVBQUEsS0FBQTVHLEVBQThDaVAsR0FBUUMsQ0FBWSxLQUNsRSxJQUVKLENBRU8sU0FBU0UsR0FBYzVOLEVBQVEvRSxFQUFXLEtBQU00UyxFQUFlLEtBQU0sQ0FDMUUsT0FBTzdOLEVBQ0gsQ0FDRSxPQUFBQSxFQUdBLFNBQ0UvRSxHQUFZLE1BQVErRSxFQUFPLEtBQ3ZCaEYsRUFBZUMsRUFBVStFLEVBQU8sSUFBSSxFQUNwQy9FLEVBQ04sYUFBQTRTLENBQ0QsRUFDRCxJQUNOLENBRU8sU0FBU0MsR0FDZEMsRUFDQTlTLEVBQVcsS0FDWDRTLEVBQWUsS0FDZkcsRUFBZSxDQUFFLEVBQ2pCLENBQ0EsR0FBSUQsRUFDRixTQUFXLENBQUMvUSxFQUFLZ0QsQ0FBTSxJQUFLLE9BQU8sUUFBUStOLENBQVksRUFBRyxDQUN4RCxNQUFNeFAsRUFBUXFQLEdBQ1o1TixFQUNBL0UsR0FBWSxLQUFPRCxFQUFlQyxFQUFVK0IsQ0FBRyxFQUFJLEtBQ25ENlEsQ0FDRCxFQUNHdFAsR0FDRnlQLEVBQWEsS0FBS3pQLENBQUssRUFJN0IsT0FBT3lQLENBQ1QsQ0FFTyxTQUFTekcsR0FBaUJ2SCxFQUFRLENBQ3ZDLE9BQU9BLEdBQUEsTUFBQUEsRUFBUSxLQUFPLE9BQU8sT0FBT0EsRUFBTyxJQUFJLEVBQUksQ0FBRSxDQUN2RCxDQUVPLFNBQVNvSixHQUFtQnBKLEVBQVEsQ0FDekMsT0FBT2lPLEdBQW1Cak8sQ0FBTSxFQUFFLElBQUl6QixHQUFTQSxFQUFNLE1BQU0sQ0FDN0QsQ0FFTyxTQUFTMFAsR0FDZGpPLEVBQ0EvRSxFQUFXLEtBQ1h3SixFQUFrQixLQUNsQm9KLEVBQWUsS0FDZixTQUNBLE1BQU1LLEdBQWM5SSxHQUFBNUcsRUFBQStLLEVBQWV2SixDQUFNLElBQXJCLFlBQUF4QixFQUF3QixpQkFBeEIsWUFBQTRHLEVBQUEsS0FBQTVHLEVBQ2xCd0IsRUFDQS9FLEVBQ0F3SixHQUVJdUosRUFBZUUsRUFDakIsQ0FBQ04sR0FBY00sRUFBYWpULEVBQVU0UyxDQUFZLENBQUMsRUFDbkQsQ0FBRSxFQUdOLE9BQUFDLEdBQWdCOU4sR0FBQSxZQUFBQSxFQUFRLE9BQVEvRSxFQUFVNFMsRUFBY0csQ0FBWSxFQUM3REEsQ0FDVCxDQUVPLFNBQVNHLEVBQWVULEVBQWMsQ0FDM0MsT0FBT0MsR0FBY0QsQ0FBWSxJQUFNLFFBQ3pDLENBRU8sU0FBU1UsRUFBYVYsRUFBYyxDQUN6QyxPQUFPQyxHQUFjRCxDQUFZLElBQU0sTUFDekMsQ0FFTyxTQUFTVyxHQUFVbEksRUFBYzFJLEVBQU0sQ0FDNUMsTUFBTWYsRUFBS2UsRUFBSzBJLEVBQWEsT0FBUyxJQUFJLEVBQzFDLE9BQU96SixHQUFNLEtBQU8sT0FBT0EsQ0FBRSxFQUFJLE1BQ25DLENBRU8sU0FBUzRSLEdBQVduSSxFQUFjMUksRUFBTSxDQUs3QyxPQUFPNkgsR0FBTzdILEVBQU00USxHQUFVbEksRUFBYzFJLENBQUksQ0FBQyxDQUNuRCxDQ3A1Qk8sU0FBUzhRLEdBQXFCN1EsRUFBUyxDQUM1QyxLQUFNLENBQUUsT0FBQThRLENBQU0sRUFBSzlRLEVBQ25CLE9BQU84USxHQUFVOVEsRUFBUSxRQUNyQitRLEdBQ0UsQ0FBRSxHQUFHL1EsQ0FBUyxFQUNkQSxDQUNELEVBQ0RBLENBQ04sQ0FFTyxTQUFTK1EsR0FBYUMsRUFBSUMsRUFBTSxDQUlyQyxHQUhJQSxFQUFLLFNBQ1BGLEdBQWFDLEVBQUlDLEVBQUssT0FBTyxFQUUzQkEsRUFBSyxPQUNQLFVBQVdDLEtBQVNELEVBQUssT0FDdkJGLEdBQWFDLEVBQUlFLENBQUssRUFHMUIsVUFBVzVSLEtBQU82UixHQUNaN1IsS0FBTzJSLElBQ1RELEVBQUcxUixDQUFHLEVBQUkyUixFQUFLM1IsQ0FBRyxHQUd0QixPQUFPMFIsQ0FDVCxDQUVBLE1BQU1HLEdBQWlCLENBQ3JCLGVBQ0EsZ0JBQ0EsaUJBQ0EsZ0JBQ0EsZUFDQSxxQkFDQSxjQUNBLGNBQ0EsZUFDQSxnQkFDQSxpQkFDQSw4QkFHQSxvQkFDQSxrQkFDRixFQzNDTXJOLEdBQWEsQ0FBRSxFQUdOc04sRUFBQSxDQUNiLE9BQVEsQ0FBQ3ZPLEVBQVMsRUFFcEIsV0FBRWlCLEdBRUEsVUFBVVgsRUFBTWtPLEVBQVksQ0FXMUIsR0FWSUEsSUFDRTdRLEVBQUFBLGNBQWM2USxDQUFVLElBQzFCQSxFQUFhUixHQUFxQixDQUNoQyxRQUFTLEtBQ1QsS0FBQTFOLEVBQ0EsR0FBR2tPLENBQ2IsQ0FBUyxHQUVIdk4sR0FBV1gsQ0FBSSxFQUFJa08sR0FFakIsRUFBRWxPLEtBQVFXLElBQ1osTUFBTSxJQUFJLE1BQU0sY0FBY1gsbUJBQXNCLEVBRXRELE9BQU9XLEdBQVdYLENBQUksQ0FDdkIsRUFFRCxRQUFTLENBQ1AsaUJBQUFvRyxFQUNELENBQ0gsRUNqQ2UsTUFBTStILEVBQVMsQ0FDNUIsV0FBV0MsRUFBTyxDQUNoQixHQUFJLEtBQUssT0FDUCxVQUFXQyxLQUFRRCxFQUNqQixHQUFJLEtBQUssTUFBTSxTQUFTQyxDQUFJLEVBQzFCLE1BQU8sR0FJYixNQUFPLEVBQ1IsQ0FDSCxDQ1ZlLE1BQUFDLEdBQUEsQ0FDYixTQUFVLENBQ1IsTUFBTyxDQUNMLHVCQUF3QixJQUFNLElBQy9CLENBQ0YsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLGlCQUFrQixDQUFFLENBQ3JCLENBQ0YsRUFFRCxTQUFVLENBQ1IscUJBQXNCLENBQ3BCLE9BQU8sS0FBSyxpQkFBaUIsQ0FBQyxDQUMvQixDQUNGLEVBRUQsUUFBUyxDQUdQLHlCQUF5QjFLLEVBQWlCUyxFQUFLLENBQzdDLEtBQU0sQ0FBRSxpQkFBQWtLLENBQWdCLEVBQUssS0FDekJsSyxFQUNGa0ssRUFBaUIsS0FBSzNLLENBQWUsRUFFckMySyxFQUFpQixPQUFPQSxFQUFpQixRQUFRM0ssQ0FBZSxFQUFHLENBQUMsQ0FFdkUsQ0FDRixDQUNILEVDN0JlNEssR0FBQSxDQUNiLE9BQVEsQ0FBQ0YsRUFBaUIsRUFFMUIsU0FBVSxDQUNSLFFBQVMsQ0FDUCxPQUFPLEtBQUssaUJBQWlCLE9BQzNCLENBQUN0USxFQUFRLENBQUUsT0FBQXFGLENBQVEsSUFDakJBLEdBQVVyRixFQUFTQSxFQUFPLE9BQU9xRixDQUFNLEVBQUlBLEVBQzdDLElBQ0QsQ0FDRixFQUVELFdBQVksQ0FDVixPQUFPLEtBQUssaUJBQWlCLEtBQUtvTCxHQUFNQSxFQUFHLFNBQVMsQ0FDckQsRUFFRCxTQUFVLENBQ1IsT0FBTyxLQUFLLGlCQUFpQixLQUFLQSxHQUFNQSxFQUFHLE9BQU8sQ0FDbkQsRUFFRCxTQUFVLENBQ1IsT0FBTyxLQUFLLGlCQUFpQixNQUFNQSxHQUFNQSxFQUFHLE9BQU8sQ0FDcEQsRUFFRCxhQUFjLENBQ1osT0FBTyxLQUFLLGlCQUFpQixNQUFNQSxHQUFNQSxFQUFHLE9BQU8sQ0FDcEQsQ0FDRixFQUVELFFBQVMsQ0FDUCxZQUFZdE0sRUFBT1MsRUFBUyxHQUFNLENBQ2hDLE9BQU8sS0FBSyxpQkFBaUIsTUFBTTZMLEdBQU1BLEVBQUcsWUFBWXRNLEVBQU9TLENBQU0sQ0FBQyxDQUN2RSxFQUVELFVBQVVULEVBQU8sQ0FDZixPQUFPLEtBQUssaUJBQWlCLE1BQU1zTSxHQUFNQSxFQUFHLFVBQVV0TSxDQUFLLENBQUMsQ0FDN0QsRUFFRCxpQkFBa0IsQ0FDaEIsS0FBSyxpQkFBaUIsUUFBUXNNLEdBQU1BLEVBQUcsZ0JBQWUsQ0FBRSxDQUN6RCxFQUVELGFBQWMsQ0FDWixLQUFLLGlCQUFpQixRQUFRQSxHQUFNQSxFQUFHLFlBQVcsQ0FBRSxDQUNyRCxFQUVELHFCQUFxQnBMLEVBQVFDLEVBQU8sQ0FDbEMsS0FBSyxpQkFBaUIsUUFDcEJtTCxHQUFNQSxFQUFHLHFCQUFxQnBMLEVBQVFDLENBQUssQ0FDNUMsQ0FDRixDQUNGLENBQ0gsRUNuRGVvTCxHQUFBLENBQ2IsT0FBUSxDQUFDRixFQUFjLEVBRXZCLFNBQVUsQ0FDUixNQUFPLENBQ0wsZ0JBQWlCLElBQU0sSUFDeEIsQ0FDRixFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsT0FBUSxHQUlSLE1BQU8sQ0FBRSxFQUNULFVBQVcsQ0FBRSxDQUNkLENBQ0YsRUFFRCxTQUFVLENBQ1IsZ0JBQWlCLENBRWYsT0FBTyxJQUNSLEVBRUQsWUFBYSxDQUNYLElBQUl0RyxFQUFRLEVBQ1J5RyxFQUFpQixLQUNyQixLQUFRQSxFQUFpQkEsRUFBZSxnQkFBZ0IsZ0JBQ3REekcsSUFFRixPQUFPQSxDQUNSLEVBRUQsYUFBYyxDQUNaLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQzNDLEVBRUQsYUFBYyxDQUVaLEtBQU0sQ0FBRSxRQUFBMEcsR0FBWSxLQUFLLE9BQ3pCLE9BQU8sS0FBSyxjQUFnQkEsRUFBUUEsRUFBUSxPQUFTLENBQUMsQ0FDdkQsRUFFRCxxQkFBc0IsQ0FHcEIsS0FBTSxDQUFFLFFBQUFBLEdBQVksS0FBSyxPQUN6QixRQUFTQyxFQUFJRCxFQUFRLE9BQVMsRUFBR0MsR0FBSyxFQUFHQSxJQUFLLENBQzVDLE1BQU1DLEVBQVNGLEVBQVFDLENBQUMsRUFDeEIsR0FBSSxDQUFDQyxFQUFPLEtBQUssT0FDZixPQUFPLEtBQUssY0FBZ0JBLEVBR2hDLE1BQU8sRUFDUixFQUVELGVBQWdCLENBQ2QsT0FBTyxLQUFLLEtBQUssTUFDbEIsRUFFRCxRQUFTLENBQ1AsTUFBTyxFQUNSLEVBRUQsTUFBTyxPQUNMLE9BQU9uUixFQUFBLEtBQUssY0FBTCxZQUFBQSxFQUFrQixJQUMxQixFQUVELE1BQU8sQ0FDTCxPQUFPLEtBQUssYUFBYSxLQUFLLFlBQVksSUFBSSxDQUMvQyxFQUVELE9BQVEsQ0FDTixPQUFPLEtBQUssU0FBUyxLQUFLLE1BQU0sQ0FDakMsRUFFRCxZQUFhLENBQ1gsS0FBTSxDQUFFLFdBQUFvUixDQUFVLEVBQUssS0FBSyxRQUFVLENBQUUsRUFDeEMsT0FBT0EsR0FBYyxHQUFHLEtBQUssb0JBQW9CLEtBQUssT0FDdkQsRUFFRCxrQkFBbUIsQ0FDakIsTUFBTyxFQUNSLEVBRUQsT0FBUSxPQUlOLE9BQU8sS0FBSyxPQUFPLFFBQU9wUixFQUFBLEtBQUssT0FBTCxZQUFBQSxFQUFXLEtBQUssR0FBSyxJQUNoRCxFQUdELFlBQWEsQ0FDWCxNQUFPLEVBQ1IsQ0FDRixFQUVELGtCQUFrQmtRLEVBQUlDLEVBQU0vUCxFQUFNLENBQ2hDLGlCQUFNLGtCQUFrQjhQLEVBQUlDLEVBQU0vUCxFQUNuQyxFQUVELGlCQUFpQjhQLEVBQUlDLEVBQU0vUCxFQUFNLENBQy9CLGlCQUFNLGtCQUFrQjhQLEVBQUlDLEVBQU0vUCxFQUNuQyxFQUVELFNBQVUsQ0FJUixLQUFLLFNBQVMsZ0JBQWdCLEtBQUssSUFBSSxDQUN4QyxFQUVELFdBQVksQ0FDVixLQUFNLENBQUUsZ0JBQUFpUixHQUFvQixLQUFLLFNBQ2pDQSxFQUFnQixPQUFPQSxFQUFnQixRQUFRLElBQUksRUFBRyxDQUFDLENBQ3hELEVBRUQsUUFBUyxDQUNQLGtCQUFrQm5CLEVBQUlDLEVBQU0vUCxFQUFNLENBQ2hDLElBQUlrUixFQUFLLEdBS1BuQixFQUFLLEtBQUssV0FBVyxLQUFLLElBQUksR0FDOUIsQ0FBQ0QsRUFBRyxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBRTdCQyxFQUFLLE9BQVNELEVBQUcsT0FDZixLQUFLLGtCQUFrQkEsRUFBSUMsQ0FBSSxHQUkvQkQsRUFBRyxLQUFLLFFBQVVDLEVBQUssS0FBSyxVQUkxQixLQUFLLFdBSVBtQixFQUNFLEtBQUssYUFDTCxLQUFLLFlBQWEsRUFLaEIsS0FBSyxVQUNQQSxFQUFLLE9BQU8sUUFDVixtREFDRSxLQUFLLE1BQU0sU0FFZCxJQUlQbFIsRUFBS2tSLENBQUUsQ0FDUixFQUVELGFBQWFDLEVBQWMsQ0FJekIsT0FBTyxLQUFLLE9BQU8sS0FDaEIsTUFBTSxHQUFHLEVBQ1QsTUFBTSxFQUFHQSxFQUFhLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFDdkMsS0FBSyxHQUFHLENBQ1osRUFFRCxhQUFhM1UsRUFBTSxDQUNqQixNQUFPLEdBQUcsS0FBSyxRQUFRQSxHQUN4QixFQUVELGtCQUFrQnNULEVBQUlDLEVBQU0sQ0FFMUIsTUFBTXFCLEVBQVcsS0FBSyxLQUFLLE1BQU0sWUFBWSxFQUFFLENBQUMsRUFDaEQsTUFBTyxDQUFDQyxFQUFBQSxnQkFBZ0J2QixFQUFHLEtBQU1DLEVBQUssSUFBSSxFQUFFLFdBQVdxQixDQUFRLENBQ2hFLENBQ0YsQ0FDSCxvd0JDeEprQmxCLEVBQWMsVUFBVSxXQUFTLENBQ2pELE9BQVEsQ0FBQ1MsRUFBVSxFQUVuQixTQUFVLENBRVIsTUFBTyxDQUNMLGlCQUFrQixJQUFNLE9BQUEsUUFBQS9RLEVBQUEsS0FBSyxnQkFBTCxZQUFBQSxFQUFvQixrQkFBbUIsTUFDL0QsbUJBQW9CLElBQU0sT0FBQSxRQUFBQSxFQUFBLEtBQUssZ0JBQUwsWUFBQUEsRUFBb0Isb0JBQXFCLEtBQ3JFLENBQ0QsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUVMLFVBQVcsR0FHWCxLQUFNLENBQUMsQ0FDVCxDQUNELEVBRUQsU0FBVSxDQUNSLFFBQVMsQ0FDUCxPQUFPLEtBQUssS0FBSyxNQUNsQixFQUVELE1BQU8sQ0FDTCxPQUFPLEtBQUssT0FBTyxJQUNwQixFQUVELFFBQVMsQ0FDUCxNQUFPLEVBQ1IsRUFFRCx1QkFBd0IsQ0FDdEIsT0FBTzZJLEdBQXNCLEtBQUssTUFBTSxDQUN6QyxFQUVELGVBQWdCLENBQ2QsT0FBTyxLQUFLLG9CQUFvQix1QkFBdUIsS0FBSyxJQUFJLENBQ2pFLEVBRUQsWUFBYSxDQUNYLEtBQU0sQ0FBRSxVQUFBN0osRUFBVyxHQUFHd0MsR0FBVyxLQUFLLE9BR3RDLE9BQU8sS0FBSyxzQkFDUixDQUNFLEdBQUdBLEVBQ0gsV0FBWSxDQUNWLENBQUNBLEVBQU8sSUFBSSxFQUFHLENBQ2IsS0FBTUEsRUFBTyxLQUNiLE1BQU8sR0FDUCxHQUFHeEMsQ0FDTCxDQUNGLENBQ0YsRUFDQXdDLENBQ0wsRUFFRCxjQUFlLENBQ2IsT0FBT3lILEdBQW9CLEtBQUssV0FBWTFILEVBQVcsQ0FDekQsQ0FDRCxFQUVELE1BQU8sQ0FDTCxPQUFPMk8sRUFBSUMsRUFBTSxDQUVYLEtBQUssa0JBQWtCRCxFQUFJQyxDQUFJLElBQ2pDLEtBQUssVUFBWSxHQUNqQixLQUFLLEtBQU8sQ0FBQyxFQUVqQixDQUNELEVBRUQsUUFBUyxDQUNQLFFBQVFwUyxFQUFNLENBQ1osS0FBSyxLQUFPQSxDQUNiLEVBRUQsYUFBYW5CLEVBQU0sQ0FFakIsT0FBTyxLQUFLLHNCQUNSLEtBQUssS0FDTCxHQUFHLEtBQUssUUFBUUEsR0FDckIsRUFFRCxXQUFXOFUsRUFBVyxDQUNwQixLQUFLLFVBQVksQ0FBQyxDQUFDQSxDQUNyQixDQUNGLENBQ0YsQ0FBQyxpQ0MzSE0sU0FBU0MsR0FBU0MsRUFBTSxDQUM3QixLQUFBQyxHQUFPRCxHQUFBLFlBQUFBLEVBQU0sZ0JBQWlCLEVBQzlCLE1BQUFFLEdBQVFGLEdBQUEsWUFBQUEsRUFBTSxhQUFjLEVBQzVCLElBQUFHLEdBQU1ILEdBQUEsWUFBQUEsRUFBTSxZQUFhLEVBQ3pCLEtBQUFJLEdBQU9KLEdBQUEsWUFBQUEsRUFBTSxhQUFjLEVBQzNCLE9BQUFLLEdBQVNMLEdBQUEsWUFBQUEsRUFBTSxlQUFnQixFQUMvQixPQUFBTSxHQUFTTixHQUFBLFlBQUFBLEVBQU0sZUFBZ0IsRUFDL0IsWUFBQU8sR0FBY1AsR0FBQSxZQUFBQSxFQUFNLG9CQUFxQixDQUMzQyxFQUFJLEdBQUksQ0FDTixPQUFPLElBQUksS0FBS0MsRUFBTUMsRUFBT0MsRUFBS0MsRUFBTUMsRUFBUUMsRUFBUUMsQ0FBVyxDQUNyRSwyNUhDNkVLQyxHQUFVLENBQ2IsTUFBTyxDQUFDLG1CQUFtQixFQUUzQixNQUFPLENBQ0wsV0FBWSxDQUFFLEtBQU0sS0FBTSxRQUFTLElBQU0sRUFDekMsT0FBUSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDMUMsYUFBYyxDQUFFLEtBQU0sU0FBVSxRQUFTLElBQU0sRUFBTyxFQUN0RCxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTSxDQUN0QyxFQUVELE1BQU8sQ0FDTCxLQUFNLENBQUUsYUFBQUMsRUFBYyxXQUFBQyxHQUFlQyxHQUFlLEtBQUssTUFBTSxFQUMvRCxNQUFPLENBQ0wsYUFBQUYsRUFDQSxXQUFBQyxFQUNBLFVBQVcsQ0FBRSxFQUNiLFVBQVcsQ0FBRSxFQUNiLGFBQ0UsS0FBSyxZQUVMWCxHQUFTLElBQUksS0FBUSxDQUFFLEtBQU0sRUFBRyxPQUFRLEVBQUcsT0FBUSxFQUFHLFlBQWEsQ0FBQSxDQUFHLEVBRXhFLFlBQWEsS0FBSyxJQUNwQixDQUNELEVBRUQsTUFBTyxDQUNMLFdBQVd6QixFQUFJQyxFQUFNLENBQ2YsQ0FBQ0QsR0FBTyxDQUFDQyxJQUNYLEtBQUssYUFBZUQsR0FBTSxJQUFJLEtBQzlCLEtBQUssZ0JBQWdCLEVBRXhCLEVBRUQsYUFBYUEsRUFBSUMsRUFBTSxDQUNqQixDQUFDRCxHQUFPLENBQUNDLEdBQ1gsS0FBSyxnQkFBZ0IsQ0FFeEIsRUFFRCxhQUFjLGtCQUVkLEtBQUtxQyxFQUFNLENBQ1QsS0FBSyxZQUFjQSxDQUNyQixDQUNELEVBRUQsU0FBVSxDQUNSLEtBQUssZ0JBQWdCLENBQ3RCLEVBRUQsUUFBUyxDQUNQLGNBQWNWLEVBQU8sQ0FDbkIsTUFBTyxDQUNMLDRCQUNFLEtBQUssWUFDTEEsSUFBVSxLQUFLLFdBQVcsWUFDMUIsS0FBSyxhQUFhLFlBQVcsSUFBTyxLQUFLLFdBQVcsWUFBWSxFQUVsRSw2QkFBOEJBLElBQVUsS0FBSyxhQUFhLFNBQVMsQ0FDckUsQ0FDRCxFQUVELGFBQWFELEVBQU0sQ0FDakIsTUFBTyxDQUNMLDRCQUNFLEtBQUssWUFBY0EsSUFBUyxLQUFLLFdBQVcsWUFBWSxFQUUxRCw2QkFBOEJBLElBQVMsS0FBSyxhQUFhLFlBQVksQ0FDdkUsQ0FDRCxFQUVELFFBQVFZLEVBQVcsQ0FDakIsS0FBSyxhQUFlZCxHQUFTLEtBQUssYUFBY2MsQ0FBUyxDQUMxRCxFQUVELFdBQVdDLEVBQU0sQ0FDZixLQUFLLFFBQVEsQ0FDWCxLQUFNLEtBQUssYUFBYSxjQUFnQkEsRUFBTyxHQUNoRCxDQUNGLEVBRUQsUUFBUUYsRUFBTSxDQUNaLEtBQUssWUFBY0EsQ0FDcEIsRUFFRCxVQUFVRSxFQUFNLENBQ2QsS0FBTSxDQUFFLGFBQUFDLEdBQWlCLEtBQ25CLENBQUUsS0FBQWQsRUFBTSxNQUFBQyxDQUFNLEVBQUksS0FBSyxhQUMzQmEsRUFBYSxZQUFhLEVBQzFCQSxFQUFhLFNBQVEsRUFBS0QsQ0FDNUIsRUFDQSxLQUFLLFFBQVEsQ0FDWCxNQUFBWixFQUNBLElBQUssS0FBSyxJQUNSLEtBQUssZUFBZUQsRUFBTUMsQ0FBSyxFQUMvQixLQUFLLGFBQWEsUUFBUSxDQUM1QixFQUNELENBQ0YsRUFFRCxTQUFTWSxFQUFNLENBQ2IsS0FBSyxRQUFRLENBQ1gsS0FBTSxLQUFLLGFBQWEsY0FBZ0JBLEVBQ3pDLENBQ0YsRUFFRCxXQUFXZCxFQUFNZ0IsRUFBT3BGLEVBQU8sR0FBTyxDQUNoQ29GLElBQVUsYUFDUnBGLEVBQ0YsS0FBSyxRQUFRLENBQ1gsS0FBTW9FLEVBQUssWUFBYSxFQUN4QixNQUFPQSxFQUFLLFNBQVUsRUFDdEIsSUFBS0EsRUFBSyxRQUFRLEVBQ25CLEVBRUQsS0FBSyxhQUFlQSxFQUV0QixLQUFLLE1BQU0sb0JBQXFCLEtBQUssWUFBWSxFQUVwRCxFQUVELFlBQVlFLEVBQU8sQ0FDakIsS0FBSyxRQUFRLEtBQUssRUFHbEIsS0FBSyxRQUFRLENBQUUsTUFBQUEsRUFBTyxJQUFLLENBQUEsQ0FBRyxDQUMvQixFQUVELFdBQVdELEVBQU0sQ0FDZixLQUFLLFFBQVEsT0FBTyxFQUNwQixLQUFLLFFBQVEsQ0FBRSxLQUFBQSxFQUFNLENBQ3RCLEVBRUQsYUFBYUEsRUFBTUMsRUFBTyxDQUN4QixPQUFJQSxFQUFRLElBQ1ZELElBQ0FDLEVBQVEsR0FDQ0EsRUFBUSxJQUNqQkQsSUFDQUMsRUFBUSxJQUVILENBQUUsS0FBQUQsRUFBTSxNQUFBQyxDQUFNLENBQ3RCLEVBRUQsYUFBYUYsRUFBTSxDQUFFLEtBQUFDLEVBQU0sTUFBQUMsRUFBTyxJQUFBQyxDQUFFLEVBQUssQ0FDdkMsT0FBT0gsRUFBSyxlQUFlLEtBQUssT0FBUSxDQUN0QyxLQUFNQyxHQUFRLFVBQ2QsTUFBT0MsR0FBUyxPQUNoQixJQUFLQyxHQUFPLFVBQ2IsQ0FDRixFQUVELGVBQWVILEVBQU0sQ0FDbkIsTUFBTUMsRUFBTyxLQUFLLHFCQUFxQkQsRUFBSyxZQUFXLENBQUUsRUFDekQsTUFBTyxHQUFHQyxPQUFVQSxFQUFPLEdBQzVCLEVBRUQsZUFBZUEsRUFBTUMsRUFBTyxDQUMxQixPQUFPLElBQUksS0FBS0QsRUFBTUMsRUFBUSxFQUFHLENBQUMsRUFBRSxRQUFRLENBQzdDLEVBRUQscUJBQXFCRCxFQUFNLENBRXpCLE1BQU8sQ0FBQyxHQURRQSxFQUFLLFNBQVMsRUFDWCxNQUFNLEVBQUcsRUFBRSxJQUMvQixFQUVELFNBQVMsQ0FBRSxJQUFBZ0IsRUFBSyxJQUFBQyxFQUFLLE1BQUFDLENBQU0sRUFBRyxDQUM1QixLQUFNLENBQUUsWUFBQUMsRUFBYSxhQUFBTCxDQUFhLEVBQUksS0FDdEMsR0FBSUUsR0FBT0MsRUFBSyxDQUNkLE9BQVFFLEVBQVcsQ0FDakIsSUFBSyxNQUNILEtBQUssUUFBUSxDQUNYLElBQUtMLEVBQWEsUUFBUSxFQUFJRSxFQUFNQyxFQUFNLEVBQzNDLEVBQ0QsTUFDRixJQUFLLFFBQ0gsS0FBSyxRQUFRLENBQ1gsTUFBT0gsRUFBYSxTQUFTLEVBQUlFLEVBQU1DLEVBQU0sRUFDOUMsRUFDRCxNQUNGLElBQUssT0FDSCxLQUFLLFFBQVEsQ0FDWCxLQUFNSCxFQUFhLFlBQWMsRUFBRUUsRUFBTUMsRUFBTSxFQUNoRCxFQUNELEtBQ0osQ0FDQSxNQUFPLFdBQ0VDLEVBQU8sQ0FDaEIsT0FBUUMsRUFBVyxDQUNqQixJQUFLLE1BQ0gsS0FBSyxXQUFXTCxDQUFZLEVBQzVCLE1BQ0YsSUFBSyxRQUNILEtBQUssUUFBUSxLQUFLLEVBQ2xCLE1BQ0YsSUFBSyxPQUNILEtBQUssUUFBUSxPQUFPLEVBQ3BCLEtBQ0osQ0FDQSxNQUFPLEdBRVYsRUFFRCxpQkFBa0IsQ0FDaEIsS0FBSyxVQUFZLENBQUMsRUFDbEIsS0FBSyxVQUFZLENBQUMsRUFFbEIsS0FBTSxDQUFFLGFBQUFBLEdBQWlCLEtBQ25CZCxFQUFPYyxFQUFhLFlBQVksRUFDaENiLEVBQVFhLEVBQWEsU0FBUyxFQUM5Qk0sRUFBWSxLQUFLLHFCQUFxQnBCLENBQUksRUFDaEQsUUFBU1gsRUFBSSxFQUFHQSxFQUFJLEdBQUlBLElBQ3RCLEtBQUssVUFBVSxLQUFLK0IsRUFBWS9CLENBQUMsRUFHbkMsSUFBSWdDLEVBRHNCLElBQUksS0FBS3JCLEVBQU1DLEVBQU8sQ0FBQyxFQUNaLE9BQU0sRUFBSyxFQUM1Q29CLElBQWlCLElBQ25CQSxFQUFlLEdBRWpCLE1BQU1DLEVBQVUsS0FBSyxlQUFldEIsRUFBTUMsQ0FBSyxFQUMvQyxHQUFJb0IsRUFBZSxFQUFHLENBQ3BCLE1BQU1FLEVBQVksS0FBSyxhQUFhdkIsRUFBTUMsRUFBUSxDQUFDLEVBQzdDdUIsRUFBbUIsS0FBSyxlQUM1QkQsRUFBVSxLQUNWQSxFQUFVLEtBQ1osRUFDQSxRQUFTbEMsRUFBSSxFQUFHQSxFQUFJZ0MsRUFBY2hDLElBQUssQ0FDckMsTUFBTWEsRUFBTXNCLEVBQW1CSCxFQUFlaEMsRUFBSSxFQUM1Q1UsRUFBTyxJQUFJLEtBQUt3QixFQUFVLEtBQU1BLEVBQVUsTUFBT3JCLENBQUcsRUFDMUQsS0FBSyxVQUFVLEtBQUssQ0FDbEIsS0FBTUEsRUFDTixLQUFBSCxFQUNBLE1BQU8sS0FBSyxhQUFhQSxDQUFJLEVBQUksV0FBYSxPQUMvQyxHQUlMLE1BQU0wQixFQUFRLElBQUksS0FDbEIsUUFBU3BDLEVBQUksRUFBR0EsR0FBS2lDLEVBQVNqQyxJQUFLLENBQ2pDLE1BQU1VLEVBQU8sSUFBSSxLQUFLQyxFQUFNQyxFQUFPWixDQUFDLEVBQzlCcUMsRUFBUTNCLEdBQ1pBLEdBQ0FBLEVBQUssUUFBTyxJQUFPVixHQUNuQlUsRUFBSyxZQUFXLElBQU9DLEdBQ3ZCRCxFQUFLLFNBQVEsSUFBT0UsRUFFaEJjLEVBQVFXLEVBQU0sS0FBSyxVQUFVLEVBQy9CLFNBQ0FBLEVBQU1ELENBQUssRUFDVCxRQUNBLEtBQUssYUFBYTFCLENBQUksRUFDcEIsV0FDQTJCLEVBQU1aLENBQVksRUFDaEIsVUFDQSxLQUNWLEtBQUssVUFBVSxLQUFLLENBQ2xCLEtBQU16QixFQUNOLEtBQUFVLEVBQ0EsTUFBQWdCLEVBQ0QsRUFHSCxNQUFNWSxFQUFnQixHQUFLLEtBQUssVUFBVSxPQUMxQyxHQUFJQSxFQUFnQixFQUFHLENBQ3JCLE1BQU1DLEVBQVksS0FBSyxhQUFhNUIsRUFBTUMsRUFBUSxDQUFDLEVBQ25ELFFBQVNaLEVBQUksRUFBR0EsR0FBS3NDLEVBQWV0QyxJQUFLLENBQ3ZDLE1BQU1VLEVBQU8sSUFBSSxLQUFLNkIsRUFBVSxLQUFNQSxFQUFVLE1BQU92QyxDQUFDLEVBQ2xEMEIsRUFBUSxLQUFLLGFBQWFoQixDQUFJLEVBQUksV0FBYSxPQUNyRCxLQUFLLFVBQVUsS0FBSyxDQUNsQixLQUFNVixFQUNOLEtBQUFVLEVBQ0EsTUFBQWdCLEVBQ0QsR0FHUCxDQUNGLENBQ0YsRUFFTWMsR0FBYyxDQUFDLEVBR3JCLFNBQVNuQixHQUFlaFAsRUFBUSxDQUM5QixJQUFJb1EsRUFBUUQsR0FBWW5RLENBQU0sRUFDOUIsR0FBSSxDQUFDb1EsRUFBTyxDQUNWLE1BQU10QixFQUFlLENBQUMsRUFDdEIsUUFBU25CLEVBQUksRUFBR0EsRUFBSSxFQUFHQSxJQUFLLENBQzFCLE1BQU1VLEVBQU8sSUFBSSxLQUFLLEVBQUcsRUFBR1YsQ0FBQyxFQUM3Qm1CLEVBQWEsS0FBSyxDQUNoQixLQUFNVCxFQUFLLGVBQWVyTyxFQUFRLENBQUUsUUFBUyxPQUFRLEVBQ3JELE1BQU9xTyxFQUFLLGVBQWVyTyxFQUFRLENBQUUsUUFBUyxRQUFTLEVBQ3hELEVBRUgsTUFBTStPLEVBQWEsQ0FBQyxFQUNwQixRQUFTcEIsRUFBSSxFQUFHQSxHQUFLLEdBQUlBLElBQUssQ0FDNUIsTUFBTVUsRUFBTyxJQUFJLEtBQUssRUFBR1YsRUFBRyxDQUFDLEVBQzdCb0IsRUFBVyxLQUFLLENBQ2QsS0FBTVYsRUFBSyxlQUFlck8sRUFBUSxDQUFFLE1BQU8sT0FBUSxFQUNuRCxNQUFPcU8sRUFBSyxlQUFlck8sRUFBUSxDQUFFLE1BQU8sUUFBUyxFQUN0RCxFQUVIb1EsRUFBUUQsR0FBWW5RLENBQU0sRUFBSSxDQUM1QixhQUFBOE8sRUFDQSxXQUFBQyxDQUNGLEVBRUYsT0FBT3FCLENBQ1QsZ0NDN1lPLFNBQVNDLEdBQVVwVCxFQUFRcUQsRUFBUSxDQUN4QyxVQUFXekMsS0FBUXlDLEVBQ2pCckQsRUFBTyxpQkFBaUJZLEVBQU15QyxFQUFPekMsQ0FBSSxFQUFHLEVBQUssRUFFbkQsTUFBTyxDQUNMLFFBQVMsQ0FDUCxVQUFXQSxLQUFReUMsRUFDakJyRCxFQUFPLG9CQUFvQlksRUFBTXlDLEVBQU96QyxDQUFJLEVBQUcsRUFBSyxDQUV2RCxDQUNGLENBQ0gsQ0FFTyxTQUFTeVMsR0FBT3ZVLEVBQU8sQ0FDNUIsTUFBTyxDQUNMLEdBQUksT0FDSixHQUFJLEtBQ0osR0FBSSxRQUNKLEdBQUksT0FDSixHQUFJLE9BQ1IsRUFBSUEsRUFBTSxPQUFPLENBQ2pCLENBRU8sU0FBU3dVLEdBQWlCeFUsRUFBTyxDQUN0QyxNQUFNZCxFQUFNcVYsR0FBT3ZVLENBQUssRUFDeEIsTUFBTyxDQUNMLElBQUssQ0FBRSxLQUFNLEdBQUksTUFBTyxDQUFHLEVBQUNkLENBQUcsR0FBSyxFQUNwQyxJQUFLLENBQUUsR0FBSSxHQUFJLEtBQU0sQ0FBRyxFQUFDQSxDQUFHLEdBQUssRUFDakMsTUFBT0EsSUFBUSxPQUNoQixDQUNILGt3REMrQmUsQ0FDYixNQUFPLENBQUMsYUFBYSxFQUVyQixNQUFPLENBQ0wsUUFBUyxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDM0MsV0FBWSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDOUMsVUFBVyxDQUFFLEtBQU0sT0FBUSxRQUFTLFFBQVUsRUFDOUMsS0FBTSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDdkMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsT0FBUSxDQUFFLEtBQU0sQ0FBQyxPQUFRLFdBQVcsRUFBRyxRQUFTLElBQU0sRUFDdEQsWUFBYSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDNUMsT0FBUSxDQUFFLEtBQU0sT0FBUSxRQUFTLENBQUcsRUFDcEMsV0FBWSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU0sRUFDNUMscUJBQXNCLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTSxFQUN0RCxXQUFZLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUM3QyxNQUFPLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN4QyxVQUFXLENBQUUsS0FBTSxPQUFRLFFBQVMsQ0FBRSxDQUN2QyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsVUFBVyxLQUFLLEtBQ2hCLGVBQWdCLEtBQUssU0FDdkIsQ0FDRCxFQUVELFNBQVUsQ0FDUixjQUFlLENBQ2IsTUFBTyxDQUNMLHdCQUF5QixLQUFLLFFBQ2hDLENBQ0QsRUFFRCxZQUFhLENBQ1gsTUFBTXVWLEVBQVUsQ0FDZCxDQUFDLGNBQWM5UCxFQUFTLFVBQUMsS0FBSyxTQUFTLEdBQUcsRUFBRyxFQUMvQyxFQUNBLE9BQUksS0FBSyxjQUNQOFAsRUFBUSxLQUFLLFdBQVcsRUFBSSxJQUV2QkEsQ0FDUixFQUVELFlBQWEsQ0FDWCxPQUFPLEtBQUssT0FBUyxZQUFZLEtBQUssU0FBVyxFQUNuRCxDQUNELEVBRUQsTUFBTyxDQUNMLEtBQUtDLEVBQU0sQ0FDVCxLQUFLLFVBQVlBLEdBQVEsS0FBSyxVQUMvQixFQUVELFVBQVU5RCxFQUFJQyxFQUFNLENBQ2RELEVBQUtDLElBQ1AsS0FBSyxNQUFNLGNBQWVELENBQUUsRUFDeEJBLEdBQ0YsS0FBSyxVQUFVLElBQU0sS0FBSyxlQUFjLENBQUUsRUFHaEQsQ0FDRCxFQUVELFNBQVUsQ0FDUixLQUFNLENBQUUsUUFBQStELEVBQVMsTUFBQUMsQ0FBUSxFQUFFLEtBQUssTUFDaEMsR0FBSSxLQUFLLFVBQVksUUFBUyxDQUM1QixNQUFNMVQsRUFBU3lULEVBQVEsY0FBYyxpQkFBaUIsRUFDbER6VCxJQUNGLEtBQUssWUFBY29ULEdBQVVwVCxFQUFRLENBQ25DLE1BQU8sSUFBTSxDQUNYLEtBQUssVUFBWSxFQUNsQixFQUNELEtBQU0sSUFBTSxDQUNWLEtBQUssVUFBWSxFQUNuQixFQUNELEdBSUQsS0FBSyxzQkFBd0IsQ0FBQyxLQUFLLGFBSXJDLEtBQUssWUFBY29ULEdBQVUsT0FBUSxDQUNuQyxRQUFTdFUsR0FBUyxDQUVkLEtBQUssV0FDTCxDQUFDNFUsRUFBTSxTQUFTNVUsRUFBTSxNQUFNLEdBQzVCLENBQUMyVSxFQUFRLFNBQVMzVSxFQUFNLE1BQU0sSUFFOUIsS0FBSyxVQUFZLEdBRXBCLEVBRUQsS0FBTSxJQUFNLENBQ1YsS0FBSyxVQUFZLEVBQ25CLEVBQ0QsR0FHQyxLQUFLLGFBQ1AsS0FBSyxVQUFZLEdBRXBCLEVBRUQsU0FBVSxDQUNSLEtBQUssVUFBWSxLQUFLLElBQ3ZCLEVBRUQsZUFBZ0IsVUFDZFUsRUFBQSxLQUFLLGNBQUwsTUFBQUEsRUFBa0IsVUFDbEI0RyxFQUFBLEtBQUssY0FBTCxNQUFBQSxFQUFrQixTQUNsQixLQUFLLGdCQUFrQixJQUN4QixFQUVELFFBQVMsQ0FDUCxnQkFBaUIsQ0FDZixLQUFNLENBQUUsUUFBQXFOLEVBQVMsTUFBQUMsQ0FBUSxFQUFFLEtBQUssTUFDaEMsR0FBSSxLQUFLLE1BQVFBLEVBQU0sY0FBZ0IsRUFBRyxDQUN4QyxXQUFXLElBQU0sS0FBSyxlQUFjLEVBQUksQ0FBQyxFQUN6QyxPQUdGLE1BQU0xVCxFQUFTSSxFQUFBQSxTQUFTLEtBQUssTUFBTSxFQUMvQixLQUFLLE1BQU0sS0FBSyxNQUFNLEVBQ3RCLEtBQUssT0FDVCxHQUFJSixFQUFRLENBRVYsTUFBTTJULEVBQUszVCxJQUFXMFQsRUFBUUQsRUFBVUMsRUFBTSxrQkFDMUNDLElBQ0ZBLEVBQUcsTUFBTSxNQUFRLGlCQUFpQjNULENBQU0sRUFBRSxPQUk5QyxNQUFNNFQsR0FBVTVULEdBQVV5VCxHQUFTLHNCQUFzQixFQUNuREksRUFBY0QsRUFBTyxLQUFPLE9BQU8sUUFDbkNFLEVBQWFGLEVBQU8sSUFBTSxPQUFPLFFBQ2pDRyxFQUFlSCxFQUFPLE1BQ3RCSSxFQUFnQkosRUFBTyxPQUN2QkssRUFBYVAsRUFBTSxZQUNuQlEsRUFBY1IsRUFBTSxhQUUxQixHQUFJLENBQUNTLEVBQU9DLENBQUssRUFBSSxLQUFLLGVBQWUsTUFBTSxHQUFHLEdBQUssQ0FBQyxFQUN4RCxHQUFJLEtBQUssV0FBWSxDQUNuQixNQUFNQyxFQUFXLE9BQU8sV0FDbEJDLEVBQVksT0FBTyxZQUNyQkgsSUFBVSxNQUNSTCxFQUFhSSxJQUNmQyxFQUFRLFVBRURBLElBQVUsU0FDZkcsRUFBWVIsRUFBYUUsRUFBZ0JFLElBQzNDQyxFQUFRLE9BRURBLElBQVUsT0FDZk4sRUFBY0ksSUFDaEJFLEVBQVEsU0FFREEsSUFBVSxTQUNmRSxFQUFXUixFQUFjRSxFQUFlRSxJQUMxQ0UsRUFBUSxRQUlSQyxJQUFVLE1BQ1JFLEVBQVlSLEVBQWFJLElBQzNCRSxFQUFRLFVBRURBLElBQVUsU0FDZk4sRUFBYUUsRUFBZ0JFLElBQy9CRSxFQUFRLE9BRURBLElBQVUsT0FDZkMsRUFBV1IsRUFBY0ksSUFDM0JHLEVBQVEsU0FFREEsSUFBVSxTQUNmUCxFQUFjRSxFQUFlRSxJQUMvQkcsRUFBUSxRQUtkLElBQUlHLEVBQU8sRUFDUEMsRUFBTSxFQUNWLE9BQVFMLEVBQUssQ0FDWCxJQUFLLE1BQ0hLLEdBQU9OLEVBQ1AsTUFDRixJQUFLLE9BQ0hLLEdBQVFOLEVBQ1IsTUFDRixJQUFLLFFBQ0hNLEdBQVFSLEVBQ1IsTUFDRixJQUFLLFNBQ0hTLEdBQU9SLEVBQ1AsS0FDSixDQUNBLE9BQVFJLEVBQUssQ0FDWCxJQUFLLFFBQ0hHLEdBQVFOLEVBQWFGLEVBQ3JCLE1BQ0YsSUFBSyxTQUNIUyxHQUFPTixFQUFjRixFQUNyQixLQUNKLENBUUEsR0FQSSxLQUFLLFFBQ0hHLElBQVUsTUFDWkssR0FBT1IsRUFDRUcsSUFBVSxXQUNuQkssR0FBT1IsSUFHUGhVLEdBQVVBLElBQVd5VCxFQUFTLENBQ2hDLE1BQU1nQixFQUFnQmhCLEVBQVEsc0JBQXNCLEVBQ3BEYyxHQUFRVixFQUFjWSxFQUFjLEtBQ3BDRCxHQUFPVixFQUFhVyxFQUFjLElBRXBDZixFQUFNLE1BQU0sS0FBTyxHQUFHYSxNQUN0QmIsRUFBTSxNQUFNLElBQU0sR0FBR2MsS0FDdEIsRUFFRCxTQUFVLENBQ0gsS0FBSyxXQUNSLEtBQUssVUFBWSxDQUFDLEtBQUssVUFFMUIsRUFFRCxRQUFRakMsRUFBTyxDQUNSLEtBQUssV0FDUixhQUFhLEtBQUssZUFBZSxFQUM3QkEsRUFDRixLQUFLLFVBQVksR0FFYixLQUFLLFVBQ1AsS0FBSyxnQkFBa0IsV0FBVyxJQUFNLENBQ3RDLEtBQUssVUFBWSxFQUNuQixFQUFHLEtBQUssU0FBUyxFQUVqQixLQUFLLFVBQVksR0FJekIsQ0FDRixDQUNGLHVtQkMvUmUsQ0FDYixNQUFPLENBQUMsbUJBQW1CLEVBRTNCLE1BQU8sQ0FDTCxXQUFZLENBQUUsS0FBTSxDQUFDLE9BQVEsTUFBTSxFQUFHLFFBQVMsSUFBTSxFQUNyRCxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsTUFBUSxFQUN2QyxHQUFJLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUNuQyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUNyQyxNQUFPLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUN0QyxTQUFVLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUMzQyxTQUFVLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUMzQyxVQUFXLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUM1QyxZQUFhLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUM1QyxhQUFjLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTSxDQU05QyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsYUFBYyxLQUFLLFdBQ25CLFNBQVUsR0FDVixRQUFTLEVBQ1gsQ0FDRCxFQUVELFNBQVUsQ0FDUixNQUFPLENBRUwsS0FBTSxDQUFFLEtBQUFtQyxFQUFNLElBQUFyUSxFQUFLLElBQUFELENBQUksRUFBSSxLQUFLLE9BQzFCdVEsRUFBWXZXLEdBQVVBLEdBQVMsS0FBTyxHQUFHQSxJQUFRLE9BQVMsRUFDaEUsT0FBT3NXLEdBQVFDLEVBQVV0USxDQUFHLEdBQUtzUSxFQUFVdlEsQ0FBRyxHQUFLLE1BQ3JELENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBV3NMLEVBQUlDLEVBQU0sQ0FDZkQsSUFBT0MsSUFDVCxLQUFLLGFBQWVELEVBRXZCLEVBRUQsYUFBYXlDLEVBQWMsQ0FDckJBLElBQWlCLEtBQUssWUFDeEIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBWSxDQUVoRCxDQUNELEVBRUQsUUFBUyxDQUNQLE9BQVEsQ0FDTixLQUFLLE1BQU0sTUFBTSxNQUFNLENBQ3hCLEVBRUQsTUFBTyxDQUNMLEtBQUssTUFBTSxNQUFNLEtBQUssQ0FDeEIsQ0FDRixDQUNGLG9tQ0M3Q2UsQ0FDYixXQUFZLENBQUUsUUFBQXlDLEdBQVMsU0FBQUMsR0FBVSxXQUFBQyxDQUFZLEVBQzdDLE1BQU8sQ0FBQyxvQkFBcUIsY0FBZSxRQUFTLE1BQU0sRUFFM0QsTUFBTyxDQUNMLFdBQVksQ0FBRSxLQUFNLEtBQU0sUUFBUyxJQUFNLEVBQ3pDLFdBQVksQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzlDLFVBQVcsQ0FBRSxLQUFNLE9BQVEsUUFBUyxhQUFlLEVBQ25ELFlBQWEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQzVDLE9BQVEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzFDLFdBQVksQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNQyxFQUFjLGVBQUMsSUFBTSxFQUNoRSxLQUFNLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN2QyxTQUFVLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUMzQyxPQUFRLENBQUUsS0FBTSxDQUFDLE9BQVEsV0FBVyxFQUFHLFFBQVMsU0FBVyxFQUMzRCxhQUFjLENBQUUsS0FBTSxTQUFVLFFBQVMsSUFBTSxFQUFNLENBQ3RELEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxhQUFjLEtBQUssV0FDbkIsVUFBVyxLQUFLLEtBQ2hCLGFBQWMsR0FDZCxRQUFTLEVBQ1gsQ0FDRCxFQUVELFNBQVUsQ0FDUixTQUFVLENBQ1IsT0FBTyxLQUFLLGNBQWdCLEtBQUssU0FDbEMsRUFFRCxhQUFjLENBQ1osT0FDRS9SLEVBQU0sT0FBQyxLQUFLLGFBQWMsQ0FDeEIsT0FBUSxLQUFLLE9BQ2IsS0FBTSxLQUFLLFdBQ1gsS0FBTSxFQUNQLENBQUEsR0FBSyxFQUVWLENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBVzBNLEVBQUlDLEVBQU0sQ0FDZixDQUFDRCxHQUFPLENBQUNDLElBQ1gsS0FBSyxhQUFlRCxFQUV2QixFQUVELGFBQWF5QyxFQUFjLENBQ3JCLENBQUNBLEdBQWlCLENBQUMsS0FBSyxhQUMxQixLQUFLLFFBQVUsR0FDZixLQUFLLFVBQVksR0FDakIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBWSxFQUUvQyxFQUVELEtBQUtxQixFQUFNLENBQ1QsS0FBSyxVQUFZQSxDQUNsQixFQUVELFVBQVU5RCxFQUFJQyxFQUFNLENBQ2RELEVBQUtDLEdBQ1AsS0FBSyxNQUFNLGNBQWVELENBQUUsQ0FFL0IsRUFFRCxRQUFRQSxFQUFJQyxFQUFNLENBQ1pELEVBQUtDLElBQ1AsS0FBSyxNQUFNRCxFQUFLLFFBQVUsTUFBTSxFQUM1QixDQUFDQSxHQUFNLEtBQUssVUFHZCxLQUFLLFFBQVUsR0FDZixLQUFLLE1BQU0sb0JBQXFCLEtBQUssWUFBWSxHQUd2RCxDQUNELEVBRUQsUUFBUyxDQUNQLFVBQVU1USxFQUFPLFFBQ1hVLEVBQUEsS0FBSyxNQUFNLFdBQVgsTUFBQUEsRUFBcUIsU0FBUzhULEdBQWlCeFUsQ0FBSyxJQUN0REEsRUFBTSxlQUFlLENBRXhCLEVBRUQsT0FBUSxDQUNOLEtBQUssTUFBTSxNQUFNLE1BQU0sQ0FDeEIsRUFFRCxNQUFPLENBQ0wsS0FBSyxNQUFNLE1BQU0sS0FBSyxDQUN4QixDQUNGLENBQ0YsbUJDbklPLFNBQVNrVyxHQUFTN08sRUFBU3VKLEVBQUl1RixFQUFVLENBQzlDLE1BQU1DLEVBQ0osT0FBTyx1QkFDUCxVQUFZLENBQ1YsT0FBTyxXQUFXLFVBQVUsQ0FBQyxFQUFHLEVBQUUsQ0FDbkMsRUFFSCxHQUFJRCxHQUFZLEVBQ2Q5TyxFQUFRLFVBQVl1SixNQUNmLENBRUwsTUFBTXlGLEdBRGF6RixFQUFLdkosRUFBUSxXQUNIOE8sRUFBVyxHQUN4Q0MsRUFBc0IsSUFBTSxDQUMxQi9PLEVBQVEsVUFBWUEsRUFBUSxVQUFZZ1AsRUFDcENoUCxFQUFRLFlBQWN1SixHQUMxQnNGLEdBQVM3TyxFQUFTdUosRUFBSXVGLEVBQVcsRUFBRSxDQUN6QyxDQUFLLEVBRUwsQ0NsQk8sU0FBU0csR0FBYUMsRUFBT0MsRUFBT0MsRUFBSyxDQUM5QyxHQUFJRixFQUFNLGdCQUFpQixDQUN6QixNQUFNRyxFQUFRSCxFQUFNLGdCQUFpQixFQUNyQ0csRUFBTSxTQUFTLEVBQUksRUFDbkJBLEVBQU0sVUFBVSxZQUFhRixDQUFLLEVBQ2xDRSxFQUFNLFFBQVEsWUFBYUQsQ0FBRyxFQUM5QkMsRUFBTSxPQUFRLEVBQ2RILEVBQU0sTUFBTyxPQUNKQSxFQUFNLG1CQUNmQSxFQUFNLE1BQU8sRUFDYkEsRUFBTSxrQkFBa0JDLEVBQU9DLENBQUcsR0FDekIsbUJBQW9CRixJQUM3QkEsRUFBTSxlQUFpQkMsRUFDdkJELEVBQU0sYUFBZUUsRUFDckJGLEVBQU0sTUFBTyxFQUVqQixvaEZDMERlLENBQ2IsV0FBWSxDQUFFLFFBQUFULEdBQVMsV0FBQUUsQ0FBWSxFQUNuQyxNQUFPLENBQUMsb0JBQXFCLGNBQWUsU0FBVSxRQUFTLE1BQU0sRUFFckUsTUFBTyxDQUNMLFdBQVksQ0FBRSxLQUFNLEtBQU0sUUFBUyxJQUFNLEVBQ3pDLFdBQVksQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzlDLFVBQVcsQ0FBRSxLQUFNLE9BQVEsUUFBUyxhQUFlLEVBQ25ELFlBQWEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQzVDLEtBQU0sQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQ3ZDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLE9BQVEsQ0FBRSxLQUFNLENBQUMsT0FBUSxXQUFXLEVBQUcsUUFBUyxTQUFXLEVBQzNELGFBQWMsQ0FBRSxLQUFNLFNBQVUsUUFBUyxJQUFNLEVBQU8sRUFDdEQsZUFBZ0IsQ0FBRSxLQUFNLFNBQVUsUUFBUyxJQUFNLEVBQU8sRUFDeEQsZUFBZ0IsQ0FBRSxLQUFNLFNBQVUsUUFBUyxJQUFNLEVBQU0sQ0FDeEQsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLGFBQWMsS0FBSyxXQUNuQixVQUFXLEtBQUssS0FDaEIsYUFBYyxHQUNkLFVBQVcsRUFDWCxRQUFTLEVBQ1gsQ0FDRCxFQUVELFNBQVUsQ0FDUixTQUFVLENBQ1IsT0FBTyxLQUFLLGNBQWdCLEtBQUssU0FDbEMsRUFFRCxhQUFjLENBQ1osT0FBTyxLQUFLLGFBQ1IsR0FDRSxLQUFLLFFBQVEsS0FBSyxJQUFJLEtBRXRCLEtBQUssUUFBUSxLQUFLLE1BQU0sS0FFeEIsS0FBSyxRQUFRLEtBQUssTUFBTSxJQUUxQixFQUNMLEVBRUQsYUFBYyxDQUNaLE9BQ0UsS0FBSyxjQUlMM0QsR0FBUyxJQUFJLEtBQVEsQ0FBRSxLQUFNLEVBQUcsT0FBUSxFQUFHLE9BQVEsRUFBRyxZQUFhLENBQUEsQ0FBRyxDQUV6RSxFQUVELEtBQU0sQ0FDSixLQUFNLENBQ0osT0FBTyxLQUFLLFlBQVksU0FBUyxDQUNsQyxFQUVELElBQUlLLEVBQU0sQ0FDUixLQUFLLFFBQVEsQ0FBRSxLQUFBQSxFQUFNLENBQ3ZCLENBQ0QsRUFFRCxPQUFRLENBQ04sS0FBTSxDQUNKLE9BQU8sS0FBSyxZQUFZLFdBQVcsQ0FDcEMsRUFFRCxJQUFJQyxFQUFRLENBQ1YsS0FBSyxRQUFRLENBQUUsT0FBQUEsRUFBUSxDQUN6QixDQUNELEVBRUQsT0FBUSxDQUNOLEtBQU0sQ0FDSixPQUFPLEtBQUssWUFBWSxXQUFXLENBQ3BDLEVBRUQsSUFBSUMsRUFBUSxDQUNWLEtBQUssUUFBUSxDQUFFLE9BQUFBLEVBQVEsQ0FDekIsQ0FDRixDQUNELEVBRUQsTUFBTyxDQUNMLFdBQVdoQyxFQUFJQyxFQUFNLENBQ2YsQ0FBQ0QsR0FBTyxDQUFDQyxJQUNYLEtBQUssYUFBZUQsRUFFdkIsRUFFRCxhQUFhMEIsRUFBTSxDQUNiLENBQUNBLEdBQVMsQ0FBQyxLQUFLLGFBQ2xCLEtBQUssUUFBVSxHQUNmLEtBQUssTUFBTSxvQkFBcUJBLENBQUksRUFDcEMsS0FBSyxVQUFVLEVBRWxCLEVBRUQsWUFBYSxrQkFFYixVQUFXLGtCQUVYLEtBQUtvQyxFQUFNLENBQ1QsS0FBSyxVQUFZQSxDQUNsQixFQUVELFVBQVU5RCxFQUFJQyxFQUFNLENBQ2RELElBQ0YsS0FBSyxnQkFBZ0IsRUFDckIsS0FBSyxVQUFVLENBQUMsR0FFZEEsRUFBS0MsR0FDUCxLQUFLLE1BQU0sY0FBZUQsQ0FBRSxDQUUvQixFQUVELFFBQVFBLEVBQUlDLEVBQU0sQ0FDWkQsRUFBS0MsSUFDUCxLQUFLLE1BQU1ELEVBQUssUUFBVSxNQUFNLEVBQzVCLENBQUNBLEdBQU0sS0FBSyxVQUNkLEtBQUssUUFBVSxHQUNmLEtBQUssTUFBTSxTQUFVLEtBQUssWUFBWSxHQUc1QyxDQUNELEVBRUQsUUFBUyxDQUNQLFFBQVF0UixFQUFPLENBQ2IsT0FBUSxJQUFNQSxHQUFPLE1BQU0sRUFBRSxDQUM5QixFQUVELFFBQVE2VCxFQUFXLENBQ2pCLEtBQUssYUFBZWQsR0FBUyxLQUFLLFlBQWEsQ0FDN0MsR0FBR2MsRUFDSCxZQUFhLEVBQ2QsQ0FDRixFQUVELGdCQUFnQndELEVBQVEsR0FBTyxDQUM3QixHQUFJLEtBQUssV0FBYUEsRUFBTyxDQUMzQixNQUFNSCxFQUFRLEVBQUksS0FBSyxVQUN2QixLQUFLLFVBQVUsSUFBTUYsR0FBYSxLQUFLLE1BQU0sTUFBT0UsRUFBT0EsRUFBUSxDQUFDLENBQUMsRUFFeEUsRUFFRCxVQUFVTCxFQUFXLElBQUssQ0FDeEIsTUFBTVMsRUFBUyxDQUFDQyxFQUFLdlgsSUFBVSxDQUM3QixNQUFNNEIsRUFBUyxLQUFLLE1BQU0yVixDQUFHLEVBQzdCLEdBQUkzVixFQUFRLENBRVYsTUFBTTRWLEVBQWE1VixFQUFPLGNBQWdCQSxFQUFPLFNBQVMsT0FBUyxHQUNuRWdWLEdBQVNoVixFQUFRLEtBQUssTUFBTTVCLEVBQVF3WCxDQUFVLEVBQUdYLENBQVEsRUFFN0QsRUFDQSxLQUFLLFVBQVUsSUFBTSxDQUNuQlMsRUFBTyxPQUFRLEtBQUssSUFBSSxFQUN4QkEsRUFBTyxTQUFVLEtBQUssTUFBTSxFQUM1QkEsRUFBTyxTQUFVLEtBQUssTUFBTSxFQUM3QixDQUNGLEVBRUQsVUFBVTVXLEVBQU8sQ0FDZixNQUFNK1csRUFBVyxDQUFDLE9BQVEsU0FBVSxRQUFRLEVBQUUsS0FBSyxTQUFTLEVBQzVELEdBQUlBLEVBQVUsQ0FDWixLQUFNLENBQUUsSUFBQXhELEVBQUssSUFBQUMsRUFBSyxNQUFBQyxHQUFVZSxHQUFpQnhVLENBQUssRUFDbEQsR0FBSXVULEVBQUssQ0FDUCxNQUFNalUsRUFBUSxLQUFLLFVBQVlpVSxFQUMvQixLQUFLLFVBQVlqVSxFQUFRLEVBQUksRUFBSUEsRUFBUSxFQUFJLEVBQUlBLFVBQ3hDa1UsRUFBSyxDQUNkLE1BQU1sVSxFQUFRLEtBQUt5WCxDQUFRLEVBQUl2RCxFQUN6QixDQUFFLE9BQUF3RCxDQUFLLEVBQU0sS0FBSyxNQUFNRCxDQUFRLEVBQUUsU0FDeEMsS0FBS0EsQ0FBUSxFQUNYelgsRUFBUSxFQUNKQSxFQUFRMFgsRUFDUjFYLEdBQVMwWCxFQUNQMVgsRUFBUTBYLEVBQ1IxWCxFQUVObVUsSUFDRixLQUFLLFVBQVksS0FFZkYsR0FBT0MsR0FBT0MsS0FDaEIsS0FBSyxnQkFBZ0IsRUFBSSxFQUN6QnpULEVBQU0sZUFBZSxHQUcxQixFQUVELE9BQVEsQ0FDTixLQUFLLE1BQU0sTUFBTSxNQUFNLENBQ3hCLEVBRUQsTUFBTyxDQUNMLEtBQUssTUFBTSxNQUFNLEtBQUssQ0FDeEIsQ0FDRixDQUNGLHlzQ0NsUGUsQ0FDYixXQUFZLENBQUUsV0FBQWlYLEdBQVksV0FBQUMsRUFBWSxFQUN0QyxNQUFPLENBQUMsb0JBQXFCLFNBQVUsUUFBUyxNQUFNLEVBRXRELE1BQU8sQ0FDTCxXQUFZLENBQUUsS0FBTSxLQUFNLFFBQVMsSUFBTSxFQUN6QyxXQUFZLENBQUUsS0FBTSxPQUFRLFFBQVMsT0FBUyxFQUM5QyxZQUFhLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUM1QyxXQUFZLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTWpCLEVBQWMsZUFBQyxJQUFNLEVBQ2hFLE9BQVEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzFDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLENBQzNDLEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxhQUFjLEtBQUssV0FDbkIsU0FBVSxHQUNWLFNBQVUsR0FDVixZQUFhLEdBQ2IsWUFBYSxHQUNiLFFBQVMsRUFDWCxDQUNELEVBRUQsU0FBVSxDQUNSLFNBQVUsQ0FDUixPQUFPLEtBQUssYUFBZSxLQUFLLFdBQ2xDLENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBV3JGLEVBQUlDLEVBQU0sQ0FDZixDQUFDRCxHQUFPLENBQUNDLElBQ1gsS0FBSyxhQUFlRCxFQUV2QixFQUVELGFBQWEwQixFQUFNLENBQ2IsQ0FBQ0EsR0FBUyxDQUFDLEtBQUssYUFDbEIsS0FBSyxRQUFVLEdBQ2YsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBSSxFQUV2QyxFQUVELFFBQVExQixFQUFJQyxFQUFNLENBQ1pELEVBQUtDLElBQ1AsS0FBSyxNQUFNRCxFQUFLLFFBQVUsTUFBTSxFQUM1QixDQUFDQSxHQUFNLEtBQUssVUFDZCxLQUFLLFFBQVUsR0FDZixLQUFLLE1BQU0sU0FBVSxLQUFLLFlBQVksR0FHNUMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxPQUFRLENBQ04sS0FBSyxNQUFNLEtBQUssTUFBTSxDQUN2QixFQUVELE1BQU8sQ0FDTCxLQUFLLE1BQU0sS0FBSyxLQUFLLEVBQ3JCLEtBQUssTUFBTSxLQUFLLEtBQUssQ0FDdkIsQ0FDRixDQUNGLGlMQzNGZSxDQUNiLE1BQU8sQ0FDTCxLQUFNLENBQ0osS0FBTSxPQUNOLFNBQVUsRUFDWixDQUNGLENBQ0Ysa2hDQ2NlLENBQ2IsTUFBTyxDQUFDLGFBQWEsRUFFckIsTUFBTyxDQUNMLE1BQU8sQ0FBRSxLQUFNLE9BQVEsUUFBUyxDQUFHLEVBQ25DLEtBQU0sQ0FBRSxLQUFNLE9BQVEsUUFBUyxDQUFHLEVBQ2xDLFNBQVUsQ0FBRSxLQUFNLE9BQVEsUUFBUyxFQUFJLEVBQ3ZDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQzNDLEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxVQUFXLENBQUUsRUFDYixTQUFVLEdBQ1YsU0FBVSxHQUNWLFNBQVUsRUFDVixnQkFBaUIsS0FBSyxTQUN0QixZQUFhLEtBQUssSUFDcEIsQ0FDRCxFQUVELFNBQVUsQ0FDUixPQUFRLENBQ04sT0FBUSxLQUFLLFlBQWMsR0FBSyxLQUFLLGdCQUFrQixDQUN4RCxFQUVELE1BQU8sQ0FDTCxPQUFPLEtBQUssSUFBSSxLQUFLLE1BQVEsS0FBSyxnQkFBa0IsRUFBRyxLQUFLLEtBQUssQ0FDbkUsQ0FDRCxFQUVELE1BQU8sQ0FDTCxNQUFPLGtCQUNQLFNBQVUsa0JBQ1YsU0FBVSxrQkFFVixLQUFLdUcsRUFBTSxDQUNULEtBQUssWUFBY0EsQ0FDcEIsRUFFRCxTQUFTQyxFQUFVLENBQ2pCLEtBQUssZ0JBQWtCQSxDQUN4QixFQUVELGdCQUFnQkMsRUFBaUIsQ0FDL0IsS0FBSyxTQUFXLEtBQUssS0FBSyxLQUFLLE1BQVFBLENBQWUsRUFDbEQsS0FBSyxZQUFjLEtBQUssV0FDMUIsS0FBSyxZQUFjLEtBQUssVUFFMUIsS0FBSyxnQkFBZ0IsQ0FDdEIsRUFFRCxZQUFZekcsRUFBSUMsRUFBTSxDQUNoQkQsSUFBT0MsSUFDVCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLE1BQU0sY0FBZUQsQ0FBRSxFQUVoQyxDQUNELEVBRUQsU0FBVSxDQUNSLEtBQUssWUFBYyxLQUFLLEtBQ3hCLEtBQUssZ0JBQWtCLEtBQUssUUFDN0IsRUFFRCxTQUFVLENBQ1IsS0FBSyxnQkFBZ0IsQ0FDdEIsRUFFRCxRQUFTLENBQ1AsWUFBWXVHLEVBQU0sQ0FDWkEsRUFBSyxPQUFTLENBQUNBLEVBQUssVUFBWUEsRUFBSyxRQUFVLEtBQUssY0FDdEQsS0FBSyxZQUFjQSxFQUFLLE1BRTNCLEVBRUQsYUFBYUEsRUFBTSxDQUNqQixNQUFNMUMsRUFBVSxDQUNkLGdCQUFpQjBDLEVBQUssTUFDeEIsRUFDQSxPQUFJQSxFQUFLLE9BQ1AxQyxFQUFRLGVBQWUwQyxFQUFLLE1BQU0sRUFBSSxJQUVqQzFDLENBQ1IsRUFFRCxpQkFBa0IsQ0FDaEIsS0FBTSxDQUFFLFNBQUE2QyxFQUFVLFNBQUFDLEVBQVUsTUFBQUMsRUFBTyxnQkFBQUgsRUFBaUIsWUFBQUksQ0FBVSxFQUFNLEtBQzlEQyxFQUFhSixFQUFXQyxFQUFXLEVBQ25DSSxFQUFZLEtBQUssU0FBVyxLQUFLLEtBQUtILEVBQVFILENBQWUsRUFFbkUsSUFBSWIsRUFBUSxFQUNSQyxFQUFNLEVBQ05rQixHQUFZRCxFQUNkakIsRUFBTWtCLEVBQ0dGLEdBQWVILEVBQVcsRUFDbkNiLEVBQU1pQixFQUNHRCxHQUFlRSxFQUFXSixHQUNuQ2QsRUFBTWtCLEVBQ05uQixFQUFRbUIsRUFBV0QsRUFBYSxJQUVoQ2xCLEVBQVFpQixFQUFjSCxFQUN0QmIsRUFBTWdCLEVBQWNGLEdBR3RCLE1BQU1LLEVBQVksQ0FBQyxFQUNuQkEsRUFBVSxLQUFLLENBQ2IsTUFBT0gsRUFBYyxFQUNyQixLQUFNLE9BQ04sU0FBVUEsR0FBZSxFQUMxQixFQUNHakIsR0FBUyxHQUNYb0IsRUFBVSxLQUFLLENBQUUsTUFBTyxFQUFHLEtBQU0sRUFBRyxFQUVsQ3BCLEVBQVEsR0FDVm9CLEVBQVUsS0FBSyxDQUNiLE1BQU8sS0FBSyxJQUFJLEVBQUdILEVBQWMsRUFBRSxFQUNuQyxLQUFNLGdCQUNQLEVBRUgsUUFBUzdGLEVBQUk0RSxFQUFPNUUsR0FBSzZFLEVBQUs3RSxJQUM1QmdHLEVBQVUsS0FBSyxDQUNiLE1BQU9oRyxFQUNQLEtBQU1BLEVBQ04sT0FBUUEsSUFBTTZGLEVBQ2YsRUFFQ2hCLEVBQU1rQixFQUFXLEdBQ25CQyxFQUFVLEtBQUssQ0FDYixNQUFPLEtBQUssSUFBSUQsRUFBVUYsRUFBYyxFQUFFLEVBQzFDLEtBQU0sZ0JBQ1AsRUFFQ2hCLEdBQU9rQixFQUFXLEdBQ3BCQyxFQUFVLEtBQUssQ0FBRSxNQUFPRCxFQUFVLEtBQU1BLEVBQVUsRUFFcERDLEVBQVUsS0FBSyxDQUNiLE1BQU9ILEVBQWMsRUFDckIsS0FBTSxPQUNOLFNBQVVBLEdBQWVFLEVBQzFCLEVBRUQsS0FBSyxVQUFZQyxDQUNuQixDQUNGLENBQ0YsMjdCQzdJZSxDQUNiLE1BQU8sQ0FBQyxvQkFBcUIsUUFBUSxFQUVyQyxNQUFPLENBQ0wsV0FBWSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDN0MsR0FBSSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDbkMsS0FBTSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDckMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsT0FBUSxDQUFFLEtBQU0sQ0FBQyxPQUFRLE9BQU8sRUFBRyxRQUFTLEVBQU0sQ0FDbkQsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLFFBQVMsS0FBSyxVQUNoQixDQUNELEVBRUQsU0FBVSxDQUNSLFNBQVUsQ0FDUixLQUFNLENBQUUsUUFBQUMsRUFBUyxTQUFBQyxDQUFPLEVBQU0sS0FDOUIsTUFBTyxDQUNMLGVBQWdCRCxFQUNoQixnQkFBaUJDLENBQ25CLENBQ0QsRUFFRCxRQUFTLENBQ1AsS0FBTSxDQUFFLE9BQVEsQ0FBRSxRQUFBRCxFQUFTLFVBQUFFLENBQVUsRUFBSSxDQUFDLENBQUEsRUFBTSxLQUUxQ2YsRUFBUyxLQUFLLElBQUksRUFBR2EsR0FBQSxZQUFBQSxFQUFTLE9BQVFFLEdBQUEsWUFBQUEsRUFBVyxNQUFNLEVBQzdELE1BQU8sQ0FDTCxpQkFBa0JmLEVBQVMsR0FBR0EsRUFBUyxTQUFXLElBQ3BELENBQ0YsQ0FDRCxFQUVELE1BQU8sQ0FDTCxXQUFXZ0IsRUFBWSxDQUNyQixLQUFLLFFBQVVBLENBQ2hCLEVBRUQsUUFBUUgsRUFBUyxDQUNYQSxJQUFZLEtBQUssYUFDbkIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBTyxFQUN2QyxLQUFLLE1BQU0sU0FBVUEsQ0FBTyxFQUVoQyxDQUNELEVBRUQsUUFBUyxDQUNQLE9BQVEsQ0FDTixLQUFLLE1BQU0sTUFBTSxNQUFNLENBQ3pCLENBQ0YsQ0FDRix5QkNoRkEsU0FBU0ksR0FBaUIsQ0FBRSxRQUFBQyxHQUFXLENBQUUsTUFBQUMsQ0FBSSxFQUFLLENBQ2hELE9BQU9ELEVBQ0hFLElBQWNDLEVBQUFBLFdBQVlDLEdBQU9ILENBQUssRUFDdENBLEVBQU0sUUFBUSxDQUNwQixDQUVBRixHQUFpQixNQUFRLENBQ3ZCLFFBQVMsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQzFDLEVBRUEsTUFBS25GLEdBQWFtRixHQUVaTSxFQUFXLENBQUNsUixFQUFTbVIsSUFBVSxPQUFPLE9BQU9uUixFQUFRLE1BQU9tUixDQUFLLEVBR2pFQyxHQUFlcFIsR0FBVyxpQkFBaUJBLENBQU8sRUFBRSxPQUVwRGlSLEdBQVEsQ0FDWixLQUFNLFNBRU4sYUFBYWpSLEVBQVMsQ0FJcEIsV0FBVyxJQUFNa1IsRUFBU2xSLEVBQVMsQ0FBRSxPQUFRLE1BQU8sQ0FBQyxDQUFDLENBQ3ZELEVBRUQsUUFBUUEsRUFBUyxDQUNmLEtBQU0sQ0FBRSxNQUFBcVIsR0FBVSxpQkFBaUJyUixDQUFPLEVBQzFDa1IsRUFBU2xSLEVBQVMsQ0FDaEIsTUFBQXFSLEVBQ0EsU0FBVSxXQUNWLFdBQVksU0FDWixPQUFRLE9BQ1QsRUFDRCxLQUFNLENBQUUsT0FBQUMsR0FBVyxpQkFBaUJ0UixDQUFPLEVBQzNDa1IsRUFBU2xSLEVBQVMsQ0FDaEIsTUFBTyxLQUNQLFNBQVUsS0FDVixXQUFZLEtBQ1osT0FBUSxFQUNULEVBQ0RvUixHQUFhcFIsQ0FBTyxFQUNwQixXQUFXLElBQU1rUixFQUFTbFIsRUFBUyxDQUFFLE9BQUFzUixDQUFRLENBQUEsQ0FBQyxDQUMvQyxFQUVELFFBQVF0UixFQUFTLENBQ2YsS0FBTSxDQUFFLE9BQUFzUixHQUFXLGlCQUFpQnRSLENBQU8sRUFDM0NrUixFQUFTbFIsRUFBUyxDQUFFLE9BQUFzUixFQUFRLEVBQzVCRixHQUFhcFIsQ0FBTyxFQUNwQixXQUFXLElBQU1rUixFQUFTbFIsRUFBUyxDQUFFLE9BQVEsQ0FBQSxDQUFHLENBQUMsQ0FDbkQsQ0FDRixFQ3BETXVSLEdBQStDQyxFQUFBQSxnQkFBZ0IsQ0FDbkUsS0FBTSxlQUNOLE1BQU8sQ0FBQyxLQUFNLFNBQVMsRUFDdkIsTUFBTVAsRUFBTyxDQUFFLE1BQUFILEdBQVMsQ0FDdEIsSUFBSVcsRUFDSixNQUFNNVgsRUFBUzJWLEVBQUFBLE1BQ1RrQyxFQUFXLElBQU1ELEdBQVFBLEVBQUssU0FBUSxFQUN0Q0UsRUFBYSxJQUFNRixHQUFRQSxFQUFLLFdBQVUsRUFDaER4VSxPQUFBQSxFQUFLLE1BQ0gsSUFBTTJVLEVBQUFBLGFBQWEvWCxDQUFNLEVBQ3hCMlQsR0FBTyxDQUNEQSxJQUVMaUUsRUFBT0ksR0FBZSxnQkFBQ3JFLEVBQUl5RCxFQUFNLFNBQVcsQ0FBRSxDQUFBLEVBQzlDUyxJQUNELEVBQ0QsQ0FBRSxNQUFPLE1BQVEsQ0FDdkIsRUFDSUksaUJBQWUsSUFBTUgsRUFBVSxDQUFFLEVBQzFCLElBQU0sQ0FDWCxHQUFJYixFQUFNLFFBQ1IsT0FBT2lCLElBQUVkLEVBQU0sSUFBTSxNQUFPLENBQUUsSUFBS3BYLEdBQVVpWCxFQUFNLFFBQU8sQ0FBRSxDQUNwRSxDQUNHLENBQ0gsQ0FBQyxpOEJDTWlCbkgsRUFBYyxVQUFVLGFBQVcsQ0FDbkQsV0FBWSxDQUFFLGFBQUE0SCxFQUFjLEVBQzVCLE1BQU8sQ0FBQyxRQUFRLEVBRWhCLFNBQVUsQ0FDUixNQUFPLENBQ0wsaUJBQWtCLElBQU0sSUFDMUIsQ0FDRCxFQUVELE1BQU8sQ0FDTCxXQUFZLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUM1QyxRQUFTLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN6QyxRQUFTLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN6QyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTyxDQUFFLEVBQUcsRUFDM0MsU0FBVSxDQUNSLEtBQU0sT0FDTixRQUFTLEtBQU8sQ0FDZCxNQUFPLElBQ1AsYUFBYyxJQUVsQixDQUNELEVBRUQsTUFBTyxDQUVMLE1BQU1TLEVBQWEzTCxFQUFBQSxNQUFNLEtBQUssSUFBSSxFQUNsQyxVQUFXeE8sS0FBTyxLQUFLLFdBQ2ZBLEtBQU9tYSxJQUNYQSxFQUFXbmEsQ0FBRyxFQUFJLE1BR3RCLE1BQU8sQ0FDTCxhQUFjLEtBQ2QsV0FBQW1hLENBQ0YsQ0FDRCxFQUVELFNBQVUsQ0FDUixpQkFBa0IsQ0FDaEIsT0FBTyxJQUNSLEVBRUQsUUFBUyxDQUNQLE1BQU8sQ0FDTCxXQUFZLEtBQUssVUFDbkIsQ0FDRCxFQUVELGVBQWdCLENBQ2QsT0FBTyxPQUFPLFlBQ1osT0FBTyxRQUFRM0osR0FBaUIsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUc3QyxDQUFDLENBQUN4USxFQUFLZ0QsQ0FBTSxLQUNQaEQsSUFBUSxVQUFZLENBQUNnRCxFQUFPLFNBQzlCQSxFQUFTLENBQ1AsR0FBR0EsRUFDSCxPQUFRLENBQ04sTUFBTyxJQUFNLEtBQUssT0FBTyxDQUMzQixDQUNGLEdBRUssQ0FBQ2hELEVBQUtnRCxDQUFNLEVBRXZCLENBQ0YsQ0FDRCxFQUVELFlBQWEsQ0FDWCxPQUFPLE9BQU8sS0FBSyxLQUFLLGFBQWEsRUFBRSxPQUFTLENBQ2pELEVBRUQsV0FBWSxDQUNWLE1BQU8sQ0FBQyxDQUFDLEtBQUssY0FBYyxNQUM5QixDQUNELEVBRUQsU0FBVSxDQUNSLEtBQUssYUFBZW9TLEdBQVUsT0FBUSxDQUNwQyxNQUFPdFUsR0FBUyxFQUNULEtBQUssV0FBYSxDQUFDLEtBQUssYUFBZUEsRUFBTSxVQUFZLElBQzVELEtBQUssT0FBTyxDQUVoQixFQUNELENBQ0YsRUFFRCxXQUFZLENBQ1YsS0FBSyxhQUFhLE9BQU8sQ0FDMUIsRUFFRCxRQUFTLENBQ1AsUUFBUyxDQUNQLEtBQUssTUFBTSxRQUFRLENBQ3BCLEVBRUQsUUFBUVYsRUFBTyxDQUNiLEtBQUssUUFBUSxRQUFRQSxDQUFLLEVBQzFCLEtBQUssT0FBTyxDQUNiLEVBRUQsT0FBT0EsRUFBTyxDQUNaLEtBQUssUUFBUSxPQUFPQSxDQUFLLEVBQ3pCLEtBQUssT0FBTyxDQUNiLEVBRUQsUUFBUyxDQUNQLEtBQUssUUFBUSxLQUFLLFVBQVUsQ0FDN0IsRUFFRCxRQUFTLENBQ1AsS0FBSyxRQUFRLElBQUksQ0FDbEIsRUFFRCxPQUFRLENBQ04sS0FBSyxPQUFPLENBQ2IsRUFFRCxXQUFZLENBQ04sS0FBSyxTQUFTLGNBQ2hCLEtBQUssTUFBTSxDQUVmLENBQ0YsQ0FDRixDQUFDLDJCQzNKY2dhLEVBQUEsQ0FDYixNQUFPLENBQ0wsTUFBTyxDQUNMLFlBQWEsQ0FBRSxDQUNoQixDQUNGLEVBRUQsZUFBZ0IsQ0FDZCxTQUFXLENBQUUsT0FBQUMsS0FBWSxLQUFLLFlBQzVCQSxFQUFRLEVBRVYsS0FBSyxZQUFjLENBQUUsQ0FDdEIsRUFFRCxRQUFTLENBQ1AsTUFBTWxTLEVBQVN2RixFQUFNMFgsRUFBUyxDQUM1QixNQUFNelksRUFBU3VULEdBQ2JqTixFQUNBN0YsRUFBUSxTQUFDTSxDQUFJLEVBQUlBLEVBQU8sQ0FBRSxDQUFDQSxDQUFJLEVBQUcwWCxDQUFTLENBQzVDLEVBQ0QsWUFBSyxZQUFZLEtBQUt6WSxDQUFNLEVBQ3JCQSxDQUNSLENBQ0YsQ0FDSCx1MUNDcUJrQmlRLEVBQWMsVUFBVSxXQUFTLENBQ2pELE9BQVEsQ0FBQ3NJLENBQVEsRUFDakIsV0FBWSxDQUFFLFdBQUFHLEVBQVksRUFFMUIsU0FBVSxDQUNSLE1BQU8sQ0FDTCxPQUFRLElBQU0sS0FBSyxhQUNyQixDQUNELEVBRUQsTUFBTyxDQUNMLGdCQUFpQixDQUFFLEtBQU0sQ0FBQyxPQUFRLFNBQVUsT0FBTyxFQUFHLFNBQVUsRUFBTSxFQUN0RSxRQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTyxDQUFFLEVBQUUsQ0FDOUMsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLGNBQWUsQ0FBRSxFQUNqQixhQUFjLEtBQ2QsUUFBUyxDQUFFLEVBQ1gsV0FBWSxHQUNaLGFBQWMsQ0FDaEIsQ0FDRCxFQUVELFNBQVUsQ0FDUixlQUFnQixDQUNkLE9BQU8sS0FBSyxNQUFNLGFBQ25CLEVBRUQsV0FBWSxDQUNWLE9BQU8sS0FBSyxhQUFlLENBQzdCLENBQ0QsRUFFRCxTQUFVLENBQ1IsS0FBSyxTQUFTLE1BQVEsU0FBUyxPQUFTLGdCQUd4QyxLQUFLLFNBQVMsZ0JBQWtCLENBQUMsQ0FDbEMsRUFFRCxNQUFNLFNBQVUsQ0FHZCxLQUFLLE1BQU0sU0FBVSxDQUNuQixNQUFPelosR0FBUyxDQUNUQSxFQUFNLE9BQU8sUUFBUSxhQUFhLElBQ3JDLEtBQUssU0FBUyxZQUFjLEtBRS9CLEVBRUQsTUFBT0EsR0FBUyxDQUNWQSxFQUFNLE9BQVMsUUFDakIsS0FBSyxTQUFTLFlBQWMsS0FFaEMsRUFDRCxFQUNELEdBQUksQ0FDRixLQUFLLFdBQWEsR0FDZCxNQUFNLEtBQUssWUFDYixNQUFNLEtBQUssYUFBYSxFQUV4QixNQUFNLEtBQUssTUFBTSxDQUVuQixPQUFPMFosRUFBUCxDQUNBLFFBQVEsTUFBTUEsQ0FBRyxDQUNuQixDQUNBLEtBQUssV0FBYSxFQUNuQixFQUVELFFBQVMsQ0FDUCxPQUFPLENBQUUsS0FBQTVYLEVBQU8sT0FBUSxNQUFBNlgsRUFBTyxLQUFBQyxDQUFLLEVBQUksR0FBSSxDQUMxQ0QsTUFDRSxDQUNFLFFBQVMsVUFDVCxNQUFPLFFBQ1AsS0FBTSxjQUNOLFFBQVMsU0FDVixFQUFDN1gsQ0FBSSxHQUNOLGdCQUVGOFgsRUFBTyxNQUNMalksRUFBQUEsUUFBUWlZLENBQUksRUFBRSxLQUFLLFVBQVUsUUFDeEIsUUFBUSxjQUFlLE1BQU0sRUFDcEMsTUFBTUMsRUFDSixDQUNFLFFBQVMsT0FDVCxNQUFPLFFBQ1AsS0FBTSxNQUNOLFFBQVMsS0FDVixFQUFDL1gsQ0FBSSxHQUNOLFFBR0YsUUFBUStYLENBQUcsRUFBRUMsRUFBUyxVQUFDRixDQUFJLENBQUMsRUFDNUIsS0FBTSxDQUFFLGNBQUFHLEVBQWdCLEVBQUssRUFBSSxLQUFLLElBQ3RDLEdBQUlBLEVBQWUsQ0FLakIsS0FBTSxDQUFFLGVBQUFDLEVBQWlCLEVBQUMsRUFBTUQsRUFDMUI1RCxHQUFZLEdBQUt5RCxFQUFLLE9BQVNELEVBQU0sUUFBVUssRUFDckQsS0FBSyxRQUFRLENBQUUsS0FBQWxZLEVBQU0sTUFBQTZYLEVBQU8sS0FBQUMsRUFBTSxTQUFBekQsRUFBVSxFQUUvQyxFQUVELG9CQUFxQixDQUNuQixLQUFLLGNBQWMsV0FBVyxDQUMvQixFQUVELGdCQUFnQi9ELEVBQVcsQ0FDekIsS0FBSyxjQUFnQkEsRUFBWSxFQUFJLEVBQ3RDLEVBRUQsV0FBVyxDQUFFLFdBQUExTyxFQUFZLFFBQUFDLEVBQVMsS0FBQWxGLEVBQU0sU0FBQW1GLENBQU8sRUFBSyxDQUlsRCxPQUFPLElBQUksUUFFVCxNQUFPL0MsRUFBU29aLElBQVcsQ0FFekIsTUFBTWpQLEVBQVMsQ0FBQyxFQUVoQixHQURBLE1BQU1GLEVBQXdCLEtBQUssSUFBSyxDQUFFLFdBQUFwSCxDQUFZLEVBQUVzSCxFQUFRLENBQUMsRUFDN0RBLEVBQU8sT0FBUyxFQUNsQixNQUFNLElBQUksTUFDUix1REFDRixFQUVGLE1BQU05TCxFQUFNLFVBQVUsRUFBRWdiLEtBQ3hCLEtBQUssUUFBUWhiLENBQUcsRUFBSSxDQUNsQixXQUFBd0UsRUFDQSxRQUFBQyxFQUNBLEtBQUFsRixFQUNBLFNBQUFtRixFQUNBLFFBQVMsQ0FBRSxRQUFBL0MsRUFBUyxPQUFBb1osQ0FBTyxDQUM3QixDQUNGLENBQ0YsQ0FDRCxFQUVELGFBQWEvYSxFQUFLLENBQ2hCLE9BQU8sS0FBSyxRQUFRQSxDQUFHLENBQ3hCLEVBRUQsTUFBTSxPQUFRLFNBQ1osS0FBSyxXQUFhLEdBQ2xCLEtBQU0sQ0FDSixxQkFBQWliLEVBQ0EsbUJBQUFDLEdBQ0UsS0FBSyxRQUFRLE9BQVMsQ0FBQyxFQUNyQkMsRUFBWSxNQUFNLEtBQUssV0FBVyxDQUN0QyxXQUFZLENBQ1YsU0FBVSxDQUNSLEtBQU0sT0FDTixVQUFXLEVBQ1osRUFDRCxTQUFVLENBQ1IsS0FBTSxVQUNQLEVBQ0QsR0FBR0YsQ0FDSixFQUNELFFBQVMsQ0FDUCxPQUFRLENBQUUsRUFDVixNQUFPLENBQUUsS0FBTSxRQUFTLENBQzFCLEVBQ0QsRUFDRCxHQUFJRSxFQUNGLEdBQUksQ0FDRixNQUFNN1csRUFBVyxNQUFNLEtBQUssWUFBWSxDQUN0QyxTQUFVLEtBQUssSUFBSSxNQUFNLE1BQ3pCLEtBQU02VyxFQUNOLFNBQVUsR0FDWCxFQUNHRCxFQUNGLFNBQVMsUUFBUUEsQ0FBa0IsR0FFbkMsS0FBSyxRQUFRNVcsRUFBUyxLQUFLLElBQUksRUFDL0IsTUFBTSxLQUFLLGFBQWEsRUFFMUIsT0FBT2tXLEVBQVAsQ0FDQSxNQUFNelksR0FBUXFHLEdBQUE1RyxFQUFBZ1osRUFBSSxXQUFKLFlBQUFoWixFQUFjLE9BQWQsWUFBQTRHLEVBQW9CLE1BQ2xDLEtBQUssT0FBTyxDQUNWLEtBQU0sUUFDTixNQUFPLHVCQUNQLEtBQU1yRyxHQUFTeVksRUFDaEIsRUFDSXpZLEdBQ0gsUUFBUSxNQUFNeVksRUFBS0EsRUFBSSxRQUFRLEVBRWpDLEtBQUssTUFBTSxDQUNiLENBRUgsRUFFRCxjQUFlLENBQ2IsT0FBTyxLQUFLLFNBQVMsR0FBRyxDQUN6QixFQUVELE1BQU0sUUFBUyxDQUNiLEdBQUksRUFDZSxNQUFNLEtBQUssWUFBWSxDQUN0QyxTQUFVLEtBQUssSUFBSSxNQUFNLE9BQ3pCLFNBQVUsR0FDWCxHQUNZLEtBQUssVUFDaEIsS0FBSyxRQUFRLElBQUksRUFDakIsS0FBSyxhQUFhLEVBRXBCLE9BQU9BLEVBQVAsQ0FDQSxRQUFRLE1BQU1BLENBQUcsQ0FDbkIsQ0FDRCxFQUVELE1BQU0sV0FBWSxDQUNoQixJQUFJWSxFQUFPLEtBQ1gsR0FBSSxDQUtGQSxHQUppQixNQUFNLEtBQUssWUFBWSxDQUN0QyxTQUFVLEtBQUssSUFBSSxNQUFNLFFBQ3pCLFNBQVUsR0FDWCxHQUNlLEtBQUssTUFBUSxJQUM3QixPQUFPWixFQUFQLENBQ0EsS0FBSyxPQUFPLENBQ1YsS0FBTSxRQUNOLE1BQU8sdUJBQ1AsS0FBTUEsRUFDUCxDQUNILENBQ0EsWUFBSyxRQUFRWSxDQUFJLEVBQ1ZBLENBQ1IsRUFFRCxRQUFRQSxFQUFNLENBQ1osS0FBSyxTQUFTLEtBQ1pBLEdBQ0EsT0FBTyxlQUFlQSxFQUFNcEosR0FBUyxTQUFTLEVBRzNDb0osSUFDSCxLQUFLLGNBQWdCLENBQUMsRUFDdEIsS0FBSyxhQUFhLEVBRXJCLEVBRUQsTUFBTSxZQUFhLENBQ1gsTUFBTSxLQUFLLFVBQVMsR0FDeEIsTUFBTSxLQUFLLE1BQU0sQ0FFcEIsRUFFRCxNQUFNLGNBQWUsT0FDbkIsR0FBSSxDQUNGLEtBQUssY0FBZ0IsTUFBTS9QLEdBQWUsS0FBSyxlQUFlLENBQzlELE9BQU90SixFQUFQLENBQ0EsT0FBS0EsRUFBTSxTQUNULFFBQVEsTUFBTUEsQ0FBSyxFQUVkLEtBQUssTUFBTSxDQUNwQixDQUVBLE1BQU0rSixFQUFTLE1BQU1OLEVBQWUsZ0JBQ2xDLE9BQU8sUUFBUSxLQUFLLGFBQWEsRUFDakMsQ0FBQyxDQUFDM0gsRUFBTWIsQ0FBTSxJQUFNd0osR0FBWTZPLEdBQVUsS0FBSyxJQUFLclksRUFBUWEsQ0FBSSxDQUNsRSxFQUdNLENBQUUsU0FBQXlYLEdBQWEsS0FBSyxRQUMxQjlaLEVBQUEsS0FBSyxlQUFMLE1BQUFBLEVBQUEsV0FDQSxLQUFLLGFBQWUrWixHQUFVLEtBQUssUUFBUyxDQUMxQyxDQUNFLEtBQU0sT0FDTixLQUFNLElBQ04sV0FBWSxDQUFDLENBQ2QsRUFDRCxHQUFHelAsRUFDSixFQUNELEtBQUssUUFBUSxRQUFRd1AsQ0FBUSxDQUMvQixDQUNGLENBQ0YsQ0FBQyxFQUVELElBQUlOLEdBQVcsRUFFZixTQUFTTyxHQUFVQyxFQUFRMVAsRUFBUSxDQUNqQyxNQUFNMlAsRUFBVyxDQUFDLEVBQ2xCLFVBQVdDLEtBQVM1UCxFQUFRLENBQzFCLE1BQU02UCxFQUFjSCxFQUFPLFNBQVNFLENBQUssRUFDekNELEVBQVMsS0FBS0UsQ0FBVyxFQUczQixNQUFPLElBQU0sQ0FDWCxVQUFXdEIsS0FBVW9CLEVBQ25CcEIsRUFBTyxDQUVYLENBQ0YsMnNCQ3pVa0J2SSxFQUFjLFVBQVUsV0FBVyxDQUFBLENBQUEsd2lCQ1B0QyxDQUNiLE1BQU8sQ0FDTCxRQUFTLENBQ1AsS0FBTSxRQUNOLFFBQVMsRUFDVixFQUNELE1BQU8sQ0FDTCxLQUFNLE9BQ04sUUFBUyxTQUNWLEVBQ0QsS0FBTSxDQUNKLEtBQU0sT0FDTixRQUFTLE1BQ1YsRUFDRCxPQUFRLENBQ04sS0FBTSxPQUNOLFFBQVMsS0FDVixFQUNELE9BQVEsQ0FDTixLQUFNLE9BQ04sUUFBUyxNQUNYLENBQ0QsRUFFRCxNQUFPLENBRUwsTUFBTyxDQUNMLGFBQWMsQ0FDWixnQkFBaUIsS0FBSyxNQUN0QixNQUFPLEtBQUssS0FDWixPQUFRLEtBQUssS0FDYixPQUFRLEtBQUssT0FDYixhQUFjLEtBQUssT0FDbkIsUUFBUyxlQUNULGNBQWUsc0JBQ2Ysa0JBQW1CLFFBQ25CLHdCQUF5QixXQUN6Qix3QkFBeUIsZ0NBQ3pCLGtCQUFtQixNQUNwQixFQUNELGNBQWUsQ0FDYixlQUFnQixPQUNqQixFQUNELGNBQWUsQ0FDYixlQUFnQixPQUNqQixFQUNELGNBQWUsQ0FDYixlQUFnQixPQUNsQixDQUNGLENBQ0YsQ0FDRixrN0JDakNrQkEsRUFBYyxVQUFVLGFBQVcsQ0FDbkQsV0FBWSxDQUFFLFlBQUE4SixFQUFhLEVBRTNCLE1BQU8sQ0FDTCxRQUFTLENBQ1AsS0FBTSxPQUNOLFFBQVMsSUFDVixFQUNELFVBQVcsQ0FDVCxLQUFNLFFBQ04sUUFBUyxFQUNYLENBQ0QsRUFFRCxTQUFVLENBQ1IsT0FBUSxDQUNOLE9BQU8sS0FBSyxTQUFTLGdCQUFnQixPQUNuQ3BiLEdBQWEsQ0FBQyxDQUFDQSxFQUFVLFdBQzNCLENBQ0YsQ0FDRCxFQUVELFNBQVUsQ0FDUixLQUFNLENBQ0osS0FBQWtXLEVBQU8sTUFDUCxNQUFBbUYsRUFBUSxNQUNWLEVBQUksS0FBSyxTQUFXLENBQUMsRUFHZixDQUFFLE1BQUF6QyxDQUFJLEVBQU13QyxHQUNsQnhDLEVBQU0sS0FBSyxRQUFVMUMsRUFDckIwQyxFQUFNLE1BQU0sUUFBVXlDLENBQ3ZCLEVBRUQsUUFBUyxDQUNQLG1CQUFtQnJiLEVBQVcsQ0FDNUIsTUFBTyxDQUNMLGFBQWNBLEVBQVUsT0FDMUIsQ0FDRixDQUNGLENBQ0YsQ0FBQywyQkNuRWNzYixHQUFBLENBQ2IsT0FBUSxDQUFDMUIsQ0FBUSxFQUVqQixNQUFPLENBQ0wsTUFBTyxDQUNMLFNBQVUsQ0FDUixLQUFNLEdBQ04sVUFBVyxFQUNYLFVBQVcsR0FDWCxPQUFRLENBQ04sVUFBVyxJQUFNLENBQ2YsS0FBSyxnQkFBZ0IsRUFBSyxFQUMxQixLQUFLLFNBQVMsU0FBUyxPQUFRLENBQ2hDLEVBRUQsUUFBUyxJQUFNLENBQ1QsS0FBSyxrQkFBa0IsSUFBSSxHQUM3QixLQUFLLFNBQVMsU0FBUyxPQUFRLENBRWxDLENBQ0YsRUFDRCxTQUFVLElBQ1gsQ0FDRixDQUNGLEVBRUQsUUFBUyxDQUNQLG9CQUFvQmhhLEVBQU8sQ0FDcEJBLEVBSUgsS0FBSyxVQUFZLElBSGpCLEtBQUssZ0JBQWdCLEVBQUksRUFDekIsS0FBSyxVQUFZLEdBSXBCLEVBRUQsa0JBQWtCQSxFQUFPLENBQ3ZCLEtBQU0sQ0FBRSxVQUFBMmIsR0FBYyxLQUFLLFNBQzNCLEdBQUksQ0FBQyxLQUFLLFdBQWFBLEdBQWMsS0FBSyxJQUFLLEVBQUdBLEVBQVksSUFDNUQsWUFBSyxnQkFBZ0IsRUFBSyxFQUN0QjNiLEdBQ0YsS0FBSyxpQkFBaUJBLENBQUssRUFFdEIsRUFFVixFQUVELGtCQUE4QixDQUU3QixFQUVELGdCQUFnQjRiLEVBQU0sQ0FDcEIsS0FBSyxTQUFTLEtBQU9BLEVBQ3JCLEtBQUssU0FBUyxVQUFZQSxFQUFPLEtBQUssSUFBRyxFQUFLLEVBQzFDQSxJQUNGLEtBQUssU0FBUyxTQUFXLEtBQUssTUFBTSxTQUFVLEtBQUssU0FBUyxNQUFNLEVBRXJFLENBQ0YsQ0FDSCxndUJDekNrQmxLLEVBQWMsVUFBVSxjQUFZLENBQ3BELE9BQVEsQ0FBQ2dLLEVBQWEsRUFFdEIsTUFBTyxDQUNMLE1BQU8sQ0FDTCxNQUFPLENBQ0wsU0FBVSxXQUNWLE9BQVEsUUFDVixDQUNGLENBQ0QsRUFFRCxRQUFTLENBQ1AsaUJBQWlCMWIsRUFBTyxDQUN0QixPQUFRQSxFQUFLLENBQ1gsSUFBSyxTQUNILEtBQUssY0FBYyxPQUFPLEVBQzFCLE1BQ0YsSUFBSyxXQUNILFFBQVEsS0FBSywwQkFBMEIsRUFDdkMsS0FDSixDQUNGLENBQ0YsQ0FDRixDQUFDLHFXQy9CRCxTQUFrQjBSLEVBQWMsVUFBVSxjQUFZLENBQ3BELE1BQU8sQ0FDTCxJQUFLLENBQUUsS0FBTSxPQUFRLFFBQVMsTUFBUSxFQUN0QyxRQUFTLENBQUUsS0FBTSxDQUFDLE9BQVEsTUFBTSxFQUFHLFFBQVMsSUFBSyxDQUNsRCxFQUVELFNBQVUsQ0FDUixTQUFVLENBQ1IsS0FBTSxDQUFFLFFBQUFtSyxDQUFRLEVBQUksS0FDcEIsT0FBTzNaLEVBQUFBLFNBQVMyWixDQUFPLEVBQUlBLEVBQVUsQ0FBRSxLQUFNQSxDQUFRLENBQ3RELEVBRUQsU0FBVSxDQUNSLE1BQU8sQ0FDTCxHQUFHLEtBQUssT0FBTyxNQUNmLEdBQUdDLEdBQVMsS0FBSyxRQUFRLEtBQUssQ0FDaEMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxNQUFPLENBQ0wsR0FBRyxLQUFLLE9BQU8sTUFDZixHQUFHQSxHQUFTLEtBQUssUUFBUSxLQUFLLENBQ2hDLENBQ0YsQ0FDRixDQUNGLENBQUMsRUFFRCxTQUFTQSxHQUFTOWIsRUFBTyxDQUN2QixPQUFPcUMsRUFBQUEsUUFBUXJDLENBQUssRUFBRSxPQUFPLENBQUNGLEVBQVFxQixLQUNoQ2EsRUFBQUEsU0FBU2IsQ0FBSyxFQUNoQnJCLEVBQU9xQixDQUFLLEVBQUksR0FDUGUsRUFBQUEsU0FBU2YsQ0FBSyxHQUN2QixPQUFPLE9BQU9yQixFQUFRcUIsQ0FBSyxFQUV0QnJCLEdBQ04sRUFBRSxDQUNQLHdrQ0NoQmtCNFIsRUFBYyxVQUFVLFlBQVUsQ0FDbEQsTUFBTyxDQUFDLFFBQVEsRUFFaEIsTUFBTyxDQUNMLE1BQU8sQ0FBRSxLQUFNLENBQUMsT0FBUSxNQUFNLEVBQUcsUUFBUyxJQUFNLEVBQ2hELFNBQVUsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3pDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFlBQWEsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLENBQzlDLEVBRUQsU0FBVSxDQUNSLEtBQU0sQ0FDSixPQUFPLEtBQUssWUFBYyxJQUFNLEtBQ2pDLEVBRUQsTUFBTyxDQUNMLEtBQU0sQ0FBRSxNQUFBcEssQ0FBTSxFQUFJLEtBQ2xCLE9BQU9wRixFQUFRLFNBQUNvRixDQUFLLEVBQUlBLEdBQUEsWUFBQUEsRUFBTyxLQUFPQSxDQUN4QyxFQUVELFVBQVcsT0FDVCxPQUFPakYsV0FBUWpCLEVBQUEsS0FBSyxRQUFMLFlBQUFBLEVBQVksTUFBTSxDQUNsQyxFQUVELFVBQVcsT0FDVCxPQUFPaUIsV0FBUWpCLEVBQUEsS0FBSyxRQUFMLFlBQUFBLEVBQVksTUFBTSxDQUNsQyxFQUVELFlBQWEsQ0FDWCxPQUFPLEtBQUssWUFBYyxDQUFFLFFBQVMsS0FBSyxPQUFNLEVBQU0sQ0FBQyxDQUN4RCxFQUVELFVBQVcsQ0FDVCxPQUFPLEtBQUssU0FBUyxjQUFnQixJQUN2QyxDQUNELEVBRUQsUUFBUyxDQUNQLFNBQVUsQ0FDUixLQUFLLFNBQVMsWUFBYyxLQUM1QixLQUFLLE1BQU0sU0FBVSxLQUFLLFNBQVMsQ0FDckMsQ0FDRixDQUNGLENBQUMsMkJDbkVjMmEsR0FBQSxDQUNiLFFBQVMsQ0FDUCxrQkFBQWxPLEdBRUEsV0FBQXFELEdBRUEsVUFBVW5JLEVBQWMxSSxFQUFNckIsRUFBUSxLQUFNLENBQzFDLE9BQU8sS0FBSyxhQUFlQSxJQUFVLEtBQ2pDLE9BQU9BLENBQUssRUFDWmlTLEdBQVVsSSxFQUFjMUksQ0FBSSxDQUNqQyxFQUVELGdCQUFnQjBJLEVBQWMvSixFQUFPLENBQ25DLEdBQUksQ0FBRSxTQUFBbkIsQ0FBUSxFQUFLLEtBQ25CLE9BQUlrTCxJQUFpQixLQUFLLFNBQ3hCbEwsRUFBV0QsRUFBZUMsRUFBVWtMLEVBQWEsSUFBSSxHQUVuRC9KLEdBQVMsT0FDWG5CLEVBQVdELEVBQWVDLEVBQVVtQixDQUFLLEdBRXBDbkIsQ0FDUixFQUVELGdCQUFnQmtMLEVBQWM1SixFQUFNZ0osRUFBUSxDQUMxQyxNQUFNbkosRUFBUSxLQUFLLFlBRWZtSixFQUNBaEosR0FBQSxZQUFBQSxFQUFNLFVBQ0osQ0FBQ2tCLEVBQU1yQixJQUNMLEtBQUssVUFBVStKLEVBQWMxSSxFQUFNckIsQ0FBSyxJQUFNbUosR0FHdEQsT0FBT25KLElBQVUsR0FBS0EsRUFBUSxJQUMvQixFQUVELGFBQWErSixFQUFjMUksRUFBTSxDQUMvQixNQUFBckIsRUFBUSxLQUNSLFNBQUFnZCxFQUFXLEdBQ1gsU0FBQUYsRUFBVyxFQUNaLEVBQUcsR0FBSSxDQUNOLEtBQU0sQ0FBRSxVQUFBRyxDQUFTLEVBQUtsVCxFQUN0QixHQUFJLENBQUMxSSxHQUFRLENBQUMyYixHQUFZQyxJQUFjLEdBQ3RDLE9BQU8sS0FHVCxJQUFJcGUsRUFDSixNQUFNNlIsRUFBYyxJQUNqQjdSLE1BQWEsS0FBSyxnQkFBZ0JrTCxFQUFjL0osQ0FBSyxHQUV4RCxJQUFJa2QsRUFDSixNQUFNQyxFQUFlLElBQ2xCRCxNQUFjLEtBQUssU0FDbEJyTyxHQUFrQjlFLEVBQWMxSSxFQUFNLEtBQUssT0FBTyxDQUM1RCxHQUVNLElBQUlpYSxFQUNBOEIsRUFDQUMsRUFDSixHQUFJcGMsRUFBQUEsV0FBV2djLENBQVMsRUFBRyxDQUN6QixNQUFNM1UsRUFBUTJVLEVBQVUsS0FDdEIsS0FDQSxJQUFJOWIsRUFBWSxLQUFNLENBQ3BCLE9BQVEsR0FDUixLQUFNRSxFQUNOLE1BQU9BLEVBQ1AsTUFBQXJCLEVBRUEsSUFBSSxVQUFXLENBQ2IsT0FBTzBRLEVBQWEsQ0FDckIsRUFFRCxJQUFJLFdBQVksQ0FDZCxPQUFPeU0sRUFBYyxDQUN0QixDQUNiLENBQVcsQ0FDRixFQUNHamEsRUFBQUEsU0FBU29GLENBQUssRUFDZCxDQUFFLEtBQUFnVCxFQUFNLE9BQUE4QixFQUFRLE9BQUFDLENBQU0sRUFBSy9VLEVBRTdCZ1QsRUFBT2hULEVBR1QwVSxFQUFXLFdBQ0ZoYSxFQUFRLFNBQUNpYSxDQUFTLEdBQUssRUFBRUEsS0FBYTViLEdBRS9DaWEsRUFBTzJCLE1BQ0YsQ0FLTCxLQUFNLENBQUUsUUFBQUssQ0FBTyxFQUFLdlQsRUFDZG5KLEVBQ0pvQyxFQUFRLFNBQUNpYSxDQUFTLEdBQUtBLEdBQ3ZCakwsRUFBYWpJLENBQVksR0FBS3VULEdBQVcsT0FBTyxLQUFLQSxDQUFPLEVBQUUsQ0FBQyxHQUMvRCxPQUVGaEMsRUFBT2phLEVBQUtULENBQUcsRUFFakIsTUFBTTJjLEVBQVcsQ0FBQyxDQUFDakMsRUFVbkIsR0FSSUEsR0FBUSxPQUVWMEIsRUFBVyxHQUNYMUIsRUFDRXRKLEVBQWFqSSxDQUFZLEdBQUsvSixJQUFVLEtBQ25Dc2IsRUFBTyxHQUFHdGIsRUFBUSxJQUNuQixJQUVKZ2QsRUFBVSxDQUNaLE1BQU1FLEVBQVlDLEVBQWMsRUFDNUJELElBR0Y1QixFQUFPLEdBQUc0QixLQUFhSyxFQUFXLElBQUlqQyxLQUFVQSxLQUdwRCxPQUFPd0IsRUFBVyxDQUFFLEtBQUF4QixFQUFNLE9BQUE4QixFQUFRLE9BQUFDLENBQVEsRUFBRy9CLENBQzlDLENBQ0YsQ0FDSCw2bUZDdkJrQjVJLEVBQWMsVUFBVSxhQUFXLENBQ25ELE9BQVEsQ0FBQ3FLLEVBQVMsRUFDbEIsV0FBWSxDQUFFcEQsaUJBQUFBLEVBQWtCLEVBRWhDLFNBQVUsQ0FDUixNQUFPLENBQ0wsaUJBQWtCLElBQU0sSUFDMUIsQ0FDRCxFQUVELE9BQVEsQ0FDTix3QkFDRCxFQUVELE1BQU8sQ0FDTCxPQUFRLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSSxFQUN2QyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUNyQyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTyxDQUFFLEVBQUcsRUFDM0MsTUFBTyxDQUFFLEtBQU0sT0FBUSxRQUFTLEtBQU8sQ0FBRSxFQUFHLEVBQzVDLE1BQU8sQ0FBRSxLQUFNLENBQUMsT0FBUSxNQUFNLEVBQUcsUUFBUyxJQUFNLEVBQ2hELFFBQVMsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzFDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFlBQWEsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzlDLGVBQWdCLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTSxFQUNoRCxXQUFZLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUM3QyxXQUFZLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTSxDQUM3QyxFQUVELE1BQU8sQ0FDTCxLQUFNLENBQUUsS0FBQXhaLEdBQVMsS0FBSyxPQUN0QixNQUFPLENBRUwsR0FDRUEsR0FBUWMsRUFBVSxXQUFDZCxDQUFJLEVBQ25CQSxFQUFLLEtBQUssT0FBTyxFQUNqQkEsRUFFTixtQkFBb0IsQ0FBRSxFQUN0QixjQUFlLENBQUUsRUFDakIsZUFBZ0IsQ0FBQyxDQUNuQixDQUNELEVBRUQsU0FBVSxDQUNSLGlCQUFrQixDQUVoQixPQUFPLElBQ1IsRUFFRCx1QkFBd0IsQ0FJdEIsT0FBTyxLQUFLLFdBQWEsS0FBTyxLQUFLLGdCQUFnQixlQUN0RCxFQUVELGNBQWUsQ0FDYixNQUFNeVIsRUFBZUYsR0FBZ0IsS0FBSyxPQUFPLE9BQVEsRUFBRSxFQUMzRCxVQUFXOEwsS0FBUSxLQUFLLE1BQ3RCNUwsRUFBYSxLQUFLLEdBQUc0TCxFQUFLLFlBQVksRUFFeEMsT0FBTzVMLENBQ1IsRUFFRCxNQUFPLENBQ0wsT0FBT2IsRUFBZ0IsS0FBSyxPQUFPLElBQUksQ0FDeEMsRUFFRCxhQUFjLFNBQ1osTUFBTTBNLElBQWFyYixFQUFBLEtBQUssT0FBTyxPQUFaLFlBQUFBLEVBQWtCLE1BQU0sS0FBTSxLQUMzQzZMLEVBQ0p3UCxHQUFjLEtBQUssYUFBYSxLQUFLLEtBQUtBLENBQVUsQ0FBQyxFQUNqREEsSUFDQXpVLEVBQUEsS0FBSyxhQUFMLFlBQUFBLEVBQWlCLE9BQVEsS0FDL0IsT0FBSWlGLElBQVF3UCxHQUdWLEtBQUssUUFBUSxRQUFRLENBQUUsS0FBTSxJQUFJeFAsSUFBTyxFQUVuQ0EsQ0FDUixFQUVELFlBQWEsQ0FDWCxJQUFJeVAsRUFBUSxLQUNaLEdBQUksS0FBSyxLQUNQLFVBQVd6UCxLQUFPLE9BQU8sT0FBTyxLQUFLLElBQUksRUFBRyxDQUMxQyxLQUFNLENBQUUsV0FBQTBQLEdBQWUxUCxFQUN2QixHQUNFaE4sRUFBQUEsV0FBVzBjLENBQVUsRUFDakJBLEVBQVcsS0FBSyxPQUFPLEVBQ3ZCQSxFQUVKLE9BQU8xUCxFQUVKeVAsSUFDSEEsRUFBUXpQLEdBSWQsT0FBT3lQLENBQ1IsRUFFRCxXQUFZLE9BQ1YsT0FBT3RiLEVBQUEsS0FBSyxTQUFMLFlBQUFBLEVBQWEsU0FDckIsRUFFRCxZQUFhLENBQ1gsTUFBTWpDLEVBQU9QLEdBQWMsS0FBSyxTQUFVLEtBQUssU0FBVSxFQUFLLEVBQzlELE9BQU9PLElBQVMsS0FBSyxLQUFPQSxFQUFPLElBQ3BDLEVBRUQsZUFBZ0IsQ0FDZCxPQUFPLEtBQUssWUFBWSxDQUFFLE9BQVEsU0FBVSxXQUFZLEdBQU0sQ0FDL0QsRUFFRCxlQUFnQixDQUNkLE1BQU8sQ0FDTCxRQUFTLEtBQUssT0FBTyxLQUNyQixHQUFHLEtBQUssWUFBWSxDQUFFLE9BQVEsWUFBYSxXQUFZLEdBQU0sQ0FDL0QsQ0FDRCxFQVFELE1BQU8sQ0FDTCxPQUFPLEtBQUssSUFDYixFQUVELFlBQWEsQ0FDWCxPQUFPLEtBQUssVUFDYixFQUVELFVBQVcsQ0FDVCxPQUFPLEtBQUssUUFDYixFQUVELGVBQWdCLENBQ2QsT0FBTyxLQUFLLGFBQ2IsRUFFRCxlQUFnQixDQUNkLE9BQU8sS0FBSyxhQUNiLEVBRUQsV0FBWSxDQUNWLE9BQU8sS0FBSyxTQUNWLEtBQUssa0JBQWtCLEtBQUssYUFBYyxLQUFLLEtBQU0sS0FBSyxPQUFPLENBQ25FLENBQ0QsRUFFRCxTQUFVLENBQ1IsT0FBTyxLQUFLLGNBQWMrUyxHQUFNQSxFQUFHLE9BQU8sQ0FDM0MsRUFFRCxXQUFZLENBQ1YsT0FBTyxLQUFLLGNBQWNBLEdBQU1BLEVBQUcsU0FBUyxDQUM3QyxFQUVELFNBQVUsQ0FDUixPQUFPLEtBQUssZUFBZUEsR0FBTUEsRUFBRyxPQUFPLENBQzVDLEVBRUQsYUFBYyxDQUNaLE9BQU8sS0FBSyxlQUFlQSxHQUFNQSxFQUFHLFdBQVcsQ0FDaEQsRUFFRCxTQUFVLENBQ1IsTUFBTyxDQUFDLENBQUMsS0FBSyxJQUNmLEVBRUQsVUFBVyxDQUNULE1BQU8sQ0FBQyxDQUFDLEtBQUssT0FBUyxLQUFLLFdBQzdCLEVBRUQsU0FBVSxDQUNSLE1BQU8sQ0FBQyxLQUFLLFNBQVcsQ0FBQyxDQUFDLEtBQUssSUFDaEMsRUFFRCxhQUFjLENBQ1osS0FBTSxDQUFFLFdBQUE5TixHQUFlLEtBQUssT0FDNUIsTUFBTyxDQUFDLENBQUNBLEdBQWMsT0FBTyxLQUFLQSxDQUFVLEVBQUUsT0FBUyxDQUN6RCxFQUVELE9BQVE2QyxHQUFpQixTQUFVLENBQ2pDLFNBQVUsQ0FDUixNQUFPLENBQUMsS0FBSyxTQUNmLENBQ0YsQ0FBQyxFQUVELFlBQWEsQ0FDWCxPQUFPLE9BQU8sT0FBTyxLQUFLLGtCQUFrQixDQUM3QyxFQUVELE9BQVEsQ0FDTixPQUFPLE9BQU8sT0FBTyxLQUFLLGFBQWEsQ0FDeEMsRUFFRCxRQUFTLENBQ1AsT0FBTyxPQUFPLE9BQU8sS0FBSyxjQUFjLENBQ3pDLEVBRUQsc0JBQXVCLENBQ3JCLE9BQU8sS0FBSyx1QkFBdUIsS0FBSyxrQkFBa0IsQ0FDM0QsRUFFRCxpQkFBa0IsQ0FDaEIsT0FBTyxLQUFLLHVCQUF1QixLQUFLLGFBQWEsQ0FDdEQsRUFFRCxrQkFBbUIsQ0FDakIsT0FBTyxLQUFLLHVCQUF1QixLQUFLLGNBQWMsQ0FDeEQsQ0FDRCxFQUVELFNBQVUsQ0FDUixLQUFLLFVBQVUsRUFBSSxFQUNuQixLQUFLLGtCQUFrQixFQUV2QixLQUFLLFNBQVMsU0FBVSxLQUFLLHFCQUFxQixFQUNsRCxLQUFLLFVBQVUsWUFBWSxDQUM1QixFQUVELGVBQWdCLENBQ2QsS0FBSyxVQUFVLFNBQVMsRUFDeEIsS0FBSyxVQUFVLEVBQUssQ0FDckIsRUFFRCxRQUFTLENBQ1Asd0JBQXdCcEosRUFBVStILEVBQU8sQ0FDdkMsT0FBTyxLQUFLLHNCQUNWLEtBQUsscUJBQ0wvSCxFQUNBK0gsQ0FDRixDQUNELEVBRUQsdUJBQXVCL0gsRUFBVStILEVBQU8sQ0FDdEMsT0FBTyxLQUFLLHdCQUF3Qi9ILEVBQVUrSCxDQUFLLEVBQUUsQ0FBQyxHQUFLLElBQzVELEVBRUQsb0JBQW9CL0gsRUFBVStILEVBQU8sQ0FDbkMsT0FBTyxLQUFLLGtCQUFrQixLQUFLLHFCQUFzQi9ILEVBQVUrSCxDQUFLLENBQ3pFLEVBRUQsbUJBQW1CbkMsRUFBTW1DLEVBQU8sQ0FDOUIsT0FBTyxLQUFLLG9CQUFvQm5DLEVBQU1tQyxDQUFLLEVBQUUsQ0FBQyxHQUFLLElBQ3BELEVBRUQsY0FBY2dYLEVBQWdCaFgsRUFBTyxDQUNuQyxPQUFPLEtBQUssWUFBWSxLQUFLLHFCQUFzQmdYLEVBQWdCaFgsQ0FBSyxDQUN6RSxFQUVELGFBQWFnWCxFQUFnQmhYLEVBQU8sQ0FDbEMsT0FBTyxLQUFLLGNBQWNnWCxFQUFnQmhYLENBQUssRUFBRSxDQUFDLEdBQUssSUFDeEQsRUFFRCxvQkFBb0IvSCxFQUFVK0gsRUFBTyxDQUNuQyxPQUFPLEtBQUssc0JBQXNCLEtBQUssaUJBQWtCL0gsRUFBVStILENBQUssQ0FDekUsRUFFRCxtQkFBbUIvSCxFQUFVK0gsRUFBTyxDQUNsQyxPQUFPLEtBQUssb0JBQW9CL0gsRUFBVStILENBQUssRUFBRSxDQUFDLEdBQUssSUFDeEQsRUFFRCxVQUFVZ1gsRUFBZ0JoWCxFQUFPLENBQy9CLE9BQU8sS0FBSyxZQUFZLEtBQUssaUJBQWtCZ1gsRUFBZ0JoWCxDQUFLLENBQ3JFLEVBRUQsU0FBU2dYLEVBQWdCaFgsRUFBTyxDQUM5QixPQUFPLEtBQUssVUFBVWdYLEVBQWdCaFgsQ0FBSyxFQUFFLENBQUMsR0FBSyxJQUNwRCxFQUVELGNBQWNqRixFQUFVLENBQ3RCLE9BQU8sS0FBSyxhQUFlLEtBQUssV0FBVyxLQUFLQSxDQUFRLENBQ3pELEVBRUQsZUFBZUEsRUFBVSxDQUN2QixPQUFPLEtBQUssYUFBZSxLQUFLLFdBQVcsTUFBTUEsQ0FBUSxDQUMxRCxFQUVELFNBQVNrYyxFQUFRLENBQ2YsS0FBSyxVQUFVLFNBQVUsQ0FFdkIsUUFBUyxDQUFFLE9BQUFBLENBQU8sRUFDbkIsR0FRRyxDQUFDLEtBQUssUUFBVUEsR0FBVSxLQUFLLFlBQVcsS0FDNUMsS0FBSyxPQUFTQSxFQUVqQixFQUVELFVBQVcsQ0FDVCxLQUFLLFVBQVUsUUFBUSxDQUN4QixFQUVELGlCQUFrQixDQUNoQixVQUFXemMsS0FBYSxLQUFLLFdBQzNCQSxFQUFVLGdCQUFnQixDQUU3QixFQUVELGFBQWMsQ0FDWixVQUFXQSxLQUFhLEtBQUssV0FDM0JBLEVBQVUsWUFBWSxDQUV6QixFQUVELE9BQVEsUUFDTmdCLEVBQUEsS0FBSyx3QkFBTCxNQUFBQSxFQUE0QixRQUM1QixLQUFLLE9BQVMsRUFDZixFQUVELFlBQVl3RSxFQUFPUyxFQUFTLEdBQU0sQ0FDaEMsS0FBTSxDQUFFLHFCQUFBeVcsQ0FBcUIsRUFBSSxLQUNqQyxJQUFJQyxFQUNKLEdBQUluWCxFQUFPLENBQ1QsTUFBTW9YLEVBQVEvYyxFQUFVLFdBQUMyRixDQUFLLEVBQzFCQSxFQUNBekQsRUFBQUEsU0FBU3lELENBQUssRUFDWnFSLEdBQVNyUixFQUFNLEtBQUtxUixDQUFLLEVBQ3pCLEtBQ044RixFQUFZQyxFQUNSLE9BQU8sS0FBS0YsQ0FBb0IsRUFBRSxPQUFPRSxDQUFLLEVBQzlDcGMsRUFBQUEsUUFBUWdGLENBQUssRUFDWEEsRUFDQSxDQUFDQSxDQUFLLEVBRVZTLEdBQ0YsS0FBSyxZQUFZLEVBRW5CLElBQUlDLEVBQVUsR0FDVm9XLEVBQVEsR0FDWkssTUFBYyxPQUFPLEtBQUtELENBQW9CLEdBQzlDLFVBQVdqZixLQUFZa2YsRUFBVyxDQUNoQyxNQUFNM1ksRUFBYSxLQUFLLHdCQUF3QnZHLENBQVEsRUFDeEQsVUFBV3VDLEtBQWFnRSxFQUNqQmhFLEVBQVUsU0FBU2lHLENBQU0sSUFFeEJBLEdBQVVxVyxHQUNadGMsRUFBVSxNQUFNLEVBRWxCc2MsRUFBUSxHQUNScFcsRUFBVSxJQUloQixPQUFJRCxHQUFVLENBQUNDLEdBQ2IsS0FBSyxhQUFhLEVBRWJBLENBQ1IsRUFFRCxVQUFVVixFQUFPLENBQ2YsT0FBTyxLQUFLLFlBQVlBLEVBQU8sRUFBSyxDQUNyQyxFQUVELE1BQU0scUJBQXFCa0IsRUFBUUMsRUFBTyxPQUN4QyxLQUFLLFlBQVksRUFDakIsSUFBSTJWLEVBQVEsR0FDWixNQUFNTyxFQUFZLENBQUMsRUFDbkIsU0FBVyxDQUFDcGYsRUFBVXFmLENBQUksSUFBSyxPQUFPLFFBQVFwVyxDQUFNLEVBQUcsQ0FHckQsTUFBTXFXLEVBQWUsS0FBSyxXQUN0QnZmLEVBQWUsS0FBSyxTQUFVQyxDQUFRLEVBQ3RDQSxFQUlFdWYsRUFBZ0JuZixFQUFhLGNBQUNrZixDQUFZLEVBQ2hELElBQUlFLEVBQVEsR0FDWixNQUFNalosRUFBYSxLQUFLLHdCQUF3QmdaLENBQWEsRUFDN0QsVUFBV2hkLEtBQWFnRSxFQUNsQmhFLEVBQVUscUJBQXFCOGMsRUFBTVIsR0FBUzNWLENBQUssSUFDckRzVyxFQUFRLEdBQ1JYLEVBQVEsSUFHWixHQUFJLENBQUNXLEVBQU8sQ0FJVixNQUFNQyxFQUFXRixFQUFjLElBQUksRUFDbkMsS0FBT0EsRUFBYyxPQUFTLEdBQUcsQ0FDL0IsTUFBTWhaLEVBQWEsS0FBSyx3QkFBd0JnWixDQUFhLEVBQzdELFVBQVdoZCxLQUFhZ0UsRUFDdEIsR0FDRSxPQUFNaEQsRUFBQWhCLEVBQVUsc0JBQVYsWUFBQWdCLEVBQUEsS0FBQWhCLEVBQ0orYyxFQUNBSSxHQUFpQixDQUNmLElBQUlGLEVBQVEsR0FDWixVQUFXamQsS0FBYW1kLEVBQWUsQ0FDckMsTUFBTUwsRUFBT3BXLEVBQU8xRyxFQUFVLFFBQVEsRUFFcEM4YyxHQUNBOWMsRUFBVSxxQkFBcUI4YyxFQUFNUixHQUFTM1YsQ0FBSyxJQUVuRHNXLEVBQVEsR0FDUlgsRUFBUSxJQUdaLE9BQU9XLENBQ1QsSUFPRixPQUlKRCxFQUFjLElBQUksRUFJcEIsTUFBTW5HLEVBQVF2VCxFQUFRLFNBQUM0WixDQUFRLEVBQy9CLFVBQVdsRCxLQUFPOEMsRUFBTSxDQUN0QixNQUFNZCxFQUFTbkYsRUFDWCxhQUFhQSxJQUNiLE9BQU8sS0FBSyxZQUNoQmdHLEVBQVUsS0FBSyxHQUFHYixLQUFVaEMsRUFBSSxTQUFTLEdBRzdDc0MsRUFBUSxHQUVMQSxHQUNILEtBQUssYUFBYU8sRUFBVSxLQUFLO0FBQUEsQ0FBSSxDQUFDLENBRXpDLEVBRUQsYUFBYXJXLEVBQVMsQ0FDcEIsS0FBSyxPQUFPLENBQ1YsS0FBTSxRQUNOLE1BQU8sb0JBQ1AsS0FBTUEsR0FBVyx5Q0FDbEIsQ0FDRixFQUVELFdBQVksQ0FJVixPQUFPLE9BQU8sS0FBSyxLQUFNMkgsR0FBaUIsS0FBSyxPQUFRLEdBQUksSUFBSSxDQUFDLEVBQ2hFLEtBQUssWUFBWSxDQUNsQixFQUVELFFBQVFwUCxFQUFNLENBQ1osVUFBV3NFLEtBQVF0RSxFQUNqQixHQUFJc0UsS0FBUSxLQUFLLEtBQU0sQ0FFckIsS0FBSyxLQUFLQSxDQUFJLEVBQUl0RSxFQUFLc0UsQ0FBSSxFQUMzQixVQUFXckQsS0FBYSxLQUFLLG9CQUFvQnFELENBQUksRUFDbkRyRCxFQUFVLFVBQVUsRUFJM0IsRUFFRCxXQUFXakIsRUFBTSxDQUlmLE1BQU15UCxFQUFPLENBQUMsRUFDZCxTQUFXLENBQUNuTCxFQUFNekQsQ0FBSyxJQUFLLE9BQU8sUUFBUWIsQ0FBSSxHQUN6Q3lCLEVBQU8sUUFBQ1osQ0FBSyxHQUFLa0MsRUFBUSxTQUFDbEMsQ0FBSyxJQUNmLEtBQUssb0JBQW9CeUQsQ0FBSSxFQUNqQyxLQUFLckQsR0FBYUEsRUFBVSxZQUFZLElBSXpEd08sRUFBS25MLENBQUksRUFBSXpELEdBRWYsT0FBTzRPLENBQ1IsRUFFRCxZQUFZLENBQUUsT0FBQWhOLEVBQVMsWUFBYSxXQUFBbU4sRUFBYSxFQUFPLEVBQUUsR0FBSSxDQUM1RCxPQUFPRCxHQUNMLEtBQUssT0FDTCxLQUFLLGFBQ0wsS0FBSyxLQUNMLEtBQUssU0FDTCxDQUdFLFVBQVcsS0FDWCxXQUFBQyxFQUNBLE9BQUFuTixDQUNGLENBQ0YsQ0FDRCxFQUVELFVBQVVrRyxFQUFLLFFBR2IxRyxFQUFBLEtBQUssdUJBQXdCLElBQTdCLE1BQUFBLEVBQStCLHlCQUF5QixLQUFNMEcsRUFDL0QsRUFFRCxtQkFBbUIxSCxFQUFXMEgsRUFBSyxPQUNqQyxLQUFLLGVBQWUsS0FBSyxtQkFBb0IxSCxFQUFXMEgsQ0FBRyxHQUUzRDFHLEVBQUEsS0FBSyx3QkFBTCxNQUFBQSxFQUE0QixtQkFBbUJoQixFQUFXMEgsRUFDM0QsRUFFRCxjQUFjMFUsRUFBTTFVLEVBQUssQ0FDdkIsS0FBSyxlQUFlLEtBQUssY0FBZTBVLEVBQU0xVSxDQUFHLENBQ2xELEVBRUQsZUFBZW9FLEVBQU9wRSxFQUFLLENBQ3pCLEtBQUssZUFBZSxLQUFLLGVBQWdCb0UsRUFBT3BFLENBQUcsQ0FDcEQsRUFFRCxlQUFlMFYsRUFBVXJjLEVBQU8yRyxFQUFLLENBQ25DLE1BQU0xRSxFQUFNakMsRUFBTSxLQUNkMkcsRUFDRjBWLEVBQVNwYSxDQUFHLEVBQUlqQyxFQUVoQixPQUFPcWMsRUFBU3BhLENBQUcsQ0FFdEIsRUFFRCx1QkFBdUJvYSxFQUFVLENBQy9CLE9BQU8sT0FBTyxPQUFPQSxDQUFRLEVBQUUsT0FBTyxDQUFDQyxFQUFtQnRjLElBQVUsQ0FHbEUsS0FBTSxDQUFFLFNBQUF0RCxDQUFTLEVBQUlzRCxFQUVyQixPQURpQnNjLEVBQUE1ZixLQUFBNGYsRUFBQTVmLEdBQWdDLENBQUEsSUFDekMsS0FBS3NELENBQUssRUFDWHNjLENBQ1IsRUFBRSxFQUFFLENBQ04sRUFFRCxZQUFZQSxFQUFtQjVmLEVBQVUrSCxFQUFPLENBQzlDLE9BQU92SCxFQUFpQixrQkFBQ1IsQ0FBUSxFQUFFLFdBQVcsS0FBSyxRQUFRLEVBQ3ZELEtBQUssc0JBQXNCNGYsRUFBbUI1ZixFQUFVK0gsQ0FBSyxFQUM3RCxLQUFLLGtCQUFrQjZYLEVBQW1CNWYsRUFBVStILENBQUssQ0FDOUQsRUFFRCxzQkFBc0I2WCxFQUFtQjVmLEVBQVUrSCxFQUFPLENBQ3hELE9BQU8sS0FBSyxlQUNWNlgsRUFBa0JwZixFQUFpQixrQkFBQ1IsQ0FBUSxDQUFDLEdBQUssQ0FBRSxFQUNwRCtILENBQ0YsQ0FDRCxFQUVELGtCQUFrQjZYLEVBQW1CaGEsRUFBTW1DLEVBQU8sQ0FDaEQsT0FBTyxLQUFLLGVBQ1Y2WCxFQUFrQjdmLEVBQWUsS0FBSyxTQUFVNkYsQ0FBSSxDQUFDLEdBQUssQ0FBRSxFQUM1RG1DLENBQ0YsQ0FDRCxFQUVELGVBQWVnRCxFQUFTaEQsRUFBTyxDQUM3QixPQUFPQSxFQUFRZ0QsRUFBUSxPQUFPaEQsQ0FBSyxFQUFJZ0QsQ0FDekMsQ0FDRixDQUNGLENBQUMsK2dDQ2hvQkk0SyxHQUFhOUIsRUFBYyxVQUFVLG9CQUFrQixDQUMxRCxNQUFPLENBQUMsUUFBUSxFQUVoQixNQUFPLENBQ0wsT0FBUSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDeEMsU0FBVSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDMUMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsTUFBTyxDQUFFLEtBQU0sQ0FBQyxPQUFRLE1BQU0sRUFBRyxRQUFTLElBQU0sRUFDaEQsU0FBVSxDQUFFLEtBQU0sUUFBUyxTQUFVLEVBQU0sRUFDM0MsVUFBVyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDNUMsWUFBYSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDOUMsVUFBVyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDNUMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsVUFBVyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDNUMsU0FBVSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQUssQ0FDekMsRUFFRCxTQUFVLENBQ1IsV0FBWSxDQUNWLE9BQU81RCxHQUFVLEtBQUssTUFBTSxDQUM3QixFQUVELFVBQVcsQ0FDVCxNQUFPLENBQUMsS0FBSyxXQUFhLENBQUMsQ0FBQyxLQUFLLEtBQ25DLENBQ0YsQ0FDRixDQUFDLGtFQ3pEVyxNQUFBLHdCQUFBLE1BQUEsMExBQUEsTUFBQTRQLEdBQUEsRUFBQUMsWUFBQSxFQUFBLEVBQUFDLHFCQUFBQyxFQUFBQSxTQUFBLEtBQUFDLEVBQUEsV0FBSEMsRUFBRyxpQkFBQSxDQUFBLCtHQUFBbmIsRUFBQSxRQUFBLFVBQUErYSxFQUFBQSxZQUFBQyxFQUFBQSxtQkFBQSxNQUFBSSxFQUFBLCtCQUFBRCxFQUFBLGFBQUFuYixDQUFBLGlCQUFBcWIsRUFBQSxZQUFBQyxFQUFBLENBQUEsSUFBQUMsRUFBQSxPQUFBdmIsRUFBQSxTQUFBL0UsRUFBQSxLQUFBa2dCLEVBQUEsS0FBQSxLQUFBQSxFQUFBLEtBQUEsTUFBQUssRUFBQSxPQUFBTCxFQUFBLGtCQUFBLE9BQUE1ZixFQUFBLFNBQUE0ZixFQUFBLFNBQUEsZUFBQUEsRUFBQSwrSUFBQW5iLEVBQUEsUUFBQSxTQUFBK2EsRUFBQUEsWUFBQUMsRUFBQUEsbUJBQUEsTUFBQVMsRUFBQSxxSEFrQ00zTSxFQUFjLFVBQVUsV0FBUyxDQUNqRCxTQUFVLENBQ1IsTUFBTyxDQUNMLGNBQWUsSUFBTSxLQUFLLFlBQzVCLENBQ0QsRUFFRCxNQUFPLENBQ0wsT0FBUSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDeEMsU0FBVSxDQUFFLEtBQU0sT0FBUSxRQUFTLEVBQUksRUFDdkMsS0FBTSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDckMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsSUFBSyxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDcEMsT0FBUSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDekMsUUFBUyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU0sRUFDekMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsZUFBZ0IsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQ2hELEVBRUQsU0FBVSxDQUNSLGNBQWUsQ0FDYixPQUFPLEtBQUssSUFBTSxLQUFPLEtBQUssY0FBYyxDQUM3QyxFQUVELGtCQUFtQixTQVFqQixNQUFNekMsR0FBaUI3TixFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixlQUMxQyxPQUFPLE9BQU8sVUFBUTRHLEVBQUEsS0FBSyxTQUFMLFlBQUFBLEVBQWEsYUFBYyxDQUFFLENBQUEsRUFBRSxJQUNuRCxDQUFDLENBQUN2RSxFQUFNYixDQUFNLElBQU0sQ0FFbEJBLEVBQU8sS0FBT2EsRUFFZCxNQUFNdEYsRUFBUzZQLEdBQVNwTCxDQUFNLEVBQ3hCdWIsRUFBaUJ2Z0IsRUFBZSxLQUFLLFNBQVU2RixDQUFJLEVBQ3pELE1BQU8sQ0FDTCxPQUFBYixFQUNBLFNBQ0V6RSxHQUFVLENBQUM4USxFQUNQa1AsRUFDQSxLQUFLLFNBQ1gsZUFBQUEsRUFDQSxPQUFBaGdCLEVBQ0EsTUFBT0EsRUFBUyxLQUFLLGNBQWNzRixDQUFJLEVBQUksS0FBSyxLQUNsRCxDQUNGLENBQ0YsQ0FDRCxFQUVELGNBQWUsQ0FHYixPQUFPLEtBQUssaUJBQWlCLFFBQzNCLENBQUMsQ0FBRSxPQUFBYixFQUFRLGVBQWdCL0UsQ0FBVSxJQUNuQ2dULEdBQ0VqTyxFQUNBL0UsRUFDQSxLQUFLLGdCQUNMLEtBQUssWUFDUCxDQUNKLENBQ0QsRUFFRCxtQkFBb0IsQ0FDbEIsT0FBTyxLQUFLLFFBQVUsS0FBSyxpQkFBaUIsU0FBVyxDQUN6RCxDQUNELEVBRUQsU0FBVSxDQUNSLEtBQUssVUFBVSxFQUFJLENBQ3BCLEVBRUQsZUFBZ0IsQ0FDZCxLQUFLLFVBQVUsRUFBSyxDQUNyQixFQUVELFFBQVMsQ0FDUCxVQUFVaUssRUFBSyxDQUNiLEtBQUssZ0JBQWdCLGNBQWMsS0FBTUEsQ0FBRyxDQUM3QyxFQUVELE9BQVEsQ0FDRixLQUFLLEtBQ1AsS0FBSyxRQUFRLEtBQUssQ0FBRSxLQUFNLElBQUksS0FBSyxNQUFPLENBRTlDLENBQ0YsQ0FDRixDQUFDLDJCQ3JJTSxTQUFTd1csR0FBY3RlLEVBQU8sQ0FDbkMsTUFBTTRGLEVBQ0o1RCxFQUFBQSxTQUFTaEMsQ0FBSyxHQUNkQSxFQUFNLE1BQU0sc0NBQXNDLEVBRXBELEdBQUk0RixFQUFPLENBQ1QsS0FBTSxDQUFHLENBQUEyWSxFQUFVQyxDQUFPLEVBQUk1WSxFQUM5QixPQUFPLFdBQVcyWSxDQUFRLEVBQUksV0FBV0MsQ0FBTyxNQUVoRCxRQUFPLFdBQVd4ZSxDQUFLLENBRTNCLG04QkN3QmtCMFIsRUFBYyxVQUFVLGdCQUFjLENBQ3RELE1BQU8sQ0FDTCxPQUFRLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSSxFQUN2QyxLQUFNLENBQUUsS0FBTSxDQUFDLE9BQVEsS0FBSyxFQUFHLFNBQVUsRUFBTSxFQUMvQyxLQUFNLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN0QyxNQUFPLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN2QyxPQUFRLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN6QyxPQUFRLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxRQUFTLFNBQVUsRUFBTSxFQUMzQyxlQUFnQixDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQUssQ0FDaEQsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLE9BQVEsSUFDVixDQUNELEVBRUQsU0FBVSxDQUNSLFNBQVUsQ0FDUixPQUFPLElBQUl2UixFQUFZLEtBQU0sQ0FBRSxPQUFRLEtBQUssT0FBUSxDQUNyRCxFQUVELGVBQWdCLENBQ2QsT0FBTzBKLEdBQWlCLEtBQUssT0FBTyxJQUFJLENBQ3pDLEVBRUQsVUFBVyxPQUNULEtBQU0sQ0FBRSxNQUFBdkMsR0FBVSxLQUFLLE9BQ3ZCLE9BQ0VBLElBQVUsS0FDUixDQUFDLENBQUNBLEdBQ0YsS0FBSyxrQkFBa0JsRyxFQUFBLEtBQUssZ0JBQUwsWUFBQUEsRUFBb0IsZUFHaEQsRUFFRCxPQUFRLENBQ04sT0FBTyxLQUFLLFNBQVcsS0FBSyxTQUFTLEtBQUssTUFBTSxFQUFJLElBQ3JELEVBRUQsZUFBZ0IsQ0FFZCxPQUFPLEtBQUssT0FBUyxLQUFLLFNBQVcsSUFDdEMsRUFFRCxlQUFnQjRGLEVBQWtCLFFBQVMsQ0FDekMsS0FBTSxDQUFDLE9BQVEsTUFBTSxFQUNyQixTQUFVLE9BQ1IsT0FBTzVGLEVBQUEsS0FBSyxnQkFBTCxZQUFBQSxFQUFvQixZQUM1QixFQUNELElBQUlnWSxFQUFPLENBRVQsT0FBT0EsSUFBVSxPQUNiLEVBQ0FwWCxFQUFBQSxTQUFTb1gsQ0FBSyxFQUNaQSxFQUFNLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQyxFQUNsQ0EsQ0FDUixDQUNGLENBQUMsRUFFRCx1QkFBd0JwUyxFQUFrQixRQUFTLENBQ2pELEtBQU0sT0FDTixJQUFJb1MsRUFBTyxDQUNULE9BQU9wWCxFQUFBQSxTQUFTb1gsQ0FBSyxHQUNqQkEsRUFBTSxNQUFNLGFBQWEsRUFBRSxDQUFDLEdBQUssSUFFdkMsQ0FDRixDQUFDLEVBRUQsaUJBQWtCcFMsRUFBa0IsVUFBVyxDQUM3QyxLQUFNLFFBQ04sU0FBVSxPQUNSLE9BQU81RixFQUFBLEtBQUssZ0JBQUwsWUFBQUEsRUFBb0IsY0FDN0IsQ0FDRixDQUFDLEVBRUQsa0JBQW1CNEYsRUFBa0IsV0FBWSxDQUMvQyxLQUFNLFFBQ04sUUFBUyxHQUNULElBQUl3UixFQUFVLENBQ1osT0FBT0EsR0FBWSxLQUFLLFFBQzFCLENBQ0YsQ0FBQyxFQUVELGdCQUFpQixDQUNmLEtBQU0sQ0FBRSxNQUFPaUcsR0FBbUIsS0FBSyxPQUNqQ3JDLEVBQVMsaUJBQ2YsTUFBTyxDQUNMLENBQUMsR0FBR0EsV0FBZ0IsRUFBRyxLQUFLLE9BQzVCLENBQUMsR0FBR0EsY0FBbUIsRUFBRyxLQUFLLFNBQy9CLENBQUMsR0FBR0EsaUJBQXNCLEVBQUdsTyxHQUFZLEtBQUssTUFBTSxFQUNwRCxDQUFDLEdBQUdrTyxpQkFBc0IsRUFBR25PLEdBQVksS0FBSyxNQUFNLEVBQ3BELEdBQ0VqTSxFQUFBQSxTQUFTeWMsQ0FBYyxFQUNuQixDQUFFLENBQUNBLENBQWMsRUFBRyxFQUFLLEVBQ3pCQSxDQUVSLENBQ0QsRUFFRCxnQkFBaUIsQ0FDZixNQUFNckYsRUFBUSxLQUFLLGVBRWJzRixFQUFRLENBQUMsS0FBTSxPQUFRLE1BQU0sRUFBRSxTQUFTdEYsQ0FBSyxFQUMvQyxPQUNBLEtBQUssS0FBS0EsQ0FBSyxFQUNiLFdBQVdBLENBQUssRUFDaEIsUUFBUSxLQUFLQSxDQUFLLEVBQ2hCQSxFQUNBa0YsR0FBY2xGLENBQUssRUFBSSxJQUMvQixPQUFPclgsRUFBQUEsU0FBUzJjLENBQUssRUFBSSxHQUFHQSxLQUFXQSxDQUN4QyxFQUVELGdCQUFpQixDQUVmLE1BQU1DLEVBQ0osS0FBSyx5QkFBMkIsS0FDaEMsS0FBSyxpQkFBbUIsT0FHcEJDLEVBQVMsS0FBSyx5QkFBMkIsSUFDL0MsTUFBTyxDQUNMLEtBQU0sR0FBR0QsRUFBTyxFQUFJLEtBQUtDLEVBQVMsRUFBSSxLQUFLLEtBQUssZ0JBQ2xELENBQ0QsRUFFRCxnQkFBaUIsQ0FDZixNQUFNQyxFQUFjLEtBQUssaUJBQW1CLE9BQzVDLE1BQU8sQ0FFTCxjQUFlLEtBQUssT0FDcEIsZ0JBQWlCLEtBQUssa0JBQ3RCLGtCQUFtQixDQUFDQSxHQUFlLEtBQUssaUJBQW1CLE9BQzNELGtCQUFtQkEsRUFDbkIsa0JBQW1CLENBQUMsQ0FBQyxLQUFLLE1BQzVCLENBQ0YsQ0FDRCxFQUVELFFBQVMsQ0FDUCxTQUFTL1gsRUFBUSxDQUNmLEtBQUssT0FBU0EsQ0FDaEIsQ0FDRixDQUNGLENBQUMsd21CQ3RLaUI0SyxFQUFjLFVBQVUsV0FBUyxDQUNqRCxNQUFPLENBQ0wsS0FBTSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDckMsWUFBYSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQUssQ0FDN0MsQ0FDRixDQUFDLDYrQkNjaUJBLEVBQWMsVUFBVSxZQUFVLENBQ2xELE9BQVEsQ0FBQ08sRUFBYyxFQUV2QixTQUFVLENBQ1IsTUFBTyxDQUNMLGdCQUFpQixJQUFNLEtBQ3ZCLGNBQWUsSUFBTSxLQUFLLGlCQUM1QixDQUNELEVBRUQsTUFBTyxDQUNMLE9BQVEsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3hDLFNBQVUsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQzFDLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLE1BQU8sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3ZDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsU0FBVSxFQUFNLEVBQzNDLGtCQUFtQixDQUFFLEtBQU0sT0FBUSxRQUFTLElBQUssQ0FDbEQsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLFFBQVMsSUFDWCxDQUNELEVBRUQsU0FBVSxDQUNSLGdCQUFpQixDQUNmLE9BQU8sSUFDUixFQUVELGNBQWUsQ0FDYixPQUFPLEtBQUssaUJBQ2IsRUFFRCxlQUFnQixDQUNkLE9BQU83QixHQUFpQixLQUFLLE9BQU8sT0FBTyxDQUM1QyxFQUVELFFBQVMsQ0FDUCxPQUFPLEtBQUssT0FBTyxRQUFVLEtBQUssUUFDbkMsRUFFRCxZQUFhLENBQ1gsTUFBTyxDQUFDLENBQUMsS0FBSyxPQUNmLEVBRUQsV0FBWSxDQUNWLE9BQU8sS0FBSyxTQUFXLEtBQUssSUFDN0IsRUFFRCxhQUFjLENBQ1osR0FBSSxLQUFLLFdBQ1AsT0FBTyxLQUFLLE9BQ1AsQ0FHTCxLQUFNLENBQUUsS0FBQWpSLEVBQU0sR0FBR3lELENBQVMsRUFBRSxLQUFLLE9BQ2pDLE9BQU9BLEVBRVYsRUFFRCxVQUFXLENBRVQsT0FBTyxLQUFLLFdBQWEsT0FBUyxLQUNuQyxFQUVELGVBQWdCLENBSWQsT0FBTyxLQUFLLFdBQWEsS0FBSyxTQUFXLEtBQUssZ0JBQWdCLFFBQy9ELEVBRUQsUUFBU29FLEVBQWtCLFVBQVcsQ0FDcEMsS0FBTSxRQUNOLFFBQVMsR0FDVixDQUNGLEVBRUQsU0FBVSxDQUNSLEtBQUssVUFBVSxFQUFJLEVBR25CLEtBQU0sQ0FBRSxLQUFBN0gsR0FBUyxLQUFLLE9BQ2xCQSxJQUNGLEtBQUssUUFBVWMsRUFBVSxXQUFDZCxDQUFJLEVBQzFCQSxFQUFLLEtBQUssT0FBTyxFQUNqQkEsRUFFUCxFQUVELGVBQWdCLENBQ2QsS0FBSyxVQUFVLEVBQUssQ0FDckIsRUFFRCxRQUFTLENBQ1AsVUFBVTJJLEVBQUssQ0FHYixLQUFLLGdCQUFnQixlQUFlLEtBQU1BLENBQUcsQ0FDL0MsQ0FDRixDQUNGLENBQUMsOHVCQ25IaUI0SixFQUFjLFVBQVUsYUFBVyxDQUNuRCxNQUFPLENBQ0wsT0FBUSxDQUFFLEtBQU0sTUFBTyxRQUFTLElBQU0sRUFDdEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsU0FBVSxDQUFFLEtBQU0sUUFBUyxTQUFVLEVBQUssQ0FDM0MsRUFFRCxRQUFTLENBQ1AsWUFBWTdULEVBQVU0UyxFQUFjLENBR2xDLE9BQU9BLEVBQWUsR0FBR0EsRUFBYSxPQUFPNVMsSUFBYUEsQ0FDNUQsQ0FDRixDQUNGLENBQUMsMkJDckNNLFNBQVNpaEIsR0FBZ0JDLEVBQU8sQ0FDckMsT0FBT0EsR0FBUzFjLEVBQU8sUUFBQzBjLENBQUssRUFBRSxLQUFLQSxHQUFTQSxFQUFNLE9BQVNDLFNBQU8sQ0FDckUsQ0FFTyxTQUFTQyxHQUFlQyxFQUFNbEcsRUFBUSxHQUFJLENBQy9DLE9BQUFrRyxFQUFPbGQsRUFBUSxTQUFDa2QsQ0FBSSxFQUFJQyxFQUFBQSxTQUFVLEVBQUNELENBQUksRUFBSUEsRUFDcENKLEdBQWdCSSxHQUFBLFlBQUFBLEVBQU9sRyxFQUFNLENBQ3RDLHNqQ0N5QmtCdEgsRUFBYyxVQUFVLGNBQVksQ0FDcEQsUUFBUyxDQUNQLGNBQWUsSUFBTSxJQUN0QixFQUVELE1BQU8sQ0FDTCxRQUFTLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSSxFQUN2QyxLQUFNLENBQUUsS0FBTSxDQUFDLE9BQVEsS0FBSyxFQUFHLFFBQVMsSUFBTSxFQUM5QyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsS0FBTyxDQUFFLEVBQUcsRUFDM0MsTUFBTyxDQUFFLEtBQU0sT0FBUSxRQUFTLEtBQU8sQ0FBRSxFQUFHLEVBQzVDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLENBQzNDLEVBRUQsU0FBVSxDQUNSLGVBQWdCLENBRWQsS0FBTSxDQUFFLFNBQUE3VCxFQUFVLFFBQUF3RyxDQUFNLEVBQU0sS0FDOUIsT0FBT0EsRUFDSCxPQUFPLE9BQU9BLENBQU8sRUFBRSxPQUFPLENBQUMyRixFQUFTckcsS0FDdENxRyxFQUFRcE0sRUFBZUMsRUFBVThGLEVBQU8sSUFBSSxDQUFDLEVBQUlBLEVBQzFDcUcsR0FDTixFQUFFLEVBQ0wsSUFDTixDQUNELEVBRUQsUUFBUyxDQUNQLGVBQUFpVixHQUNBLGdCQUFBSCxFQUNGLENBQ0YsQ0FBQyxvdkNDMUJJdEwsR0FBYTlCLEVBQWMsVUFBVSxrQkFBZ0IsQ0FDeEQsTUFBTyxDQUFDLFFBQVEsRUFFaEIsTUFBTyxDQUNMLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFNBQVUsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3pDLFdBQVksQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQzNDLFFBQVMsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3hDLE9BQVEsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3hDLFNBQVUsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQzFDLEtBQU0sQ0FBRSxLQUFNLENBQUMsT0FBUSxLQUFLLEVBQUcsUUFBUyxJQUFNLEVBQzlDLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLE1BQU8sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFLLENBQ3ZDLEVBRUQsU0FBVSxDQUNSLFdBQVksQ0FDVixPQUFPLEtBQUssU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUN0QyxFQUVELGFBQWMsQ0FDWixPQUFPLEtBQUssVUFBVSxXQUFXLENBQ2xDLEVBRUQsWUFBYSxDQUNYLE9BQU8sS0FBSyxVQUFVLFVBQVUsR0FBSyxDQUFDLENBQUMsS0FBSyxRQUM3QyxFQUVELGFBQWMsQ0FDWixPQUFPLEtBQUssVUFBVSxXQUFXLEdBQUssQ0FBQyxDQUFDLEtBQUssVUFDOUMsRUFFRCxhQUFjLENBQ1osT0FBTyxLQUFLLFVBQVUsV0FBVyxDQUNsQyxFQUVELGtCQUFtQixPQUNqQixRQUVFdFEsRUFBQSxLQUFLLE9BQU8sWUFBWixZQUFBQSxFQUF1QixRQUdyQixLQUFLLFdBQ0wsR0FBR2dlLEVBQUFBLFdBQVcsS0FBSyxNQUFNLE1BQU0sS0FBSyxLQUFLLGFBRTNDLElBRUosQ0FDRCxFQUVELFFBQVMsQ0FDUCxVQUFVM2IsRUFBTSxDQUlkLE1BQU8sQ0FBQyxFQUFFLEtBQUtBLENBQUksR0FBSyxLQUFLLE9BQU9BLENBQUksSUFBTSxHQUNoRCxDQUNGLENBQ0YsQ0FBQyw2MUNDaEVJK1AsR0FBYTlCLEVBQWMsVUFBVSxtQkFBaUIsQ0FDekQsT0FBUSxDQUFDZ0ssRUFBYSxFQUV0QixNQUFPLENBQ0wsT0FBUSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDeEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdEMsS0FBTSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQUssQ0FDckMsRUFFRCxTQUFVLENBQ1IsT0FBUSxDQUNOLE9BQU9qTyxFQUFlLEtBQUssT0FBUSxLQUFLLE9BQU8sQ0FDaEQsRUFFRCxXQUFZLENBQ1YsT0FBT00sR0FBVSxLQUFLLE1BQU0sQ0FDN0IsRUFFRCxjQUFlLENBQ2IsT0FBTyxPQUFPLEtBQUssS0FBSyxLQUFLLEVBQUUsT0FBUyxHQUFLLENBQUMsS0FBSyxNQUFNLE9BQzNELENBQ0QsRUFFRCxRQUFTLENBQ1AsV0FBV3JCLEVBQU1sSyxFQUFPLEtBQU0sQ0FDNUIsR0FBSSxLQUFLLGFBQWFrSyxDQUFJLEdBQUssQ0FBQyxLQUFLLGNBQWNBLENBQUksRUFDakQsS0FBSyxVQUNQLEtBQUssZ0JBQWdCLFdBQVdBLEVBQU1sSyxDQUFJLEVBRTFDLEtBQUssUUFBUSxLQUFLLENBQ2hCLEtBQU0sR0FBRyxLQUFLLGNBQ2QsTUFBTyxDQUFFLEtBQUFBLENBQUssRUFDZixNQUdILE9BQU0sSUFBSSxNQUFNLDJDQUEyQyxDQUU5RCxFQUVELGFBQWFrSyxFQUFNbEssRUFBTSxDQUN2QixNQUFPLENBQ0wsQ0FBQyxhQUFhQSxHQUFNLEVBQUcsR0FDdkIsZ0JBQWlCLEtBQUssY0FBY2tLLENBQUksQ0FDMUMsQ0FDRCxFQUVELGlCQUFpQmxLLEVBQU0sQ0FDckIsS0FBSyxXQUFXLEtBQUssTUFBTUEsQ0FBSSxFQUFHQSxDQUFJLEVBQ3RDLEtBQUssZ0JBQWdCLEVBQUssQ0FDNUIsQ0FDRixDQUNGLENBQUMsc29CQy9ERCxTQUFrQmtQLEVBQWMsVUFBVSxnQkFBYyxDQUN0RCxPQUFRLENBQUNzSSxDQUFRLEVBRWpCLE1BQU8sQ0FDTCxVQUFXLENBQUUsS0FBTSxDQUFDLFFBQVMsTUFBTSxFQUFHLFFBQVMsRUFBTyxFQUN0RCxTQUFVLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUMxQyxLQUFNLENBQUUsS0FBTSxDQUFDLE9BQVEsS0FBSyxFQUFHLFFBQVMsSUFBSyxDQUM5QyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsWUFBYSxHQUNiLGFBQWMsR0FDZCxhQUFjLEVBQ2hCLENBQ0QsRUFFRCxTQUFVLENBQ1Isa0JBQW1CLENBQ2pCLE9BQU85WCxFQUFBQSxTQUFTLEtBQUssU0FBUyxFQUFJLEtBQUssVUFBWSxDQUFDLENBQ3JELEVBRUQsVUFBVyxDQUNULEtBQU0sQ0FBRSxLQUFBME0sR0FBUyxLQUFLLGlCQUN0QixPQUFPQSxFQUNIeVEsR0FDRXpRLEVBQUssS0FDSCxLQUNBLElBQUl6TyxFQUFZLEtBQU0sQ0FDcEIsY0FBQWtmLEVBQ0QsQ0FDSCxFQUNGQSxHQUFpQmpSLEVBQUssTUFBQ2lSLENBQWEsQ0FDekMsRUFFRCxXQUFZLENBQ1YsS0FBTSxDQUFFLE1BQUFDLEdBQVUsS0FBSyxpQkFDdkIsT0FBT0EsRUFDSEQsR0FDRUMsRUFBTSxLQUNKLEtBQ0EsSUFBSW5mLEVBQVksS0FBTSxDQUNwQixjQUFBa2YsRUFDRCxDQUNILEVBQ0ZBLEdBQWlCQSxDQUN2QixDQUNELEVBRUQsU0FBVSxDQUdSLEtBQUssTUFBTSxTQUFVLENBQ25CLEtBQU0sS0FBSyxlQUNaLEVBQ0QsS0FBSyxNQUFNLE9BQVEsQ0FDakIsTUFBTyxLQUFLLGVBQ2IsRUFDRCxLQUFLLE9BQU8sT0FBUSxDQUVsQixVQUFXLEdBQ1gsUUFBUyxDQUFDL04sRUFBSUMsSUFBUyxDQUNqQkQsSUFBT0MsR0FDVCxLQUFLLGVBQWUsQ0FFeEIsRUFDRCxDQUNGLEVBRUQsUUFBUyxDQUNQLE1BQU0saUJBQWlCZ08sRUFBUSxlQUU3QixHQUFJLENBQUUsY0FBQUYsR0FBa0IsS0FBSyxTQUM3QixHQUFJLENBQ0YsTUFBTUcsRUFBTyxPQUFNeFgsR0FBQTVHLEVBQUEsVUFBVSxZQUFWLFlBQUFBLEVBQXFCLFdBQXJCLFlBQUE0RyxFQUFBLEtBQUE1RyxJQUNmLEtBQUssY0FBZ0JvZSxJQUd2QixPQUFNQyxHQUFBQyxFQUFBLFVBQVUsWUFBVixZQUFBQSxFQUFxQixZQUFyQixZQUFBRCxFQUFBLEtBQUFDLEVBQWlDRixJQUN2QyxLQUFLLGFBQWUsSUFFbEJBLElBQ0ZILEVBQWdCLEtBQUssTUFBTUcsQ0FBSSxFQUVqQyxPQUFPcEYsRUFBUCxDQUNJbUYsSUFDRixRQUFRLE1BQU1uRixFQUFLQSxFQUFJLEtBQU1BLEVBQUksT0FBTyxFQUNwQ0EsRUFBSSxPQUFTLGVBQ2YsTUFBTXVGLEVBQUFBO0FBQUFBO0FBQUFBLGdCQUVGdkYsRUFBSTtBQUFBLGFBQ1AsRUFHUCxDQUNBLEtBQU0sQ0FBRSxRQUFBd0YsRUFBUyxHQUFHemdCLEdBQVNrZ0IsR0FBaUIsQ0FBQyxFQUMvQyxPQUFPTyxNQUFZQyxFQUFBLEtBQUssa0JBQUwsWUFBQUEsRUFBc0IsT0FBTyxNQUFPMWdCLEVBQU8sSUFDL0QsRUFFRCxNQUFNLGdCQUFpQixDQUNyQixLQUFLLFlBQWMsQ0FBQyxDQUFDLEtBQUssS0FHMUIsS0FBSyxhQUFlLENBQUMsQ0FBRSxNQUFNLEtBQUssaUJBQWlCLEVBQUssQ0FDekQsRUFFRCxNQUFNLFFBQVMsV0FDYixJQUFJQSxHQUFPaUMsRUFBQSxLQUFLLGtCQUFMLFlBQUFBLEVBQXNCLGNBQ2pDLEdBQUksQ0FDRmpDLEVBQU9BLEdBQVEsS0FBSyxTQUFTQSxDQUFJLEVBRWpDLEtBQUssU0FBUyxjQUFnQkEsRUFDOUIsR0FBSSxDQUNGLE1BQU1xZ0IsRUFBTyxLQUFLLFVBQVVyZ0IsRUFBTSxLQUFNLENBQUMsRUFDekMsT0FBTXVnQixHQUFBMVgsRUFBQSxVQUFVLFlBQVYsWUFBQUEsRUFBcUIsWUFBckIsWUFBQTBYLEVBQUEsS0FBQTFYLEVBQWlDd1gsSUFFdkMsTUFBTSxLQUFLLGVBQWUsQ0FDMUIsT0FBT3BGLEVBQVAsQ0FDQSxRQUFRLE1BQU1BLEVBQUtBLEVBQUksS0FBTUEsRUFBSSxPQUFPLENBQzFDLENBQ0EsT0FBT3pZLEVBQVAsQ0FDQSxRQUFRLE1BQU1BLENBQUssRUFDbkIsTUFBTUEsRUFBTSxPQUFPLENBQ3JCLENBQ0QsRUFFRCxNQUFNLFNBQVUsQ0FDZCxJQUFJeEMsRUFBTyxNQUFNLEtBQUssaUJBQWlCLEVBQUksRUFDM0MsR0FBSSxDQUNGQSxFQUFPQSxHQUFRLEtBQUssVUFBVUEsQ0FBSSxFQUM5QkEsR0FDRixLQUFLLGdCQUFnQixRQUFRQSxDQUFJLENBRW5DLE9BQU93QyxFQUFQLENBQ0EsUUFBUSxNQUFNQSxDQUFLLEVBQ25CLE1BQU1BLEVBQU0sT0FBTyxDQUNyQixDQUNGLENBQ0YsQ0FDRixDQUFDLDJCQ3BLY21lLEdBQUEsQ0FDYixNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsRUFDWixDQUNGLEVBRUQsUUFBUyxDQUNQLFdBQVdoTixFQUFXLENBQUUsV0FBQWlOLEVBQWEsR0FBTyxXQUFBQyxFQUFhLEVBQU8sRUFBRyxHQUFJLENBQ2pFLENBQUMsS0FBSyxVQUFZLENBQUNsTixJQUVyQixLQUFLLFVBQVksQ0FBQyxDQUFDQSxFQUNmaU4sR0FDRixLQUFLLGNBQWMsZ0JBQWdCak4sQ0FBUyxFQUUxQ2tOLEdBQ0YsS0FBSyxjQUFjLFdBQVcsS0FBSyxTQUFTLEVBR2pELENBQ0YsQ0FDSCxFQ2RlQyxHQUFBLENBQ2IsT0FBUSxDQUFDbEUsR0FBVytELEVBQVksRUFFaEMsU0FBVSxDQUNSLE1BQU8sQ0FDTCxtQkFBb0IsSUFBTSxLQUUxQixPQUFRLElBQU0sS0FBSyxNQUNuQixhQUFjLElBQU0sS0FBSyxPQUMxQixDQUNGLEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxXQUFZLElBQ2IsQ0FDRixFQUVELFNBQVUsQ0FDUixtQkFBb0IsQ0FDbEIsT0FBTyxJQUNSLEVBRUQsVUFBVyxDQUdULE9BQU8sS0FBSyxZQUFhLENBQzFCLEVBRUQsY0FBZSxDQUViLE1BQU8sQ0FBQyxDQUFDLEtBQUssUUFDZixFQUVELGFBQWMsQ0FLWixNQUFPLEVBQ1IsRUFFRCxhQUFjLENBS1osTUFBTXBULEVBQU8sS0FBSyxjQUNsQixNQUNFLENBQUMsS0FBSyxjQUNOLENBQUMsS0FBSyxhQUNOQSxJQUNFQSxFQUFLLGFBQ0xBLEVBQUssV0FHVixFQUVELGVBQWdCLENBQ2QsT0FDRSxLQUFLLGFBQ0gsa0ZBSUwsRUFFRCxZQUFhLENBQ1gsTUFDRSxDQUFDLEtBQUssYUFDTixDQUFDLEtBQUssU0FFVCxFQUdELFNBQVUsQ0FFUixNQUFPLENBQUMsQ0FBQyxLQUFLLFVBQ2YsRUFFRCxPQUFRLENBR04sT0FBTyxLQUFLLFNBQVUsQ0FDdkIsRUFFRCxpQkFBa0IsQ0FFaEIsS0FBTSxDQUFFLFNBQVV3VCxDQUFRLEVBQUcsS0FBSyxhQUNsQyxHQUFJLEtBQUssY0FBZ0JBLEVBQVEsQ0FDL0IsS0FBTSxDQUFFLEtBQUFySSxFQUFPLENBQUcsRUFBRyxLQUFLLE9BQVMsQ0FBRSxFQUMvQlgsRUFBUVcsRUFBT3FJLEVBQ3JCLE1BQU8sQ0FBQ2hKLEVBQU9BLEVBQVFnSixFQUFTLENBQUMsRUFFbkMsT0FBTyxJQUNSLEVBRUQsYUFBYyxDQUNaLE1BQU05SSxFQUFRLEtBQUssZ0JBQ2IsQ0FBRSxLQUFBUyxFQUFNLEdBQUdoVSxDQUFPLEVBQUcsS0FBSyxPQUFTLENBQUUsRUFDM0MsTUFBTyxDQUNMLEdBQUdBLEVBQ0gsR0FBSXVULEdBQVMsQ0FHWCxNQUFPQSxFQUFNLEtBQUssR0FBRyxDQUMvQixDQUNPLENBQ0YsQ0FDRixFQUVELFNBQVUsRUFFSixLQUFLLGNBQWdCLEtBQUssYUFDNUIsS0FBSyxVQUFXLENBRW5CLEVBRUQsUUFBUyxDQUNQLGFBQWMsU0FHWixPQUFPdlUsR0FBWXpCLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLFNBQVUsQ0FDOUMsS0FBTSxhQUNOLFNBQVE0RyxFQUFBLEtBQUssc0JBQUwsWUFBQUEsRUFBMEIsV0FBWSxJQUN0RCxDQUFPLENBQ0YsRUFFRCxVQUFXLENBQ1QsTUFBTW1ZLEVBQVEsS0FBSyxPQUFRLEVBQzNCLE9BQU8sS0FBSyxZQUNSLENBQ0UsR0FBR0EsRUFFSCxPQUFRLE1BQ1IsUUFBUyxRQUNULEtBQU0sUUFDTixNQUFPLFVBQ1AsT0FBUSxTQUNSLFFBQVMsU0FDVixFQUNEQSxDQUNMLEVBR0QsV0FBWSxDQUNWLEtBQUssV0FBYSxJQUNuQixFQUdELFFBQVFoaEIsRUFBTSxDQUNaLEtBQUssV0FBYUEsQ0FDbkIsRUFFRCxXQUFZLENBSVYsS0FBSyxXQUFZLENBQ2xCLEVBRUQsWUFBYSxDQUNQLEtBQUssYUFDSCxLQUFLLFFBQ1AsS0FBSyxXQUFZLEVBRWpCLEtBQUssU0FBUyxFQUFJLEVBR3ZCLEVBRUQsWUFBYSxDQUNYLEtBQUssU0FBUyxFQUFLLENBQ3BCLEVBRUQsU0FBU2loQixFQUFPLENBQ1QsS0FBSyxjQUNKQSxHQUNGLEtBQUssVUFBVyxFQUVsQixLQUFLLFlBQWEsRUFFckIsRUFFRCxXQUFXeGQsRUFBUUosRUFBTSxDQUN2QixPQUFPK0wsR0FBaUIzTCxFQUFRSixFQUFPLENBQUUsS0FBQUEsQ0FBTSxFQUFHLENBQUUsRUFBRSxJQUFJLENBQzNELEVBRUQsYUFBYyxDQUNaLE1BQU1xQixFQUFRLEtBQUssWUFDbkIsS0FBSyxjQUFjLENBQUUsT0FBUSxNQUFPLE1BQUFBLEdBQVMsQ0FBQ3VXLEVBQUtsVyxJQUFhLE9BQzlELEdBQUlrVyxHQUNGLEdBQUlsVyxFQUFVLENBQ1osS0FBTSxDQUFFLEtBQUEvRSxDQUFJLEVBQUsrRSxFQUNqQixJQUNFL0UsR0FBQSxZQUFBQSxFQUFNLFFBQVMsc0JBQ2ZpQyxFQUFBLEtBQUssaUJBQUwsTUFBQUEsRUFBQSxVQUFzQmpDLEVBQUssU0FFM0IsTUFBTyxHQUNGLEdBQUksS0FBSyxvQkFBb0IrRSxDQUFRLEVBRzFDLE1BQU8sU0FJWCxLQUFLLFFBQVFBLEVBQVMsSUFBSSxFQUMxQixLQUFLLGdCQUFnQixNQUFNLENBRXJDLENBQU8sQ0FDRixFQUVELGtCQUFrQkEsRUFBVSxDQUMxQixPQUFPQSxHQUFBLFlBQUFBLEVBQVUsVUFBVyxHQUM3QixFQUVELG9CQUFvQkEsRUFBVSxDQUM1QixPQUFPQSxHQUFBLFlBQUFBLEVBQVUsVUFBVyxHQUM3QixFQUVELE1BQU0sY0FDSixDQUNFLE9BQUFILEVBQ0EsU0FBQXZELEVBQVcsS0FBSyxTQUNoQixNQUFBcUQsRUFDQSxLQUFBMUUsQ0FDRCxFQUNEd0IsRUFDQSxDQUNBLE1BQU0wZixFQUFpQixDQUNyQixXQUFZLEdBQ1osV0FBWSxLQUFLLFFBQ2xCLEVBQ0QsS0FBSyxXQUFXLEdBQU1BLENBQWMsRUFDcEMsTUFBTUMsRUFBVSxDQUFFLE9BQUF2YyxFQUFRLFNBQUF2RCxFQUFVLEtBQUFyQixFQUFNLE1BQUEwRSxDQUFPLEVBQ2pELEdBQUksQ0FDRixNQUFNSyxFQUFXLE1BQU0sS0FBSyxZQUFZb2MsQ0FBTyxFQUcvQzNmLEVBQVMsS0FBTXVELENBQVEsQ0FDeEIsT0FBUXZDLEVBQVAsQ0FFQSxLQUFNLENBQUUsU0FBQXVDLENBQVEsRUFBS3ZDLEVBQ3JCLEdBQUksQ0FBQ2hCLEVBQVNnQixFQUFPdUMsQ0FBUSxFQUFHLENBQzlCLE1BQU0vRSxFQUFPK0UsR0FBQSxZQUFBQSxFQUFVLEtBQ2pCbVcsRUFBUXJZLEVBQUFBLFNBQVM3QyxHQUFBLFlBQUFBLEVBQU0sSUFBSSxFQUM3QnVFLEVBQVEsU0FBQ3ZFLEVBQUssSUFBSSxFQUNsQixRQUNFbWIsR0FBT25iLEdBQUEsWUFBQUEsRUFBTSxVQUFXd0MsRUFDOUIsS0FBSyxPQUFPLENBQUUsS0FBTSxRQUFTLE1BQUEwWSxFQUFPLEtBQUFDLEVBQU0sRUFFN0MsQ0FDRCxLQUFLLFdBQVcsR0FBTytGLENBQWMsQ0FDdEMsRUFFRCxlQUFlMWMsRUFBUUksRUFBUSxDQUU3QixNQUNFLENBQUMsT0FBUSxNQUFPLE9BQU8sRUFBRSxTQUFTQSxDQUFNLElBR3RDSixFQUFPLGVBQWUsQ0FBQyxXQUFZLE1BQU0sQ0FBQyxHQUMxQ0EsRUFBTyxjQUdaLEVBRUQsTUFBTSxPQUFPQSxFQUFRLENBQ25CLE1BQU1uRCxFQUFXcUMsRUFBWWMsRUFBTyxPQUFPLFNBQVUsQ0FDbkQsT0FBUSxLQUFLLFFBQ3JCLENBQU8sRUFDRCxHQUFJbkQsRUFBVSxDQUNaLEtBQU0sQ0FBRSxPQUFBdUQsQ0FBTSxFQUFLdkQsRUFDYnJCLEVBQU8sS0FBSyxlQUFld0UsRUFBUUksQ0FBTSxFQUMvQyxPQUFPLEtBQUssZUFBZUosRUFBUW5ELEVBQVV1RCxFQUFRNUUsQ0FBSSxFQUUzRCxNQUFPLEVBQ1IsRUFFRCxNQUFNLGVBQWV3RSxFQUFRbkQsRUFBVXVELEVBQVE1RSxFQUFNLENBQ25ELFFBQUFvaEIsRUFBVSxHQUNWLFVBQUFDLEVBQ0EsUUFBQUMsRUFDQSxjQUFBQyxFQUFnQixJQUNkLEtBQUssT0FBTyxDQUNWLEtBQU0sVUFDTixNQUFPLHFCQUNQLEtBQU0sZ0NBQ2hCLENBQVMsRUFDSCxZQUFBQyxFQUFjaGYsR0FDWixLQUFLLE9BQU8sQ0FDVixLQUFNLFFBQ04sTUFBTyxnQkFDUCxLQUFNLENBQ0oseUJBQXlCQSxFQUFRLElBQU0sTUFDdkNBLEdBQUEsWUFBQUEsRUFBTyxVQUFXQSxDQUNuQixDQUNYLENBQVMsQ0FDSixFQUFHLEdBQUksQ0FDTixPQUFPLElBQUksUUFBUUosR0FBVyxDQUM1QixLQUFLLGNBQ0gsQ0FBRSxPQUFBd0MsRUFBUSxTQUFBdkQsRUFBVSxLQUFBckIsQ0FBTSxFQUMxQixNQUFPaWIsRUFBS2xXLElBQWEsQ0FDdkIsTUFBTS9FLEVBQU8rRSxHQUFBLFlBQUFBLEVBQVUsS0FDdkIsR0FBSWtXLEVBQUssQ0FFUCxNQUFNdFQsRUFBUyxLQUFLLGtCQUFrQjVDLENBQVEsR0FBSy9FLEVBQUssT0FDeEQsR0FBSTJILEVBQ0YsTUFBTSxLQUFLLHFCQUFxQkEsRUFBUSxFQUFJLE1BQ3ZDLENBQ0wsTUFBTW5GLEVBQVFPLEVBQVEsU0FBQy9DLENBQUksRUFBSUEsRUFBT2liLEVBQ3RDcUcsR0FBQSxNQUFBQSxFQUFVOWUsR0FDVixNQUFNLEtBQUssZ0JBQWdCZ0MsRUFBUSxRQUFTLENBQzFDLE9BQVFnZCxFQUNSLE1BQUFoZixDQUNsQixDQUFpQixFQUVISixFQUFRLEVBQUssT0FJVGdmLEdBQVdwaEIsR0FDYixLQUFLLFFBQVFBLENBQUksRUFFbkJxaEIsR0FBQSxNQUFBQSxJQUNBLE1BQU0sS0FBSyxnQkFBZ0I3YyxFQUFRLFVBQVcsQ0FDNUMsT0FBUStjLENBQ3hCLENBQWUsRUFDRG5mLEVBQVEsRUFBSSxDQUVmLENBQ0YsQ0FDVCxDQUFPLENBQ0YsRUFFRCxNQUFNLGdCQUFnQm9DLEVBQVFqRCxFQUFPLENBQUUsT0FBQTJGLEVBQVEsTUFBQTFFLENBQUssRUFBSSxDQUd0RCxNQUFNaEMsRUFBVSxJQUFJUSxFQUFZd0QsRUFBUSxDQUN0QyxPQUFRLEdBQ1IsS0FBTSxLQUFLLEtBQ1gsVUFBVyxLQUFLLFVBQ2hCLE1BQUFoQyxDQUNSLENBQU8sRUFDS0QsRUFBTSxNQUFNaUMsRUFBTyxVQUFVakQsRUFBTyxDQUFFLFFBQUFmLEVBQVMsRUFDckQsT0FDRTBHLEdBRUEzRSxJQUFRLFFBR1IsQ0FBQy9CLEVBQVEsYUFFVDBHLEVBQU8xRSxDQUFLLEVBRVBELENBQ1IsQ0FDRixDQUNILEVDOVdPLFNBQVNrZixHQUFZNWlCLEVBQU0sQ0FHaEMsT0FBTyxJQUFJLElBQUksUUFBUUEsR0FBTSxFQUFFLFFBQ2pDLGd6Q0NxREEsU0FBa0IwVCxFQUFjLFVBQVUsV0FBUyxDQUNqRCxPQUFRLENBQUNTLEdBQVk4TixFQUFhLEVBRWxDLE1BQU8sQ0FDTCxNQUFPLENBQ0wsWUFBYSxLQUNiLFdBQVksT0FDWixVQUFXLEtBQ1gsT0FBUSxFQUNWLENBQ0QsRUFFRCxTQUFVLENBQ1IsT0FBUSxDQUlOLE1BQU1FLEVBQVEsS0FBSyxTQUFTLEVBQ3RCLENBQUUsV0FBQVUsRUFBWSxhQUFBQyxDQUFhLEVBQUksS0FDckMsTUFBTyxDQUNMLEdBQUdYLEVBQ0gsT0FBUVUsRUFBYVYsRUFBTSxPQUFTQSxFQUFNLEtBQzFDLFVBQVdVLEVBQWFWLEVBQU0sUUFBVUEsRUFBTSxNQUM5QyxPQUFRVyxFQUFlWCxFQUFNLE9BQVNBLEVBQU0sTUFDNUMsVUFBV1csRUFBZVgsRUFBTSxVQUFZQSxFQUFNLE1BQ3BELENBQ0QsRUFFRCxRQUFTLENBQ1AsT0FDRSxLQUFLLGtCQUNILEtBQUssYUFHTCxLQUFLLE1BQVEsQ0FBRSxLQUFNLEtBQUssSUFBTSxFQUNoQyxLQUFLLFVBQ0YsQ0FBQyxDQUVULEVBRUQsZUFBZ0IsQ0FDZCxPQUFPL1AsR0FDTDVELEVBQUssTUFDSCxDQUNFLE9BQVEsQ0FDTixLQUFNLFNBQ04sT0FBUSxDQUNOLE1BQU8sSUFBTSxLQUFLLE9BQU8sQ0FDM0IsQ0FDRCxFQUVELE9BQVEsQ0FBQyxLQUFLLFlBQWMsQ0FDMUIsS0FBTSxTQUVOLFVBQVcsR0FDWCxPQUFRLENBQ04sTUFBTyxDQUFDLENBQUUsVUFBVzdJLEtBQWFBLEVBQU8sT0FBTyxDQUNsRCxDQUNGLENBQ0QsRUFDRCxLQUFLLE9BQU8sT0FDZCxDQUNGLENBQ0QsRUFFRCxVQUFXLENBQ1QsT0FBTyxLQUFLLGFBQWUsS0FBSyxtQkFDakMsRUFFRCxhQUFjLENBQ1osTUFBTyxDQUFDLEtBQUssWUFDZCxFQUVELFlBQWEsQ0FFWCxPQUFPLEtBQUssUUFBVSxRQUN2QixFQUVELFNBQVUsT0FDUixNQUFPLENBQUMsS0FBSyxZQUFjLENBQUMsR0FBQ3ZDLEVBQUEsS0FBSyxzQkFBTCxNQUFBQSxFQUEwQixRQUN4RCxFQUVELFlBQWEsQ0FJWCxNQUFPLENBQUMsQ0FBQyxLQUFLLGFBQWEsTUFDNUIsRUFFRCxhQUFjLE9BQ1osUUFBT0EsRUFBQSxLQUFLLHNCQUFMLFlBQUFBLEVBQTBCLGNBQWUsSUFDakQsRUFFRCxNQUFPLENBRUwsT0FBTyxLQUFLLE9BQU8sTUFBTSxJQUMxQixFQUVELFFBQVMsQ0FDUCxPQUFPLEtBQUssV0FDUixLQUNBLEtBQUssT0FBUyxJQUNuQixFQUVELFFBQVMsQ0FDUCxPQUFPLEtBQUssV0FBYSxPQUFTLE9BQ25DLEVBRUQsVUFBVyxDQUNULE1BQU1aLEVBQVcsS0FBSyxZQUFZLEVBQ2xDLE9BQU95QyxHQUFrQixLQUFLLE9BQVF6QyxDQUFRLEdBQUtBLENBQ3BELEVBRUQsa0JBQW1CLENBQ2pCLE9BQU80ZSxFQUFVLFdBQUMsS0FBSyxXQUFhLEtBQUssTUFBTSxPQUFTLEtBQUssTUFBTSxJQUFJLENBQ3hFLEVBRUQsTUFBTyxDQVNMLE9BQU8sS0FBSyxhQUFlLEtBQUssWUFBYyxLQUFLLGVBQWlCLElBQ3JFLEVBRUQsVUFBVyxDQUNULE9BQU8sS0FBSyxnQkFBZ0IsS0FBSyxhQUFhLENBQy9DLEVBRUQsWUFBYSxDQU1YLElBQUlqZ0IsRUFBTyxLQUFLLFlBQWMsS0FBSyxxQkFBcUIsS0FBTyxLQUMvRCxHQUFJQSxFQUFNLENBR1IsTUFBTTRoQixFQUFZOWlCLEVBQWEsY0FDN0IsS0FBSyxnQkFBZ0IsS0FBSyxvQkFBb0IsQ0FDaEQsRUFHTStpQixFQUFZLEtBQUssWUFBWSxLQUFLLE1BQU0sR0FBRyxFQUMzQ0MsRUFBYUQsRUFBVSxNQUFNQSxFQUFVLE9BQVNELEVBQVUsTUFBTSxFQUd0RSxLQUFLLFVBQVksS0FDakIsTUFBTUcsRUFBZUgsRUFBVUEsRUFBVSxPQUFTLENBQUMsRUFDL0NoUSxFQUFlLEtBQUssWUFBWSxHQUFLbVEsSUFBaUIsVUFJeERILEVBQVUsU0FFWixRQUFTLEVBQUksRUFBR0ksRUFBSUosRUFBVSxPQUFRLEVBQUlJLEdBQUtoaUIsRUFBTSxJQUFLLENBQ3hELE1BQU1paUIsRUFBV0wsRUFBVSxDQUFDLEVBRXRCbmhCLEVBQU0sT0FBTyxLQUFLcWhCLEVBQVcsQ0FBQyxDQUFDLEVBQ2pDRyxJQUFhLFNBQ1gsS0FDQSxLQUFLLGdCQUFnQixLQUFLLGFBQWNqaUIsRUFBTWlpQixDQUFRLEVBQ3hEQSxFQUdBLElBQU1ELEVBQUksRUFHWixLQUFLLFVBQVl2aEIsRUFFakJULEVBQU9BLEVBQUtTLENBQUcsR0FJckIsT0FBT1QsQ0FDUixFQUVELGVBQWdCLENBSWQsR0FDRSxLQUFLLGFBQ0wsS0FBSyxhQUFlLFFBQ3BCLEtBQUssWUFDTCxLQUFLLFlBQWMsS0FDbkIsQ0FDQSxJQUFJQSxFQUFPLEtBQUssV0FBVyxLQUFLLFNBQVMsRUFDekMsT0FBSyxLQUFLLGFBS1IsS0FBSyxXQUFhQSxFQUFPaVAsRUFBQUEsTUFBTWpQLENBQUksR0FHbkNBLElBQVMsTUFDVCxDQUFDLEtBQUssWUFDTjRSLEVBQWUsS0FBSyxZQUFZLEdBS2hDLEtBQUssUUFBUSxLQUFLLENBQUUsS0FBTSxHQUFHLEtBQUssY0FBZSxFQUU1QzVSLEVBRVQsT0FBTyxLQUFLLFVBQ2IsRUFHRCxTQUFVLENBQ1IsTUFBTyxDQUFDLENBQUMsS0FBSyxJQUNmLEVBRUQsV0FBWSxDQUNWLE9BQU8sS0FBSyxhQUFhLEtBQUssYUFBYyxLQUFLLEtBQU0sQ0FBRSxTQUFVLEdBQU0sQ0FDM0UsQ0FDRCxFQUVELE1BQU8sQ0FDTCxXQUFZLGtCQUVaLE9BQVEsV0FDVCxFQUVELFFBQVMsQ0FDUCxnQkFBZ0J1QixFQUFPK0UsRUFBUSxDQUM3QixPQUFPLEtBQUssb0JBQW9CLFVBQVUvRSxFQUFPK0UsQ0FBTSxDQUN4RCxFQUVELGdCQUFnQjZWLEVBQU8sQ0FFckIsT0FBTyxLQUFLLElBQUksZ0JBQ2QsS0FBSyxLQUVGLE9BQU9BLEVBQU0sT0FBUyxFQUFJQSxFQUFNLEtBQUssUUFBVSxDQUFDLENBQ3JELENBQ0QsRUFHRCxXQUFZLENBQ04sS0FBSyxXQUNQLEtBQUssY0FBTCxLQUFLLFlBQWdCLEtBQUssV0FBVyxLQUFLLE9BQVEsS0FBSyxJQUFJLEdBRTNELEtBQUssV0FBVyxDQUVuQixFQUVELGNBQWNuYyxFQUFNLENBQ2xCLEdBQUksS0FBSyxZQUFjLEtBQUssWUFBYyxLQUFNLENBQzlDLEtBQU0sQ0FBRSxvQkFBQWtpQixDQUFrQixFQUFNLEtBQ2hDLFlBQUssV0FBVyxLQUFLLFNBQVMsRUFBSUEsRUFBb0IsV0FBV2xpQixDQUFJLEVBQ3JFa2lCLEVBQW9CLFNBQVMsRUFDdEIsR0FFVCxNQUFPLEVBQ1IsRUFFRCxjQUFjbGlCLEVBQU0sT0FDbEIsT0FBTzRSLEVBQWUsS0FBSyxZQUFZLEVBQ25DLEtBQUssY0FBYzVSLENBQUksRUFDdkIsQ0FBQyxHQUFDaUMsRUFBQSxLQUFLLGFBQUwsTUFBQUEsRUFBaUIsS0FBS2pDLEdBQzdCLEVBR0QsV0FBWSxDQUNWLEtBQUssUUFBUSxJQUFJLENBQ2xCLEVBR0QsUUFBUUEsRUFBTSxDQUVSLEtBQUssWUFFUCxLQUFLLGNBQWNBLENBQUksR0FFdkIsS0FBSyxZQUFjLEtBQ25CLEtBQUssV0FBYUEsRUFFckIsRUFFRCxnQkFBZ0JtUyxFQUFJQyxFQUFNLENBRXBCRCxJQUFPQyxJQUNULEtBQUssV0FBYSxPQUVyQixFQUVELE1BQU0sUUFBUyxDQUNiLE9BQU8sS0FBSyxNQUFNLENBQ25CLEVBRUQsTUFBTSxPQUFRLENBQ1osT0FBTyxLQUFLLFNBQVMsS0FBSyxxQkFBcUIsSUFBSSxDQUNwRCxFQUVELGNBQWMrUCxFQUFVLEdBQU0sQ0FDNUIsT0FBTyxLQUFLLFdBQ1JBLEVBQ0UsU0FDQSxVQUNGQSxFQUNFLFNBQ0EsV0FDUCxFQUVELE1BQU0sT0FBTzNkLEVBQVEsQ0FBRSxTQUFBZ0QsRUFBVyxHQUFNLFVBQUE0YSxFQUFZLEVBQVEsRUFBRSxHQUFJLENBQ2hFLEdBQUk1YSxHQUFZLENBQUMsS0FBSyxjQUNwQixNQUFPLEdBR1QsTUFBTTZhLEVBQVVGLEdBQVcsS0FBSyxNQUFNLEtBQUssY0FBY0EsQ0FBTyxDQUFDLEVBRzNERyxFQUFpQjVlLEVBQVljLEVBQU8sT0FBTyxTQUFVLENBQ3pELE9BQVEsS0FBSyxTQUNkLEVBQ0tuRCxFQUFXaWhCLEdBQWtCLEtBQUssU0FDbEMxZCxHQUFTdkQsR0FBQSxZQUFBQSxFQUFVLFNBQVUsS0FBSyxPQUNsQ3JCLEVBQU8sS0FBSyxlQUFld0UsRUFBUUksQ0FBTSxFQUMvQyxJQUFJMmQsRUE2REosR0E1REksQ0FBQ0QsR0FBa0IsS0FBSyxZQUMxQkMsRUFBVSxNQUFNLEtBQUssZ0JBQWdCL2QsRUFBUW5ELEVBQVV1RCxFQUFRNUUsRUFBTSxDQUNuRSxVQUFXLElBQU0sS0FBSyxnQkFBZ0IsS0FBSyxjQUFhLENBQUUsRUFDMUQsUUFBU3dDLEdBQ1AsS0FBSyxnQkFBZ0IsUUFBUyxDQUM1QixRQUFTLENBQUUsTUFBQUEsQ0FBTSxDQUNuQixDQUFDLEVBQ0gsY0FBZSxJQUFNLENBQ25CLE1BQU1pQyxFQUFPNGQsRUFBUSxFQUFLLEVBQzFCLEtBQUssT0FBTyxDQUNWLEtBQU0sT0FDTixNQUFPLEtBQUssV0FDUixRQUFRcEMsRUFBQUEsV0FBV3hiLENBQUksSUFDdkIsVUFBVXdiLEVBQUFBLFdBQVd4YixDQUFJLElBQzdCLEtBQU0sQ0FDSixLQUFLLFdBQ0QsR0FBRyxLQUFLLGlCQUFpQkEsS0FDekIsY0FBYyxLQUFLLGtCQUFrQkEsS0FDekMsS0FBSyxhQUNQLEVBQ0QsQ0FDRixFQUNELFlBQWEsSUFBTSxDQUNqQixNQUFNQSxFQUFPNGQsRUFBUSxFQUFJLEVBQ3pCLEtBQUssT0FBTyxDQUNWLEtBQU0sUUFDTixNQUFPLGdCQUNQLEtBQU0sYUFBYTVkLEtBQVEsS0FBSyxhQUNqQyxDQUNILEVBQ0QsRUFFRDhkLEVBQVUsTUFBTSxLQUFLLGVBQWUvZCxFQUFRbkQsRUFBVXVELEVBQVE1RSxFQUFNLENBQ2xFLFFBQVMsR0FDVCxVQUFXLElBQU0sS0FBSyxnQkFBZ0IsS0FBSyxjQUFhLENBQUUsRUFDMUQsUUFBU3dDLEdBQ1AsS0FBSyxnQkFBZ0IsUUFBUyxDQUM1QixRQUFTLENBQUUsTUFBQUEsQ0FBTSxDQUNuQixDQUFDLEVBQ0gsY0FBZSxJQUFNLENBQ25CLE1BQU1pQyxFQUFPNGQsRUFBUSxFQUFLLEVBQzFCLEtBQUssT0FBTyxDQUNWLEtBQU0sVUFDTixNQUFPLGdCQUFnQnBDLGFBQVd4YixDQUFJLElBQ3RDLEtBQU0sR0FBRyxLQUFLLGlCQUFpQkEsS0FDaEMsQ0FDRixFQUNELFlBQWFqQyxHQUFTLENBQ3BCLE1BQU1pQyxFQUFPNGQsRUFBUSxFQUFJLEVBQ3pCLEtBQUssT0FBTyxDQUNWLEtBQU0sUUFDTixNQUFPLGdCQUNQLEtBQU0sQ0FDSixhQUFhNWQsS0FBUSxLQUFLLFlBQVlqQyxFQUFRLElBQU0sTUFDcERBLEdBQUEsWUFBQUEsRUFBTyxVQUFXQSxDQUNwQixFQUNELENBQ0gsRUFDRCxFQUVDK2YsR0FFRixHQURBLEtBQUssZ0JBQWdCLEVBQ2pCSCxHQUFhNWQsRUFBTyxVQUN0QixLQUFLLE1BQU0sVUFDRixLQUFLLFdBQVksQ0FFMUIsTUFBTXJFLEVBQUssS0FBSyxVQUFVLEtBQUssT0FBUSxLQUFLLElBQUksRUFDaEQsS0FBSyxRQUFRLFFBQVEsQ0FBRSxLQUFNc2hCLEdBQVksR0FBRyxLQUFLLFdBQVd0aEIsR0FBSSxFQUFHLEdBR3ZFLE9BQU9vaUIsQ0FDUixFQUVELE1BQU0sZ0JBQWdCL2QsRUFBUWdlLEVBQVdDLEVBQVN6aUIsRUFBTSxDQUN0RCxVQUFBcWhCLEVBQ0EsUUFBQUMsRUFDQSxjQUFBQyxFQUNBLFlBQUFDLENBQ0YsRUFBRyxDQUVELE1BQU1lLEVBQVUsS0FBSyxXQUNqQixLQUFLLGNBQWN2aUIsQ0FBSSxFQUN2QixLQUFLLGNBQWNBLENBQUksRUFDM0IsR0FBSXVpQixFQUNGbEIsR0FBQSxNQUFBQSxJQUNBLE1BQU0sS0FBSyxnQkFBZ0I3YyxFQUFRLFVBQVcsQ0FDNUMsT0FBUStjLEVBQ1QsTUFDSSxDQUNMLE1BQU0vZSxFQUFRLGtDQUNkOGUsR0FBQSxNQUFBQSxFQUFVOWUsR0FDVixNQUFNLEtBQUssZ0JBQWdCZ0MsRUFBUSxRQUFTLENBQzFDLE9BQVFnZCxFQUNSLE1BQUFoZixFQUNELEVBRUgsT0FBTytmLENBQ1QsQ0FDRixDQUNGLENBQUMsaUNDOWRJbE8sR0FBYTlCLEVBQWMsVUFBVSxpQkFBZSxDQUN2RCxRQUFTbVEsRUFDWCxDQUFDLHFXQ1FpQm5RLEVBQWMsVUFBVSxhQUFXLENBQ25ELE1BQU8sQ0FDTCxPQUFRLENBQUUsS0FBTSxNQUFPLFFBQVMsSUFBSyxDQUN2QyxDQUNGLENBQUMsd25CQ0VpQkEsRUFBYyxVQUFVLGFBQVcsQ0FDbkQsTUFBTyxDQUNMLE1BQU8sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3ZDLE9BQVEsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFLLENBQ3hDLEVBRUQsUUFBUyxDQUNQLGFBQWFvUSxFQUFPLENBQ2xCLE1BQU1qZSxFQUFRLENBQUUsR0FBRyxLQUFLLE1BQU8sTUFBT2llLEVBQU0sSUFBSyxFQUNqRCxPQUFJamUsRUFBTSxPQUNSQSxFQUFNLEtBQU8sR0FFUixLQUFLLGFBQWFBLENBQUssQ0FDaEMsQ0FDRixDQUNGLENBQUMsNFBDdkJELE1BQUsyUCxHQUFhOUIsRUFBYyxVQUFVLGlCQUFlLENBQ3ZELFdBQVksQ0FBRSxXQUFBcVEsRUFBWSxFQUUxQixNQUFPLENBQ0wsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQUssQ0FDdkMsRUFFRCxTQUFVLENBQ1IsS0FBTSxDQUNKLEtBQU0sQ0FDSixPQUFRLENBQUMsS0FBSyxNQUFNLE1BQVEsR0FBSyxDQUNsQyxFQUVELElBQUlsSyxFQUFNLENBQ0osS0FBSyxPQUFTQSxHQUNoQixLQUFLLFFBQVEsS0FDWCxLQUFLLGFBQWEsQ0FDaEIsR0FBRyxLQUFLLE1BQ1IsS0FBTUEsRUFBTyxFQUNkLENBQ0gsQ0FFSixDQUNGLENBQ0YsQ0FDRixDQUFDLDJCQ3JDY21LLEdBQUEsQ0FDYixPQUFRLENBQUNqRyxFQUFTLEVBRWxCLE1BQU8sQ0FDTCxNQUFPLENBQ0wsU0FBVSxFQUNYLENBQ0YsRUFFRCxRQUFTLENBQ1AsbUJBQW1Ca0csRUFBZ0IsR0FBTyxDQUN4QyxNQUFPLENBQ0wsVUFBVyxJQUNYLE9BQVEsb0JBQ1IsVUFBVyx1QkFDWCxZQUFhLHVCQUNiLFdBQVksc0JBQ1osY0FBZSx5QkFDZixjQUFBQSxFQUNBLFFBQVMsS0FBSyxZQUNkLE1BQU8sS0FBSyxTQUNiLENBQ0YsRUFFRCxhQUFjLENBQ1osS0FBSyxTQUFXLEVBQ2pCLEVBRUQsVUFBVSxDQUFFLFNBQUFDLEVBQVUsU0FBQUMsR0FBWSxDQUNoQyxLQUFLLFNBQVcsR0FDWkQsSUFBYUMsR0FDZixLQUFLLFNBQVUsQ0FFbEIsRUFFRCxZQUFZcFosRUFBY3FaLEVBQU1DLEVBQWlCLENBQy9DLEtBQU0sQ0FBRSxTQUFBeFQsQ0FBUSxFQUFLOUYsRUFDckIsR0FBSThGLEVBQVUsQ0FHWixNQUFNeVQsR0FBU0QsR0FBQSxZQUFBQSxFQUFrQixLQUFNLEVBQ3ZDLFFBQVMsRUFBSSxFQUFHLEVBQUlELEVBQUssT0FBUSxJQUMvQkEsRUFBSyxDQUFDLEVBQUV2VCxDQUFRLEVBQUksRUFBSXlULEVBRzVCLE9BQU9GLENBQ1IsQ0FDRixDQUNILHNCQ2hEVSxNQUFBLCtDQUFBLE1BQUEsNEJBQUEsTUFBQSw2Q0FBQSxNQUFBLDZDQUFBLE1BQUEsd01BQUEsT0FBQXpFLEVBQUEsVUFBQSxFQUFBQyxFQUFBLG1CQUFBLE1BQUEsOEdBQUosTUFBSTJFLEVBQUFBLGVBQUF4RSxFQUFBLE1BQUEsR0FBQSxDQUFBLFVBQUFBLEVBQUEsTUFBQSxJQUFBQSxFQUFBLE9BQUFKLEVBQUFBLFlBQUFDLEVBQUFBLG1CQUFBLE1BQUFJLEdBQUEsQ0FBQUQsRUFBQSwwQkFBQUgsRUFBQSxtQkFBQSxNQUFBLE9BQUEsTUFBQSxtQkFBQSxRQUFBNEUsRUFBQSxDQUFBLElBQUFBLEVBQUEsQ0FBQSxFQUFBQyxnQkFBQUMsR0FBQTNFLEVBQUEsT0FBQSxDQUFBQSxFQUFBLE9BQUEsQ0FBQSxNQUFBLENBQUEsS0FBQUEsRUFBQSwwQkFBQUgsRUFBQSxtQkFBQSxNQUFBLE9BQUEsTUFBQStFLEVBQUEsZUFBQSxDQUFBLGVBQUEsQ0FBQSxjQUFBNUUsRUFBQSxNQUFBLENBQUEsQ0FBQSx3Q0FBQTZFLEVBQUFBLG1CQUFBLE1BQUEsQ0FBQSxNQUFBLGtCQUFBLFVBQUE3RSxFQUFBLGtCQUFBQSxFQUFBLHVCQUFBSCxFQUFBLG1CQUFBLE1BQUFpRixHQUFBQyxFQUFBQSxnQkFBQS9FLEVBQUEsT0FBQSxFQUFBLENBQUEsbUNBQUFKLEVBQUFBLFlBQUFDLEVBQUFBLG1CQUFBLE1BQUFtRixHQUFBLENBQUFILEVBQUFBLG1CQUFBLE1BQUEsQ0FBQSxNQUFBLGtCQUFBLFVBQUE3RSxFQUFBLHFCQUFBQSxFQUFBLGdCQUFBSixFQUFBQSxZQUFBQyxFQUFBQSxtQkFBQSxNQUFBb0YsR0FBQSxDQUFBakYsRUFBQSxXQUFBSixFQUFBQSxZQUFBQyxFQUFBQSxtQkFBQSxJQUFBcUYsYUFBQSxPQUFBLE1BQUEsZUFBQWxGLEVBQUEsb0JBQUFBLEVBQUEsTUFBQSxJQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsK0JBQUFBLEVBQUEsVUFBQUosRUFBQUEsWUFBQUMsRUFBQUEsbUJBQUEsU0FBQXFGLGFBQUEsT0FBQSxNQUFBLGNBQUEsS0FBQSxVQUFBbEYsRUFBQSxvQkFBQUEsRUFBQSxNQUFBLElBQUEsRUFBQSxDQUFBLDRCQUFBQSxFQUFBLFFBQUFBLEVBQUEsT0FBQSxHQUFBN2MsQ0FBQSwyQ0FBQTZjLEVBQUEsV0FBQUosRUFBQUEsWUFBQUMsRUFBQUEsbUJBQUEsU0FBQXFGLGFBQUEsT0FBQSxNQUFBLGNBQUEsS0FBQSxVQUFBbEYsRUFBQSxvQkFBQUEsRUFBQSxNQUFBLE1BQUEsRUFBQSxDQUFBLDRCQUFBQSxFQUFBLFVBQUFBLEVBQUEsU0FBQSxHQUFBN2MsQ0FBQSx5R0FBQTZjLEVBQUEsV0FBQW1GLEVBQUFBLGdCQUFBdkYsRUFBQUEsVUFBQSxFQUFBQyxxQkFBQSxRQUFBdUYsR0FBQSxrQkFBQXZGLEVBQUFBLG1CQUFBQyxFQUFBLFNBQUEsS0FBQUMsRUFBQUEsV0FBQUMsRUFBQSxXQUFBVCxrQkFBQU0scUJBQUEsS0FBQSxLQUFBLENBQUFnRixFQUFBLG1CQUFBLEtBQUEsS0FBQSxDQUFBdEYsRUFBQSxRQUFBLGtCQUFBVyxFQUFBLFlBQUFtRixFQUFBLE9BQUEsU0FBQXJGLEVBQUEsb0JBQUFULENBQUEsRUFBQSxNQUFBUyxFQUFBLFNBQUFULENBQUEsK0RBQUErRixFQUFBQSxZQUFBQyxFQUFBLENBQUEsS0FBQWhHLEVBQUEsT0FBQUEsRUFBQSxTQUFBUyxFQUFBLG9CQUFBVCxDQUFBLEVBQUEsS0FBQVMsRUFBQSxLQUFBLEtBQUFBLEVBQUEsV0FBQSxNQUFBQSxFQUFBLE1BQUEsU0FBQUEsRUFBQSwyR0FBQUEsRUFBQSxNQUFBLGdDQUFBQSxFQUFBLCtDQUFBRSxFQUFBLFlBQUFzRixFQUFBLE9BQUEsV0FBQXhGLEVBQUEsWUFBQUEsRUFBQSxlQUFBQSxFQUFBLFlBQUEsRUFBQSxRQUFBQSxFQUFBLG1CQUFBLEVBQUEsRUFBQSxVQUFBQSxFQUFBLGtCQUFBLHNCQUFBeUUsRUFBQSxDQUFBLElBQUFBLEVBQUEsQ0FBQSxFQUFBeGlCLEdBQUErZCxFQUFBLGFBQUEvZCx1QkFBQSxJQUFBLEVBQUEyZCxFQUFBQSxVQUFBLEVBQUEsRUFBQUMsRUFBQSxtQkFBQUMsV0FBQSxLQUFBQyxFQUFBLFdBQUFDLEVBQUEsY0FBQSxDQUFBMWQsRUFBQXJCLG1CQUFBaWYsRUFBQSxZQUFBdUYsRUFBQSxDQUFBLElBQUF6RixFQUFBLFdBQUFBLGlCQUFBMWQsRUFBQSxJQUFBLEVBQUEsT0FBQTBkLEVBQUEsZUFBQSxTQUFBQSxFQUFBLGdCQUFBQSxFQUFBLGVBQUEvZSxDQUFBLEVBQUEsS0FBQXFCLEVBQUEsS0FBQSxLQUFBQSxFQUFBLEtBQUEsS0FBQUEsRUFBQSxLQUFBLE9BQUFBLEVBQUEsT0FBQSxVQUFBMGQsRUFBQSxrQkFBQSxNQUFBQSxlQUFBQSxFQUFBLGVBQUExZCxFQUFBLEtBQUEsQ0FBQSxNQUFBckIsRUFBQSxFQUFBLE1BQUErZSxFQUFBLE1BQUEsNkpBQUFBLEVBQUEsTUFBQSx1REF3R1FyTSxFQUFjLFVBQVUsZUFBYSxDQUNyRCxPQUFRLENBQUNzUSxFQUFhLEVBQ3RCLE9BQVEsQ0FBQyxXQUFXLEVBRXBCLE1BQU8sQ0FDTCxPQUFRLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUN4QyxTQUFVLENBQUUsS0FBTSxPQUFRLFNBQVUsRUFBTSxFQUMxQyxLQUFNLENBQUUsS0FBTSxDQUFDLE1BQU8sTUFBTSxFQUFHLFFBQVMsSUFBTSxFQUM5QyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSSxFQUNuQyxLQUFNLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN2QyxPQUFRLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN6QyxVQUFXLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUM1QyxNQUFPLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUN0QyxNQUFPLENBQUUsS0FBTSxPQUFRLFFBQVMsQ0FBRSxDQUNuQyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsT0FBUSxLQUFLLE1BQVEsS0FBSyxPQUFPLElBQ25DLENBQ0QsRUFFRCxTQUFVLENBQ1IsTUFBTyxDQUNMLE9BQU8sS0FBSyxVQUFVLElBQ3ZCLEVBRUQsT0FBUSxDQUNOLE9BQU8sS0FBSyxVQUFVLEtBQ3ZCLEVBRUQsVUFBVyxDQUNULE9BQU8sS0FBSyxVQUFVLFFBQ3ZCLEVBRUQsWUFBYSxDQUNYLE1BQU8sQ0FDTCxHQUFHLEtBQUssS0FDUixPQUFRLEtBQUssTUFDZixDQUNELEVBRUQsWUFBYSxDQUNYLE9BQU9qUyxFQUFnQixLQUFLLE9BQU8sVUFBVSxDQUM5QyxFQUdELGdCQUFpQixDQUNmLE9BQU8sS0FBSyxPQUFPLFFBQ3BCLEVBRUQsY0FBZSxPQUNiLE1BQU10TSxHQUFPckMsRUFBQSxLQUFLLGlCQUFMLFlBQUFBLEVBQXFCLEtBQ2xDLE9BQU9xQyxHQUFRLEtBQUssS0FBS0EsQ0FBSSxDQUM5QixFQUVELG1CQUFvQixPQUNsQixRQUNFckMsRUFBQSxLQUFLLGVBQUwsWUFBQUEsRUFBbUIsUUFBUyxHQUM1QixLQUFLLGVBQWUsWUFBYSxDQUMvQixLQUFNLFFBQ04sUUFBUyxHQUNULE9BQVEsS0FBSyxlQUNkLENBRUosRUFFRCxhQUFjLE9BQ1osUUFBT0EsRUFBQSxLQUFLLGVBQUwsWUFBQUEsRUFBbUIsU0FBVSxDQUNyQyxFQUVELGVBQWdCLE9BQ2QsUUFBT0EsRUFBQSxLQUFLLGFBQUwsWUFBQUEsRUFBaUIsU0FBVSxDQUNuQyxFQUVELFlBQWEsQ0FDWCxPQUFPLEtBQUssY0FBZ0IsS0FBSyxXQUNsQyxFQUVELGVBQWdCLENBQ2QsS0FBTSxDQUFFLGVBQUFxaUIsRUFBZ0IsYUFBQUMsQ0FBYSxFQUFJLEtBQ3pDLEdBQUlELEdBQWtCQyxFQUFjLENBQ2xDLEtBQU0sQ0FBRSxTQUFBQyxHQUFhLEtBQUssVUFDcEJDLEVBQWUsQ0FBQyxLQUFLLE1BQVFILEVBQWUsS0FFbEQsT0FBTyxLQUFLLFlBQ1ZBLEVBQ0FDLEVBQWEsSUFBSSxDQUFDdmtCLEVBQU1ILElBQVUsQ0FDaEMsTUFBTWhCLEVBQ0p5bEIsRUFBZSxNQUNmLEdBQUcsS0FBSyxRQUFRQSxFQUFlLFFBQVF6a0IsSUFFbkM0YyxFQUNKZ0ksR0FFQUQsRUFBUyxXQUFXM2xCLENBQUksR0FBS0EsRUFBSyxPQUFTMmxCLEVBQVMsT0FHdEQsTUFBTyxDQUNMLEtBQUF4a0IsRUFDQSxLQUFBbkIsRUFDQSxLQUFBNGQsRUFDQSxPQUxhK0gsSUFBYTNsQixDQU01QixFQUNELENBQ0gsRUFFRixNQUFPLENBQUMsQ0FDVCxFQUVELFNBQVUsQ0FDUixLQUFNLENBQUUsWUFBQTZsQixDQUFVLEVBQU0sS0FDeEIsT0FDRUEsR0FDQSxHQUFHQSxLQUNEQSxJQUFnQixFQUFJLE9BQVMsU0FHbEMsRUFFRCxnQkFBaUIsQ0FDZixPQUFPLEtBQUssV0FBYSxLQUFLLFVBQVksS0FBSyxTQUNoRCxFQU1ELFVBQVc3YyxFQUFrQixZQUFhLENBQ3hDLEtBQU0sUUFDTixRQUFTLEdBQ1QsSUFBSThjLEVBQVcsQ0FDYixPQUFPQSxHQUFhNVcsRUFBYyxLQUFLLE1BQU0sQ0FDL0MsQ0FDRixDQUFDLEVBRUQsU0FBVWxHLEVBQWtCLFdBQVksQ0FDdEMsS0FBTSxRQUNOLFFBQVMsR0FDVCxJQUFJK2MsRUFBVSxDQUNaLE9BQU9BLEdBQVk3VyxFQUFjLEtBQUssTUFBTSxDQUM5QyxDQUNGLENBQUMsRUFFRCxVQUFXbEcsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxHQUNWLENBQ0YsRUFFRCxRQUFTLENBQ1Asb0JBQW9Cc1csRUFBVSxDQUM1QixPQUFPMWYsRUFBZSxLQUFLLFNBQVUwZixFQUFTLElBQUksQ0FDbkQsRUFFRCxRQUFTLENBR1AsS0FBSyxRQUFRLEtBQUssQ0FDaEIsS0FBTSxHQUFHLEtBQUssVUFBVSxPQUFPLEtBQUssT0FFcEMsTUFBTyxLQUFLLE9BQU8sTUFDcEIsQ0FDRixFQUVELFVBQVcsQ0FFVixFQUVELFVBQVcsQ0FDVCxLQUFLLFVBQVUsU0FBUyxDQUMxQixDQUNGLENBQ0YsQ0FBQywwcENDbFBpQjVMLEVBQWMsVUFBVSxnQkFBYyxDQUN0RCxNQUFPLENBQ0wsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDdkMsUUFBUyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQU0sRUFDekMsZUFBZ0IsQ0FBRSxLQUFNLFFBQVMsU0FBVSxFQUFLLENBQ2pELEVBRUQsU0FBVSxDQUNSLE1BQU8sQ0FDTCxNQUFNc1MsR0FBUyxLQUFLLE1BQU0sT0FBUyxJQUFJLE1BQU0sS0FBSyxFQUNsRCxNQUFPLENBQ0wsS0FBTUEsRUFBTSxDQUFDLEVBQ2IsTUFBT0EsRUFBTSxDQUFDLENBQ2hCLENBQ0YsQ0FDRCxFQUVELFFBQVMsQ0FDUCxlQUFlQyxFQUFRLENBQ3JCLE1BQU8sZUFBZTVlLEVBQUFBLFVBQVU0ZSxFQUFPLElBQUksR0FDNUMsRUFFRCxhQUFhQSxFQUFRLENBQ25CLE9BQU8sS0FBSyxLQUFLLE9BQVNBLEVBQU8sS0FDN0IsNEJBQTRCLEtBQUssS0FBSyxRQUN0QyxJQUNMLEVBRUQsWUFBWUEsRUFBUSxDQUVsQixNQUFNRCxFQUNKLEtBQUssS0FBSyxPQUFTQyxFQUFPLE1BQVEsS0FBSyxLQUFLLFFBQVUsTUFDbEQsT0FDQSxNQUNOLE9BQU8sS0FBSyxhQUFhLENBQ3ZCLEdBQUcsS0FBSyxNQUNSLE1BQU8sR0FBR0EsRUFBTyxRQUFRRCxJQUMxQixDQUNILENBQ0YsQ0FDRixDQUFDLDRqQkNoREQsU0FBa0J0UyxFQUFjLFVBQVUsZ0JBQWMsQ0FDdEQsTUFBTyxDQUNMLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLE9BQVEsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3hDLFNBQVUsQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQzFDLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLEtBQU0sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3RDLE1BQU8sQ0FBRSxLQUFNLE9BQVEsU0FBVSxFQUFNLEVBQ3ZDLE9BQVEsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLEVBQ3hDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLENBQzNDLEVBRUQsUUFBUyxDQUNQLFdBQVdyUixFQUFNLENBQ2YsS0FBTSxDQUFFLEtBQUFvRCxFQUFNLE9BQUF5Z0IsQ0FBTyxFQUFJLEtBQUssS0FDeEJsa0IsRUFBUUssRUFBS29ELENBQUksRUFDdkIsT0FBT3lnQixFQUNIQSxFQUFPLEtBQ0wsS0FDQSxJQUFJL2pCLEVBQVksS0FBTSxDQUNwQixLQUFBc0QsRUFDQSxNQUFBekQsRUFDQSxLQUFNSyxFQUNOLFNBQVV6QyxFQUFlLEtBQUssU0FBVTZGLENBQUksRUFDN0MsQ0FDSCxFQUNBMGdCLEVBQUFBLFdBQVdua0IsQ0FBSyxDQUN0QixDQUNGLENBQ0YsQ0FBQywyQkN2REQsSUFBSW9rQixHQUFZLE9BQU8sZUFDbkJDLEdBQXNCLE9BQU8sc0JBQzdCQyxHQUFlLE9BQU8sVUFBVSxlQUNoQ0MsR0FBZSxPQUFPLFVBQVUscUJBQ2hDQyxHQUFrQixDQUFDQyxFQUFLN2tCLEVBQUtJLElBQVVKLEtBQU82a0IsRUFBTUwsR0FBVUssRUFBSzdrQixFQUFLLENBQUUsV0FBWSxHQUFNLGFBQWMsR0FBTSxTQUFVLEdBQU0sTUFBQUksQ0FBTyxDQUFBLEVBQUl5a0IsRUFBSTdrQixDQUFHLEVBQUlJLEVBQ3RKMGtCLEdBQWlCLENBQUM3ZixFQUFHcUssSUFBTSxDQUM3QixRQUFTeVYsS0FBUXpWLElBQU1BLEVBQUksQ0FBQSxHQUNyQm9WLEdBQWEsS0FBS3BWLEVBQUd5VixDQUFJLEdBQzNCSCxHQUFnQjNmLEVBQUc4ZixFQUFNelYsRUFBRXlWLENBQUksQ0FBQyxFQUNwQyxHQUFJTixHQUNGLFFBQVNNLEtBQVFOLEdBQW9CblYsQ0FBQyxFQUNoQ3FWLEdBQWEsS0FBS3JWLEVBQUd5VixDQUFJLEdBQzNCSCxHQUFnQjNmLEVBQUc4ZixFQUFNelYsRUFBRXlWLENBQUksQ0FBQyxFQUV0QyxPQUFPOWYsQ0FDVCxFQUNJK2YsR0FBWSxDQUFDemIsRUFBUWtHLElBQVksQ0FDbkMsSUFBSXpOLEVBQVMsQ0FBQSxFQUNiLFFBQVMraUIsS0FBUXhiLEVBQ1htYixHQUFhLEtBQUtuYixFQUFRd2IsQ0FBSSxHQUFLdFYsRUFBUSxRQUFRc1YsQ0FBSSxFQUFJLElBQzdEL2lCLEVBQU8raUIsQ0FBSSxFQUFJeGIsRUFBT3diLENBQUksR0FDOUIsR0FBSXhiLEdBQVUsTUFBUWtiLEdBQ3BCLFFBQVNNLEtBQVFOLEdBQW9CbGIsQ0FBTSxFQUNyQ2tHLEVBQVEsUUFBUXNWLENBQUksRUFBSSxHQUFLSixHQUFhLEtBQUtwYixFQUFRd2IsQ0FBSSxJQUM3RC9pQixFQUFPK2lCLENBQUksRUFBSXhiLEVBQU93YixDQUFJLEdBRWhDLE9BQU8vaUIsQ0FDVCxFQUNBLFNBQVNpakIsR0FBWXRQLEVBQUk2TSxFQUFNOWhCLEVBQVUsQ0FBQSxFQUFJLENBQzNDLElBQUl3a0IsRUFDSixNQUFNMWpCLEVBQUtkLEVBQVMsQ0FBRSxTQUFBeWtCLEVBQVdDLEVBQUFBLGVBQWlCLEVBQUc1akIsRUFBSTZqQixFQUFlTCxHQUFVeGpCLEVBQUksQ0FBQyxVQUFVLENBQUMsRUFDNUY4akIsRUFBaUIsQ0FDckIsU0FBV0MsR0FBTSxDQUNmQyxHQUFpQmhELEVBQU0rQyxFQUFFLFNBQVVBLEVBQUUsUUFBUSxDQUM5QyxDQUNMLEVBQ1FqTyxFQUFRLElBQU0sQ0FDbEIsTUFBTXRWLEVBQVMsT0FBTzJULEdBQU8sU0FBV3dQLEdBQVksS0FBTyxPQUFTQSxFQUFTLGNBQWN4UCxDQUFFLEVBQUlvRSxFQUFZLGFBQUNwRSxDQUFFLEVBQzNHM1QsSUFFTGtqQixFQUFXLElBQUlPLEdBQVN6akIsRUFBUThpQixHQUFlQSxHQUFlLENBQUEsRUFBSVEsQ0FBYyxFQUFHRCxDQUFZLENBQUMsRUFDcEcsRUFDUUssRUFBTyxJQUFNUixHQUFZLEtBQU8sT0FBU0EsRUFBUyxVQUN4RFMsT0FBQUEsRUFBWSxhQUFDck8sQ0FBSyxFQUNsQnNPLEVBQWlCLGtCQUFDRixDQUFJLEVBQ2YsQ0FBRSxLQUFBQSxFQUFNLE1BQUFwTyxFQUNqQixDQUNBLFNBQVNrTyxHQUFpQmhELEVBQU03USxFQUFNRCxFQUFJLENBQ3hDLE1BQU1yQixFQUFRd1YsVUFBUXJELENBQUksRUFDMUIsR0FBSTlRLEdBQU0sR0FBS0EsRUFBS3JCLEVBQU0sT0FBUSxDQUNoQyxNQUFNbEksRUFBVWtJLEVBQU0sT0FBT3NCLEVBQU0sQ0FBQyxFQUFFLENBQUMsRUFDdkNtVSxFQUFRLFNBQUMsSUFBTXpWLEVBQU0sT0FBT3FCLEVBQUksRUFBR3ZKLENBQU8sQ0FBQyxFQUUvQyxDQUVBLE1BQU00ZCxHQUE4Q3BNLEVBQUFBLGdCQUFnQixDQUNsRSxLQUFNLGNBQ04sTUFBTyxDQUVMLEtBQU0sYUFDTixNQUFPLG1CQUNSLEVBQ0QsTUFBTyxDQUNMLFdBQVksQ0FDVixLQUFNLE1BQ04sU0FBVSxFQUNYLEVBQ0QsSUFBSyxDQUNILEtBQU0sT0FDTixRQUFTLEtBQ1YsRUFDRCxRQUFTLENBQ1AsS0FBTSxPQUNOLFNBQVUsRUFDWCxDQUNGLEVBQ0QsTUFBTVAsRUFBTyxDQUFFLE1BQUFILEdBQVMsQ0FDdEIsTUFBTXVKLEVBQU93RCxFQUFBQSxVQUFVNU0sRUFBTyxZQUFZLEVBQ3BDcFgsRUFBUzJWLEVBQUFBLE1BQ1RwWSxFQUFPeEIsRUFBUSxTQUFDa25CLEdBQVlqakIsRUFBUXdnQixFQUFNcEosRUFBTSxPQUFPLENBQUMsRUFDOUQsTUFBTyxJQUFNLENBQ1gsR0FBSUgsRUFBTSxRQUNSLE9BQU9pQixJQUFFZCxFQUFNLElBQUssQ0FBRSxJQUFLcFgsQ0FBUSxFQUFFaVgsRUFBTSxRQUFRMVosQ0FBSSxDQUFDLENBQ2hFLENBQ0csQ0FDSCxDQUFDLG1lQ3BFRCxTQUFrQnVTLEVBQWMsVUFBVSxnQkFBYyxDQUN0RCxXQUFZLENBQUUsWUFBQWlVLEVBQWEsRUFDM0IsTUFBTyxDQUFDLG1CQUFtQixFQUUzQixNQUFPLENBQ0wsV0FBWSxDQUNWLEtBQU0sTUFDTixTQUFVLEVBQ1gsRUFDRCxJQUFLLENBQ0gsS0FBTSxPQUNOLFFBQVMsS0FDVixFQUNELFFBQVMsQ0FDUCxLQUFNLE9BQ04sU0FBVSxFQUNYLEVBQ0QsVUFBVyxDQUNULEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FDRixDQUNGLENBQUMsMkJDdkNELFNBQVNFLEdBQVUsQ0FBRSxNQUFBOUcsR0FBUyxDQUM1QixPQUFPQSxDQUNULENBRUE4RyxHQUFVLE1BQVEsQ0FDaEIsTUFBTyxDQUFFLEtBQU0sT0FBUSxTQUFVLEVBQUssQ0FDeEMsRUFFQSxNQUFLclMsR0FBYTlCLEVBQWMsVUFBVSxZQUFhbVUsRUFBTSxxaEJDSDlDQyxFQUFBLENBQ2IsUUFBU3BVLEVBQ1QsT0FBUSxDQUFDeEssQ0FBUyxFQUVsQixZQUFhLEdBQ2IsVUFBVyxHQUdYLGFBQWMsS0FDZCxjQUFlLEdBQ2YsZUFBZ0IsR0FDaEIsY0FBZSxHQUNmLGFBQWMsR0FDZCxtQkFBb0IsS0FDcEIsWUFBYSxHQUNiLFlBQWEsR0FFYixVQUFXd0ssRUFBYyxVQUV6QixJQUFLN0gsR0FFTCxTQUFTdEgsRUFBT29QLEVBQWEsR0FBSSxDQUMvQnBQLEVBQVFGLEVBQU8sUUFBQ0UsQ0FBSyxFQUNyQixNQUFNbkMsRUFBWSxLQUFLLFVBQ3JCLFdBQVcrUCxFQUFBQSxTQUFTNU4sRUFBTSxDQUFDLEVBQUcsRUFBSSxJQUNsQ29QLENBQ0QsRUFDRCxVQUFXblAsS0FBUUQsRUFDakJxSCxHQUFzQnBILEVBQU1wQyxDQUFTLEVBRXZDLE9BQU9BLENBQ1IsQ0FDSCw4UEN4QkEsTUFBS29ULEdBQWF1UyxFQUFrQixTQUNsQyxDQUFDLFNBQVUsUUFBUSxFQUVuQixDQUNFLGFBQWMsSUFBQSxHQUNkLGFBQWMsR0FDZCxjQUFlLEdBQ2YsYUFBYyxPQUVkLFNBQVUsQ0FDUixNQUFPLENBQ0wsT0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQzVCLEVBRUQsYUFBYyxDQUNaLE9BQU8sS0FBSyxLQUFPLGVBQWUsS0FBSyxPQUFTLElBQ2pELEVBRUQsS0FBTS9lLEVBQWtCLE9BQVEsQ0FDOUIsS0FBTSxPQUNOLElBQUlzVCxFQUFNLENBQ1IsT0FBT0EsR0FBUTVXLEVBQUFBLFNBQVMsS0FBSyxJQUFJLENBQ25DLENBQ0YsQ0FBQyxFQUVELFVBQVdzRCxFQUFrQixZQUFhLENBQ3hDLEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FBQyxFQUdELFFBQVMsQ0FDUCxLQUFNLENBQUUsUUFBQU8sRUFBUyxPQUFBQyxFQUFRLFFBQUF3ZSxDQUFRLEVBQUksS0FDckMsTUFBTyxDQUFFLFFBQUF6ZSxFQUFTLE9BQUFDLEVBQVEsUUFBQXdlLENBQVEsQ0FDcEMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxNQUFNLE9BQU8xbEIsRUFBUyxPQUNwQixPQUFPYyxFQUFBLEtBQUssb0JBQUwsWUFBQUEsRUFBd0IsT0FBTyxLQUFNZCxFQUM3QyxFQUVELE1BQU0sU0FBVSxDQUNGLE1BQU0sS0FBSyxVQUFVLFFBQVMsQ0FDeEMsT0FBUSxLQUFLLGdCQUNkLElBR1MsUUFDUnFDLEdBQVksS0FBSyxNQUFNLEdBRXZCLE1BQU0sS0FBSyxPQUFPLENBRXRCLENBQ0YsQ0FDRixDQUNGLDJVQzNEa0JvakIsRUFBa0IsU0FBUyxXQUFTLENBQ3BELFlBQWEsRUFDZixDQUFDLDJCQ0xjRSxHQUFBLENBQ2IsT0FBUSxDQUFDbkcsRUFBWSxFQUVyQixNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsR0FDWCxpQkFBa0IsQ0FBRSxDQUNyQixDQUNGLEVBRUQsUUFBUyxDQUNQLGlCQUFpQmxkLEVBQVFhLEVBQU0sQ0FDN0IsZUFBQXlpQixFQUFpQixFQUNqQixHQUFHN0YsQ0FDSixFQUFHLEdBQUksU0FDRG5lLEVBQUFBLFNBQVNVLENBQU0sSUFDbEJBLEVBQVMsQ0FBRSxLQUFNQSxDQUFRLEdBRTNCLEdBQUksQ0FBRSxLQUFBekQsRUFBTyxPQUFXLFNBQUF0QixFQUFXLElBQU0sRUFBRytFLEVBRTVDLE1BQU11akIsR0FBYy9rQixFQUFBLEtBQUssa0JBQUxxQyxLQUFBckMsRUFBQXFDLEdBQWdDOUYsRUFBQUEsU0FBUyxDQUMzRCxtQkFBb0IsS0FDcEIsZUFBZ0IsRUFDaEIsYUFBYyxLQUNkLFVBQVcsRUFDbkIsQ0FBTyxHQU1ELElBRkFxSyxFQUFBbWUsRUFBVyxxQkFBWCxNQUFBbmUsRUFBQSxLQUFBbWUsRUFBZ0MsS0FBSyxTQUVqQ0EsRUFBVyxlQUFpQixFQUFHLENBUWpDLEtBQU0sQ0FBRSxhQUFBQyxDQUFZLEVBQUtELEVBQ3pCLE1BQUksRUFBRUEsRUFBVyxpQkFBbUIsSUFDbENBLEVBQVcsYUFBZSxNQUVyQkMsRUFHVCxHQUFJRCxFQUFXLFVBQ2JobkIsRUFBTyxhQUNFQSxFQUFNLENBQ2YsR0FBSWMsRUFBQUEsV0FBV2QsQ0FBSSxFQUFHLENBQ3BCLE1BQU1zQyxFQUFTdEMsRUFBSyxLQUFLLE9BQU8sRUFPNUJjLEVBQUFBLFdBQVd3QixDQUFNLEdBQ25CMGtCLEVBQVcsbUJBQXFCaG5CLEVBQ2hDQSxFQUFPc0MsRUFBTyxLQUFLLE9BQU8sR0FFMUJ0QyxFQUFPc0MsRUFHUHFKLEVBQUFBLFVBQVUzTCxDQUFJLElBTWhCZ25CLEVBQVcsVUFBWSxHQUN2QixLQUFLLFlBQVlobkIsRUFBTWtoQixDQUFjLEVBQUUsS0FBS2xoQixHQUFRLENBQ2xEZ25CLEVBQVcsZUFBaUJELEVBQzVCQyxFQUFXLGFBQWVobkIsRUFDMUJnbkIsRUFBVyxVQUFZLEVBQ25DLENBQVcsRUFFRGhuQixFQUFPLFdBRUF0QixJQUNUc0IsRUFBT1IsRUFBa0IsbUJBQ3ZCLEtBQUssU0FDTE4sRUFBaUIsa0JBQUMsR0FBRyxLQUFLLFlBQVlSLEdBQVUsQ0FDakQsR0FFSCxPQUFPc0IsQ0FDUixFQUVELE1BQU0sWUFBWWtuQixFQUFNaEcsRUFBaUIsR0FBSSxDQUMzQyxLQUFLLFdBQVcsR0FBTUEsQ0FBYyxFQUNwQyxJQUFJbGhCLEVBQU8sS0FDWCxHQUFJLENBQ0ZBLEVBQU8sTUFBT2MsRUFBQUEsV0FBV29tQixDQUFJLEVBQUlBLEVBQUksRUFBS0EsRUFDM0MsT0FBUTFrQixFQUFQLENBQ0EsS0FBSyxTQUFTQSxFQUFNLFNBQVdBLENBQUssQ0FDckMsQ0FDRCxZQUFLLFdBQVcsR0FBTzBlLENBQWMsRUFDOUJsaEIsQ0FDUixDQUNGLENBQ0gsRUNoR2VtbkIsR0FBQSxDQUNiLE9BQVEsQ0FBQ0wsRUFBUyxFQUVsQixNQUFPLENBQ0wsTUFBTyxDQUNMLFdBQVksRUFDYixDQUNGLEVBRUQsU0FBVSxDQUNSLGNBQWUsQ0FDYixLQUFNLENBQ0osTUFBTU0sRUFBZXZtQixHQUNuQixLQUFLLE9BQ0QsS0FBSyxVQUFVQSxDQUFLLEVBQ2xCLEtBQUssa0JBQWtCQSxDQUFLLEVBQzVCLEtBQ0ZBLEVBQ0FBLEVBQVFZLEVBQUFBLFFBQVEsS0FBSyxLQUFLLEVBQzVCLEtBQUssTUFBTSxJQUFJMmxCLENBQVksRUFBRSxPQUFPdm1CLEdBQVNBLElBQVUsSUFBSSxFQUMzRHVtQixFQUFhLEtBQUssS0FBSyxFQUMzQixPQUVFLEtBQUssUUFDTCxLQUFLLGFBRUh2bUIsSUFBVSxNQUFRLEtBQUssUUFBVSxNQUdqQ1QsR0FBWSxLQUFLLEtBQUssS0FLeEIsS0FBSyxjQUFnQlMsR0FFaEJBLENBQ1IsRUFFRCxJQUFJQSxFQUFPLENBQ1QsTUFBTXdtQixFQUFVeG1CLEdBQ2QsS0FBSyxPQUNELEtBQUssa0JBQWtCQSxDQUFLLEVBQzVCQSxFQUNOLEtBQUssTUFBUVksRUFBTyxRQUFDWixDQUFLLEVBQ3RCQSxFQUFNLElBQUl3bUIsQ0FBTyxFQUNqQkEsRUFBUXhtQixDQUFLLENBQ2xCLENBQ0YsRUFFRCxnQkFBaUIsQ0FDZixPQUFPLEtBQUssa0JBQWtCLEtBQUssYUFBYSxDQUNqRCxFQUVELFNBQVUsQ0FDUixNQUFNYixFQUFPLEtBQUssaUJBQWlCLEtBQUssT0FBTyxRQUFTLFVBQVcsQ0FDakUsZUFBZ0IsQ0FDakIsQ0FBQSxHQUFLLENBQUUsRUFDUixHQUFJLENBQUN5QixFQUFBQSxRQUFRekIsQ0FBSSxFQUNmLE1BQU0sSUFBSSxNQUFNLDBDQUEwQ0EsR0FBTSxFQUlsRSxZQUFLLFdBQWFBLEVBQUssT0FBUyxFQUN6QixLQUFLLGVBQWVBLENBQUksQ0FDaEMsRUFFRCxlQUFnQixDQUdkLE9BQU8sS0FBSyxPQUNiLEVBRUQsT0FBUTZILEVBQWtCLFNBQVUsQ0FFbEMsS0FBTSxRQUNOLFFBQVMsR0FHVCxTQUFVLEVBQ2hCLENBQUssRUFFRCxRQUFTQSxFQUFrQixVQUFXLENBQ3BDLEtBQU0sT0FDTixRQUFTLElBQ2YsQ0FBSyxFQUdELFlBQWFBLEVBQWtCLGdCQUFpQixDQUM5QyxLQUFNLENBQUMsT0FBUSxRQUFRLEVBQ3ZCLFFBQVMsS0FDVCxJQUFJTSxFQUFPLENBR1QsT0FDRUEsR0FDQSxLQUFLLGFBQWEsT0FBTyxHQUN6QixJQUVILENBQ1AsQ0FBSyxFQUdELFlBQWFOLEVBQWtCLGdCQUFpQixDQUM5QyxLQUFNLENBQUMsT0FBUSxRQUFRLEVBQ3ZCLFFBQVMsS0FDVCxJQUFJaEgsRUFBTyxDQUdULE9BQ0VBLEdBQ0EsS0FBSyxRQUFVLE1BQ2YsS0FBSyxhQUFhLE9BQU8sR0FDekIsSUFFSCxDQUNQLENBQUssRUFHRCxhQUFjZ0gsRUFBa0IsU0FBVSxDQUN4QyxLQUFNLENBQUMsT0FBUSxRQUFRLEVBQ3ZCLFFBQVMsS0FDVCxJQUFJeWYsRUFBUSxDQUNWLEdBQUlBLEVBQVEsQ0FDVixLQUFNLENBQUUsT0FBQUMsRUFBUSxTQUFBQyxHQUFhMW1CLEVBQUFBLFdBQVd3bUIsQ0FBTSxFQUMxQyxDQUFFLE9BQVFBLENBQVEsRUFDbEJBLEVBQ0osT0FBT0UsRUFBV0MsRUFBYSxjQUFDRixFQUFRQyxDQUFRLEVBQUlELEVBRXZELENBQ1AsQ0FBSyxFQUVELGNBQWUsQ0FDYixPQUFPLEtBQUssUUFBVSxRQUFVLElBQ2pDLEVBRUQsZ0JBQWlCLENBQ2YsT0FBTyxLQUFLLFFBQVUsVUFBWSxJQUNuQyxDQUNGLEVBRUQsUUFBUyxDQUNQLGFBQWE5bUIsRUFBSyxDQUNoQixLQUFNLENBQUNpbkIsQ0FBTSxFQUFJLEtBQUssY0FDdEIsT0FBTzNrQixFQUFBQSxTQUFTMmtCLENBQU0sR0FBS2puQixLQUFPaW5CLEVBQVNqbkIsRUFBTSxJQUNsRCxFQUVELGVBQWVVLEVBQVMsQ0FDdEIsR0FBSUEsRUFBUSxPQUFRLENBQ2xCLEdBQUksS0FBSyxPQU1QLFVBQVd1bUIsS0FBVXZtQixFQUNiLE9BQVF1bUIsR0FDWjNuQixHQUFlMm5CLEVBQVEsSUFBSSxFQUlqQyxHQUFJLEtBQUssUUFBUyxDQUNoQixNQUFNQyxFQUFVLENBQUUsRUFDbEJ4bUIsRUFBVUEsRUFBUSxPQUNoQixDQUFDeW1CLEVBQVNGLElBQVcsQ0FDbkIsTUFBTUcsRUFBUUgsRUFBTyxLQUFLLE9BQU8sRUFDakMsSUFBSTFsQixFQUFRMmxCLEVBQVFFLENBQUssRUFDekIsT0FBSzdsQixJQUNIQSxFQUFRMmxCLEVBQVFFLENBQUssRUFBSSxDQUN2QixDQUFDLEtBQUssWUFBWSxFQUFHQSxFQUNyQixDQUFDLEtBQUssY0FBYyxFQUFHLENBQUUsQ0FDMUIsRUFDREQsRUFBUSxLQUFLNWxCLENBQUssR0FFcEJBLEVBQU0sUUFBUSxLQUFLMGxCLENBQU0sRUFDbEJFLENBQ1IsRUFDRCxDQUFFLENBQ0gsR0FHTCxPQUFPem1CLENBQ1IsRUFFRCxVQUFVdW1CLEVBQVEsQ0FDaEIsTUFBTyxDQUFDLENBQUMsS0FBSyxrQkFBa0IsS0FBSyxrQkFBa0JBLENBQU0sQ0FBQyxDQUMvRCxFQUVELGtCQUFrQjdtQixFQUFPLENBQ3ZCLE1BQU1pbkIsRUFBYSxDQUFDM21CLEVBQVNOLEVBQU9rbkIsSUFBWSxDQUc5QyxVQUFXTCxLQUFVdm1CLEVBQ25CLEdBQUk0bUIsRUFBUyxDQUNYLE1BQU03SixFQUFRNEosRUFBV0osRUFBTyxRQUFTN21CLEVBQU8sSUFBSSxFQUNwRCxHQUFJcWQsRUFDRixPQUFPQSxVQUVBcmQsSUFBVSxLQUFLLGtCQUFrQjZtQixDQUFNLEVBQ2hELE9BQU9BLENBR1osRUFFRCxPQUFPLEtBQUssWUFDUkksRUFBVyxLQUFLLGNBQWVqbkIsRUFBTyxLQUFLLE9BQU8sRUFDbERBLENBQ0wsRUFFRCxrQkFBa0I2bUIsRUFBUSxDQUN4QixLQUFNLENBQUUsWUFBQU0sQ0FBVyxFQUFLLEtBQ3hCLE9BQU9ubEIsRUFBQUEsU0FBU21sQixDQUFXLEVBQ3ZCTixHQUFBLFlBQUFBLEVBQVNNLEdBQ1RsbkIsRUFBQUEsV0FBV2tuQixDQUFXLEVBQ3BCQSxFQUFZLEtBQUssS0FBTSxJQUFJaG5CLEVBQVksS0FBTSxDQUFFLE9BQUEwbUIsQ0FBTSxDQUFFLENBQUMsRUFDeERBLENBQ1AsRUFFRCxrQkFBa0JBLEVBQVEsQ0FDeEIsS0FBTSxDQUFFLFlBQUFPLENBQVcsRUFBSyxLQUN4QixPQUFPcGxCLEVBQUFBLFNBQVNvbEIsQ0FBVyxFQUN2QlAsR0FBQSxZQUFBQSxFQUFTTyxHQUNUbm5CLEVBQUFBLFdBQVdtbkIsQ0FBVyxFQUNwQkEsRUFBWSxLQUFLLEtBQU0sSUFBSWpuQixFQUFZLEtBQU0sQ0FBRSxPQUFBMG1CLENBQU0sQ0FBRSxDQUFDLEVBQ3hEbmpCLFdBQVMsR0FBR21qQixHQUFRLENBQzNCLENBQ0YsRUFFRCxhQUFhamtCLEVBQVE1QyxFQUFPbkMsRUFBVThLLEVBQU8sT0FDM0MsR0FBSS9GLEVBQU8sT0FBUSxDQUlqQixNQUFNNUUsR0FBT29ELEVBQUF3QixFQUFPLFVBQVAsWUFBQXhCLEVBQWdCLFNBQ3ZCb0gsRUFBa0J4SyxFQUNwQkssRUFBQUEsa0JBQWtCLEdBQUdSLEtBQVlHLEdBQU0sRUFDdkMsS0FDSjJLLEVBQU0sWUFBWTlLLEVBQVUySyxFQUFpQjVGLENBQU0sRUFDL0M0RixHQUNGRyxFQUFNLGlCQUFpQkgsQ0FBZSxFQUl4QyxNQUFNNmUsRUFBZ0JybkIsR0FBVUEsR0FBUSxDQUFFLEdBQUlBLEVBQU0sRUFBSSxFQUV4REEsRUFBUVksRUFBTyxRQUFDWixDQUFLLEVBQ2pCQSxFQUFNLElBQUlxbkIsQ0FBYSxFQUN2QkEsRUFBY3JuQixDQUFLLEVBRXpCLE9BQU9BLENBQ1IsQ0FDSCxvdUJDbFBrQitsQixFQUFrQixTQUFTLGFBQVcsQ0FDdEQsT0FBUSxDQUFDTyxFQUFZLEVBRXJCLFlBQWEsR0FDYixhQUFjLENBQUUsRUFFaEIsU0FBVSxDQUNSLGdCQUFpQixDQUNmLEtBQU0sQ0FDSixPQUFRLEtBQUssZUFBaUIsQ0FBRSxHQUFFLE9BQU90bUIsR0FBU0EsQ0FBSyxDQUN4RCxFQUVELElBQUk2bUIsRUFBUSxDQUNWLEtBQUssY0FBZ0JBLEdBQVUsQ0FBQyxDQUNsQyxDQUNGLENBQ0YsQ0FDRixDQUFDLHNOQzNCaUJkLEVBQWtCLFNBQVMsT0FBSyxDQUNoRCxPQUFRLENBQUMvTCxDQUFRLEVBQ2pCLFlBQWEsR0FFYixTQUFVLENBQ1IsT0FBUSxDQUNOLE9BQU8sS0FBSyxPQUFPLE9BQVMsQ0FDN0IsRUFFRCxPQUFRLENBQ04sTUFBTyxnQkFBZ0IsS0FBSywrQkFDOUIsQ0FDRCxFQUVELFNBQVUsQ0FDUixNQUFNc04sRUFBUSxJQUFJQyxHQUFVLEtBQUssTUFBTSxLQUFNLENBQzNDLFNBQVUsS0FBSyxPQUFPLFVBQVksYUFDbEMsUUFBUyxLQUFLLE9BQU8sWUFBYyxFQUNuQyxZQUFhLEdBQ2QsRUFFRCxJQUFJQyxFQUFVLEdBQ1ZDLEVBQWMsR0FDZEMsRUFBZSxHQUVuQixNQUFNaGdCLEVBQVcsSUFBTSxDQUNqQixDQUFDLEtBQUssU0FBVzhmLElBQ25CQSxFQUFVLEdBQ1YsS0FBSyxTQUFTLEVBRWxCLEVBRU1qZ0IsRUFBVSxJQUFNLEtBQUssUUFBUSxFQUU3QkMsRUFBUyxJQUFNLENBQ25CLEtBQUssT0FBTyxFQUNaRSxFQUFTLENBQ1gsRUFFQSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssY0FBYyxVQUFVLEVBQUcsQ0FDcEQsTUFBT0gsRUFDUCxLQUFNQyxFQUNQLEVBRUQsTUFBTW1nQixFQUFVQyxHQUFRLENBQ2xCQSxJQUFTTixFQUFNLE9BQ2pCSSxFQUFlLEdBQ2ZKLEVBQU0sV0FBV00sQ0FBSSxFQUV6QixFQUVNQyxFQUFXN25CLEdBQVMsQ0FDcEJBLElBQVUsS0FBSyxRQUNqQnluQixFQUFjLEdBQ2QsS0FBSyxNQUFRem5CLEVBQ2J3bkIsRUFBVSxHQUNWOWYsRUFBUyxFQUViLEVBRUE0ZixFQUFNLFNBQVN0bkIsR0FBUyxDQUNsQjBuQixFQUNGQSxFQUFlLEdBRWZHLEVBQVM3bkIsQ0FBSyxFQUVqQixFQUVELEtBQUssT0FBTyxRQUFTQSxHQUFTLENBQ3hCeW5CLEVBQ0ZBLEVBQWMsR0FFZEUsRUFBUTNuQixHQUFTLEVBQUUsRUFFdEIsRUFFRDJuQixFQUFRLEtBQUssT0FBUyxFQUFFLENBQ3pCLEVBRUQsUUFBUyxDQUNQLGNBQWUsUUFDYnZtQixFQUFBLEtBQUssSUFBSSxjQUFjLFVBQVUsSUFBakMsTUFBQUEsRUFBb0MsT0FDdEMsQ0FDRixDQUNGLENBQUMsdTZDQ3pEaUIya0IsRUFBa0IsU0FBUyxRQUFNLENBQ2pELFdBQVksQ0FBRSxRQUFBdlAsR0FBTyxhQUFFc1IsU0FBYyxFQUVyQyxNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsR0FDWCxrQkFBbUIsSUFDckIsQ0FDRCxFQUVELFNBQVUsQ0FDUixXQUFZLENBQ1YsS0FBTSxDQUNKLE9BQU8sS0FBSyxPQUFTLENBQUMsQ0FDdkIsRUFFRCxJQUFJOW5CLEVBQU8sQ0FDVCxNQUFNNEUsRUFBUyxLQUFLLFlBQ2RoRixFQUNKLENBRUUsS0FBS0ksR0FBQSxZQUFBQSxFQUFPLEdBQUksRUFBSSxPQUFTLE1BQzdCLElBQUssTUFDTixFQUFDNEUsQ0FBTSxHQUNSQSxFQUVFaEYsRUFDRixLQUFLLE1BQVFJLEVBQU1KLENBQUcsRUFFdEIsS0FBSyxNQUFRbW9CLEdBQVUvbkIsQ0FBSyxFQUFFLFNBQVM0RSxDQUFNLEVBRS9DLEtBQUssU0FBUyxDQUNoQixDQUNELEVBRUQsU0FBVSxDQUNSLEtBQU0sQ0FDSixHQUFJLEtBQUssT0FBUyxLQUdoQixLQUFLLGtCQUFvQixhQUNoQixDQUFDLEtBQUssUUFBUyxDQUN4QixNQUFNNlcsRUFBUXNNLEdBQVUsS0FBSyxLQUFLLEVBQzlCdE0sRUFBTSxZQUdSLEtBQUssa0JBQW9CQSxFQUN0QixTQUFTQSxFQUFNLFNBQVEsRUFBSyxFQUFJLE9BQVMsTUFBTSxFQUMvQyxNQUFNLENBQUMsRUFDUCxZQUFZLEdBR25CLE9BQU8sS0FBSyxpQkFDYixFQUVELElBQUl6YixFQUFPLENBQ1QsS0FBSyxrQkFBb0JBLENBQzNCLENBQ0QsRUFJRCxZQUFhZ0gsRUFBa0IsU0FBVSxDQUN2QyxLQUFNLE9BQ04sUUFBUyxLQUNYLENBQUMsRUFHRCxNQUFPQSxFQUFrQixRQUFTLENBQ2hDLEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FBQyxFQUdELE9BQVFBLEVBQWtCLFNBQVUsQ0FDbEMsS0FBTSxRQUNOLFFBQVMsRUFDWCxDQUFDLEVBRUQsUUFBU0EsRUFBa0IsVUFBVyxDQUNwQyxLQUFNLE1BQ04sUUFBUyxDQUNQLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFFQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFdBQ0YsRUFDRCxDQUNGLEVBRUQsTUFBTyxDQUNMLFFBQVFnaEIsRUFBUyxDQUNmLEdBQUksQ0FBQ0EsR0FBVyxLQUFLLGtCQUFtQixDQUN0QyxNQUFNdk0sRUFBUXNNLEdBQVUsSUFBSSxLQUFLLG1CQUFtQixFQUNoRHRNLEdBQUEsTUFBQUEsRUFBTyxZQUNULEtBQUssTUFBUUEsRUFBTSxTQUFTLEtBQUssV0FBVyxFQUU1QyxLQUFLLFNBQVMsR0FHcEIsQ0FDRixDQUNGLENBQUMsK0xDeElELFNBQWtCc0ssRUFBa0IsU0FBUyxZQUFVLENBR3JELGFBQWMsSUFBQSxHQUNkLFlBQWEsR0FDYixtQkFBb0JuakIsR0FBVSxFQUFFLFlBQWFBLEdBRTdDLE1BQU0sY0FBYzZJLEVBQUs3SSxFQUFRLENBQy9CLE1BQU15SSxHQUF1QnpJLENBQU0sQ0FDckMsQ0FDRixDQUFDLHNSQ1hELE1BQUs0USxHQUFhdVMsRUFBa0IsU0FDbEMsQ0FBQyxXQUFZLE9BQVEsUUFBUSxFQUU3QixDQUNFLE9BQVEsQ0FBQ0UsRUFBUyxFQUVsQixhQUFjLElBQUEsR0FDZCxlQUFnQixHQUVoQixTQUFVLENBQ1IsTUFBTyxDQUNMLEtBQU0sQ0FDSixLQUFNLENBQUUsT0FBQXJqQixDQUFPLEVBQUksS0FDbkIsR0FBSUEsRUFBTyxNQUFRQSxFQUFPLFNBQVUsQ0FDbEMsTUFBTTVDLEVBQVEsS0FBSyxpQkFBaUI0QyxFQUFRLFNBQVUsQ0FJcEQsZUFBZ0IsRUFDakIsRUFHRCxLQUFLLEtBQUssS0FBSyxJQUFJLEVBQUk1QyxFQUV6QixPQUFPa0gsRUFBVSxTQUFTLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FDOUMsRUFFRCxJQUFJbEgsRUFBTyxDQUNUa0gsRUFBVSxTQUFTLE1BQU0sSUFBSSxLQUFLLEtBQU1sSCxDQUFLLENBQy9DLENBQ0YsQ0FDRixDQUNGLENBQ0YsMmNDakNBLE1BQUt3VCxHQUFhdVMsRUFBa0IsU0FDbEMsQ0FBQyxPQUFRLFdBQVksTUFBTSxFQUUzQixDQUNFLFdBQVksQ0FBRSxXQUFBcE8sR0FBWSxXQUFBQyxHQUFZLGVBQUFxUSxFQUFnQixFQUl0RCxZQUFhLEdBQ2IsVUFBVyxHQUVYLFNBQVUsQ0FDUixVQUFXLENBQ1QsS0FBTSxDQUNKLEtBQU0sQ0FBRSxNQUFBam9CLENBQU0sRUFBSSxLQUNsQixPQUFPQSxHQUFRLElBQUksS0FBS0EsQ0FBSyxDQUM5QixFQUVELElBQUlBLEVBQU8sQ0FDVCxLQUFLLE1BQVFBLENBQ2YsQ0FDRCxFQUVELFdBQVlnSCxFQUFrQixhQUFjLENBQzFDLEtBQU0sT0FDTixRQUFTLEtBQ1YsQ0FDRixFQUVELFFBQVMsQ0FDUCxhQUFheEUsRUFBTSxDQUNqQixNQUFPLENBQ0wsS0FBTSxjQUNOLEtBQU0sY0FDTixTQUFVLGtCQUNYLEVBQUNBLENBQUksQ0FDUixDQUNELEVBRUQsYUFBYUksRUFBUTVDLEVBQU8sQ0FDMUIsT0FBT2lDLEVBQU0sT0FBQ2pDLENBQUssRUFBSUEsRUFBTSxZQUFZLEVBQUlBLENBQy9DLENBQ0YsQ0FDRiwyQkNqQ2Vrb0IsRUFBQSxDQUNiLE9BQVEsQ0FBQ2pJLEdBQWVsTyxFQUFpQixFQUV6QyxhQUFhblAsRUFBUSxDQUNuQixPQUFPb08sRUFBYXBPLENBQU0sRUFBSSxDQUFBLEVBQUssSUFDcEMsRUFFRCxTQUFVLENBQ1IsTUFBTyxDQUNMLGlCQUFrQixJQUFNLElBQ3pCLENBQ0YsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLGtCQUFtQixLQUNuQixxQkFBc0IsR0FDdEIsa0JBQW1CLEVBQ3BCLENBQ0YsRUFFRCxTQUFVLENBQ1IsaUJBQWtCLENBQ2hCLE9BQU8sSUFDUixFQUVELGdCQUFpQixDQUNmLE9BQU9tTyxFQUFlLEtBQUssSUFBSSxDQUNoQyxFQUVELGNBQWUsQ0FDYixPQUFPQyxFQUFhLEtBQUssSUFBSSxDQUM5QixFQUdELFNBQVUsQ0FDUixNQUFPLENBQUMsQ0FBQyxLQUFLLEtBQ2YsRUFFRCxTQUFVLENBR1IsT0FBTyxLQUFLLFNBQVcsQ0FBQyxLQUFLLFlBQzlCLEVBRUQsVUFBVyxDQUNULE1BQU8sQ0FBQyxDQUFDLEtBQUssYUFDZixFQUVELGdCQUFpQixDQUNmLE9BQU8sS0FBSyxPQUFPLGNBQ3BCLEVBRUQsU0FBVSxDQUNSLEtBQU0sQ0FDSixJQUFJN1IsRUFBTyxLQUFLLE1BQ1osS0FBSyxlQUVQQSxFQUFPQSxHQUFRLEtBQU8sQ0FBQ0EsQ0FBSSxFQUFJLENBQUUsRUFJakNBLEVBQU8sS0FBSyxlQUFlQSxDQUFJLEdBQUtBLEVBRXRDQSxNQUFTLENBQUUsR0FDWCxLQUFNLENBQUUsZUFBQThQLENBQWMsRUFBSyxLQUMzQixPQUFJQSxHQUNFLEtBQUsscUJBS1AsS0FBSyxxQkFBdUIsR0FLNUIsS0FBSyxrQkFBb0I5UCxFQUFLLElBQUlhLElBQVUsQ0FDMUMsQ0FBQ2lQLENBQWMsRUFBR2pQLENBQ2hDLEVBQWMsRUFFRyxLQUFLLG1CQUVQYixDQUNSLEVBRUQsSUFBSUEsRUFBTSxDQUNKLEtBQUssZUFDUCxLQUFLLGtCQUFvQkEsRUFFekIsS0FBSyxNQUFRLEtBQUssZUFDZEEsR0FBUUEsRUFBSyxPQUFTLEVBQ3BCQSxFQUFLLENBQUMsRUFDTixLQUNGQSxDQUVQLENBQ0YsRUFFRCxXQUFZLENBQ1YsS0FBTSxDQUdKLE9BQU8sS0FBSyxTQUFTLENBQUMsR0FBSyxJQUM1QixFQUVELElBQUlBLEVBQU0sQ0FDUixLQUFLLFNBQVdBLEVBQU8sQ0FBQ0EsQ0FBSSxFQUFJLENBQUUsQ0FDbkMsQ0FDRixFQUVELGNBQWUsQ0FFYixPQUFPLEtBQUssTUFDYixFQUVELE1BQU8sQ0FFTCxPQUFPLEtBQUssZUFBZSxhQUFhLEtBQUssT0FBTyxJQUFJLENBQ3pELEVBRUQsY0FBZSxDQUNiLEtBQU0sQ0FBRSxhQUFjNmtCLENBQUssRUFBSyxLQUNoQyxPQUFPQSxFQUFRLENBQUUsTUFBQUEsQ0FBSyxFQUFLLENBQUUsQ0FDOUIsRUFFRCxNQUFPL2MsR0FBaUIsUUFBUyxDQUMvQixJQUFJcEQsRUFBTyxDQUNULE1BQU8sQ0FDTCxHQUFHLEtBQUssYUFDUixHQUFHQSxDQUNKLENBQ0YsRUFFRCxJQUFJQSxFQUFPLE9BSVQsS0FBTSxDQUNKLE1BQUFpZSxHQUFRMWdCLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLEtBQzNCLEtBQUF5VyxFQUFPLEtBQUssT0FBTyxJQUNwQixFQUFHLEtBQUssTUFFVCxPQUFBaFUsRUFBUSxDQUNOLEdBQUcsS0FBSyxNQUNSLEdBQUlpZSxHQUFTLE1BQVEsQ0FBRSxNQUFBQSxHQUN2QixHQUFJakssR0FBUSxNQUFRLENBQUUsS0FBQUEsR0FDdEIsR0FBR2hVLENBQ0osRUFDSU0sRUFBTSxPQUFDTixFQUFPLEtBQUssT0FBTyxLQUFLLElBRWxDLEtBQUssa0JBQW9CLEdBQ3pCLEtBQUssUUFBUSxRQUFRLENBQUUsTUFBQUEsRUFBTyxLQUFNLEtBQUssT0FBTyxLQUFNLEdBRWpEQSxDQUNSLENBQ1AsQ0FBSyxFQUVELE1BQU9vRCxHQUFpQixPQUFPLEVBRS9CLFNBQVUsQ0FDUixPQUFPOEksRUFBZ0IsS0FBSyxPQUFPLE9BQU8sQ0FDM0MsRUFFRCxRQUFTLENBQ1AsT0FBT0EsRUFBZ0IsS0FBSyxPQUFPLE1BQU0sQ0FDMUMsRUFFRCxjQUFlLENBQ2IsSUFBSTJNLEVBQVEsS0FDWixHQUFJLEtBQUssT0FDUCxVQUFXb0YsS0FBUyxPQUFPLE9BQU8sS0FBSyxNQUFNLEVBQUcsQ0FDOUMsR0FBSUEsRUFBTSxhQUNSLE9BQU9BLEVBRUpwRixJQUNIQSxFQUFRb0YsR0FJZCxPQUFPcEYsQ0FDUixFQUVELGNBQWUsQ0FDYixHQUFJLEtBQUssUUFDUCxVQUFXdUgsS0FBVSxPQUFPLE9BQU8sS0FBSyxPQUFPLEVBQUcsQ0FDaEQsS0FBTSxDQUFFLFlBQUFrRSxDQUFXLEVBQUtsRSxFQUN4QixHQUFJa0UsRUFBYSxDQUNmLE1BQU1DLEVBQVlwbUIsRUFBUSxTQUFDbW1CLENBQVcsRUFBSUEsRUFBYyxNQUN4RCxNQUFPLEdBQUdsRSxFQUFPLFFBQVFtRSxLQUkvQixPQUFPLElBQ1IsRUFFRCxZQUFhLENBQ1gsTUFBTyxDQUNMLEdBQUcsS0FBSyxLQUNSLE9BQVEsS0FBSyxNQUNkLENBQ0YsRUFFRCxPQUFRLENBQ04sT0FBTyxPQUFPLE9BQU8zYSxFQUFlLEtBQUssT0FBUSxLQUFLLE9BQU8sQ0FBQyxDQUMvRCxFQUlELE1BQU8sQ0FDTCxPQUFPRixHQUFjLEtBQUssT0FBUSxLQUFLLE9BQU8sQ0FDL0MsRUFFRCxhQUFjLENBQ1osTUFBTyxDQUFDLENBQUMsS0FBSyxJQUNmLEVBRUQsZUFBZ0IsQ0FDZCxPQUFPNkMsR0FBaUIsS0FBSyxPQUFPLE9BQU8sQ0FDNUMsRUFFRCxXQUFZLENBQ1YsT0FBTyxLQUFLLE1BQU0sTUFBTXRDLEVBQVMsQ0FDbEMsRUFFRCxXQUFZLENBQ1YsT0FBT0MsR0FBVSxLQUFLLE1BQU0sQ0FDN0IsRUFFRCxTQUFVL0csRUFBa0IsV0FBWSxDQUN0QyxLQUFNLE1BQ1osQ0FBSyxFQUVELE9BQVFBLEVBQWtCLFNBQVUsQ0FDbEMsS0FBTSxTQUNOLFFBQVMsSUFDZixDQUFLLEVBRUQsVUFBV0EsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxHQUNULElBQUk4YyxFQUFXLENBQ2IsT0FBT0EsR0FBYTVXLEVBQWMsS0FBSyxNQUFNLEVBQ3pDLEtBQUssZUFDSCxDQUFDLEtBQUssTUFDTixHQUNGLEVBQ0wsQ0FDUCxDQUFLLEVBRUQsU0FBVWxHLEVBQWtCLFdBQVksQ0FDdEMsS0FBTSxRQUNOLFFBQVMsR0FDVCxJQUFJK2MsRUFBVSxDQUNaLE9BQU9BLEdBQVksQ0FBQyxLQUFLLFNBQzFCLENBQ1AsQ0FBSyxFQUVELFVBQVcvYyxFQUFrQixZQUFhLENBQ3hDLEtBQU0sUUFDTixRQUFTLEVBQ2YsQ0FBSyxFQUVELFVBQVdBLEVBQWtCLFlBQWEsQ0FDeEMsS0FBTSxRQUNOLFFBQVMsR0FDVCxJQUFJcWhCLEVBQVcsQ0FDYixPQUFPLEtBQUssY0FBZ0IsS0FBSyxTQUFTLE9BQVMsR0FBS0EsQ0FDekQsQ0FDUCxDQUFLLEVBRUQsWUFBYXJoQixFQUFrQixjQUFlLENBQzVDLEtBQU0sUUFDTixRQUFTLEtBQ1QsSUFBSXNoQixFQUFhLENBQ2YsT0FBTyxLQUFLLFdBQWEsQ0FBQyxFQUFFQSxHQUFlLEtBQUssWUFBYyxLQUMvRCxDQUNQLENBQUssRUFFRCxVQUFXdGhCLEVBQWtCLFlBQWEsQ0FDeEMsS0FBTSxRQUNOLFFBQVMsSUFDZixDQUFLLENBQ0YsRUFFRCxNQUFPLENBQ0wsT0FBT3NLLEVBQUlDLEVBQU0sQ0FDZixHQUFJLEtBQUssa0JBQW1CLENBQzFCLEtBQUssa0JBQW9CLEdBQ3pCLE9BRUVBLEVBQUssT0FBU0QsRUFBRyxNQUFRQyxFQUFLLE9BQVNELEVBQUcsT0FHNUMsS0FBSyxNQUFRQSxFQUFHLE1BQ2hCLEtBQUssU0FBUyxFQUFLLEVBRXRCLEVBRUQsa0JBQW1CLENBQ2pCLEtBQU0sR0FDTixRQUFRQSxFQUFJQyxFQUFNLENBQ2hCLEtBQU0sQ0FBRSxlQUFBdEMsQ0FBYyxFQUFLLEtBRXZCQSxHQUFrQnNDLElBQVMsT0FLN0IsS0FBSyxxQkFBdUIsR0FDNUIsS0FBSyxNQUFRRCxFQUFHLElBQUl4UixHQUFVQSxFQUFPbVAsQ0FBYyxDQUFDLEVBRXZELENBQ0YsQ0FDRixFQUVELFFBQVMsQ0FDUCxXQUFZLENBQ1YsS0FBSyxNQUFRLEtBQUssT0FBTyxNQUN6QixLQUFLLFdBQVksQ0FDbEIsRUFHRCxXQUFZLENBQ1YsS0FBSyxNQUFRLEVBQ2IsS0FBSyxNQUFRLElBQ2QsRUFHRCxRQUFROVAsRUFBTSxDQU9WLENBQUNBLEdBQ0QsS0FBSyxjQUFnQnlCLEVBQU8sUUFBQ3pCLENBQUksR0FDakMsS0FBSyxnQkFBa0IrQyxFQUFRLFNBQUMvQyxDQUFJLEVBRXBDLEtBQUssTUFBUUEsRUFDSixLQUFLLGVBQWVBLENBQUksR0FJeEIrQyxFQUFBQSxTQUFTL0MsQ0FBSSxHQUFLLEtBQUssVUFHaEMsS0FBSyxjQUFjLFFBQVFBLENBQUksQ0FFbEMsRUFFRCxlQUFlQSxFQUFNLENBQ25CLEdBQ0UsS0FBSyxjQUNMK0MsRUFBQUEsU0FBUy9DLENBQUksR0FDYjRDLEVBQVEsU0FBQzVDLEVBQUssS0FBSyxHQUNuQnlCLEVBQU8sUUFBQ3pCLEVBQUssT0FBTyxFQUlwQixZQUFLLE1BQVFBLEVBQUssTUFDbEIsS0FBSyxNQUFRQSxFQUFLLFFBQ1gsS0FBSyxLQUVmLEVBRUQsV0FBV3lELEVBQVFKLEVBQU0sQ0FDdkIsTUFBTW5DLEVBQU8sS0FBSyxXQUFXdUMsRUFBUUosQ0FBSSxFQUN6QyxPQUFJLEtBQUssZUFDUCxLQUFLLFdBQWFuQyxFQUVsQixLQUFLLFNBQVMsS0FBS0EsQ0FBSSxFQUVyQixLQUFLLGFBQ1AsS0FBSyxVQUFVLElBQU0sS0FBSyxvQkFBb0IsRUFBRSxDQUFDLEVBRW5ELEtBQUssU0FBVSxFQUNSQSxDQUNSLEVBRUQsV0FBV0EsRUFBTSxDQUNmLEdBQUksS0FBSyxlQUNQLEtBQUssV0FBYSxLQUNsQixLQUFLLFNBQVUsTUFDVixDQUNMLEtBQU0sQ0FBRSxTQUFBa29CLENBQVEsRUFBSyxLQUNmdnBCLEVBQVF1cEIsR0FBWUEsRUFBUyxRQUFRbG9CLENBQUksRUFDM0NyQixHQUFTLElBQ1h1cEIsRUFBUyxPQUFPdnBCLEVBQU8sQ0FBQyxFQUN4QixLQUFLLFNBQVUsR0FHcEIsRUFFRCxXQUFXcUIsRUFBTXJCLEVBQU8sQ0FDdEIsTUFBTXNJLEVBQ0pqSCxHQUNBLEtBQUssYUFBYSxLQUFLLE9BQVFBLEVBQU0sQ0FDbkMsTUFBQXJCLEVBQ0EsU0FBVSxFQUNwQixDQUFTLEVBR0dxSCxFQUFTLElBQ2IsS0FBSyxPQUFPLENBQ1YsS0FBTSxLQUFLLFlBQWMsT0FBUyxVQUNsQyxNQUFPLHVCQUNQLEtBQU0sQ0FDSixHQUFHaUIsU0FBYSxLQUFLLE1BQU0sV0FDM0IsS0FBSyxhQUNOLENBQ1gsQ0FBUyxFQUVILEdBQ0VqSCxHQUNBLE9BQU8sUUFDTCx5QkFBeUIsS0FBSyxNQUFNLFVBQVVpSCxJQUMvQyxFQUVELEdBQUksS0FBSyxZQUNQLEtBQUssV0FBV2pILENBQUksRUFDcEJnRyxFQUFRLE1BQ0gsQ0FDTCxNQUFNOEIsRUFBUyxLQUFLLFVBQVUsS0FBSyxPQUFROUgsQ0FBSSxFQUN6Q0csRUFBV3lDLEdBQWtCa0YsRUFBUSxLQUFLLFFBQVEsRUFDcEQzSCxHQUNGLEtBQUssY0FBYyxDQUFFLE9BQVEsU0FBVSxTQUFBQSxDQUFVLEVBQUU0WixHQUFPLENBQ25EQSxJQUNILEtBQUssV0FBVy9aLENBQUksRUFDcEJnRyxFQUFRLEdBRVYsS0FBSyxXQUFZLENBQy9CLENBQWEsRUFJUixFQUVELG1CQUFtQnJILEVBQU8sQ0FDeEIsS0FBTSxDQUFFLGlCQUFBZ1QsQ0FBZ0IsRUFBSyxLQUN2QixDQUFFLE9BQUEwRixDQUFNLEVBQUsxRixFQUNuQixPQUFPQSxHQUFtQmhULEVBQVEwWSxFQUFVQSxHQUFVQSxDQUFNLENBQzdELEVBRUQsb0JBQW9CMVksRUFBTyxDQUN6QixNQUFNcUksRUFBa0IsS0FBSyxtQkFBbUJySSxDQUFLLEVBQ2pEcUksSUFDRkEsRUFBZ0IsT0FBUyxHQUU1QixFQUVELE1BQU0sb0JBQW9CeEosRUFBVTJxQixFQUFZLENBQzlDLEdBQUksS0FBSyxZQUFhLENBQ3BCLE1BQU14cEIsRUFBUW5CLEVBQVMsV0FBVyxLQUFLLFFBQVEsRUFDM0MsS0FBSyxhQUNISSxnQkFBY0osRUFBUyxNQUFNLEtBQUssU0FBUyxPQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBSyxLQUM5RCxFQUNGLEtBQ0osR0FBSW1CLElBQVUsTUFBUStDLFdBQVMsQ0FBQy9DLENBQUssRUFBRyxDQUN0QyxNQUFNcUksRUFBa0IsS0FBSyxtQkFBbUIsQ0FBQ3JJLENBQUssRUFDdEQsR0FBSXFJLEVBQWlCLENBQ25CLEtBQU0sQ0FBRSxPQUFBb2hCLENBQU0sRUFBS3BoQixFQUNkb2hCLElBQ0hwaEIsRUFBZ0IsT0FBUyxHQUN6QixNQUFNLEtBQUssVUFBVyxHQUV4QixNQUFNakQsRUFBYWlELEVBQWdCLHdCQUF3QnhKLENBQVEsRUFDbkUsR0FBSXVHLEVBQVcsT0FBUyxLQUFNb2tCLEdBQUEsWUFBQUEsRUFBYXBrQixLQUFlLElBQ3hELE1BQU8sR0FFUGlELEVBQWdCLE9BQVNvaEIsSUFLakMsT0FBTyxLQUFLLHlCQUF5QjVxQixFQUFVMnFCLENBQVUsQ0FDMUQsRUFFRCx5QkFBeUIzcUIsRUFBVTJxQixFQUFZLENBQzdDLE9BQU8sSUFBSSxRQUFRLENBQUNqbkIsRUFBU29aLElBQVcsQ0FDdEMsTUFBTStOLEVBQWlCLElBQU0sQ0FHM0IsS0FBTSxDQUFFLGdCQUFBalcsR0FBb0IsS0FBSyxTQUMzQkwsRUFBaUJLLEVBQWdCQSxFQUFnQixPQUFTLENBQUMsRUFDakVsUixHQUFRaW5CLEdBQUEsWUFBQUEsRUFBYSxDQUFDcFcsQ0FBYyxLQUFNLEVBQUksQ0FDL0MsRUFFS2dMLEVBQWdCbmYsRUFBYSxjQUFDSixDQUFRLEVBRzVDLEtBQU91ZixFQUFjLE9BQVMsR0FBRyxDQUMvQixNQUFNcGYsRUFBTyxLQUFLLGVBQWUsYUFDL0IsS0FBSyxJQUFJLGNBQWNLLEVBQWlCLGtCQUFDK2UsQ0FBYSxDQUFDLENBQ3hELEVBRUssQ0FBRSxRQUFBL0ssQ0FBTyxFQUFLLEtBQUssUUFBUSxNQUFNclUsQ0FBSSxFQUN2Q3FVLEVBQVEsU0FDTixLQUFLLE9BQU8sT0FBU3JVLEVBRXZCMHFCLEVBQWdCLEVBR2hCLEtBQUssUUFDRixLQUFLLENBQUUsS0FBQTFxQixFQUFNLEVBQ2IsTUFBTTJjLENBQU0sRUFHWixLQUFLLElBQU0sQ0FDVixLQUFLLFVBQVUrTixDQUFjLENBQy9DLENBQWlCLEdBSVB0TCxFQUFjLElBQUssRUFFckI3YixFQUFRLEVBQUssQ0FDckIsQ0FBTyxDQUNGLENBQ0YsRUFFRCxNQUFNLGNBQ0prSyxFQUNBN0ksRUFDQWEsRUFDQWlJLEVBQ0FDLEVBQ0F4TixFQUFTLEdBQ1R1SyxFQUFVLEdBQ1ZtRCxFQUFVLEtBQ1YsQ0FDQVEsR0FBbUJaLEVBQUs3SSxFQUFRYSxDQUFJLEVBQ3BDLE1BQU1rbEIsRUFBVTVhLEdBQVVuTCxDQUFNLEVBQ2hDLEdBQUkrbEIsR0FBVy9sQixFQUFPLFNBQ3BCLE1BQU0sSUFBSSxNQUNSLG1FQUNELEVBS0gsTUFBTWdtQixFQUFRLEtBQUtqZCxFQUFRLElBQ3JCa2QsRUFBTyxDQUNYLElBQUFwZCxFQUNBLE9BQUE3SSxDQUNELEVBQ0trbUIsRUFBVyxDQUNmLEdBQUdELEVBR0gsUUFBQW5nQixFQUNBLE9BQUF2SyxFQUNBLE1BQUF5cUIsQ0FDRCxFQUNLRyxFQUFjLE1BQU10YyxHQUFhaEIsRUFBSzdJLEVBQVErSSxDQUFLLEVBS3pELEdBSklFLEdBQ0YsTUFBTUEsRUFBUWtkLEVBQWFwZCxFQUFRLENBQUMsRUFHbEN1QixFQUFjdEssQ0FBTSxHQUFLLENBQUMrbEIsRUFBUyxDQUNyQyxNQUFNSyxFQUFtQixDQUFDaHJCLEVBQU00cUIsSUFDOUJBLEVBQ0k1cUIsRUFDRSxHQUFHQSxNQUFTNHFCLElBQ1osSUFBSUEsSUFDTjVxQixFQUlBaXJCLEVBQWF0ZCxJQUFVLEVBQUksR0FBSy9JLEVBQU8sS0FDdkNzbUIsRUFBWSxDQUdoQixLQUFNRixFQUFpQkMsRUFBWWpZLEVBQWFwTyxDQUFNLEdBQUtnbUIsQ0FBSyxFQUNoRSxVQUFXbFgsRUFBYyxVQUN2QnZULEVBQVMsaUJBQW1CLFVBQzdCLEVBQ0QsS0FBTTJxQixDQUNQLEVBQ0cvWCxFQUFlbk8sQ0FBTSxHQUd2QjhJLEVBQU8sS0FBSyxDQUNWLEdBQUd3ZCxFQUNILEtBQU1GLEVBQWlCQyxFQUFZTCxDQUFLLENBQ2xELENBQVMsRUFFQ0ssR0FFRnZkLEVBQU8sS0FBSyxDQUNWLEtBQU11ZCxFQUNOLFNBQVUsSUFDVixLQUFBSixDQUNWLENBQVMsRUFJSCxLQUFNLENBQUNNLEVBQVlDLENBQVMsRUFBSUwsRUFBWSxPQUMxQyxDQUFDcm5CLEVBQUs0WixLQUNKNVosRUFBSTRaLEVBQU0sS0FBSyxRQUFVLEVBQUksQ0FBQyxFQUFFLEtBQUtBLENBQUssRUFDbkM1WixHQUVULENBQUMsQ0FBQSxFQUFJLENBQUEsQ0FBRSxDQUNSLEVBTUQsR0FMSTBuQixFQUFVLFNBQ1pGLEVBQVUsU0FBV0UsR0FFdkIxZCxFQUFPLEtBQUt3ZCxDQUFTLEVBRWpCQyxFQUFXLE9BQ2IsVUFBV0UsS0FBY0YsRUFDdkJ6ZCxFQUFPLEtBQUssQ0FDVixHQUFJMmQsRUFBVyxTQUFXQSxFQUFhSCxFQUN2QyxLQUFNLEdBQUdBLEVBQVUsUUFBUUcsRUFBVyxPQUN0QyxLQUFNLENBQ0osR0FBR0EsRUFBVyxLQUNkLFFBQUEzZ0IsQ0FDRCxDQUNiLENBQVcsRUFJUixFQUVELGFBQWE5RixFQUFRNUMsRUFBT25DLEVBQVU4SyxFQUFPLENBQzNDLE9BQUFBLEVBQU0sVUFBVTlLLEVBQVUrRSxDQUFNLEVBQ3pCNUMsQ0FDUixDQUNILEVDaHBCYXNwQixHQUFtQixDQUM5QixLQUFPNUMsRUFBUSxDQUNiLE1BQU1wbUIsRUFBVSxDQUNkLENBQ0UsTUFBTyxXQUNQLE1BQU8sVUFDUixFQUNELENBQ0UsTUFBTyxTQUNQLE1BQU8sUUFDUixFQUNELENBQ0UsTUFBTyxjQUNQLE1BQU8sYUFDUixFQUNELENBQ0UsTUFBTyxZQUNQLE1BQU8sV0FDUixDQUNGLEVBQ0QsTUFBTyxDQUNMLFNBQVVvbUIsRUFBTyxVQUNiLENBQ0UsS0FBTSxTQUNOLFFBQVM5bEIsRUFBQUEsUUFBUThsQixFQUFPLFNBQVMsRUFDN0JwbUIsRUFBUSxPQUNOdW1CLEdBQVVILEVBQU8sVUFBVSxTQUFTRyxFQUFPLEtBQUssQ0FDakQsRUFDRHZtQixFQUNKLE1BQU8sS0FDUixFQUNELEtBQ0osS0FBTSxDQUNKLEtBQU0sT0FDTixNQUFPb21CLEVBQU8sVUFBWSxNQUFRLE1BQ25DLENBQ0YsQ0FDRixFQUVELGNBQWUsQ0FFYixNQUFNNkMsRUFBYSxDQUNqQixJQUFLLFVBQ0wsTUFBTyxVQUNQLEtBQU0sU0FDUCxFQUNELE1BQU8sQ0FDTCxLQUFNLENBQ0osS0FBTSxXQUNOLE1BQU8sTUFDUCxXQUFBQSxDQUNELEVBQ0QsR0FBSSxDQUNGLEtBQU0sV0FDTixNQUFPLE1BQ1AsV0FBQUEsQ0FDRCxDQUNGLENBQ0YsQ0FDSCxFQUVPLFNBQVNDLEdBQWdCQyxFQUFTNXJCLEVBQVU2ckIsRUFBTyxDQUN4RCxNQUFNeGQsRUFBUSxDQUNaLEtBQU0sUUFDTixNQUFPLFVBQ1AsS0FBTSxXQUNOLE9BQVFyTyxFQUVSLFNBQVUsR0FJVixNQUFPLENBQ0wsT0FBTzhyQixHQUNMemQsRUFDQXdkLEVBQU0sS0FDUCxDQUNGLEVBQ0QsV0FBWUUsR0FBcUJILENBQU8sRUFDeEMsUUFBUyxDQUNQLE1BQU8sQ0FDTCxLQUFNLFFBQ04sT0FBUSxDQUNOLE1BQU0sQ0FBRSxnQkFBQXBpQixHQUFtQixDQUN6QkEsRUFBZ0IsVUFBVyxFQUMzQkEsRUFBZ0IsYUFBYyxDQUMvQixDQUNGLENBQ0YsRUFFRCxPQUFRLENBQ04sS0FBTSxTQUNOLEtBQU0sU0FDTixPQUFRLENBQ04sTUFBTSxDQUFFLGdCQUFBQSxHQUFtQixDQUN6QkEsRUFBZ0IsYUFBYyxDQUMvQixDQUNGLENBQ0YsQ0FDRixFQUNELFFBQVMsQ0FDUCxjQUFlLENBQ2JxaUIsRUFBTSxNQUFRLENBQ1osR0FBR0EsRUFBTSxNQUNULE9BQVFHLEdBQWtCLEtBQUssT0FBUSxLQUFLLElBQUksRUFFaEQsS0FBTSxNQUNQLENBQ0YsQ0FDRixDQUNGLEVBQ0QsT0FBTzNkLENBQ1QsQ0FFQSxTQUFTMGQsR0FBcUJILEVBQVMsT0FDckMsTUFBTUssRUFBUSxDQUFFLEVBQ2hCLFVBQVdwRCxLQUFVLE9BQU8sT0FBTytDLEdBQVcsQ0FBRSxDQUFBLEVBQUcsQ0FLakQsS0FBTSxDQUFFLE9BQVFqbkIsRUFBTSxHQUFHa0ssQ0FBTSxFQUFHZ2EsRUFDNUJ0aUIsRUFBYTVCLEdBQ2ZwQixFQUFBa29CLEdBQWlCOW1CLEtBQWpCLFlBQUFwQixFQUFBLEtBQUFrb0IsR0FBeUI1QyxHQUN6QkEsRUFBTyxXQUNYLEdBQUl0aUIsRUFBWSxDQUNkc0ksRUFBSyxLQUFPLE9BQ1pBLEVBQUssV0FBYSxDQUFFLEVBRXBCLFNBQVcsQ0FBQzlNLEVBQUtRLENBQVMsSUFBSyxPQUFPLFFBQVFnRSxDQUFVLEVBQ3RELEdBQUloRSxFQUFXLENBQ2IsTUFBTWtILEVBQVFsSCxFQUFVLE9BQVNzRCxFQUFRLFNBQUN0RCxFQUFVLE1BQVFSLENBQUcsRUFDL0Q4TSxFQUFLLFdBQVc5TSxDQUFHLEVBQUksQ0FDckIsR0FBR1EsRUFDSCxNQUFPLEdBQ1AsWUFBYWtILENBQ2QsRUFHTHdpQixFQUFNcEQsRUFBTyxJQUFJLEVBQUksQ0FDbkIsTUFBT2hhLEVBQUssTUFDWixLQUFNLFNBQ04sUUFBUyxLQUFPLENBQUEsR0FDaEIsS0FBQUEsRUFDQSxRQUFTLEVBQ1YsTUFFRCxPQUFNLElBQUksTUFDUixtQkFBbUJnYSxFQUFPLCtCQUErQmxrQixLQUMxRCxFQUdMLE9BQU9zbkIsQ0FDVCxDQUVBLFNBQVNDLEdBQXVCbm5CLEVBQVFhLEVBQU0sT0FDNUMsTUFBTXJELEVBQVl3QyxFQUFPLFdBQVdhLENBQUksRUFDeEMsT0FBT3JDLEVBQUFoQixHQUFBLFlBQUFBLEVBQVcsT0FBWCxZQUFBZ0IsRUFBaUIsVUFDMUIsQ0FFQSxTQUFTeW9CLEdBQWtCam5CLEVBQVF6RCxFQUFNLENBQ3ZDLE1BQU1zcUIsRUFBVSxDQUFFLEVBQ2xCLFVBQVdobUIsS0FBUXRFLEVBQU0sQ0FDdkIsTUFBTWdDLEVBQVFoQyxFQUFLc0UsQ0FBSSxFQUN2QixHQUFJdEMsRUFBTyxDQUVULE1BQU1ELEVBQU8sT0FBTyxLQUFLNm9CLEdBQXVCbm5CLEVBQVFhLENBQUksQ0FBQyxFQUFFLElBQzdEN0QsR0FBT3VCLEVBQU12QixDQUFHLEdBQUssSUFDdEIsRUFFR3NCLEVBQUssS0FBS2xCLEdBQVNBLElBQVUsSUFBSSxHQUNuQ3lwQixFQUFRLEtBQUssR0FBR2htQixLQUFRdkMsRUFBSyxJQUFJLEtBQUssU0FBUyxFQUFFLEtBQUssR0FBRyxHQUFHLEdBSWxFLE9BQU91b0IsRUFBUSxPQUFTQSxFQUFVLE1BQ3BDLENBRUEsU0FBU0UsR0FBaUIvbUIsRUFBUWlCLEVBQU8sQ0FDdkMsTUFBTTRsQixFQUFVLENBQUUsRUFHbEIsR0FBSTVsQixFQUNGLFVBQVc2aUIsS0FBVXJrQixFQUFBQSxRQUFRd0IsRUFBTSxNQUFNLEVBQUcsQ0FDMUMsS0FBTSxDQUFBLENBQUdKLEVBQU0rYixDQUFJLEVBQUlrSCxFQUFPLE1BQU0sY0FBYyxFQUNsRCxHQUFJLENBQ0YrQyxFQUFRaG1CLENBQUksRUFBSXBCLEVBQUFBLFFBQVEsS0FBSyxNQUFNLElBQUltZCxJQUFPLENBQUMsQ0FDdkQsTUFBUSxDQUFnQixFQUd0QixNQUFNd0ssRUFBYyxDQUFFLEVBQ3RCLFVBQVd2bUIsS0FBUWIsRUFBTyxXQUFZLENBQ3BDLE1BQU16RCxFQUFPLENBQUUsRUFHVCtCLEVBQU91b0IsRUFBUWhtQixDQUFJLEVBQ3pCLEdBQUl2QyxFQUFNLENBQ1IsTUFBTWtELEVBQWEybEIsR0FBdUJubkIsRUFBUWEsQ0FBSSxFQUN0RCxHQUFJVyxFQUFZLENBQ2QsSUFBSXBGLEVBQVEsRUFDWixVQUFXWSxLQUFPd0UsRUFDaEJqRixFQUFLUyxDQUFHLEVBQUlzQixFQUFLbEMsR0FBTyxHQUk5QmdyQixFQUFZdm1CLENBQUksRUFBSXRFLEVBRXRCLE9BQU82cUIsQ0FDVCxvSkM3TXNCLE1BQUEsbVhBQUFyTSxZQUFBLEVBQUFDLEVBQUEsbUJBQUEsTUFBQSxxa0JBQUFnRixFQUFBQSxtQkFBQSxRQUFBLDZOQUFBN0UsRUFBQSx1QkFBZkUsRUFBZSxZQUFBZ00sRUFBQSxPQUFBLE1BQUFsTSxFQUFBLE1BQUEsUUFBQUEsRUFBQSxRQUFBLGVBQUFBLEVBQUEsMEZBQUFzRixFQUFBQSxZQUFBRSxFQUFBLENBQUEsSUFBQSxRQUFBLFdBQUF4RixFQUFBLFlBQUFBLGVBQUFBLEVBQUEsU0FBQUEsRUFBQSxlQUFBLEVBQUEsUUFBQUEsRUFBQSxtQkFBQSxFQUFBLEVBQUEsVUFBQUEsRUFBQSxVQUFBLHNCQUFBeUUsRUFBQSxDQUFBLElBQUFBLEVBQUEsQ0FBQSxFQUFBeGlCLEdBQUErZCxFQUFBLFNBQUEvZCx1QkFBQSxJQUFBLEVBQUEyZCxFQUFBQSxVQUFBLEVBQUEsRUFBQUMsRUFBQSxtQkFBQUMsV0FBQSxLQUFBQyxFQUFBLFdBQUFDLEVBQUEsU0FBQSxDQUFBMWQsRUFBQXJCLG1CQUFBNGUsRUFBQSxtQkFBQSxLQUFBLENBQUEsR0FBQUcsRUFBQSxZQUFBL2UsQ0FBQSxFQUFBLElBQUErZSxFQUFBLFdBQUFBLEVBQUEsT0FBQTFkLENBQUEsSUFBQTBkLEVBQUEseUJBQUFILEVBQUEsbUJBQUFDLEVBQUEsU0FBQSxDQUFBLElBQUEsQ0FBQSxFQUFBQyxFQUFBQSxXQUFBQyxFQUFBLFFBQUFrRyx3REFBQWxHLEVBQUEsYUFBQWtHLENBQUEsaUJBQUFoRyxFQUFBLFlBQUFxRixFQUFBLENBQUEsSUFBQVcsRUFBQSxLQUFBLE1BQUF0QixFQUFBQSxlQUFBNUUsRUFBQSxhQUFBa0csQ0FBQSxDQUFBLEVBQUEsS0FBQUEsRUFBQSxPQUFBbEcsRUFBQSxPQUFBLFNBQUFBLEVBQUEsWUFBQS9lLENBQUEsRUFBQSxLQUFBcUIsRUFBQSxLQUFBMGQsRUFBQSxXQUFBLE1BQUFBLEVBQUEsTUFBQSxPQUFBLEdBQUEsU0FBQUEsRUFBQSxVQUFBQSxFQUFBLGtKQUFBSCxFQUFBQSxtQkFBQSxLQUFBbUYsR0FBQSxDQUFBaEYsRUFBQSx5QkFBQUUsRUFBQSxZQUFBaU0sRUFBQSxPQUFBLE1BQUFuTSxFQUFBLGFBQUFBLFNBQUExZCxHQUFBLE1BQUFyQixFQUFBLFNBQUEsR0FBQSxFQUFBLE9BQUErZSxFQUFBLGtCQUFBQSxTQUFBMWQsRUFBQTBkLEVBQUEsT0FBQSxFQUFBLFNBQUFBLEVBQUEsWUFBQS9lLENBQUEsRUFBQSxLQUFBcUIsRUFBQSxLQUFBMGQsRUFBQSxXQUFBLE1BQUFBLEVBQUEsY0FBQS9lLENBQUEsRUFBQSxTQUFBK2UsRUFBQSxVQUFBQSxFQUFBLFVBQUEsVUFBQUEsRUFBQSxVQUFBLFlBQUFBLEVBQUEsWUFBQSxVQUFBQSxFQUFBLFVBQUEsVUFBQUEsRUFBQSxVQUFBLFNBQUFBLEVBQUEsU0FBQSxTQUFBQSxFQUFBLFlBQUExZCxFQUFBckIsQ0FBQSxFQUFBLFNBQUEwakIsR0FBQTNFLEVBQUEsV0FBQTFkLEVBQUFyQixDQUFBLDhKQUFBK2UsRUFBQSxPQUFBLHlCQUFBRSxFQUFBQSxZQUFBa00sRUFBQUEsd0JBQUFwTSxFQUFBLE9BQUEsU0FBQSxFQUFBLE9BQUEsU0FBQUEsRUFBQSxZQUFBL2UsQ0FBQSxFQUFBLEtBQUFxQixFQUFBLE9BQUEsaUNBQUEwZCxFQUFBLHNCQUFBSCxFQUFBLG1CQUFBLE9BQUEsT0FBQSxVQUFBRyxFQUFBLE9BQUFBLGFBQUExZCxFQUFBckIsQ0FBQSxDQUFBLDhCQUFBNGUsRUFBQSxtQkFBQSxPQUFBLE9BQUEsVUFBQUcsRUFBQSxhQUFBQSxTQUFBMWQsR0FBQSxNQUFBckIsRUFBQSxrQkFBQStlLEVBQUEsb0JBQUFKLEVBQUFBLFlBQUFDLEVBQUFBLG1CQUFBLEtBQUF1RixHQUFBLENBQUFFLEVBQUFBLFlBQUErRyxFQUFBLENBQUEsVUFBQXJNLEVBQUEsVUFBQSxVQUFBQSxFQUFBLFVBQUEsU0FBQUEsRUFBQSxTQUFBLFNBQUFBLEVBQUEsWUFBQTFkLEVBQUFyQixDQUFBLEVBQUEsT0FBQStlLEVBQUEsa0JBQUFBLFNBQUExZCxFQUFBMGQsRUFBQSxPQUFBLEVBQUEsU0FBQUEsRUFBQSxZQUFBL2UsQ0FBQSxFQUFBLEtBQUFxQixFQUFBLEtBQUEwZCxFQUFBLFdBQUEsTUFBQUEsRUFBQSxjQUFBL2UsQ0FBQSxFQUFBLFNBQUEwakIsR0FBQTNFLEVBQUEsV0FBQTFkLEVBQUFyQixDQUFBLDZNQUFBK2UsRUFBQSxpQkFBQUEsRUFBQSxzQkFBQUgsRUFBQUEsbUJBQUEsUUFBQXlNLEdBQUEsQ0FBQXpILEVBQUEsbUJBQUEsS0FBQSxLQUFBLENBQUFBLEVBQUFBLG1CQUFBLEtBQUEsQ0FBQSxNQUFBLHlCQUFBLFFBQUE3RSxFQUFBLGFBQUFzRixFQUFBQSxZQUFBK0csRUFBQSxDQUFBLFVBQUFyTSxFQUFBLFVBQUEsV0FBQUEsRUFBQSxLQUFBLFFBQUFBLEVBQUEsY0FBQSxPQUFBQSxFQUFBLE9BQUEsU0FBQUEsRUFBQSxTQUFBLEtBQUFBLEVBQUEsU0FBQSxLQUFBQSxFQUFBLEtBQUEsTUFBQUEsRUFBQSwwSUFBQUEsRUFBQSxnQkFBQUEsRUFBQSxzQkFBQUUsRUFBQSxZQUFBbU0sRUFBQSxPQUFBLE1BQUEsdUNBQUEsVUFBQXJNLEVBQUEsVUFBQSxXQUFBQSxFQUFBLEtBQUEsUUFBQUEsRUFBQSxjQUFBLE9BQUFBLEVBQUEsT0FBQSxTQUFBQSxFQUFBLFNBQUEsS0FBQUEsRUFBQSxTQUFBLEtBQUFBLEVBQUEsS0FBQSxNQUFBQSxFQUFBLCtLQW1LSmdJLEVBQWtCLFNBQVMsT0FBSyxDQUNoRCxPQUFRLENBQUNtQyxFQUFhbEcsRUFBYSxFQUNuQyxZQUFhLEdBRWIsY0FBY3hmLEVBQU0sQ0FFbEIsT0FBT0EsQ0FDUixFQUVELGVBQWVJLEVBQVEvRSxFQUFVd0osRUFBaUIsQ0FDaEQsS0FBTSxDQUFFLFFBQUFvaUIsR0FBWTdtQixFQUdwQixHQUFJNm1CLEVBQVMsQ0FJWCxNQUFNYSxFQUFtQixJQUN2QmpqQixFQUFnQix1QkFDZHhKLEVBQ0F1QyxHQUFhQSxFQUFVLE9BQVMsTUFDbEMsRUFFRixPQUFPb3BCLEdBQ0x6WixFQUFnQjBaLENBQU8sRUFDdkI1ckIsRUFDQSxDQUVFLElBQUksT0FBUSxPQUNWLE9BQU91RCxFQUFBa3BCLEVBQWtCLElBQWxCLFlBQUFscEIsRUFBb0IsS0FDNUIsRUFDRCxJQUFJLE1BQU15QyxFQUFPLENBQ2YsTUFBTXpELEVBQVlrcUIsRUFBaUIsRUFDbkMsR0FBSWxxQixFQUFXLENBRWIsTUFBTXNtQixFQUFTakMsR0FBT3ZoQixFQUFNLE9BQUN1aEIsRUFBS3prQixHQUFTQSxJQUFVLE1BQVMsRUFDekRtRSxFQUFBQSxPQUFPdWlCLEVBQU83aUIsQ0FBSyxFQUFHNmlCLEVBQU90bUIsRUFBVSxLQUFLLENBQUMsSUFDaERBLEVBQVUsTUFBUXlELEVBQ2xCekQsRUFBVSxTQUFTLEVBQUssR0FHOUIsQ0FDRixDQUNGLEVBRUgsRUFFRCxTQUFVLENBQ1IsZUFBZ0IsQ0FDZCxPQUFPLEtBQUssVUFBWSxLQUFLLE1BQVEsS0FBSyxRQUMzQyxFQUVELGdCQUFpQixDQUNmLE1BQU8sQ0FBQyxFQUFFLEtBQUssZUFBaUIsS0FBSyxVQUN0QyxFQUVELGdCQUFpQixDQUNmLEtBQU0sQ0FBRSxTQUFBbW9CLENBQU8sRUFBTSxLQUNyQixPQUNFQSxFQUFTLE9BQVMsSUFDaEIsS0FBSyxVQUNMLEtBQUssV0FDTCxLQUFLLFVBR1YsRUFFRCxvQkFBcUIsQ0FDbkIsTUFBTyxDQUFDLEtBQUssV0FBYSxLQUFLLGNBQ2hDLEVBRUQsY0FBZSxDQUNiLE1BQU8sRUFBRSxLQUFLLFNBQVMsT0FBUyxFQUNqQyxFQUVELFlBQWEsQ0FDWCxPQUNHLEtBQUssUUFBVSxPQUFPLEtBQUssS0FBSyxPQUFPLEVBQUUsT0FBUyxJQUNsRCxLQUFLLG1CQUFxQixFQUFJLEVBRW5DLENBQ0QsRUFFRCxRQUFTLENBQ1AsWUFBWXZwQixFQUFPLENBQ2pCLE9BQU9wQixFQUFlLEtBQUssU0FBVW9CLENBQUssQ0FDM0MsRUFFRCxZQUFZcUIsRUFBTXJCLEVBQU8sQ0FDdkIsR0FBSSxLQUFLLFNBQVUsQ0FDakIsTUFBTWhCLEVBQU93UCxHQUFnQixLQUFLLE9BQVEsS0FBSyxPQUFPLEdBQUssS0FBSyxLQUMxRGxPLEVBQUssS0FBSyxVQUFVLEtBQUssT0FBUWUsRUFBTXJCLENBQUssRUFDbEQsTUFBTyxHQUFHaEIsS0FBUXNCLElBRXBCLE9BQU8sSUFDUixFQUVELGFBQWEya0IsRUFBUSxDQUNuQixNQUFPLGFBQWE1ZSxFQUFBQSxVQUFVNGUsRUFBTyxJQUFJLEdBQzFDLEVBRUQsV0FBVzVqQixFQUFNckIsRUFBTyxDQUN0QixPQUFPLElBQUltQixFQUFZLEtBQU0sQ0FDM0IsS0FBTUUsRUFDTixNQUFPQSxFQUNQLE1BQUFyQixFQUNBLFNBQVUsS0FBSyxZQUFZQSxDQUFLLEVBQ2pDLENBQ0YsRUFFRCxlQUFlOEgsRUFBUSxDQUNyQixNQUFNeWpCLEVBQWtCM3NCLEVBQWUsS0FBSyxTQUFVLFVBQVUsRUFDMURzTyxFQUFRLEtBQUssZ0JBQWdCLG1CQUFtQnFlLENBQWUsRUFDckUsR0FBSXJlLEVBQ0YsT0FBQUEsRUFBTSxxQkFBcUJwRixFQUFRLEVBQUksRUFDaEMsRUFFWCxDQUNELEVBRUQsTUFBTSxjQUNKMkUsRUFDQTdJLEVBQ0FhLEVBQ0FpSSxFQUNBQyxFQUNBeE4sRUFBUyxHQUNUdUssRUFBVSxHQUNWbUQsRUFBVSxLQUNWLENBQ0EsTUFBTSxRQUFRLElBQUksQ0FDaEJSLEdBQXVCekksQ0FBTSxFQUM3QjJJLEdBQXdCM0ksRUFBTyxPQUFPLEVBQ3RDc2xCLEVBQVksY0FDVnpjLEVBQ0E3SSxFQUNBYSxFQUNBaUksRUFDQUMsRUFDQXhOLEVBQ0F1SyxFQUNBbUQsQ0FDRixFQUNELENBQ0gsQ0FDRixDQUFDLDhPQzlTaUJrYSxFQUFrQixTQUFTLFFBQU0sQ0FDakQsYUFBYyxHQUNkLGNBQWUsR0FDZixZQUFhLEVBQ2YsQ0FBQyxtekNDK0RpQkEsRUFBa0IsU0FBUyxTQUFPLENBQ2xELE9BQVEsQ0FBQy9MLENBQVEsRUFDakIsV0FBWSxlQUNWd1EsRUFBYSxjQUNiLEtBQUFDLEVBQ0QsRUFFRCxZQUFhLEdBRWIsTUFBTyxDQUNMLE1BQU8sQ0FDTCxPQUFRLEtBQ1IsT0FBUSxJQUNWLENBQ0QsRUFFRCxTQUFVLENBQ1IsT0FBUSxDQUNOLE9BQU8sS0FBSyxPQUFPLE9BQVMsRUFDN0IsRUFFRCxRQUFTLENBQ1AsTUFBTyxDQUNMLE9BQVEsS0FBSyxRQUFVLFFBQVEsS0FBSywrQkFDdEMsQ0FDRCxFQUVELGFBQWMsQ0FDWixPQUFPLEtBQUssV0FBVyxRQUFTLENBQzlCLEtBQU0sR0FDTixPQUFRLEdBQ1IsVUFBVyxHQUNYLE9BQVEsR0FDUixNQUFPLEdBQ1AsS0FBTSxHQUNOLEtBQU0sQ0FDSixRQUFTQyxHQUFVLEtBQUssWUFBWUEsQ0FBTSxDQUM1QyxFQUNELENBQ0YsRUFFRCxrQkFBbUIsQ0FDakIsT0FBTyxLQUFLLFdBQVcsUUFBUyxDQUM5QixVQUFXLENBR1QsYUFBYyxJQUNaLEtBQUssaUJBQWlCLEtBQUsvbUIsR0FBVUEsRUFBTyxRQUFRLENBQ3ZELEVBQ0QsUUFBUyxDQUNQLFVBQVcsUUFDWCxPQUFRLENBQUMsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUMsQ0FDM0IsRUFDRCxDQUNGLEVBRUQsa0JBQW1CLENBQ2pCLE9BQU8sS0FBSyxXQUFXLFFBQVMsQ0FDOUIsV0FBWSxHQUNaLFlBQWEsR0FDYixXQUFZLEdBQ1osVUFBVyxHQUNaLENBQ0YsRUFFRCxhQUFjLENBQ1osT0FBTyxLQUFLLFdBQVcsUUFBUyxDQUM5QixLQUFNLEdBQ04sS0FBTSxHQUNQLENBQ0YsRUFFRCxnQkFBaUIsQ0FDZixLQUFNLENBQ0osWUFBQWduQixFQUNBLGlCQUFBQyxFQUNBLGlCQUFBQyxFQUNBLFlBQUFDLEdBQ0UsS0FDSixNQUFPLENBQ0xILEVBQ0FDLEVBQ0FDLEVBQ0FDLENBQ0QsRUFBQyxPQUFPem1CLEdBQVdBLEVBQVEsT0FBUyxDQUFDLENBQ3ZDLEVBRUQsY0FBZSxDQUNiLE1BQU8sQ0FDTCxtQkFBb0IsQ0FDbEIsU0FBWSxHQUNaLFNBQVksR0FDWixlQUFnQixNQUNsQixFQUFFLEtBQUssVUFBVSxDQUNuQixDQUNELEVBRUQsZUFBZ0IsQ0FDZCxNQUFPLENBQ0wsU0FBVSxDQUFDLEtBQUssVUFDaEIsVUFBVyxLQUFLLFVBQ2hCLGtCQUFtQixDQUFDLEtBQUssWUFBWSxNQUNyQyxrQkFBbUIsQ0FBQyxLQUFLLFlBQVksTUFDckMsYUFBYyxLQUFLLFlBQ3JCLENBQ0QsRUFFRCxVQUFXMkMsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxFQUNYLENBQUMsRUFFRCxXQUFZQSxFQUFrQixhQUFjLENBQzFDLEtBQU0sT0FDTixRQUFTLFVBRVgsQ0FBQyxFQUVELFlBQWFBLEVBQWtCLGNBQWUsQ0FDNUMsS0FBTSxDQUFDLE9BQVEsT0FBTyxFQUN0QixRQUFTLEdBQ1QsSUFBSStqQixFQUFhLENBQ2YsT0FBTzdvQixFQUFBQSxTQUFTNm9CLENBQVcsRUFDdkJBLEVBQ0EsQ0FDRSxNQUFPLENBQUMsQ0FBQ0EsRUFDVCxNQUFPLENBQUMsQ0FBQ0EsQ0FDWCxDQUNOLEVBQ0QsQ0FDRixFQUVELE1BQU8sQ0FDTCxVQUFXLHNCQUNYLFVBQVcsc0JBQ1gsWUFBYSxxQkFDZCxFQUVELFNBQVUsQ0FDUixJQUFJdkQsRUFBVSxHQUNWQyxFQUFjLEdBRWxCLE1BQU0vZixFQUFXLElBQU0sQ0FDakIsQ0FBQyxLQUFLLFNBQVc4ZixJQUNuQkEsRUFBVSxHQUNWLEtBQUssU0FBUyxFQUVsQixFQUVNamdCLEVBQVUsSUFBTSxLQUFLLFFBQVEsRUFFN0JDLEVBQVMsSUFBTSxDQUNuQixLQUFLLE9BQU8sRUFDWkUsRUFBUyxDQUNYLEVBRU1zakIsRUFBb0JyRSxFQUFRLFNBQUMrRCxHQUFVLENBQzNDakQsRUFBYyxHQUNkLEtBQUssTUFBUWlELEVBQU8sUUFBUSxFQUM1QmxELEVBQVUsR0FDVjlmLEVBQVMsQ0FDVixFQUFFLEdBQUcsRUFFQXVqQixFQUFXLENBQUMsQ0FBRSxPQUFBUCxLQUFhLENBQy9CTSxFQUFrQk4sQ0FBTSxFQUN4QixLQUFLLFFBQVEsQ0FDZixFQUVBLEtBQUssT0FBTyxRQUFTMXFCLEdBQVMsQ0FDeEJ5bkIsRUFDRkEsRUFBYyxHQUVkLEtBQUssT0FBTyxXQUFXem5CLEVBQU8sR0FBTyxLQUFLLFlBQVksRUFFekQsRUFFRCxLQUFLLE9BQVMsSUFBSWtyQixTQUFPLENBQ3ZCLEdBQUcsS0FBSyxjQUNSLFFBQUEzakIsRUFDQSxPQUFBQyxFQUNBLFNBQUF5akIsRUFDQSxXQUFZLEtBQUssY0FBZSxFQUNoQyxRQUFTLEtBQUssT0FBUyxHQUN4QixDQUNGLEVBRUQsZUFBZ0IsQ0FDZCxLQUFLLE9BQU8sUUFBUSxDQUNyQixFQUVELFFBQVMsQ0FDUCxhQUFhdnFCLEVBQU8sQ0FDbEIsTUFBTXlxQixFQUFXLENBQUMsQ0FBRSxRQUFTQyxFQUFHLFFBQVNDLE1BQVMsQ0FBRSxFQUFBRCxFQUFHLEVBQUFDLElBRXZELElBQUlDLEVBQVFILEVBQVN6cUIsQ0FBSyxFQUFFLEVBQ3hCMlksRUFBUyxXQUFXLGlCQUFpQixLQUFLLE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUV0RSxNQUFNa1MsRUFBWTdxQixHQUFTLENBQ3pCLEtBQU0sQ0FBRSxFQUFBMnFCLENBQUUsRUFBSUYsRUFBU3pxQixDQUFLLEVBQzVCMlksR0FBVWdTLEVBQUlDLEVBQ2RBLEVBQVFELEVBQ1IsS0FBSyxPQUFTLEdBQUcsS0FBSyxJQUFJaFMsRUFBUSxDQUFDLEtBQ3JDLEVBRU1uVSxFQUFXLEtBQUssTUFBTSxTQUFVLENBQ3BDLFVBQUFxbUIsRUFFQSxRQUFRN3FCLEVBQU8sQ0FDYjZxQixFQUFVN3FCLENBQUssRUFDZndFLEVBQVMsT0FBTyxDQUNsQixFQUNELENBQ0YsRUFFRCxxQkFBc0IsQ0FDcEIsS0FBSyxPQUFPLFdBQVcsS0FBSyxhQUFhLENBQzFDLEVBRUQsTUFBTSxZQUFZd2xCLEVBQVEsQ0FDeEIsTUFBTTdpQixFQUFhLE1BQU0sS0FBSyxjQUFjLFdBQVcsQ0FDckQsV0FBWSxDQUNWLEtBQU0sQ0FDSixLQUFNLE1BQ04sTUFBTyxPQUNQLFVBQVcsRUFDWixFQUNELE1BQU8sQ0FDTCxLQUFNLE9BQ04sTUFBTyxPQUNULENBQ0QsRUFDRCxRQUFTLENBQ1AsT0FBUSxDQUFFLEVBQ1YsTUFBTyxDQUFFLEtBQU0sUUFBVSxFQUN6QixPQUFRLENBQ04sT0FBUSxDQUNOLE1BQU0sQ0FBRSxnQkFBQTJqQixHQUFtQixDQUN6QkEsRUFBZ0IsUUFBUSxJQUFJLENBQzlCLENBQ0YsQ0FDRixDQUNELEVBQ0QsS0FBTUMsRUFBQUEsa0JBQWtCLEtBQUssT0FBTyxNQUFPLE1BQU0sRUFDbEQsRUFDRCxHQUFJNWpCLEVBQVksQ0FDZCxHQUFJLENBQUUsS0FBQTZqQixFQUFNLE1BQUFyUixDQUFNLEVBQUl4UyxFQUN0QixHQUFJNmpCLEVBR0YsR0FBSSxDQUVGLElBQUksSUFBSUEsQ0FBSSxDQUNkLE1BQUUsQ0FDQUEsRUFBTyxXQUFXQSxHQUNwQixDQUVGaEIsRUFBTyxTQUFTLFFBQVEsQ0FBRSxLQUFBZ0IsRUFBTSxNQUFBclIsRUFBTyxPQUV2Q3FRLEVBQU8sU0FBUyxVQUFVLENBRTdCLEVBRUQsZUFBZ0IsQ0FDZCxLQUFNLENBQ0osTUFBQWlCLEVBQVEsQ0FBRSxFQUNWLE1BQUFDLEVBQVEsQ0FBRSxFQUNWLE1BQUFDLEVBQVEsQ0FBQyxDQUNULEVBQUUsS0FBSyxPQUNULE1BQU8sQ0FFTEMsR0FBUSxTQUNSQyxHQUFJLEtBQ0pDLEdBQVMsVUFHVEwsRUFBTSxNQUFRTSxHQUFJLEtBQ2xCTixFQUFNLFFBQVVPLEdBQU0sT0FDdEJQLEVBQU0sV0FBYVEsR0FBUyxVQUM1QlIsRUFBTSxRQUFVUyxHQUFNLE9BQ3RCVCxFQUFNLE9BQVNVLEdBQ2ZWLEVBQU0sTUFBUVcsR0FBSSxLQUNsQlgsRUFBTSxNQUFRWSxHQUdkWCxFQUFNLFlBQWNZLEdBQVUsV0FDOUJaLEVBQU0sV0FBYWEsR0FBUyxVQUM1QkMsR0FBUyxVQUNUZCxFQUFNLFNBQVdlLFdBQVEsVUFBVSxDQUFFLE9BQVFmLEVBQU0sUUFBUyxFQUM1REEsRUFBTSxnQkFBa0JnQixHQUFjLGdCQUNyQ2hCLEVBQU0sYUFBZUEsRUFBTSxhQUFlaUIsR0FBUSxTQUNuRGpCLEVBQU0sWUFBY2tCLEdBQVUsV0FDOUJsQixFQUFNLGFBQWVtQixHQUFXLFlBTWhDbEIsRUFBTSxTQUFXbUIsR0FBTSxPQUN4QixFQUFDLE9BQU9DLEdBQWEsQ0FBQyxDQUFDQSxDQUFTLENBQ2xDLEVBRUQsV0FBV0MsRUFBY0MsRUFBYyxDQUNyQyxNQUFNL0ssRUFBTyxDQUFDLEVBRVJnTCxFQUFZLENBQUMsQ0FBRSxLQUFBM3BCLEVBQU0sS0FBQTRwQixFQUFNLFdBQUF4bEIsRUFBWSxhQUFBeWxCLEVBQWMsUUFBQXRILEtBQWMsQ0FDdkU1RCxFQUFLLEtBQUssQ0FDUixLQUFBM2UsRUFDQSxLQUFBNHBCLEVBQ0EsU0FDRSxLQUFLLE9BQU8sU0FBUzVwQixFQUFNb0UsQ0FBVSxJQUNwQ3lsQixHQUFnQixNQUFRLENBQUNBLEtBRTVCLFFBQVMsSUFBTSxDQUNiLE1BQU0xdEIsRUFBTSxTQUFTdVEsRUFBUSxTQUFDMU0sRUFBTSxFQUFJLElBQ3BDLEtBQUssT0FBTyxTQUFTN0QsQ0FBRyxJQUcxQm9tQixFQUNJQSxFQUFRLEtBQUssT0FBUW5lLENBQVUsR0FIbkJBLEdBQ2QsS0FBSyxPQUFPLFFBQVFqSSxDQUFHLEVBQUVpSSxDQUFVLEVBQUUsTUFBTyxFQUFDLElBQUksR0FHdkNBLENBQVUsRUFFMUIsRUFDRCxDQUNILEVBRU12RCxFQUFXLEtBQUssT0FBTzRvQixDQUFZLEVBQ3pDLEdBQUk1b0IsRUFDRixTQUFXLENBQUMxRSxFQUFLMnRCLENBQVcsSUFBSyxPQUFPLFFBQVFKLENBQVksRUFBRyxDQUM3RCxNQUFNSyxFQUFjLENBQUMsT0FBUSxNQUFNLEVBQUUsU0FBUzV0QixDQUFHLEVBQUksVUFBWUEsRUFDM0Q0RyxFQUFVbEMsRUFBU2twQixDQUFXLEVBQzlCL3BCLEVBQU9ncUIsRUFBVSxXQUFDN3RCLENBQUcsRUFDckJ5dEIsRUFBT2hvQixFQUFTLFVBQUN6RixDQUFHLEVBQzFCLEdBQUk0RyxHQUNGLEdBQUkrbUIsSUFBZ0IsR0FDbEJILEVBQVUsQ0FBRSxLQUFBM3BCLEVBQU0sS0FBQTRwQixFQUFNLFVBQ2ZuckIsRUFBQUEsU0FBU3FyQixDQUFXLEVBQUcsQ0FDaEMsS0FBTSxDQUFFLFVBQUFHLEVBQVcsT0FBQXJrQixFQUFRLGFBQUFpa0IsRUFBYyxRQUFBdEgsQ0FBUSxFQUFJdUgsRUFDckQsR0FBSUcsR0FDRixHQUFJOXNCLEVBQU8sUUFBQ3lJLENBQU0sR0FBS3pJLEVBQU8sUUFBQzRGLENBQU8sRUFFcEMsVUFBV3hHLEtBQVNxSixFQUNkN0MsRUFBUSxTQUFTeEcsQ0FBSyxHQUN4Qm90QixFQUFVLENBQ1IsS0FBQTNwQixFQUNBLEtBQU0sR0FBRzRwQixLQUFRcnRCLElBQ2pCLFdBQVksQ0FBRSxDQUFDMHRCLENBQVMsRUFBRzF0QixDQUFPLEVBQ2xDLGFBQUFzdEIsRUFDQSxRQUFBdEgsRUFDRCxPQUtQb0gsRUFBVSxDQUFFLEtBQUEzcEIsRUFBTSxLQUFBNHBCLEVBQU0sYUFBQUMsRUFBYyxRQUFBdEgsRUFBUyxJQU16RCxPQUFPNUQsQ0FDUixFQUVELGNBQWUsVUFDYnBhLEdBQUE1RyxFQUFBLEtBQUssS0FBSSxpQkFBVCxNQUFBNEcsRUFBQSxLQUFBNUcsR0FDQSxLQUFLLE9BQU8sTUFBTSxDQUNwQixDQUNGLENBQ0YsQ0FBQyxFQUVLaXJCLEdBQVFzQixFQUFJLEtBQUMsT0FBTyxDQUN4QixLQUFNLFFBRU4sV0FBWSxDQUNWLE1BQU8sQ0FBQyxDQUFFLElBQUssUUFBUyxDQUN6QixFQUVELFlBQWEsQ0FDWCxNQUFPLENBQUMsUUFBUyxDQUFDLENBQ25CLEVBRUQsYUFBYyxDQUNaLE1BQU8sQ0FDTCxTQUNFOWxCLEdBQ0EsQ0FBQyxDQUFFLFNBQUErbEIsQ0FBUyxJQUNIQSxFQUFTLFFBQVEsS0FBSyxLQUFNL2xCLENBQVUsRUFFakQsWUFDRUEsR0FDQSxDQUFDLENBQUUsU0FBQStsQixDQUFTLElBQ0hBLEVBQVMsV0FBVyxLQUFLLEtBQU0vbEIsQ0FBVSxFQUVwRCxXQUNFLElBQ0EsQ0FBQyxDQUFFLFNBQUErbEIsQ0FBUyxJQUNIQSxFQUFTLFVBQVUsS0FBSyxJQUFJLENBRXpDLENBQ0YsQ0FDRixDQUFDLEVBRUtyQixHQUFnQnNCLEdBQUksS0FBQyxPQUFPLENBQ2hDLFVBQVcsR0FDWCxPQUFRLENBQ04sTUFBTyxDQUNMLEtBQU0sQ0FDSixRQUFTLElBQ1YsRUFDRCxNQUFPLENBQ0wsUUFBUyxJQUNYLENBQ0QsRUFFRCxXQUFZLENBQ1YsTUFBTyxDQUNMLENBQ0UsSUFBSyxJQUNMLFNBQVU5bEIsSUFBWSxDQUNwQixLQUFNQSxFQUFRLGFBQWEsTUFBTSxFQUNqQyxNQUFPQSxFQUFRLGFBQWEsT0FBTyxHQUV2QyxDQUNGLENBQ0QsRUFFRCxXQUFXK2xCLEVBQU0sQ0FDZixNQUFPLENBQUMsSUFBS0EsRUFBSyxNQUFPLENBQUMsQ0FDNUIsQ0FDRixDQUNGLENBQUMsaUhDeGZ1QyxPQUFBblEsRUFBQSxVQUFBLEVBQUFDLEVBQUEsbUJBQUEsTUFBQSwrSEFBbkN5RixFQUFBLFlBQW1DMEssRUFBbkM5SyxhQUFtQyxDQUFuQixJQUFJLHFCQUFlbEYsRUFBQSxxREFBQUEsRUFBQSxnQkFBQTJFLEdBQUEscUNBQUEzRSxFQUFBLGFBQUEsRUFBQSxXQUFBLEdBQUEsWUFBQUEsRUFBQSxZQUFBLGVBQUEsNkJBQUEsUUFBQUEsRUFBQSxVQUFBQSxFQUFBLGVBQUEsQ0FBQSxFQUFBLFlBQUFBLEVBQUEsa0JBQUEsUUFBQUEsRUFBQSxZQUFBLFdBQUFBLEVBQUEsYUFBQSxZQUFBQSxFQUFBLGVBQUEsU0FBQUEsRUFBQSxTQUFBLFNBQUFBLEVBQUEsU0FBQSxXQUFBQSxFQUFBLFdBQUEsZ0JBQUFBLEVBQUEsYUFBQSxpQkFBQUEsRUFBQSxhQUFBLGVBQUFBLEVBQUEsYUFBQSxlQUFBQSxFQUFBLFNBQUEsUUFBQUEsRUFBQSxXQUFBQSxFQUFBLFdBQUEsQ0FBQSxPQUFBQSxFQUFBLE9BQUEsUUFBQUEsRUFBQSxRQUFBLE1BQUFBLEVBQUEsU0FBQSxlQUFBQSxFQUFBLHVSQUFBQSxFQUFBLCtCQUFBSCxFQUFBLG1CQUFBLFNBQUEsT0FBQSxNQUFBLHdDQUFBLEtBQUEsU0FBQSxTQUFBRyxFQUFBLFNBQUEsNEJBQUFBLEVBQUEsT0FBQUEsRUFBQSxNQUFBLEdBQUE3YyxDQUFBLDREQWdEbkNzUyxHQUFhdVMsRUFBa0IsU0FBUyxjQUFZLENBQ3ZELE9BQVEsQ0FBQ08sRUFBWSxFQUNyQixXQUFZLENBQUUsZUFBQTBILEVBQWdCLEVBRTlCLE1BQU8sQ0FDTCxNQUFPLENBQ0wsVUFBVyxHQUNYLGdCQUFpQixLQUNqQixTQUFVLEVBQ1osQ0FDRCxFQUVELFNBQVUsQ0FDUixnQkFBaUIsQ0FDZixLQUFNLENBQ0osT0FBTyxLQUFLLFVBQ1AsS0FBSyxlQUFpQixDQUFFLEdBQ3RCLElBR0NodUIsR0FDRSxLQUFLLGtCQUFrQkEsQ0FBSyxHQUFLLEtBQUssYUFBYUEsQ0FBSyxDQUU1RCxFQUdDLE9BQU8sT0FBTyxFQUNqQixLQUFLLGNBQ1YsRUFFRCxJQUFJNm1CLEVBQVEsQ0FHVixLQUFLLGNBQWdCLEtBQUssVUFDckJBLEdBQVUsQ0FBQSxHQUFJLElBQUk3bUIsR0FBUyxLQUFLLGtCQUFrQkEsQ0FBSyxDQUFDLEVBQ3pELEtBQUssa0JBQWtCNm1CLENBQU0sRUFDakMsS0FBSyxTQUFTLENBQ2hCLENBQ0QsRUFFRCxlQUFnQixDQUNkLE9BQU8sS0FBSyxpQkFBbUIsS0FBSyxPQUNyQyxFQUVELFNBQVU3ZixFQUFrQixXQUFZLENBQ3RDLEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FBQyxFQUVELFdBQVlBLEVBQWtCLGFBQWMsQ0FDMUMsS0FBTSxRQUNOLFFBQVMsRUFDWCxDQUFDLEVBRUQsU0FBVUEsRUFBa0IsV0FBWSxDQUN0QyxLQUFNLFFBQ04sUUFBUyxFQUNYLENBQUMsRUFFRCxTQUFVQSxFQUFrQixXQUFZLENBQ3RDLEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FBQyxFQUVELGFBQWMsQ0FDWixHQUFJLENBQUUsWUFBQWluQixFQUFhLFdBQUFDLEVBQVksU0FBQUMsR0FBYSxLQUFLLE9BQ2pELE9BQUlyc0IsRUFBQUEsVUFBVW1zQixDQUFXLElBQ3ZCQSxFQUFjQSxFQUFjLE9BQVksTUFFbkNBLElBQWdCLE9BQ25CQyxHQUFjQyxFQUNaLG1CQUFtQixLQUFLLFFBQ3hCRCxFQUNFLG9CQUFvQixLQUFLLFFBQ3pCLE9BQ0pELENBQ0wsRUFFRCxlQUFnQixDQUNkLE9BQU8sS0FBSyxXQUFhLEtBQUssTUFBTSxRQUFRLFlBQzlDLENBQ0QsRUFFRCxTQUFVLENBQ1IsS0FBSyxVQUFZLEdBQ2IsS0FBSyxXQUdQLEtBQUssTUFBTSxDQUVkLEVBRUQsUUFBUyxDQUNQLGFBQWFHLEVBQUssQ0FDaEIsR0FBSSxLQUFLLFNBQVUsQ0FDakIsS0FBTSxDQUFFLFlBQUFoSCxFQUFhLFlBQUFELENBQVksRUFBSSxLQUMvQk4sRUFDSk8sR0FBZUQsRUFDWCxDQUNFLENBQUNDLENBQVcsRUFBR2dILEVBR2YsQ0FBQ2pILENBQVcsRUFBR2lILENBQ2pCLEVBQ0FBLEVBQ04sWUFBSyxRQUFRLEtBQUt2SCxDQUFNLEVBQ2pCQSxFQUVWLEVBRUQsY0FBZSxDQUNiLEtBQUssTUFBTSxRQUFRLFNBQVMsQ0FDN0IsRUFFRCxRQUFTLENBQ1AsS0FBSyxTQUFXLEVBQ2pCLEVBRUQsU0FBVSxDQUdKLEtBQUssU0FDUCxLQUFLLE9BQU8sQ0FFZixFQUVELFFBQVMsQ0FDRixLQUFLLE1BQU0sUUFBUSxRQUN0QjNmLEVBQVUsUUFBUSxPQUFPLEtBQUssSUFBSSxDQUVyQyxFQUVELFNBQVNrbkIsRUFBSyxDQUNaLE1BQU12SCxFQUFTLEtBQUssYUFBYXVILENBQUcsRUFDaEN2SCxHQUNGLEtBQUssTUFBTSxLQUFLLEtBQUssa0JBQWtCQSxDQUFNLENBQUMsQ0FFakQsRUFFRCxNQUFNLGVBQWVoakIsRUFBTyxDQUN0QixLQUFLLGVBQ0hBLEdBR0YsS0FBSyxnQkFBa0IsQ0FBQyxFQUN4QixLQUFLLGdCQUFrQixNQUFNLEtBQUssWUFDaEMsSUFBTSxLQUFLLGFBQWEsSUFBSTFELEVBQVksS0FBTSxDQUFFLE1BQUEwRCxDQUFNLENBQUMsQ0FBQyxDQUMxRCxHQUdBLEtBQUssZ0JBQWtCLEtBRzdCLENBQ0YsQ0FDRixDQUFDLDJCQzFNY3dxQixHQUFBLENBQ2IsU0FBVSxDQUNSLFdBQVksQ0FDVixLQUFNLENBQ0osT0FBTyxLQUFLLFFBQVUsS0FBTyxLQUFLLE1BQVEsRUFDM0MsRUFFRCxJQUFJcnVCLEVBQU8sQ0FDVCxLQUFLLE1BQ0hBLElBQVUsR0FDTixLQUFLLFVBQ0gsU0FBU0EsRUFBTyxFQUFFLEVBQ2xCLFdBQVdBLENBQUssRUFDbEIsSUFDUCxDQUNGLEVBR0QsV0FBWSxDQUNWLE1BQU8sRUFDUixFQUVELFdBQVksQ0FDVixPQUFPLEtBQUssTUFBUSxNQUFRLENBQUMsS0FBSyxVQUFZLE1BQVEsS0FBSyxJQUM1RCxFQUVELFNBQVVnSCxFQUFrQixXQUFZLENBQ3RDLEtBQU0sTUFDWixDQUFLLEVBRUQsS0FBTUEsRUFBa0IsT0FBUSxDQUM5QixLQUFNLE9BQ04sSUFBSThNLEVBQU0sQ0FFUixPQUFPLEtBQUssV0FBYUEsR0FBUSxLQUFPLEtBQUssS0FBS0EsQ0FBSSxFQUFJQSxDQUMzRCxDQUNQLENBQUssRUFFRCxJQUFLOU0sRUFBa0IsTUFBTyxDQUM1QixLQUFNLE9BQ04sSUFBSWYsRUFBSyxPQUNQLE9BQUFBLEVBQ0VBLElBQVEsUUFDSjdFLEVBQUEsS0FBSyxlQUFlLFFBQVMsQ0FBRSxLQUFNLEtBQUssQ0FBRSxJQUE1QyxZQUFBQSxFQUFnRCxHQUNoRDZFLEVBQ0MsS0FBSyxXQUFhQSxHQUFPLEtBQU8sS0FBSyxNQUFNQSxDQUFHLEVBQUlBLENBQzFELENBQ1AsQ0FBSyxFQUVELElBQUtlLEVBQWtCLE1BQU8sQ0FDNUIsS0FBTSxPQUNOLElBQUloQixFQUFLLE9BQ1AsT0FBQUEsRUFDRUEsSUFBUSxRQUNKNUUsRUFBQSxLQUFLLGVBQWUsUUFBUyxDQUFFLEtBQU0sS0FBSyxDQUFFLElBQTVDLFlBQUFBLEVBQWdELEdBQ2hENEUsRUFDQyxLQUFLLFdBQWFBLEdBQU8sS0FBTyxLQUFLLEtBQUtBLENBQUcsRUFBSUEsQ0FDekQsQ0FDUCxDQUFLLEVBRUQsTUFBT2dCLEVBQWtCLFFBQVMsQ0FDaEMsS0FBTSxNQUNOLEtBQU0sQ0FHSixLQUFNLENBQUUsSUFBQWYsRUFBSyxJQUFBRCxDQUFHLEVBQUssS0FDckIsT0FBT0MsR0FBTyxNQUFRRCxHQUFPLEtBQU8sQ0FBQ0MsRUFBS0QsQ0FBRyxFQUFJLE1BQ2xELEVBRUQsSUFBSW9SLEVBQU8sQ0FHTHhXLEVBQUFBLFFBQVF3VyxDQUFLLElBQ2QsQ0FBQyxLQUFLLElBQUssS0FBSyxHQUFHLEVBQUlBLEVBRTNCLENBQ1AsQ0FBSyxDQUNGLEVBRUQsUUFBUyxDQUNQLGdCQUFpQixDQUNmLE1BQU0xUSxFQUFjLENBQUUsRUFDaEIsQ0FBRSxNQUFBMFEsRUFBTyxJQUFBblIsRUFBSyxJQUFBRCxFQUFLLFNBQUFMLEVBQVUsS0FBQW1PLENBQUksRUFBSyxLQVc1QyxHQVZJc0QsRUFDRjFRLEVBQVksTUFBUTBRLEdBRWhCblIsR0FBTyxPQUNUUyxFQUFZLElBQU1ULEdBRWhCRCxHQUFPLE9BQ1RVLEVBQVksSUFBTVYsSUFHbEJMLEdBQVksS0FDZGUsRUFBWSxTQUFXZixVQUNkbU8sRUFBTSxDQUNmLE1BQU1uTyxHQUFZLEdBQUdtTyxJQUFPLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBSyxJQUFJLE9BQzdDbk8sRUFBVyxFQUNiZSxFQUFZLFNBQVdmLEVBRXZCZSxFQUFZLFFBQVUsR0FHMUIsT0FBSSxLQUFLLFlBQ1BBLEVBQVksUUFBVSxJQUVqQkEsQ0FDUixDQUNGLENBQ0gsb1hDL0ZLOE0sR0FBYXVTLEVBQWtCLFNBQ2xDLENBQUMsU0FBVSxTQUFTLEVBRXBCLENBQ0UsT0FBUSxDQUFDc0ksRUFBVyxFQUNwQixXQUFZLENBQUUsV0FBQTNYLENBQVksRUFDMUIsWUFBYSxHQUNiLFVBQVcsR0FFWCxTQUFVLENBQ1IsV0FBWSxDQUNWLE9BQU8sS0FBSyxPQUFTLFNBQ3ZCLENBQ0YsQ0FDRixDQUNGLDh0REM2QmtCcVAsRUFBa0IsU0FBUyxTQUFPLENBQ2xELE9BQVEsQ0FBQ21DLENBQVcsRUFFcEIsWUFBYSxHQUViLGNBQWMxbEIsRUFBTSxDQUVsQixPQUFPQSxDQUNSLEVBRUQsU0FBVSxDQUNSLGFBQWMsQ0FFWixPQUFPLEtBQUssWUFDUixLQUFLLGFBQWEsS0FBSyxPQUFRLEtBQUssV0FBWSxDQUFFLFNBQVUsR0FBTSxFQUNsRSxJQUNOLENBQ0QsRUFFRCxRQUFTLENBQ1AsWUFBYSxDQUNYLE9BQU8sSUFBSXJDLEVBQVksS0FBTSxDQUFFLEtBQU0sS0FBSyxXQUFZLENBQ3hELENBQ0QsRUFFRCxNQUFNLGNBQ0pzTCxFQUNBN0ksRUFDQWEsRUFDQWlJLEVBQ0FDLEVBQ0F4TixFQUFTLEdBQ1R1SyxFQUFVLEdBQ1ZtRCxFQUFVLEtBQ1YsQ0FDQSxNQUFNLFFBQVEsSUFBSSxDQUNoQlIsR0FBdUJ6SSxDQUFNLEVBQzdCc2xCLEVBQVksY0FDVnpjLEVBQ0E3SSxFQUNBYSxFQUNBaUksRUFDQUMsRUFDQXhOLEVBQ0F1SyxFQUNBbUQsQ0FDRixFQUNELENBQ0gsQ0FDRixDQUFDLDhCQzNHaUJrYSxFQUFrQixTQUFTLFFBQU0sQ0FDakQsYUFBYyxJQUFBLEdBQ2QsYUFBYyxHQUNkLGNBQWUsR0FDZixZQUFhLEdBQ2IsWUFBYSxHQUViLGVBQWVuakIsRUFBUSxDQUdyQixLQUFNLENBQUUsS0FBQWEsRUFBTSxHQUFHeUksQ0FBTSxFQUFJdEosRUFDM0IsT0FBT3NKLENBQ1QsQ0FDRixDQUFDLDJPQ0ZELFNBQWtCNlosRUFBa0IsU0FBUyxXQUFTLENBQ3BELE9BQVEsQ0FBQ3NJLEVBQVcsRUFDcEIsU0FBVSxDQUNSLGVBQWdCLENBQ2QsR0FBSSxDQUFFLE1BQUFydUIsRUFBTyxNQUFBb1gsRUFBTyxLQUFBdEQsQ0FBTyxFQUFFLEtBQzdCLE9BQUk5VCxJQUFVLE1BQ1JvWCxJQUNGcFgsR0FBU29YLEVBQU0sQ0FBQyxHQUVkdEQsSUFDRjlULEVBQVEsS0FBSyxNQUFNQSxFQUFROFQsQ0FBSSxFQUFJQSxJQUdyQzlULEVBQVEsR0FFSEEsQ0FDUixFQUVELGFBQWMsQ0FDWixLQUFNLENBQUUsTUFBQW9YLENBQU0sRUFBSSxLQUNsQixPQUFPQSxFQUFRQSxFQUFNLENBQUMsRUFBSUEsRUFBTSxDQUFDLEVBQUksSUFDdkMsQ0FDRixDQUNGLENBQUMsMHZCQ2RpQjJPLEVBQWtCLFNBQVMsUUFBTSxDQUNqRCxPQUFRLENBQUNPLEVBQVksRUFFckIsWUFBYSxFQUNmLENBQUMsb2VDWGlCUCxFQUFrQixTQUFTLFVBQVEsQ0FDbkQsYUFBYyxJQUFBLEdBQ2QsbUJBQW9CbmpCLEdBQVUsQ0FBQ0EsRUFBTyxRQUFVLEVBQUUsWUFBYUEsR0FDL0QsY0FBZSxHQUNmLGNBQWUsR0FDZixZQUFhLEdBRWIsU0FBVSxDQUNSLE1BQU8sQ0FDTCxPQUFPLEtBQUssT0FBUyxLQUFLLE1BQVEsS0FBSyxJQUN6QyxDQUNELEVBRUQsUUFBUyxDQUNQLGtCQUFBaUwsRUFDRCxFQUVELE1BQU0sY0FBY3BDLEVBQUs3SSxFQUFRYSxFQUFNaUksRUFBUUMsRUFBTyxDQUVwRCxNQUFNSCxFQUF3QkMsRUFBSzdJLEVBQVE4SSxFQUFRQyxDQUFLLENBQzFELENBQ0YsQ0FBQywrL0NDT2lCb2EsRUFBa0IsU0FBUyxTQUFPLENBQ2xELE9BQVEsQ0FBQ08sRUFBWSxFQUVyQixZQUFhLEdBRWIsTUFBTyxDQUNMLE1BQU8sQ0FHTCxTQUFVLEVBQ1osQ0FDRixDQUNGLENBQUMsOHdCQzNCaUJQLEVBQWtCLFNBQVMsU0FBTyxDQUNsRCxPQUFRLENBQUNzSSxFQUFXLEVBQ3BCLFdBQVksQ0FBRSxXQUFBM1gsQ0FBWSxFQUMxQixZQUFhLEdBRWIsU0FBVSxDQUVSLE1BQU8xUCxFQUFrQixRQUFTLENBQ2hDLEtBQU0sUUFDTixRQUFTLEdBQ1YsQ0FDSCxDQUNGLENBQUMseVZDM0JpQitlLEVBQWtCLFNBQVMsU0FBTyxDQUNsRCxhQUFjLEdBQ2QsYUFBYyxPQUVkLFdBQVksQ0FDVixhQUFBdUksRUFDRCxFQUVELFNBQVUsQ0FDUixRQUFTLENBQ1AsT0FBTyxLQUFLLE9BQU8sTUFDckIsQ0FDRixDQUNGLENBQUMsK1VDZEQsTUFBTUMsR0FBaUIsbUJBRWxCL2EsR0FBYXVTLEVBQWtCLFNBQ2xDLENBQ0UsT0FDQSxRQUNBLE1BQ0EsV0FDQSxTQUNBLE1BQ0EsV0FDQSxZQUNELEVBRUQsQ0FDRSxXQUFZLENBQUUsV0FBQXJQLENBQVksRUFDMUIsWUFBYSxHQUNiLFVBQVcsR0FDWCxtQkFBb0I5VCxHQUFVQSxFQUFPLE9BQVMsV0FFOUMsU0FBVSxDQUNSLFdBQVksQ0FDVixNQUNFLENBQ0UsV0FBWSxPQUNaLFNBQVUsT0FDVixPQUFRLFFBQ1IsS0FBSyxJQUFJLEdBQ1gsS0FBSyxJQUVSLEVBRUQsV0FBWSxDQUNWLEtBQU0sQ0FDSixPQUNFLEtBQUssT0FBUyxZQUNkLEtBQUssUUFBVSxRQUNmLENBQUMsS0FBSyxRQUVKMnJCLEdBQ0EsS0FBSyxLQUNWLEVBRUQsSUFBSXZ1QixFQUFPLENBQ1QsS0FBSyxNQUFRQSxDQUNmLENBQ0YsQ0FDRCxFQUVELFFBQVMsQ0FDUCxnQkFBaUIsQ0FDZixNQUFNdUcsRUFBTyxDQUNYLE1BQU8sUUFDUCxJQUFLLE1BQ0wsU0FBVSxXQUNWLE9BQVEsU0FDUixTQUFVLFdBQ1YsV0FBWSxjQUNaLEtBQUssSUFBSSxFQUNYLE9BQU9BLEVBQU8sQ0FBRSxDQUFDQSxDQUFJLEVBQUcsRUFBTyxFQUFFLENBQUMsQ0FDcEMsQ0FDRixDQUNGLENBQ0YsZ1lDN0RrQndmLEVBQWtCLFNBQVMsV0FBUyxDQUNwRCxZQUFhLEdBQ2IsVUFBVyxHQUNYLFlBQWEsR0FFYixTQUFVLENBQ1IsT0FBUSxDQUNOLE9BQU8sS0FBSyxPQUFPLE9BQVMsQ0FDN0IsRUFFRCxVQUFXL2UsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxHQUNWLENBQ0gsQ0FDRixDQUFDLGl3QkNBSXdNLEdBQWF1UyxFQUFrQixTQUNsQyxDQUFDLFlBQWEsYUFBYSxFQUUzQixDQUNFLE9BQVEsQ0FBQ21DLENBQVcsRUFFcEIsWUFBYSxHQUViLFNBQVUsQ0FDUixNQUFPLENBQUUsVUFBVyxJQUFLLENBQzFCLEVBRUQsY0FBYzFsQixFQUFNLENBQ2xCLE9BQU9BLElBQVMsY0FBZ0IsU0FBVyxNQUM1QyxFQUVELFNBQVUsQ0FDUixNQUFPLE9BRUwsT0FBT3BCLEVBQUEsS0FBSyxnQkFBTCxZQUFBQSxFQUFvQixJQUM1QixFQUVELFVBQVcsT0FFVCxPQUFPLEtBQUssT0FBTyxLQUFLLE9BQU1BLEVBQUEsS0FBSyxPQUFMLFlBQUFBLEVBQVcsTUFBTSxDQUNoRCxFQUVELFVBQVcsQ0FDVCxPQUFPLEtBQUssYUFDUixDQUFFLENBQUMsS0FBSyxJQUFJLEVBQUcsS0FBSyxLQUFNLEVBQzFCLEtBQUssS0FDVixFQUVELGNBQWUsQ0FHYixPQUFPLEtBQUssYUFDUixLQUFLLFNBQVMsTUFBTSxFQUFHLEtBQUssU0FBUyxPQUFTLEtBQUssS0FBSyxNQUFNLEVBQzlELEtBQUssUUFDVixFQUVELFlBQWEsQ0FDWCxPQUFPLEtBQUssYUFDUixDQUNFLFNBQVUsQ0FDUixLQUFNLEtBQUssS0FDWCxHQUFHLEtBQUssTUFDVixDQUNGLEVBQ0EsS0FBSyxNQUNWLEVBRUQsa0JBQW1CLENBQ2pCLE1BQU1vdEIsRUFBbUI1ckIsR0FFckJzSyxFQUFjdEssQ0FBTSxJQUNsQixLQUFLLGVBQWUsV0FBWSxDQUM5QixLQUFNLFFBQ04sUUFBUyxHQUNULE9BQUFBLENBQ0YsQ0FBQyxHQUNEQSxFQUFPLFVBQ1A0ckIsRUFBaUI1ckIsRUFBTyxRQUFRLEdBSXRDLE9BQU80ckIsRUFBaUIsS0FBSyxNQUFNLENBQ3JDLENBQ0QsRUFFRCxNQUFNLGNBQ0ovaUIsRUFDQTdJLEVBQ0FhLEVBQ0FpSSxFQUNBQyxFQUNBeE4sRUFBUyxHQUNUdUssRUFBVSxHQUNWbUQsRUFBVSxLQUNWLENBQ0EsTUFBTSxRQUFRLElBQUksQ0FDaEJOLEdBQXdCM0ksRUFBTyxVQUFVLEVBQ3pDc2xCLEVBQVksY0FDVnpjLEVBQ0E3SSxFQUNBYSxFQUNBaUksRUFDQUMsRUFDQXhOLEVBQ0F1SyxFQUVBLENBQUNxZ0IsRUFBYXBkLElBQVUsQ0FDdEIsS0FBTSxDQUFFLFNBQUFZLEdBQWEzSixFQUNyQixHQUFJMkosRUFFRixPQUFBQSxFQUFTLEtBQU8sWUFFVCxLQUFLLGNBQ1ZkLEVBQ0FjLEVBQ0FBLEVBQVMsS0FDVHdjLEVBQ0FwZCxFQUNBeE4sRUFDQSxHQUNBME4sQ0FDRixDQUVKLENBQ0YsRUFDRCxDQUNGLEVBRUQsNEJBQTRCakosRUFBUWpELEVBQVMsQ0FHM0MsS0FBTSxDQUFFLFNBQUE0TSxHQUFhM0osRUFDckIsT0FBTzZLLEVBQ0w3SyxFQUNBakQsRUFDQTRNLEVBQ0lHLElBQVMsQ0FDUCxHQUFHQSxFQUNILFdBQVksQ0FDVixHQUFHQSxFQUFLLFdBQ1IsQ0FBQ0gsRUFBUyxJQUFJLEVBQUdBLENBQ25CLElBRUYsSUFDTixDQUNGLENBQ0YsQ0FDRiwyQkNqS08sU0FBU2tpQixHQUFlblksRUFBTSxDQUNuQyxPQUFPb1ksR0FBUSxTQUFDcFksRUFBTSxDQUFFLEtBQU0sRUFBRSxDQUFFLENBQ3BDLDJvSEMwR2tCeVAsRUFBa0IsU0FBUyxTQUFPLENBQ2xELE9BQVEsQ0FBQy9ELEVBQWEsRUFDdEIsV0FBWSxDQUFFLFVBQUEyTSxFQUFXLEVBRXpCLFlBQWEsR0FFYixNQUFPLENBQ0wsTUFBTyxDQUNMLFFBQVMsQ0FBQyxDQUNaLENBQ0QsRUFFRCxTQUFVLENBQ1IsUUFBUyxDQUNQLE9BQU8sS0FBSyxNQUFNLE1BQ25CLEVBRUQsT0FBUSxDQUNOLE9BQU9DLEdBQVEsS0FBSyxLQUFLLENBQzFCLEVBRUQsU0FBVTVuQixFQUFrQixXQUFZLENBQ3RDLEtBQU0sUUFDTixRQUFTLEdBRVQsU0FBVSxFQUNaLENBQUMsRUFFRCxXQUFZQSxFQUFrQixhQUFjLENBQzFDLEtBQU0sQ0FBQyxNQUFPLE9BQVEsTUFBTSxDQUM5QixDQUFDLEVBRUQsT0FBUUEsRUFBa0IsU0FBVSxDQUNsQyxLQUFNLE1BQ04sSUFBSTZuQixFQUFRLENBQ1YsT0FBT2p1QixFQUFBQSxRQUFRaXVCLENBQU0sRUFBSUEsRUFBTyxLQUFLLEdBQUcsRUFBSUEsQ0FDOUMsQ0FDRixDQUFDLEVBRUQsUUFBUzduQixFQUFrQixVQUFXLENBQ3BDLEtBQU0sQ0FBQyxPQUFRLE1BQU0sRUFDckIsSUFBSThuQixFQUFTLENBQ1gsT0FBT0EsRUFBVUMsR0FBY0QsQ0FBTyxFQUFJLE1BQzVDLENBQ0YsQ0FBQyxFQUVELFVBQVc5bkIsRUFBa0IsWUFBYSxDQUN4QyxLQUFNLFFBQ04sUUFBUyxHQUNULElBQUlxaEIsRUFBVyxDQUNiLE9BQU9BLEdBQWEsS0FBSyxNQUFNLE9BQVMsQ0FDMUMsQ0FDRixDQUFDLEVBRUQsVUFBV3JoQixFQUFrQixZQUFhLENBQ3hDLEtBQU0sUUFDTixRQUFTLEVBQ1gsQ0FBQyxFQUVELGVBQWdCLENBQ2QsT0FDRSxLQUFLLFFBQVEsUUFDYixFQUFFLEtBQUssT0FBTyxRQUFVLEtBQUssT0FBTyxTQUV2QyxFQUVELGdCQUFpQixDQUNmLE9BQU8sS0FBSyxRQUFRLFFBQVUsS0FBSyxPQUFPLE1BQzNDLEVBRUQsZ0JBQWlCLENBQ2YsT0FDRSxLQUFLLFFBQVEsT0FBTyxDQUFDa1IsRUFBTzhXLElBQVM5VyxFQUFROFcsRUFBSyxTQUFVLENBQUMsRUFDN0QsS0FBSyxRQUFRLE1BRWhCLEVBRUQsWUFBYSxDQUNYLE9BQU8sS0FBSyxlQUFlLENBQ3pCLEtBQU0sU0FDTixLQUFNLEtBQUssSUFBSSxjQUFjLEtBQUssUUFBUSxFQUMzQyxDQUNILENBQ0QsRUFFRCxRQUFTLENBQ1AsZUFBQVAsR0FFQSxXQUFXTyxFQUFNaHdCLEVBQU8sQ0FDdEIsS0FBTSxDQUFFLE9BQUFrbEIsR0FBVyxLQUFLLE9BQ3hCLE9BQU9BLEVBQ0hBLEVBQU8sS0FDTCxLQUNBLElBQUkvakIsRUFBWSxLQUFNLENBQ3BCLE1BQU82dUIsRUFDUCxLQUFNLEtBQUssTUFDWCxNQUFBaHdCLEVBQ0EsU0FBVXBCLEVBQWUsS0FBSyxTQUFVb0IsQ0FBSyxFQUM5QyxDQUNILEVBQ0FtbEIsRUFBVSxXQUFDNkssRUFBSyxJQUFJLENBQ3pCLEVBRUQsV0FBV0EsRUFBTWh3QixFQUFPLENBQ3RCLEtBQU0sQ0FBRSxLQUFBeUUsQ0FBSyxFQUFJdXJCLEVBR2ZBLEdBQ0EsT0FBTyxRQUNMLHlCQUF5QixLQUFLLE1BQU0sVUFBVXZyQixJQUNoRCxJQUVJLEtBQUssU0FDUCxLQUFLLE1BQU0sT0FBT3pFLEVBQU8sQ0FBQyxFQUUxQixLQUFLLE1BQVEsS0FFWGd3QixFQUFLLFFBQ1AsS0FBSyxPQUFPLE9BQU9BLEVBQUssTUFBTSxFQUVoQyxLQUFLLFNBQVMsRUFDZCxLQUFLLE9BQU8sQ0FDVixLQUFNLE9BQ04sTUFBTyx1QkFDUCxLQUFNLEdBQUd2ckIsU0FBWSxLQUFLLE1BQU0sV0FDakMsRUFFSixFQUVELGFBQWF1ckIsRUFBTSxDQUNqQixPQUFPLEtBQUssVUFBWSxLQUFLLE1BQ3pCLEtBQUssTUFBTSxVQUFVOWMsR0FBTUEsRUFBRyxLQUFPOGMsRUFBSyxFQUFFLEVBQzVDLEVBQ0wsRUFFRCxRQUFRQSxFQUFNLENBQ1IsS0FBSyxTQUNILEtBQUssTUFDUCxLQUFLLE1BQU0sS0FBS0EsQ0FBSSxFQUVwQixLQUFLLE1BQVEsQ0FBQ0EsQ0FBSSxFQUdwQixLQUFLLE1BQVFBLENBRWhCLEVBRUQsWUFBWUEsRUFBTUMsRUFBUyxDQUN6QixHQUFJLEtBQUssU0FBVSxDQUNqQixNQUFNandCLEVBQVEsS0FBSyxhQUFhZ3dCLENBQUksRUFDaENod0IsR0FBUyxJQUNQaXdCLEVBQ0YsS0FBSyxNQUFNandCLENBQUssRUFBSWl3QixFQUVwQixLQUFLLE1BQU0sT0FBT2p3QixFQUFPLENBQUMsUUFJOUIsS0FBSyxNQUFRaXdCLENBRWhCLEVBRUQsV0FBV0QsRUFBTSxDQUNmLEtBQUssWUFBWUEsRUFBTSxJQUFJLENBQzVCLEVBRUQsVUFBVUMsRUFBU0MsRUFBUyxDQUMxQixHQUFJRCxHQUFXLENBQUNDLEVBQVMsQ0FDdkIsS0FBTSxDQUFFLEdBQUE1dkIsRUFBSSxLQUFBbUUsRUFBTSxLQUFBNlMsQ0FBTyxFQUFFMlksRUFDM0IsS0FBSyxRQUFRLENBQUUsR0FBQTN2QixFQUFJLEtBQUFtRSxFQUFNLEtBQUE2UyxFQUFNLE9BQVEyWSxFQUFTLEVBRWxELEdBQUlBLEdBQVdDLEVBQVMsQ0FDdEIsS0FBTSxDQUFFLFFBQUF4TixFQUFTLE1BQUEvZixDQUFNLEVBQUlzdEIsRUFDM0IsR0FBSXZOLEVBQVMsQ0FDWCxLQUFLLFNBQVMsRUFDZCxNQUFNc04sRUFBT0MsRUFBUSxTQUFTLENBQUMsRUFDM0JELEdBQ0ZBLEVBQUssT0FBU0MsRUFHZCxLQUFLLFlBQVlBLEVBQVNELENBQUksR0FFOUIsS0FBSyxXQUFXQyxDQUFPLFVBRWhCdHRCLEVBQU8sQ0FDaEIsTUFBTTJZLEVBQ0osQ0FDRSxNQUFPLGlCQUNQLE9BQVEsZ0JBQ1IsVUFBVywwQkFBMEIyVSxFQUFRLE9BQzdDLFFBQVMsMENBQ1QsT0FBUSxzQ0FDUixLQUFNLHNCQUFzQlIsR0FBZVEsRUFBUSxJQUFJLElBQ3ZELFFBQVMsZ0NBQ1YsRUFBQ3R0QixDQUFLLEdBQ1AsK0JBQStCQSxLQUVqQyxLQUFLLE9BQU8sQ0FDVixLQUFNLFFBQ04sTUFBTyxvQkFDUCxLQUFBMlksRUFDRCxFQUNELEtBQUssV0FBVzJVLENBQU8sR0FHNUIsRUFFRCxZQUFZQSxFQUFpQyxPQUMzQyxNQUFNRSxFQUFNRixHQUFBLFlBQUFBLEVBQVMsS0FDakI3dEIsRUFBQSxLQUFLLElBQUksT0FBVCxNQUFBQSxFQUFlLGFBQWUrdEIsR0FBTyxDQUFDQSxFQUFJLGtCQUM1Q0EsRUFBSSxnQkFBa0IsR0FFMUIsQ0FDRCxFQUVELGFBQWF2c0IsRUFBUTVDLEVBQU8sQ0FFMUIsTUFBTW92QixFQUFRUixHQUFRNXVCLENBQUssRUFDeEIsSUFBSSxDQUFDLENBQUUsT0FBQXF2QixFQUFRLEdBQUdMLENBQU0sSUFBTSxDQUFDSyxHQUFVQSxFQUFPLFFBQVVMLEVBQU8sSUFBSyxFQUN0RSxPQUFPQSxHQUFRQSxDQUFJLEVBQ3RCLE9BQU9wc0IsRUFBTyxTQUFXd3NCLEVBQVFBLEVBQU0sQ0FBQyxHQUFLLElBQy9DLENBQ0YsQ0FBQyxFQUVELFNBQVNSLEdBQVE1dUIsRUFBTyxDQUN0QixPQUFPQSxFQUFRcUMsRUFBQUEsUUFBUXJDLENBQUssRUFBSSxDQUFDLENBQ25DLHlrQkNoVk1zdkIsR0FBcUIsSUFBSSxJQUV4QixTQUFTQyxHQUFVM29CLEVBQVMsQ0FFNUIwb0IsR0FBbUIsSUFBSTFvQixDQUFPLElBQ2pDMG9CLEdBQW1CLElBQUkxb0IsQ0FBTyxFQUM5QixRQUFRLEtBQUtBLENBQU8sRUFFeEIsQ0NSZSxNQUFBdVosR0FBQSxDQUNiLFNBQVUsVUFDVixPQUFRLFFBQ1IsU0FBVSxZQUNWLFNBQVUsVUFDVixPQUFRLFNBQ1IsUUFBUyxTQUNULFNBQVUsWUFDVixPQUFRLFNBQ1YsRUFBRSxPQUFPLENBQUNBLEVBQU92YyxLQUNmdWMsRUFBTXZjLENBQUksRUFBSUEsRUFDUHVjLEdBQ04sQ0FBRSxDQUFBLEVDU1UsTUFBTXFQLEVBQVUsQ0FDN0IsWUFBWWphLEVBQUksQ0FFZCxLQUFBa2EsRUFBTyxDQUFFLEVBQ1QsSUFBQWhrQixFQUNBLE1BQUFpa0IsRUFBUSxDQUFFLEVBQ1YsR0FBR3B2QixDQUNKLEVBQUcsR0FBSSxDQUNOLEtBQUssR0FBS2lWLEVBSVYsS0FBSyxJQUFNOUosRUFBTWUsUUFBTSxDQUFFLEtBQU0sS0FBT2lqQixFQUFLLElBQUtoa0IsQ0FBRyxFQUNuRCxLQUFLLFFBQVVuTCxFQUdmbUwsRUFBSSxTQUFKQSxFQUFJLE9BQVcsU0FDZkEsRUFBSSxRQUFVZSxFQUFLLE1BQUMsQ0FBRSxFQUFFbUssRUFBYyxlQUFFbEwsRUFBSSxPQUFPLEVBQ25EQSxFQUFJLFVBQUpBLEVBQUksUUFBWW5MLEdBQVdnZ0IsR0FBUTdVLEVBQUtuTCxDQUFPLEdBQy9DbUwsRUFBSSxZQUFKQSxFQUFJLFVBQWNuTCxHQUFXcXZCLEdBQVVsa0IsRUFBS25MLENBQU8sR0FDbkRtTCxFQUFJLFdBQUpBLEVBQUksU0FBYTNILEdBQU84ckIsR0FBU25rQixFQUFLM0gsQ0FBRyxHQUd6QzJILEVBQUksZ0JBQUpBLEVBQUksY0FBa0JBLEVBQUksZUFBaUJwRyxFQUFTLFVBQUd3cUIsR0FBT0EsR0FDOURwa0IsRUFBSSxrQkFBSkEsRUFBSSxnQkFBb0JBLEVBQUksZUFBaUIwRSxFQUFRLFNBQUcwZixHQUFPQSxHQWlCL0Rwa0IsRUFBSSxXQUFKQSxFQUFJLFNBQWEsQ0FBRSxHQW1CbkIsTUFBTXFrQixFQUFRanRCLEVBQVk0SSxFQUFJLE1BQU8sQ0FDbkMsS0FBTSxZQUNQLENBQUEsR0FBSyxDQUFFLEVBQ1Jxa0IsRUFBTSxNQUFRanRCLEVBQVlpdEIsRUFBTSxPQUFTLFFBQVMsQ0FDaEQsT0FBUSxPQUNSLE9BQVFBLENBQ2QsQ0FBSyxFQUNEQSxFQUFNLE9BQVNqdEIsRUFBWWl0QixFQUFNLFFBQVUsU0FBVSxDQUNuRCxPQUFRLE9BQ1IsT0FBUUEsQ0FDZCxDQUFLLEVBQ0RBLEVBQU0sUUFBVWp0QixFQUFZaXRCLEVBQU0sU0FBVyxVQUFXLENBQ3RELE9BQVEsTUFDUixPQUFRQSxDQUNkLENBQUssRUFDRHJrQixFQUFJLE1BQVFxa0IsRUFZWnJrQixFQUFJLFVBQVksQ0FDZCxJQUFJakwsRUFBVSxDQUNaLE1BQU0wWixFQUFVLEtBQUsxWixHQUFBLFlBQUFBLEVBQVUsSUFBSSxHQUFLLEtBQUssUUFDN0MsT0FBT0EsR0FBWTBaLEVBQVEsS0FBSyxLQUFNMVosQ0FBUSxDQUMvQyxFQUVELFFBQVFBLEVBQVUsQ0FDaEIsTUFBTXV2QixFQUFhLEtBQUssSUFBSXZ2QixFQUFTLE1BQU0sRUFDM0MsT0FBT3V2QixFQUNILEdBQUdBLEtBQWN2dkIsRUFBUyxPQUMxQkEsRUFBUyxJQUNkLEVBRUQsV0FBV0EsRUFBVSxDQUNuQixPQUFPLEtBQUssUUFBUUEsQ0FBUSxDQUM3QixFQUVELE9BQU9BLEVBQVUsQ0FHZixNQUFPLEdBQUdBLEVBQVMsUUFBUUEsRUFBUyxJQUNyQyxFQUVELE9BQU9BLEVBQVUsQ0FFZixNQUFPLEdBQUcsS0FBSyxXQUFXQSxFQUFTLE1BQU0sWUFBWUEsRUFBUyxNQUMvRCxFQUVELEdBQUdpTCxFQUFJLFNBQ1IsRUFNREEsRUFBSSxRQUFVLENBQ1osZUFBZ0IsbUJBQ2hCLEdBQUdBLEVBQUksT0FDUixFQUVHekosRUFBQUEsU0FBU3VULENBQUUsSUFDYkEsRUFBSyxTQUFTLGNBQWNBLENBQUUsR0FHaEMsTUFBTXlhLEVBQU8sS0FBSyxJQUFNQyxZQUFVLENBQ2hDLFdBQVksQ0FDVixTQUFBQyxHQUNBLGlCQUFBQyxFQUlBLEdBQUcvckIsR0FDSCxHQUFHN0IsRUFDSixFQUtELFFBQVMsQ0FDUCxJQUFBa0osRUFHQSxPQUFRLElBQU0wVSxHQUdkLE9BQVEsSUFBTSxDQUFFLEVBQ2hCLGFBQWMsSUFBTSxHQUNwQixpQkFBa0IsSUFBTSxLQUN4QixpQkFBa0IsSUFBTSxLQUN4Qix1QkFBd0IsSUFBTSxLQUM5QixnQkFBaUIsSUFBTSxLQUN2QixlQUFnQixJQUFNLEtBQ3RCLGlCQUFrQixJQUFNLEtBQ3hCLG1CQUFvQixJQUFNLEtBQzFCLGlCQUFrQixJQUFNLEtBQ3hCLGdCQUFpQixJQUFNLEtBQ3ZCLGNBQWUsSUFBTSxJQUN0QixFQUVELE9BQVEsSUFDTnJILEVBQUFBLEVBQWNvWCxHQUFVLENBQ3RCLElBQUssT0FDTCxNQUFPVCxFQUFLLFNBQVMsVUFDckIsZ0JBQWlCQyxFQUNqQixRQUFBcHZCLENBQ1YsQ0FBUyxDQUNULENBQUssRUFFRDB2QixFQUFJLElBQUlHLEVBQWtCLENBQ3hCLEtBQU0sU0FDTixjQUFlLGtCQUNyQixDQUFLLEVBSURILEVBQUksSUFDRkksZUFBYSxDQUlYLE9BQVEsQ0FDTixDQUNFLEtBQU0sWUFDTixLQUFNLFVBQ04sV0FBWSxDQUFFLENBQ2YsQ0FDRixFQUNELFFBQVNDLEVBQUFBLGlCQUFpQlosRUFBSyxJQUFJLEVBQ25DLGdCQUFpQixHQUNqQixxQkFBc0IsRUFDOUIsQ0FBTyxDQUNGLEVBRURsYSxFQUFHLFVBQVUsSUFBSSxVQUFVLEVBQzNCeWEsRUFBSSxNQUFNemEsQ0FBRSxDQUNiLENBRUQsU0FBUy9TLEVBQU1sQyxFQUFTLENBQ3RCLE9BQU95bEIsRUFBa0IsU0FBU3ZqQixFQUFNbEMsQ0FBTyxDQUNoRCxDQUNILENBRUEsTUFBTWd3QixXQUFxQixLQUFNLENBQy9CLFlBQVlwc0IsRUFBVSxDQUNwQixNQUNFLG9DQUFvQ0EsRUFBUyxXQUMzQ0EsRUFBUyxhQUVaLEVBQ0QsS0FBSyxTQUFXQSxDQUNqQixDQUNILENBRUEsZUFBZW9jLEdBQVE3VSxFQUFLLENBQzFCLElBQUEzSCxFQUNBLE9BQUFDLEVBQVMsTUFHVCxPQUFBMEIsRUFBUyxLQUNULE1BQUE1QixFQUFRNEIsR0FBVSxLQUNsQixRQUFBOHFCLEVBQVUsS0FDVixLQUFBcHhCLEVBQU8sSUFDVCxFQUFHLFNBQ0dzRyxHQUNGOHBCLEdBQ0UsMEVBQ0QsRUFHSCxNQUFNSyxFQUFXbmtCLEVBQUksU0FBUzNILENBQUcsRUFFM0JJLEVBQVcsTUFBTSxNQUFNdUgsRUFBSSxVQUFVLENBQUUsSUFBQTNILEVBQUssTUFBQUQsQ0FBSyxDQUFFLEVBQUcsQ0FDMUQsT0FBUUUsRUFBTyxZQUFhLEVBQzVCLEdBQUk1RSxHQUFRLENBQUUsS0FBTSxLQUFLLFVBQVVBLENBQUksR0FDdkMsUUFBUyxDQUNQLEdBQUl5d0IsR0FBWW5rQixFQUFJLFFBQ3BCLEdBQUc4a0IsQ0FDSixFQUNELFlBQ0VYLEtBQVl4dUIsRUFBQXFLLEVBQUksT0FBSixNQUFBckssRUFBVSxhQUNsQixVQUNBLGFBQ1YsQ0FBRyxFQU1ELElBSkk0RyxFQUFBOUQsRUFBUyxRQUFRLElBQUksY0FBYyxJQUFuQyxNQUFBOEQsRUFBc0MsU0FBUyxzQkFDakQ5RCxFQUFTLEtBQU8sTUFBTUEsRUFBUyxLQUFNLEdBR25DLENBQUNBLEVBQVMsR0FDWixNQUFNLElBQUlvc0IsR0FBYXBzQixDQUFRLEVBRWpDLE9BQU9BLENBQ1QsQ0FFQSxTQUFTMHJCLEdBQVNua0IsRUFBSzNILEVBQUssQ0FDMUIsTUFBTyxDQUFDMHNCLEVBQWEsY0FBQzFzQixDQUFHLEdBQUtBLEVBQUksV0FBVzJILEVBQUksR0FBRyxDQUN0RCxDQUVBLFNBQVNra0IsR0FBVWxrQixFQUFLLENBQUUsSUFBQTNILEVBQUssTUFBQUQsQ0FBSyxFQUFJLENBQ2pDMnNCLEVBQUFBLGNBQWMxc0IsQ0FBRyxJQUNwQkEsRUFBTTJzQixHQUFZaGxCLEVBQUksSUFBSzNILENBQUcsR0FHaEMsTUFBTTJpQixFQUFTaUssR0FBWTdzQixDQUFLLEVBQ2hDLE9BQU80aUIsRUFBUyxHQUFHM2lCLEtBQU8yaUIsSUFBVzNpQixDQUN2QyxDQUVBLFNBQVMyc0IsR0FBWUUsRUFBU0MsRUFBYSxDQUV6QyxNQUFPLEdBQUdELEVBQVEsUUFBUSxPQUFRLEVBQUUsS0FBS0MsRUFBWSxRQUFRLE9BQVEsRUFBRSxHQUN6RSxDQUVBLFNBQVNGLEdBQVk3c0IsRUFBTyxDQUMxQixNQUFNK0UsRUFBVS9FLEVBQ1pqRCxFQUFBQSxRQUFRaUQsQ0FBSyxFQUNYQSxFQUNBLE9BQU8sUUFBUUEsQ0FBSyxFQUN0QixDQUFFLEVBQ04sT0FBTyxJQUFJLGdCQUdUK0UsRUFBUSxPQUNOLENBQUNBLEVBQVMsQ0FBQ2hKLEVBQUtJLENBQUssSUFBTSxDQUN6QixVQUFXNnZCLEtBQU94dEIsVUFBUXJDLENBQUssRUFDN0I0SSxFQUFRLEtBQUssQ0FBQ2hKLEVBQUtpd0IsQ0FBRyxDQUFDLEVBRXpCLE9BQU9qbkIsQ0FDUixFQUNELENBQUUsQ0FDSCxDQUNGLEVBQUMsU0FBVSxDQUNkIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQ2LDgzXX0=
5
+ `))}const{$schema:o,...s}=t||{};return o===((d=this.schemaComponent)==null?void 0:d.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),Ia=b(qa,[["render",Ra]]),Ot={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Nt={mixins:[Oe,Ot],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return ot(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const i={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,i);const r={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(r);a(null,l)}catch(l){const{response:d}=l;if(!a(l,d)){const h=d==null?void 0:d.data,u=c.isString(h==null?void 0:h.type)?c.labelize(h.type):"Error",p=(h==null?void 0:h.message)??l;this.notify({type:"error",title:u,text:p})}}this.setLoading(!1,i)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:i,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:d=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(u,p)=>{const g=p==null?void 0:p.data;if(u){const f=this.isValidationError(p)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=c.isObject(g)?g:u;r==null||r(m),await this.emitButtonEvent(e,"error",{notify:d,error:m})}h(!1)}else a&&g&&this.setData(g),i==null||i(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),i=await e.emitEvent(t,{context:a});return o&&i===void 0&&!a.wasNotified&&o(s),i}}};function za(e){return new URL(`file:${e}`).pathname}const Aa=["data-resource"],Ua={type:"submit",disabled:""};function Ha(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),d=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(d,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ua,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,Aa)}const Wa=C.component("DitoForm",{mixins:[ft,Nt],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return re(c.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return ke(this.itemId,e)||e},breadcrumbPrefix(){return c.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=c.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];G(this.sourceSchema)&&a==="create"&&t.length--;for(let i=0,r=t.length;i<r&&e;i++){const l=t[i],d=/^:id/.test(s[i])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;i===r-1?this.sourceKey=d:e=e[d]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=c.clone(e)),e===null&&!this.isCreating&&G(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return G(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),i=a||this.resource,r=(i==null?void 0:i.method)||this.method,l=this.getPayloadData(e,r);let d;if(!a&&this.isTransient?d=await this.submitTransient(e,i,r,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${c.capitalize(h)}`:`Change ${c.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):d=await this.submitResource(e,i,r,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${c.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const u=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${u} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),d){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:za(`${this.path}/../${h}`)})}}return d},async submitTransient(e,t,o,s,{onSuccess:a,onError:i,notifySuccess:r,notifyError:l}){const d=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(d)a==null||a(),await this.emitButtonEvent(e,"success",{notify:r});else{const h="Could not submit transient item";i==null||i(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return d}}}),Lt=b(Wa,[["render",Ha]]),Pc="",Ka=C.component("DitoFormNested",{extends:Lt}),Ya={key:0,class:"dito-errors"};function Ja(e,t,o,s,a,i){return e.errors?(n.openBlock(),n.createElementBlock("div",Ya,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const Ec="",Qa=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Ga=b(Qa,[["render",Ja]]),Xa={class:"dito-scopes"},Za=["title","onClick"];function va(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Xa,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,d)=>(n.openBlock(),n.createBlock(r,{key:d,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,Za)]),_:2},1032,["to"]))),128))])}const Oc="",xa=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),er=b(xa,[["render",va]]);function tr(e,t,o,s,a,i){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const nr=C.component("DitoPagination",{components:{Pagination:xo},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),or=b(nr,[["render",tr]]),Ne={mixins:[Oe],data(){return{dragging:!1}},methods:{getSortableOptions(e=!1){return{animation:150,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:e,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let i=0;i<t.length;i++)t[i][s]=i+a}return t}}},sr=["id"],ar={key:0,class:"dito-tree-header"},rr=["innerHTML"],ir={key:1,class:"dito-tree-info"},lr={key:1,class:"dito-tree-leaf"},dr=["innerHTML"],cr={key:2,class:"dito-buttons dito-buttons-small"},hr={key:1,class:"dito-properties"};function ur(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),d=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",ar,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(u=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,rr),e.details?(n.openBlock(),n.createElementBlock("div",ir,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",lr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,dr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",cr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...u)=>e.onEdit&&e.onEdit(...u))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...u)=>e.onDelete&&e.onDelete(...u))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",hr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,u=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[u.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(u),label:e.getLabel(u)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:u,schema:u,dataPath:e.getPropertyDataPath(u),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(!0),draggable:e.childrenDraggable,"onUpdate:modelValue":t[3]||(t[3]=u=>e.childrenList=u)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(u,p)=>(n.openBlock(),n.createBlock(d,{key:e.getItemUid(e.childrenSchema,u.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,p),data:u.data,path:u.path,open:u.open,active:u.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,u.data,{index:p}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options","draggable"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,sr)}const Nc="",pr=C.component("DitoTreeItem",{mixins:[Ne],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return U(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,i)=>{const r=e.path&&`${this.path}/${e.path}/${i}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:a,path:r,open:l,active:o===r}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return L(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),mr=b(pr,[["render",ur]]),fr={class:"dito-table-head"},gr=["onClick"],br=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),yr={key:1},kr={key:0},Cr=[n.createElementVNode("span",null,null,-1)];function $r(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",fr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:d})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:d},[br,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,gr)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",yr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",kr,Cr)):n.createCommentVNode("",!0)])])}const Fc="",Br=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${c.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),Dr=b(Br,[["render",$r]]),wr=["innerHTML"];function Vr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,wr))],6)}const Sr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:L(this.dataPath,t)})):c.escapeHtml(s)}}}),Pr=b(Sr,[["render",Vr]]);var Er=Object.defineProperty,ce=Object.getOwnPropertySymbols,Ft=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,_t=(e,t,o)=>t in e?Er(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,jt=(e,t)=>{for(var o in t||(t={}))Ft.call(t,o)&&_t(e,o,t[o]);if(ce)for(var o of ce(t))Tt.call(t,o)&&_t(e,o,t[o]);return e},Or=(e,t)=>{var o={};for(var s in e)Ft.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&ce)for(var s of ce(e))t.indexOf(s)<0&&Tt.call(e,s)&&(o[s]=e[s]);return o};function Nr(e,t,o={}){let s;const a=o,{document:i=q.defaultDocument}=a,r=Or(a,["document"]),l={onUpdate:u=>{Lr(t,u.oldIndex,u.newIndex)}},d=()=>{const u=typeof e=="string"?i==null?void 0:i.querySelector(e):q.unrefElement(e);u&&(s=new Wt(u,jt(jt({},l),r)))},h=()=>s==null?void 0:s.destroy();return q.tryOnMounted(d),q.tryOnScopeDispose(h),{stop:h,start:d}}function Lr(e,t,o){const s=q.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];F.nextTick(()=>s.splice(o,0,a))}}const Fr=F.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=q.useVModel(e,"modelValue"),s=F.ref(),a=F.reactive(Nr(s,o,e.options));return()=>{if(t.default)return F.h(e.tag,{ref:s},t.default(a))}}});function Tr(e,t,o,s,a,i){const r=n.resolveComponent("UseSortable");return e.draggable?(n.openBlock(),n.createBlock(r,{key:0,tag:e.tag,modelValue:e.modelValue,options:e.options,"onUpdate:modelValue":t[0]||(t[0]=l=>e.$emit("update:modelValue",l))},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3},8,["tag","modelValue","options"])):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),{key:1},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3}))}const _r=C.component("DitoDraggable",{components:{UseSortable:Fr},emits:["update:modelValue"],props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0},draggable:{type:Boolean,default:!0}}}),jr=b(_r,[["render",Tr]]);function Mt({vnode:e}){return e}Mt.props={vnode:{type:Object,required:!0}};const Mr=C.component("DitoVnode",Mt),Rr=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:_s,DitoButtons:Da,DitoClipboard:Ia,DitoContainer:aa,DitoCreateButton:Ta,DitoDialog:wt,DitoDraggable:jr,DitoEditButtons:Sa,DitoElement:Rs,DitoErrors:Ga,DitoForm:Lt,DitoFormNested:Ka,DitoHeader:Os,DitoLabel:As,DitoMenu:Bs,DitoPagination:or,DitoPane:ta,DitoPanel:pa,DitoPanels:ba,DitoRoot:Ee,DitoSchema:Ys,DitoSchemaInlined:Gs,DitoScopes:er,DitoTableCell:Pr,DitoTableHead:Dr,DitoTabs:da,DitoTreeItem:mr,DitoVNode:Mr,DitoView:gt},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[K],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,alignBottom:!0,omitPadding:!1,component:C.component,get:te,register(e,t={}){e=c.asArray(e);const o=this.component(`DitoType${c.camelize(e[0],!0)}`,t);for(const s of e)_n(s,o);return o}},qr=["id","type","title"];function Ir(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",e.buttonClass],id:e.dataPath,ref:"element",type:e.type,title:e.text},e.attributes),n.toDisplayString(e.text),17,qr)}const zr=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]},buttonClass(){return this.verb?`dito-button-${this.verb}`:null},text:y("text",{type:String,get(e){return e||c.labelize(this.verb)}}),closeForm:y("closeForm",{type:Boolean,default:!1})},methods:{getEvents(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}},async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Ie(this.schema)&&await this.submit()}}}),Ar=b(zr,[["render",Ir]]),Ur=["id"];function Hr(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,Ur)),[[n.vModelCheckbox,e.value]])}const Tc="",Wr=D.register("checkbox",{nativeField:!0}),Kr=b(Wr,[["render",Hr]]),Rt={mixins:[Ot],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,d;c.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:i=null}=e;const r=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((d=r.dependencyFunction)==null||d.call(r,this.context),r.resolveCounter>0){const{resolvedData:h}=r;return--r.resolveCounter===0&&(r.resolvedData=null),h}if(r.resolving)a=null;else if(a){if(c.isFunction(a)){const h=a(this.context);c.isFunction(h)?(r.dependencyFunction=a,a=h(this.context)):a=h}c.isPromise(a)&&(r.resolving=!0,this.resolveData(a,s).then(h=>{r.resolveCounter=o,r.resolvedData=h,r.resolving=!1}),a=null)}else i&&(a=c.getValueAtDataPath(this.rootData,c.normalizeDataPath(`${this.dataPath}/${i}`)));return a},async resolveData(e,t={}){this.setLoading(!0,t);let o=null;try{o=await(c.isFunction(e)?e():e)}catch(s){this.addError(s.message||s)}return this.setLoading(!1,t),o}}},he={mixins:[Rt],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=c.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||Bn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=c.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!c.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=c.isFunction(e)?{filter:e}:e;return o?c.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return c.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||$n(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let i=t[a];return i||(i=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(i)),i.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const i of o)if(a){const r=t(i.options,s,null);if(r)return r}else if(s===this.getValueForOption(i))return i};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):c.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const i=(a=e.options)==null?void 0:a.dataPath,r=i?c.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,r,e),r&&s.setSourceRelated(r);const l=d=>d&&{id:d.id};t=c.isArray(t)?t.map(l):l(t)}return t}},Yr=["id"],Jr=["value"];function Qr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},e.attributes),null,16,Jr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,Yr)}const _c="",Gr=D.register("checkboxes",{mixins:[he],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Xr=b(Gr,[["render",Qr]]),Zr=["id"];function vr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,Zr)}const jc="",xr=D.register("code",{mixins:[v],alignBottom:!1,computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Kt(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},i=()=>this.onFocus(),r=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:i,blur:r});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},d=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:d(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),ei=b(xr,[["render",vr]]),ti=["id"],ni={key:0,class:"dito-color-preview dito-inherit-focus"},oi=["disabled"];function si(e,t,o,s,a,i){const r=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=d=>e.showPopup=d),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=d=>e.hexValue=d),type:"input",size:"8"},e.attributes),null,16,ti),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",ni,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...d)=>e.clear&&e.clear(...d),["stop"]))},null,8,oi)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(r,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=d=>e.colorValue=d),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const Mc="",ai=D.register("color",{components:{Trigger:Pe,SketchPicker:Yt.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=ue(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=ue(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=ue(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),ri=b(ai,[["render",si]]);function ii(e,t,o,s,a,i){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const li=D.register("component",{defaultValue:()=>{},alignBottom:!1,ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await se(t)}}),di=b(li,[["render",ii]]),ci=["id","name","value","disabled"];function hi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,ci)}const ui=D.register(["computed","data","hidden"],{mixins:[Rt],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return K.computed.value.get.call(this)},set(e){K.computed.value.set.call(this,e)}}}}),pi=b(ui,[["render",hi]]),mi={class:"dito-date"};function fi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",mi,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=r=>e.dateValue=r),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const gi=D.register(["date","datetime","time"],{components:{DatePicker:kt,TimePicker:$t,DateTimePicker:Wo},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return c.isDate(t)?t.toISOString():t}}),bi=b(gi,[["render",fi]]),W={mixins:[Nt,pt],defaultValue(e){return X(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,unwrappingPrimitives:!1,ignoreRouteChange:!1}},computed:{sourceComponent(){return this},isObjectSource(){return G(this.type)},isListSource(){return X(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:Ce("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},c.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:Ce("total"),columns(){return U(this.schema.columns)},scopes(){return U(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=c.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(Q(this.schema,this.context))},view(){return Ze(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return re(this.schema.buttons)},isCompact(){return this.forms.every(xe)},isInlined(){return we(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&c.isArray(e)||this.isObjectSource&&c.isObject(e)?this.value=e:this.unwrapListData(e)||c.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&c.isObject(e)&&c.isNumber(e.total)&&c.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),i=ke(a,this.resource);i&&this.handleRequest({method:"delete",resource:i},r=>{r||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?c.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&c.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const i=s.getComponentsByDataPath(e);if(i.length>0&&((t==null?void 0:t(i))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o((t==null?void 0:t([l]))??!0)},i=c.parseDataPath(e);for(;i.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(c.normalizeDataPath(i))),{matched:l}=this.$router.match(r);l.length&&(this.$route.path===r?a():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(a)})),i.pop()}o(!1)})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){Je(e,t,o);const d=we(t);if(d&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,u={api:e,schema:t},p={...u,flatten:r,nested:i,param:h},g=await Un(e,t,a);if(l&&await l(g,a+1),I(t)&&!d){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,X(t)&&h),component:C.component(i?"DitoFormNested":"DitoForm"),meta:p};G(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:u});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:r}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Le={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",options:c.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,width:"40%"}:null,text:{type:"text",width:e.operators?"60%":"fill"}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"50%",dateFormat:e},to:{type:"datetime",width:"50%",dateFormat:e}}}};function yi(e,t,o){const s={type:"panel",label:"Filters",name:"$filters",target:t,disabled:!1,data(){return $i(s,o.query)},components:ki(e),buttons:{clear:{text:"Clear",events:{click({schemaComponent:a}){a.resetData(),a.applyFilters()}}},filter:{type:"submit",text:"Filter",events:{click({schemaComponent:a}){a.applyFilters()}}}},methods:{applyFilters(){o.query={...o.query,filter:Ci(this.schema,this.data),page:void 0}}}};return s}function ki(e){var o;const t={};for(const s of Object.values(e||{})){const{filter:a,...i}=s,r=a?(o=Le[a])==null?void 0:o.call(Le,s):s.components;if(r){i.type="form",i.components={};for(const[l,d]of Object.entries(r))if(d){const h=d.label||c.labelize(d.name||l);i.components[l]={...d,label:!1,placeholder:h}}t[s.name]={label:i.label,type:"object",default:()=>({}),form:i,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function qt(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function Ci(e,t){const o=[];for(const s in t){const a=t[s];if(a){const i=Object.keys(qt(e,s)).map(r=>a[r]??null);i.some(r=>r!==null)&&o.push(`${s}:${i.map(JSON.stringify).join(",")}`)}}return o.length?o:void 0}function $i(e,t){const o={};if(t)for(const a of c.asArray(t.filter)){const[,i,r]=a.match(/^(\w+):(.*)$/);try{o[i]=c.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const a in e.components){const i={},r=o[a];if(r){const l=qt(e,a);if(l){let d=0;for(const h in l)i[h]=r[d++]}}s[a]=i}return s}const Bi=["id"],Di={key:0,class:"dito-navigation"},wi={key:1,class:"dito-spacer"},Vi=["id"],Si={key:1},Pi=["innerHTML"],Ei=["innerHTML"],Oi={key:2,class:"dito-cell-edit-buttons"},Ni={key:1},Li=["colspan"];function Fi(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),d=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),u=n.resolveComponent("DitoSchemaInlined"),p=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("DitoDraggable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",Di,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",wi)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(d,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(!1),draggable:e.draggable,"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",Si,[e.isInlined?(n.openBlock(),n.createBlock(u,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,Pi)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,Ei))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",Oi,[n.createVNode(p,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,Vi))),128))]),_:1},8,["modelValue","options","draggable"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Ni,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(p,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,Li)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,Bi)):n.createCommentVNode("",!0)}const Rc="",Ti=D.register("list",{mixins:[W,Ne],alignBottom:!1,getSourceType(e){return e},getPanelSchema(e,t,o){const{filters:s}=e;if(s){const a=()=>o.getComponentByDataPath(t,i=>i.type==="list");return yi(U(s),t,{get query(){var i;return(i=a())==null?void 0:i.query},set query(i){const r=a();if(r){const l=d=>c.pickBy(d,h=>h!==void 0);c.equals(l(i),l(r.query))||(r.query=i,r.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return L(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=Yn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${c.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=L(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([se(t),Ye(t.columns),W.processSchema(e,t,o,s,a,i,r,l)])}}),_i=b(Ti,[["render",Fi]]);function ji(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const qc="",Mi=D.register("label",{excludeValue:!0,generateLabel:!1,alignBottom:!1}),Ri=b(Mi,[["render",ji]]),qi=["id"],Ii=["editor"],zi={key:0,class:"dito-buttons dito-buttons-toolbar"},Ai={class:"dito-button-group"},Ui=["onClick"];function Hi(e,t,o,s,a,i){const r=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",zi,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,d=>(n.openBlock(),n.createElementBlock("div",Ai,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d,({name:h,icon:u,isActive:p,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":p}]),key:h,onClick:g},[n.createVNode(r,{name:u},null,8,["name"])],10,Ui))),128))]))),256))])):n.createCommentVNode("",!0)],8,Ii),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...d)=>e.onDragResize&&e.onDragResize(...d),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,qi)}const Ic="",Wi=D.register("markup",{mixins:[v],components:{EditorContent:x.EditorContent,Icon:Yo},alignBottom:!1,data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return c.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},i=c.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),r=({editor:l})=>{i(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new x.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:r,extensions:this.getExtensions(),content:this.value||""})},beforeUnmount(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},i=this.domOn(document,{mousemove:a,mouseup(r){a(r),i.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:x.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Jt.Document,Qt.Text,an.Paragraph,e.bold&&Gt.Bold,e.italic&&Zt.Italic,e.underline&&en.Underline,e.strike&&xt.Strike,e.small&&Ki,e.code&&Xt.Code,e.link&&Yi,t.blockquote&&tn.Blockquote,t.codeBlock&&nn.CodeBlock,on.HardBreak,t.heading&&sn.Heading.configure({levels:t.heading}),t.horizontalRule&&rn.HorizontalRule,(t.orderedList||t.bulletList)&&cn.ListItem,t.bulletList&&dn.BulletList,t.orderedList&&ln.OrderedList,o.history&&hn.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:i,icon:r,attributes:l,ignoreActive:d,onClick:h})=>{o.push({name:i,icon:r,isActive:this.editor.isActive(i,l)&&(d==null||!d()),onClick:()=>{const u=`toggle${c.camelize(i,!0)}`;this.editor.commands[u]&&(h?h(this.editor,l):(g=>this.editor.chain()[u](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[i,r]of Object.entries(t)){const l=["undo","redo"].includes(i)?"history":i,d=a[l],h=c.underscore(i),u=c.hyphenate(i);if(d){if(r===!0)s({name:h,icon:u});else if(c.isObject(r)){const{attribute:p,values:g,ignoreActive:f,onClick:m}=r;if(p){if(c.isArray(g)&&c.isArray(d))for(const k of g)d.includes(k)&&s({name:h,icon:`${u}-${k}`,attributes:{[p]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:u,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),Ki=x.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Yi=vt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Ji=b(Wi,[["render",Hi]]),Qi=["disabled"];function Gi(e,t,o,s,a,i){const r=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(r,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),class:{"multiselect--show-highlight":e.showHighlight},showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Qi)):n.createCommentVNode("",!0)],2)}const zc="",Xi=D.register("multiselect",{mixins:[he],components:{VueMultiselect:un},data(){return{isMounted:!1,searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return c.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.isMounted=!0,this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||K.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),Zi=b(Xi,[["render",Gi]]),Fe={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){c.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:i}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(i){const r=(`${i}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}};function vi(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["id","modelValue","min","max","step"])}const Ac="",xi=D.register(["number","integer"],{mixins:[Fe],components:{InputField:Z},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),el=b(xi,[["render",vi]]),tl=["id"],nl={key:0,class:"dito-object-content"},ol=["innerHTML"],sl=["innerHTML"];function al(e,t,o,s,a,i){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",nl,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,ol)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,sl))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,tl)):n.createCommentVNode("",!0)}const Uc="",rl=D.register("object",{mixins:[W],alignBottom:!1,getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([se(t),W.processSchema(e,t,o,s,a,i,r,l)])}}),il=b(rl,[["render",al]]),ll=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,alignBottom:!1,omitPadding:!0,getPanelSchema(e){const{name:t,...o}=e;return o}}),dl=["id","value","max"];function cl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,dl)}const hl=D.register("progress",{mixins:[Fe],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),ul=b(hl,[["render",cl]]),pl=["id"],ml=["value"];function fl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},e.attributes),null,16,ml),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,pl)}const Hc="",gl=D.register("radio",{mixins:[he],nativeField:!0}),bl=b(gl,[["render",fl]]);function yl(e,t,o,s,a,i){const r=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(r,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const Wc="",kl=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,alignBottom:!1,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:De},async processSchema(e,t,o,s,a){await Y(e,t,s,a)}}),Cl=b(kl,[["render",yl]]),$l={class:"dito-select"},Bl=["id"],Dl=["label"],wl=["value"],Vl=["value"],Sl=["value"],Pl=["disabled"];function El(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",$l,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.selectedValue=r)},e.attributes,{onMousedown:t[1]||(t[1]=r=>e.populate=!0),onFocus:t[2]||(t[2]=r=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:r[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,wl))),256))],8,Dl)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(r)},n.toDisplayString(e.getLabelForOption(r)),9,Vl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,Sl)):n.createCommentVNode("",!0)],16,Bl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...r)=>e.clear&&e.clear(...r))},null,8,Pl)):n.createCommentVNode("",!0)])}const Kc="",Ol=D.register("select",{mixins:[he],nativeField:!0,data(){return{populate:!0}}}),Nl=b(Ol,[["render",El]]),Ll={class:"dito-slider"},Fl=["id","min","max","step"];function Tl(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",Ll,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,Fl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Yc="",_l=D.register("slider",{mixins:[Fe],components:{InputField:Z},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),jl=b(_l,[["render",Tl]]);function Ml(e,t,o,s,a,i){const r=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Jc="",Rl=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:as},computed:{labels(){return this.schema.labels}}}),ql=b(Rl,[["render",Ml]]);function Il(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:e.inputType},e.attributes),null,16,["id","modelValue","type"])}const zl="****************",Al=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:Z},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?zl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Ul=b(Al,[["render",Il]]),Hl=["id","rows"];function Wl(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,Hl)),[[n.vModelText,e.value]])}const Qc="",Kl=D.register("textarea",{nativeField:!0,textField:!0,alignBottom:!1,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Yl=b(Kl,[["render",Wl]]),Jl={class:"dito-tree-list"},Ql={class:"dito-tree-panel"},Gl={key:0,class:"dito-tree-form-container"};function Xl(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),d=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Jl,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Ql,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",Gl,[n.createVNode(d)])):n.createCommentVNode("",!0)])])}const Gc="",Zl=D.register(["tree-list","tree-object"],{mixins:[W],alignBottom:!1,provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>I(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,i=!0,r=!1,l=null){await Promise.all([Ye(t.properties),W.processSchema(e,t,o,s,a,i,r,(d,h)=>{const{children:u}=t;if(u)return u.type="tree-list",this.processSchema(e,u,u.name,d,h,i,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return Q(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),vl=b(Zl,[["render",Xl]]);function It(e){return mn.filesize(e,{base:10})}const xl={class:"dito-upload"},ed={class:"dito-table dito-table-separators dito-table-background"},td=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),nd=["innerHTML"],od={class:"dito-cell-edit-buttons"},sd={class:"dito-buttons dito-buttons-round"},ad=["onClick"],rd={colspan:4},id={class:"dito-upload-footer"},ld=["value"],dd={class:"dito-buttons dito-buttons-round"};function cd(e,t,o,s,a,i){const r=n.resolveComponent("DitoDraggable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",xl,[n.createElementVNode("table",ed,[td,n.createVNode(r,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=d=>e.files=d),tag:"tbody",options:e.getSortableOptions(!1),draggable:e.draggable},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(d,h)=>(n.openBlock(),n.createElementBlock("tr",{key:d.key},[n.createElementVNode("td",{innerHTML:e.renderFile(d,h)},null,8,nd),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(d.size)),1),n.createElementVNode("td",null,[d.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(d.upload.error),1)],64)):d.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):d.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",od,[n.createElementVNode("div",sd,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(d,h)}),null,16,ad)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options","draggable"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",rd,[n.createElementVNode("div",id,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,ld)):n.createCommentVNode("",!0),n.createElementVNode("div",dd,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(d=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(d=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=d=>e.uploads=d),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const Xc="",hd=D.register("upload",{mixins:[Ne],components:{VueUpload:fn},alignBottom:!1,data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return zt(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return c.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?pn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:It,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:L(this.dataPath,t)})):c.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${It(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=zt(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function zt(e){return e?c.asArray(e):[]}const ud=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:di,DitoTypeButton:Ar,DitoTypeCheckbox:Kr,DitoTypeCheckboxes:Xr,DitoTypeCode:ei,DitoTypeColor:ri,DitoTypeComputed:pi,DitoTypeDate:bi,DitoTypeLabel:Ri,DitoTypeList:_i,DitoTypeMarkup:Ji,DitoTypeMultiselect:Zi,DitoTypeNumber:el,DitoTypeObject:il,DitoTypePanel:ll,DitoTypeProgress:ul,DitoTypeRadio:bl,DitoTypeSection:Cl,DitoTypeSelect:Nl,DitoTypeSlider:jl,DitoTypeSwitch:ql,DitoTypeText:Ul,DitoTypeTextarea:Yl,DitoTypeTreeList:vl,DitoTypeUpload:b(hd,[["render",cd]])},Symbol.toStringTag,{value:"Module"})),At=new Set;function pd(e){At.has(e)||(At.add(e),console.warn(e))}const md=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","close","closed","cancel","cancelled","drag","dragged"].reduce((e,t)=>(e[t]=t,e),{});class fd{constructor(t,{dito:o={},api:s,views:a={},...i}={}){this.el=t,this.api=s=c.merge({base:"/"},o.api,s),this.options=i,s.locale||(s.locale="en-US"),s.formats=c.merge({},c.defaultFormats,s.formats),s.request||(s.request=d=>bd(s,d)),s.getApiUrl||(s.getApiUrl=d=>kd(s,d)),s.isApiUrl||(s.isApiUrl=d=>yd(s,d)),s.normalizePath||(s.normalizePath=s.normalizePaths?c.hyphenate:d=>d),s.denormalizePath||(s.denormalizePath=s.normalizePaths?c.camelize:d=>d),s.defaults||(s.defaults={});const r=T(s.users,{type:"collection"})||{};r.login=T(r.login||"login",{method:"post",parent:r}),r.logout=T(r.logout||"logout",{method:"post",parent:r}),r.session=T(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(d){const h=this[d==null?void 0:d.type]||this.default;return d&&h.call(this,d)},default(d){const h=this.any(d.parent);return h?`${h}/${d.path}`:d.path},collection(d){return this.default(d)},member(d){return`${d.path}/${d.id}`},upload(d){return`${this.collection(d.parent)}/upload/${d.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},c.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Ee,VueNotifications:R,...Rr,...ud},provide:{api:s,$verbs:()=>md,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Ee,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:i})});l.use(R,{name:"notify",componentName:"VueNotifications"}),l.use(N.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:N.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class gd extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function bd(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:i=null,data:r=null}){var h,u;s&&pd("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),d=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...r&&{body:JSON.stringify(r)},headers:{...l&&e.headers,...i},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((u=d.headers.get("Content-Type"))!=null&&u.includes("application/json")&&(d.data=await d.json()),!d.ok)throw new gd(d);return d}function yd(e,t){return!c.isAbsoluteUrl(t)||t.startsWith(e.url)}function kd(e,{url:t,query:o}){c.isAbsoluteUrl(t)||(t=Cd(e.url,t));const s=$d(o);return s?`${t}?${s}`:t}function Cd(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}function $d(e){const t=e?c.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const i of c.asArray(a))o.push([s,i]);return o},[])).toString()}return fd});
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVHJlZUl0ZW0udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYmxlSGVhZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVDZWxsLnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQubWpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0RyYWdnYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVk5vZGUudnVlIiwiLi4vc3JjL0RpdG9UeXBlQ29tcG9uZW50LmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQnV0dG9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNoZWNrYm94LnZ1ZSIsIi4uL3NyYy9taXhpbnMvRGF0YU1peGluLmpzIiwiLi4vc3JjL21peGlucy9PcHRpb25zTWl4aW4uanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveGVzLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvZGUudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29sb3IudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29tcG9uZW50LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXB1dGVkLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZURhdGUudnVlIiwiLi4vc3JjL21peGlucy9Tb3VyY2VNaXhpbi5qcyIsIi4uL3NyYy91dGlscy9maWx0ZXIuanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMaXN0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUxhYmVsLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU1hcmt1cC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNdWx0aXNlbGVjdC52dWUiLCIuLi9zcmMvbWl4aW5zL051bWJlck1peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTnVtYmVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU9iamVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQYW5lbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQcm9ncmVzcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVSYWRpby52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWN0aW9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVNlbGVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTbGlkZXIudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU3dpdGNoLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHQudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVGV4dGFyZWEudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVHJlZUxpc3QudnVlIiwiLi4vc3JjL3V0aWxzL3VuaXRzLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVXBsb2FkLnZ1ZSIsIi4uL3NyYy91dGlscy9kZXByZWNhdGUuanMiLCIuLi9zcmMvdmVyYnMuanMiLCIuLi9zcmMvRGl0b0FkbWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCByZWFjdGl2ZSh7XG4gIHRpdGxlOiAnJyxcbiAgcm91dGVDb21wb25lbnRzOiBbXSxcbiAgdXNlcjogbnVsbCxcbiAgbG9hZENhY2hlOiB7fSwgLy8gU2VlIFR5cGVNaXhpbi5sb2FkKClcbiAgYWN0aXZlTGFiZWw6IG51bGwsXG4gIGNsaXBib2FyZERhdGE6IG51bGxcbn0pXG4iLCJpbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCB0b2tlbikge1xuICByZXR1cm4gZGF0YVBhdGhcbiAgICA/IGAke2RhdGFQYXRofS8ke3Rva2VufWBcbiAgICA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICBwYXRoPy5wb3AoKVxuICByZXR1cm4gcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBuZXN0ZWQgPyBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSA6IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgaWYgKHBhdGgpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCB0b2tlbi4gSWYgaXQncyBhIG51bWJlciwgdGhlbiB3ZSdyZSBkZWFsaW5nIHdpdGggYW5cbiAgICAvLyBhcnJheSBhbmQgbmVlZCB0byByZW1vdmUgbW9yZSB0b2tlbnMgdW50aWwgd2UgbWVldCB0aGUgYWN0dWFsIHBhcmVudDpcbiAgICBsZXQgdG9rZW5cbiAgICBkbyB7XG4gICAgICB0b2tlbiA9IHBhdGgucG9wKClcbiAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIGlzSW50ZWdlcigrdG9rZW4pKVxuICAgIC8vIElmIHRoZSByZW1vdmVkIHRva2VuIGlzIHZhbGlkLCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGF0YTpcbiAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtKHJvb3RJdGVtLCBkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIHJldHVybiBwYXRoID8gZ2V0VmFsdWVBdERhdGFQYXRoKHJvb3RJdGVtLCBwYXRoKSA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICByZXR1cm4gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhOYW1lKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0TGFzdERhdGFQYXRoVG9rZW4oZGF0YVBhdGgpXG4gIHJldHVybiB0b2tlbiA9PSBudWxsIHx8IGlzSW50ZWdlcigrdG9rZW4pID8gbnVsbCA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhJbmRleChkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICBjb25zdCBpbmRleCA9IHRva2VuID09IG51bGwgPyBudWxsIDogK3Rva2VuXG4gIHJldHVybiBpc0ludGVnZXIoaW5kZXgpID8gaW5kZXggOiBudWxsXG59XG5cbmxldCB0ZW1wb3JhcnlJZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBzZXRUZW1wb3JhcnlJZChkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGlkcyBhcmUgbWFya2VkIHdpdGggYSAnQCcgYXQgdGhlIGJlZ2lubmluZy5cbiAgZGF0YVtpZEtleV0gPSBgQCR7Kyt0ZW1wb3JhcnlJZH1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBvcmFyeUlkKGlkKSB7XG4gIHJldHVybiAvXkAvLnRlc3QoaWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZmVyZW5jZShkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFuIG9iamVjdCB0aGF0IGhvbGRzIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGlkLlxuICByZXR1cm4gZGF0YT8uW2lkS2V5XSAhPSBudWxsICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMVxufVxuIiwiaW1wb3J0IHsgdG9SYXcgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7XG4gIGdldEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbURhdGFQYXRoLFxuICBnZXRQYXJlbnRJdGVtLFxuICBnZXRJdGVtLFxuICBnZXRMYXN0RGF0YVBhdGhOYW1lLFxuICBnZXRMYXN0RGF0YVBhdGhJbmRleFxufSBmcm9tICcuL3V0aWxzL2RhdGEuanMnXG5cbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGVcblxuLy8gYERpdG9Db250ZXh0YCBpbnN0YW5jZXMgYXJlIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCByYXcgYGNvbnRleHRgIG9iamVjdHMsXG4vLyB3aGljaCB0aGVtc2VsdmVzIGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgbGlua2VkIGBjb21wb25lbnRgIGluc3RhbmNlLCBzb1xuLy8gdGhhdCB0aGV5IG9ubHkgbmVlZCB0byBwcm92aWRlIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZGlmZmVyZW50IHRoYW5cbi8vIGluIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudC4gSW4gb3JkZXIgdG8gbm90IGV4cG9zZSBhbGwgZmllbGRzIGZyb20gdGhlXG4vLyBjb21wb25lbnQsIHRoZSB3cmFwcGVyIGlzIGludHJvZHVjZWQ6XG4vLyBVc2UgV2Vha01hcCBmb3IgdGhlIHJhdyBgY29udGV4dGAgb2JqZWN0cywgc28gd2UgZG9uJ3QgaGF2ZSB0byBwb2xsdXRlIHRoZVxuLy8gYWN0dWFsIGBEaXRvQ29udGV4dGAgaW5zdGFuY2Ugd2l0aCBpdC5cbmNvbnN0IGNvbnRleHRzID0gbmV3IFdlYWtNYXAoKVxuXG5mdW5jdGlvbiBnZXQoY29udGV4dCwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3Qgb2JqZWN0ID0gY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVxuICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldXG4gIC8vIElmIGBvYmplY3RgIGV4cGxpY2l0bHkgc2V0cyB0aGUga2V5IHRvIGB1bmRlZmluZWRgLCByZXR1cm4gaXQuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgICA/IGRlZmF1bHRWYWx1ZSgpXG4gICAgICA6IGRlZmF1bHRWYWx1ZVxufVxuXG5mdW5jdGlvbiBzZXQoY29udGV4dCwga2V5LCB2YWx1ZSkge1xuICBjb250ZXh0cy5nZXQodG9SYXcoY29udGV4dCkpW2tleV0gPSB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCwgY29udGV4dCkge1xuICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyYW1zIG9iamVjdCAvIGZ1bmN0aW9uLCBvciBjcmVhdGUgYSBuZXcgb25lOlxuICAgIGNvbnRleHQgPSBjb250ZXh0XG4gICAgICA/IGlzRnVuY3Rpb24oY29udGV4dClcbiAgICAgICAgPyBjb250ZXh0KClcbiAgICAgICAgOiB7IC4uLmNvbnRleHQgfVxuICAgICAgOiB7fVxuICAgIC8vIElmIG5vdCBleHBsaWNpdGx5IHNldCAodG8gZmFsc2UpLCBkZWZhdWx0IHRvIHRydWUgc28gd2UgZG9uJ3QgZmFsbCBiYWNrXG4gICAgLy8gdG8gYGNvbXBvbmVudGAgZm9yIGl0cyB2YWx1ZS5cbiAgICBjb250ZXh0Lm5lc3RlZCA/Pz0gdHJ1ZVxuICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50XG4gICAgLy8gSGF2ZSBgb2JqZWN0YCBpbmhlcml0IGZyb20gdGhlIGBjb21wb25lbnRgIGluc3RhbmNlLCBzbyBpdCBjYW4gb3ZlcnJpZGVcbiAgICAvLyBpdHMgdmFsdWVzIGFuZCBzdGlsbCByZXRyaWV2ZSBmcm9tIGl0LCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYHRoaXNgXG4gICAgLy8gdGhyb3VnaCBgY29udGV4dHNgIG1hcDpcbiAgICBjb25zdCBvYmplY3QgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoY29udGV4dCwgY29tcG9uZW50KVxuICAgIC8vIE5vIG5lZWQgZm9yIGB0b1Jhdyh0aGlzKWAgaGVyZSBhcyBpdCdzIGFsd2F5cyByYXcgaW5zaWRlIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb250ZXh0cy5zZXQodGhpcywgb2JqZWN0KVxuICB9XG5cbiAgc3RhdGljIGdldChjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIERpdG9Db250ZXh0XG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogbmV3IERpdG9Db250ZXh0KGNvbXBvbmVudCwgY29udGV4dClcbiAgfVxuXG4gIC8vIGBuZXN0ZWRgIGlzIGB0cnVlYCB3aGVuIHRoZSBkYXRhLXBhdGggcG9pbnRzIGEgdmFsdWUgaW5zaWRlIGFuIGl0ZW0sIGFuZFxuICAvLyBgZmFsc2VgIHdoZW4gaXQgcG9pbnRzIHRvIHRoZSBpdGVtIGl0c2VsZi5cbiAgZ2V0IG5lc3RlZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduZXN0ZWQnLCB0cnVlKVxuICB9XG5cbiAgZ2V0IHNjaGVtYSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZhbHVlJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IGRhdGFQYXRoKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RhdGFQYXRoJywgJycpXG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduYW1lJywgKCkgPT4gZ2V0TGFzdERhdGFQYXRoTmFtZSh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpbmRleCcsICgpID0+IGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuZGF0YVBhdGgpKVxuICB9XG5cbiAgZ2V0IGl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0UGFyZW50SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IGl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5pdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgcGFyZW50SXRlbUluZGV4KCkge1xuICAgIHJldHVybiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLnBhcmVudEl0ZW1EYXRhUGF0aClcbiAgfVxuXG4gIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAvLyBJZiBgZGF0YWAgaXNuJ3QgcHJvdmlkZWQsIHdlIGNhbiBkZXRlcm1pbmUgaXQgZnJvbSByb290RGF0YSAmIGRhdGFQYXRoOlxuICBnZXQgaXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhJywgKCkgPT5cbiAgICAgIGdldEl0ZW0odGhpcy5yb290SXRlbSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgKVxuICB9XG5cbiAgLy8gTk9URTogYHBhcmVudEl0ZW1gIGlzbid0IHRoZSBjbG9zZXN0IGRhdGEgcGFyZW50IHRvIGBpdGVtYCwgaXQncyB0aGVcbiAgLy8gY2xvc2VzdCBwYXJlbnQgdGhhdCBpc24ndCBhbiBhcnJheSwgZS5nLiBmb3IgcmVsYXRpb25zIG9yIG5lc3RlZCBKU09OIGRhdGEuXG4gIC8vIFRoaXMgaXMgd2h5IHRoZSB0ZXJtIGBpdGVtYCB3YXMgY2hvc2VuIG92ZXIgYGRhdGFgLCBlLmcuIFZTIHRoZSB1c2Ugb2ZcbiAgLy8gYHBhcmVudERhdGFgIGluIHNlcnZlci1zaWRlZCB2YWxpZGF0aW9uLCB3aGljaCBpcyB0aGUgY2xvc2VzdCBwYXJlbnQuIElmXG4gIC8vIG5lZWRlZCwgd2UgY291bGQgZXhwb3NlIHRoaXMgZGF0YSBoZXJlIHRvbywgYXMgd2UgY2FuIGRvIGFsbCBzb3J0cyBvZiBkYXRhXG4gIC8vIHByb2Nlc3Npbmcgd2l0aCBgcm9vdERhdGFgIGFuZCBgZGF0YVBhdGhgLlxuICBnZXQgcGFyZW50SXRlbSgpIHtcbiAgICBjb25zdCBpdGVtID0gKFxuICAgICAgZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZCkgfHxcbiAgICAgIG51bGxcbiAgICApXG4gICAgcmV0dXJuIGl0ZW0gIT09IHRoaXMuaXRlbSA/IGl0ZW0gOiBudWxsXG4gIH1cblxuICBnZXQgcm9vdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncm9vdERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvY2Vzc2VkRGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjbGlwYm9hcmREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3VzZXInLCBudWxsKVxuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdhcGknLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdzKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdzJywgbnVsbClcbiAgfVxuXG4gIGdldCBpdGVtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaXRlbUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZm9ybUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIC8vIE5PVEU6IExpa2UgJ29wdGlvbnMnLCB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgZG9lc24ndCBhbHdheXMgZXhpc3QsIGUuZy5cbiAgLy8gaW4gbmVzdGVkIGZvcm1zIGR1cmluZyBgcHJvY2Vzc0RhdGEoKWAuIEJ1dCBgc2NoZW1hYCBpcyBndWFyYW50ZWVkIHRvXG4gIC8vIGFsd2F5cyBiZSBhdmFpbGFibGUuXG4gIGdldCBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnY29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBgY29tcG9uZW50U2NoZW1hYCBnZXR0ZXIgZm9yIHRoZSBzY2hlbWEgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LFxuICAvLyBldmVuIHdoZW4gdGhlIGNvbXBvbmVudCBpc24ndCBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIENvbnNpZGVyIGFkZGluZ1xuICAvLyBgc291cmNlU2NoZW1hYCBhcyB3ZWxsP1xuXG4gIC8vIFRPRE86IEZpeCB1bmNsZWFyIG5hbWluZzogV2hpY2ggc2NoZW1hIGlzIHRoaXMsIHRoYXQgb2YgdGhlIGNvbXBvbmVudCBvciBvZlxuICAvLyBpdHMgcGFyZW50PyBJc24ndCBleHBvc2luZyBgZm9ybUNvbXBvbmVudGAgYW5kIGB2aWV3Q29tcG9uZW50YCBlbm91Z2gsIG9uY2VcbiAgLy8gd2Ugb2ZmZXIgYWNjZXNzIHRvIHRoZWlyIGNvbXBvbmVudHMgdGhlcmUgdGhyb3VnaCBgZ2V0Q29tcG9uZW50KClgICYgY28uIG9uXG4gIC8vIGBEaXRvTWl4aW5gIHBlcmhhcHM/ICBBbHNvLCB0aGVyZSBjb3VsZCBiZSBhIGB0YWJDb21wb25lbnRgIGdldHRlciBmb3JcbiAgLy8gc2NoZW1hcyBpbiB0YWJzP1xuICBnZXQgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NjaGVtYUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCB2aWV3Q29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkaWFsb2dDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHBhbmVsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3BhbmVsQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBXaGVuIHVzZWQgaW4gT3B0aW9uc01peGluIGZvciBgc2NoZW1hLm9wdGlvbnMudmFsdWUoKWAsXG4gIC8vIGBzY2hlbWEub3B0aW9ucy5sYWJlbCgpYCBhbmQgIGBzY2hlbWEuc2VhcmNoLmZpbHRlcigpYCBjYWxsYmFja3M6XG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9uJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9ucycsIHVuZGVmaW5lZClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbmFtZSB0aGlzIHRvIGBzZWFyY2hUZXJtYCBvciBgc2VhcmNoUXVlcnlgLCB0byBwZXJoYXBzIGZyZWUgYHF1ZXJ5YFxuICAvLyBmb3IgdGhlIGFjdHVhbCBgcmVzb3VyY2VDb21wb25lbnQucXVlcnlgIG9iamVjdD9cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3F1ZXJ5JywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSBjb250ZXh0IG9mIGJ1dHRvbnMgdGhhdCBzZW5kXG4gIC8vIHJlcXVlc3RzLCBzZWUgYFJlc291cmNlTWl4aW4uZW1pdEJ1dHRvbkV2ZW50KClgOlxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3InLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgd2FzTm90aWZpZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnd2FzTm90aWZpZWQnLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZHVyaW5nIGV2ZW50IGhhbmRsZXIgZm9yICcke2V2ZW50fSc6YCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcXVldWUgZm9yIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IGNvbXBsZXRlZCBieSB0aGUgd3JhcHBlciB0aGF0IGNhbGxlZCBgbmV4dCgpYFxuICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2goeyBhcmdzLCByZXNvbHZlIH0pXG4gICAgICAgICAgLy8gRm9yIG5ldyBxdWV1ZXMgKD0gb25seSBvbmUgZW50cnkpIGVtaXQgdGhlIGZpcnN0IGV2ZW50IGltbWVkaWF0ZWx5LFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgcXVldWUgcnVubmluZy5cbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZTpcbiAgICBoYXNMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVycyhldikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQubGVuZ3RoID4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZWdhdGUoZXZlbnQsIHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlKGV2LCB0YXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB0YXJnZXQuZW1pdChldmVudCwgLi4uYXJncykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgcGlja0J5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRSZXNvdXJjZShzY2hlbWEucmVzb3VyY2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZSwgZGVmYXVsdHMgPSB7fSkge1xuICBjb25zdCB7IHBhcmVudCwgLi4uZGVmcyB9ID0gZGVmYXVsdHNcbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgYXNBcnJheSxcbiAgZXF1YWxzLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBoeXBoZW5hdGUsXG4gIGZvcm1hdFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IGFwcFN0YXRlIGZyb20gJy4uL2FwcFN0YXRlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IEVtaXR0ZXJNaXhpbiBmcm9tICcuL0VtaXR0ZXJNaXhpbi5qcydcbmltcG9ydCB7IGlzTWF0Y2hpbmdUeXBlLCBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtFbWl0dGVyTWl4aW5dLFxuXG4gIGluamVjdDogW1xuICAgICdhcGknLFxuICAgICckdmVyYnMnLFxuICAgICckdmlld3MnLFxuICAgICckaXNQb3B1bGF0ZWQnLFxuICAgICckcGFyZW50Q29tcG9uZW50JyxcbiAgICAnJHNjaGVtYUNvbXBvbmVudCcsXG4gICAgJyRyb3V0ZUNvbXBvbmVudCcsXG4gICAgJyRkYXRhQ29tcG9uZW50JyxcbiAgICAnJHNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRyZXNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRkaWFsb2dDb21wb25lbnQnLFxuICAgICckcGFuZWxDb21wb25lbnQnLFxuICAgICckdGFiQ29tcG9uZW50J1xuICBdLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhXG4gICAgICA/IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgb3ZlcnJpZGVzOiBudWxsIC8vIFNlZSBhY2Nlc3Nvci5qc1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBSZXNvdXJjZU1peGluLCB1c2VkIGJ5IGxpc3RzLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNvdXJjZVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGE/LnNjaGVtYVxuICAgIH0sXG5cbiAgICB1c2VyKCkge1xuICAgICAgcmV0dXJuIGFwcFN0YXRlLnVzZXJcbiAgICB9LFxuXG4gICAgLy8gJHZlcmJzLCAkdmVyYnMgYW5kICRpc1BvcHVsYXRlZCBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlXG4gICAgLy8gcmVhY3RpdmVuZXNzIGFjcm9zcyBwcm92aWRlL2luamVjdC5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgIHZlcmJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHZlcmJzKClcbiAgICB9LFxuXG4gICAgdmlld3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmlld3MoKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudFJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5yb3V0ZUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBwYXJlbnRGb3JtQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LmZvcm1Db21wb25lbnRcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzXG4gICAgLy8gdGhhdCBsb2FkcyBpdHMgb3duIGRhdGEgZnJvbSBhbiBhc3NvY2lhdGVkIEFQSSByZXNvdXJjZS5cbiAgICByb290RGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFDb21wb25lbnQ/LmRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVpZFxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIC8vIFRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGlzIG9ubHkgYXZhaWxhYmxlIGR1cmluZyB0aGUgbGlmZS1jeWNsZSBvZiBhXG4gICAgLy8gY29tcG9uZW50LiBTb21lIGluZm9ybWF0aW9uIHdlIG5lZWQgYXZhaWxhYmxlIGxvbmdlciB0aGFuIHRoYXQsIGUuZy5cbiAgICAvLyBgcXVlcnlgICYgYHRvdGFsYCBvbiBUeXBlTGlzdCwgc28gdGhhdCB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIGZyb21cbiAgICAvLyBlZGl0aW5nIGFuIGl0ZW0gaW4gdGhlIGxpc3QsIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdCBpcyBzdGlsbCB0aGUgc2FtZS5cbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGlzIGluIGBkYXRhYCwgYXMgdGhpcyBpcyBhbHJlYWR5IHRoZSBwdXJlIGRhdGEgZnJvbSB0aGVcbiAgICAvLyBBUEkgc2VydmVyLiBUaGF0J3Mgd2hhdCB0aGUgYHN0b3JlYCBpcyBmb3I6IE1lbW9yeSB0aGF0J3MgYXZhaWxhYmxlIGFzXG4gICAgLy8gbG9uZyBhcyB0aGUgY3VycmVudCBlZGl0aW5nIHBhdGggaXMgc3RpbGwgdmFsaWQuIEZvciB0eXBlIGNvbXBvbmVudHMsXG4gICAgLy8gdGhpcyBtZW1vcnkgaXMgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCwgc2VlIFJvdXRlTWl4aW4gYW5kIERpdG9QYW5lLlxuICAgIGdldFN0b3JlKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XVxuICAgIH0sXG5cbiAgICBzZXRTdG9yZShrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLnN0b3JlW2tleV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcblxuICAgIGdldENoaWxkU3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZShrZXkpIHx8IHRoaXMuc2V0U3RvcmUoa2V5LCByZWFjdGl2ZSh7fSkpXG4gICAgfSxcblxuICAgIGdldFNjaGVtYVZhbHVlKFxuICAgICAga2V5T3JEYXRhUGF0aCxcbiAgICAgIHsgdHlwZSwgZGVmYXVsdDogZGVmLCBzY2hlbWEgPSB0aGlzLnNjaGVtYSwgY2FsbGJhY2sgPSB0cnVlIH0gPSB7fVxuICAgICkge1xuICAgICAgY29uc3QgdHlwZXMgPSB0eXBlICYmIGFzQXJyYXkodHlwZSlcbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBkYXRhLXBhdGhzIGluIGBrZXlPckRhdGFQYXRoYCBjYW4gb25seSBiZVxuICAgICAgLy8gcHJvdmlkZWQgaW4gaW4gYXJyYXkgZm9ybWF0IGhlcmU6XG4gICAgICBsZXQgdmFsdWUgPSBzY2hlbWFcbiAgICAgICAgPyBpc0FycmF5KGtleU9yRGF0YVBhdGgpXG4gICAgICAgICAgPyBnZXRWYWx1ZUF0RGF0YVBhdGgoc2NoZW1hLCBrZXlPckRhdGFQYXRoLCAoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgOiBzY2hlbWFba2V5T3JEYXRhUGF0aF1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oZGVmKSAmJiAhaXNNYXRjaGluZ1R5cGUodHlwZXMsIGRlZikpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9ucyBmb3IgYW55IHR5cGUgZXhjZXB0IGBGdW5jdGlvbmA6XG4gICAgICAgICAgZGVmID0gZGVmLmNhbGwodGhpcylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmXG4gICAgICB9XG5cbiAgICAgIGlmIChpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuICAgICAgLy8gQW55IHNjaGVtYSB2YWx1ZSBoYW5kbGVkIHRocm91Z2ggYGdldFNjaGVtYVZhbHVlKClgIGNhbiBwcm92aWRlXG4gICAgICAvLyBhIGZ1bmN0aW9uIHRoYXQncyByZXNvbHZlZCB3aGVuIHRoZSB2YWx1ZSBpcyBldmFsdWF0ZWQ6XG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSh0aGlzLmNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyBOb3cgZmluYWxseSBzZWUgaWYgd2UgY2FuIGNvbnZlcnQgdG8gdGhlIGV4cGVjdCB0eXBlcy5cbiAgICAgIGlmICh0eXBlcyAmJiB2YWx1ZSAhPSBudWxsICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKVxuICAgICAgICAgIGlmIChjb252ZXJ0ZWQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0TGFiZWwoc2NoZW1hLCBuYW1lKSB7XG4gICAgICByZXR1cm4gc2NoZW1hXG4gICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgnbGFiZWwnLCB7IHR5cGU6IFN0cmluZywgc2NoZW1hIH0pIHx8XG4gICAgICAgICAgbGFiZWxpemUobmFtZSB8fCBzY2hlbWEubmFtZSlcbiAgICAgICAgOiBsYWJlbGl6ZShuYW1lKSB8fCAnJ1xuICAgIH0sXG5cbiAgICBsYWJlbGl6ZSxcblxuICAgIGdldEJ1dHRvbkF0dHJpYnV0ZXMobmFtZSwgYnV0dG9uKSB7XG4gICAgICBjb25zdCB2ZXJiID0gdGhpcy52ZXJic1tuYW1lXSB8fCBuYW1lXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzczogYGRpdG8tYnV0dG9uLSR7dmVyYn1gLFxuICAgICAgICB0aXRsZTogYnV0dG9uPy50ZXh0IHx8IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCdpZicsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzaG91bGRTaG93KHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCd2aXNpYmxlJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBzY2hlbWFcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNob3VsZERpc2FibGUoc2NoZW1hID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2Rpc2FibGVkJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpIHtcbiAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAvLyBSZXNvdXJjZXMgd2l0aG91dCBhIHBhcmVudCBpbmhlcml0IHRoZSBvbmUgZnJvbSBgZGF0YUNvbXBvbmVudGBcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkuXG4gICAgICBpZiAocmVzb3VyY2UucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gdGhpcy5kYXRhQ29tcG9uZW50Py5yZXNvdXJjZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJlc291cmNlcy5hbnkoZ2V0UmVzb3VyY2UocmVzb3VyY2UpKVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVVybChyZXNvdXJjZSkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpXG4gICAgICByZXR1cm4gdXJsID8gdGhpcy5hcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeTogcmVzb3VyY2UucXVlcnkgfSkgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIHJlc291cmNlLCBxdWVyeSwgZGF0YSwgaW50ZXJuYWwgfSkge1xuICAgICAgdXJsIHx8PSB0aGlzLmdldFJlc291cmNlUGF0aChyZXNvdXJjZSlcbiAgICAgIG1ldGhvZCB8fD0gcmVzb3VyY2U/Lm1ldGhvZFxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gIWludGVybmFsICYmIHRoaXMuYXBpLmlzQXBpVXJsKHVybClcbiAgICAgIGlmIChjaGVja1VzZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmVuc3VyZVVzZXIoKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaS5yZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIGRhdGEsIHF1ZXJ5IH0pXG4gICAgICAvLyBEZXRlY3QgY2hhbmdlIG9mIHRoZSBvd24gdXNlciwgYW5kIGZldGNoIGl0IGFnYWluIGlmIGl0IHdhcyBjaGFuZ2VkLlxuICAgICAgaWYgKFxuICAgICAgICBjaGVja1VzZXIgJiZcbiAgICAgICAgbWV0aG9kID09PSAncGF0Y2gnICYmXG4gICAgICAgIGVxdWFscyhyZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy51c2VyLmlkLCB0aGlzLmFwaS51c2VycykpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmZldGNoVXNlcigpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGJ1dHRvbnMsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNldHRpbmdzXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICByZXF1ZXN0KHsgY2FjaGUsIC4uLm9wdGlvbnMgfSkge1xuICAgICAgLy8gQWxsb3cgY2FjaGluZyBvZiBsb2FkZWQgZGF0YSBvbiB0d28gbGV2ZWxzOlxuICAgICAgLy8gLSAnZ2xvYmFsJzogY2FjaGUgZ2xvYmFsbHksIGZvciB0aGUgZW50aXJlIGFkbWluIHNlc3Npb25cbiAgICAgIC8vIC0gJ2xvY2FsJzogY2FjaGUgbG9jYWxseSB3aXRoaW4gdGhlIGNsb3Nlc3Qgcm91dGUgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgIC8vICAgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGFuZCBsb2FkcyBpdHMgb3duIGRhdGEuXG4gICAgICBjb25zdCBjYWNoZVBhcmVudCA9IChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbDogdGhpcy5hcHBTdGF0ZSxcbiAgICAgICAgICBsb2NhbDogdGhpcy5kYXRhQ29tcG9uZW50XG4gICAgICAgIH1bY2FjaGVdXG4gICAgICApXG4gICAgICBjb25zdCBsb2FkQ2FjaGUgPSBjYWNoZVBhcmVudD8ubG9hZENhY2hlXG4gICAgICAvLyBCdWlsZCBhIGNhY2hlIGtleSBmcm9tIHRoZSBjb25maWc6XG4gICAgICBjb25zdCBjYWNoZUtleSA9IChcbiAgICAgICAgbG9hZENhY2hlICYmXG4gICAgICAgIGAke1xuICAgICAgICAgIG9wdGlvbnMubWV0aG9kIHx8ICdnZXQnXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBvcHRpb25zLnVybFxuICAgICAgICB9ICR7XG4gICAgICAgICAgLy8gVE9ETzogYHJlcXVlc3QucGFyYW1zYCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYHF1ZXJ5YCBvblxuICAgICAgICAgIC8vIDIwMjItMTEtMDEsIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5xdWVyeSB8fCBvcHRpb25zLnBhcmFtcyB8fCAnJylcbiAgICAgICAgfSAke1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSB8fCAnJylcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICAgIGlmIChsb2FkQ2FjaGUgJiYgKGNhY2hlS2V5IGluIGxvYWRDYWNoZSkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRDYWNoZVtjYWNoZUtleV1cbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IE5vIGF3YWl0IGhlcmUsIHJlcyBpcyBhIHByb21pc2UgdGhhdCB3ZSBjYW4gZWFzaWx5IGNhY2hlLlxuICAgICAgLy8gVGhhdCdzIGZpbmUgYmVjYXVzZSBwcm9taXNlcyBjYW4gYmUgcmVzb2x2ZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi5cbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuZGF0YSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGF4aW9zIGVycm9ycyB0byBub3JtYWwgZXJyb3JzXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGVycm9yLnJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgdGhyb3cgZGF0YVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UpLCBkYXRhKVxuICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICB9KVxuICAgICAgaWYgKGxvYWRDYWNoZSkge1xuICAgICAgICBsb2FkQ2FjaGVbY2FjaGVLZXldID0gcmVzXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfSxcblxuICAgIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgbG9jYWxlID0gdGhpcy5hcGkubG9jYWxlLFxuICAgICAgZGVmYXVsdHMgPSB0aGlzLmFwaS5mb3JtYXRzLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBuYXZpZ2F0ZShsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlci5wdXNoKGxvY2F0aW9uKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZChvcHRpb25zID0ge30pIHtcbiAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0geyB1cmw6IG9wdGlvbnMgfVxuICAgICAgfVxuICAgICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDk5MTcwNjYvMTE2MzcwOFxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgYS5ocmVmID0gdGhpcy5hcGkuZ2V0QXBpVXJsKG9wdGlvbnMpXG4gICAgICBhLmRvd25sb2FkID0gb3B0aW9ucy5maWxlbmFtZSA/PyBudWxsXG4gICAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgICBib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9LFxuXG4gICAgbm90aWZ5KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50LmNsb3NlTm90aWZpY2F0aW9ucygpXG4gICAgfSxcblxuICAgIHNldHVwU2NoZW1hRmllbGRzKCkge1xuICAgICAgdGhpcy5zZXR1cE1ldGhvZHMoKVxuICAgICAgdGhpcy5zZXR1cENvbXB1dGVkKClcbiAgICAgIHRoaXMuc2V0dXBFdmVudHMoKVxuICAgIH0sXG5cbiAgICBzZXR1cE1ldGhvZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5tZXRob2RzIHx8IHt9KSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgbWV0aG9kIGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwQ29tcHV0ZWQoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5jb21wdXRlZCB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgICAgICAgID8geyBnZXQ6IHZhbHVlIH1cbiAgICAgICAgICA6IGlzT2JqZWN0KHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmdldClcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoYWNjZXNzb3IpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBhY2Nlc3NvcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgY29tcHV0ZWQgcHJvcGVydHkgZGVmaW5pdGlvbjogJHtrZXl9OiAke3ZhbHVlfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0dXBFdmVudHMoKSB7XG4gICAgICBjb25zdCB7IHdhdGNoLCBldmVudHMgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAod2F0Y2gpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpc0Z1bmN0aW9uKHdhdGNoKSA/IHdhdGNoLmNhbGwodGhpcykgOiB3YXRjaFxuICAgICAgICBpZiAoaXNPYmplY3QoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgd2F0Y2ggaGFuZGxlcnMgaW4gdGhlIG5leHQgdGljaywgc28gYWxsIGNvbXBvbmVudHMgYXJlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBjaGVjayBhZ2FpbnN0IHRoZWlyIG5hbWVzLlxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgcHJvcGVydHkgbmFtZXMgdG8gJ2RhdGEucHJvcGVydHknOlxuICAgICAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlOYW1lKGtleSlcbiAgICAgICAgICAgICAgICA/IGBkYXRhLiR7a2V5fWBcbiAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICB0aGlzLiR3YXRjaChleHByLCBjYWxsYmFjaylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZEV2ZW50ID0gKGtleSwgZXZlbnQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgIHRoaXMub24oaHlwaGVuYXRlKGV2ZW50KSwgY2FsbGJhY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBldmVudCBkZWZpbml0aW9uOiAke2tleX06ICR7Y2FsbGJhY2t9YClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgICBhZGRFdmVudChrZXksIGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc2NhbiBzY2hlbWEgZm9yIGBvbltBLVpdYC1zdHlsZSBjYWxsYmFja3MgYW5kIGFkZCB0aGVtXG4gICAgICAvLyBUT0RPOiBEZXByZWNhdGUgb25lIGZvcm1hdCBvciB0aGUgb3RoZXIsIGluIGZhdm91ciBvZiBvbmx5IG9uZSB3YXkgb2ZcbiAgICAgIC8vIGRvaW5nIHRoaW5ncy4gRGVjaWRlIHdoaWNoIG9uZSB0byByZW1vdmUuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYSkpIHtcbiAgICAgICAgaWYgKC9eb25bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXkuc2xpY2UoMiksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRFdmVudChldmVudCwge1xuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBwYXJlbnQgPSBudWxsXG4gICAgfSA9IHt9KSB7XG4gICAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGNvbnN0IHBhcmVudEhhc0xpc3RlbmVycyA9IHBhcmVudD8uaGFzTGlzdGVuZXJzKGV2ZW50KVxuICAgICAgaWYgKGhhc0xpc3RlbmVycyB8fCBwYXJlbnRIYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gVGhlIGVmZmVjdHMgb2Ygc29tZSBldmVudHMgbmVlZCBzb21lIHRpbWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggVnVlLlxuICAgICAgICAvLyBVc2UgJG5leHRUaWNrKCkgdG8gbWFrZSBzdXJlIG91ciBoYW5kbGVycyBzZWUgdGhlc2UgY2hhbmdlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9jZXNzZWRJdGVtYCBpcyBvbmx5IGNvcnJlY3QgYWZ0ZXIgY29tcG9uZW50cyB0aGF0XG4gICAgICAgIC8vIGFyZSBuZXdseSByZW5kZXJlZCBkdWUgdG8gZGF0YSBjaGFuZ2VzIGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzLlxuICAgICAgICBpZiAoWydsb2FkJywgJ2NoYW5nZSddLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuJG5leHRUaWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PiAoY29udGV4dCA9IERpdG9Db250ZXh0LmdldCh0aGlzLCBjb250ZXh0KSlcbiAgICAgICAgY29uc3QgcmVzID0gaGFzTGlzdGVuZXJzXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmVtaXQoZXZlbnQsIGdldENvbnRleHQoKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAvLyBEb24ndCBidWJibGUgdG8gcGFyZW50IGlmIGhhbmRsZWQgZXZlbnQgcmV0dXJuZWQgYGZhbHNlYFxuICAgICAgICBpZiAocGFyZW50SGFzTGlzdGVuZXJzICYmIHJlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXJlbnQuZW1pdChldmVudCwgZ2V0Q29udGV4dCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudC5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9XG4gIH1cbn1cblxubGV0IG5leHRVaWQgPSAwXG4iLCJpbXBvcnQgeyBpc0NyZWRpdENhcmQgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgY3JlZGl0Y2FyZCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzQ3JlZGl0Q2FyZCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBpbnZhbGlkJ1xufVxuIiwiZXhwb3J0IGNvbnN0IGRlY2ltYWxzID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBkZWNpbWFscykgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gZGVjaW1hbHMgPT09ICcqJyA/ICcrJyA6IGB7MSwke2RlY2ltYWxzfX1gXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bLStdP1xcXFxkKihcXFxcLlxcXFxkJHttYXRjaH0pPyRgKS50ZXN0KHZhbHVlKVxuICB9LFxuXG4gIG1lc3NhZ2U6ICh2YWx1ZSwgZGVjaW1hbHMpID0+XG4gICAgYG11c3QgYmUgbnVtZXJpYyBhbmQgbWF5IGNvbnRhaW4gJHtcbiAgICAgICFkZWNpbWFscyB8fCBkZWNpbWFscyA9PT0gJyonID8gJycgOiBkZWNpbWFsc1xuICAgIH0gZGVjaW1hbCBwb2ludHNgXG59XG4iLCJpbXBvcnQgeyBpc0RvbWFpbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBkb21haW4gPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0RvbWFpbih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBkb21haW4nXG59XG4iLCJpbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGVtYWlsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNFbWFpbCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIGEgdmFsaWQgZW1haWwnXG59XG4iLCJpbXBvcnQgeyBpc0hvc3RuYW1lIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNIb3N0bmFtZSh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBob3N0IG5hbWUnXG59XG4iLCJpbXBvcnQgeyBpc0ludGVnZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaW50ZWdlciA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzSW50ZWdlcih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIHdob2xlIG51bWJlcidcbn1cbiIsImV4cG9ydCBjb25zdCBtYXggPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1heCkgPT4gdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBtYXgpIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttYXh9IG9yIGxlc3NgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBtaW4gPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1pbikgPT4gdmFsdWUgPj0gbWluLFxuICBtZXNzYWdlKHZhbHVlLCBtaW4pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttaW59IG9yIG1vcmVgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBwYXNzd29yZCA9IHtcbiAgLy8gQWxsb3cgYW55IHZhbHVlLiBGb3Igbm93IHRoaXMgaXMgb25seSB1c2VkIGFzIGEgbWFya2VyLCB0byBhbGxvdyB0aGVcbiAgLy8gcmVxdWlyZWQgdmFsaWRhdGlvbiB0byBoYW5kbGUgdW5jaGFuZ2VkIHBhc3N3b3JkcyBzZXBhcmF0ZWx5LlxuICB2YWxpZGF0ZTogKCkgPT4gdHJ1ZVxufVxuIiwiZXhwb3J0IGNvbnN0IHJhbmdlID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBbbWluLCBtYXhdKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBbbWluLCBtYXhdKSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCByZXF1aXJlZCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MsIHsgcGFzc3dvcmQgfSkgPT4gKFxuICAgICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJykgfHxcbiAgICAvLyBQYXNzd29yZCBmaWVsZHMgdXNlIGB1bmRlZmluZWRgIGFzIG9wcG9zZWQgdG8gYG51bGxgIHdoZW4gdGhleSdyZSBzZXRcbiAgICAvLyBidXQgdW5jaGFuZ2VkLCBhbGxvdyB0aGlzIHRvIHBhc3MgdGhyb3VnaDpcbiAgICAocGFzc3dvcmQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgKSxcbiAgbWVzc2FnZTogJ2lzIHJlcXVpcmVkJyxcbiAgbnVsbGlzaDogdHJ1ZVxufVxuIiwiaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgdXJsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNVcmwodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgVVJMJ1xufVxuIiwiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0aW9ucyBmcm9tICcuLi92YWxpZGF0aW9ucy9pbmRleC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsnZXJyb3JzJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgaXNWYWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIHRoaXMuaXNUb3VjaGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWRhdGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgdmFsaWRhdGUobm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlXG4gICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgfVxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlJywgdGhpcy5kYXRhUGF0aCwgdmFsdWUsIHRoaXMudmFsaWRhdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IFtydWxlLCBzZXR0aW5nXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uc1tydWxlXVxuICAgICAgICBpZiAodmFsaWRhdG9yICYmICh2YWxpZGF0b3IubnVsbGlzaCB8fCB2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsaWRhdGUsIG1lc3NhZ2UgfSA9IHZhbGlkYXRvclxuICAgICAgICAgIGlmICghdmFsaWRhdGUodmFsdWUsIHNldHRpbmcsIHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc0Z1bmN0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgPyBtZXNzYWdlKHZhbHVlLCBzZXR0aW5nLCB0aGlzKVxuICAgICAgICAgICAgICAgIDogbWVzc2FnZVxuICAgICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShmYWxzZSlcbiAgICB9LFxuXG4gICAgbWFya1RvdWNoZWQoKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWVcbiAgICB9LFxuXG4gICAgbWFya0RpcnR5KCkge1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgLy8gQ2xlYXIgY3VycmVudGx5IGRpc3BsYXllZCBlcnJvcnMgb24gbmV3IGlucHV0LlxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIGFkZEVycm9yKGVycm9yLCBhZGRMYWJlbCA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmVycm9ycyB8fD0gW11cbiAgICAgIGlmIChhZGRMYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMubGFiZWwgfHwgdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm5hbWVcbiAgICAgICAgZXJyb3IgPSBgVGhlICR7bGFiZWx9IGZpZWxkICR7ZXJyb3J9LmBcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgLy8gQ29udmVydCBmcm9tIEFKViBlcnJvcnMgb2JqZWN0cyB0byBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCB7IG1lc3NhZ2UgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihtZXNzYWdlLCB0cnVlKVxuICAgICAgfVxuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzID8gWy4uLnRoaXMuZXJyb3JzXSA6IG51bGxcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGxcbiAgICAgIHRoaXMuJGVtaXQoJ2Vycm9ycycsIHRoaXMuZXJyb3JzKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJpbmcsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFBY2Nlc3NvcihcbiAga2V5T3JEYXRhUGF0aCxcbiAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIGdldCwgc2V0LCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4pIHtcbiAgLy8gYGtleU9yRGF0YVBhdGhgIGNhbiBiZSBhIHNpbXBsZSBwcm9wZXJ0eSBrZXksXG4gIC8vIG9yIGEgZGF0YS1wYXRoIGludG8gc3ViLXByb3BlcnRpZXMsIGJvdGggaW4gYXJyYXkgb3Igc3RyaW5nIGZvcm1hdC5cbiAgaWYgKGlzU3RyaW5nKGtleU9yRGF0YVBhdGgpICYmIGtleU9yRGF0YVBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgIGtleU9yRGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGtleU9yRGF0YVBhdGgpXG4gIH1cbiAgLy8gVXNlIHRoZSBub3JtYWxpemVkIGRhdGEgcGF0aCBmb3IgdGhlIGhhbmRsaW5nIG92ZXJyaWRlc1xuICBjb25zdCBuYW1lID0gbm9ybWFsaXplRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBPbmx5IGRldGVybWluZSBzY2hlbWEgdmFsdWUgaWYgd2UgaGF2ZSBubyBnZXR0ZXIsIG9yIHRoZSBnZXR0ZXJcbiAgICAgIC8vIHdhbnRzIHRvIHJlY2VpdmUgdGhlIHZhbHVlIGFuZCBwcm9jZXNzIGl0IGZ1cnRoZXI6XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICFnZXQgfHwgZ2V0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IC8vIE5PVEU6IEJlY2F1c2UgYHNjaGVtYWAgb2JqZWN0cyBhcmUgcmV0cmlldmVkIGZyb20gYG1ldGFgLCB0aGV5XG4gICAgICAgICAgICAvLyBkb24ndCBzZWVtIHRvIGJlIHJlYWN0aXZlLiBUbyBhbGxvdyBjaGFuZ2VkIGluIGBzY2hlbWFgIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIGBzZXQoKWAgc3RvcmVzIGNoYW5nZWQgdmFsdWVzIGluIHRoZSBzZXBhcmF0ZSBgb3ZlcnJpZGVzYCBvYmplY3QuXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlcyAmJiBuYW1lIGluIHRoaXMub3ZlcnJpZGVzXG4gICAgICAgICAgICA/IHRoaXMub3ZlcnJpZGVzW25hbWVdXG4gICAgICAgICAgICA6IHRoaXMuZ2V0U2NoZW1hVmFsdWUoa2V5T3JEYXRhUGF0aCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fD0ge31cbiAgICAgICAgdGhpcy5vdmVycmlkZXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVBY2Nlc3NvcihuYW1lLCB7IGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQgfSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgZ2V0KCkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRTdG9yZShuYW1lKVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBgZGVmYXVsdCgpYCBmdW5jdGlvbnM6XG4gICAgICAgIHZhbHVlID0gaXNGdW5jdGlvbihkZWYpID8gZGVmLmNhbGwodGhpcykgOiBkZWZcbiAgICAgICAgLy8gVHJpZ2dlciBzZXR0ZXIgYnkgc2V0dGluZyB2YWx1ZSBhbmQgYWNjZXNzb3IgdG8gZGVmYXVsdDpcbiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgIC8vIE5vdyBhY2Nlc3Mgc3RvcmUgYWdhaW4sIGZvciByZWFjdGl2aXR5IHRyYWNraW5nXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBnZXR0ZXIgdG8gZnVydGhlciBjaGFuZ2Ugb3IgcHJvY2VzcyB0aGUgdmFsdWVcbiAgICAgIC8vIHJldHJpZXZlZCBmcm9tIHRoZSBzdG9yZTpcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBzZXR0ZXIgdG8gcmV0dXJuIGEgbmV3IHZhbHVlIHRvIHNldCwgb3IgZG8gdGhlXG4gICAgICAvLyBzZXR0aW5nIGl0c2VsZiwgYW5kIHRoZW4gcmV0dXJuIGB1bmRlZmluZWRgOlxuICAgICAgaWYgKCFzZXQgfHwgKHZhbHVlID0gc2V0LmNhbGwodGhpcywgdmFsdWUpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RvcmUobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGNvbXB1dGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEl0ZW0sIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdGlvbk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gTk9URTogV2hpbGUgYGRhdGFQYXRoYCBwb2ludHMgdG8gdGhlIGFjdHVhbCBgdmFsdWVgLCBgZGF0YWAgcmVwcmVzZW50c1xuICAgIC8vIHRoZSBgaXRlbWAgaW4gd2hpY2ggdGhlIGB2YWx1ZWAgaXMgY29udGFpbmVkLCB1bmRlciB0aGUga2V5IGBuYW1lYC5cbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZFZhbHVlOiBudWxsLFxuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgdHlwZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS50eXBlXG4gICAgfSxcblxuICAgIGNvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgbmVzdGVkOiB0aGlzLm5lc3RlZCB9KVxuICAgIH0sXG5cbiAgICB2YWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbXB1dGVWYWx1ZShcbiAgICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgIHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgeyBjb21wb25lbnQ6IHRoaXMgfVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHsgZm9ybWF0IH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICAvLyBgc2NoZW1hLmZvcm1hdGAgaXMgb25seSBldmVyIGNhbGxlZCBpbiB0aGUgbGlmZS1jeWNsZVxuICAgICAgICAvLyBvZiB0aGUgY29tcG9uZW50IGFuZCB0aHVzIGl0J3Mgb2sgdG8gYmluZCBpdCB0byBgdGhpc2BcbiAgICAgICAgcmV0dXJuIGZvcm1hdFxuICAgICAgICAgID8gZm9ybWF0LmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgdmFsdWUgfSkpXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIC8vIGBzY2hlbWEucGFyc2VgIGlzIG9ubHkgZXZlciBjYWxsZWQgaW4gdGhlIGxpZmUtY3ljbGVcbiAgICAgICAgLy8gb2YgdGhlIGNvbXBvbmVudCBhbmQgdGh1cyBpdCdzIG9rIHRvIGJpbmQgaXQgdG8gYHRoaXNgXG4gICAgICAgIHRoaXMucGFyc2VkVmFsdWUgPSBwYXJzZVxuICAgICAgICAgID8gcGFyc2UuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyB2YWx1ZSB9KSlcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tbXV0YXRpbmctcHJvcHNcbiAgICAgICAgdGhpcy5kYXRhW3RoaXMubmFtZV0gPSB0aGlzLnBhcnNlZFZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhcmVudERhdGEoKSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgICAgIHJldHVybiBkYXRhICE9PSB0aGlzLmRhdGEgPyBkYXRhIDogbnVsbFxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWREYXRhKCkge1xuICAgICAgLy8gV2UgY2FuIG9ubHkgZ2V0IHRoZSBwcm9jZXNzZWQgZGF0YSB0aHJvdWdoIHRoZSBzY2hlbWFDb21wb25lbnQsIGJ1dFxuICAgICAgLy8gdGhhdCdzIG5vdCBuZWNlc3NhcmlseSB0aGUgaXRlbSByZXByZXNlbnRlZCBieSB0aGlzIGNvbXBvbmVudC5cbiAgICAgIC8vIFNvbHV0aW9uOiBGaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgcHJvY2Vzc2VkIHN1Yi1pdGVtIGZyb20gdGhlcmU6XG4gICAgICBjb25zdCB7IHNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGdldEl0ZW0oXG4gICAgICAgIHNjaGVtYUNvbXBvbmVudC5wcm9jZXNzZWREYXRhLFxuICAgICAgICAvLyBHZXQgdGhlIGRhdGFQYXRoIHJlbGF0aXZlIHRvIHRoZSBzY2hlbWFDb21wb25lbnQncyBkYXRhOlxuICAgICAgICB0aGlzLmRhdGFQYXRoLnNsaWNlKHNjaGVtYUNvbXBvbmVudC5kYXRhUGF0aC5sZW5ndGgpLFxuICAgICAgICB0aGlzLm5lc3RlZFxuICAgICAgKVxuICAgIH0sXG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHNpbWlsYXIgdG8gYERpdG9Db250ZXh0YFxuICAgIC8vIHByb3BlcnRpZXMsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGVzZSBvbiBgdGhpc2AgYXMgd2VsbDpcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBwYXJlbnRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50RGF0YVxuICAgIH0sXG5cbiAgICByb290SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3REYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWREYXRhXG4gICAgfSxcblxuICAgIGxhYmVsOiBnZXRTY2hlbWFBY2Nlc3NvcignbGFiZWwnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGdldChsYWJlbCkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcobGFiZWwpXG4gICAgICAgICAgPyBsYWJlbFxuICAgICAgICAgIDogbGFiZWwgIT09IGZhbHNlICYmIHRoaXMuJG9wdGlvbnMuZ2VuZXJhdGVMYWJlbFxuICAgICAgICAgICAgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSksXG5cbiAgICB3aWR0aDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXVxuICAgIH0pLFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG9wdGlvbnMuZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgZXhjbHVkZWRgIGZvciBjb25zaXN0ZW50IG5hbWluZz9cbiAgICBleGNsdWRlOiBnZXRTY2hlbWFBY2Nlc3NvcignZXhjbHVkZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcmVxdWlyZWQ6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXF1aXJlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogTW92ZSB0aGVzZSB0byBhIHN1Yi1jbGFzcyBjb21wb25lbnQgdXNlZCBmb3IgYWxsIGlucHV0IGNvbXBvbmVudHM/XG4gICAgcmVhZG9ubHk6IGdldFNjaGVtYUFjY2Vzc29yKCdyZWFkb25seScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgYXV0b2ZvY3VzOiBnZXRTY2hlbWFBY2Nlc3NvcignYXV0b2ZvY3VzJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUbyBiZSB1c2VkIGZvciBzZWxlY3RzIGFuZCBpbnB1dHMgb25seT9cbiAgICBjbGVhcmFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjbGVhcmFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHBsYWNlaG9sZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncGxhY2Vob2xkZXInLCB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9KSxcblxuICAgIGF1dG9jb21wbGV0ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2F1dG9jb21wbGV0ZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0pLFxuXG4gICAgZXZlbnRzKCkge1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5nZXRFdmVudHMoKVxuICAgICAgLy8gUmVnaXN0ZXIgY2FsbGJhY2tzIGZvciBhbGwgcHJvdmlkZXMgbm9uLXJlY29nbml6ZWQgZXZlbnRzLFxuICAgICAgLy8gYXNzdW1pbmcgdGhleSBhcmUgbmF0aXZlIGV2ZW50cy5cbiAgICAgIC8vIFRPRE86IE1vdmUgdG8gdnVlMy1zdHlsZSBgb25bQS1aXWAgZXZlbnQgaGFuZGxlcnMgbmFtaW5nIHRoYXQgYXJlbid0XG4gICAgICAvLyBuYW1lc3BhY2VkIGluIGBzY2hlbWEuZXZlbnRzYCBvbmNlIHRoZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlLlxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5ldmVudHMgfHwge30pKSB7XG4gICAgICAgIGV2ZW50c1tgb24ke2NhbWVsaXplKGV2ZW50LCB0cnVlKX1gXSA/Pz0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW1pdEV2ZW50KGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnRzXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IG5hdGl2ZUZpZWxkLCB0ZXh0RmllbGQgfSA9IHRoaXMuJG9wdGlvbnNcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICAgICAgLi4udGhpcy5ldmVudHMsXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG5cbiAgICAgIGlmIChuYXRpdmVGaWVsZCkge1xuICAgICAgICBhdHRyaWJ1dGVzLm5hbWUgPSB0aGlzLm5hbWVcbiAgICAgICAgaWYgKHRoaXMubGFiZWwpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnRpdGxlID0gdGhpcy5sYWJlbFxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5XG4gICAgICAgIGF0dHJpYnV0ZXMuYXV0b2ZvY3VzID0gdGhpcy5hdXRvZm9jdXNcbiAgICAgICAgaWYgKHRleHRGaWVsZCkge1xuICAgICAgICAgIGF0dHJpYnV0ZXMucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyXG4gICAgICAgICAgYXR0cmlidXRlcy5hdXRvY29tcGxldGUgPSB0aGlzLmF1dG9jb21wbGV0ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfSxcblxuICAgIHZhbGlkYXRpb25zKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSB7IC4uLnRoaXMuZ2V0VmFsaWRhdGlvbnMoKSB9XG4gICAgICBpZiAodGhpcy5yZXF1aXJlZCkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yZXF1aXJlZCA9IHRydWVcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBvdmVycmlkZSBkZWZhdWx0IHJ1bGVzIGFuZCBhZGQgYW55IG5ldyBvbmVzOlxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEucnVsZXMgfHwge30pKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVsZXRlIHZhbGlkYXRpb25zW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9uc1trZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRpb25zXG4gICAgfSxcblxuICAgIHNob3dDbGVhckJ1dHRvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsZWFyYWJsZSAmJiB0aGlzLnZhbHVlICE9IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICB9LFxuXG4gIGJlZm9yZVVubW91bnQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIFByZXZlbnQgdW5uZXN0ZWQgdHlwZSBjb21wb25lbnRzIGZyb20gb3ZlcnJpZGluZyBwYXJlbnQgZGF0YSBwYXRoc1xuICAgICAgaWYgKHRoaXMubmVzdGVkKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldEV2ZW50cygpIHtcbiAgICAgIGNvbnN0IHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgY29uc3QgW2VsZW1lbnRdID0gYXNBcnJheSh0aGlzLiRyZWZzLmVsZW1lbnQpXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5mb2N1cygpXG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQsIGBmb2N1cygpYCB3aWxsIGxpa2VseSBub3QgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBkZXNpcmVkIGVmZmVjdC4gVXNlIGBzY3JvbGxJbnRvVmlldygpYCBpZiBhdmFpbGFibGU6XG4gICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIDsoZWxlbWVudC4kZWwgfHwgZWxlbWVudCkuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIC8vIEFsc28gZm9jdXMgdGhpcyBjb21wb25lbnQncyBzY2hlbWEgYW5kIHBhbmVsIGluIGNhc2UgaXQncyBhIHRhYi5cbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LmZvY3VzKClcbiAgICAgIHRoaXMudGFiQ29tcG9uZW50Py5mb2N1cygpXG4gICAgICB0aGlzLmZvY3VzRWxlbWVudCgpXG4gICAgfSxcblxuICAgIGNsZWFyKCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5tYXJrVG91Y2hlZCgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnZm9jdXMnKVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZVxuICAgICAgdGhpcy52YWxpZGF0ZSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnYmx1cicpXG4gICAgfSxcblxuICAgIG9uSW5wdXQoKSB7XG4gICAgICB0aGlzLm1hcmtEaXJ0eSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnaW5wdXQnKVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMubWFya0RpcnR5KClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgIGNvbnRleHQ6XG4gICAgICAgICAgdGhpcy5wYXJzZWRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgdmFsdWU6IHRoaXMucGFyc2VkVmFsdWUgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAvLyBQYXNzIGBzY2hlbWFDb21wb25lbnRgIGFzIHBhcmVudCwgc28gY2hhbmdlIGV2ZW50cyBjYW4gcHJvcGFnYXRlIHVwLlxuICAgICAgICBwYXJlbnQ6IHRoaXMuc2NoZW1hQ29tcG9uZW50XG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwiY29uc3QgdWlkTWFwID0gbmV3IFdlYWtNYXAoKVxuXG4vLyBHZW5lcmF0ZWQgYW5kIHJlbWVtYmVycyB1bmlxdWUgaWRzIHBlciBwYXNzZWQgb2JqZWN0IHVzaW5nIGEgd2VhayBtYXAuXG5sZXQgdWlkID0gMFxuZXhwb3J0IGZ1bmN0aW9uIGdldFVpZChvYmplY3QsIGl0ZW1JZCkge1xuICBsZXQgaWQgPSB1aWRNYXAuZ2V0KG9iamVjdClcbiAgaWYgKCFpZCkge1xuICAgIGlkID0gaXRlbUlkIHx8IGBAJHsrK3VpZH1gXG4gICAgdWlkTWFwLnNldChvYmplY3QsIGlkKVxuICB9XG4gIHJldHVybiBpZFxufVxuIiwiaW1wb3J0IHsgaXNUZW1wb3JhcnlJZCB9IGZyb20gJy4vZGF0YS5qcydcbmltcG9ydCB7XG4gIGlzSW50ZWdlcixcbiAgYXNBcnJheSxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgZ2V0VmFsdWVBdERhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnXG5cbi8vIFNjaGVtYUdyYXBoIGlzIGEgY2xhc3MgdG8gY29sbGVjdCBzY2hlbWEgZ3JhcGggbWV0YSBpbmZvcm1hdGlvbiBpbiBvcmRlciB0b1xuLy8gcHJvY2VzcyBzb3VyY2VzIGFuZCByZWxhdGlvbnMgZm9yIHRoZSBnaXZlbiB0YXJnZXRzICdzZXJ2ZXInIGFuZCAnY2xpcGJvYXJkJyxcbi8vIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOlxuLy9cbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG4vLyB8IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXJ2ZXIgICAgfCBjbGlwYm9hcmQgfFxuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IGZhbHNlICAgICAgICAgICB8IGtlZXAgaWQgICB8IGtlZXAgaWQgICB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiB0cnVlICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZWYsICNyZWYgfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogdHJ1ZSwgdGVtcG9yYXJ5IHwgcmVmLCAjcmVmIHwgcmVmLCAjcmVmIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IGZhbHNlICAgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlbW92ZSBpZCB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiBmYWxzZSwgdGVtcG9yYXJ5ICAgfCByZWYsICNpZCAgfCByZW1vdmUgaWQgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogdHJ1ZSAgICAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVmLCAjaWQgIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IHRydWUsIHRlbXBvcmFyeSAgICB8IHJlZiwgI2lkICB8IHJlZiwgI2lkICB8XG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuXG5leHBvcnQgY2xhc3MgU2NoZW1hR3JhcGgge1xuICBncmFwaCA9IHt9XG4gIHJlZmVyZW5jZXMgPSB7fVxuXG4gIHNldChkYXRhUGF0aCwgc2V0dGluZ3MsIGRlZmF1bHRzKSB7XG4gICAgZGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgIGxldCBzdWJHcmFwaCA9IHRoaXMuZ3JhcGhcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZGF0YVBhdGgpIHtcbiAgICAgIGNvbnN0IGtleSA9IGlzSW50ZWdlcigrcGFydCkgPyAnKicgOiBwYXJ0XG4gICAgICBzdWJHcmFwaCA9IHN1YkdyYXBoW2tleV0gPz89IHt9XG4gICAgfVxuICAgIHN1YkdyYXBoLiRzZXR0aW5ncyA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLCAvLyBTZWUgYGFkZFNvdXJjZShkYXRhUGF0aClgXG4gICAgICAuLi5zdWJHcmFwaC4kc2V0dGluZ3MsXG4gICAgICAuLi5zZXR0aW5nc1xuICAgIH1cbiAgfVxuXG4gIGFkZFNvdXJjZShkYXRhUGF0aCwgc2NoZW1hKSB7XG4gICAgLy8gT25seSBzZXQgYHJlbGF0ZWQ6IGZhbHNlYCB0aHJvdWdoIHRoZSBkZWZhdWx0cywgYXMgYHNldFNvdXJjZVJlbGF0ZWQoKWBcbiAgICAvLyBtYXkgYmUgY2FsbGVkIGJlZm9yZSBgYWRkU291cmNlKClgLCBkZXBlbmRpbmcgb24gdGhlIGdyYXBoIHN0cnVjdHVyZS5cbiAgICB0aGlzLnNldChkYXRhUGF0aCwgeyB0eXBlOiAnc291cmNlJywgc2NoZW1hIH0sIHsgcmVsYXRlZDogZmFsc2UgfSlcbiAgfVxuXG4gIHNldFNvdXJjZVJlbGF0ZWQoZGF0YVBhdGgpIHtcbiAgICB0aGlzLnNldChkYXRhUGF0aCwge1xuICAgICAgcmVsYXRlZDogdHJ1ZSxcbiAgICAgIHJlZmVyZW5jZTogdGhpcy5nZXRSZWZlcmVuY2VQcmVmaXgoZGF0YVBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIGFkZFJlbGF0aW9uKGRhdGFQYXRoLCByZWxhdGVkRGF0YVBhdGgsIHNjaGVtYSkge1xuICAgIHRoaXMuc2V0KGRhdGFQYXRoLCB7XG4gICAgICB0eXBlOiAncmVsYXRpb24nLFxuICAgICAgc2NoZW1hLFxuICAgICAgaW50ZXJuYWw6ICEhcmVsYXRlZERhdGFQYXRoLFxuICAgICAgcmVmZXJlbmNlOiB0aGlzLmdldFJlZmVyZW5jZVByZWZpeChyZWxhdGVkRGF0YVBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIGdldFJlZmVyZW5jZVByZWZpeChkYXRhUGF0aCkge1xuICAgIHJldHVybiBkYXRhUGF0aFxuICAgICAgPyAodGhpcy5yZWZlcmVuY2VzW2RhdGFQYXRoXSA/Pz0gbmFub2lkKDYpKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBmbGF0dGVuKCkge1xuICAgIGNvbnN0IGZsYXR0ZW4gPSBncmFwaCA9PiB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gW11cbiAgICAgIGZvciAoY29uc3QgW2tleSwgeyAkc2V0dGluZ3MsIC4uLnN1YkdyYXBoIH1dIG9mIE9iamVjdC5lbnRyaWVzKGdyYXBoKSkge1xuICAgICAgICBpZiAoJHNldHRpbmdzKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtrZXksICRzZXR0aW5nc10pXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbc3ViS2V5LCBzZXR0aW5nc10gb2YgZmxhdHRlbihzdWJHcmFwaCkpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2Ake2tleX0vJHtzdWJLZXl9YCwgc2V0dGluZ3NdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllc1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuKHRoaXMuZ3JhcGgpXG4gIH1cblxuICBwcm9jZXNzKHNvdXJjZVNjaGVtYSwgZGF0YSwgeyB0YXJnZXQgfSkge1xuICAgIGNvbnN0IGNsaXBib2FyZCA9IHRhcmdldCA9PT0gJ2NsaXBib2FyZCdcbiAgICBpZiAoY2xpcGJvYXJkKSB7XG4gICAgICBkZWxldGUgZGF0YVtzb3VyY2VTY2hlbWEuaWRLZXkgfHwgJ2lkJ11cbiAgICB9XG4gICAgZm9yIChjb25zdCBbZGF0YVBhdGgsIHNldHRpbmdzXSBvZiB0aGlzLmZsYXR0ZW4oKSkge1xuICAgICAgY29uc3QgeyB0eXBlLCBzY2hlbWEsIGludGVybmFsLCByZWxhdGVkLCByZWZlcmVuY2UgfSA9IHNldHRpbmdzXG4gICAgICBjb25zdCBzb3VyY2UgPSB0eXBlID09PSAnc291cmNlJ1xuICAgICAgY29uc3QgcmVsYXRpb24gPSB0eXBlID09PSAncmVsYXRpb24nXG4gICAgICBpZiAoc291cmNlIHx8IHJlbGF0aW9uICYmIGludGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGdldFZhbHVlQXREYXRhUGF0aChkYXRhLCBkYXRhUGF0aCwgKCkgPT4gbnVsbClcbiAgICAgICAgY29uc3QgcmVtb3ZlSWQgPSBjbGlwYm9hcmQgJiYgc291cmNlICYmICFyZWxhdGVkXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gKFxuICAgICAgICAgIGNsaXBib2FyZCAmJiAoXG4gICAgICAgICAgICByZWxhdGlvbiAmJiBpbnRlcm5hbCB8fFxuICAgICAgICAgICAgc291cmNlICYmIHJlbGF0ZWRcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhc0FycmF5KHZhbHVlcykuZmxhdCgpKSB7XG4gICAgICAgICAgY29uc3QgaWRLZXkgPSAoXG4gICAgICAgICAgICBzb3VyY2UgJiYgc2NoZW1hLmlkS2V5IHx8XG4gICAgICAgICAgICByZWxhdGlvbiAmJiBzY2hlbWEucmVsYXRlQnkgfHxcbiAgICAgICAgICAgICdpZCdcbiAgICAgICAgICApXG4gICAgICAgICAgbGV0IGlkID0gdmFsdWU/LltpZEtleV1cbiAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlbW92ZUlkKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtpZEtleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VJZCB8fCBpc1RlbXBvcmFyeUlkKGlkKSkge1xuICAgICAgICAgICAgICBpZiAoaXNUZW1wb3JhcnlJZChpZCkpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGlkLnNsaWNlKDEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVmS2V5ID0gY2xpcGJvYXJkXG4gICAgICAgICAgICAgICAgPyAvLyBDbGlwYm9hcmQganVzdCBuZWVkcyB0ZW1wb3JhcnkgaWRzIHVuZGVyIHRoZSBhY3R1YWwgYGlkS2V5YFxuICAgICAgICAgICAgICAgICAgaWRLZXlcbiAgICAgICAgICAgICAgICA6IC8vIFNlcnZlciB3YW50cyBPYmplY3Rpb24tc3R5bGUgJyNpZCcgLyAnI3JlZicgcGFpcnMuXG4gICAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgICAgICAgID8gJyNpZCdcbiAgICAgICAgICAgICAgICAgIDogJyNyZWYnXG4gICAgICAgICAgICAgIGNvbnN0IHJldlZhbHVlID0gY2xpcGJvYXJkXG4gICAgICAgICAgICAgICAgPyBgQCR7aWR9YFxuICAgICAgICAgICAgICAgIDogLy8gS2VlcCB0aGUgaWRzIHVuaXF1ZSBpbiByZWZlcmVuY2UgZ3JvdXBzLCBzaW5jZSB0aGV5XG4gICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgYWNyb3NzIHRoZSBmdWxsIGdyYXBoLlxuICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICA/IGAke3JlZmVyZW5jZX0tJHtpZH1gXG4gICAgICAgICAgICAgICAgICA6IGlkIC8vIEEgdGVtcG9yYXJ5IGlkIHdpdGhvdXQgYSByZWxhdGVkLCBqdXN0IHByZXNlcnZlIGl0LlxuICAgICAgICAgICAgICB2YWx1ZVtyZWZLZXldID0gcmV2VmFsdWVcbiAgICAgICAgICAgICAgaWYgKHJlZktleSAhPT0gaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbaWRLZXldXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuLi9taXhpbnMvRGl0b01peGluLmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0VWlkIH0gZnJvbSAnLi91aWQuanMnXG5pbXBvcnQgeyBTY2hlbWFHcmFwaCB9IGZyb20gJy4vU2NoZW1hR3JhcGguanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCwgaXNUZW1wb3JhcnlJZCB9IGZyb20gJy4vZGF0YS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgaXNGdW5jdGlvbixcbiAgaXNQcm9taXNlLFxuICBpc01vZHVsZSxcbiAgY2xvbmUsXG4gIG1lcmdlLFxuICBjYW1lbGl6ZSxcbiAgbWFwQ29uY3VycmVudGx5XG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBtYXJrUmF3IH0gZnJvbSAndnVlJ1xuXG5jb25zdCB0eXBlQ29tcG9uZW50cyA9IHt9XG5jb25zdCB1bmtub3duVHlwZVJlcG9ydGVkID0ge31cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpIHtcbiAgdHlwZUNvbXBvbmVudHNbdHlwZV0gPSBjb21wb25lbnRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb21wb25lbnQodHlwZSwgYWxsb3dOdWxsID0gZmFsc2UpIHtcbiAgY29uc3QgY29tcG9uZW50ID0gdHlwZUNvbXBvbmVudHNbdHlwZV0gfHwgbnVsbFxuICBpZiAoIWNvbXBvbmVudCAmJiAhYWxsb3dOdWxsICYmICF1bmtub3duVHlwZVJlcG9ydGVkW3R5cGVdKSB7XG4gICAgLy8gUmVwb3J0IGVhY2ggbWlzc2luZyB0eXBlIG9ubHkgb25jZSwgdG8gYXZvaWQgZmxvb2RpbmcgdGhlIGNvbnNvbGU6XG4gICAgdW5rbm93blR5cGVSZXBvcnRlZFt0eXBlXSA9IHRydWVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRGl0byBjb21wb25lbnQgdHlwZTogJyR7dHlwZX0nYClcbiAgfVxuICByZXR1cm4gY29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzLCBjYWxsYmFjaykge1xuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKGlzU2luZ2xlQ29tcG9uZW50VmlldyhzY2hlbWEpKSB7XG4gICAgICBjb25zdCByZXMgPSBjYWxsYmFjayhzY2hlbWEuY29tcG9uZW50LCBzY2hlbWEubmFtZSwgMClcbiAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hLmNvbXBvbmVudHMgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGNhbGxiYWNrKGNvbXBvbmVudCwgbmFtZSwgMSlcbiAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IGl0ZXJhdGVTY2hlbWFDb21wb25lbnRzKFtzY2hlbWEsIC4uLmdldEFsbFRhYlNjaGVtYXMoc2NoZW1hKV0sIGNhbGxiYWNrKVxuICAgIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IGNvbXBvbmVudCA6IHVuZGVmaW5lZClcbiAgICApIHx8IG51bGxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc29tZVNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyB0cnVlIDogdW5kZWZpbmVkKVxuICAgICkgPT09IHRydWVcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnlTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdW5kZWZpbmVkIDogZmFsc2UpXG4gICAgKSAhPT0gZmFsc2VcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2hlbWEoc2NoZW1hKSB7XG4gIHJldHVybiBpc09iamVjdChzY2hlbWEpICYmIGlzU3RyaW5nKHNjaGVtYS50eXBlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ2Zvcm0nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpZXcoc2NoZW1hKSB7XG4gIHJldHVybiBpc1NjaGVtYShzY2hlbWEpICYmIHNjaGVtYS50eXBlID09PSAndmlldydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFiKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3RhYidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFuZWwoc2NoZW1hKSB7XG4gIHJldHVybiBpc1NjaGVtYShzY2hlbWEpICYmIHNjaGVtYS50eXBlID09PSAncGFuZWwnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSkge1xuICByZXR1cm4gc2NoZW1hLm5hbWUgfHwgc2NoZW1hLmxhYmVsIHx8IHNjaGVtYS50eXBlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdW53cmFwTW9kdWxlID0gZmFsc2UpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpXG4gIH1cbiAgaWYgKGlzUHJvbWlzZShzY2hlbWEpKSB7XG4gICAgc2NoZW1hID0gYXdhaXQgc2NoZW1hXG4gIH1cbiAgaWYgKGlzTW9kdWxlKHNjaGVtYSkpIHtcbiAgICAvLyBDb3B5IHRvIGNvbnZlcnQgZnJvbSBtb2R1bGUgdG8gb2JqZWN0OlxuICAgIHNjaGVtYSA9IHsgLi4uc2NoZW1hIH1cbiAgICAvLyBVbndyYXAgZGVmYXVsdCBvciBuYW1lZCBzY2hlbWFcbiAgICBpZiAoIXNjaGVtYS5uYW1lICYmICh1bndyYXBNb2R1bGUgfHwgc2NoZW1hLmRlZmF1bHQpKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hKVxuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBrZXlzWzBdXG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVtuYW1lXVxuICAgICAgICBpZiAobmFtZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgc2NoZW1hLm5hbWUgPSBuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYXMoXG4gIHVucmVzb2x2ZWRTY2hlbWFzLFxuICByZXNvbHZlSXRlbSA9IHJlc29sdmVTY2hlbWFcbikge1xuICBsZXQgc2NoZW1hcyA9IGlzRnVuY3Rpb24odW5yZXNvbHZlZFNjaGVtYXMpXG4gICAgPyB1bnJlc29sdmVkU2NoZW1hcygpXG4gICAgOiB1bnJlc29sdmVkU2NoZW1hc1xuICBzY2hlbWFzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWFzLCBmYWxzZSlcbiAgaWYgKGlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAvLyBUcmFuc2xhdGUgYW4gYXJyYXkgb2YgZHluYW1pYyBpbXBvcnQsIGVhY2ggaW1wb3J0aW5nIG9uZSBuYW1lZCBzY2hlbWFcbiAgICAvLyBtb2R1bGUgdG8gYW4gb2JqZWN0IHdpdGggbmFtZWQgZW50cmllcy5cbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICBhc3luYyBpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCByZXNvbHZlSXRlbShpdGVtLCB0cnVlKVxuICAgICAgICAgIHJldHVybiBbc2NoZW1hLm5hbWUsIHNjaGVtYV1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIClcbiAgfSBlbHNlIGlmIChpc09iamVjdChzY2hlbWFzKSkge1xuICAgIHNjaGVtYXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBhd2FpdCBtYXBDb25jdXJyZW50bHkoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYXMpLFxuICAgICAgICBhc3luYyAoW2tleSwgaXRlbV0pID0+IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCByZXNvbHZlSXRlbShpdGVtLCB0cnVlKVxuICAgICAgICAgIHJldHVybiBba2V5LCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHNjaGVtYXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKSB7XG4gIC8vIFJlc29sdmVzIGFzeW5jIHNjaGVtYSBjb21wb25lbnRzIGFuZCBhZGRzIERpdG9NaXhpbiBhbmQgVHlwZU1peGluIHRvIHRoZW0uXG4gIGxldCB7IGNvbXBvbmVudCB9ID0gc2NoZW1hXG4gIGlmIChjb21wb25lbnQpIHtcbiAgICBjb21wb25lbnQgPSBhd2FpdCByZXNvbHZlU2NoZW1hKGNvbXBvbmVudCwgdHJ1ZSlcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAvLyBQcmV2ZW50IHdhcm5pbmc6IFwiVnVlIHJlY2VpdmVkIGEgQ29tcG9uZW50IHdoaWNoIHdhcyBtYWRlIGEgcmVhY3RpdmVcbiAgICAgIC8vIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgYW5kIHNob3VsZFxuICAgICAgLy8gYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBgbWFya1Jhd2BcIjpcbiAgICAgIHNjaGVtYS5jb21wb25lbnQgPSBtYXJrUmF3KHtcbiAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICBtaXhpbnM6IFtEaXRvTWl4aW4sIFR5cGVNaXhpbiwgLi4uKGNvbXBvbmVudC5taXhpbnMgfHwgW10pXVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFDb21wb25lbnRzKHNjaGVtYXMpIHtcbiAgLy8gYHNjaGVtYXNgIGFyZSBvZiB0aGUgc2FtZSBwb3NzaWJsZSBmb3JtcyBhcyBwYXNzZWQgdG8gYGdldE5hbWVkU2NoZW1hcygpYFxuICBhd2FpdCBtYXBDb25jdXJyZW50bHkoT2JqZWN0LnZhbHVlcyhzY2hlbWFzIHx8IHt9KSwgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgc2NoZW1hLCByb3V0ZXMsIGxldmVsKSB7XG4gIGNvbnN0IHByb21pc2VzID0gW11cbiAgY29uc3QgcHJvY2VzcyA9IChjb21wb25lbnQsIG5hbWUsIHJlbGF0aXZlTGV2ZWwpID0+IHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudChcbiAgICAgICAgYXBpLFxuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwgKyByZWxhdGl2ZUxldmVsXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBwcm9jZXNzKVxuICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSwgcHJvY2VzcylcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAvLyBBbHNvIHByb2Nlc3MgbmVzdGVkIHBhbmVsIHNjaGVtYXMuXG4gICAgbWFwQ29uY3VycmVudGx5KGdldEFsbFBhbmVsU2NoZW1hcyhzY2hlbWEpLCBwYW5lbCA9PlxuICAgICAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBwYW5lbCwgcm91dGVzLCBsZXZlbClcbiAgICApLFxuICAgIC8vIERlbGVnYXRlIHNjaGVtYSBwcm9jZXNzaW5nIHRvIHRoZSBhY3R1YWwgdHlwZSBjb21wb25lbnRzLlxuICAgIGF3YWl0IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LnByb2Nlc3NTY2hlbWE/LihcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIG5hbWUsXG4gICAgICByb3V0ZXMsXG4gICAgICBsZXZlbFxuICAgIClcbiAgXSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KGNvbXBvbmVudCwgYXBpLCBzY2hlbWEsIG5hbWUpIHtcbiAgaWYgKCFpc1ZpZXcoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2aWV3IHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYShhcGksIHNjaGVtYSwgbmFtZSlcbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICBhd2FpdCByZXNvbHZlTmVzdGVkU2NoZW1hcyhhcGksIHNjaGVtYSlcbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgY2hpbGRyZW4sIDApXG4gIHJldHVybiB7XG4gICAgcGF0aDogYC8ke3NjaGVtYS5wYXRofWAsXG4gICAgY2hpbGRyZW4sXG4gICAgY29tcG9uZW50LFxuICAgIG1ldGE6IHtcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKSB7XG4gIGxldCBkZWZhdWx0cyA9IGFwaS5kZWZhdWx0c1tzY2hlbWEudHlwZV1cbiAgaWYgKGRlZmF1bHRzKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZGVmYXVsdHMpKSB7XG4gICAgICBkZWZhdWx0cyA9IGRlZmF1bHRzKHNjaGVtYSlcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGRlZmF1bHRzKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdHMpKSB7XG4gICAgICAgIGlmIChzY2hlbWFba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2NoZW1hW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gbWVyZ2UodmFsdWUsIHNjaGVtYVtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpIHtcbiAgLy8gVXNlZCBmb3IgdmlldyBhbmQgc291cmNlIHNjaGVtYXMsIHNlZSBTb3VyY2VNaXhpbi5cbiAgc2NoZW1hLm5hbWUgPSBuYW1lXG4gIHNjaGVtYS5wYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aChuYW1lKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0Zvcm1zKGFwaSwgc2NoZW1hLCBsZXZlbCkge1xuICAvLyBGaXJzdCByZXNvbHZlIHRoZSBmb3JtcyBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgYmFjayBvbiB0aGUgc2NoZW1hLlxuICBsZXQgeyBmb3JtLCBmb3JtcywgY29tcG9uZW50cyB9ID0gc2NoZW1hXG4gIGlmIChmb3Jtcykge1xuICAgIGZvcm1zID0gc2NoZW1hLmZvcm1zID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoZm9ybXMsIGZvcm0gPT5cbiAgICAgIHByb2Nlc3NGb3JtKGFwaSwgZm9ybSlcbiAgICApXG4gIH0gZWxzZSBpZiAoZm9ybSkge1xuICAgIGZvcm0gPSBzY2hlbWEuZm9ybSA9IGF3YWl0IHByb2Nlc3NGb3JtKGFwaSwgZm9ybSlcbiAgfSBlbHNlIGlmIChjb21wb25lbnRzKSB7XG4gICAgLy8gTk9URTogUHJvY2Vzc2luZyBmb3JtcyBpbiBjb21wdXRlZCBjb21wb25lbnRzIGlzIG5vdCBzdXBwb3J0ZWQsIHNpbmNlIGl0XG4gICAgLy8gb25seSBjYW4gYmUgY29tcHV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhY3R1YWwgZGF0YS5cbiAgICBpZiAoaXNPYmplY3QoY29tcG9uZW50cykpIHtcbiAgICAgIGZvcm0gPSB7IGNvbXBvbmVudHMgfVxuICAgIH1cbiAgfVxuXG4gIGZvcm1zIHx8PSB7IGRlZmF1bHQ6IGZvcm0gfSAvLyBPbmx5IHVzZWQgZm9yIHByb2Nlc3MgbG9vcCBiZWxvdy5cbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBmb3IgKGNvbnN0IGZvcm0gb2YgT2JqZWN0LnZhbHVlcyhmb3JtcykpIHtcbiAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIGZvcm0sIGNoaWxkcmVuLCBsZXZlbClcbiAgfVxuICByZXR1cm4gY2hpbGRyZW5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGFwaSwgc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzRm9ybShzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm0gc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICBhd2FpdCByZXNvbHZlTmVzdGVkU2NoZW1hcyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1RhYihhcGksIHNjaGVtYSkge1xuICBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdHJ1ZSlcbiAgaWYgKCFpc1RhYihzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhYiBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQYW5lbChhcGksIHNjaGVtYSkge1xuICBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdHJ1ZSlcbiAgaWYgKCFpc1BhbmVsKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFuZWwgc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTmVzdGVkU2NoZW1hcyhhcGksIHNjaGVtYSkge1xuICBjb25zdCB7IHRhYnMsIHBhbmVscyB9ID0gc2NoZW1hXG4gIGlmICh0YWJzKSB7XG4gICAgc2NoZW1hLnRhYnMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhcbiAgICAgIHRhYnMsXG4gICAgICB0YWIgPT4gcHJvY2Vzc1RhYihhcGksIHRhYilcbiAgICApXG4gIH1cbiAgaWYgKHBhbmVscykge1xuICAgIHNjaGVtYS5wYW5lbHMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhcbiAgICAgIHBhbmVscyxcbiAgICAgIHBhbmVsID0+IHByb2Nlc3NQYW5lbChhcGksIHBhbmVsKVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRm9ybVNjaGVtYShzY2hlbWEpIHtcbiAgLy8gU3VwcG9ydCBib3RoIHNpbmdsZSBmb3JtIGFuZCBtdWx0aXBsZSBmb3JtcyBub3RhdGlvbiwgYXMgd2VsbCBhcyBpbmxpbmVkXG4gIC8vIGNvbXBvbmVudHMuXG4gIHJldHVybiAoXG4gICAgaXNTY2hlbWEoc2NoZW1hKSAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYS5mb3JtIHx8IHNjaGVtYS5mb3JtcyB8fCBzY2hlbWEuY29tcG9uZW50cylcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIChcbiAgICBpc1NjaGVtYShzY2hlbWEpICYmXG4gICAgT2JqZWN0LmtleXMoc2NoZW1hPy5mb3JtcyB8fCB7fSkubGVuZ3RoID4gMVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NpbmdsZUNvbXBvbmVudFZpZXcoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgaXNWaWV3KHNjaGVtYSkgJiZcbiAgICBpc09iamVjdChzY2hlbWEuY29tcG9uZW50KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3Rm9ybVNjaGVtYShzY2hlbWEsIGNvbnRleHQpIHtcbiAgY29uc3QgeyB2aWV3IH0gPSBzY2hlbWFcbiAgY29uc3Qgdmlld1NjaGVtYSA9IHZpZXcgJiYgY29udGV4dC52aWV3c1t2aWV3XVxuICByZXR1cm4gdmlld1NjaGVtYVxuICAgID8gLy8gTk9URTogVmlld3MgY2FuIGhhdmUgdGFicywgaW4gd2hpY2ggY2FzZSB0aGUgdmlldyBjb21wb25lbnQgaXMgbmVzdGVkXG4gICAgICAvLyBpbiBvbmUgb2YgdGhlIHRhYnMsIGdvIGZpbmQgaXQuXG4gICAgICBmaW5kU2NoZW1hQ29tcG9uZW50KHZpZXdTY2hlbWEsIGhhc0Zvcm1TY2hlbWEpIHx8IG51bGxcbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdTY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIHJldHVybiBnZXRWaWV3Rm9ybVNjaGVtYShzY2hlbWEsIGNvbnRleHQpXG4gICAgPyBjb250ZXh0LnZpZXdzW3NjaGVtYS52aWV3XVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0VkaXRQYXRoKHNjaGVtYSwgY29udGV4dCkge1xuICBjb25zdCB2aWV3ID0gZ2V0Vmlld1NjaGVtYShzY2hlbWEsIGNvbnRleHQpXG4gIHJldHVybiB2aWV3XG4gICAgPyBpc1NpbmdsZUNvbXBvbmVudFZpZXcodmlldylcbiAgICAgID8gYC8ke3ZpZXcucGF0aH1gXG4gICAgICA6IGAvJHt2aWV3LnBhdGh9LyR7dmlldy5wYXRofWBcbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1TY2hlbWFzKHNjaGVtYSwgY29udGV4dCwgbW9kaWZ5Rm9ybSkge1xuICBjb25zdCB2aWV3U2NoZW1hID0gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICBpZiAodmlld1NjaGVtYSkge1xuICAgIHNjaGVtYSA9IHZpZXdTY2hlbWFcbiAgfSBlbHNlIGlmIChzY2hlbWEudmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB2aWV3OiAnJHtzY2hlbWEudmlld30nYClcbiAgfVxuXG4gIGxldCB7IGZvcm0sIGZvcm1zLCBjb21wb25lbnRzLCBjb21wYWN0IH0gPSBzY2hlbWFcbiAgaWYgKCFmb3JtICYmICFmb3Jtcykge1xuICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAvLyBDb252ZXJ0IGlubGluZWQgY29tcG9uZW50cyB0byBmb3Jtcywgc3VwcG9ydGluZyBgY29tcGFjdGAgc2V0dGluZy5cbiAgICAgIGZvcm0gPSB7IGNvbXBvbmVudHMsIGNvbXBhY3QgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBgZm9ybXNgLCBgZm9ybWAgb3IgYGNvbXBvbmVudHNgLCByZXR1cm4gYW5kIGVtcHR5IGBmb3Jtc2Agb2JqZWN0LlxuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG4gIGZvcm1zIHx8PSB7IGRlZmF1bHQ6IGZvcm0gfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGZvcm1zKS5tYXAoKFt0eXBlLCBmb3JtXSkgPT4ge1xuICAgICAgLy8gU3VwcG9ydCBgc2NoZW1hLmNvbXBvbmVudHNgIGNhbGxiYWNrcyB0byBjcmVhdGUgY29tcG9uZW50cyBvbiB0aGUgZmx5LlxuICAgICAgaWYgKGlzRnVuY3Rpb24oZm9ybS5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3JtID0ge1xuICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgY29tcG9uZW50czogZm9ybS5jb21wb25lbnRzKGNvbnRleHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdHlwZSwgbW9kaWZ5Rm9ybT8uKGZvcm0pID8/IGZvcm1dXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pIHtcbiAgcmV0dXJuIGZvcm1zW2l0ZW0/LnR5cGVdIHx8IGZvcm1zLmRlZmF1bHQgfHwgbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KSB7XG4gIHJldHVybiBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyhnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQpLCBpdGVtKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYWN0KHNjaGVtYSkge1xuICByZXR1cm4gISFzY2hlbWEuY29tcGFjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmVkKHNjaGVtYSkge1xuICByZXR1cm4gISEoc2NoZW1hLmlubGluZWQgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5uZXN0ZWQgfHwgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdE5lc3RlZCA9PT0gdHJ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9taXRQYWRkaW5nKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5vbWl0UGFkZGluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25Cb3R0b20oc2NoZW1hKSB7XG4gIHJldHVybiAhIWdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmFsaWduQm90dG9tXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMgYm90aCBvbiBzY2hlbWEgYW5kIG9uIGNvbXBvbmVudCBsZXZlbC5cbiAgLy8gTk9URTogQXQgdGhlIHRpbWUgb2YgY3JlYXRpb24sIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQsIChlLmcuIGlmXG4gIC8vIGVudHJpZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBuZXN0ZWQgZm9ybXMsIHRoZSBwYXJlbnQgZm9ybSBpc24ndCBtb3VudGVkKSBzb1xuICAvLyB3ZSBjYW4ndCB1c2UgYGRhdGFQYXRoYCB0byBnZXQgdG8gY29tcG9uZW50cywgYW5kIHRoZSBgZGVmYXVsdFZhbHVlYCBmcm9tXG4gIC8vIHRoZXJlLiBUaGF0J3Mgd2h5IGBkZWZhdWx0VmFsdWVgIGlzIGRlZmluZWQgc3RhdGljYWxseSBpbiB0aGUgY29tcG9uZW50czpcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gc2NoZW1hLmRlZmF1bHRcbiAgY29uc3QgdmFsdWUgPVxuICAgIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgOiBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5kZWZhdWx0VmFsdWVcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpXG4gICAgPyB2YWx1ZShzY2hlbWEpXG4gICAgOiBjbG9uZSh2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpIHtcbiAgY29uc3QgdHlwZU9wdGlvbnMgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpXG4gIHJldHVybiAhIShcbiAgICB0eXBlT3B0aW9ucz8uZXhjbHVkZVZhbHVlIHx8IHR5cGVPcHRpb25zPy5pZ25vcmVNaXNzaW5nVmFsdWU/LihzY2hlbWEpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCBkYXRhID0ge30sIGNvbXBvbmVudCkge1xuICBjb25zdCBvcHRpb25zID0geyBjb21wb25lbnQsIHJvb3REYXRhOiBkYXRhIH1cblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSkgPT4ge1xuICAgIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIWlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpKSB7XG4gICAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSlcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHVwIGEgZGF0YSBvYmplY3QgdGhhdCBoYXMga2V5cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGxcbiAgLy8gZm9ybSBmaWVsZHMsIHNvIHRoZXkgY2FuIGJlIGNvcnJlY3RseSB3YXRjaGVkIGZvciBjaGFuZ2VzLlxuICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgbnVsbCxcbiAgICBvcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCA9IG51bGwsXG4gIHJvb3REYXRhID0gY29tcG9uZW50Py5yb290RGF0YVxufSA9IHt9KSB7XG4gIGNvbnN0IHsgY29tcHV0ZSB9ID0gc2NoZW1hXG4gIGlmIChjb21wdXRlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21wdXRlKFxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC8vIE92ZXJyaWRlIHZhbHVlIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gdGhyb3VnaCBjYWxsaW5nIHRoZVxuICAgICAgICAvLyBnZXR0ZXIgZm9yIGB0aGlzLnZhbHVlYCBpbiBgRGl0b0NvbnRleHRgOlxuICAgICAgICB2YWx1ZTogZGF0YVtuYW1lXSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhXG4gICAgICB9KVxuICAgIClcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWNjZXNzIGBkYXRhW25hbWVdYCBkaXJlY3RseSBpbnN0ZWFkIG9mIGB0aGlzLnZhbHVlID0g4oCmYCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyB2YWx1ZSB3aXRob3V0IGNhbGxpbmcgcGFyc2UoKTpcbiAgICAgIGRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICAvLyBJZiB0aGUgdmFsdWUgaXMgc3RpbGwgbWlzc2luZyBhZnRlciBjb21wdXRlLCBzZXQgdGhlIGRlZmF1bHQgZm9yIGl0OlxuICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgIGRhdGFbbmFtZV0gPSBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKVxuICB9XG4gIC8vIE5vdyBhY2Nlc3MgdGhlIHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcmVhY3Rpdml0eSBhbmQgbmVlZHMgdG9cbiAgLy8gaGFwcGVuIGFmdGVyIGFsbCBwcmlvciBtYW5pcHVsYXRpb24gb2YgYGRhdGFbbmFtZV1gLCBzZWUgYWJvdmU6XG4gIHJldHVybiBkYXRhW25hbWVdXG59XG5cbmZ1bmN0aW9uIGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc2NoZW1hT25seSkge1xuICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgIGNvbnN0IHsgaWRLZXkgPSAnaWQnLCBvcmRlcktleSB9ID0gc291cmNlU2NoZW1hXG4gICAgY29uc3QgaWQgPSBpdGVtW2lkS2V5XVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3B5W2lkS2V5XSA9IGlkXG4gICAgfVxuICAgIC8vIENvcHkgb3ZlciB0eXBlIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgIGlmIChoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNvdXJjZVNjaGVtYSkpIHtcbiAgICAgIGNvcHkudHlwZSA9IGl0ZW0udHlwZVxuICAgIH1cbiAgICBpZiAob3JkZXJLZXkpIHtcbiAgICAgIGNvcHlbb3JkZXJLZXldID0gaXRlbVtvcmRlcktleV1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoc2NoZW1hLCBzb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCxcbiAgc2NoZW1hT25seSwgLy8gd2hldGhlciB0byBvbmx5IGluY2x1ZGUgZGF0YSBjb3ZlcmVkIGJ5IHRoZSBzY2hlbWEsIG9yIGFsbCBkYXRhXG4gIHRhcmdldFxufSA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7IGNvbXBvbmVudCwgc2NoZW1hT25seSwgdGFyZ2V0LCByb290RGF0YTogZGF0YSB9XG4gIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBkYXRhLCBvcHRpb25zKVxuICBjb25zdCBncmFwaCA9IG5ldyBTY2hlbWFHcmFwaCgpXG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBwcm9jZXNzZWREYXRhKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY29tcHV0ZVZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIG9wdGlvbnMpXG4gICAgLy8gVGhlIHNjaGVtYSBleHBlY3RzIHRoZSBgd3JhcFByaW1pdGl2ZXNgIHRyYW5zZm9ybWF0aW9ucyB0byBiZSBwcmVzZW50IG9uXG4gICAgLy8gdGhlIGRhdGEgdGhhdCBpdCBpcyBhcHBsaWVkIG9uLCBzbyB3YXJwIGJlZm9yZSBhbmQgdW53cmFwIGFmdGVyLlxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcywgb3JkZXJLZXksIGlkS2V5ID0gJ2lkJyB9ID0gc2NoZW1hXG4gICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgICBbd3JhcFByaW1pdGl2ZXNdOiBlbnRyeVxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFsd2F5cyBzaGFsbG93LWNsb25lIGFycmF5IHZhbHVlczpcbiAgICAgICAgdmFsdWUgPSBbLi4udmFsdWVdXG4gICAgICB9XG4gICAgICBpZiAob3JkZXJLZXkgJiYgdGFyZ2V0ID09PSAnY2xpcGJvYXJkJykge1xuICAgICAgICAvLyBTb3J0IHRoZSBkYXRhIGJhY2sgaW50byB0aGUgbmF0dXJhbCBzZXF1ZW5jZSBhcyBkZWZpbmVkIGJ5IHRoZWlyIGlkcyxcbiAgICAgICAgLy8gc28gY29weS1wYXN0aW5nIGJldHdlZW4gc2VydmVycyAoZS5nLiBuZXN0ZWQgZm9udC1jdXRzIG9uIExpbmV0bylcbiAgICAgICAgLy8gbmF0dXJhbGx5IGdldHMgbWFwcGVkIHRvIHRoZSBzYW1lIGVudHJpZXMgaW4gdGhlIGdyYXBoLlxuICAgICAgICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQxID0gYT8uW2lkS2V5XVxuICAgICAgICAgIGNvbnN0IGlkMiA9IGI/LltpZEtleV1cbiAgICAgICAgICByZXR1cm4gaWQxID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDEpXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogaWQyID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDIpXG4gICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgOiBpZDEgLSBpZDJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gIH1cblxuICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIGV4Y2x1ZGUsIHByb2Nlc3MgfSA9IHNjaGVtYVxuICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGFbbmFtZV1cblxuICAgIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuXG4gICAgLy8gTk9URTogV2UgZG9uJ3QgY2FjaGUgdGhpcyBjb250ZXh0LCBzaW5jZSBgdmFsdWVgIGlzIGNoYW5naW5nLlxuICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PlxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGEsXG4gICAgICAgIC8vIFBhc3MgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgdG8gYHByb2Nlc3MoKWAsIHNvIGl0IGNhbiBiZSBtb2RpZmllZFxuICAgICAgICAvLyB0aHJvdWdoIGBwcm9jZXNzZWRJdGVtYCBmcm9tIHRoZXJlLlxuICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICB9KVxuXG4gICAgLy8gRmlyc3QgdW53cmFwIHRoZSB3cmFwcGVkIHByaW1pdGl2ZXMgYWdhaW4sIHRvIGJyaW5nIHRoZSBkYXRhIGJhY2sgaW50b1xuICAgIC8vIGl0cyBuYXRpdmUgZm9ybS4gU2UgYHByb2Nlc3NCZWZvcmUoKWAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBpZiAod3JhcFByaW1pdGl2ZXMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKG9iamVjdCA9PiBvYmplY3Rbd3JhcFByaW1pdGl2ZXNdKVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdXNlcidzIGBwcm9jZXNzKClgIGNhbGxiYWNrIGZpcnN0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KCkpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fFxuICAgICAgLy8gU3VwcG9ydCBmdW5jdGlvbnMgbmV4dCB0byBib29sZWFucyBmb3IgYHNjaGVtYS5leGNsdWRlYDpcbiAgICAgIGV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgIGlzRnVuY3Rpb24oZXhjbHVkZSkgJiYgZXhjbHVkZShnZXRDb250ZXh0KCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzc2VkRGF0YVtuYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgICAvLyB0byBjb252ZXJ0IHRoZSBkYXRhIGZvciBzdG9yYWdlLlxuICAgICAgY29uc3QgcHJvY2Vzc1ZhbHVlID0gdHlwZU9wdGlvbnM/LnByb2Nlc3NWYWx1ZVxuICAgICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpXG4gICAgICB9XG4gICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICBzY2hlbWEsXG4gICAgZGF0YSxcbiAgICBkYXRhUGF0aCxcbiAgICBwcm9jZXNzZWREYXRhLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgcHJvY2Vzc0FmdGVyLFxuICAgIG9wdGlvbnNcbiAgKVxuXG4gIHJldHVybiBncmFwaC5wcm9jZXNzKHNvdXJjZVNjaGVtYSwgcHJvY2Vzc2VkRGF0YSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEYXRhKFxuICBzY2hlbWEsXG4gIGRhdGEsXG4gIGRhdGFQYXRoLFxuICBwcm9jZXNzZWREYXRhLFxuICBwcm9jZXNzQmVmb3JlLFxuICBwcm9jZXNzQWZ0ZXIsXG4gIG9wdGlvbnNcbikge1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT4ge1xuICAgIGNvbnN0IGdldERhdGFQYXRoID0gKGRhdGFQYXRoLCB0b2tlbikgPT5cbiAgICAgIGRhdGFQYXRoICE9IG51bGxcbiAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pXG4gICAgICAgIDogbnVsbFxuXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZChjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIHVubmVzdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RGF0YVBhdGggPSBnZXREYXRhUGF0aChkYXRhUGF0aCwgbmFtZSlcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NJdGVtID0gKGl0ZW0sIGluZGV4ID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPVxuICAgICAgICAgICAgICBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZ2V0RGF0YVBhdGgoY29tcG9uZW50RGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgICAgIDogY29tcG9uZW50RGF0YVBhdGhcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgZ2V0Rm9ybXMgPSAoXG4gICAgICAgICAgICAgIGdldFR5cGVPcHRpb25zKGNvbXBvbmVudFNjaGVtYSk/LmdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyB8fFxuICAgICAgICAgICAgICBnZXRGb3JtU2NoZW1hc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZm9ybXMgPSBnZXRGb3Jtcyhjb21wb25lbnRTY2hlbWEsIGNvbnRleHQpXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pXG4gICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtID0gcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgICAgICAgID8gY2xvbmVJdGVtKGNvbXBvbmVudFNjaGVtYSwgaXRlbSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSXRlbXMgd2l0aG91dCBmb3JtcyBzdGlsbCBnZXQgZnVsbHkgKGJ1dCBzaGFsbG93bHkpIGNsb25lZC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgb2YgdGhpcyBpcyBhY3R1YWxseSBuZWVkZWQgLyB1c2VkIGF0IGFsbD9cbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzc0JlZm9yZT8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgICAgbGV0IHZhbHVlID0gcHJvY2Vzc2VkRGF0YSA/IHByb2Nlc3NlZERhdGFbbmFtZV0gOiBkYXRhW25hbWVdXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaGFzRm9ybVNjaGVtYShjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGRhdGEgb24gbmVzdGVkIGZvcm0gaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBObyBuZWVkIHRvIGNvbGxlY3QgdmFsdWVzIGlmIHdlJ3JlIG5vdCBjbG9uaW5nIVxuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzSXRlbSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmZvckVhY2gocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NJdGVtKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3NBZnRlcj8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcG9uZW50cyhzY2hlbWEuY29tcG9uZW50cylcbiAgZm9yIChjb25zdCB0YWIgb2YgZ2V0QWxsVGFiU2NoZW1hcyhzY2hlbWEpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gIH1cbiAgZm9yIChjb25zdCBwYW5lbCBvZiBnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHBhbmVsLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbEVudHJ5KHNjaGVtYSwgZGF0YVBhdGggPSBudWxsLCB0YWJDb21wb25lbnQgPSBudWxsKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBuYW1lLCBhcHBlbmQgaXQgdG8gdGhlIGRhdGFQYXRoLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZS5nLiBmb3IgJGZpbHRlcnMgcGFuZWxzLlxuICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICBkYXRhUGF0aCAhPSBudWxsICYmIHNjaGVtYS5uYW1lXG4gICAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzY2hlbWEubmFtZSlcbiAgICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyaWVzKFxuICBwYW5lbFNjaGVtYXMsXG4gIGRhdGFQYXRoID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbCxcbiAgcGFuZWxFbnRyaWVzID0gW11cbikge1xuICBpZiAocGFuZWxTY2hlbWFzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhbmVsU2NoZW1hcykpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZ2V0UGFuZWxFbnRyeShcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBkYXRhUGF0aCAhPSBudWxsID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGtleSkgOiBudWxsLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsVGFiU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8udGFicyA/IE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMpIDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFBhbmVsU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIGdldEFsbFBhbmVsRW50cmllcyhzY2hlbWEpLm1hcChlbnRyeSA9PiBlbnRyeS5zY2hlbWEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gIHNjaGVtYSxcbiAgZGF0YVBhdGggPSBudWxsLFxuICBzY2hlbWFDb21wb25lbnQgPSBudWxsLFxuICB0YWJDb21wb25lbnQgPSBudWxsXG4pIHtcbiAgY29uc3QgcGFuZWxTY2hlbWEgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5nZXRQYW5lbFNjaGVtYT8uKFxuICAgIHNjaGVtYSxcbiAgICBkYXRhUGF0aCxcbiAgICBzY2hlbWFDb21wb25lbnRcbiAgKVxuICBjb25zdCBwYW5lbEVudHJpZXMgPSBwYW5lbFNjaGVtYVxuICAgID8gW2dldFBhbmVsRW50cnkocGFuZWxTY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXVxuICAgIDogW11cbiAgLy8gQWxsb3cgZWFjaCBjb21wb25lbnQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiBwYW5lbHMsIGluXG4gIC8vIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IG9uZSAoZS5nLiBnZXRGaWx0ZXJzUGFuZWwoKSwgJGZpbHRlcnMpOlxuICBnZXRQYW5lbEVudHJpZXMoc2NoZW1hPy5wYW5lbHMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVsRW50cmllcylcbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdvYmplY3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdsaXN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICBjb25zdCBpZCA9IGl0ZW1bc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgLy8gVHJ5IHRvIHVzZSB0aGUgaXRlbSBpZCBhcyB0aGUgdWlkLCBmYWxsaW5nIGJhY2sgb24gYXV0by1nZW5lcmF0ZWQgaWRzLCBidXRcbiAgLy8gZWl0aGVyIHdheSwgcGFzcyB0aHJvdWdoIGBnZXRVaWQoKWAgc28gdGhhdCB0aGUgaWRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGl0ZW0gdGhyb3VnaCBhIHdlYWsgbWFwLCBhcyB0aGUgaWRzIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaW4gYHByb2Nlc3NEYXRhKClgXG4gIC8vIHdoaWxlIHRoZSBjb21wb25lbnRzIHRoYXQgdXNlIHRoZSB1aWRzIGFzIGtleSBhcmUgc3RpbGwgdmlzaWJsZS5cbiAgcmV0dXJuIGdldFVpZChpdGVtLCBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSlcbn1cbiIsIi8vIEEgbWluaS1yZXBsaWNhdGlvbiBvZiB2dWUncyBpbnRlcm5hbCBgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoKWAgYnV0IG9ubHlcbi8vIGhhbmRsaW5nIG91ciBvd24gYWRkZWQgb3B0aW9ucyBwcm9wZXJ0aWVzIGFuZCBtZXJnaW5nIHRoZW0gZWFybHkgaW5zdGVhZFxuLy8gb2YgbGF6aWx5LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMob3B0aW9ucykge1xuICBjb25zdCB7IG1peGlucyB9ID0gb3B0aW9uc1xuICByZXR1cm4gbWl4aW5zIHx8IG9wdGlvbnMuZXh0ZW5kc1xuICAgID8gbWVyZ2VPcHRpb25zKFxuICAgICAgICB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIDogb3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmIChmcm9tLmV4dGVuZHMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGZyb20uZXh0ZW5kcylcbiAgfVxuICBpZiAoZnJvbS5taXhpbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1peGluIG9mIGZyb20ubWl4aW5zKSB7XG4gICAgICBtZXJnZU9wdGlvbnModG8sIG1peGluKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBkaXRvT3B0aW9uS2V5cykge1xuICAgIGlmIChrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuY29uc3QgZGl0b09wdGlvbktleXMgPSBbXG4gICdkZWZhdWx0VmFsdWUnLFxuICAnZGVmYXVsdE5lc3RlZCcsXG4gICdkZWZhdWx0VmlzaWJsZScsXG4gICdnZW5lcmF0ZUxhYmVsJyxcbiAgJ2V4Y2x1ZGVWYWx1ZScsXG4gICdpZ25vcmVNaXNzaW5nVmFsdWUnLFxuICAnYWxpZ25Cb3R0b20nLFxuICAnb21pdFBhZGRpbmcnLFxuICAncHJvY2Vzc1ZhbHVlJyxcbiAgJ3Byb2Nlc3NTY2hlbWEnLFxuICAnZ2V0UGFuZWxTY2hlbWEnLFxuICAnZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nJyxcbiAgLy8gVnVlIDMgLyBWdWUtcm91dGVyIDQgZm9yZ2V0cyB0aGVzZS5cbiAgLy8gVE9ETzogQ3JlYXRlIGJ1Zy1yZXBvcnQ/XG4gICdiZWZvcmVSb3V0ZVVwZGF0ZScsXG4gICdiZWZvcmVSb3V0ZUxlYXZlJ1xuXVxuIiwiaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlTWVyZ2VkT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvb3B0aW9ucy5qcydcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCBjb21wb25lbnRzID0ge31cblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGl0b01peGluXSxcbiAgLy8gTWFrZSBzdXJlIHRoYXQgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFyZSBwcmVzZW50IGluIGFsbCBEaXRvQ29tcG9uZW50LlxuICBjb21wb25lbnRzLFxuXG4gIGNvbXBvbmVudChuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgIGRlZmluaXRpb24gPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyh7XG4gICAgICAgICAgZXh0ZW5kczogdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIC4uLmRlZmluaXRpb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICAgIGlmICghKG5hbWUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIG5vdCByZWdpc3RlcmVkYClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VHlwZUNvbXBvbmVudFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvVXNlciB7XG4gIGhhc1JvbGUoLi4ucm9sZXMpIHtcbiAgICBpZiAodGhpcy5yb2xlcykge1xuICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFDb21wb25lbnRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1haW5TY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzWzBdXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYERpdG9TY2hlbWEuY3JlYXRlZCgpL3VubW91bnRlZCgpYCBvbiBpdHNcbiAgICAvLyBgJHNjaGVtYVBhcmVudENvbXBvbmVudGAsIGlmIHRoZSBwYXJlbnQgdXNlcyB0aGUgYFNjaGVtYVBhcmVudE1peGluYDpcbiAgICBfcmVnaXN0ZXJTY2hlbWFDb21wb25lbnQoc2NoZW1hQ29tcG9uZW50LCBhZGQpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBzY2hlbWFDb21wb25lbnRzLnB1c2goc2NoZW1hQ29tcG9uZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5zcGxpY2Uoc2NoZW1hQ29tcG9uZW50cy5pbmRleE9mKHNjaGVtYUNvbXBvbmVudCksIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2NoZW1hUGFyZW50TWl4aW4gZnJvbSAnLi9TY2hlbWFQYXJlbnRNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQsIHsgZXJyb3JzIH0pID0+XG4gICAgICAgICAgZXJyb3JzICYmIHJlc3VsdCA/IHJlc3VsdC5jb25jYXQoZXJyb3JzKSA6IGVycm9ycyxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChcbiAgICAgICAgaXQgPT4gaXQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cylcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRDb21tb25QcmVmaXggfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBFYWNoIHJvdXRlLWNvbXBvbmVudCBkZWZpbmVzIGEgc3RvcmUgdGhhdCBnZXRzIHBhc3NlZCBvbiB0byBpdHNcbiAgICAgIC8vIGNoaWxkIGNvbXBvbmVudHMsIHNvIHRoZXkgY2FuIHN0b3JlIHZhbHVlcyBpbiB0aGVtIHRoYXQgbGl2ZSBiZXlvbmRcbiAgICAgIC8vIHRoZWlyIGxpZmUtY3ljbGUuIFNlZTogRGl0b1BhbmUsIFNvdXJjZU1peGluXG4gICAgICBzdG9yZToge30sXG4gICAgICBsb2FkQ2FjaGU6IHt9IC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyByb3V0ZUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcm91dGVMZXZlbCgpIHtcbiAgICAgIGxldCBsZXZlbCA9IDBcbiAgICAgIGxldCByb3V0ZUNvbXBvbmVudCA9IHRoaXNcbiAgICAgIHdoaWxlICgocm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudC5wYXJlbnRDb21wb25lbnQucm91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQ/Lm1ldGFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlUGF0aCh0aGlzLnJvdXRlUmVjb3JkLnBhdGgpXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWIoKSB7XG4gICAgICBjb25zdCB7IGJyZWFkY3J1bWIgfSA9IHRoaXMuc2NoZW1hIHx8IHt9XG4gICAgICByZXR1cm4gYnJlYWRjcnVtYiB8fCBgJHt0aGlzLmJyZWFkY3J1bWJQcmVmaXh9ICR7dGhpcy5sYWJlbH1gXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWJQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9LFxuXG4gICAgcGFyYW0oKSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciB2dWUtcm91dGVyIG5vdCBiZWluZyBhYmxlIHRvIG1hcCBtdWx0aXBsZSB1cmwgcGFyYW1ldGVyc1xuICAgICAgLy8gd2l0aCB0aGUgc2FtZSBuYW1lIHRvIG11bHRpcGxlIGNvbXBvbmVudHMsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8xMzQ1XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucGFyYW1zW3RoaXMubWV0YT8ucGFyYW1dIHx8IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlLCBzZWUgRGl0b0Zvcm1cbiAgICBpc011dGF0aW5nKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZVJvdXRlVXBkYXRlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcz8uYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpXG4gIH0sXG5cbiAgYmVmb3JlUm91dGVMZWF2ZSh0bywgZnJvbSwgbmV4dCkge1xuICAgIHRoaXM/LmJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gS2VlcCBhIHNoYXJlZCBzdGFjayBvZiByb290IGNvbXBvbmVudHMgZm9yIERpdG9UcmFpbCB0byB1c2UgdG8gcmVuZGVyXG4gICAgLy8gbGFiZWxzLiBDYW4ndCByZWx5IG9uICRyb3V0ZS5tYXRjaGVkW2ldLmluc3RhbmNlcy5kZWZhdWx0IHVuZm9ydHVuYXRlbHksXG4gICAgLy8gYXMgaW5zdGFuY2VzIGFyZW4ndCBpbW1lZGlhdGVseSByZWFkeSwgYW5kIGluc3RhbmNlcyBpcyBub3QgcmVhY3RpdmUuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMucHVzaCh0aGlzKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHJvdXRlQ29tcG9uZW50cyB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgIHJvdXRlQ29tcG9uZW50cy5zcGxpY2Uocm91dGVDb21wb25lbnRzLmluZGV4T2YodGhpcyksIDEpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgICBsZXQgb2sgPSB0cnVlXG4gICAgICBjb25zdCBpc0Nsb3NpbmcgPSAoXG4gICAgICAgIC8vIE9ubHkgaGFuZGxlIHRoaXMgcm91dGUgY2hhbmdlIGlmIHRoZSBmb3JtIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGVcbiAgICAgICAgLy8gYGZyb21gIHJvdXRlLCBidXQgaW5jbHVkZSBwYXJlbnQgZm9ybXMgb2YgY2xvc2luZyBuZXN0ZWQgZm9ybXMgYXMgYXNcbiAgICAgICAgLy8gd2VsbCwgYnkgbWF0Y2hpbmcgdGhlIHRoZSBzdGFydCBvZiBmcm9tL3RvIHBhdGggYWdhaW5zdCBgdGhpcy5wYXRoYDpcbiAgICAgICAgZnJvbS5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAhdG8ucGF0aC5zdGFydHNXaXRoKHRoaXMucGF0aCkgJiZcbiAgICAgICAgLy8gRXhjbHVkZSBoYXNoIGNoYW5nZXMgb25seSAoPSB0YWIgY2hhbmdlcyk6XG4gICAgICAgIGZyb20ucGF0aCAhPT0gdG8ucGF0aCAmJiAoXG4gICAgICAgICAgdGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkgfHxcbiAgICAgICAgICAvLyBEZWNpZGUgaWYgd2UncmUgbW92aW5nIHRvd2FyZHMgYSBuZXcgbmVzdGVkIGZvcm0sIG9yIGNsb3NpbmcgL1xuICAgICAgICAgIC8vIHJlcGxhY2luZyBhbiBhbHJlYWR5IG9wZW4gb25lIGJ5IGNvbXBhcmluZyBwYXRoIGxlbmd0aHMuXG4gICAgICAgICAgLy8gVGhlIGNhc2Ugb2YgYD1gIG1hdGNoZXMgdGhlIHJlcGxhY2luZyBvZiBhbiBhbHJlYWR5IG9wZW4gb25lLlxuICAgICAgICAgIHRvLnBhdGgubGVuZ3RoIDw9IGZyb20ucGF0aC5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgaWYgKGlzQ2xvc2luZykge1xuICAgICAgICBpZiAodGhpcy5pc011dGF0aW5nKSB7XG4gICAgICAgICAgLy8gRm9yIGFjdGl2ZSBkaXJlY3RseSBtdXRhdGluZyAobmVzdGVkKSBmb3JtcyB0aGF0IHdlcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAgIC8vIHlldCwgdmFsaWRhdGUgdGhlbSBvbmNlLiBJZiB0aGUgdXNlciB0aGVuIHN0aWxsIHdhbnRzIHRvIGxlYXZlXG4gICAgICAgICAgLy8gdGhlbSwgdGhleSBjYW4gY2xpY2sgY2xvc2UgLyBuYXZpZ2F0ZSBhd2F5IGFnYWluLlxuICAgICAgICAgIG9rID0gKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRlZCB8fFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUFsbCgpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBmb3JtIGRvZXNuJ3QgZGlyZWN0bHkgbXV0YXRlIGRhdGEuIElmIGl0IGlzIGRpcnR5LCBhc2sgaWYgdXNlclxuICAgICAgICAgIC8vIHdhbnRzIHRvIHBlcnNpc3QgZGF0YSBmaXJzdC5cbiAgICAgICAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgICAgICBgWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmJzLmNhbmNlbFxuICAgICAgICAgICAgICB9P2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQob2spXG4gICAgfSxcblxuICAgIGdldFJvdXRlUGF0aCh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgIC8vIE1hcHMgdGhlIHJvdXRlJ3MgYWN0dWFsIHBhdGggdG8gdGhlIG1hdGNoZWQgcm91dGVzIGJ5IGNvdW50aW5nIGl0c1xuICAgICAgLy8gcGFydHMgc2VwYXJhdGVkIGJ5ICcvJywgc3BsaXR0aW5nIHRoZSBwYXRoIGludG8gdGhlIG1hcHBlZCBwYXJ0c1xuICAgICAgLy8gY29udGFpbmluZyBhY3R1YWwgcGFyYW1ldGVycy5cbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5zbGljZSgwLCB0ZW1wbGF0ZVBhdGguc3BsaXQoJy8nKS5sZW5ndGgpXG4gICAgICAgIC5qb2luKCcvJylcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRQYXRoKHBhdGgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIGlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBUaGUgcm91dGUgcGF0aCBpcyB0aGUgcGF0aCB1cCB0byB0aGUgZmlyc3QgLyAoZXhjbHVkaW5nIHRoZSBpbml0aWFsIC8pOlxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLnBhdGgubWF0Y2goL14oXFwvW14vXSopLylbMV1cbiAgICAgIHJldHVybiAhZ2V0Q29tbW9uUHJlZml4KHRvLnBhdGgsIGZyb20ucGF0aCkuc3RhcnRzV2l0aChyb290UGF0aClcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZW1wbGF0ZShcbiAgdi1pZj1cInVzZXJcIlxuKVxuICAvLy0gT25seSByZW5kZXIgRGl0b1ZpZXcgd2hlbiBpdCBpcyBhY3RpdmUsIG90aGVyd2lzZSBhIG5vcm1hbCByb3V0ZXItdmlld1xuICAvLy0gaW5zdGVhZCwgdG8gbmVzdCBmdXJ0aGVyIHJvdXRlIGNvbXBvbmVudHMuXG4gIC8vLSBOT1RFOiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBoYW5kbGluZyBpbiBEaXRvRm9ybSwgd2hlcmUgYHYtc2hvd2AgaXNcbiAgLy8tIHVzZWQgdG8gYWx3YXlzIHJlbmRlciBmb3JtcyBldmVuIHdoZW4gb3RoZXIgbmVzdGVkIGZvcm1zIGFyZSBwcmVzZW50LlxuICBSb3V0ZXJWaWV3KFxuICAgIHYtaWY9XCIhaXNMYXN0Um91dGVcIlxuICAgIDprZXk9XCJuYW1lXCJcbiAgKVxuICAuZGl0by12aWV3LmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgICB2LWVsc2UtaWY9XCJzaG91bGRSZW5kZXIodmlld1NjaGVtYSlcIlxuICAgIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuICApXG4gICAgRGl0b1NjaGVtYS5kaXRvLXNjcm9sbChcbiAgICAgIDpzY2hlbWE9XCJ2aWV3U2NoZW1hXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShuYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZmFsc2VcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IHsgc29tZVNjaGVtYUNvbXBvbmVudCwgaXNTaW5nbGVDb21wb25lbnRWaWV3IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVmlldycsIHtcbiAgbWl4aW5zOiBbUm91dGVNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICAvLyBSZWRpcmVjdCAkc291cmNlQ29tcG9uZW50IGFuZCAkcmVzb3VyY2VDb21wb25lbnQgdG8gdGhlIG1haW4gY29tcG9uZW50OlxuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnNvdXJjZUNvbXBvbmVudCB8fCBudWxsLFxuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnJlc291cmNlQ29tcG9uZW50IHx8IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gVXBkYXRlZCBmcm9tIExvYWRpbmdNaXhpbiB0aHJvdWdoIGBzZXRMb2FkaW5nKGlzTG9hZGluZylgOlxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIC8vIE5PVEU6IERhdGEgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdmlld3MgYmVjYXVzZSB0aGUgcm91dGVyIHJlY3ljbGVzIHRoZVxuICAgICAgLy8gRGl0b1ZpZXcgY29tcG9uZW50LlxuICAgICAgZGF0YToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLnNjaGVtYVxuICAgIH0sXG5cbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgaXNWaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnRWaWV3KCkge1xuICAgICAgcmV0dXJuIGlzU2luZ2xlQ29tcG9uZW50Vmlldyh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgbWFpbkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aCh0aGlzLm5hbWUpXG4gICAgfSxcblxuICAgIHZpZXdTY2hlbWEoKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudCwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgLy8gVHJhbnNsYXRlIHNpbmdsZS1jb21wb25lbnQgc2NoZW1hcyBpbnRvIG11bHRpLWNvbXBvbmVudCBzY2hlbWFzLFxuICAgICAgLy8gc28gdGhleSBjYW4gYmUgcmVuZGVyZWQgZGlyZWN0bHkgdGhyb3VnaCBEaXRvU2NoZW1hIGFsc286XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgIFtzY2hlbWEubmFtZV06IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzY2hlbWEubmFtZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uY29tcG9uZW50XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc2NoZW1hXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIHJldHVybiBzb21lU2NoZW1hQ29tcG9uZW50KHRoaXMudmlld1NjaGVtYSwgaGFzUmVzb3VyY2UpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJHJvdXRlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBTZWUgaWYgdGhlIHJvdXRlIGNoYW5nZXMgY29tcGxldGVseSwgYW5kIGNsZWFyIHRoZSBkYXRhIGlmIGl0IGRvZXMuXG4gICAgICBpZiAodGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIGdldENoaWxkUGF0aChwYXRoKSB7XG4gICAgICAvLyBMaXN0cyBpbnNpZGUgc2luZ2xlLWNvbXBvbmVudCB2aWV3cyB1c2UgdGhlIHZpZXcncyBwYXRoIGZvciBzdWItcGF0aHM6XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB0aGlzLnBhdGhcbiAgICAgICAgOiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weURhdGUoZGF0ZSwge1xuICB5ZWFyID0gZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICBtb250aCA9IGRhdGU/LmdldE1vbnRoKCkgPz8gMCxcbiAgZGF5ID0gZGF0ZT8uZ2V0RGF0ZSgpID8/IDAsXG4gIGhvdXIgPSBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gIG1pbnV0ZSA9IGRhdGU/LmdldE1pbnV0ZXMoKSA/PyAwLFxuICBzZWNvbmQgPSBkYXRlPy5nZXRTZWNvbmRzKCkgPz8gMCxcbiAgbWlsbGlzZWNvbmQgPSBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG59ID0ge30pIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRlKGRhdGUpIHtcbiAgcmV0dXJuIGlzRGF0ZShkYXRlKSA/IGRhdGUgOiBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyXG4gIC5kaXRvLWNhbGVuZGFyLXBvcHVwXG4gICAgLmRpdG8tY2FsZW5kYXItaW5uZXJcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwiY3VycmVudE1vZGUgPT09ICdkYXknXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiAxIH0pIH19XG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW1vbnRoKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCdtb250aCcpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyBtb250aDogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUoZGF0ZS5kYXRlLCBkYXRlLnN0YXRlLCB0cnVlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXRvZGF5KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSwgeyB5ZWFyOiAxLCBtb250aDogMSwgZGF5OiAxIH0pXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY29weURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIG1vZGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGF5JyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IHdlZWtkYXlOYW1lcywgbW9udGhOYW1lcyB9ID0gZ2V0TG9jYWxlTmFtZXModGhpcy5sb2NhbGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXMsXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxuICAgICAgeWVhclJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKFxuICAgICAgICB0aGlzLm1vZGVsVmFsdWUgfHxcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBjdXJyZW50IGRhdGUgYnV0IGNsZWFyIHRpbWUgZmllbGRzOlxuICAgICAgICBjb3B5RGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBjb3B5RGF0ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgb3ZlcnJpZGVzKVxuICAgIH0sXG5cbiAgICBzdGVwRGVjYWRlKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogMTBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNldE1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9LFxuXG4gICAgc3RlcE1vbnRoKHN0ZXApIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHllYXIsIG1vbnRoIH0gPSB0aGlzLmdldFllYXJNb250aChcbiAgICAgICAgY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcFxuICAgICAgKVxuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgbW9udGgsXG4gICAgICAgIGRheTogTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCksXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHN0ZXBZZWFyKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3REYXRlKGRhdGUsIHN0YXRlLCBjb3B5ID0gZmFsc2UpIHtcbiAgICAgIGlmIChzdGF0ZSAhPT0gJ2Rpc2FibGVkJykge1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICB5ZWFyOiBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBtb250aDogZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5OiBkYXRlLmdldERhdGUoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0pXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKGRhdGUsIHsgeWVhciwgbW9udGgsIGRheSB9KSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBob3IsIHZlciwgZW50ZXIgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50TW9kZSwgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoaG9yIHx8IHZlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIGRheTogY3VycmVudFZhbHVlLmdldERhdGUoKSArIGhvciArIHZlciAqIDdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIGhvciArIHZlciAqIDZcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBob3IgKyB2ZXIgKiA1XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtRGF5czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSlcbiAgICAgICAgY29uc3QgaXNEYXkgPSBkYXRlID0+IChcbiAgICAgICAgICBkYXRlICYmXG4gICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGkgJiZcbiAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc0RheSh0aGlzLm1vZGVsVmFsdWUpXG4gICAgICAgICAgPyAnYWN0aXZlJ1xuICAgICAgICAgIDogaXNEYXkodG9kYXkpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6IDEwMDA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCN7JGlucHV0LWhlaWdodH0gLSAycHgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBAZXh0ZW5kICVpbnB1dC1oZWlnaHQ7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIGJvcmRlci10b3A6ICRib3JkZXItc3R5bGU7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gID4gc3BhbiB7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG4gIH1cblxuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldixcbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDUlO1xuICBtaW4td2lkdGg6IDJlbTtcbiAgbWF4LXdpZHRoOiAzZW07XG5cbiAgJjo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldiB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC5JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwqsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC6JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwrsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXNlbGVjdC10b2RheSB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0LCBldmVudHMpIHtcbiAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cykge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAzNzogJ2xlZnQnLFxuICAgIDM4OiAndXAnLFxuICAgIDM5OiAncmlnaHQnLFxuICAgIDQwOiAnZG93bicsXG4gICAgMTM6ICdlbnRlcidcbiAgfVtldmVudC5rZXlDb2RlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5TmF2aWdhdGlvbihldmVudCkge1xuICBjb25zdCBrZXkgPSBnZXRLZXkoZXZlbnQpXG4gIHJldHVybiB7XG4gICAgaG9yOiB7IGxlZnQ6IC0xLCByaWdodDogMSB9W2tleV0gfHwgMCxcbiAgICB2ZXI6IHsgdXA6IC0xLCBkb3duOiAxIH1ba2V5XSB8fCAwLFxuICAgIGVudGVyOiBrZXkgPT09ICdlbnRlcidcbiAgfVxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJ0cmFuc2l0aW9uXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNTdHJpbmcsIGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnRcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZm9jdXNFdmVudHMgPSBhZGRFdmVudHModGFyZ2V0LCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLmZvY3VzRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMuY2xvc2VFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBudWxsXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgICAgaWYgKHRoaXMuc2hvdyAmJiBwb3B1cC5vZmZzZXRXaWR0aCA9PT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSwgMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGlzU3RyaW5nKHRoaXMudGFyZ2V0KVxuICAgICAgICA/IHRoaXMuJHJlZnNbdGhpcy50YXJnZXRdXG4gICAgICAgIDogdGhpcy50YXJnZXRcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgLy8gQWN0dWFsbHkgcmVzaXplIHRoZSBwb3B1cCdzIGZpcnN0IGNoaWxkLCBzbyB0aGV5IGNhbiBzZXQgc2l6ZSBsaW1pdHMuXG4gICAgICAgIGNvbnN0IGVsID0gdGFyZ2V0ID09PSBwb3B1cCA/IHRyaWdnZXIgOiBwb3B1cC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS53aWR0aFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9ICh0YXJnZXQgfHwgdHJpZ2dlcikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IHRyaWdnZXJMZWZ0ID0gYm91bmRzLmxlZnQgKyB3aW5kb3cuc2Nyb2xsWFxuICAgICAgY29uc3QgdHJpZ2dlclRvcCA9IGJvdW5kcy50b3AgKyB3aW5kb3cuc2Nyb2xsWVxuICAgICAgY29uc3QgdHJpZ2dlcldpZHRoID0gYm91bmRzLndpZHRoXG4gICAgICBjb25zdCB0cmlnZ2VySGVpZ2h0ID0gYm91bmRzLmhlaWdodFxuICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwLm9mZnNldFdpZHRoXG4gICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwLm9mZnNldEhlaWdodFxuXG4gICAgICBsZXQgW3BhcnQxLCBwYXJ0Ml0gPSB0aGlzLnBvcHVwUGxhY2VtZW50LnNwbGl0KCctJykgfHwgW11cbiAgICAgIGlmICh0aGlzLmtlZXBJblZpZXcpIHtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgLSB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IC0gdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydDIgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCArIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgKyB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgbGVmdCA9IDBcbiAgICAgIGxldCB0b3AgPSAwXG4gICAgICBzd2l0Y2ggKHBhcnQxKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgKz0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHBhcnQyKSB7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGggLSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodCAtIHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY292ZXIpIHtcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgdG9wIC09IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IHRyaWdnZXIpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckJvdW5kcyA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgbGVmdCArPSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJCb3VuZHMubGVmdFxuICAgICAgICB0b3AgKz0gdHJpZ2dlclRvcCAtIHRyaWdnZXJCb3VuZHMudG9wXG4gICAgICB9XG4gICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcbiAgICAgIHBvcHVwLnN0eWxlLnRvcCA9IGAke3RvcH1weGBcbiAgICB9LFxuXG4gICAgb25DbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLnNob3dQb3B1cFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkhvdmVyKGVudGVyKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VMZWF2ZVRpbWVyKVxuICAgICAgICBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5oaWRlRGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMubW91c2VMZWF2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgIH0sIHRoaXMuaGlkZURlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAnLi4vc3R5bGVzL3RyYW5zaXRpb25zL2luZGV4LnNjc3MnO1xuXG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpdG8tdHJpZ2dlci1kaXNhYmxlZCB7XG4gIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gICoge1xuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjpmb2N1cyB7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1wb3B1cCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDAwO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1pbnB1dFxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiJGF0dHJzXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogW1N0cmluZywgTnVtYmVyXSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvZm9jdXM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gICAgLypcbiAgICBjbGVhcmFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICAgIHN1ZmZpeEljb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgcHJlZml4SWNvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICAgICovXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNpemUoKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBiYXNlZCBvbiBtaW4gJiBtYXggc2V0dGluZ3MsIGlmIHRoZXkncmUgcHJvdmlkZWQuXG4gICAgICBjb25zdCB7IHNpemUsIG1pbiwgbWF4IH0gPSB0aGlzLiRhdHRyc1xuICAgICAgY29uc3QgZ2V0TGVuZ3RoID0gdmFsdWUgPT4gKHZhbHVlICE9IG51bGwgPyBgJHt2YWx1ZX1gLmxlbmd0aCA6IDApXG4gICAgICByZXR1cm4gc2l6ZSB8fCBnZXRMZW5ndGgobWluKSB8fCBnZXRMZW5ndGgobWF4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIGlucHV0IHtcbiAgICAvLyBJbmhlcml0IGFsbCBzdHlsaW5nIGZyb20gLmRpdG8taW5wdXRcbiAgICBhbGw6IGluaGVyaXQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImNsaWNrXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIElucHV0RmllbGQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICByZWFkb25seVxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IHNob3dQb3B1cCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkIH1cIlxuICAgICAgQGZvY3VzPVwiaW5wdXRGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImlucHV0Rm9jdXNlZCA9IGZhbHNlXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICApXG4gIC8vIGljb24odHlwZT1cImNhbGVuZGFyXCIgOmNvbG9yPVwiaWNvbkNvbG9yXCIpXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICBDYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi9DYWxlbmRhci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgQ2FsZW5kYXIsIElucHV0RmllbGQgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnZm9jdXMnLCAnYmx1ciddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRhdGVGb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiBkZWZhdWx0Rm9ybWF0cy5kYXRlIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBjaGFuZ2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHtcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgIGRhdGU6IHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgICB0aW1lOiBmYWxzZVxuICAgICAgICB9KSB8fCAnJ1xuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKCtjdXJyZW50VmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgICAgaWYgKCF0byAmJiB0aGlzLmNoYW5nZWQpIHtcbiAgICAgICAgICAvLyBUT0RPOiBUaGlzIHNlZW1zIHRvIGNvbnRyYWRpY3QgdGhlIGBjdXJyZW50VmFsdWUoKWAgd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAvLyAgICAgICBJcyB0aGlzIG5lZWRlZCBhdCBhbGw/XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLiRyZWZzLmNhbGVuZGFyPy5uYXZpZ2F0ZShnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgbWluLXdpZHRoOiAxMGVtO1xuXG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4uZGl0by1kYXRlLXBpY2tlci1wb3B1cCB7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cbjwvc3R5bGU+XG4iLCJleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG8oZWxlbWVudCwgdG8sIGR1cmF0aW9uKSB7XG4gIGNvbnN0IHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoYXJndW1lbnRzWzBdLCAxMClcbiAgICB9XG4gIClcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHRvXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHRvIC0gZWxlbWVudC5zY3JvbGxUb3BcbiAgICBjb25zdCBwZXJUaWNrID0gZGlmZmVyZW5jZSAvIGR1cmF0aW9uICogMTBcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcCArIHBlclRpY2tcbiAgICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCA9PT0gdG8pIHJldHVyblxuICAgICAgc2Nyb2xsVG8oZWxlbWVudCwgdG8sIGR1cmF0aW9uIC0gMTApXG4gICAgfSlcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihmaWVsZCwgc3RhcnQsIGVuZCkge1xuICBpZiAoZmllbGQuY3JlYXRlVGV4dFJhbmdlKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBmaWVsZC5jcmVhdGVUZXh0UmFuZ2UoKVxuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydClcbiAgICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQpXG4gICAgcmFuZ2Uuc2VsZWN0KClcbiAgICBmaWVsZC5mb2N1cygpXG4gIH0gZWxzZSBpZiAoZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICBmaWVsZC5mb2N1cygpXG4gICAgZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGZpZWxkKSB7XG4gICAgZmllbGQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFxuICAgIGZpZWxkLnNlbGVjdGlvbkVuZCA9IGVuZFxuICAgIGZpZWxkLmZvY3VzKClcbiAgfVxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tdGltZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLXRpbWUtcGlja2VyLWlucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5XG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJpbnB1dEZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiaW5wdXRGb2N1c2VkID0gZmFsc2VcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgIClcbiAgICAvLy0gaWNvbih0eXBlPVwidGltZVwiXG4gICAgLy8tIDpjb2xvcj1cImRpc2FibGVkID8gJyNiZmJmYmYnIDogKHRleHQgPyAnIzY2NicgOiAnI2JmYmZiZicpXCJcbiAgICAvLy0gKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgLmRpdG8tdGltZS1waWNrZXItcG9wdXBcbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItaG91cihcbiAgICAgICAgICByZWY9XCJob3VyXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMFwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gMjRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkSG91cihpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogaG91ciA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJob3VyID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLW1pbnV0ZShcbiAgICAgICAgICByZWY9XCJtaW51dGVcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAxXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IG1pbnV0ZSA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJtaW51dGUgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItc2Vjb25kKFxuICAgICAgICAgIHJlZj1cInNlY29uZFwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDJcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZFNlY29uZChpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogc2Vjb25kID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlY29uZCA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IHsgY29weURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgc2Nyb2xsVG8gfSBmcm9tICcuLi91dGlscy9zY3JvbGwuanMnXG5pbXBvcnQgeyBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBJbnB1dEZpZWxkIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBkaXNhYmxlZEhvdXI6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRNaW51dGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRTZWNvbmQ6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHNlbGVjdGlvbjogMCxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZVxuICAgICAgICA/IGAke1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFkKHRoaXMuaG91cilcbiAgICAgICAgICB9OiR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5taW51dGUpXG4gICAgICAgICAgfToke1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFkKHRoaXMuc2Vjb25kKVxuICAgICAgICAgIH1gXG4gICAgICAgIDogJydcbiAgICB9LFxuXG4gICAgY3VycmVudERhdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSB8fFxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0ZSgpIG9iamVjdCB3aXRoIHRoZSB0aW1lIHNldCB0byAwLCB0byBiZSB1c2VkIHdoZW5cbiAgICAgICAgLy8gZmlyc3Qgc2V0dGluZyBhbnkgb2YgdGhlIHRpbWVzLCBmb3IgbWVhbmluZ2Z1bCBkYXRlcyBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBvYmplY3QgaXMgc2hhcmVkIHdpdGggYSBEYXRlUGlja2VyLCBlLmcuIHRocm91Z2ggRGF0ZVRpbWVQaWNrZXIuXG4gICAgICAgIGNvcHlEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIGhvdXI6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0SG91cnMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KGhvdXIpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgaG91ciB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtaW51dGU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0TWludXRlcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQobWludXRlKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IG1pbnV0ZSB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWNvbmQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0U2Vjb25kcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoc2Vjb25kKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IHNlY29uZCB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGRhdGUpIHtcbiAgICAgIGlmICgrZGF0ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgZGF0ZSlcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDogJ3VwZGF0ZVNlbGVjdGlvbicsXG5cbiAgICBzZWxlY3Rpb246ICd1cGRhdGVTZWxlY3Rpb24nLFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8pIHtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24oKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCgwKVxuICAgICAgfVxuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxlZnRQYWQodmFsdWUpIHtcbiAgICAgIHJldHVybiAoJzAnICsgdmFsdWUpLnNsaWNlKC0yKVxuICAgIH0sXG5cbiAgICBzZXRUaW1lKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBjb3B5RGF0ZSh0aGlzLmN1cnJlbnREYXRlLCB7XG4gICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHVwZGF0ZVNlbGVjdGlvbihmb3JjZSA9IGZhbHNlKSB7XG4gICAgICBpZiAodGhpcy5zaG93UG9wdXAgfHwgZm9yY2UpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSAzICogdGhpcy5zZWxlY3Rpb25cbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKHRoaXMuJHJlZnMuaW5wdXQsIHN0YXJ0LCBzdGFydCArIDIpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzY3JvbGxBbGwoZHVyYXRpb24gPSAxMDApIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IChyZWYsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJHJlZnNbcmVmXVxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgLy8gRmlyc3QgYW5kIGxhc3Qgb25lIGFkZCAzIHRpbWVzIHRoZSBtYXJnaW5cbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGFyZ2V0LnNjcm9sbEhlaWdodCAvICh0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoICsgNilcbiAgICAgICAgICBzY3JvbGxUbyh0YXJnZXQsIE1hdGgucm91bmQodmFsdWUgKiBsaW5lSGVpZ2h0KSwgZHVyYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgc2Nyb2xsKCdob3VyJywgdGhpcy5ob3VyKVxuICAgICAgICBzY3JvbGwoJ21pbnV0ZScsIHRoaXMubWludXRlKVxuICAgICAgICBzY3JvbGwoJ3NlY29uZCcsIHRoaXMuc2Vjb25kKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IFsnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJ11bdGhpcy5zZWxlY3Rpb25dXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgeyBob3IsIHZlciwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICAgIGlmIChob3IpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0aW9uICsgaG9yXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB2YWx1ZSA8IDAgPyAyIDogdmFsdWUgPiAyID8gMCA6IHZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAodmVyKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW3NlbGVjdGVkXSArIHZlclxuICAgICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSB0aGlzLiRyZWZzW3NlbGVjdGVkXS5jaGlsZHJlblxuICAgICAgICAgIHRoaXNbc2VsZWN0ZWRdID1cbiAgICAgICAgICAgIHZhbHVlIDwgMFxuICAgICAgICAgICAgICA/IHZhbHVlICsgbGVuZ3RoXG4gICAgICAgICAgICAgIDogdmFsdWUgPj0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB2YWx1ZSAtIGxlbmd0aFxuICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvciB8fCB2ZXIgfHwgZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbih0cnVlKVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbWF4LXdpZHRoOiAxNjBweDtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuXG4kdGltZS1waWNrZXItbGluZS1oZWlnaHQ6IDI0cHg7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgLmRpdG8taWNvbi10aW1lIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDdweDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCAuZGl0by10aW1lLXBpY2tlci1wYW5lbCB7XG4gIGZsb2F0OiBsZWZ0O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMDtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyAzICsgMXB4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAmOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1yaWdodDogMDtcbiAgfVxuXG4gIHVsIHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbjogMDtcbiAgICAvLyBIaWRlIHNjcm9sbGJhcjpcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBwYWRkaW5nOiAwIDE3cHggMCAwO1xuICAgIGhlaWdodDogNyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcblxuICAgICYgPiBsaSB7XG4gICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICBsaW5lLWhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbiAgICAgIH1cblxuICAgICAgJi5zZWxlY3RlZCxcbiAgICAgICYuc2VsZWN0ZWQ6aG92ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlcihyZWY9XCJwaWNrZXJcIilcbiAgLmRpdG8tcGlja2Vycyg6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCIpXG4gICAgRGF0ZVBpY2tlcihcbiAgICAgIHJlZj1cImRhdGVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93RGF0ZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2Vob2xkZXIsIGxvY2FsZSwgZGF0ZUZvcm1hdCwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJkYXRlRm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJkYXRlRm9jdXNlZCA9IGZhbHNlXCJcbiAgICApXG4gICAgVGltZVBpY2tlcihcbiAgICAgIHJlZj1cInRpbWVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93VGltZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIGRpc2FibGVkIH1cIlxuICAgICAgQGZvY3VzPVwidGltZUZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwidGltZUZvY3VzZWQgPSBmYWxzZVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4vRGF0ZVBpY2tlci52dWUnXG5pbXBvcnQgVGltZVBpY2tlciBmcm9tICcuL1RpbWVQaWNrZXIudnVlJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRlRm9ybWF0OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gZGVmYXVsdEZvcm1hdHMuZGF0ZSB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93RGF0ZTogZmFsc2UsXG4gICAgICBzaG93VGltZTogZmFsc2UsXG4gICAgICBkYXRlRm9jdXNlZDogZmFsc2UsXG4gICAgICB0aW1lRm9jdXNlZDogZmFsc2UsXG4gICAgICBjaGFuZ2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlRm9jdXNlZCB8fCB0aGlzLnRpbWVGb2N1c2VkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoZGF0ZSkge1xuICAgICAgaWYgKCtkYXRlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBkYXRlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5kYXRlLmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuJHJlZnMuZGF0ZS5ibHVyKClcbiAgICAgIHRoaXMuJHJlZnMudGltZS5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIge1xuICAuZGl0by1waWNrZXJzIHtcbiAgICBAZXh0ZW5kICVpbnB1dDtcblxuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcblxuICAgIC5kaXRvLWlucHV0IHtcbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXI6IDA7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tZGF0ZS1waWNrZXIge1xuICAgIHdpZHRoOiA2MCU7XG4gICAgbWluLXdpZHRoOiA2LjllbTtcblxuICAgIC5kaXRvLWlucHV0IHtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdGltZS1waWNrZXIge1xuICAgIHdpZHRoOiA0MCU7XG4gICAgbWluLXdpZHRoOiA1LjRlbTtcblxuICAgIC5kaXRvLWlucHV0IHtcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5pLmRpdG8taWNvbig6Y2xhc3M9XCJgZGl0by1pY29uLSR7bmFtZX1gXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4vLyBgeWFybiBidWlsZDppY29uc2AgY29udmVydHMgdGhlIGljb24gU1ZHIGZpbGVzIHRvIHNpbGVudCBjbGFzc2VzIGluc2lkZVxuLy8gYHNyYy9zdHlsZXMvbWl4aW5zL19pY29ucy5zY3NzYCwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIHRvIGFsbCBvdGhlciBzYXNzXG4vLyBjb2RlIHRocm91Z2ggYF9pbXBvcnRzYC5cbi8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gYXMgbm9ybWFsIENTUyBjbGFzc2VzLCBjb252ZXJ0IHRoZW0gaGVyZTpcbkBlYWNoICRuYW1lIGluICRpY29ucyB7XG4gIC5kaXRvLWljb24tI3skbmFtZX0ge1xuICAgIEBleHRlbmQgJWljb24tI3skbmFtZX07XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFnaW5hdGlvblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsKFxuICAgIHYtaWY9XCJzaG93VG90YWxcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwidG90YWwgPiAwXCJcbiAgICApIHt7IGZpcnN0IH19IOKAkyB7eyBsYXN0IH19XG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWVsc2VcbiAgICApIDBcbiAgICB8IC8ge3sgdG90YWwgfX1cbiAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmRcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB2LWZvcj1cInBhZ2UgaW4gcGFnZVJhbmdlXCJcbiAgICAgIDpjbGFzcz1cImdldFBhZ2VDbGFzcyhwYWdlKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJwYWdlLmRpc2FibGVkXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tQYWdlKHBhZ2UpXCJcbiAgICApXG4gICAgICBzcGFuKFxuICAgICAgICB2LWlmPVwicGFnZS50ZXh0XCJcbiAgICAgICkge3sgcGFnZS50ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6cGFnZSddLFxuXG4gIHByb3BzOiB7XG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAgcGFnZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEgfSxcbiAgICBwYWdlU2l6ZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwIH0sXG4gICAgc2hvd1RvdGFsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VSYW5nZTogW10sXG4gICAgICBzaG93UHJldjogdHJ1ZSxcbiAgICAgIHNob3dOZXh0OiB0cnVlLFxuICAgICAgbnVtUGFnZXM6IDAsXG4gICAgICBjdXJyZW50UGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZmlyc3QoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuY3VycmVudFBhZ2VTaXplICsgMVxuICAgIH0sXG5cbiAgICBsYXN0KCkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZmlyc3QgKyB0aGlzLmN1cnJlbnRQYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdG90YWw6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuICAgIHNob3dQcmV2OiAndXBkYXRlUGFnZVJhbmdlJyxcbiAgICBzaG93TmV4dDogJ3VwZGF0ZVBhZ2VSYW5nZScsXG5cbiAgICBwYWdlKHBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlXG4gICAgfSxcblxuICAgIHBhZ2VTaXplKHBhZ2VTaXplKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlU2l6ZSA9IHBhZ2VTaXplXG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlU2l6ZShjdXJyZW50UGFnZVNpemUpIHtcbiAgICAgIHRoaXMubnVtUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbCAvIGN1cnJlbnRQYWdlU2l6ZSlcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5udW1QYWdlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5udW1QYWdlc1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnBhZ2UnLCB0bylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlXG4gICAgdGhpcy5jdXJyZW50UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplXG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2tQYWdlKHBhZ2UpIHtcbiAgICAgIGlmIChwYWdlLmluZGV4ICYmICFwYWdlLmRpc2FibGVkICYmIHBhZ2UuaW5kZXggIT09IHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2UuaW5kZXhcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0UGFnZUNsYXNzKHBhZ2UpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgICdkaXRvLXNlbGVjdGVkJzogcGFnZS5hY3RpdmVcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlLnR5cGUpIHtcbiAgICAgICAgY2xhc3Nlc1tgZGl0by1idXR0b24tJHtwYWdlLnR5cGV9YF0gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICB1cGRhdGVQYWdlUmFuZ2UoKSB7XG4gICAgICBjb25zdCB7IHNob3dQcmV2LCBzaG93TmV4dCwgdG90YWwsIGN1cnJlbnRQYWdlU2l6ZSwgY3VycmVudFBhZ2UgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuICAgICAgY29uc3QgbnVtUGFnZXMgPSAodGhpcy5udW1QYWdlcyA9IE1hdGguY2VpbCh0b3RhbCAvIGN1cnJlbnRQYWdlU2l6ZSkpXG5cbiAgICAgIGxldCBzdGFydCA9IDFcbiAgICAgIGxldCBlbmQgPSAxXG4gICAgICBpZiAobnVtUGFnZXMgPD0gc2hvd0xlbmd0aCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA8PSBzaG93UHJldiArIDEpIHtcbiAgICAgICAgZW5kID0gc2hvd0xlbmd0aFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA+PSBudW1QYWdlcyAtIHNob3dOZXh0KSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICAgIHN0YXJ0ID0gbnVtUGFnZXMgLSBzaG93TGVuZ3RoICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBjdXJyZW50UGFnZSAtIHNob3dQcmV2XG4gICAgICAgIGVuZCA9IGN1cnJlbnRQYWdlICsgc2hvd05leHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFnZVJhbmdlID0gW11cbiAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgdHlwZTogJ3ByZXYnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPD0gMVxuICAgICAgfSlcbiAgICAgIGlmIChzdGFydCA+PSAyKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHsgaW5kZXg6IDEsIHRleHQ6IDEgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA+IDIpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1heCgxLCBjdXJyZW50UGFnZSAtIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtcHJldidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBhY3RpdmU6IGkgPT09IGN1cnJlbnRQYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDwgbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5taW4obnVtUGFnZXMsIGN1cnJlbnRQYWdlICsgMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1uZXh0J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8PSBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goeyBpbmRleDogbnVtUGFnZXMsIHRleHQ6IG51bVBhZ2VzIH0pXG4gICAgICB9XG4gICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSArIDEsXG4gICAgICAgIHR5cGU6ICduZXh0JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlID49IG51bVBhZ2VzXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnBhZ2VSYW5nZSA9IHBhZ2VSYW5nZVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFnaW5hdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbCB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBtYXJnaW46IDAgMC41ZW07XG4gICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIH1cblxuICAuZGl0by1idXR0b24ge1xuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2UsIGNvbG9yIDBzLCBiYWNrZ3JvdW5kIDBzLCBib3JkZXIgMHM7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gICAgJi1wcmV2LFxuICAgICYtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWFycm93O1xuICAgICAgfVxuICAgIH1cblxuICAgICYtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXYsXG4gICAgJi1lbGxpcHNpcy1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICY6YWN0aXZlIHtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXN3aXRjaChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pXG4gIC5kaXRvLXN3aXRjaC1wYW5lXG4gICAgaW5wdXQoXG4gICAgICA6aWQ9XCJpZFwiXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LWJpbmQ9XCIkYXR0cnNcIlxuICAgICAgdi1tb2RlbD1cImNoZWNrZWRcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIDpuYW1lPVwibmFtZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgKVxuICAgIC5kaXRvLXN3aXRjaC1idXR0b25cbiAgICBzcGFuLmRpdG8tc3dpdGNoLWxhYmVsKFxuICAgICAgdi1pZj1cImxhYmVsc1wiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cImNoZWNrZWRcIlxuICAgICAgICBuYW1lPVwiY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy5jaGVja2VkIHx8ICdvbicgfX1cbiAgICAgIHNsb3QoXG4gICAgICAgIHYtZWxzZVxuICAgICAgICBuYW1lPVwidW5jaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLnVuY2hlY2tlZCB8fCAnb2ZmJyB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsczogeyB0eXBlOiBbT2JqZWN0LCBCb29sZWFuXSwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCB7IGNoZWNrZWQsIGRpc2FibGVkIH0gPSB0aGlzXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jaGVja2VkJzogY2hlY2tlZCxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICBjb25zdCB7IGxhYmVsczogeyBjaGVja2VkLCB1bmNoZWNrZWQgfSA9IHt9IH0gPSB0aGlzXG4gICAgICAvLyBDYWxjdWxhdGUgYC0tc3dpdGNoLXdpZHRoYCBpbiBgcmVtYCwgYmFzZWQgb24gbGFiZWwgbGVuZ3RoLlxuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoMCwgY2hlY2tlZD8ubGVuZ3RoLCB1bmNoZWNrZWQ/Lmxlbmd0aClcbiAgICAgIHJldHVybiB7XG4gICAgICAgICctLXN3aXRjaC13aWR0aCc6IGxlbmd0aCA/IGAke2xlbmd0aCAqIDEuNX1yZW1gIDogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUobW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jaGVja2VkID0gbW9kZWxWYWx1ZVxuICAgIH0sXG5cbiAgICBjaGVja2VkKGNoZWNrZWQpIHtcbiAgICAgIGlmIChjaGVja2VkICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjaGVja2VkKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBjaGVja2VkKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC8vIFVzZSB3aG9sZSBtdWx0aXBsZXMgb2YgYHJlbWAgZm9yIHNpemVzIGFuZCBgcHhgIG1hcmdpbnMvcGFkZGluZyBhbG9uZ1xuICAvLyB3aXRoIGBjYWxjKClgIHRvIGVuZCB1cCB3aXRoIGV2ZW4gcGl4ZWwgc2l6ZXMuIGByZW1gIGlzIG5lZWRlZCBiZWNhdXNlIHdlXG4gIC8vIGNoYW5nZSBgZm9udC1zaXplYCBpbnNpZGUgYC5kaXRvLXN3aXRjaC1idXR0b25gXG4gIC0tc3dpdGNoLXdpZHRoOiA0cmVtO1xuICAtLXN3aXRjaC1oZWlnaHQ6IDJyZW07XG4gIC0tc3dpdGNoLW1hcmdpbjogMnB4O1xuICAtLXN3aXRjaC1wYWRkaW5nOiAzcHg7XG4gIC0tc3dpdGNoLXNwZWVkOiAzMDBtcztcbiAgLS1sYWJlbC1tYXJnaW46IDAuNWVtO1xuICAtLXdpZHRoOiBjYWxjKHZhcigtLXN3aXRjaC13aWR0aCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLWhlaWdodDogY2FsYyh2YXIoLS1zd2l0Y2gtaGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0tb2Zmc2V0OiBjYWxjKHZhcigtLXdpZHRoKSAtIHZhcigtLWhlaWdodCkpO1xuXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IHZhcigtLXN3aXRjaC1oZWlnaHQpO1xuICAvLyBUbyBtYWtlIGlubGluZSBsYWJlbHMgYXBwZWFyIG9uIGNvbnNpc3RlbnQgYmFzZWxpbmU6XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIC5kaXRvLXN3aXRjaC1wYW5lIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IHZhcigtLXdpZHRoKTtcbiAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtcGFuZSxcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIH1cblxuICBpbnB1dCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHQ7XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3MsIGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAvLyBTZXQgZm9udC1zaXplIHRvIGhlaWdodCwgc28gd2UgY2FuIHVzZSB3aWR0aC9oZWlnaHQgPSAxZW0gZm9yIGNpcmNsZTpcbiAgICBmb250LXNpemU6IGNhbGModmFyKC0taGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtcGFkZGluZykpO1xuICAgIHRvcDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIGxlZnQ6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICB3aWR0aDogMWVtO1xuICAgIGhlaWdodDogMWVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuNWVtO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1zd2l0Y2gtc3BlZWQpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24sXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAmLmRpdG8tY2hlY2tlZCB7XG4gICAgaW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1vZmZzZXQpKTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgICAgbGVmdDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tZGlzYWJsZWQge1xuICAgIEBleHRlbmQgJWJ1dHRvbi1kaXNhYmxlZDtcbiAgfVxuXG4gICY6Zm9jdXMtd2l0aGluOm5vdCg6aG92ZXIpIHtcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctZm9jdXM7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdD5cbmltcG9ydCB7IGggYXMgY3JlYXRlRWxlbWVudCwgVHJhbnNpdGlvbiB9IGZyb20gJ3Z1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmZ1bmN0aW9uIFRyYW5zaXRpb25IZWlnaHQoeyBlbmFibGVkIH0sIHsgc2xvdHMgfSkge1xuICByZXR1cm4gZW5hYmxlZFxuICAgID8gY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCBwcm9wcywgc2xvdHMpXG4gICAgOiBzbG90cy5kZWZhdWx0KClcbn1cblxuVHJhbnNpdGlvbkhlaWdodC5wcm9wcyA9IHtcbiAgZW5hYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbkhlaWdodFxuXG5jb25zdCBzZXRTdHlsZSA9IChlbGVtZW50LCBzdHlsZSkgPT4gT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSlcblxuLy8gRm9yY2UgcmVwYWludCB0byBtYWtlIHN1cmUgdGhlIGFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgY29ycmVjdGx5LlxuY29uc3QgZm9yY2VSZXBhaW50ID0gZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodFxuXG5jb25zdCBwcm9wcyA9IHtcbiAgbmFtZTogJ2hlaWdodCcsXG5cbiAgb25BZnRlckVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBBIHRpbWVvdXQgYmVmb3JlIHNldHRpbmcgc3R5bGUgaXMgb25seSByZWFsbHkgbmVlZGVkIGFmdGVyIGNhbGxzIHRvXG4gICAgLy8gYGZvcmNlUmVwYWludCgpYCwgYnV0IHVzaW5nIG9uZSBoZXJlIHRvbyBwcmVzZXJ2ZXMgZXhlY3V0aW9uIHNlcXVlbmNlIHNvXG4gICAgLy8gdGhhdCB0aGUgY2FsbCBmcm9tIGBlbnRlcigpYCBjYW4gbmV2ZXIgb3V0cnVuIHRoZSBvbmUgZnJvbSBgYWZ0ZXJFbnRlcigpYFxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6ICdhdXRvJyB9KSlcbiAgfSxcblxuICBvbkVudGVyKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IHdpZHRoIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgd2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9KVxuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG51bGwsXG4gICAgICBwb3NpdGlvbjogbnVsbCxcbiAgICAgIHZpc2liaWxpdHk6IG51bGwsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9KVxuICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSkpXG4gIH0sXG5cbiAgb25MZWF2ZShlbGVtZW50KSB7XG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KVxuICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IDAgfSkpXG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbiRkdXJhdGlvbjogMC4xNXM7XG5cbi5oZWlnaHQtZW50ZXItYWN0aXZlLFxuLmhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBoZWlnaHQgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmhlaWdodC1lbnRlci1hY3RpdmUge1xuICBhbmltYXRpb246IHNsaWRlLWVudGVyICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBzbGlkZS1sZWF2ZSAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uaGVpZ2h0LWVudGVyLWZyb20sXG4uaGVpZ2h0LWxlYXZlLXRvIHtcbiAgaGVpZ2h0OiAwO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgcmVmLCB3YXRjaCwgb25TY29wZURpc3Bvc2UsIGggfSBmcm9tICd2dWUtZGVtaSc7XG5pbXBvcnQgeyBjcmVhdGVGb2N1c1RyYXAgfSBmcm9tICdmb2N1cy10cmFwJztcbmltcG9ydCB7IHVucmVmRWxlbWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5cbmNvbnN0IFVzZUZvY3VzVHJhcCA9IC8qIEBfX1BVUkVfXyAqLyAvKiAjX19QVVJFX18gKi8gZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJVc2VGb2N1c1RyYXBcIixcbiAgcHJvcHM6IFtcImFzXCIsIFwib3B0aW9uc1wiXSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGxldCB0cmFwO1xuICAgIGNvbnN0IHRhcmdldCA9IHJlZigpO1xuICAgIGNvbnN0IGFjdGl2YXRlID0gKCkgPT4gdHJhcCAmJiB0cmFwLmFjdGl2YXRlKCk7XG4gICAgY29uc3QgZGVhY3RpdmF0ZSA9ICgpID0+IHRyYXAgJiYgdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSxcbiAgICAgIChlbCkgPT4ge1xuICAgICAgICBpZiAoIWVsKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdHJhcCA9IGNyZWF0ZUZvY3VzVHJhcChlbCwgcHJvcHMub3B0aW9ucyB8fCB7fSk7XG4gICAgICAgIGFjdGl2YXRlKCk7XG4gICAgICB9LFxuICAgICAgeyBmbHVzaDogXCJwb3N0XCIgfVxuICAgICk7XG4gICAgb25TY29wZURpc3Bvc2UoKCkgPT4gZGVhY3RpdmF0ZSgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHNsb3RzLmRlZmF1bHQpXG4gICAgICAgIHJldHVybiBoKHByb3BzLmFzIHx8IFwiZGl2XCIsIHsgcmVmOiB0YXJnZXQgfSwgc2xvdHMuZGVmYXVsdCgpKTtcbiAgICB9O1xuICB9XG59KTtcblxuZXhwb3J0IHsgVXNlRm9jdXNUcmFwIH07XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGlhbG9nKFxuICByZWY9XCJkaWFsb2dcIlxuICByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1leHBhbmRlZD1cInRydWVcIlxuICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gIDpzdHlsZT1cInsgJy0td2lkdGgnOiBgJHtzZXR0aW5ncy53aWR0aH1weGAgfVwiXG4gIEBtb3VzZXVwPVwib25Nb3VzZVVwXCJcbilcbiAgVXNlRm9jdXNUcmFwLmRpdG8tZGlhbG9nX19mb2N1cy10cmFwKFxuICAgIDpvcHRpb25zPVwieyBpbW1lZGlhdGU6IHRydWUsIGZhbGxiYWNrRm9jdXM6ICgpID0+ICRyZWZzLmRpYWxvZyB9XCJcbiAgKVxuICAgIGZvcm0uZGl0by1zY3JvbGwtcGFyZW50KFxuICAgICAgQHN1Ym1pdC5wcmV2ZW50PVwic3VibWl0XCJcbiAgICApXG4gICAgICBEaXRvU2NoZW1hLmRpdG8tc2Nyb2xsKFxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoI2J1dHRvbnMpXG4gICAgICAgICAgRGl0b0J1dHRvbnMuZGl0by1idXR0b25zLWxhcmdlKFxuICAgICAgICAgICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICAgICAgICAgIDpkYXRhPVwiZGlhbG9nRGF0YVwiXG4gICAgICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldEJ1dHRvblNjaGVtYXMgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBVc2VGb2N1c1RyYXAgfSBmcm9tICdAdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9EaWFsb2cnLCB7XG4gIGNvbXBvbmVudHM6IHsgVXNlRm9jdXNUcmFwIH0sXG4gIGVtaXRzOiBbJ3JlbW92ZSddLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaWFsb2dDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBjb21wb25lbnRzOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwcm9taXNlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHNldHRpbmdzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICB3aWR0aDogNDgwLFxuICAgICAgICBjbGlja1RvQ2xvc2U6IGZhbHNlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIC8vIE1ha2Ugc3VyZSBkaWFsb2cgZGF0YSBjb250YWlucyBhbGwgdGhlIGV4cGVjdGVkIGtleXNcbiAgICBjb25zdCBkaWFsb2dEYXRhID0gY2xvbmUodGhpcy5kYXRhKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgaWYgKCEoa2V5IGluIGRpYWxvZ0RhdGEpKSB7XG4gICAgICAgIGRpYWxvZ0RhdGFba2V5XSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpbmRvd0V2ZW50czogbnVsbCxcbiAgICAgIGRpYWxvZ0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wb25lbnRzOiB0aGlzLmNvbXBvbmVudHNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGdldEJ1dHRvblNjaGVtYXModGhpcy5idXR0b25zKSkubWFwKFxuICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGJ1dHRvbiBzY2hlbWFzIHRvIGFkZCBkZWZhdWx0IGNsaWNrIGV2ZW50c1xuICAgICAgICAgIC8vIGZvciBib3RoICdzdWJtaXQnIGFuZCAnY2FuY2VsJyBidXR0b25zOlxuICAgICAgICAgIChba2V5LCBzY2hlbWFdKSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnY2FuY2VsJyAmJiAhc2NoZW1hLmV2ZW50cykge1xuICAgICAgICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY2FuY2VsKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBba2V5LCBzY2hlbWFdXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5idXR0b25TY2hlbWFzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIGhhc0NhbmNlbCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuYnV0dG9uU2NoZW1hcy5jYW5jZWxcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLndpbmRvd0V2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgIGtleXVwOiBldmVudCA9PiB7XG4gICAgICAgIGlmICgodGhpcy5oYXNDYW5jZWwgfHwgIXRoaXMuaGFzQnV0dG9ucykgJiYgZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLndpbmRvd0V2ZW50cy5yZW1vdmUoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICByZW1vdmUoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdyZW1vdmUnKVxuICAgIH0sXG5cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICB0aGlzLnByb21pc2UucmVzb2x2ZSh2YWx1ZSlcbiAgICAgIHRoaXMucmVtb3ZlKClcbiAgICB9LFxuXG4gICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICB0aGlzLnByb21pc2UucmVqZWN0KHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICBzdWJtaXQoKSB7XG4gICAgICB0aGlzLnJlc29sdmUodGhpcy5kaWFsb2dEYXRhKVxuICAgIH0sXG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICB0aGlzLnJlc29sdmUobnVsbClcbiAgICB9LFxuXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLmNhbmNlbCgpXG4gICAgfSxcblxuICAgIG9uTW91c2VVcCgpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmNsaWNrVG9DbG9zZSkge1xuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kaWFsb2cge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAyMDAwO1xuICBwYWRkaW5nOiAkY29udGVudC1wYWRkaW5nO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgLy8gUHJldmVudCBzY3JvbGxpbmcgb2YgdGhlIHBhZ2UgYmVoaW5kIHRoZSBkaWFsb2c6XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcblxuICAmX19mb2N1cy10cmFwIHtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLy8gVE9ETzogYCZfX2lubmVyYFxuICBmb3JtIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIG1heC13aWR0aDogdmFyKC0td2lkdGgsIDQ4MHB4KTtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIGJveC1zaGFkb3c6IDAgMjBweCA2MHB4IC0ycHggcmdiYSgyNywgMzMsIDU4LCAwLjQpO1xuICB9XG59XG5cbi5kaXRvLWRpYWxvZy1lbnRlci1hY3RpdmUsXG4uZGl0by1kaWFsb2ctbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cztcblxuICBmb3JtIHtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWZyb20sXG4uZGl0by1kaWFsb2ctbGVhdmUtdG8ge1xuICBvcGFjaXR5OiAwO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjBweCk7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9tSGFuZGxlcnM6IFtdXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZVVubW91bnQoKSB7XG4gICAgZm9yIChjb25zdCB7IHJlbW92ZSB9IG9mIHRoaXMuZG9tSGFuZGxlcnMpIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICAgIHRoaXMuZG9tSGFuZGxlcnMgPSBbXVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBkb21PbihlbGVtZW50LCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhZGRFdmVudHMoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGlzT2JqZWN0KHR5cGUpID8gdHlwZSA6IHsgW3R5cGVdOiBoYW5kbGVyIH1cbiAgICAgIClcbiAgICAgIHRoaXMuZG9tSGFuZGxlcnMucHVzaChyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcm9vdFxuICBWdWVOb3RpZmljYXRpb25zLmRpdG8tbm90aWZpY2F0aW9ucyhcbiAgICByZWY9XCJub3RpZmljYXRpb25zXCJcbiAgICBwb3NpdGlvbj1cInRvcCByaWdodFwiXG4gICAgY2xhc3Nlcz1cImRpdG8tbm90aWZpY2F0aW9uXCJcbiAgKVxuICBUcmFuc2l0aW9uR3JvdXAobmFtZT1cImRpdG8tZGlhbG9nXCIpXG4gICAgRGl0b0RpYWxvZyhcbiAgICAgIHYtZm9yPVwiKGRpYWxvZywga2V5KSBpbiBkaWFsb2dzXCJcbiAgICAgIDprZXk9XCJrZXlcIlxuICAgICAgOmNvbXBvbmVudHM9XCJkaWFsb2cuY29tcG9uZW50c1wiXG4gICAgICA6YnV0dG9ucz1cImRpYWxvZy5idXR0b25zXCJcbiAgICAgIDpwcm9taXNlPVwiZGlhbG9nLnByb21pc2VcIlxuICAgICAgOmRhdGE9XCJkaWFsb2cuZGF0YVwiXG4gICAgICA6c2V0dGluZ3M9XCJkaWFsb2cuc2V0dGluZ3NcIlxuICAgICAgQHJlbW92ZT1cInJlbW92ZURpYWxvZyhrZXkpXCJcbiAgICApXG4gIERpdG9NZW51XG4gIG1haW4uZGl0by1wYWdlLmRpdG8tc2Nyb2xsLXBhcmVudFxuICAgIERpdG9IZWFkZXIoXG4gICAgICA6c3Bpbm5lcj1cIm9wdGlvbnMuc3Bpbm5lclwiXG4gICAgICA6aXNMb2FkaW5nPVwiaXNMb2FkaW5nXCJcbiAgICApXG4gICAgICBEaXRvQWNjb3VudChcbiAgICAgICAgdi1pZj1cInVzZXJcIlxuICAgICAgKVxuICAgICAgYS5kaXRvLWxvZ2luKFxuICAgICAgICB2LWVsc2UtaWY9XCJhbGxvd0xvZ2luXCJcbiAgICAgICAgQGNsaWNrPVwicm9vdENvbXBvbmVudC5sb2dpbigpXCJcbiAgICAgIClcbiAgICAgICAgc3BhbiBMb2dpblxuICAgIFJvdXRlclZpZXdcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBhc0FycmF5LCBtYXBDb25jdXJyZW50bHksIHN0cmlwVGFncyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Vc2VyIGZyb20gJy4uL0RpdG9Vc2VyLmpzJ1xuaW1wb3J0IERpdG9WaWV3IGZyb20gJy4uL2NvbXBvbmVudHMvRGl0b1ZpZXcudnVlJ1xuaW1wb3J0IERpdG9EaWFsb2cgZnJvbSAnLi9EaXRvRGlhbG9nLnZ1ZSdcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQge1xuICBwcm9jZXNzVmlldyxcbiAgcmVzb2x2ZVNjaGVtYXMsXG4gIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvUm9vdCcsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IERpdG9EaWFsb2cgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdmlld3M6ICgpID0+IHRoaXMucmVzb2x2ZWRWaWV3c1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHVucmVzb2x2ZWRWaWV3czogeyB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbiwgUHJvbWlzZV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgb3B0aW9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc29sdmVkVmlld3M6IHt9LFxuICAgICAgcmVtb3ZlUm91dGVzOiBudWxsLFxuICAgICAgZGlhbG9nczoge30sXG4gICAgICBhbGxvd0xvZ2luOiBmYWxzZSxcbiAgICAgIGxvYWRpbmdDb3VudDogMFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG5vdGlmaWNhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5ub3RpZmljYXRpb25zXG4gICAgfSxcblxuICAgIGlzTG9hZGluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdDb3VudCA+IDBcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmFwcFN0YXRlLnRpdGxlID0gZG9jdW1lbnQudGl0bGUgfHwgJ0RpdG8uanMgQWRtaW4nXG4gICAgLy8gV2l0aCBob3QtcmVsb2FkaW5nLCBpdCBsb29rcyBsaWtlIGRlc3Ryb3llZCBob29rcyBhcmVuJ3QgYWx3YXlzIGNhbGxlZFxuICAgIC8vIGZvciByb3V0ZSBjb21wb25lbnRzIHNvIHJlc2V0IHRoZSBhcnJheSBvZiByZWdpc3RlcmVkIGNvbXBvbmVudHMgaW5zdGVhZC5cbiAgICB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cyA9IFtdXG4gIH0sXG5cbiAgYXN5bmMgbW91bnRlZCgpIHtcbiAgICAvLyBDbGVhciB0aGUgbGFiZWwgbWFya2VkIGFzIGFjdGl2ZSBvbiBhbGwgbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cywgZXhjZXB0XG4gICAgLy8gdGhlIG9uZXMgdGhhdCBEaXRvTGFiZWwgaXRzZWxmIGludGVyY2VwdHMuXG4gICAgdGhpcy5kb21Pbihkb2N1bWVudCwge1xuICAgICAgY2xpY2s6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQuY2xvc2VzdCgnLmRpdG8tbGFiZWwnKSkge1xuICAgICAgICAgIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGtleXVwOiBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSAnVGFiJykge1xuICAgICAgICAgIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmFsbG93TG9naW4gPSBmYWxzZVxuICAgICAgaWYgKGF3YWl0IHRoaXMuZmV0Y2hVc2VyKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlVmlld3MoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICB9XG4gICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBub3RpZnkoeyB0eXBlID0gJ2luZm8nLCB0aXRsZSwgdGV4dCB9ID0ge30pIHtcbiAgICAgIHRpdGxlIHx8PSAoXG4gICAgICAgIHtcbiAgICAgICAgICB3YXJuaW5nOiAnV2FybmluZycsXG4gICAgICAgICAgZXJyb3I6ICdFcnJvcicsXG4gICAgICAgICAgaW5mbzogJ0luZm9ybWF0aW9uJyxcbiAgICAgICAgICBzdWNjZXNzOiAnU3VjY2VzcydcbiAgICAgICAgfVt0eXBlXSB8fFxuICAgICAgICAnTm90aWZpY2F0aW9uJ1xuICAgICAgKVxuICAgICAgdGV4dCA9IGA8cD4ke1xuICAgICAgICBhc0FycmF5KHRleHQpLmpvaW4oJzwvcD4gPHA+JylcbiAgICAgIH08L3A+YC5yZXBsYWNlKC9cXG58XFxyXFxufFxcci9nLCAnPGJyPicpXG4gICAgICBjb25zdCBsb2cgPSAoXG4gICAgICAgIHtcbiAgICAgICAgICB3YXJuaW5nOiAnd2FybicsXG4gICAgICAgICAgZXJyb3I6ICdlcnJvcicsXG4gICAgICAgICAgaW5mbzogJ2xvZycsXG4gICAgICAgICAgc3VjY2VzczogJ2xvZydcbiAgICAgICAgfVt0eXBlXSB8fFxuICAgICAgICAnZXJyb3InXG4gICAgICApXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZVtsb2ddKHN0cmlwVGFncyh0ZXh0KSlcbiAgICAgIGNvbnN0IHsgbm90aWZpY2F0aW9ucyA9IHRydWUgfSA9IHRoaXMuYXBpXG4gICAgICBpZiAobm90aWZpY2F0aW9ucykge1xuICAgICAgICAvLyBDYWxjdWxhdGUgZGlzcGxheS1kdXJhdGlvbiBmb3IgdGhlIG5vdGlmaWNhdGlvbiBiYXNlZCBvbiBpdHMgY29udGVudFxuICAgICAgICAvLyBhbmQgdGhlIHNldHRpbmcgb2YgdGhlIGBkdXJhdGlvbkZhY3RvcmAgY29uZmlndXJhdGlvbi4gSXQgZGVmaW5lcyB0aGVcbiAgICAgICAgLy8gYW1vdW50IG9mIG1pbGxpc2Vjb25kcyBtdWx0aXBsaWVkIHdpdGggdGhlIGFtb3VudCBvZiBjaGFyYWN0ZXJzXG4gICAgICAgIC8vIGRpc3BsYXllZCBpbiB0aGUgbm90aWZpY2F0aW9uLCBwbHVzIDQwICg0MCArIHRpdGxlICsgbWVzc2FnZSk6XG4gICAgICAgIGNvbnN0IHsgZHVyYXRpb25GYWN0b3IgPSAyMCB9ID0gbm90aWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9ICg0MCArIHRleHQubGVuZ3RoICsgdGl0bGUubGVuZ3RoKSAqIGR1cmF0aW9uRmFjdG9yXG4gICAgICAgIHRoaXMuJG5vdGlmeSh7IHR5cGUsIHRpdGxlLCB0ZXh0LCBkdXJhdGlvbiB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9zZU5vdGlmaWNhdGlvbnMoKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZGVzdHJveUFsbCgpXG4gICAgfSxcblxuICAgIHJlZ2lzdGVyTG9hZGluZyhpc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMubG9hZGluZ0NvdW50ICs9IGlzTG9hZGluZyA/IDEgOiAtMVxuICAgIH0sXG5cbiAgICBzaG93RGlhbG9nKHsgY29tcG9uZW50cywgYnV0dG9ucywgZGF0YSwgc2V0dGluZ3MgfSkge1xuICAgICAgLy8gU2hvd3MgYSBkaXRvLWRpYWxvZyBjb21wb25lbnQgYW5kIHdyYXBzIGl0IGluIGEgcHJvbWlzZSBzbyB0aGF0IHRoZVxuICAgICAgLy8gYnV0dG9ucyBpbiB0aGUgZGlhbG9nIGNhbiB1c2UgYGRpYWxvZy5yZXNvbHZlKClgIGFuZCBgZGlhbG9nLnJlamVjdCgpYFxuICAgICAgLy8gdG8gY2xvc2UgdGhlIG1vZGFsIGRpYWxvZyBhbmQgcmVzb2x2ZSAvIHJlamVjdCB0aGUgcHJvbWlzZSBhdCBvbmNlLlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgLy8gUHJvY2VzcyBjb21wb25lbnRzIHRvIHJlc29sdmUgYXN5bmMgc2NoZW1hcy5cbiAgICAgICAgICBjb25zdCByb3V0ZXMgPSBbXVxuICAgICAgICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKHRoaXMuYXBpLCB7IGNvbXBvbmVudHMgfSwgcm91dGVzLCAwKVxuICAgICAgICAgIGlmIChyb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnRGlhbG9ncyBkbyBub3Qgc3VwcG9ydCBjb21wb25lbnRzIHRoYXQgcHJvZHVjZSByb3V0ZXMnXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGtleSA9IGBkaWFsb2ctJHsrK2RpYWxvZ0lkfWBcbiAgICAgICAgICB0aGlzLmRpYWxvZ3Nba2V5XSA9IHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgcHJvbWlzZTogeyByZXNvbHZlLCByZWplY3QgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0sXG5cbiAgICByZW1vdmVEaWFsb2coa2V5KSB7XG4gICAgICBkZWxldGUgdGhpcy5kaWFsb2dzW2tleV1cbiAgICB9LFxuXG4gICAgYXN5bmMgbG9naW4oKSB7XG4gICAgICB0aGlzLmFsbG93TG9naW4gPSB0cnVlXG4gICAgICBjb25zdCB7XG4gICAgICAgIGFkZGl0aW9uYWxDb21wb25lbnRzLFxuICAgICAgICByZWRpcmVjdEFmdGVyTG9naW5cbiAgICAgIH0gPSB0aGlzLm9wdGlvbnMubG9naW4gfHwge31cbiAgICAgIGNvbnN0IGxvZ2luRGF0YSA9IGF3YWl0IHRoaXMuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICB1c2VybmFtZToge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYWRkaXRpb25hbENvbXBvbmVudHNcbiAgICAgICAgfSxcbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgIGNhbmNlbDoge30sXG4gICAgICAgICAgbG9naW46IHsgdHlwZTogJ3N1Ym1pdCcgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGxvZ2luRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9naW4sXG4gICAgICAgICAgICBkYXRhOiBsb2dpbkRhdGEsXG4gICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlZGlyZWN0QWZ0ZXJMb2dpbikge1xuICAgICAgICAgICAgbG9jYXRpb24ucmVwbGFjZShyZWRpcmVjdEFmdGVyTG9naW4pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlcihyZXNwb25zZS5kYXRhLnVzZXIpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVWaWV3cygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3JcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdBdXRoZW50aWNhdGlvbiBFcnJvcicsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvciB8fCBlcnJcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnIucmVzcG9uc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9naW4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG5hdmlnYXRlSG9tZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKCcvJylcbiAgICB9LFxuXG4gICAgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9nb3V0LFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnNldFVzZXIobnVsbClcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZmV0Y2hVc2VyKCkge1xuICAgICAgbGV0IHVzZXIgPSBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5zZXNzaW9uLFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHVzZXIgPSByZXNwb25zZS5kYXRhLnVzZXIgfHwgbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHRpdGxlOiAnQXV0aGVudGljYXRpb24gRXJyb3InLFxuICAgICAgICAgIHRleHQ6IGVyclxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRVc2VyKHVzZXIpXG4gICAgICByZXR1cm4gdXNlclxuICAgIH0sXG5cbiAgICBzZXRVc2VyKHVzZXIpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUudXNlciA9IChcbiAgICAgICAgdXNlciAmJlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodXNlciwgRGl0b1VzZXIucHJvdG90eXBlKVxuICAgICAgKVxuICAgICAgLy8gQ2xlYXIgcmVzb2x2ZWQgdmlld3Mgd2hlbiB1c2VyIGlzIGxvZ2dlZCBvdXQuXG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0ge31cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUhvbWUoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVVc2VyKCkge1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5mZXRjaFVzZXIoKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc29sdmVWaWV3cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRWaWV3cyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKHRoaXMudW5yZXNvbHZlZFZpZXdzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXF1ZXN0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFsbCByb3V0ZXMgZnJvbSB0aGUgcm9vdCBzY2hlbWEgY29tcG9uZW50c1xuICAgICAgY29uc3Qgcm91dGVzID0gYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlc29sdmVkVmlld3MpLFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHByb2Nlc3NWaWV3KERpdG9WaWV3LCB0aGlzLmFwaSwgc2NoZW1hLCBuYW1lKVxuICAgICAgKVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHJvdXRlcyBhcmUgbG9hZGVkLCByZXBsYWNlIGFsbCBleGlzdGluZyByb3V0ZXMgd2l0aCB0aGVcbiAgICAgIC8vIG5ldyByb3V0ZXMsIGFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHBhdGguXG4gICAgICBjb25zdCB7IGZ1bGxQYXRoIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgdGhpcy5yZW1vdmVSb3V0ZXM/LigpXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcyA9IGFkZFJvdXRlcyh0aGlzLiRyb3V0ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyb290JyxcbiAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgfSxcbiAgICAgICAgLi4ucm91dGVzXG4gICAgICBdKVxuICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoZnVsbFBhdGgpXG4gICAgfVxuICB9XG59KVxuXG5sZXQgZGlhbG9nSWQgPSAwXG5cbmZ1bmN0aW9uIGFkZFJvdXRlcyhyb3V0ZXIsIHJvdXRlcykge1xuICBjb25zdCByZW1vdmVycyA9IFtdXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgY29uc3QgcmVtb3ZlUm91dGUgPSByb3V0ZXIuYWRkUm91dGUocm91dGUpXG4gICAgcmVtb3ZlcnMucHVzaChyZW1vdmVSb3V0ZSlcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgcmVtb3ZlcnMpIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvc3R5bGUnO1xuXG4uZGl0by1hcHAsXG4uZGl0by1yb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLmRpdG8tcm9vdCB7XG4gIC5kaXRvLXBhZ2Uge1xuICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgLy8gVGhlIHJvb3QtbGV2ZWwgdmlld3MgYW5kIGZvcm1zIG1heSBoYXZlIGEgYC5kaXRvLXNjaGVtYS1oZWFkZXJgIHRoYXRcbiAgICAvLyBzaG91bGQgYXBwZWFyIGxheWVyZWQgb3ZlciBgLmRpdG8tbWVudWAsIHdoaWxlIGhhdmluZyBgb3ZlcmxheTogaGlkZGVuYFxuICAgIC8vIHNldCBieSBgLmRpdG8tc2Nyb2xsLXBhcmVudGAgdG8gZGVsZWdhdGUgc2Nyb2xsaW5nIHRvIGAuZGl0by1zY3JvbGxgLlxuICAgIC8vIEluIG9yZGVyIHRvIG5vdCBoYXZlIHRoZSBoZWFkZXIgY2xpcHBlZCwgYWRqdXN0IHRoZSB0b3AgaGVyZTpcbiAgICA+IC5kaXRvLWZvcm0sXG4gICAgPiAuZGl0by12aWV3IHtcbiAgICAgIG1hcmdpbi10b3A6IC0kbWVudS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nLXRvcDogJG1lbnUtaGVpZ2h0O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1tZW51LmRpdG8tc2Nyb2xsLXBhcmVudFxuICBoMSB7eyBhcHBTdGF0ZS50aXRsZSB9fVxuICB1bC5kaXRvLXNjcm9sbFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJ2aWV3IGluIHZpZXdzXCJcbiAgICApXG4gICAgICBSb3V0ZXJMaW5rLmRpdG8tbGluayhcbiAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcih2aWV3KVwiXG4gICAgICAgIDp0bz1cImAvJHt2aWV3LnBhdGh9YFwiXG4gICAgICAgIGFjdGl2ZUNsYXNzPVwiZGl0by1hY3RpdmVcIlxuICAgICAgKSB7eyBnZXRMYWJlbCh2aWV3KSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b01lbnUnLCB7fSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1lbnUge1xuICBmbGV4OiBpbml0aWFsO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgdWwge1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci1zdHlsZTtcbiAgfVxuXG4gIGEsXG4gIGgxIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIGgxIHtcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItZGFya2VzdDtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tbGluayB7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG5cbiAgICAmLmRpdG8tYWN0aXZlIHtcbiAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1saW5rIHtcbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zcGlubmVyKFxuICB2LXNob3c9XCJsb2FkaW5nXCJcbilcbiAgLy8tIFRPRE86IENvbnZlcnQgdG8gQkVNXG4gIC52LXB1bHNlLnYtcHVsc2UxKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTFdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UyKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTJdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UzKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTNdXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIGxvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJyM1ZGM1OTYnXG4gICAgfSxcbiAgICBzaXplOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTVweCdcbiAgICB9LFxuICAgIG1hcmdpbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzJweCdcbiAgICB9LFxuICAgIHJhZGl1czoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzEwMCUnXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gVE9ETzogQ29udmVydCB0byB1c2luZyBvbmx5IGNsYXNzZXNcbiAgICByZXR1cm4ge1xuICAgICAgc3Bpbm5lclN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgd2lkdGg6IHRoaXMuc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUsXG4gICAgICAgIG1hcmdpbjogdGhpcy5tYXJnaW4sXG4gICAgICAgIGJvcmRlclJhZGl1czogdGhpcy5yYWRpdXMsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBhbmltYXRpb25OYW1lOiAndi1wdWxzZVN0cmV0Y2hEZWxheScsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAnMC43NXMnLFxuICAgICAgICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogJ2luZmluaXRlJyxcbiAgICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246ICdjdWJpYy1iZXppZXIoLjIsLjY4LC4xOCwxLjA4KScsXG4gICAgICAgIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkxOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4xMnMnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5Mjoge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMjRzJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTM6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjM2cydcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBrZXlmcmFtZXMgdi1wdWxzZVN0cmV0Y2hEZWxheSB7XG4gIDAlLFxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIDQ1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xuICAgIG9wYWNpdHk6IDAuNztcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHYtcHVsc2VTdHJldGNoRGVsYXkge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxubmF2LmRpdG8taGVhZGVyXG4gIC5kaXRvLXRyYWlsXG4gICAgdWxcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihjb21wb25lbnQsIGluZGV4KSBpbiB0cmFpbFwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJpbmRleCA9PT0gdHJhaWwubGVuZ3RoIC0gMVwiXG4gICAgICAgIClcbiAgICAgICAgICBzcGFuKDpjbGFzcz1cImdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpXCIpXG4gICAgICAgICAgICB8IHt7IGNvbXBvbmVudC5icmVhZGNydW1iIH19XG4gICAgICAgIFJvdXRlckxpbmsuZGl0by1icmVhZGNydW1iKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIDp0bz1cImNvbXBvbmVudC5wYXRoXCJcbiAgICAgICAgKVxuICAgICAgICAgIHNwYW4oOmNsYXNzPVwiZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudClcIilcbiAgICAgICAgICAgIHwge3sgY29tcG9uZW50LmJyZWFkY3J1bWIgfX1cbiAgICBEaXRvU3Bpbm5lcihcbiAgICAgIHYtaWY9XCJpc0xvYWRpbmdcIlxuICAgIClcbiAgc2xvdFxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b1NwaW5uZXIgZnJvbSAnLi9EaXRvU3Bpbm5lci52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0hlYWRlcicsIHtcbiAgY29tcG9uZW50czogeyBEaXRvU3Bpbm5lciB9LFxuXG4gIHByb3BzOiB7XG4gICAgc3Bpbm5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgaXNMb2FkaW5nOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmFpbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cy5maWx0ZXIoXG4gICAgICAgIGNvbXBvbmVudCA9PiAhIWNvbXBvbmVudC5yb3V0ZVJlY29yZFxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNpemUgPSAnOHB4JyxcbiAgICAgIGNvbG9yID0gJyM5OTknXG4gICAgfSA9IHRoaXMuc3Bpbm5lciB8fCB7fVxuICAgIC8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIHRvIHNldCB0aGUgZGVmYXVsdCBwcm9wcyBmb3IgdGhlIERpdG9TcGlubmVyLlxuICAgIC8vIFBhc3MgdGhlbSBvbiB0aHJvdWdoIHRoZSB0ZW1wbGF0ZSBpbnN0ZWFkIVxuICAgIGNvbnN0IHsgcHJvcHMgfSA9IERpdG9TcGlubmVyXG4gICAgcHJvcHMuc2l6ZS5kZWZhdWx0ID0gc2l6ZVxuICAgIHByb3BzLmNvbG9yLmRlZmF1bHQgPSBjb2xvclxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1kaXJ0eSc6IGNvbXBvbmVudC5pc0RpcnR5XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taGVhZGVyIHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWJsYWNrO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICB6LWluZGV4OiAkbWVudS16LWluZGV4O1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tdHJhaWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDNlbTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZztcblxuICAgIHVsIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNGVtO1xuXG4gICAgICAkYW5nbGU6IDMzZGVnO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICM5OTk5OTk7XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxLjJlbTtcbiAgICAgICAgcmlnaHQ6IC0xcHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrO1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xuICAgICAgfVxuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGJvdHRvbTogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXNwaW5uZXIge1xuICAgIG1hcmdpbi10b3A6ICRtZW51LXBhZGRpbmctdmVyO1xuICB9XG5cbiAgLmRpdG8tZGlydHkge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDhweDtcbiAgICAgIGhlaWdodDogOHB4O1xuICAgICAgbWFyZ2luOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWFjY291bnQsXG4gIC5kaXRvLWxvZ2luIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWFjY291bnQge1xuICAgIGxlZnQ6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZyAqIDI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1bGxkb3duOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBzdGFydFRpbWU6IDAsXG4gICAgICAgIGNoZWNrVGltZTogdHJ1ZSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbW91c2Vkb3duOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgbW91c2V1cDogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub25QdWxsZG93bk1vdXNlVXAobnVsbCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlcnM6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4odHJ1ZSlcbiAgICAgICAgdGhpcy5jaGVja1RpbWUgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0VGltZSB9ID0gdGhpcy5wdWxsZG93blxuICAgICAgaWYgKCF0aGlzLmNoZWNrVGltZSB8fCBzdGFydFRpbWUgJiYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPiAyNTApKSB7XG4gICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9uUHVsbGRvd25TZWxlY3QodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCgvKiB2YWx1ZSAqLykge1xuICAgICAgLy8gTk9URTogVG8gYmUgb3ZlcnJpZGRlbi5cbiAgICB9LFxuXG4gICAgc2V0UHVsbGRvd25PcGVuKG9wZW4pIHtcbiAgICAgIHRoaXMucHVsbGRvd24ub3BlbiA9IG9wZW5cbiAgICAgIHRoaXMucHVsbGRvd24uc3RhcnRUaW1lID0gb3BlbiA/IERhdGUubm93KCkgOiAwXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzID0gdGhpcy5kb21Pbihkb2N1bWVudCwgdGhpcy5wdWxsZG93bi5ldmVudHMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tYWNjb3VudFxuICBhKFxuICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24oKVwiXG4gIClcbiAgICBzcGFuIHt7IHVzZXIudXNlcm5hbWUgfX1cbiAgdWwuZGl0by1wdWxsZG93big6Y2xhc3M9XCJ7ICdkaXRvLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICBsaShcbiAgICAgIHYtZm9yPVwiKGxhYmVsLCB2YWx1ZSkgb2YgaXRlbXNcIlxuICAgIClcbiAgICAgIGEoXG4gICAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpXCJcbiAgICAgICAgQG1vdXNldXA9XCJvblB1bGxkb3duTW91c2VVcCh2YWx1ZSlcIlxuICAgICAgKSB7eyBsYWJlbCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQWNjb3VudCcsIHtcbiAgbWl4aW5zOiBbUHVsbGRvd25NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHtcbiAgICAgICAgc2V0dGluZ3M6ICdTZXR0aW5ncycsXG4gICAgICAgIGxvZ291dDogJ0xvZ291dCdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25TZWxlY3QodmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbG9nb3V0JzpcbiAgICAgICAgICB0aGlzLnJvb3RDb21wb25lbnQubG9nb3V0KClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZXR0aW5ncyc6XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdUT0RPOiBJbXBsZW1lbnQgU2V0dGluZ3MnKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tYWNjb3VudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1wdWxsZG93biB7XG4gICAgdG9wOiAkcHVsbGRvd24tcGFkZGluZy12ZXI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICB2LWlmPVwiY29udGVudFwiXG4gIDppcz1cIm9wdGlvbnMudGFnIHx8IHRhZ1wiXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKSB7eyBvcHRpb25zLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWxlbWVudCcsIHtcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc3BhbicgfSxcbiAgICBjb250ZW50OiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb3B0aW9ucygpIHtcbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGNvbnRlbnQpID8gY29udGVudCA6IHsgdGV4dDogY29udGVudCB9XG4gICAgfSxcblxuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLmNsYXNzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5zdHlsZSxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLnN0eWxlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuZnVuY3Rpb24gYXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLnJlZHVjZSgob2JqZWN0LCBlbnRyeSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhlbnRyeSkpIHtcbiAgICAgIG9iamVjdFtlbnRyeV0gPSB0cnVlXG4gICAgfSBlbHNlIGlmIChpc09iamVjdChlbnRyeSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqZWN0LCBlbnRyeSlcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFxuICB9LCB7fSlcbn1cbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmNvbXBvbmVudC5kaXRvLWxhYmVsKFxuICB2LWlmPVwidGV4dCB8fCBjb2xsYXBzaWJsZVwiXG4gIDppcz1cInRhZ1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuKVxuICAuZGl0by1jaGV2cm9uKFxuICAgIHYtaWY9XCJjb2xsYXBzaWJsZVwiXG4gICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiAhY29sbGFwc2VkIH1cIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtcHJlZml4KFxuICAgIHYtZm9yPVwiKHByZWZpeCwgaW5kZXgpIG9mIHByZWZpeGVzXCJcbiAgICA6a2V5PVwiYHByZWZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwicHJlZml4XCJcbiAgKVxuICBsYWJlbChcbiAgICA6Zm9yPVwiZGF0YVBhdGhcIlxuICAgIHYtaHRtbD1cInRleHRcIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtc3VmZml4KFxuICAgIHYtZm9yPVwiKHN1ZmZpeCwgaW5kZXgpIG9mIHN1ZmZpeGVzXCJcbiAgICA6a2V5PVwiYHN1ZmZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwic3VmZml4XCJcbiAgKVxuICBzbG90KG5hbWU9XCJlZGl0LWJ1dHRvbnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9MYWJlbCcsIHtcbiAgZW1pdHM6IFsnZXhwYW5kJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGFnKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyAnYScgOiAnZGl2J1xuICAgIH0sXG5cbiAgICB0ZXh0KCkge1xuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGxhYmVsKSA/IGxhYmVsPy50ZXh0IDogbGFiZWxcbiAgICB9LFxuXG4gICAgcHJlZml4ZXMoKSB7XG4gICAgICByZXR1cm4gYXNBcnJheSh0aGlzLmxhYmVsPy5wcmVmaXgpXG4gICAgfSxcblxuICAgIHN1ZmZpeGVzKCkge1xuICAgICAgcmV0dXJuIGFzQXJyYXkodGhpcy5sYWJlbD8uc3VmZml4KVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyB7IG9uQ2xpY2s6IHRoaXMub25DbGljayB9IDoge31cbiAgICB9LFxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9PT0gdGhpc1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGljaygpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPSB0aGlzXG4gICAgICB0aGlzLiRlbWl0KCdleHBhbmQnLCB0aGlzLmNvbGxhcHNlZClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1sYWJlbCB7XG4gIC0tbGFiZWwtcGFkZGluZzogMDtcbiAgLy8gRm9yIGJ1dHRvbnMgYW5kIGNoZXZyb24gdG8gYWxpZ24gcmlnaHQ6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gVmVydGljYWxseSBjZW50ZXIgYWxsIGl0ZW1zIGluIHRoZSBsYWJlbCwgZS5nLiBjaGV2cm9uLCBlZGl0LWJ1dHRvbnMuXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICBtYXJnaW46IDAgMCAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcblxuICBsYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG5cbiAgbGFiZWwsXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICAmOm50aC1sYXN0LWNoaWxkKDIpIHtcbiAgICAgIC8vIFRvIHN0cmV0Y2ggZWl0aGVyIGxhYmVsIG9yIC5kaXRvLWxhYmVsLXN1ZmZpeCB0byBmdWxsIGF2YWlsYWJsZSB3aWR0aFxuICAgICAgLy8gc28gdGhhdCBidXR0b25zIGFsd2F5cyBhcHBlYXIgcmlnaHQtYWxpZ25lZDpcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIH1cblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICdcXGEwJzsgLy8gJm5ic3A7O1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMge1xuICAgIC8vIE1vdmUgdGhlIGxhYmVsIHBhZGRpbmcgaW5zaWRlIC5kaXRvLWJ1dHRvbnMsIHNvIHRoYXQgaXQgY2FwdHVyZXMgYWxsXG4gICAgLy8gbmVhciBtb3VzZSBldmVudHM6XG4gICAgbWFyZ2luOiBjYWxjKC0xICogdmFyKC0tbGFiZWwtcGFkZGluZykpO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICB9XG5cbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIEluIG9yZGVyIGZvciBlbGxpcHNpcyB0byB3b3JrIG9uIGxhYmVscyB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBsYXlvdXQsXG4gICAgLy8gd2UgbmVlZCB0byBwb3NpdGlvbiBpdCBhYnNvbHV0ZWx5IGluc2lkZSBpdHMgY29udGFpbmVyLlxuICAgIGxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgLy8gU2luY2UgPGxhYmVsPiB1c2VzIGBwb3NpdGlvbjogYWJzb2x1dGVgLCBzZXQgY29udGVudCB0byBhIHplcm8td2lkdGhcbiAgICAgIC8vIHNwYWNlIG9uIGl0cyBwYXJlbnQgdG8gZW5mb3JjZSB0aGUgcmlnaHQgdGV4dCBoZWlnaHQgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgY29udGVudDogJ1xcMjAwYic7IC8vIHplcm8td2lkdGggc3BhY2U7XG4gICAgfVxuICB9XG59XG5cbmEuZGl0by1sYWJlbCB7XG4gICY6aG92ZXIge1xuICAgIC5kaXRvLWNoZXZyb24ge1xuICAgICAgY29sb3I6ICRjb2xvci1kYXJrZXI7XG4gICAgfVxuICB9XG5cbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgLmRpdG8tY2hldnJvbiB7XG4gICAgICAtd2Via2l0LXRleHQtc3Ryb2tlOiAkYm9yZGVyLXdpZHRoICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICAgIC8vIERpc3BsYXkgbGFiZWxzIGluIGNvbXBhY3Qgc2NoZW1hIGFzIGlubGluZS1ibG9ja3MsIHRvIGFsbG93IGNvbXBhY3RcbiAgICAvLyBsYXlvdXRzIHdpdGggYHdpZHRoOiAnYXV0bydgIGVsZW1lbnRzOlxuICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGNvbnRyb2wgdGhpcyBiZWhhdmlvci5cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtY29tcGFjdCB7XG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgID4gLmRpdG8tcGFuZSB7XG4gICAgICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQge1xuICBnZXRJdGVtRm9ybVNjaGVtYSxcbiAgZ2V0SXRlbUlkLFxuICBnZXRJdGVtVWlkLFxuICBpc0xpc3RTb3VyY2Vcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWV0aG9kczoge1xuICAgIGdldEl0ZW1Gb3JtU2NoZW1hLFxuXG4gICAgZ2V0SXRlbVVpZCxcblxuICAgIGdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4ID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNUcmFuc2llbnQgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgPyBTdHJpbmcoaW5kZXgpXG4gICAgICAgIDogZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSlcbiAgICB9LFxuXG4gICAgZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpIHtcbiAgICAgIGxldCB7IGRhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBpZiAoc291cmNlU2NoZW1hICE9PSB0aGlzLnNjaGVtYSkge1xuICAgICAgICBkYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzb3VyY2VTY2hlbWEubmFtZSlcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGluZGV4KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFQYXRoXG4gICAgfSxcblxuICAgIGZpbmRJdGVtSWRJbmRleChzb3VyY2VTY2hlbWEsIGRhdGEsIGl0ZW1JZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmlzVHJhbnNpZW50XG4gICAgICAgID8gLy8gRm9yIHRyYW5zaWVudCBkYXRhLCB0aGUgaW5kZXggaXMgdXNlZCBhcyB0aGUgaWRcbiAgICAgICAgICBpdGVtSWRcbiAgICAgICAgOiBkYXRhPy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgdGhpcy5nZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtLCBpbmRleCkgPT09IGl0ZW1JZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgIHJldHVybiBpbmRleCAhPT0gLTEgPyBpbmRleCA6IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0SXRlbUxhYmVsKHNvdXJjZVNjaGVtYSwgaXRlbSwge1xuICAgICAgaW5kZXggPSBudWxsLFxuICAgICAgZXh0ZW5kZWQgPSBmYWxzZSxcbiAgICAgIGFzT2JqZWN0ID0gZmFsc2VcbiAgICB9ID0ge30pIHtcbiAgICAgIGNvbnN0IHsgaXRlbUxhYmVsIH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmICghaXRlbSB8fCAhZXh0ZW5kZWQgJiYgaXRlbUxhYmVsID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YVBhdGhcbiAgICAgIGNvbnN0IGdldERhdGFQYXRoID0gKCkgPT5cbiAgICAgICAgKGRhdGFQYXRoIHx8PSB0aGlzLmdldEl0ZW1EYXRhUGF0aChzb3VyY2VTY2hlbWEsIGluZGV4KSlcblxuICAgICAgbGV0IGZvcm1MYWJlbFxuICAgICAgY29uc3QgZ2V0Rm9ybUxhYmVsID0gKCkgPT5cbiAgICAgICAgKGZvcm1MYWJlbCB8fD0gdGhpcy5nZXRMYWJlbChcbiAgICAgICAgICBnZXRJdGVtRm9ybVNjaGVtYShzb3VyY2VTY2hlbWEsIGl0ZW0sIHRoaXMuY29udGV4dClcbiAgICAgICAgKSlcblxuICAgICAgbGV0IHRleHRcbiAgICAgIGxldCBwcmVmaXhcbiAgICAgIGxldCBzdWZmaXhcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGl0ZW1MYWJlbCkpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtTGFiZWwuY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICBuZXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgaW5kZXgsXG5cbiAgICAgICAgICAgIGdldCBkYXRhUGF0aCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldERhdGFQYXRoKClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRGb3JtTGFiZWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzT2JqZWN0KGxhYmVsKSkge1xuICAgICAgICAgIDsoeyB0ZXh0LCBwcmVmaXgsIHN1ZmZpeCB9ID0gbGFiZWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dCA9IGxhYmVsXG4gICAgICAgIH1cbiAgICAgICAgLy8gSXQncyB1cCB0byBgaXRlbUxhYmVsKClgIGVudGlyZWx5IHRvIHByb2R1Y2UgdGhlIGxhYmVsOlxuICAgICAgICBleHRlbmRlZCA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGl0ZW1MYWJlbCkgJiYgIShpdGVtTGFiZWwgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gYGl0ZW1MYWJlbGAgY2FuIGJlIGJvdGggYSBrZXksIG9yIHNpbXBseSBhIGxhYmVsLlxuICAgICAgICB0ZXh0ID0gaXRlbUxhYmVsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMb29rIHVwIHRoZSBuYW1lIG9uIHRoZSBpdGVtLCBieSB0aGVzZSBydWxlczpcbiAgICAgICAgLy8gMS4gSWYgYGl0ZW1MYWJlbGAgaXMgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgcHJvcGVydHkga2V5XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIGNvbHVtbnMsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIDMuIE90aGVyd2lzZSwgc2VlIGlmIHRoZSBpdGVtIGhhcyBhIHByb3BlcnR5IG5hbWVkICduYW1lJ1xuICAgICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgICBjb25zdCBrZXkgPSAoXG4gICAgICAgICAgaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiBpdGVtTGFiZWwgfHxcbiAgICAgICAgICBpc0xpc3RTb3VyY2Uoc291cmNlU2NoZW1hKSAmJiBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpWzBdIHx8XG4gICAgICAgICAgJ25hbWUnXG4gICAgICAgIClcbiAgICAgICAgdGV4dCA9IGl0ZW1ba2V5XVxuICAgICAgfVxuICAgICAgY29uc3QgaGFkTGFiZWwgPSAhIXRleHRcbiAgICAgIC8vIElmIG5vIGxhYmVsIHdhcyBmb3VuZCBzbyBmYXIsIHRyeSB0byBwcm9kdWNlIG9uZSBmcm9tIHRoZSBpbmRleC5cbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBleHRlbmRlZCBzdHlsZSB3aGVuIGF1dG8tZ2VuZXJhdGluZyBsYWJlbHMgZnJvbSBpbmRleC9pZDpcbiAgICAgICAgZXh0ZW5kZWQgPSB0cnVlXG4gICAgICAgIHRleHQgPVxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGluZGV4ICE9PSBudWxsXG4gICAgICAgICAgICA/ICh0ZXh0ID0gYCR7aW5kZXggKyAxfWApXG4gICAgICAgICAgICA6ICcnXG4gICAgICB9XG4gICAgICBpZiAoZXh0ZW5kZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybUxhYmVsID0gZ2V0Rm9ybUxhYmVsKClcbiAgICAgICAgaWYgKGZvcm1MYWJlbCkge1xuICAgICAgICAgIC8vIElmIGEgbGFiZWwgd2FzIHByb3ZpZGVkLCBwdXQgaW4gcXVvdGVzIHdoZW4gcHJlZml4ZWQgd2l0aCB0aGVcbiAgICAgICAgICAvLyBmb3JtIGxhYmVsIGZvciB0aGUgZXh0ZW5kZWQgc3R5bGU6XG4gICAgICAgICAgdGV4dCA9IGAke2Zvcm1MYWJlbH0gJHtoYWRMYWJlbCA/IGAnJHt0ZXh0fSdgIDogdGV4dH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhc09iamVjdCA/IHsgdGV4dCwgcHJlZml4LCBzdWZmaXggfSA6IHRleHRcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zY2hlbWFcbiAgLmRpdG8tc2NoZW1hLWNvbnRlbnRcbiAgICAuZGl0by1zY2hlbWEtaGVhZGVyKFxuICAgICAgdi1pZj1cImhhc0xhYmVsIHx8IGhhc1RhYnMgfHwgY2xpcGJvYXJkXCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2NoZW1hLW1lbnUtaGVhZGVyJzogbWVudUhlYWRlciB9XCJcbiAgICApXG4gICAgICBEaXRvTGFiZWwoXG4gICAgICAgIHYtaWY9XCJoYXNMYWJlbFwiXG4gICAgICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgIDpjb2xsYXBzZWQ9XCIhb3BlbmVkXCJcbiAgICAgICAgQGV4cGFuZD1cIm9uRXhwYW5kXCJcbiAgICAgIClcbiAgICAgICAgLy8tIFBhc3MgZWRpdC1idXR0b25zIHRocm91Z2ggdG8gZGl0by1sYWJlbCdzIG93biBlZGl0LWJ1dHRvbnMgc2xvdDpcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImlubGluZWRcIlxuICAgICAgICAgICNlZGl0LWJ1dHRvbnNcbiAgICAgICAgKVxuICAgICAgICAgIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuICAgICAgRGl0b1RhYnMoXG4gICAgICAgIHYtaWY9XCJ0YWJzXCJcbiAgICAgICAgOnRhYnM9XCJ0YWJzXCJcbiAgICAgICAgOnNlbGVjdGVkVGFiPVwic2VsZWN0ZWRUYWJcIlxuICAgICAgKVxuICAgICAgRGl0b0NsaXBib2FyZChcbiAgICAgICAgOmNsaXBib2FyZD1cImNsaXBib2FyZFwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJoYXNUYWJzXCJcbiAgICApXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtdGFiKFxuICAgICAgICB2LWZvcj1cIih0YWJTY2hlbWEsIHRhYikgaW4gdGFic1wiXG4gICAgICAgIHJlZj1cInRhYnNcIlxuICAgICAgICA6a2V5PVwidGFiXCJcbiAgICAgICAgOnZpc2libGU9XCJzZWxlY3RlZFRhYiA9PT0gdGFiXCJcbiAgICAgICAgOnRhYj1cInRhYlwiXG4gICAgICAgIDpzY2hlbWE9XCJ0YWJTY2hlbWFcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOnNpbmdsZT1cIiFpbmxpbmVkICYmICFoYXNNYWluUGFuZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIFRyYW5zaXRpb25IZWlnaHQoOmVuYWJsZWQ9XCJpbmxpbmVkXCIpXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtbWFpbihcbiAgICAgICAgdi1pZj1cImhhc01haW5QYW5lICYmIG9wZW5lZFwiXG4gICAgICAgIHJlZj1cImNvbXBvbmVudHNcIlxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpzaW5nbGU9XCIhaW5saW5lZCAmJiAhaGFzVGFic1wiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiIWlubGluZWQgJiYgaXNQb3B1bGF0ZWRcIlxuICAgICAgbmFtZT1cImJ1dHRvbnNcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1pZj1cImlubGluZWRcIlxuICApXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIhaGFzTGFiZWxcIlxuICAgICAgbmFtZT1cImVkaXQtYnV0dG9uc1wiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWVsc2UtaWY9XCJpc1BvcHVsYXRlZFwiXG4gIClcbiAgICBEaXRvUGFuZWxzKFxuICAgICAgOnBhbmVscz1cInBhbmVsRW50cmllc1wiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUmVnRXhwLFxuICBwYXJzZURhdGFQYXRoLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgbGFiZWxpemVcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IFRyYW5zaXRpb25IZWlnaHQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgSXRlbU1peGluIGZyb20gJy4uL21peGlucy9JdGVtTWl4aW4uanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCwgZ2V0UGFyZW50SXRlbSB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQge1xuICBnZXROYW1lZFNjaGVtYXMsXG4gIGdldFBhbmVsRW50cmllcyxcbiAgc2V0RGVmYXVsdFZhbHVlcyxcbiAgcHJvY2Vzc0RhdGFcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY2hlbWEnLCB7XG4gIG1peGluczogW0l0ZW1NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVHJhbnNpdGlvbkhlaWdodCB9LFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRzY2hlbWFDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgaW5qZWN0OiBbXG4gICAgJyRzY2hlbWFQYXJlbnRDb21wb25lbnQnXG4gIF0sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgbGFiZWw6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGlubGluZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGhhc093bkRhdGE6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBtZW51SGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpcy5zY2hlbWFcbiAgICByZXR1cm4ge1xuICAgICAgLy8gQWxsb3cgc2NoZW1hIHRvIHByb3ZpZGUgbW9yZSBkYXRhIHRocm91Z2ggYHNjaGVtYS5kYXRhYCwgdnVlLXN0eWxlOlxuICAgICAgLi4uKFxuICAgICAgICBkYXRhICYmIGlzRnVuY3Rpb24oZGF0YSlcbiAgICAgICAgICA/IGRhdGEodGhpcy5jb250ZXh0KVxuICAgICAgICAgIDogZGF0YVxuICAgICAgKSxcbiAgICAgIGNvbXBvbmVudHNSZWdpc3RyeToge30sXG4gICAgICBwYW5lc1JlZ2lzdHJ5OiB7fSxcbiAgICAgIHBhbmVsc1JlZ2lzdHJ5OiB7fVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIE92ZXJyaWRlIERpdG9NaXhpbidzIHNjaGVtYUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgLy8gRG9uJ3QgcmV0dXJuIHRoZSBhY3R1YWwgcGFyZW50IHNjaGVtYSBpcyB0aGlzIHNjaGVtYSBoYW5kbGVzIGl0cyBvd25cbiAgICAgIC8vIGRhdGEuIFRoaXMgcHJldmVudHMgZGVsZWdhdGluZyBldmVudHMgdG8gdGhlIHBhcmVudCwgYW5kIHJlZ2lzdGVyaW5nXG4gICAgICAvLyBjb21wb25lbnRzIHdpdGggdGhlIHBhcmVudCB0aGF0IHdvdWxkIGNhdXNlIGl0IHRvIHNldCBpc0RpcnR5IGZsYWdzLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/IG51bGwgOiB0aGlzLnBhcmVudENvbXBvbmVudC5zY2hlbWFDb21wb25lbnRcbiAgICB9LFxuXG4gICAgcGFuZWxFbnRyaWVzKCkge1xuICAgICAgY29uc3QgcGFuZWxFbnRyaWVzID0gZ2V0UGFuZWxFbnRyaWVzKHRoaXMuc2NoZW1hLnBhbmVscywgJycpXG4gICAgICBmb3IgKGNvbnN0IHBhbmUgb2YgdGhpcy5wYW5lcykge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaCguLi5wYW5lLnBhbmVsRW50cmllcylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYW5lbEVudHJpZXNcbiAgICB9LFxuXG4gICAgdGFicygpIHtcbiAgICAgIHJldHVybiBnZXROYW1lZFNjaGVtYXModGhpcy5zY2hlbWEudGFicylcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICBjb25zdCBjdXJyZW50VGFiID0gdGhpcy4kcm91dGUuaGFzaD8uc2xpY2UoMSkgfHwgbnVsbFxuICAgICAgY29uc3QgdGFiID1cbiAgICAgICAgY3VycmVudFRhYiAmJiB0aGlzLnNob3VsZFJlbmRlcih0aGlzLnRhYnNbY3VycmVudFRhYl0pXG4gICAgICAgICAgPyBjdXJyZW50VGFiXG4gICAgICAgICAgOiB0aGlzLmRlZmF1bHRUYWI/Lm5hbWUgfHwgbnVsbFxuICAgICAgaWYgKHRhYiAhPT0gY3VycmVudFRhYikge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgd2F0Y2hlciFcbiAgICAgICAgLy8gQW55IHRhYiBjaGFuZ2UgbmVlZHMgdG8gYmUgcmVmbGVjdGVkIGluIHRoZSByb3V0ZXIgYWxzby5cbiAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoeyBoYXNoOiBgIyR7dGFifWAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YWJcbiAgICB9LFxuXG4gICAgZGVmYXVsdFRhYigpIHtcbiAgICAgIGxldCBmaXJzdCA9IG51bGxcbiAgICAgIGlmICh0aGlzLnRhYnMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnRhYnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0VGFiIH0gPSB0YWJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0Z1bmN0aW9uKGRlZmF1bHRUYWIpXG4gICAgICAgICAgICAgID8gZGVmYXVsdFRhYih0aGlzLmNvbnRleHQpXG4gICAgICAgICAgICAgIDogZGVmYXVsdFRhYlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgICAgICBmaXJzdCA9IHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGNsaXBib2FyZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYT8uY2xpcGJvYXJkXG4gICAgfSxcblxuICAgIHBhcmVudERhdGEoKSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCBmYWxzZSlcbiAgICAgIHJldHVybiBkYXRhICE9PSB0aGlzLmRhdGEgPyBkYXRhIDogbnVsbFxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWREYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RhdGEoeyB0YXJnZXQ6ICdzZXJ2ZXInLCBzY2hlbWFPbmx5OiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGNsaXBib2FyZERhdGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkc2NoZW1hOiB0aGlzLnNjaGVtYS5uYW1lLFxuICAgICAgICAuLi50aGlzLnByb2Nlc3NEYXRhKHsgdGFyZ2V0OiAnY2xpcGJvYXJkJywgc2NoZW1hT25seTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHNpbWlsYXIgdG8gYERpdG9Db250ZXh0YFxuICAgIC8vIHByb3BlcnRpZXMsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGVzZSBvbiBgdGhpc2AgYXMgd2VsbDpcbiAgICAvLyBOT1RFOiBXaGlsZSBpbnRlcm5hbGx5LCB3ZSBzcGVhayBvZiBgZGF0YWAsIGluIHRoZSBBUEkgc3VyZmFjZSB0aGVcbiAgICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzLlxuICAgIC8vIE5PVEU6IFRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYXM6XG4gICAgLy8gcmV0dXJuIGdldEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgZmFsc2UpXG4gICAgaXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFyZW50SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudERhdGFcbiAgICB9LFxuXG4gICAgcm9vdEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290RGF0YVxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkRGF0YVxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xpcGJvYXJkRGF0YVxuICAgIH0sXG5cbiAgICBmb3JtTGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbChcbiAgICAgICAgdGhpcy5nZXRJdGVtRm9ybVNjaGVtYSh0aGlzLnNvdXJjZVNjaGVtYSwgdGhpcy5kYXRhLCB0aGlzLmNvbnRleHQpXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzRGlydHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVG91Y2hlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvbWVDb21wb25lbnQoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZGF0ZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmVyeUNvbXBvbmVudChpdCA9PiBpdC5pc1ZhbGlkYXRlZClcbiAgICB9LFxuXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMubGFiZWwgfHwgdGhpcy5jb2xsYXBzaWJsZVxuICAgIH0sXG5cbiAgICBoYXNUYWJzKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlubGluZWQgJiYgISF0aGlzLnRhYnNcbiAgICB9LFxuXG4gICAgaGFzTWFpblBhbmUoKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudHMgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gISFjb21wb25lbnRzICYmIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgb3BlbmVkOiBnZXRTdG9yZUFjY2Vzc29yKCdvcGVuZWQnLCB7XG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29sbGFwc2VkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb21wb25lbnRzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIHBhbmVzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lc1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lbHMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnBhbmVsc1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5jb21wb25lbnRzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIHBhbmVzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lc1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lbHNCeURhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3RFbnRyaWVzQnlEYXRhUGF0aCh0aGlzLnBhbmVsc1JlZ2lzdHJ5KVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gICAgdGhpcy5zZXR1cFNjaGVtYUZpZWxkcygpXG4gICAgLy8gRGVsZWdhdGUgY2hhbmdlIGV2ZW50cyB0aHJvdWdoIHRvIHBhcmVudCBzY2hlbWE6XG4gICAgdGhpcy5kZWxlZ2F0ZSgnY2hhbmdlJywgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQpXG4gICAgdGhpcy5lbWl0RXZlbnQoJ2luaXRpYWxpemUnKSAvLyBOb3QgYCdjcmVhdGUnYCwgc2luY2UgdGhhdCdzIGZvciBkYXRhLlxuICB9LFxuXG4gIGJlZm9yZVVubW91bnQoKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKVxuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChcbiAgICAgICAgdGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50c0J5TmFtZShkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50QnlOYW1lKG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldFBhbmVsQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgc29tZUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLnNvbWUoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIGV2ZXJ5Q29tcG9uZW50KGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1BvcHVsYXRlZCAmJiB0aGlzLmNvbXBvbmVudHMuZXZlcnkoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIG9uRXhwYW5kKGV4cGFuZCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2V4cGFuZCcsIHtcbiAgICAgICAgLy8gVE9ETzogQWN0dWFsbHkgZXhwb3NlIHRoaXMgb24gRGl0b0NvbnRleHQ/XG4gICAgICAgIGNvbnRleHQ6IHsgZXhwYW5kIH1cbiAgICAgIH0pXG4gICAgICAvLyBQcmV2ZW50IGNsb3NpbmcgdGhlIHNjaGVtYSB3aXRoIGludmFsaWQgZGF0YSwgc2luY2UgdGhlIGluLWNvbXBvbmVudFxuICAgICAgLy8gdmFsaWRhdGlvbiB3aWxsIG5vdCBiZSBleGVjdXRlZCBvbmNlIGl0J3MgY2xvc2VkLlxuXG4gICAgICAvLyBUT0RPOiBNb3ZlIHZhbGlkYXRpb24gb3V0IG9mIGNvbXBvbmVudHMsIHRvIHNjaGVtYSwganVzdCBsaWtlXG4gICAgICAvLyBwcm9jZXNzaW5nLCBhbmQgdXNlIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCBmb3IgdGhlIHJlc3VsdGluZyBlcnJvcnMsXG4gICAgICAvLyB0aGVuIHJlbW92ZSB0aGlzIHJlcXVpcmVtZW50LCBzaW5jZSB3ZSBjYW4gdmFsaWRhdGUgY2xvc2VkIGZvcm1zIGFuZFxuICAgICAgLy8gc2NoZW1hcyB0aGVuLlxuICAgICAgaWYgKCF0aGlzLm9wZW5lZCB8fCBleHBhbmQgfHwgdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHRoaXMub3BlbmVkID0gZXhwYW5kXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2NoYW5nZScpXG4gICAgfSxcblxuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgICBjb21wb25lbnQucmVzZXRWYWxpZGF0aW9uKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLnBhcmVudFNjaGVtYUNvbXBvbmVudD8uZm9jdXMoKVxuICAgICAgdGhpcy5vcGVuZWQgPSB0cnVlXG4gICAgfSxcblxuICAgIHZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkgPSB0cnVlKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudHNCeURhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBsZXQgZGF0YVBhdGhzXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBpc0Z1bmN0aW9uKG1hdGNoKVxuICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA6IGlzUmVnRXhwKG1hdGNoKVxuICAgICAgICAgICAgPyBmaWVsZCA9PiBtYXRjaC50ZXN0KGZpZWxkKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGRhdGFQYXRocyA9IGNoZWNrXG4gICAgICAgICAgPyBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aCkuZmlsdGVyKGNoZWNrKVxuICAgICAgICAgIDogaXNBcnJheShtYXRjaClcbiAgICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICAgIDogW21hdGNoXVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgZGF0YVBhdGhzIHx8PSBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aClcbiAgICAgIGZvciAoY29uc3QgZGF0YVBhdGggb2YgZGF0YVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgaWYgKCFjb21wb25lbnQudmFsaWRhdGUobm90aWZ5KSkge1xuICAgICAgICAgICAgLy8gRm9jdXMgZmlyc3QgZXJyb3IgZmllbGRcbiAgICAgICAgICAgIGlmIChub3RpZnkgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LmZvY3VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSAmJiAhaXNWYWxpZCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycygpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnlBbGwobWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQWxsKG1hdGNoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICBsZXQgZmlyc3QgPSB0cnVlXG4gICAgICBjb25zdCB1bm1hdGNoZWQgPSBbXVxuICAgICAgZm9yIChjb25zdCBbZGF0YVBhdGgsIGVycnNdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9ycykpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBpcyBhIGRhdGEtcm9vdCwgcHJlZml4IGl0cyBvd24gZGF0YVBhdGggdG8gYWxsIGVycm9ycyxcbiAgICAgICAgLy8gc2luY2UgdGhlIGRhdGEgdGhhdCBpdCBzZW5kcyBhbmQgdmFsaWRhdGVzIHdpbGwgYmUgdW5wcmVmaXhlZC5cbiAgICAgICAgY29uc3QgZnVsbERhdGFQYXRoID0gdGhpcy5oYXNPd25EYXRhXG4gICAgICAgICAgPyBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBkYXRhUGF0aClcbiAgICAgICAgICA6IGRhdGFQYXRoXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMsIHRoaXMuZGF0YVBhdGgsIHRoaXMuaGFzT3duRGF0YSwgZnVsbERhdGFQYXRoKVxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gSmF2YVNjcmlwdCBwcm9wZXJ0eSBhY2Nlc3Mgbm90YXRpb24sIHRvIG91ciBvd24gZm9ybVxuICAgICAgICAvLyBvZiByZWxhdGl2ZSBKU09OIHBvaW50ZXJzIGFzIGRhdGEtcGF0aHM6XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGZ1bGxEYXRhUGF0aClcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmIChjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBjb21wb25lbnQgaW4gYW4gYWN0aXZlIGZvcm0gZm9yIHRoZSBnaXZlbiBkYXRhUGF0aC5cbiAgICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBjb21wb25lbnQgc2VydmluZyBhIHBhcnQgb2YgdGhlIGRhdGFQYXRoLFxuICAgICAgICAgIC8vIGFuZCB0YWtlIGl0IGZyb20gdGhlcmU6XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5uYXZpZ2F0ZVRvQ29tcG9uZW50Py4oXG4gICAgICAgICAgICAgICAgICBmdWxsRGF0YVBhdGgsXG4gICAgICAgICAgICAgICAgICBzdWJDb21wb25lbnRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc3ViQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycnMgPSBlcnJvcnNbY29tcG9uZW50LmRhdGFQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJzLCBmaXJzdCAmJiBmb2N1cylcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgbmVzdGVkIGZvcm0gdG8gZGlzcGxheSBhdCBsZWFzdCBwYXJ0cyBmbyB0aGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHNob3cgYWxsIGVycm9ycyBhdCBvbmNlLCBzbyB3ZSdyZSBkb25lLiBEb24ndCBjYWxsXG4gICAgICAgICAgICAgICAgLy8gYG5vdGlmeUVycm9ycygpYCB5ZXQsIGFzIHdlIGNhbiBvbmx5IGRpc3BsYXkgaXQgb25jZVxuICAgICAgICAgICAgICAgIC8vIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCB3YXMgY2FsbGVkIGZyb20gYERpdG9Gb3JtLm1vdW50ZWQoKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgaGVyZSwgc28ga2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICAgIGRhdGFQYXRoUGFydHMucG9wKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2hlbiB0aGUgZXJyb3IgY2FuJ3QgYmUgbWF0Y2hlZCwgYWRkIGl0IHRvIGEgbGlzdCBvZiB1bm1hdGNoZWRcbiAgICAgICAgICAvLyBlcnJvcnMgd2l0aCBkZWNlbnQgbWVzc2FnZSwgdG8gcmVwb3J0IGF0IHRoZSBlbmQuXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBsYWJlbGl6ZShwcm9wZXJ0eSlcbiAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBmaWVsZFxuICAgICAgICAgICAgICA/IGBUaGUgZmllbGQgJHtmaWVsZH1gXG4gICAgICAgICAgICAgIDogYFRoZSAke3RoaXMuZm9ybUxhYmVsfWBcbiAgICAgICAgICAgIHVubWF0Y2hlZC5wdXNoKGAke3ByZWZpeH0gJHtlcnIubWVzc2FnZX1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIHRoaXMubm90aWZ5RXJyb3JzKHVubWF0Y2hlZC5qb2luKCdcXG4nKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbm90aWZ5RXJyb3JzKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdWYWxpZGF0aW9uIEVycm9ycycsXG4gICAgICAgIHRleHQ6IG1lc3NhZ2UgfHwgJ1BsZWFzZSBjb3JyZWN0IHRoZSBoaWdobGlnaHRlZCBlcnJvcnMuJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcmVzZXREYXRhKCkge1xuICAgICAgLy8gV2UgY2FuJ3Qgc2V0IGB0aGlzLmRhdGEgPSAuLi5gIGJlY2F1c2UgaXQncyBhIHByb3BlcnR5LCBidXQgd2UgY2FuIHNldFxuICAgICAgLy8gYWxsIGtub3duIHByb3BlcnRpZXMgb24gaXQgdG8gdGhlIHZhbHVlcyByZXR1cm5lZCBieVxuICAgICAgLy8gYHNldERlZmF1bHRWYWx1ZXMoKWAsIGFzIHRoZXkgYXJlIGFsbCByZWFjdGl2ZSBhbHJlYWR5IGZyb20gdGhlIHN0YXJ0czpcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBzZXREZWZhdWx0VmFsdWVzKHRoaXMuc2NoZW1hLCB7fSwgdGhpcykpXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZGF0YSkge1xuICAgICAgICBpZiAobmFtZSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICAgICAgdGhpcy5kYXRhW25hbWVdID0gZGF0YVtuYW1lXVxuICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1hcmtEaXJ0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbHRlckRhdGEoZGF0YSkge1xuICAgICAgLy8gRmlsdGVycyBvdXQgYXJyYXlzIGFuZCBvYmplY3RzIHRoYXQgYXJlIGJhY2sgYnkgZGF0YSByZXNvdXJjZXNcbiAgICAgIC8vIHRoZW1zZWx2ZXMsIGFzIHRob3NlIGFyZSBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRocm91Z2ggdGhlaXIgb3duIEFQSVxuICAgICAgLy8gcmVzb3VyY2UgZW5kLXBvaW50cyBhbmQgc2hvdWxkbid0IGJlIHNldC5cbiAgICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUpXG4gICAgICAgICAgaWYgKGNvbXBvbmVudHMuc29tZShjb21wb25lbnQgPT4gY29tcG9uZW50LnByb3ZpZGVzRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvcHlbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc0RhdGEoeyB0YXJnZXQgPSAnY2xpcGJvYXJkJywgc2NoZW1hT25seSA9IHRydWUgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0RhdGEoXG4gICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICB0aGlzLnNvdXJjZVNjaGVtYSxcbiAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gTmVlZGVkIGZvciBEaXRvQ29udGV4dCBoYW5kbGluZyBpbnNpZGUgYHByb2Nlc3NEYXRhYCBhbmRcbiAgICAgICAgICAvLyBgcHJvY2Vzc1NjaGVtYURhdGEoKWA6XG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgIHNjaGVtYU9ubHksXG4gICAgICAgICAgdGFyZ2V0XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnQoKWAgaXMgb25seSBzZXQgaWYgb25lIG9mIHRoZSBhbmNlc3RvcnMgdXNlc1xuICAgICAgLy8gdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgICB0aGlzLiRzY2hlbWFQYXJlbnRDb21wb25lbnQoKT8uX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5LCBjb21wb25lbnQsIGFkZClcbiAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgcGFyZW50IGlmIHNjaGVtYSBzaGFyZXMgZGF0YSB3aXRoIGl0LlxuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/Ll9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyUGFuZShwYW5lLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lc1JlZ2lzdHJ5LCBwYW5lLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmVsKHBhbmVsLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lbHNSZWdpc3RyeSwgcGFuZWwsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyRW50cnkocmVnaXN0cnksIGVudHJ5LCBhZGQpIHtcbiAgICAgIGNvbnN0IHVpZCA9IGVudHJ5LiR1aWRcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgcmVnaXN0cnlbdWlkXSA9IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcmVnaXN0cnlbdWlkXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGlzdEVudHJpZXNCeURhdGFQYXRoKHJlZ2lzdHJ5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZWdpc3RyeSkucmVkdWNlKChlbnRyaWVzQnlEYXRhUGF0aCwgZW50cnkpID0+IHtcbiAgICAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgbGlua2VkIHRvIHRoZSBzYW1lIGRhdGEtcGF0aCwgZS5nLiB3aGVuXG4gICAgICAgIC8vIHRoZXJlIGFyZSB0YWJzLiBMaW5rIGVhY2ggZGF0YS1wYXRoIHRvIGFuIGFycmF5IG9mIGVudHJpZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YVBhdGggfSA9IGVudHJ5XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSAoZW50cmllc0J5RGF0YVBhdGhbZGF0YVBhdGhdIHx8PSBbXSlcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICByZXR1cm4gZW50cmllc0J5RGF0YVBhdGhcbiAgICAgIH0sIHt9KVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllcyhlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpLnN0YXJ0c1dpdGgodGhpcy5kYXRhUGF0aClcbiAgICAgICAgPyB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgICAgICA6IHRoaXMuX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeURhdGFQYXRoKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFtub3JtYWxpemVEYXRhUGF0aChkYXRhUGF0aCldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllc0J5TmFtZShlbnRyaWVzQnlEYXRhUGF0aCwgbmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFthcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKV0gfHwgW10sXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIF9maWx0ZXJFbnRyaWVzKGVudHJpZXMsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBlbnRyaWVzLmZpbHRlcihtYXRjaCkgOiBlbnRyaWVzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2NoZW1hIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLy8gVG8gZGlzcGxheSBzY2hlbWEgbmV4dCB0byBwYW5lbHM6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG5cbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgZmxleDogMSAxIDEwMCU7XG4gICAgLy8gU28gdGhhdCBzY2hlbWEgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuXG4gICAgPiAqOm9ubHktY2hpbGQge1xuICAgICAgZ3JpZC1yb3ctZW5kOiBub25lO1xuICAgIH1cblxuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZztcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyxcbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIGZsZXg6IDEgMSAwJTtcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cblxuICA+IC5kaXRvLXBhbmVscyB7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nICRjb250ZW50LXBhZGRpbmcgMDtcbiAgfVxuXG4gIC8vIERpc3BsYXkgYSBydWxlciBiZXR3ZWVuIHRhYmJlZCBjb21wb25lbnRzIGFuZCB0b3dhcmRzIHRoZSAuZGl0by1idXR0b25zXG4gIC5kaXRvLXBhbmUtdGFiICsgLmRpdG8tcGFuZS1tYWluIHtcbiAgICAmOjpiZWZvcmUge1xuICAgICAgLy8gVXNlIGEgcHNldWRvIGVsZW1lbnQgdG8gZGlzcGxheSBhIHJ1bGVyIHdpdGggcHJvcGVyIG1hcmdpbnNcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgY29udGVudDogJyc7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gICAgICAvLyBBZGQgcmVtb3ZlZCAkZm9ybS1zcGFjaW5nIGFnYWluIHRvIHRoZSBydWxlclxuICAgICAgbWFyZ2luOiAkY29udGVudC1wYWRkaW5nICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgLmRpdG8tdGFicyxcbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICB9XG5cbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICAmOm9ubHktY2hpbGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgfVxuXG4gICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAwICR0YWItbWFyZ2luICR0YWItbWFyZ2luO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zY2hlbWEtbWVudS1oZWFkZXIge1xuICAgIC8vIEJyaW5nIHRoZSB0YWJzIHVwIHRvIHRoZSBtZW51LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6ICRtZW51LWhlaWdodDtcbiAgICBwYWRkaW5nOiAwICRtZW51LXBhZGRpbmctaG9yO1xuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgei1pbmRleDogJG1lbnUtei1pbmRleDtcbiAgICAvLyBUdXJuIG9mZiBwb2ludGVyIGV2ZW50cyBzbyB0aGF0IERpdG9UcmFpbCBrZWVwcyByZWNlaXZpbmcgZXZlbnRzLi4uXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLy8gLi4uYnV0IGFsbG93IGludGVyYWN0aW9uIHdpdGggdGhlIHRhYnMgYW5kIGJ1dHRvbnMgKGUuZy4gY2xpcGJvYXJkKVxuICAgIC8vIGxheWVyZWQgb24gdG9wIG9mIERpdG9UcmFpbC5cbiAgICAuZGl0by10YWJzLFxuICAgIC5kaXRvLWJ1dHRvbnMge1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gICAgICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cblxuICBidXR0b24uZGl0by1sYWJlbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLy8gQ2F0Y2ggYWxsIGNsaWNrcywgZXZlbiB3aGVuIGl0IHdvdWxkIGJlIHBhcnRpYWxseSBjb3ZlcmVkIGJ5IHNjaGVtYS5cbiAgICB6LWluZGV4OiAxO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9TY2hlbWEuZGl0by1zY2hlbWEtaW5saW5lZChcbiAgOnNjaGVtYT1cInNjaGVtYVwiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICA6bGFiZWw9XCJpc0NvbXBhY3QgPyBudWxsIDogbGFiZWxcIlxuICA6aW5saW5lZD1cInRydWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gIDpnZW5lcmF0ZUxhYmVscz1cIiFpc0NvbXBhY3RcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1jb21wYWN0JzogaXNDb21wYWN0IH1cIlxuKVxuICAvLy0gUmVuZGVyIGRpdG8tZWRpdC1idXR0b25zIGZvciBpbmxpbmVkIHNjaGVtYXMgc2VwYXJhdGVseSBmcm9tIGFsbFxuICAvLy0gb3RoZXJzIGluIGBUeXBlTGlzdGAgYXMgYSBzY29wZSwgZm9yIGJldHRlciBoYW5kbGluZyBvZiBsYXlvdXQuXG4gIHRlbXBsYXRlKCNlZGl0LWJ1dHRvbnMpXG4gICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgdi1pZj1cImRlbGV0YWJsZSB8fCBkcmFnZ2FibGUgfHwgZWRpdGFibGVcIlxuICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICBAZGVsZXRlPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzQ29tcGFjdCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYUlubGluZWQnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDb21wYWN0KCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGFjdCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNDb21wYWN0ICYmICEhdGhpcy5sYWJlbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYS1pbmxpbmVkIHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tc2NoZW1hLWhlYWRlciB7XG4gICAgICAvLyBDaGFuZ2Ugc3BhY2luZyBzbyAuZGl0by1sYWJlbCBjb3ZlcnMgdGhlIGZ1bGwgLmRpdG8tc2NoZW1hLWhlYWRlci5cbiAgICAgIG1hcmdpbjogLSRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpblxuICAgICAgICAtLWxhYmVsLXBhZGRpbmc6ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC8vIEJlY2F1c2UgdGFibGVzIGhhdmUgYSBmdW5ueSB3YXkgb2YgYWxsb3dpbmcgdG9vIG11Y2ggd2lkdGggZ3Jvd3RoOlxuICAgICAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgICAgICAvLyBQcmV2ZW50IGNvbGxhcHNpbmcgdG8gbWluLWhlaWdodCB3aGVuIGFsb25lIGluXG4gICAgICAgIC8vIC5kaXRvLXNjaGVtYS1jb250ZW50LCBkdWUgdG8gZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudFxuICAgICAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgICB9XG5cbiAgICAgICYgKyAuZGl0by1wYW5lIHtcbiAgICAgICAgLy8gTmVlZGVkIGZvciB0cmFuc2l0aW9uLWhlaWdodCBpbiBEaXRvU2NoZW1hOlxuICAgICAgICBtaW4taGVpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lKFxuICB2LWlmPVwiaXNQb3B1bGF0ZWQgJiYgY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPiAwXCJcbiAgdi1zaG93PVwidmlzaWJsZVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9IGluIGNvbXBvbmVudFNjaGVtYXNgXG4gIClcbiAgICAuZGl0by1icmVhayhcbiAgICAgIHYtaWY9XCJzY2hlbWEuYnJlYWsgPT09ICdiZWZvcmUnXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwibmVzdGVkRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpzaW5nbGU9XCJpc1NpbmdsZUNvbXBvbmVudFwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYWZ0ZXInXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldEFsbFBhbmVsRW50cmllcywgaXNOZXN0ZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmUnLCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHZpc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWIgPyB0aGlzIDogdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgY29tcG9uZW50U2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBjb21wb25lbnRzIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzXG4gICAgICAvLyBhbmQgYWRkcyB0aGUga2V5IGFzIHRoZSBuYW1lIHRvIGVhY2ggY29tcG9uZW50LCB1c2VkIGZvciBsYWJlbHMsIGV0Yy5cbiAgICAgIC8vIE5PVEU6IHNjaGVtYSBjYW4gYmUgbnVsbCB3aGlsZSBtdWx0aS1mb3JtIGxpc3RzIGxvYWQgdGhlaXIgZGF0YSxcbiAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgYXZhaWxhYmxlIGRhdGEgd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZm9ybS5cbiAgICAgIC8vIFdoZW4gZWRpdGluZyBwcmltaXRpdmUgdmFsdWVzIHRocm91Z2ggYSBmb3JtLCBkbyBub3QgYXBwZW5kICduYW1lJyB0b1xuICAgICAgLy8gdGhlIGNvbXBvbmVudCdzIGRhdGFQYXRoIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gZnJvbSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIC8vIE5PVEU6IE5vdCBhbGwgc2NoZW1hcyAvIGNvbXBvbmVudHMgaGF2ZSBhIHNvdXJjZVNjaGVtYSwgZS5nLiBkaWFsb2dzLlxuICAgICAgY29uc3Qgd3JhcFByaW1pdGl2ZXMgPSB0aGlzLnNvdXJjZVNjaGVtYT8ud3JhcFByaW1pdGl2ZXNcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYT8uY29tcG9uZW50cyB8fCB7fSkubWFwKFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAvLyBBbHdheXMgYWRkIG5hbWUgdG8gY29tcG9uZW50IHNjaGVtYS5cbiAgICAgICAgICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiBuZXN0ZWQgPyB0aGlzLmdldENoaWxkU3RvcmUobmFtZSkgOiB0aGlzLnN0b3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFuZWwgc2NoZW1hcyBmcm9tIGFsbCBjb21wb25lbnQgc2NoZW1hcywgYnkgZmluZGluZyB0aG9zZVxuICAgICAgLy8gdGhhdCB3YW50IHRvIHByb3ZpZGUgYSBwYW5lbC4gU2VlIGBnZXRBbGxQYW5lbEVudHJpZXMoKWAgZm9yIGRldGFpbHMuXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTY2hlbWFzLmZsYXRNYXAoXG4gICAgICAgICh7IHNjaGVtYSwgbmVzdGVkRGF0YVBhdGg6IGRhdGFQYXRoIH0pID0+XG4gICAgICAgICAgZ2V0QWxsUGFuZWxFbnRyaWVzKFxuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMudGFiQ29tcG9uZW50XG4gICAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1NpbmdsZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpbmdsZSAmJiB0aGlzLmNvbXBvbmVudFNjaGVtYXMubGVuZ3RoID09PSAxXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJQYW5lKHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy50YWIpIHtcbiAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBoYXNoOiBgIyR7dGhpcy50YWJ9YCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgLy8gUmVtb3ZlIHRoZSBwYWRkaW5nIGFkZGVkIGJ5IGAuZGl0by1jb250YWluZXJgIGluc2lkZSBgLmRpdG8tcGFuZWA6XG4gIG1hcmdpbjogKC0kZm9ybS1zcGFjaW5nKSAoLSRmb3JtLXNwYWNpbmctaGFsZik7XG4gIC8vIEFkZCByZW1vdmVkIGhvcml6b250YWwgbWFyZ2luIGFnYWluIHRvIG1heC13aWR0aDpcbiAgbWF4LXdpZHRoOiAkY29udGVudC13aWR0aCArIDIgKiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gIC8vIFVzZSBgZmxleDogMCVgIGZvciBhbGwgYC5kaXRvLXBhbmVgIGV4Y2VwdCBgLmRpdG8tcGFuZS1tYWluYCxcbiAgLy8gc28gdGhhdCB0aGUgYC5kaXRvLWJ1dHRvbnMtbWFpbmAgY2FuIGJlIG1vdmVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20uXG4gIGZsZXg6IDAlO1xuXG4gICYuZGl0by1wYW5lLW1haW4ge1xuICAgIGZsZXg6IDEwMCU7XG4gIH1cblxuICAuZGl0by1zY2hlbWEtaGVhZGVyOm5vdCguZGl0by1zY2hlbWEtbWVudS1oZWFkZXIpICsgJiB7XG4gICAgLy8gQ2xlYXIgdG9wLW1hcmdpbiBpZiB0aGUgY29tcG9uZW50cyBhcmUgcHJlY2VkZWQgYnkgYSBzY2hlbWEgaGVhZGVyLlxuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cblxuICAuZGl0by1jb250YWluZXItLW9taXQtcGFkZGluZyA+ICYge1xuICAgIC8vIENsZWFyIG1hcmdpbnMgc2V0IGFib3ZlIGFnYWluIGlmIHBhcmVudCBpcyBvbWl0dGluZyBwYWRkaW5nLlxuICAgIG1hcmdpbjogMDtcbiAgICBtYXgtd2lkdGg6IHVuc2V0O1xuICB9XG5cbiAgLmRpdG8tYnJlYWsge1xuICAgIGZsZXg6IDEwMCU7XG4gICAgaGVpZ2h0OiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcmFjdGlvbih2YWx1ZSkge1xuICBjb25zdCBtYXRjaCA9IChcbiAgICBpc1N0cmluZyh2YWx1ZSkgJiZcbiAgICB2YWx1ZS5tYXRjaCgvXlxccyooWystXT9cXGQrKVxccypcXC9cXHMqKFsrLV0/XFxkKylcXHMqJC8pXG4gIClcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3QgWywgZGl2aWRlbmQsIGRpdmlzb3JdID0gbWF0Y2hcbiAgICByZXR1cm4gcGFyc2VGbG9hdChkaXZpZGVuZCkgLyBwYXJzZUZsb2F0KGRpdmlzb3IpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpXG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jb250YWluZXIoXG4gIHYtc2hvdz1cImNvbXBvbmVudFZpc2libGVcIlxuICA6Y2xhc3M9XCJjb250YWluZXJDbGFzc1wiXG4gIDpzdHlsZT1cImNvbnRhaW5lclN0eWxlXCJcbilcbiAgRGl0b0xhYmVsKFxuICAgIHYtaWY9XCJoYXNMYWJlbFwiXG4gICAgOmxhYmVsPVwibGFiZWxcIlxuICAgIDpkYXRhUGF0aD1cImxhYmVsRGF0YVBhdGhcIlxuICAgIDpjbGFzcz1cImNvbXBvbmVudENsYXNzXCJcbiAgKVxuICBjb21wb25lbnQuZGl0by1jb21wb25lbnQoXG4gICAgOmlzPVwidHlwZUNvbXBvbmVudFwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOnNpbmdsZT1cInNpbmdsZVwiXG4gICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgOmRpc2FibGVkPVwiY29tcG9uZW50RGlzYWJsZWRcIlxuICAgIDpjbGFzcz1cImNvbXBvbmVudENsYXNzXCJcbiAgICBAZXJyb3JzPVwib25FcnJvcnNcIlxuICApXG4gIERpdG9FcnJvcnMoOmVycm9ycz1cImVycm9yc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGlzU3RyaW5nLCBpc051bWJlciB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldFR5cGVDb21wb25lbnQsIGFsaWduQm90dG9tLCBvbWl0UGFkZGluZyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IHBhcnNlRnJhY3Rpb24gfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Db250YWluZXInLCB7XG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBnZW5lcmF0ZUxhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgdHlwZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlQ29tcG9uZW50KHRoaXMuc2NoZW1hLnR5cGUpXG4gICAgfSxcblxuICAgIGhhc0xhYmVsKCkge1xuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGxhYmVsICE9PSBmYWxzZSAmJiAoXG4gICAgICAgICAgISFsYWJlbCB8fFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVMYWJlbHMgJiYgdGhpcy50eXBlQ29tcG9uZW50Py5nZW5lcmF0ZUxhYmVsXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgbGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNMYWJlbCA/IHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEpIDogbnVsbFxuICAgIH0sXG5cbiAgICBsYWJlbERhdGFQYXRoKCkge1xuICAgICAgLy8gVW5uZXN0ZWQgdHlwZXMgZG9uJ3QgaGF2ZSBhIGRhdGFQYXRoIGZvciB0aGVtc2VsdmVzLCBkb24ndCB1c2UgaXQ6XG4gICAgICByZXR1cm4gdGhpcy5uZXN0ZWQgPyB0aGlzLmRhdGFQYXRoIDogbnVsbFxuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWR0aDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVDb21wb25lbnQ/LmRlZmF1bHRXaWR0aFxuICAgICAgfSxcbiAgICAgIGdldCh3aWR0aCkge1xuICAgICAgICAvLyBVc2UgMTAwJSA9PSAxLjAgYXMgZGVmYXVsdCB3aWR0aCB3aGVuIG5vdGhpbmcgaXMgc2V0OlxuICAgICAgICByZXR1cm4gd2lkdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gMS4wXG4gICAgICAgICAgOiBpc1N0cmluZyh3aWR0aClcbiAgICAgICAgICAgID8gd2lkdGgubWF0Y2goL15cXHMqWzw+XT9cXHMqKC4qKSQvKVsxXSAvLyBSZW1vdmUgd2lkdGggb3BlcmF0b3JcbiAgICAgICAgICAgIDogd2lkdGhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudFdpZHRoT3BlcmF0b3I6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGdldCh3aWR0aCkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcod2lkdGgpXG4gICAgICAgICAgPyB3aWR0aC5tYXRjaCgvXlxccyooWzw+XT8pLylbMV0gfHwgbnVsbFxuICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50VmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZUNvbXBvbmVudD8uZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudERpc2FibGVkOiBnZXRTY2hlbWFBY2Nlc3NvcignZGlzYWJsZWQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbnRhaW5lckNsYXNzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogY29udGFpbmVyQ2xhc3MgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1jb250YWluZXInXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYCR7cHJlZml4fS0tc2luZ2xlYF06IHRoaXMuc2luZ2xlLFxuICAgICAgICBbYCR7cHJlZml4fS0taGFzLWxhYmVsYF06IHRoaXMuaGFzTGFiZWwsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1hbGlnbi1ib3R0b21gXTogYWxpZ25Cb3R0b20odGhpcy5zY2hlbWEpLFxuICAgICAgICBbYCR7cHJlZml4fS0tb21pdC1wYWRkaW5nYF06IG9taXRQYWRkaW5nKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgLi4uKFxuICAgICAgICAgIGlzU3RyaW5nKGNvbnRhaW5lckNsYXNzKVxuICAgICAgICAgICAgPyB7IFtjb250YWluZXJDbGFzc106IHRydWUgfVxuICAgICAgICAgICAgOiBjb250YWluZXJDbGFzc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudEJhc2lzKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmNvbXBvbmVudFdpZHRoXG4gICAgICAvLyAnYXV0bycgPSBubyBmaXR0aW5nOlxuICAgICAgY29uc3QgYmFzaXMgPSBbbnVsbCwgJ2F1dG8nLCAnZmlsbCddLmluY2x1ZGVzKHdpZHRoKVxuICAgICAgICA/ICdhdXRvJ1xuICAgICAgICA6IC8lJC8udGVzdCh3aWR0aClcbiAgICAgICAgICA/IHBhcnNlRmxvYXQod2lkdGgpIC8vIHBlcmNlbnRhZ2VcbiAgICAgICAgICA6IC9bYS16XS8udGVzdCh3aWR0aClcbiAgICAgICAgICAgID8gd2lkdGggLy8gbmF0aXZlIHVuaXRzXG4gICAgICAgICAgICA6IHBhcnNlRnJhY3Rpb24od2lkdGgpICogMTAwIC8vIGZyYWN0aW9uXG4gICAgICByZXR1cm4gaXNOdW1iZXIoYmFzaXMpID8gYCR7YmFzaXN9JWAgOiBiYXNpc1xuICAgIH0sXG5cbiAgICBjb250YWluZXJTdHlsZSgpIHtcbiAgICAgIC8vIEludGVycHJldCAnPjUwJScgYXMgJzUwJSwgZmxleC1ncm93OiAxYFxuICAgICAgY29uc3QgZ3JvdyA9IChcbiAgICAgICAgdGhpcy5jb21wb25lbnRXaWR0aE9wZXJhdG9yID09PSAnPicgfHxcbiAgICAgICAgdGhpcy5jb21wb25lbnRXaWR0aCA9PT0gJ2ZpbGwnXG4gICAgICApXG4gICAgICAvLyBJbnRlcnByZXQgJzw1MCUnIGFzICc1MCUsIGZsZXgtc2hyaW5rOiAxYFxuICAgICAgY29uc3Qgc2hyaW5rID0gdGhpcy5jb21wb25lbnRXaWR0aE9wZXJhdG9yID09PSAnPCdcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZsZXg6IGAke2dyb3cgPyAxIDogMH0gJHtzaHJpbmsgPyAxIDogMH0gJHt0aGlzLmNvbXBvbmVudEJhc2lzfWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY29tcG9uZW50Q2xhc3MoKSB7XG4gICAgICBjb25zdCBiYXNpc0lzQXV0byA9IHRoaXMuY29tcG9uZW50QmFzaXMgPT09ICdhdXRvJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gVE9ETzogQkVNXG4gICAgICAgICdkaXRvLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IHRoaXMuY29tcG9uZW50RGlzYWJsZWQsXG4gICAgICAgICdkaXRvLXdpZHRoLWZpbGwnOiAhYmFzaXNJc0F1dG8gfHwgdGhpcy5jb21wb25lbnRXaWR0aCA9PT0gJ2ZpbGwnLFxuICAgICAgICAnZGl0by13aWR0aC1hdXRvJzogYmFzaXNJc0F1dG8sXG4gICAgICAgICdkaXRvLWhhcy1lcnJvcnMnOiAhIXRoaXMuZXJyb3JzXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkVycm9ycyhlcnJvcnMpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAvLyBOZWVkZWQgZm9yIGJldHRlciB2ZXJ0aWNhbCBhbGlnbm1lbnQ6XG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8vIFRvIHByZXZlbnQgbGlzdCB0YWJsZXMgZnJvbSBibG93aW5nIG91dCBvZiB0aGVpciBmbGV4IGJveCBjb250YWluZXJzLlxuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8vIENhbm5vdCB1c2UgbWFyZ2luIGhlcmUgYXMgaXQgbmVlZHMgdG8gYmUgcGFydCBvZiBib3gtc2l6aW5nIGZvclxuICAvLyBwZXJjZW50YWdlcyBpbiBmbGV4LWJhc2lzIHRvIHdvcmsuXG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmcgJGZvcm0tc3BhY2luZy1oYWxmO1xuXG4gICY6ZW1wdHkge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAmLS1hbGlnbi1ib3R0b20ge1xuICAgIGp1c3RpZnktY29udGVudDogZW5kOyAvLyBUbyBhbGlnbiBjb21wb25lbnRzIHdpdGggYW5kIHdpdGhvdXQgbGFiZWxzLlxuICB9XG5cbiAgJi0tb21pdC1wYWRkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgPiAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46ICRmb3JtLXNwYWNpbmcgJGZvcm0tc3BhY2luZy1oYWxmIDA7XG4gICAgfVxuICB9XG5cbiAgJi0tc2luZ2xlIHtcbiAgICBoZWlnaHQ6IDEwMCU7IC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgYXQgdGhlIGJvdHRvbTtcbiAgfVxufVxuXG4vLyBOT1RFOiBUaGlzIGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGAuZGl0by1jb250YWluZXJgIHNvIHRoYXQgb3RoZXJcbi8vIHR5cGUgY29tcG9uZW50cyBjYW4gb3ZlcnJpZGUgYC5kaXRvLXdpZHRoLWZpbGxgIGNsYXNzIChmaWx0ZXIgcHJlY2VkZW5jZSkuXG4uZGl0by1jb21wb25lbnQge1xuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAmLmRpdG8tY2hlY2tib3gsXG4gICAgJi5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgICAvLyBXZWJLaXQgZG9lc24ndCBsaWtlIGNoYW5nZWQgd2lkdGggb24gY2hlY2tib3hlcyBhbmQgcmFkaW9zLCBvdmVycmlkZTpcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10YWJzXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwiKHRhYlNjaGVtYSwga2V5KSBpbiB0YWJzXCJcbiAgKVxuICAgIFJvdXRlckxpbmsuZGl0by1saW5rKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcih0YWJTY2hlbWEpXCJcbiAgICAgIDprZXk9XCJrZXlcIlxuICAgICAgOnRvPVwieyBoYXNoOiBgIyR7a2V5fWAgfVwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IHNlbGVjdGVkVGFiID09PSBrZXkgfVwiXG4gICAgKSB7eyBnZXRMYWJlbCh0YWJTY2hlbWEsIGtleSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJzJywge1xuICBwcm9wczoge1xuICAgIHRhYnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2VsZWN0ZWRUYWI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbiR0YWItY29sb3ItYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXN0O1xuJHRhYi1jb2xvci1pbmFjdGl2ZTogJGNvbG9yLWxpZ2h0O1xuJHRhYi1jb2xvci1hY3RpdmU6ICRjb2xvci1saWdodGVzdDtcbiR0YWItY29sb3ItaG92ZXI6ICRjb2xvci13aGl0ZTtcblxuLmRpdG8tdGFicyB7XG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlcGVuLmlvL3Rob2xleC9wZW4vaHZlQngvXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuXG4gIGEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1pbmFjdGl2ZTtcbiAgICBwYWRkaW5nOiAkdGFiLXBhZGRpbmctdmVyICR0YWItcGFkZGluZy1ob3I7XG4gICAgbWFyZ2luLWxlZnQ6ICR0YWItbWFyZ2luO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkdGFiLXJhZGl1cztcblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1ob3ZlcjtcbiAgICB9XG5cbiAgICAmOmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAmLmRpdG8tYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItYmFja2dyb3VuZDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIE9ubHkgc2hvdyBwYW5lbHMgaW4gdGFicyB3aGVuIHRoZSB0YWJzIGFyZSBhbHNvIHZpc2libGUuXG5jb21wb25lbnQuZGl0by1wYW5lbChcbiAgdi1zaG93PVwidmlzaWJsZSAmJiAoIXBhbmVsVGFiQ29tcG9uZW50IHx8IHBhbmVsVGFiQ29tcG9uZW50LnZpc2libGUpXCJcbiAgOmlzPVwicGFuZWxUYWdcIlxuICBAc3VibWl0LnByZXZlbnRcbilcbiAgbGFiZWwuZGl0by1wYW5lbC10aXRsZSB7eyBnZXRMYWJlbChzY2hlbWEpIH19XG4gIERpdG9TY2hlbWEuZGl0by1wYW5lbC1zY2hlbWEoXG4gICAgOnNjaGVtYT1cInBhbmVsU2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICA6ZGF0YT1cInBhbmVsRGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpoYXNPd25EYXRhPVwiaGFzT3duRGF0YVwiXG4gIClcbiAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgIERpdG9CdXR0b25zKFxuICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVsJywge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhbmVsVGFiQ29tcG9uZW50OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhbmVsQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgdGFiQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWxUYWJDb21wb25lbnRcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIHRhcmdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS50YXJnZXQgfHwgdGhpcy5kYXRhUGF0aFxuICAgIH0sXG5cbiAgICBoYXNPd25EYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5vd25EYXRhXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm93bkRhdGEgfHwgdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhbmVsU2NoZW1hKCkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duRGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBgZGF0YWAgZnJvbSB0aGUgc2NoZW1hLCBzbyB0aGF0IERpdG9TY2hlbWEgaXNuJ3QgdXNpbmcgaXQgdG9cbiAgICAgICAgLy8gcHJvZHVjZSBpdHMgb3duIGRhdGEuIFNlZSAkZmlsdGVycyBwYW5lbCBmb3IgbW9yZSBkZXRhaWxzIG9uIGRhdGEuXG4gICAgICAgIGNvbnN0IHsgZGF0YSwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICByZXR1cm4gc2NoZW1hXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhbmVsVGFnKCkge1xuICAgICAgLy8gUGFuZWxzIHRoYXQgcHJvdmlkZSB0aGVpciBvd24gZGF0YSBuZWVkIHRoZWlyIG93biBmb3JtLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/ICdmb3JtJyA6ICdkaXYnXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YVBhdGgoKSB7XG4gICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBkYXRhLCB0aGVuIGl0IG5lZWRzIHRvIHByZWZpeCBhbGxcbiAgICAgIC8vIGNvbXBvbmVudHMgd2l0aCBpdHMgZGF0YS1wYXRoLCBidXQgaWYgaXQgc2hhcmVzIGRhdGEgd2l0aCB0aGUgc2NoZW1hXG4gICAgICAvLyBjb21wb25lbnQsIHRoZW4gaXQgc2hvdWxkIHNoYXJlIHRoZSBkYXRhLXBhdGggbmFtZSBzcGFjZSB0b28uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gdGhpcy5kYXRhUGF0aCA6IHRoaXMuc2NoZW1hQ29tcG9uZW50LmRhdGFQYXRoXG4gICAgfSxcblxuICAgIHZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBgc2NoZW1hLmRhdGFgIGhhbmRsaW5nIGluIERpdG9TY2hlbWEsXG4gICAgLy8gd2hlcmUgdGhlIGRhdGEgaXMgYWRkZWQgdG8gdGhlIGFjdHVhbCBjb21wb25lbnQuXG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLm93bkRhdGEgPSBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgID8gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgIDogZGF0YVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgcGFuZWxzIHNvIHRoYXQgb3RoZXIgY29tcG9uZW50cyBjYW4gZmluZCB0aGVtIGJ5IHRoZWlyXG4gICAgICAvLyBkYXRhLXBhdGgsIGUuZy4gaW4gVHlwZUxpc3Qub25GaWx0ZXJFcnJvcnMoKVxuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZWwodGhpcywgYWRkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVsIHtcbiAgbWFyZ2luLWJvdHRvbTogJGNvbnRlbnQtcGFkZGluZztcblxuICAuZGl0by1wYW5lbC10aXRsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kOiAkYnV0dG9uLWNvbG9yO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIH1cblxuICAuZGl0by1wYW5lbC1zY2hlbWEge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblxuICAgID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmICRmb3JtLXNwYWNpbmc7XG5cbiAgICAgID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgICAgIC0tYnV0dG9uLW1hcmdpbjogI3skZm9ybS1zcGFjaW5nfTtcblxuICAgICAgICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1vYmplY3Qge1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgIGxhYmVsIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1wYW5lIHtcbiAgICAgIG1hcmdpbjogMCAoLSRmb3JtLXNwYWNpbmctaGFsZik7XG4gICAgfVxuXG4gICAgLmRpdG8tY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFuZWxzKFxuICB2LWlmPVwicGFuZWxzLmxlbmd0aCA+IDBcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cInsgc2NoZW1hLCBkYXRhUGF0aCwgdGFiQ29tcG9uZW50IH0gaW4gcGFuZWxzXCJcbiAgKVxuICAgIERpdG9QYW5lbChcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwiZ2V0UGFuZWxLZXkoZGF0YVBhdGgsIHRhYkNvbXBvbmVudClcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoc2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cInNjaGVtYS5kaXNhYmxlZCAhPSBudWxsID8gc2NoZW1hLmRpc2FibGVkIDogZGlzYWJsZWRcIlxuICAgICAgOnBhbmVsVGFiQ29tcG9uZW50PVwidGFiQ29tcG9uZW50XCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvUGFuZWxzJywge1xuICBwcm9wczoge1xuICAgIHBhbmVsczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFBhbmVsS2V5KGRhdGFQYXRoLCB0YWJDb21wb25lbnQpIHtcbiAgICAgIC8vIEFsbG93IHNlcGFyYXRlIHRhYnMgdG8gdXNlIHBhbmVscyBvZiB0aGUgc2FtZSBuYW1lLCBieVxuICAgICAgLy8gcHJlZml4aW5nIHRoZWlyIGtleSB3aXRoIHRoZSB0YWIgbmFtZS5cbiAgICAgIHJldHVybiB0YWJDb21wb25lbnQgPyBgJHt0YWJDb21wb25lbnQudGFifV8ke2RhdGFQYXRofWAgOiBkYXRhUGF0aFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVscyB7XG4gIG1heC13aWR0aDogJGNvbnRlbnQtc2lkZWJhci13aWR0aDtcbiAgbWluLXdpZHRoOiBjYWxjKCRjb250ZW50LXNpZGViYXItd2lkdGggLyAyKTtcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyB1c2VTbG90cywgQ29tbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZOb2RlQ29udGVudCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUgJiYgYXNBcnJheSh2bm9kZSkuc29tZSh2bm9kZSA9PiB2bm9kZS50eXBlICE9PSBDb21tZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2xvdENvbnRlbnQoc2xvdCwgcHJvcHMgPSB7fSkge1xuICBzbG90ID0gaXNTdHJpbmcoc2xvdCkgPyB1c2VTbG90cygpW3Nsb3RdIDogc2xvdFxuICByZXR1cm4gaGFzVk5vZGVDb250ZW50KHNsb3Q/Lihwcm9wcykpXG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tYnV0dG9ucyhcbiAgdi1pZj1cImJ1dHRvblNjaGVtYXMgfHwgaGFzU2xvdENvbnRlbnQoJHNsb3RzLmRlZmF1bHQpXCJcbilcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCIoYnV0dG9uU2NoZW1hLCBidXR0b25EYXRhUGF0aCkgaW4gYnV0dG9uU2NoZW1hc1wiXG4gIClcbiAgICBEaXRvQ29udGFpbmVyKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihidXR0b25TY2hlbWEpXCJcbiAgICAgIDprZXk9XCJidXR0b25EYXRhUGF0aFwiXG4gICAgICA6c2NoZW1hPVwiYnV0dG9uU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImJ1dHRvbkRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShidXR0b25TY2hlbWEubmFtZSlcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZmFsc2VcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCJ2bm9kZSBvZiAkc2xvdHMuZGVmYXVsdD8uKClcIlxuICApXG4gICAgLy8tIFJlbmRlciBlYWNoIG5vZGUgaW4gdGhlIGRlZmF1bHQgc2xvdCB0aHJvdWdoIGBkaXRvLXZub2RlYCxcbiAgICAvLy0gc28gaXQgY2FuIGJlIHdyYXBwZWQgaW4gYSBgLmRpdG8tY29udGFpbmVyYCBjbGFzcy5cbiAgICAuZGl0by1jb250YWluZXIoXG4gICAgICB2LWlmPVwiaGFzVk5vZGVDb250ZW50KHZub2RlKVwiXG4gICAgKVxuICAgICAgRGl0b1Zub2RlKDp2bm9kZT1cInZub2RlXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGhhc1Nsb3RDb250ZW50LCBoYXNWTm9kZUNvbnRlbnQgfSBmcm9tICcuLi91dGlscy92dWUuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0J1dHRvbnMnLCB7XG4gIHByb3ZpZGU6IHtcbiAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiBudWxsXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBidXR0b25zIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzLlxuICAgICAgY29uc3QgeyBkYXRhUGF0aCwgYnV0dG9ucyB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGJ1dHRvbnNcbiAgICAgICAgPyBPYmplY3QudmFsdWVzKGJ1dHRvbnMpLnJlZHVjZSgoc2NoZW1hcywgYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBzY2hlbWFzW2FwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBidXR0b24ubmFtZSldID0gYnV0dG9uXG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hc1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc1Nsb3RDb250ZW50LFxuICAgIGhhc1ZOb2RlQ29udGVudFxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tYnV0dG9ucyB7XG4gID4gLmRpdG8tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBTZXQgYEBjbGljay5zdG9wYCB0byBwcmV2ZW50IGNsaWNrIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIGRpdG8tbGFiZWwuXG5EaXRvQnV0dG9ucy5kaXRvLWVkaXQtYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQoXG4gIDpidXR0b25zPVwiYnV0dG9uc1wiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICBAY2xpY2suc3RvcFxuKVxuICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICBhLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0RyYWdnYWJsZVwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gIClcbiAgUm91dGVyTGluay5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNFZGl0YWJsZVwiXG4gICAgOnRvPVwieyBwYXRoOiBlZGl0UGF0aCB9XCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmVkaXQpXCJcbiAgKVxuICBEaXRvQ3JlYXRlQnV0dG9uKFxuICAgIHYtaWY9XCJpc0NyZWF0YWJsZVwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOnBhdGg9XCJjcmVhdGVQYXRoXCJcbiAgICA6dmVyYj1cInZlcmJzLmNyZWF0ZVwiXG4gICAgOnRleHQ9XCJjcmVhdGVCdXR0b25UZXh0XCJcbiAgKVxuICBidXR0b24uZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRGVsZXRhYmxlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgIEBjbGljaz1cIiRlbWl0KCdkZWxldGUnKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0VkaXRCdXR0b25zJywge1xuICBlbWl0czogWydkZWxldGUnXSxcblxuICBwcm9wczoge1xuICAgIGRyYWdnYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY3JlYXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGVsZXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdFBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3JlYXRlUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb3JtTGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYS5mb3JtKVxuICAgIH0sXG5cbiAgICBpc0RyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZHJhZ2dhYmxlJylcbiAgICB9LFxuXG4gICAgaXNFZGl0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZWRpdGFibGUnKSAmJiAhIXRoaXMuZWRpdFBhdGhcbiAgICB9LFxuXG4gICAgaXNDcmVhdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2NyZWF0YWJsZScpICYmICEhdGhpcy5jcmVhdGVQYXRoXG4gICAgfSxcblxuICAgIGlzRGVsZXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdkZWxldGFibGUnKVxuICAgIH0sXG5cbiAgICBjcmVhdGVCdXR0b25UZXh0KCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gQWxsb3cgc2NoZW1hIHRvIG92ZXJyaWRlIGNyZWF0ZSBidXR0b24gdGhyb3VnaCBjcmVhdGFibGUgb2JqZWN0OlxuICAgICAgICB0aGlzLnNjaGVtYS5jcmVhdGFibGU/LmxhYmVsIHx8IChcbiAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlIGNyZWF0ZSBidXR0b24gbGFiZWxzIGZyb20gZnJvbSBsYWJlbHMgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzIHdpdGggb25seSBvbmUgZm9ybTpcbiAgICAgICAgICB0aGlzLmZvcm1MYWJlbCAmJlxuICAgICAgICAgIGAke2NhcGl0YWxpemUodGhpcy52ZXJicy5jcmVhdGUpfSAke3RoaXMuZm9ybUxhYmVsfWBcbiAgICAgICAgKSB8fFxuICAgICAgICBudWxsXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNPcHRpb24obmFtZSkge1xuICAgICAgLy8gVGhlIG9wdGlvbnMgb2YgdGhlIG91dGVyIGNvbXBvbmVudCBhcmUgcGFzc2VkIHRvIHRoZSBidXR0b25zIGNvbXBvbmVudFxuICAgICAgLy8gdGhyb3VnaCBwcm9wZXJ0aWVzIGB0aGlzW25hbWVdYCwgYnV0IGNhbiBiZSBkaXNhYmxlZCBvbiBhIHBlci1mb3JtXG4gICAgICAvLyBiYXNpcyBieSBzZXR0aW5nIGBzY2hlbWFbbmFtZV1gIHRvIGBmYWxzZWAuXG4gICAgICByZXR1cm4gISEodGhpc1tuYW1lXSAmJiB0aGlzLnNjaGVtYVtuYW1lXSAhPT0gZmFsc2UpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZWRpdC1idXR0b25zIHtcbiAgLy8gT3ZlcnJpZGUgY3Vyc29yIGZyb20gY29sbGFwc2libGUgZGl0by1sYWJlbDpcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmbGV4OiBub25lO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uXG4gIHRlbXBsYXRlKFxuICAgIHYtaWY9XCJzaG93UHVsbGRvd25cIlxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJgZGl0by1idXR0b24tJHt2ZXJifWBcIlxuICAgICAgOnRpdGxlPVwibGFiZWxpemUodmVyYilcIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bigpXCJcbiAgICApIHt7IHRleHQgfX1cbiAgICB1bC5kaXRvLXB1bGxkb3duKDpjbGFzcz1cInsgJ2RpdG8tb3Blbic6IHB1bGxkb3duLm9wZW4gfVwiKVxuICAgICAgbGkoXG4gICAgICAgIHYtZm9yPVwiKGZvcm0sIHR5cGUpIGluIGZvcm1zXCJcbiAgICAgIClcbiAgICAgICAgYShcbiAgICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGZvcm0pXCJcbiAgICAgICAgICB2LXNob3c9XCJzaG91bGRTaG93KGZvcm0pXCJcbiAgICAgICAgICA6Y2xhc3M9XCJnZXRGb3JtQ2xhc3MoZm9ybSwgdHlwZSlcIlxuICAgICAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24odHlwZSlcIlxuICAgICAgICAgIEBtb3VzZXVwPVwib25QdWxsZG93bk1vdXNlVXAodHlwZSlcIlxuICAgICAgICApIHt7IGdldExhYmVsKGZvcm0pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICB2LWVsc2VcbiAgICA6dHlwZT1cImlzSW5saW5lZCA/ICdidXR0b24nIDogJ3N1Ym1pdCdcIlxuICAgIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gICAgOnRpdGxlPVwibGFiZWxpemUodmVyYilcIlxuICAgIEBjbGljaz1cImNyZWF0ZUl0ZW0oZm9ybXMuZGVmYXVsdClcIlxuICApIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFB1bGxkb3duTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1B1bGxkb3duTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRGb3JtU2NoZW1hcywgaXNJbmxpbmVkIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9DcmVhdGVCdXR0b24nLCB7XG4gIG1peGluczogW1B1bGxkb3duTWl4aW5dLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB2ZXJiOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb3JtcygpIHtcbiAgICAgIHJldHVybiBnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KVxuICAgIH0sXG5cbiAgICBpc0lubGluZWQoKSB7XG4gICAgICByZXR1cm4gaXNJbmxpbmVkKHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBzaG93UHVsbGRvd24oKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mb3JtcykubGVuZ3RoID4gMSB8fCAhdGhpcy5mb3Jtcy5kZWZhdWx0XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBjcmVhdGVJdGVtKGZvcm0sIHR5cGUgPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRSZW5kZXIoZm9ybSkgJiYgIXRoaXMuc2hvdWxkRGlzYWJsZShmb3JtKSkge1xuICAgICAgICBpZiAodGhpcy5pc0lubGluZWQpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNvbXBvbmVudC5jcmVhdGVJdGVtKGZvcm0sIHR5cGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgLFxuICAgICAgICAgICAgcXVlcnk6IHsgdHlwZSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsb3dlZCB0byBjcmVhdGUgaXRlbSBmb3IgZ2l2ZW4gZm9ybScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEZvcm1DbGFzcyhmb3JtLCB0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYGRpdG8tdHlwZS0ke3R5cGV9YF06IHRydWUsXG4gICAgICAgICdkaXRvLWRpc2FibGVkJzogdGhpcy5zaG91bGREaXNhYmxlKGZvcm0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QodHlwZSkge1xuICAgICAgdGhpcy5jcmVhdGVJdGVtKHRoaXMuZm9ybXNbdHlwZV0sIHR5cGUpXG4gICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICByaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jbGlwYm9hcmQuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgdi1pZj1cImNsaXBib2FyZFwiXG4pXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1jb3B5KFxuICAgIHJlZj1cImNvcHlEYXRhXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIkNvcHkgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIWNvcHlFbmFibGVkXCJcbiAgICBAY2xpY2s9XCJvbkNvcHlcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1wYXN0ZShcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIlBhc3RlIERhdGFcIlxuICAgIDpkaXNhYmxlZD1cIiFwYXN0ZUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uUGFzdGVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNPYmplY3QsIGNsb25lLCBkZWluZGVudCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ2xpcGJvYXJkJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBjbGlwYm9hcmQ6IHsgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3B5RW5hYmxlZDogZmFsc2UsXG4gICAgICBwYXN0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZml4Q2xpcGJvYXJkOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xpcGJvYXJkT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBpc09iamVjdCh0aGlzLmNsaXBib2FyZCkgPyB0aGlzLmNsaXBib2FyZCA6IHt9XG4gICAgfSxcblxuICAgIGNvcHlEYXRhKCkge1xuICAgICAgY29uc3QgeyBjb3B5IH0gPSB0aGlzLmNsaXBib2FyZE9wdGlvbnNcbiAgICAgIHJldHVybiBjb3B5XG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgY29weS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsb25lKGNsaXBib2FyZERhdGEpXG4gICAgfSxcblxuICAgIHBhc3RlRGF0YSgpIHtcbiAgICAgIGNvbnN0IHsgcGFzdGUgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIHBhc3RlXG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgcGFzdGUuY2FsbChcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIDogY2xpcGJvYXJkRGF0YSA9PiBjbGlwYm9hcmREYXRhXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2hlY2sgY2xpcGJvYXJkIGNvbnRlbnQgd2hlbmV2ZXIgc29tZXRoaW5nIGdldHMgY29waWVkIG9yIHRoZSB3aW5kb3cgZ2V0c1xuICAgIC8vIChyZSlhY3RpdmF0ZWQsIGFzIHRob3NlIGFyZSB0aGUgbW9tZW50cyB3aGVuIHRoZSBjbGlwYm9hcmQgY2FuIGNoYW5nZTpcbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjb3B5OiB0aGlzLmNoZWNrQ2xpcGJvYXJkXG4gICAgfSlcbiAgICB0aGlzLmRvbU9uKHdpbmRvdywge1xuICAgICAgZm9jdXM6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuJHdhdGNoKCdkYXRhJywge1xuICAgICAgLy8gQ2hlY2sgcmlnaHQgYXdheSBhbHNvIGluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGRhdGEgKGUuZy4gY3JlYXRlIGZvcm0pLlxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogKHRvLCBmcm9tKSA9PiB7XG4gICAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYXN5bmMgZ2V0Q2xpcGJvYXJkRGF0YShyZXBvcnQpIHtcbiAgICAgIC8vIFVzZSB0aGUgaW50ZXJuYWwgY2xpcGJvYXJkIGFzIGZhbGxiYWNrLlxuICAgICAgbGV0IHsgY2xpcGJvYXJkRGF0YSB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LnJlYWRUZXh0Py4oKVxuICAgICAgICBpZiAodGhpcy5maXhDbGlwYm9hcmQgJiYganNvbikge1xuICAgICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBuZWVkZWQgb24gU2FmYXJpIHRvIHByZXZlbnQgYSBzdHJhbmdlIFwiUGFzdGVcIlxuICAgICAgICAgIC8vIGJ1dHRvbiBmcm9tIGFwcGVhcmluZyB3aGVuIHRoZSBjbGlwYm9hcmQgaXMgYWNjZXNzZWQgKHdoeT8hKS5cbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIHRoaXMuZml4Q2xpcGJvYXJkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgIGNsaXBib2FyZERhdGEgPSBKU09OLnBhcnNlKGpzb24pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5uYW1lLCBlcnIubWVzc2FnZSlcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIGFsZXJ0KGRlaW5kZW50YFxuICAgICAgICAgICAgICBUaGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIGFwcGVhcnMgdG8gYmUgbWFsZm9ybWVkOlxuICAgICAgICAgICAgICAke2Vyci5tZXNzYWdlfVxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgJHNjaGVtYSwgLi4uZGF0YSB9ID0gY2xpcGJvYXJkRGF0YSB8fCB7fVxuICAgICAgcmV0dXJuICRzY2hlbWEgPT09IHRoaXMuc2NoZW1hQ29tcG9uZW50Py5zY2hlbWEubmFtZSA/IGRhdGEgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIGNoZWNrQ2xpcGJvYXJkKCkge1xuICAgICAgdGhpcy5jb3B5RW5hYmxlZCA9ICEhdGhpcy5kYXRhXG4gICAgICAvLyBTZWUgaWYgdGhlIGNsaXBib2FyZCBjb250ZW50IGlzIHZhbGlkIEpTT04gZGF0YSB0aGF0IGlzIGNvbXBhdGlibGVcbiAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0IHNjaGVtYSwgYW5kIG9ubHkgdGhlbiBhY3RpdmF0ZSB0aGUgcGFzdGluZzpcbiAgICAgIHRoaXMucGFzdGVFbmFibGVkID0gISEoYXdhaXQgdGhpcy5nZXRDbGlwYm9hcmREYXRhKGZhbHNlKSkgLy8gZG9uJ3QgcmVwb3J0XG4gICAgfSxcblxuICAgIGFzeW5jIG9uQ29weSgpIHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LmNsaXBib2FyZERhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMuY29weURhdGEoZGF0YSlcbiAgICAgICAgLy8gS2VlcCBhbiBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY2xpcGJvYXJkRGF0YSA9IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gYWN0aXZhdGUgdGhlIHBhc3RlIGJ1dHRvbiwgZGVwZW5kaW5nIG9uIGJyb3dzZXJzOlxuICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblBhc3RlKCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEodHJ1ZSkgLy8gcmVwb3J0XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gZGF0YSAmJiB0aGlzLnBhc3RlRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LnNldERhdGEoZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nLCB7IHVwZGF0ZVJvb3QgPSBmYWxzZSwgdXBkYXRlVmlldyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZyBeICFpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gQm9vbGVhbiB4b3JcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgICAgICBpZiAodXBkYXRlUm9vdCkge1xuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5yZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVWaWV3KSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldExvYWRpbmcodGhpcy5pc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuaW1wb3J0IHsgc2V0RGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgbGFiZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluLCBMb2FkaW5nTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcyxcbiAgICAgIC8vIFBhc3MgbG9jYWwgdmVyYnMgb3ZlcnJpZGVzIG9uIHRvIGNoaWxkcmVuLCBzZWUgdmVyYnMoKSBjb21wdXRlZCBwcm9wLlxuICAgICAgJHZlcmJzOiAoKSA9PiB0aGlzLnZlcmJzLFxuICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0aGlzLmhhc0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGVkRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJlc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZSBmb3IgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIHNvdXJjZSBzY2hlbWEuXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGEgZGF0YS1zb3VyY2UgaWYgaXQgaGFzIGFuIGFzc29jaWF0ZWQgQVBJIHJlc291cmNlOlxuICAgICAgcmV0dXJuICEhdGhpcy5yZXNvdXJjZVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIC8vIFJldHVybnMgYGZhbHNlYGhlcmUsIGJ1dCBpcyBvdmVycmlkZGVuIHRvIHJldHVybiBgdHJ1ZWAgaW5cbiAgICAgIC8vIGBTb3VyY2VNaXhpbmAgZm9yIGNvbXBvbmVudCB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyIG93biBkYXRhLCBidXRcbiAgICAgIC8vIGVkaXQgdGhlaXIgaXRlbXMgdGhyb3VnaCBhIGxpbmtlZCB2aWV3LiAgSW4gdGhpcyBjYXNlLCByZWFsIGlkcyBuZWVkIHRvXG4gICAgICAvLyBiZSB1c2VkLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgLy8gQ2hlY2sgdGhlIGZvcm0gdGhhdCB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvIGFzIHdlbGwsIHNpbmNlIGl0IG1heSBiZVxuICAgICAgLy8gaW4gY3JlYXRpb24gbW9kZSwgd2hpY2ggbWFrZXMgaXQgdHJhbnNpZW50LlxuICAgICAgLy8gTk9URTogVGhpcyBkb2VzIG5vdCBsb29wIGVuZGxlc3NseSBiZWNhdXNlIERpdG9Gb3JtIHJlZGVmaW5lc1xuICAgICAgLy8gYGlzVHJhbnNpZW50KClgIHRvIG9ubHkgcmV0dXJuIGAhdGhpcy5wcm92aWRlc0RhdGFgLlxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUNvbXBvbmVudFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMucHJvdmlkZXNEYXRhICYmXG4gICAgICAgICF0aGlzLmxpbmtzVG9WaWV3IHx8XG4gICAgICAgIGZvcm0gJiYgKFxuICAgICAgICAgIGZvcm0uaXNUcmFuc2llbnQgfHxcbiAgICAgICAgICBmb3JtLmlzQ3JlYXRpbmdcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0cmFuc2llbnROb3RlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJiAoXG4gICAgICAgICAgJzxiPk5vdGU8L2I+OiB0aGUgcGFyZW50IHN0aWxsIG5lZWRzIHRvIGJlIHNhdmVkICcgK1xuICAgICAgICAgICdpbiBvcmRlciB0byBwZXJzaXN0IHRoaXMgY2hhbmdlLidcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBzaG91bGRMb2FkKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMuaXNUcmFuc2llbnQgJiZcbiAgICAgICAgIXRoaXMuaXNMb2FkaW5nXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAvLyBCYXNlIGRlZmluaXRpb24sIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW5cbiAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkRGF0YVxuICAgIH0sXG5cbiAgICB2ZXJicygpIHtcbiAgICAgIC8vIFRoZSBhY3R1YWwgY29kZSBpcyB0aGUgYGdldFZlcmJzKClgIG1ldGhvZCwgZm9yIGVhc2llciBvdmVycmlkaW5nIG9mXG4gICAgICAvLyB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGluIGNvbXBvbmVudHMgdGhhdCB1c2UgdGhlIFJlc291cmNlTWl4aW4uXG4gICAgICByZXR1cm4gdGhpcy5nZXRWZXJicygpXG4gICAgfSxcblxuICAgIHBhZ2luYXRpb25SYW5nZSgpIHtcbiAgICAgIC8vIE9ubHkgYXBwbHkgcGFnaW5hdGlvbiB0byBsaXN0cy5cbiAgICAgIGNvbnN0IHsgcGFnaW5hdGU6IGFtb3VudCB9ID0gdGhpcy5zb3VyY2VTY2hlbWFcbiAgICAgIGlmICh0aGlzLmlzTGlzdFNvdXJjZSAmJiBhbW91bnQpIHtcbiAgICAgICAgY29uc3QgeyBwYWdlID0gMCB9ID0gdGhpcy5xdWVyeSB8fCB7fVxuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2UgKiBhbW91bnRcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyBhbW91bnQgLSAxXVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgcXVlcnlQYXJhbXMoKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMucGFnaW5hdGlvblJhbmdlXG4gICAgICBjb25zdCB7IHBhZ2UsIC4uLnF1ZXJ5IH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5xdWVyeSwgLy8gUXVlcnkgbWF5IG92ZXJyaWRlIHNjb3BlLlxuICAgICAgICAuLi4ocmFuZ2UgJiYge1xuICAgICAgICAgIC8vIFBhc3MgcGFnaW5hdGlvbiBhcyByYW5nZSwgc28gdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGdldCBPYmplY3Rpb24nc1xuICAgICAgICAgIC8vIHJlc3VsdHMgY291bnRpbmc6XG4gICAgICAgICAgcmFuZ2U6IHJhbmdlLmpvaW4oJywnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIC8vIFdoZW4gY3JlYXRpbmcgbmVzdGVkIGRhdGEsIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzZXR1cERhdGEoKVxuICAgIGlmICh0aGlzLnByb3ZpZGVzRGF0YSB8fCB0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFJlc291cmNlKCkge1xuICAgICAgLy8gVGhpcyBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHNvIHRoZSBjb21wdXRlZCBgcmVzb3VyY2VgIGdldHRlciBjYW5cbiAgICAgIC8vIGJlIG92ZXJyaWRkZW4gYW5kIGBzdXBlcmAgZnVuY3Rpb25hbGl0eSBjYW4gc3RpbGwgYmUgYWNjZXNzZWQuXG4gICAgICByZXR1cm4gZ2V0UmVzb3VyY2UodGhpcy5zb3VyY2VTY2hlbWE/LnJlc291cmNlLCB7XG4gICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudEZvcm1Db21wb25lbnQ/LnJlc291cmNlID8/IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldFZlcmJzKCkge1xuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLiR2ZXJicygpXG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnZlcmJzLFxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdCB2ZXJicyB3aXRoIHRoZWlyIHRyYW5zaWVudCB2ZXJzaW9uczpcbiAgICAgICAgICAgIGNyZWF0ZTogJ2FkZCcsXG4gICAgICAgICAgICBjcmVhdGVkOiAnYWRkZWQnLFxuICAgICAgICAgICAgc2F2ZTogJ2FwcGx5JyxcbiAgICAgICAgICAgIHNhdmVkOiAnYXBwbGllZCcsXG4gICAgICAgICAgICBkZWxldGU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgZGVsZXRlZDogJ3JlbW92ZWQnXG4gICAgICAgICAgfVxuICAgICAgICA6IHZlcmJzXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIC8vIEFjdHVhbCBjb2RlIGlzIGluIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0J3MgZWFzZXIgdG8gb3ZlcnJpZGVcbiAgICAgIC8vIGBzZXR1cERhdGEoKWAgYW5kIGFuZCBjYWxsIGBlbnN1cmVEYXRhKClgIGZyb20gdGhlIG92ZXJyaWRlcyxcbiAgICAgIC8vIHNlZSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW4uXG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICBlbnN1cmVEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkTG9hZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKSB7XG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoZmFsc2UpXG4gICAgfSxcblxuICAgIGxvYWREYXRhKGNsZWFyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckRhdGEoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSkge1xuICAgICAgcmV0dXJuIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCB0eXBlID8geyB0eXBlIH0gOiB7fSwgdGhpcylcbiAgICB9LFxuXG4gICAgcmVxdWVzdERhdGEoKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnlQYXJhbXNcbiAgICAgIHRoaXMuaGFuZGxlUmVxdWVzdCh7IG1ldGhvZDogJ2dldCcsIHF1ZXJ5IH0sIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YT8udHlwZSA9PT0gJ0ZpbHRlclZhbGlkYXRpb24nICYmXG4gICAgICAgICAgICAgIHRoaXMub25GaWx0ZXJFcnJvcnM/LihkYXRhLmVycm9ycylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVW5hdXRob3JpemVkRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IENhbiB3ZSByZWFsbHkgc3dhbGxvdyB0aGVzZSBlcnJvcnM/XG4gICAgICAgICAgICAgIC8vIElzIGNhbGxpbmcgYGVuc3VyZVVzZXIoKWAgaW4gYG9uQmVmb3JlUmVxdWVzdCgpYCBlbm91Z2g/XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YShyZXNwb25zZS5kYXRhKVxuICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdsb2FkJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgaXNWYWxpZGF0aW9uRXJyb3IocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDBcbiAgICB9LFxuXG4gICAgaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVSZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja1xuICAgICkge1xuICAgICAgY29uc3QgbG9hZGluZ09wdGlvbnMgPSB7XG4gICAgICAgIHVwZGF0ZVJvb3Q6IHRydWUsIC8vIERpc3BsYXkgc3Bpbm5lciBpbiBoZWFkZXIgd2hlbiBsb2FkaW5nIGluIHJlc291cmNlc1xuICAgICAgICB1cGRhdGVWaWV3OiB0aGlzLmlzSW5WaWV3IC8vIE5vdGlmeSB2aWV3IG9mIGxvYWRpbmcgZm9yIHZpZXcgY29tcG9uZW50c1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSwgcXVlcnkgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFBhc3MgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgY2FsbGJhY2ssIHNvIHRoZXkgY2FuIGJlXG4gICAgICAgIC8vIGV4cG9zZWQgdG8gZnVydGhlciBjYWxsYmFja3MgdGhyb3VnaCBEaXRvQ29udGV4dC5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBjYWxsYmFjayByZXR1cm5zIHRydWUsIGVycm9ycyB3ZXJlIGFscmVhZHkgaGFuZGxlZC5cbiAgICAgICAgY29uc3QgeyByZXNwb25zZSB9ID0gZXJyb3JcbiAgICAgICAgaWYgKCFjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBpc1N0cmluZyhkYXRhPy50eXBlKVxuICAgICAgICAgICAgPyBsYWJlbGl6ZShkYXRhLnR5cGUpXG4gICAgICAgICAgICA6ICdFcnJvcidcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YT8ubWVzc2FnZSA/PyBlcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHsgdHlwZTogJ2Vycm9yJywgdGl0bGUsIHRleHQgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICB9LFxuXG4gICAgZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpIHtcbiAgICAgIC8vIENvbnZlbnRpb246IG9ubHkgcG9zdCwgcHV0IGFuZCBwYXRjaCByZXF1ZXN0cyBwYXNzIHRoZSBkYXRhIGFzIHBheWxvYWQuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5jbHVkZXMobWV0aG9kKSAmJiAoXG4gICAgICAgICAgLy8gVE9ETzogVXNlIGBoYW5kbGVEYXRhU2NoZW1hKClgIGFzeW5jaHJvbm91c2x5IGhlcmUgaW5zdGVhZCwgdG9cbiAgICAgICAgICAvLyBvZmZlciB0aGUgc2FtZSBhbW91bnQgb2YgcG9zc2liaWxpdGllcyBmb3IgZGF0YSBsb2FkaW5nLlxuICAgICAgICAgIGJ1dHRvbi5nZXRTY2hlbWFWYWx1ZShbJ3Jlc291cmNlJywgJ2RhdGEnXSkgfHxcbiAgICAgICAgICBidXR0b24ucHJvY2Vzc2VkSXRlbVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24pIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoYnV0dG9uLnNjaGVtYS5yZXNvdXJjZSwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMucmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgeyBtZXRob2QgfSA9IHJlc291cmNlXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBheWxvYWREYXRhKGJ1dHRvbiwgbWV0aG9kKVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICBzZXREYXRhID0gZmFsc2UsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyA9ICgpID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IFN1Y2Nlc3NmdWwnLFxuICAgICAgICAgIHRleHQ6ICdSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgc2VudC4nXG4gICAgICAgIH0pLFxuICAgICAgbm90aWZ5RXJyb3IgPSBlcnJvciA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgIGBVbmFibGUgdG8gc2VuZCByZXF1ZXN0JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KFxuICAgICAgICAgIHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSB9LFxuICAgICAgICAgIGFzeW5jIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIERpdG8gdmFsaWRhdGlvbiBlcnJvcjpcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5pc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkgJiYgZGF0YS5lcnJvcnNcbiAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNPYmplY3QoZGF0YSkgPyBkYXRhIDogZXJyXG4gICAgICAgICAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlFcnJvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmRlcmx5aW5nIGRhdGEgYmVmb3JlIGNhbGxpbmcgYG5vdGlmeSgpYCBvclxuICAgICAgICAgICAgICAvLyBgdGhpcy5pdGVtTGFiZWxgLCBzbyBpZCBpcyBzZXQgYWZ0ZXIgY3JlYXRpbmcgbmV3IGl0ZW1zLlxuICAgICAgICAgICAgICBpZiAoc2V0RGF0YSAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCBldmVudCwgeyBub3RpZnksIGVycm9yIH0pIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBvdXRzaWRlIG9mIGBlbWl0RXZlbnQoKWAsIHNvIHRoYXRcbiAgICAgIC8vIGBjb250ZXh0Lndhc05vdGlmaWVkYCBjYW4gYmUgY2hlY2tlZCBhZnRlci5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRGl0b0NvbnRleHQoYnV0dG9uLCB7XG4gICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgaXRlbUxhYmVsOiB0aGlzLml0ZW1MYWJlbCxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBidXR0b24uZW1pdEV2ZW50KGV2ZW50LCB7IGNvbnRleHQgfSlcbiAgICAgIGlmIChcbiAgICAgICAgbm90aWZ5ICYmXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBpZiBhbnl0aGluZyB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgLy8gRG8gbm90IGRpc3BsYXkgZGVmYXVsdCBub3RpZmljYXRpb24gaWYgdGhlIGV2ZW50IGhhbmRsZXIgYWxyZWFkeVxuICAgICAgICAvLyBkaXNwbGF5ZWQgYSBub3RpZmljYXRpb24uXG4gICAgICAgICFjb250ZXh0Lndhc05vdGlmaWVkXG4gICAgICApIHtcbiAgICAgICAgbm90aWZ5KGVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhdGgpIHtcbiAgLy8gRm9yIHBhdGhzIHN0YXJpbmcgd2l0aCBgL2AsIHdlIGNhbiB1c2UgdGhlIG5hdGl2ZSBgVVJMKClgIGNsYXNzIHRvIHJlc29sdmVcbiAgLy8gdGhlIHBhdGgsIHdoaWNoIHdpbGwgYWxzbyBoYW5kbGUgYC4uYCBhbmQgYC5gIHNlZ21lbnRzOlxuICByZXR1cm4gbmV3IFVSTChgZmlsZToke3BhdGh9YCkucGF0aG5hbWVcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1mb3JtLmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgOmNsYXNzPVwieyAnZGl0by1mb3JtLW5lc3RlZCc6IGlzTmVzdGVkUm91dGUgfVwiXG4gIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuKVxuICAvLy0gTk9URTogTmVzdGVkIGZvcm0gY29tcG9uZW50cyBhcmUga2VwdCBhbGl2ZSBieSB1c2luZyBgdi1zaG93YCBpbnN0ZWFkIG9mXG4gIC8vLSBgdi1pZmAgaGVyZSwgc28gZXZlbnQgaGFuZGxpbmcgYW5kIG90aGVyIHRoaW5ncyBzdGlsbCB3b3JrIHdpdGggbmVzdGVkXG4gIC8vLSBlZGl0aW5nLiBPbmx5IHJlbmRlciBhIHJvdXRlci12aWV3IGhlcmUgaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBkYXRhIHJvdXRlXG4gIC8vLSBhbmQgbm90IGEgbmVzdGVkIGZvcm0gcm91dGUsIHdoaWNoIHdpbGwgYXBwZWFyIGVsc2V3aGVyZSBpbiBpdHMgb3duIHZpZXcuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiEoaXNMYXN0VW5uZXN0ZWRSb3V0ZSB8fCBpc05lc3RlZFJvdXRlKVwiXG4gICAgdi1zaG93PVwiIWlzQWN0aXZlXCJcbiAgKVxuICAvLy0gVXNlIGEgPGRpdj4gZm9yIGlubGluZWQgZm9ybXMsIGFzIHdlIHNob3VsZG4ndCBuZXN0IGFjdHVhbCA8Zm9ybT4gdGFncy5cbiAgY29tcG9uZW50LmRpdG8tc2Nyb2xsKFxuICAgIHYtc2hvdz1cImlzQWN0aXZlXCJcbiAgICA6aXM9XCJpc05lc3RlZFJvdXRlID8gJ2RpdicgOiAnZm9ybSdcIlxuICAgIEBzdWJtaXQucHJldmVudFxuICApXG4gICAgRGl0b1NjaGVtYShcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgRGl0b0J1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICAgIClcbiAgICAvLy0gUHJldmVudCBpbXBsaWNpdCBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtLCBmb3IgZXhhbXBsZSB3aGVuIHR5cGluZyBlbnRlclxuICAgIC8vLSBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICAvLy0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUxNTA3ODA2XG4gICAgYnV0dG9uKFxuICAgICAgdi1zaG93PVwiZmFsc2VcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBkaXNhYmxlZFxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSwgY2FwaXRhbGl6ZSwgcGFyc2VEYXRhUGF0aCwgbWVyZ2UgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1Jlc291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGdldEJ1dHRvblNjaGVtYXMsIGlzT2JqZWN0U291cmNlIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Gb3JtJywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluLCBSZXNvdXJjZU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkRGF0YTogbnVsbCxcbiAgICAgIGNsb25lZERhdGE6IHVuZGVmaW5lZCxcbiAgICAgIHNvdXJjZUtleTogbnVsbCxcbiAgICAgIGlzRm9ybTogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHZlcmJzKCkge1xuICAgICAgLy8gQWRkIHN1Ym1pdCAvIHN1Ym1pdHRlZCB0byB0aGUgdmVyYnMgcmV0dXJuZWQgYnkgUmVzb3VyY2VNaXhpblxuICAgICAgLy8gTk9URTogVGhlc2UgZ2V0IHBhc3NlZCBvbiB0byBjaGlsZHJlbiB0aHJvdWdoOlxuICAgICAgLy8gYHByb3ZpZGUoKSAuLi4geyAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMgfWAgaW4gUmVzb3VyY2VNaXhpblxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLmdldFZlcmJzKClcbiAgICAgIGNvbnN0IHsgaXNDcmVhdGluZywgcHJvdmlkZXNEYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi52ZXJicyxcbiAgICAgICAgc3VibWl0OiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlIDogdmVyYnMuc2F2ZSxcbiAgICAgICAgc3VibWl0dGVkOiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlZCA6IHZlcmJzLnNhdmVkLFxuICAgICAgICBjYW5jZWw6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbCA6IHZlcmJzLmNsb3NlLFxuICAgICAgICBjYW5jZWxsZWQ6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbGxlZCA6IHZlcmJzLmNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldEl0ZW1Gb3JtU2NoZW1hKFxuICAgICAgICAgIHRoaXMuc291cmNlU2NoZW1hLFxuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgeWV0LCBwcm92aWRlIGFuIGVtcHR5IG9iamVjdCB3aXRoIGp1c3QgdGhlXG4gICAgICAgICAgLy8gcmlnaHQgdHlwZSBzZXQsIHNvIHRoZSBmb3JtIGNhbiBhbHdheXMgYmUgZGV0ZXJtaW5lZC5cbiAgICAgICAgICB0aGlzLmRhdGEgfHwgeyB0eXBlOiB0aGlzLnR5cGUgfSxcbiAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgKSB8fCB7fVxuICAgICAgKSAvLyBBbHdheXMgcmV0dXJuIGEgc2NoZW1hIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdC5cbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN1Ym1pdDogIXRoaXMuaXNNdXRhdGluZyAmJiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgICAgICAvLyBTdWJtaXQgYnV0dG9ucyBjbG9zZSB0aGUgZm9ybSBieSBkZWZhdWx0OlxuICAgICAgICAgICAgICBjbG9zZUZvcm06IHRydWUsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoeyBjb21wb25lbnQ6IGJ1dHRvbiB9KSA9PiBidXR0b24uc3VibWl0KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zY2hlbWEuYnV0dG9uc1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0Um91dGUgfHwgdGhpcy5pc0xhc3RVbm5lc3RlZFJvdXRlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnByb3ZpZGVzRGF0YVxuICAgIH0sXG5cbiAgICBpc0NyZWF0aW5nKCkge1xuICAgICAgLy8gdGhpcy5wYXJhbSBpcyBpbmhlcml0ZWQgZnJvbSBSb3V0ZU1peGluXG4gICAgICByZXR1cm4gdGhpcy5wYXJhbSA9PT0gJ2NyZWF0ZSdcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc011dGF0aW5nICYmICEhdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5pc0RpcnR5XG4gICAgfSxcblxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICAvLyBXaGVuIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCB0aGUgZm9ybSBlZGl0cyB0aGUgaW5oZXJpdGVkIGRhdGFcbiAgICAgIC8vIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBmb3IgcGVyc2lzdGVuY2UgdXBvbiBzdWJtaXNzaW9uLlxuICAgICAgLy8gU2VlIGBpbmhlcml0ZWREYXRhKClgIGNvbXB1dGVkIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gISF0aGlzLnNvdXJjZVNjaGVtYS5tdXRhdGVcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5zZWxlY3RlZFRhYiB8fCBudWxsXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICAvLyBUaGUgdHlwZSBvZiBmb3JtIHRvIGNyZWF0ZSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGVcbiAgICB9LFxuXG4gICAgaXRlbUlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLnBhcmFtID8/IG51bGxcbiAgICB9LFxuXG4gICAgbWV0aG9kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZyA/ICdwb3N0JyA6ICdwYXRjaCdcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoKVxuICAgICAgcmV0dXJuIGdldE1lbWJlclJlc291cmNlKHRoaXMuaXRlbUlkLCByZXNvdXJjZSkgfHwgcmVzb3VyY2VcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMuaXNDcmVhdGluZyA/IHRoaXMudmVyYnMuY3JlYXRlIDogdGhpcy52ZXJicy5lZGl0KVxuICAgIH0sXG5cbiAgICBkYXRhKCkge1xuICAgICAgLy8gUmV0dXJuIGRpZmZlcmVudCBkYXRhIFwiY29udGFpbmVyc1wiIGJhc2VkIG9uIGRpZmZlcmVudCBzY2VuYXJpb3M6XG4gICAgICAvLyAxLiBjcmVhdGVkRGF0YSwgaWYgd2UncmUgaW4gYSBmb3JtIGZvciBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuICAgICAgLy8gMi4gbG9hZGVkRGF0YSwgaWYgdGhlIGZvcm0gaXRzZWxmIGlzIHRoZSByb290IG9mIHRoZSBkYXRhIChlLmcuIHdoZW5cbiAgICAgIC8vICAgIGRpcmVjdGx5IGxvYWRpbmcgYW4gZWRpdGluZyByb290KS5cbiAgICAgIC8vIDMuIFRoZSBkYXRhIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIHdoaWNoIGl0c2VsZiBtYXkgYmUgZWl0aGVyIGFcbiAgICAgIC8vICAgIHZpZXcgdGhhdCBsb2FkZWQgdGhlIGRhdGEsIG9yIGEgZm9ybSB0aGF0IGVpdGhlciBsb2FkZWQgdGhlIGRhdGEsIG9yXG4gICAgICAvLyAgICBhbHNvIGluaGVyaXRlZCBpdCBmcm9tIGl0cyBwYXJlbnQuIE5vdGUgdGhhdCB3ZSB1c2UgYSBjbG9uZSBvZiBpdCxcbiAgICAgIC8vICAgIHNvLCBkYXRhIGNoYW5nZXMgYXJlbid0IGFwcGxpZWQgdW50aWwgc2V0U291cmNlRGF0YSgpIGlzIGNhbGxlZC5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZWREYXRhIHx8IHRoaXMubG9hZGVkRGF0YSB8fCB0aGlzLmluaGVyaXRlZERhdGEgfHwgbnVsbFxuICAgIH0sXG5cbiAgICBkYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGFQYXRoRnJvbSh0aGlzLmRhdGFDb21wb25lbnQpXG4gICAgfSxcblxuICAgIHNvdXJjZURhdGEoKSB7XG4gICAgICAvLyBQb3NzaWJsZSBwYXJlbnRzIGFyZSBEaXRvRm9ybSBmb3IgZm9ybXMsIG9yIERpdG9WaWV3IGZvciByb290IGxpc3RzLlxuICAgICAgLy8gQm90aCBoYXZlIGEgZGF0YSBwcm9wZXJ0eSB3aGljaCBhYnN0cmFjdHMgYXdheSBsb2FkaW5nIGFuZCBpbmhlcml0aW5nXG4gICAgICAvLyBvZiBkYXRhLlxuICAgICAgLy8gRm9ybXMgdGhhdCBhcmUgYWJvdXQgdG8gYmUgZGVzdHJveWVkIGR1ZSB0byBuYXZpZ2F0aW9uIGxvb3NlIHRoZWlyXG4gICAgICAvLyByb3V0ZS1yZWNvcmQsIGJ1dCBtaWdodCBzdGlsbCB0cmlnZ2VyIHRoaXMgZ2V0dGVyLiBGaWx0ZXIgdGhvc2Ugb3V0LlxuICAgICAgbGV0IGRhdGEgPSB0aGlzLnJvdXRlUmVjb3JkID8gdGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5kYXRhIDogbnVsbFxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBkYXRhIGJ5IHNwbGl0dGluZyB0aGUgZGF0YVBhdGgsIGl0ZXJhdGUgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gYWN0dWFsIGRhdGEgYW5kIGxvb2sgbmVzdCBjaGlsZC1kYXRhIHVwLlxuICAgICAgICBjb25zdCBkYXRhUGFydHMgPSBwYXJzZURhdGFQYXRoKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMucGFyZW50Um91dGVDb21wb25lbnQpXG4gICAgICAgIClcbiAgICAgICAgLy8gQ29tcGFyZSBkYXRhUGFydHMgYWdhaW5zdCBtYXRjaGVkIHJvdXRlUGF0aCBwYXJ0cywgdG8gaWRlbnRpZnkgdGhvc2VcbiAgICAgICAgLy8gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHRyZWF0ZWQgbGlrZSBpZHMgYW5kIG1hcHBlZCB0byBpbmRpY2VzIGluIGRhdGEuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucm91dGVSZWNvcmQucGF0aC5zcGxpdCgnLycpXG4gICAgICAgIGNvbnN0IHJvdXRlUGFydHMgPSBwYXRoUGFydHMuc2xpY2UocGF0aFBhcnRzLmxlbmd0aCAtIGRhdGFQYXJ0cy5sZW5ndGgpXG4gICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICB0aGlzLnNvdXJjZUtleSA9IG51bGxcbiAgICAgICAgY29uc3QgbGFzdERhdGFQYXJ0ID0gZGF0YVBhcnRzW2RhdGFQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpICYmIGxhc3REYXRhUGFydCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9iamVjdCBzb3VyY2UgYW5kIGFyZSBjcmVhdGluZywgdGhlIGRhdGFQYXRoIG5lZWRzIHRvXG4gICAgICAgICAgLy8gYmUgc2hvcnRlbmVkIGJ5IHRoZSAnY3JlYXRlJyBlbnRyeS4gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzLCBhcyB0aGVyZSB0aGUgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgaXRlbSBpZC5cbiAgICAgICAgICBkYXRhUGFydHMubGVuZ3RoLS1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRhdGFQYXJ0cy5sZW5ndGg7IGkgPCBsICYmIGRhdGE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gZGF0YVBhcnRzW2ldXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiA6aWQgcGFydCwgZmluZCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gd2l0aCBnaXZlbiBpZC5cbiAgICAgICAgICBjb25zdCBrZXkgPSAvXjppZC8udGVzdChyb3V0ZVBhcnRzW2ldKVxuICAgICAgICAgICAgPyBkYXRhUGFydCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgICAgPyBudWxsIC8vIFRoZXJlJ3Mgbm8gaW5kZXggZm9yIGVudHJpZXMgYWJvdXQgdG8gYmUgY3JlYXRlZFxuICAgICAgICAgICAgICA6IHRoaXMuZmluZEl0ZW1JZEluZGV4KHRoaXMuc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGFydClcbiAgICAgICAgICAgIDogZGF0YVBhcnRcbiAgICAgICAgICAvLyBTa2lwIHRoZSBmaW5hbCBsb29rdXAgYnV0IHJlbWVtYmVyIGBzb3VyY2VLZXlgLCBhcyB3ZSB3YW50IHRoZVxuICAgICAgICAgIC8vIHBhcmVudCBkYXRhIHNvIHdlIGNhbiByZXBsYWNlIHRoZSBlbnRyeSBhdCBgc291cmNlS2V5YCBvbiBpdC5cbiAgICAgICAgICBpZiAoaSA9PT0gbCAtIDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy5zb3VyY2VLZXkgPSBrZXlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgaW5oZXJpdGVkRGF0YSgpIHtcbiAgICAgIC8vIERhdGEgaW5oZXJpdGVkIGZyb20gcGFyZW50LCBhbmQgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdCByZWFjdGl2ZVxuICAgICAgLy8gY2hhbmdlcyB1bnRpbCBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRocm91Z2ggc2V0U291cmNlRGF0YSgpLCB1bmxlc3NcbiAgICAgIC8vIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGRhdGEgaXMgbXV0YXRlZCBkaXJlY3RseS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICB0aGlzLmNsb25lZERhdGEgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLnNvdXJjZURhdGEgJiZcbiAgICAgICAgdGhpcy5zb3VyY2VLZXkgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV1cbiAgICAgICAgaWYgKCF0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBVc2UgYSB0cmljayB0byBzdG9yZSBjbG9uZWQgaW5oZXJpdGVkIGRhdGEgaW4gY2xvbmVkRGF0YSwgdG8gbWFrZVxuICAgICAgICAgIC8vIGl0IHJlYWN0aXZlIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgY2xvbmVkIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gZGF0YSA9IGNsb25lKGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEgPT09IG51bGwgJiZcbiAgICAgICAgICAhdGhpcy5pc0NyZWF0aW5nICYmXG4gICAgICAgICAgaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGRhdGEgb2YgYW4gb2JqZWN0IHNvdXJjZSBpcyBudWxsLCByZWRpcmVjdCB0byBpdHMgY3JlYXRlIHJvdXRlLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVkRGF0YVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5oYXNEYXRhKClcbiAgICBoYXNEYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIGl0ZW1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNvdXJjZVNjaGVtYSwgdGhpcy5kYXRhLCB7IGV4dGVuZGVkOiB0cnVlIH0pXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc291cmNlRGF0YTogJ2NsZWFyQ2xvbmVkRGF0YScsXG4gICAgLy8gTmVlZGVkIGZvciB0aGUgJ2NyZWF0ZScgcmVkaXJlY3QgaW4gYGluaGVyaXRlZERhdGEoKWAgdG8gd29yazpcbiAgICBjcmVhdGU6ICdzZXR1cERhdGEnXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50LmVtaXRFdmVudChldmVudCwgcGFyYW1zKVxuICAgIH0sXG5cbiAgICBnZXREYXRhUGF0aEZyb20ocm91dGUpIHtcbiAgICAgIC8vIEdldCB0aGUgZGF0YSBwYXRoIGJ5IGRlbm9ybWFsaXplUGF0aCB0aGUgcmVsYXRpdmUgcm91dGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXMuYXBpLmRlbm9ybWFsaXplUGF0aChcbiAgICAgICAgdGhpcy5wYXRoXG4gICAgICAgICAgLy8gRGl0b1ZpZXdzIGhhdmUgbmVzdGVkIHJvdXRlcywgc28gZG9uJ3QgcmVtb3ZlIHRoZWlyIHBhdGguXG4gICAgICAgICAgLnNsaWNlKChyb3V0ZS5pc1ZpZXcgPyAwIDogcm91dGUucGF0aC5sZW5ndGgpICsgMSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0dXBEYXRhKClcbiAgICBzZXR1cERhdGEoKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0aW5nKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgfHw9IHRoaXMuY3JlYXRlRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy50eXBlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U291cmNlRGF0YShkYXRhKSB7XG4gICAgICBpZiAodGhpcy5zb3VyY2VEYXRhICYmIHRoaXMuc291cmNlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWFpblNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFbdGhpcy5zb3VyY2VLZXldID0gbWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKGRhdGEpXG4gICAgICAgIG1haW5TY2hlbWFDb21wb25lbnQub25DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFkZFNvdXJjZURhdGEoZGF0YSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMuc291cmNlU2NoZW1hKVxuICAgICAgICA/IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgICA6ICEhdGhpcy5zb3VyY2VEYXRhPy5wdXNoKGRhdGEpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmNsZWFyRGF0YSgpXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5zZXREYXRhKG51bGwpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLnNldERhdGEoKVxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgLy8gc2V0RGF0YSgpIGlzIGNhbGxlZCBhZnRlciBzdWJtaXQgd2hlbiBkYXRhIGhhcyBjaGFuZ2VkLlxuICAgICAgaWYgKHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aCB0cmFuc2llbnQgZGF0YSwgbW9kaWZ5IHRoaXMuc291cmNlRGF0YS5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZWREYXRhID0gbnVsbFxuICAgICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyQ2xvbmVkRGF0YSh0bywgZnJvbSkge1xuICAgICAgLy8gT25seSBjbGVhciBpZiB0aGUgd2F0Y2hlZCBzb3VyY2VEYXRhIGl0c2VsZiBjaGFuZ2VzIGluIHRoZSBmb3JtLlxuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZSgpXG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUodGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5wYXRoKVxuICAgIH0sXG5cbiAgICBnZXRTdWJtaXRWZXJiKHByZXNlbnQgPSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gcHJlc2VudFxuICAgICAgICAgID8gJ2NyZWF0ZSdcbiAgICAgICAgICA6ICdjcmVhdGVkJ1xuICAgICAgICA6IHByZXNlbnRcbiAgICAgICAgICA/ICdzdWJtaXQnXG4gICAgICAgICAgOiAnc3VibWl0dGVkJ1xuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXQoYnV0dG9uLCB7IHZhbGlkYXRlID0gdHJ1ZSwgY2xvc2VGb3JtID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0VmVyYiA9IHByZXNlbnQgPT4gdGhpcy52ZXJic1t0aGlzLmdldFN1Ym1pdFZlcmIocHJlc2VudCldXG5cbiAgICAgIC8vIEFsbG93IGJ1dHRvbnMgdG8gb3ZlcnJpZGUgYm90aCBtZXRob2QgYW5kIHJlc291cmNlIHBhdGggdG8gc3VibWl0IHRvOlxuICAgICAgY29uc3QgYnV0dG9uUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc291cmNlID0gYnV0dG9uUmVzb3VyY2UgfHwgdGhpcy5yZXNvdXJjZVxuICAgICAgY29uc3QgbWV0aG9kID0gcmVzb3VyY2U/Lm1ldGhvZCB8fCB0aGlzLm1ldGhvZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICBsZXQgc3VjY2Vzc1xuICAgICAgaWYgKCFidXR0b25SZXNvdXJjZSAmJiB0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zaWVudChidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICA/IGBJdGVtICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gXG4gICAgICAgICAgICAgICAgOiBgQ2hhbmdlICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgICAgICAgICAgICA/IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICAgICAgICA6IGBDaGFuZ2VzIHRvICR7dGhpcy5pdGVtTGFiZWx9IHdlcmUgJHt2ZXJifS5gLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpZW50Tm90ZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgICAgIHRleHQ6IGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfS5gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIHNldERhdGE6IHRydWUsXG4gICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB0aGlzLmVtaXRTY2hlbWFFdmVudCh0aGlzLmdldFN1Ym1pdFZlcmIoKSksXG4gICAgICAgICAgb25FcnJvcjogZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBlcnJvciB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBub3RpZnlTdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICB0aXRsZTogYFN1Y2Nlc3NmdWxseSAke2NhcGl0YWxpemUodmVyYil9YCxcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfSR7ZXJyb3IgPyAnOicgOiAnJ31gLFxuICAgICAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5yZXNldFZhbGlkYXRpb24oKVxuICAgICAgICBpZiAoY2xvc2VGb3JtIHx8IGJ1dHRvbi5jbG9zZUZvcm0pIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAvLyBSZWRpcmVjdCB0byB0aGUgZm9ybSBlZGl0aW5nIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW06XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldEl0ZW1JZCh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhKVxuICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgcGF0aDogcmVzb2x2ZVBhdGgoYCR7dGhpcy5wYXRofS8uLi8ke2lkfWApIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdFRyYW5zaWVudChidXR0b24sIF9yZXNvdXJjZSwgX21ldGhvZCwgZGF0YSwge1xuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25FcnJvcixcbiAgICAgIG5vdGlmeVN1Y2Nlc3MsXG4gICAgICBub3RpZnlFcnJvclxuICAgIH0pIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZGVmYXVsdCBcInN1Ym1pdHRpbmdcIiBvZiB0cmFuc2llbnQsIG5lc3RlZCBkYXRhOlxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IHRoaXMuYWRkU291cmNlRGF0YShkYXRhKVxuICAgICAgICA6IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAnQ291bGQgbm90IHN1Ym1pdCB0cmFuc2llbnQgaXRlbSdcbiAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdlcnJvcicsIHtcbiAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0Zvcm0gZnJvbSAnLi9EaXRvRm9ybS52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1OZXN0ZWQnLCB7XG4gIGV4dGVuZHM6IERpdG9Gb3JtXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZm9ybS1uZXN0ZWQge1xuICAmLFxuICAuZGl0by1zY3JvbGwge1xuICAgIC8vIE5vIHNjcm9sbGluZyBpbnNpZGUgbmVzdGVkIGZvcm1zLCBhbmQgcHJldmVudCBvcGVuIC5tdWx0aXNlbGVjdCBmcm9tXG4gICAgLy8gYmVpbmcgY3JvcHBlZC5cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1lcnJvcnMoXG4gIHYtaWY9XCJlcnJvcnNcIlxuKVxuICB1bFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJlcnJvciBvZiBlcnJvcnNcIlxuICAgIClcbiAgICAgIHwge3sgZXJyb3IgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FcnJvcnMnLCB7XG4gIHByb3BzOiB7XG4gICAgZXJyb3JzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWVycm9ycyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcblxuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIGNvbG9yOiAkY29sb3ItZXJyb3I7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NvcGVzXG4gIFJvdXRlckxpbmsoXG4gICAgdi1mb3I9XCIoc2NvcGUsIGtleSkgaW4gc2NvcGVzXCJcbiAgICA6a2V5PVwia2V5XCJcbiAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgIDp0bz1cImdldFNjb3BlTGluayhzY29wZSlcIlxuICAgIGN1c3RvbVxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXNlbGVjdGVkJzogc2NvcGUubmFtZSA9PT0gcXVlcnkuc2NvcGUgfVwiXG4gICAgICA6dGl0bGU9XCJzY29wZS5oaW50IHx8IGdldExhYmVsKHNjb3BlKVwiXG4gICAgICBAY2xpY2s9XCJuYXZpZ2F0ZVwiXG4gICAgKSB7eyBnZXRMYWJlbChzY29wZSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY29wZXMnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjb3BlczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U2NvcGVMaW5rKHNjb3BlKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4udGhpcy5xdWVyeSwgc2NvcGU6IHNjb3BlLm5hbWUgfVxuICAgICAgaWYgKHF1ZXJ5LnBhZ2UpIHtcbiAgICAgICAgcXVlcnkucGFnZSA9IDBcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayhxdWVyeSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY29wZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC8vIEEgYml0IG1vcmUgdGhhbiB0aGUgd2lkdGggb2YgZWxsaXBzaXMsIHRvIHByZXZlbnQgcmVwbGFjaW5nIHNob3J0IHdvcmRzXG4gICAgLy8gd2l0aCBlbGxpcHNpcy5cbiAgICBtaW4td2lkdGg6IDNlbTtcbiAgICBmbGV4OiAwIDEgYXV0bztcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgIH1cblxuICAgICYgKyAuZGl0by1idXR0b24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfSAvLyBEb24ndCBjb3ZlciB0aGUgZm9jdXNlZCBib3JkZXIgb2YgYnV0dG9uczpcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblBhZ2luYXRpb24oXG4gIHYtbW9kZWw6cGFnZT1cInBhZ2VcIlxuICA6cGFnZVNpemU9XCJsaW1pdFwiXG4gIDp0b3RhbD1cInRvdGFsXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYWdpbmF0aW9uJywge1xuICBjb21wb25lbnRzOiB7IFBhZ2luYXRpb24gfSxcblxuICBwcm9wczoge1xuICAgIHF1ZXJ5OiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwYWdlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAoK3RoaXMucXVlcnkucGFnZSB8fCAwKSArIDFcbiAgICAgIH0sXG5cbiAgICAgIHNldChwYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChcbiAgICAgICAgICAgIHRoaXMuZ2V0UXVlcnlMaW5rKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSAtIDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgSXRlbU1peGluIGZyb20gJy4vSXRlbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U29ydGFibGVPcHRpb25zKGZvcmNlRmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGhhbmRsZTogJy5kaXRvLWJ1dHRvbi1kcmFnJyxcbiAgICAgICAgZHJhZ0NsYXNzOiAnZGl0by1zb3J0YWJsZS1hY3RpdmUnLFxuICAgICAgICBjaG9zZW5DbGFzczogJ2RpdG8tc29ydGFibGUtY2hvc2VuJyxcbiAgICAgICAgZ2hvc3RDbGFzczogJ2RpdG8tc29ydGFibGUtZ2hvc3QnLFxuICAgICAgICBmYWxsYmFja0NsYXNzOiAnZGl0by1zb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgICAgIGZvcmNlRmFsbGJhY2ssXG4gICAgICAgIG9uU3RhcnQ6IHRoaXMub25TdGFydERyYWcsXG4gICAgICAgIG9uRW5kOiB0aGlzLm9uRW5kRHJhZ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblN0YXJ0RHJhZygpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlXG4gICAgfSxcblxuICAgIG9uRW5kRHJhZyh7IG9sZEluZGV4LCBuZXdJbmRleCB9KSB7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2VcbiAgICAgIGlmIChvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdCwgcGFnaW5hdGlvblJhbmdlKSB7XG4gICAgICBjb25zdCB7IG9yZGVyS2V5IH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmIChvcmRlcktleSkge1xuICAgICAgICAvLyBSZW9yZGVyIHRoZSBjaGFuZ2VkIGVudHJpZXMgYnkgdGhlaXIgb3JkZXIga2V5LCB0YWtpbmcgcGFnaW5hdGlvblxuICAgICAgICAvLyBvZmZzZXRzIGludG8gYWNjb3VudDpcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFnaW5hdGlvblJhbmdlPy5bMF0gfHwgMFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsaXN0W2ldW29yZGVyS2V5XSA9IGkgKyBvZmZzZXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmVlLWl0ZW0oXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPWB7XG4gICAgJ2RpdG8tZHJhZ2dpbmcnOiBkcmFnZ2luZyxcbiAgICAnZGl0by1hY3RpdmUnOiBhY3RpdmVcbiAgfWBcbiAgOnN0eWxlPVwibGV2ZWwgPiAwICYmIHsgJy0tbGV2ZWwnOiBsZXZlbCB9XCJcbilcbiAgLmRpdG8tdHJlZS1oZWFkZXIoXG4gICAgdi1pZj1cImxhYmVsXCJcbiAgKVxuICAgIC5kaXRvLXRyZWUtYnJhbmNoKFxuICAgICAgdi1pZj1cIm51bUVudHJpZXNcIlxuICAgICAgQGNsaWNrLnN0b3A9XCJvcGVuZWQgPSAhb3BlbmVkXCJcbiAgICApXG4gICAgICAuZGl0by1jaGV2cm9uKFxuICAgICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICAgIDpjbGFzcz1cInsgJ2RpdG8tb3BlbmVkJzogb3BlbmVkIH1cIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1sYWJlbChcbiAgICAgICAgdi1odG1sPVwibGFiZWxcIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1pbmZvKFxuICAgICAgICB2LWlmPVwiZGV0YWlsc1wiXG4gICAgICApIHt7IGRldGFpbHMgfX1cbiAgICAuZGl0by10cmVlLWxlYWYoXG4gICAgICB2LWVsc2VcbiAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtc21hbGwoXG4gICAgICB2LWlmPVwiaGFzRWRpdEJ1dHRvbnNcIlxuICAgIClcbiAgICAgIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gICAgICBhLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gICAgICApXG4gICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJlZGl0YWJsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmVkaXQpXCJcbiAgICAgICAgQGNsaWNrPVwib25FZGl0XCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImRlbGV0YWJsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgICAgICBAY2xpY2s9XCJvbkRlbGV0ZVwiXG4gICAgICApXG4gIHRhYmxlLmRpdG8tcHJvcGVydGllcyhcbiAgICB2LWlmPVwicHJvcGVydGllc1wiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgKVxuICAgIHRyKFxuICAgICAgdi1mb3I9XCJwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzXCJcbiAgICApXG4gICAgICB0ZFxuICAgICAgICBEaXRvTGFiZWwoXG4gICAgICAgICAgdi1pZj1cInByb3BlcnR5LmxhYmVsICE9PSBmYWxzZVwiXG4gICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSlcIlxuICAgICAgICAgIDpsYWJlbD1cImdldExhYmVsKHByb3BlcnR5KVwiXG4gICAgICAgIClcbiAgICAgIERpdG9UYWJsZUNlbGwoXG4gICAgICAgIDpjZWxsPVwicHJvcGVydHlcIlxuICAgICAgICA6c2NoZW1hPVwicHJvcGVydHlcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgKVxuICBEaXRvRHJhZ2dhYmxlKFxuICAgIHYtaWY9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKGNoaWxkcmVuU2NoZW1hLCBjaGlsZHJlbkxpc3QpXCJcbiAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyh0cnVlKVwiXG4gICAgOmRyYWdnYWJsZT1cImNoaWxkcmVuRHJhZ2dhYmxlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCJ2YWx1ZSA9PiAoY2hpbGRyZW5MaXN0ID0gdmFsdWUpXCJcbiAgKVxuICAgIERpdG9UcmVlSXRlbShcbiAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjaGlsZHJlbkl0ZW1zXCJcbiAgICAgIDprZXk9XCJnZXRJdGVtVWlkKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEpXCJcbiAgICAgIDpzY2hlbWE9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJnZXRJdGVtRGF0YVBhdGgoY2hpbGRyZW5TY2hlbWEsIGluZGV4KVwiXG4gICAgICA6ZGF0YT1cIml0ZW0uZGF0YVwiXG4gICAgICA6cGF0aD1cIml0ZW0ucGF0aFwiXG4gICAgICA6b3Blbj1cIml0ZW0ub3BlblwiXG4gICAgICA6YWN0aXZlPVwiaXRlbS5hY3RpdmVcIlxuICAgICAgOmRyYWdnYWJsZT1cImNoaWxkcmVuRHJhZ2dhYmxlXCJcbiAgICAgIDpsYWJlbD1cImdldEl0ZW1MYWJlbChjaGlsZHJlblNjaGVtYSwgaXRlbS5kYXRhLCB7IGluZGV4IH0pXCJcbiAgICAgIDpsZXZlbD1cImxldmVsICsgMVwiXG4gICAgKVxuICAgIC8vLSBUT0RPOiBDb252ZXJ0IGRpdG8tdHJlZS1pdGVtIHRvIHVzZSBkaXRvLWxhYmVsIGludGVybmFsbHksIGFuZCB0aGVuXG4gICAgLy8tIHBhc3MgYGFzT2JqZWN0OiB0cnVlYCBpbiB0aGUgYGdldEl0ZW1MYWJlbCgpYCBjYWxsIGFib3ZlLlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXROYW1lZFNjaGVtYXMsIGhhc0Zvcm1TY2hlbWEgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RyZWVJdGVtJywge1xuICBtaXhpbnM6IFtTb3J0YWJsZU1peGluXSxcbiAgaW5qZWN0OiBbJ2NvbnRhaW5lciddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbQXJyYXksIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBwYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcbiAgICBvcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYWN0aXZlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbGV2ZWw6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVuZWQ6IHRoaXMub3BlbiB8fCB0aGlzLnNjaGVtYS5vcGVuXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbWV0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5tZXRhXG4gICAgfSxcblxuICAgIHN0b3JlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnN0b3JlXG4gICAgfSxcblxuICAgIGRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRpc2FibGVkXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiBnZXROYW1lZFNjaGVtYXModGhpcy5zY2hlbWEucHJvcGVydGllcylcbiAgICB9LFxuXG4gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgbmFtZWQgYHNvdXJjZVNjaGVtYWAgaW5zdGVhZD8gVXNlIFNvdXJjZU1peGluP1xuICAgIGNoaWxkcmVuU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmNoaWxkcmVuXG4gICAgfSxcblxuICAgIGNoaWxkcmVuTGlzdCgpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNoaWxkcmVuU2NoZW1hPy5uYW1lXG4gICAgICByZXR1cm4gbmFtZSAmJiB0aGlzLmRhdGFbbmFtZV1cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5EcmFnZ2FibGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoID4gMSAmJlxuICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdkcmFnZ2FibGUnLCB7XG4gICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuY2hpbGRyZW5TY2hlbWFcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgbnVtQ2hpbGRyZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbkxpc3Q/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bVByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzPy5sZW5ndGggfHwgMFxuICAgIH0sXG5cbiAgICBudW1FbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtUHJvcGVydGllcyArIHRoaXMubnVtQ2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5JdGVtcygpIHtcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdCB9ID0gdGhpc1xuICAgICAgaWYgKGNoaWxkcmVuU2NoZW1hICYmIGNoaWxkcmVuTGlzdCkge1xuICAgICAgICBjb25zdCB7IGVkaXRQYXRoIH0gPSB0aGlzLmNvbnRhaW5lclxuICAgICAgICBjb25zdCBjaGlsZHJlbk9wZW4gPSAhdGhpcy5wYXRoICYmIGNoaWxkcmVuU2NoZW1hLm9wZW5cbiAgICAgICAgLy8gQnVpbGQgYSBjaGlsZHJlbiBsaXN0IHdpdGggY2hpbGQgbWV0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcihcbiAgICAgICAgICBjaGlsZHJlblNjaGVtYSxcbiAgICAgICAgICBjaGlsZHJlbkxpc3QubWFwKChkYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IChcbiAgICAgICAgICAgICAgY2hpbGRyZW5TY2hlbWEucGF0aCAmJlxuICAgICAgICAgICAgICBgJHt0aGlzLnBhdGh9LyR7Y2hpbGRyZW5TY2hlbWEucGF0aH0vJHtpbmRleH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcGVuID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlbk9wZW4gfHxcbiAgICAgICAgICAgICAgLy8gT25seSBjb3VudCBhcyBcImluIGVkaXQgcGF0aFwiIHdoZW4gaXQncyBub3QgdGhlIGZ1bGwgZWRpdCBwYXRoLlxuICAgICAgICAgICAgICBlZGl0UGF0aC5zdGFydHNXaXRoKHBhdGgpICYmIHBhdGgubGVuZ3RoIDwgZWRpdFBhdGgubGVuZ3RoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBhY3RpdmUgPSBlZGl0UGF0aCA9PT0gcGF0aFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgb3BlbixcbiAgICAgICAgICAgICAgYWN0aXZlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtdXG4gICAgfSxcblxuICAgIGRldGFpbHMoKSB7XG4gICAgICBjb25zdCB7IG51bUNoaWxkcmVuIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBudW1DaGlsZHJlbiAmJlxuICAgICAgICBgJHtudW1DaGlsZHJlbn0gJHtcbiAgICAgICAgICBudW1DaGlsZHJlbiA9PT0gMSA/ICdpdGVtJyA6ICdpdGVtcydcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcmFnZ2FibGUgfHwgdGhpcy5lZGl0YWJsZSB8fCB0aGlzLmRlbGV0YWJsZVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTdXBwb3J0IGNyZWF0YWJsZSFcbiAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgY3JlYXRhYmxlLCBlZGl0YWJsZSBhbmQgZGVsZXRhYmxlIG92ZXJyaWRlcyBvbiB0aGVcbiAgICAvLyBhc3NvY2lhdGVkIGZvcm1zLCBqdXN0IGxpa2UgaW4gYFR5cGVMaXN0YCBhbmQgYFR5cGVPYmplY3RgLCB0aHJvdWdoXG4gICAgLy8gYERpdG9FZGl0QnV0dG9uc2AuIEl0IHdvdWxkIGJlIGJlc3QgdG8gdXNlIGBEaXRvRWRpdEJ1dHRvbnNgIGhlcmUgdG9vLlxuICAgIGNyZWF0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NyZWF0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChjcmVhdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZWRpdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdlZGl0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWRpdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRlbGV0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlbGV0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBwcm9wZXJ0eS5uYW1lKVxuICAgIH0sXG5cbiAgICBvbkVkaXQoKSB7XG4gICAgICAvLyBBbGwgd2UgZ290IHRvIGRvIGlzIHB1c2ggdGhlIHJpZ2h0IGVkaXQgcGF0aCB0byB0aGUgcm91dGVyLCB0aGUgcmVzdFxuICAgICAgLy8gaXMgaGFuZGxlZCBieSBvdXIgcm91dGVzLCBhbGxvd2luZyByZWxvYWRzIGFzIHdlbGwuXG4gICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7XG4gICAgICAgIHBhdGg6IGAke3RoaXMuY29udGFpbmVyLnBhdGh9JHt0aGlzLnBhdGh9YCxcbiAgICAgICAgLy8gUHJlc2VydmUgY3VycmVudCBxdWVyeVxuICAgICAgICBxdWVyeTogdGhpcy4kcm91dGUucXVlcnlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRGVsZXRlKCkge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm9uQ2hhbmdlKClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10cmVlLWl0ZW0ge1xuICAtLWNoZXZyb24taW5kZW50OiAjeyRjaGV2cm9uLWluZGVudH07XG5cbiAgPiAuZGl0by10cmVlLWhlYWRlciB7XG4gICAgPiAuZGl0by10cmVlLWJyYW5jaCxcbiAgICA+IC5kaXRvLXRyZWUtbGVhZiB7XG4gICAgICAvLyBVc2UgYC0tbGV2ZWxgIENTUyB2YXJpYWJsZSB0byBjYWxjdWxhdGVkIHRoZSBhY2N1bXVsYXRlZCBpbmRlbnRcbiAgICAgIC8vIHBhZGRpbmcgZGlyZWN0bHkgaW5zdGVhZCBvZiBoYXZpbmcgaXQgYWNjdW11bGF0ZSBpbiBuZXN0ZWQgQ1NTLlxuICAgICAgLy8gVGhpcyB3YXksIHdlIGNhbiBrZWVwIHRoZSAuZGl0by1hY3RpdmUgYXJlYSBjb3ZlciB0aGUgZnVsbCB3aWR0aDpcbiAgICAgIHBhZGRpbmctbGVmdDogY2FsYyh2YXIoLS1jaGV2cm9uLWluZGVudCkgKiAodmFyKC0tbGV2ZWwsIDEpIC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cblxuICAuZGl0by10cmVlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cblxuICAuZGl0by10cmVlLWJyYW5jaCxcbiAgLmRpdG8tdHJlZS1sZWFmIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IGF1dG87XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMXB4IDA7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG4gIH1cblxuICAuZGl0by10cmVlLWxhYmVsLFxuICAuZGl0by10cmVlLWluZm8ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICAuZGl0by10cmVlLWluZm8ge1xuICAgIHBhZGRpbmctbGVmdDogMC4zNWVtO1xuICAgIGNvbG9yOiByZ2JhKCRjb2xvci1ibGFjaywgMC4yKTtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtYXJnaW46IDFweCAwIDFweCAxZW07XG4gIH1cblxuICAuZGl0by10cmVlLWhlYWRlcjpob3ZlciB7XG4gICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgfSAvLyBIaWRlIGJ1dHRvbnMgZHVyaW5nIGRyYWdnaW5nXG4gIH1cblxuICAmLmRpdG8tZHJhZ2dpbmcge1xuICAgIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICAgID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmLmRpdG8tYWN0aXZlIHtcbiAgICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBwYWRkaW5nOiAwICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICAgIG1hcmdpbjogMCAoLSRpbnB1dC1wYWRkaW5nLWhvcik7XG5cbiAgICAgID4gLmRpdG8tdHJlZS1icmFuY2gge1xuICAgICAgICA+IC5kaXRvLWNoZXZyb246OmJlZm9yZSB7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA+ICogPiAuZGl0by10cmVlLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGl0by1wcm9wZXJ0aWVzIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tbGVmdDogJGNoZXZyb24taW5kZW50O1xuXG4gICAgPiB0ciB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICc6ICc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRoZWFkLmRpdG8tdGFibGUtaGVhZFxuICB0clxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1mb3I9XCJjb2x1bW4gaW4gY29sdW1uc1wiXG4gICAgKVxuICAgICAgdGgoXG4gICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoY29sdW1uKVwiXG4gICAgICAgIDpjbGFzcz1cImdldENvbHVtbkNsYXNzKGNvbHVtbilcIlxuICAgICAgKVxuICAgICAgICBSb3V0ZXJMaW5rKFxuICAgICAgICAgIHYtaWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgIHYtc2xvdD1cInsgbmF2aWdhdGUgfVwiXG4gICAgICAgICAgOnRvPVwiZ2V0U29ydExpbmsoY29sdW1uKVwiXG4gICAgICAgICAgY3VzdG9tXG4gICAgICAgIClcbiAgICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDpjbGFzcz1cImdldFNvcnRDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgICAgIEBjbGljaz1cIm5hdmlnYXRlXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICAuZGl0by1vcmRlci1hcnJvd3NcbiAgICAgICAgICAgIHNwYW4ge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgICAgICBzcGFuKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICApIHt7IGdldExhYmVsKGNvbHVtbikgfX1cbiAgICB0aChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEVtcHR5IDxzcGFuPiBpcyBuZWVkZWQgZm9yIHN0eWxpbmcsIHNlZSBfdGFibGUuc2Nzc1xuICAgICAgc3BhblxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJsZUhlYWQnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbHVtbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGhhc0VkaXRCdXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvcnQoKSB7XG4gICAgICBjb25zdCBvcmRlciA9ICh0aGlzLnF1ZXJ5Lm9yZGVyIHx8ICcnKS5zcGxpdCgvXFxzKy8pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBvcmRlclswXSxcbiAgICAgICAgb3JkZXI6IG9yZGVyWzFdXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb2x1bW5DbGFzcyhjb2x1bW4pIHtcbiAgICAgIHJldHVybiBgZGl0by1jb2x1bW4tJHtoeXBoZW5hdGUoY29sdW1uLm5hbWUpfWBcbiAgICB9LFxuXG4gICAgZ2V0U29ydENsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydC5uYW1lID09PSBjb2x1bW4ubmFtZVxuICAgICAgICA/IGBkaXRvLXNlbGVjdGVkIGRpdG8tb3JkZXItJHt0aGlzLnNvcnQub3JkZXJ9YFxuICAgICAgICA6IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0U29ydExpbmsoY29sdW1uKSB7XG4gICAgICAvLyBUb2dnbGUgb3JkZXIgaWYgdGhlIHNhbWUgY29sdW1uIGlzIGNsaWNrZWQgYWdhaW4uXG4gICAgICBjb25zdCBvcmRlciA9XG4gICAgICAgIHRoaXMuc29ydC5uYW1lID09PSBjb2x1bW4ubmFtZSAmJiB0aGlzLnNvcnQub3JkZXIgPT09ICdhc2MnXG4gICAgICAgICAgPyAnZGVzYydcbiAgICAgICAgICA6ICdhc2MnXG4gICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeUxpbmsoe1xuICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICBvcmRlcjogYCR7Y29sdW1uLm5hbWV9ICR7b3JkZXJ9YFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10YWJsZS1oZWFkIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgdHIge1xuICAgIHRoIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgICAgIC5kaXRvLWJ1dHRvbiB7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZywgc2VlIGJlbG93XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICBzcGFuIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAvLyBDb252ZW50aW9uOiBOZXN0ZWQgc3BhbnMgaGFuZGxlIHBhZGRpbmdcbiAgICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAgICAgJjplbXB0eTo6YWZ0ZXIge1xuICAgICAgICAgIC8vIFByZXZlbnQgZW1wdHkgPHRoPiBmcm9tIGNvbGxhcHNpbmdcbiAgICAgICAgICBjb250ZW50OiAnXFwyMDBiJzsgLy8gemVyby13aWR0aCBzcGFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGQoXG4gIDpjbGFzcz1cImNlbGwuY2xhc3NcIlxuICA6c3R5bGU9XCJjZWxsLnN0eWxlXCJcbilcbiAgLy8tIFRPRE86IEltcGxlbWVudCBpbmxpbmVkIGNvbXBvbmVudHMgaW4gY2VsbCBtb2RlIVxuICBjb21wb25lbnQoXG4gICAgdi1pZj1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6aXM9XCJjZWxsLmNvbXBvbmVudFwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG4gIHNwYW4oXG4gICAgdi1lbHNlXG4gICAgdi1odG1sPVwicmVuZGVyQ2VsbChkYXRhKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlQ2VsbCcsIHtcbiAgcHJvcHM6IHtcbiAgICBjZWxsOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbmRlckNlbGwoaXRlbSkge1xuICAgICAgY29uc3QgeyBuYW1lLCByZW5kZXIgfSA9IHRoaXMuY2VsbFxuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW25hbWVdXG4gICAgICByZXR1cm4gcmVuZGVyXG4gICAgICAgID8gcmVuZGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgIGRhdGFQYXRoOiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIDogZXNjYXBlSHRtbCh2YWx1ZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCB7IG5leHRUaWNrLCBkZWZpbmVDb21wb25lbnQsIHJlZiwgcmVhY3RpdmUsIGggfSBmcm9tICd2dWUtZGVtaSc7XG5pbXBvcnQgeyB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB1bnJlZkVsZW1lbnQsIGRlZmF1bHREb2N1bWVudCwgdG9WYWx1ZSwgdXNlVk1vZGVsIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcbmltcG9ydCBTb3J0YWJsZSBmcm9tICdzb3J0YWJsZWpzJztcblxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7XG52YXIgX19zcHJlYWRWYWx1ZXMgPSAoYSwgYikgPT4ge1xuICBmb3IgKHZhciBwcm9wIGluIGIgfHwgKGIgPSB7fSkpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKGIsIHByb3ApKVxuICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICBpZiAoX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoYikpIHtcbiAgICAgIGlmIChfX3Byb3BJc0VudW0uY2FsbChiLCBwcm9wKSlcbiAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICAgIH1cbiAgcmV0dXJuIGE7XG59O1xudmFyIF9fb2JqUmVzdCA9IChzb3VyY2UsIGV4Y2x1ZGUpID0+IHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSAmJiBleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwKVxuICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICBpZiAoc291cmNlICE9IG51bGwgJiYgX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoc291cmNlKSkge1xuICAgICAgaWYgKGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDAgJiYgX19wcm9wSXNFbnVtLmNhbGwoc291cmNlLCBwcm9wKSlcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5mdW5jdGlvbiB1c2VTb3J0YWJsZShlbCwgbGlzdCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBzb3J0YWJsZTtcbiAgY29uc3QgX2EgPSBvcHRpb25zLCB7IGRvY3VtZW50ID0gZGVmYXVsdERvY3VtZW50IH0gPSBfYSwgcmVzZXRPcHRpb25zID0gX19vYmpSZXN0KF9hLCBbXCJkb2N1bWVudFwiXSk7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG9uVXBkYXRlOiAoZSkgPT4ge1xuICAgICAgbW92ZUFycmF5RWxlbWVudChsaXN0LCBlLm9sZEluZGV4LCBlLm5ld0luZGV4KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKSA6IHVucmVmRWxlbWVudChlbCk7XG4gICAgaWYgKCF0YXJnZXQpXG4gICAgICByZXR1cm47XG4gICAgc29ydGFibGUgPSBuZXcgU29ydGFibGUodGFyZ2V0LCBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgZGVmYXVsdE9wdGlvbnMpLCByZXNldE9wdGlvbnMpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcCA9ICgpID0+IHNvcnRhYmxlID09IG51bGwgPyB2b2lkIDAgOiBzb3J0YWJsZS5kZXN0cm95KCk7XG4gIHRyeU9uTW91bnRlZChzdGFydCk7XG4gIHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuICByZXR1cm4geyBzdG9wLCBzdGFydCB9O1xufVxuZnVuY3Rpb24gbW92ZUFycmF5RWxlbWVudChsaXN0LCBmcm9tLCB0bykge1xuICBjb25zdCBhcnJheSA9IHRvVmFsdWUobGlzdCk7XG4gIGlmICh0byA+PSAwICYmIHRvIDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5LnNwbGljZShmcm9tLCAxKVswXTtcbiAgICBuZXh0VGljaygoKSA9PiBhcnJheS5zcGxpY2UodG8sIDAsIGVsZW1lbnQpKTtcbiAgfVxufVxuXG5jb25zdCBVc2VTb3J0YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyAvKiAjX19QVVJFX18gKi8gZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJVc2VTb3J0YWJsZVwiLFxuICBtb2RlbDoge1xuICAgIC8vIENvbXBhdGlibGUgd2l0aCB2dWUyXG4gICAgcHJvcDogXCJtb2RlbFZhbHVlXCIsXG4gICAgZXZlbnQ6IFwidXBkYXRlOm1vZGVsVmFsdWVcIlxuICB9LFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJkaXZcIlxuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBsaXN0ID0gdXNlVk1vZGVsKHByb3BzLCBcIm1vZGVsVmFsdWVcIik7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgZGF0YSA9IHJlYWN0aXZlKHVzZVNvcnRhYmxlKHRhcmdldCwgbGlzdCwgcHJvcHMub3B0aW9ucykpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMudGFnLCB7IHJlZjogdGFyZ2V0IH0sIHNsb3RzLmRlZmF1bHQoZGF0YSkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VTb3J0YWJsZSB9O1xuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblVzZVNvcnRhYmxlKFxuICB2LWlmPVwiZHJhZ2dhYmxlXCJcbiAgOnRhZz1cInRhZ1wiXG4gIDptb2RlbFZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gIDpvcHRpb25zPVwib3B0aW9uc1wiXG4gIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsICRldmVudClcIlxuKVxuICBzbG90XG5jb21wb25lbnQoXG4gIHYtZWxzZVxuICA6aXM9XCJ0YWdcIlxuKVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudCdcbmltcG9ydCB7IFVzZVNvcnRhYmxlIH0gZnJvbSAnQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlU29ydGFibGUvY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9EcmFnZ2FibGUnLCB7XG4gIGNvbXBvbmVudHM6IHsgVXNlU29ydGFibGUgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RpdidcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBkcmFnZ2FibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmZ1bmN0aW9uIERpdG9WTm9kZSh7IHZub2RlIH0pIHtcbiAgcmV0dXJuIHZub2RlXG59XG5cbkRpdG9WTm9kZS5wcm9wcyA9IHtcbiAgdm5vZGU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVm5vZGUnLCBEaXRvVk5vZGUpXG48L3NjcmlwdD5cbiIsIi8vIERpdG9UeXBlQ29tcG9uZW50IGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNvbXBvbmVudCBmb3IgYWxsIG90aGVyIHR5cGVcbi8vIGNvbXBvbmVudHMgaW5zaWRlIHRoZSB0eXBlcy8gZm9sZGVyLiBUaGVyZSdzIGFsc28gYSBzZXBhcmF0ZSBjb25jcmV0ZVxuLy8gYERpdG9UeXBlQ29tcG9uZW50LnZ1ZWAgY29tcG9uZW50LCB1c2UgdG8gcmVuZGVyIGB7IHR5cGU6ICdjb21wb25lbnQnIH1gXG5pbXBvcnQgeyBhc0FycmF5LCBjYW1lbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVHlwZU1peGluIGZyb20gJy4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IHJlZ2lzdGVyVHlwZUNvbXBvbmVudCwgZ2V0VHlwZUNvbXBvbmVudCB9IGZyb20gJy4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBleHRlbmRzOiBEaXRvQ29tcG9uZW50LFxuICBtaXhpbnM6IFtUeXBlTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiBmYWxzZSxcbiAgdGV4dEZpZWxkOiBmYWxzZSxcbiAgLy8gU2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIGFsbCBvZiB0aGVzZSB0aGF0IGFyZSB1c2VkIGJ5IG1vc3QgdHlwZVxuICAvLyBjb21wb25lbnRzLiBUaGVzZSBvbmx5IG5lZWQgZGVmaW5pbmcgaW4gc3ViLWNsYXNzZXMgd2hlbiB0aGV5IGRpZmZlci5cbiAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICBkZWZhdWx0TmVzdGVkOiB0cnVlLFxuICBkZWZhdWx0VmlzaWJsZTogdHJ1ZSxcbiAgZ2VuZXJhdGVMYWJlbDogdHJ1ZSxcbiAgZXhjbHVkZVZhbHVlOiBmYWxzZSxcbiAgaWdub3JlTWlzc2luZ1ZhbHVlOiBudWxsLFxuICBhbGlnbkJvdHRvbTogdHJ1ZSxcbiAgb21pdFBhZGRpbmc6IGZhbHNlLFxuXG4gIGNvbXBvbmVudDogRGl0b0NvbXBvbmVudC5jb21wb25lbnQsXG5cbiAgZ2V0OiBnZXRUeXBlQ29tcG9uZW50LFxuXG4gIHJlZ2lzdGVyKHR5cGVzLCBkZWZpbml0aW9uID0ge30pIHtcbiAgICB0eXBlcyA9IGFzQXJyYXkodHlwZXMpXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoXG4gICAgICBgRGl0b1R5cGUke2NhbWVsaXplKHR5cGVzWzBdLCB0cnVlKX1gLFxuICAgICAgZGVmaW5pdGlvblxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnR5cGU9XCJ0eXBlXCJcbiAgOnRpdGxlPVwidGV4dFwiXG4gIDpjbGFzcz1cImJ1dHRvbkNsYXNzXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnYnV0dG9uJywgJ3N1Ym1pdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gICAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICAgIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICAgIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHZlcmIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmJzW3RoaXMubmFtZV1cbiAgICAgIH0sXG5cbiAgICAgIGJ1dHRvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJiID8gYGRpdG8tYnV0dG9uLSR7dGhpcy52ZXJifWAgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICB0ZXh0OiBnZXRTY2hlbWFBY2Nlc3NvcigndGV4dCcsIHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBnZXQodGV4dCkge1xuICAgICAgICAgIHJldHVybiB0ZXh0IHx8IGxhYmVsaXplKHRoaXMudmVyYilcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIGNsb3NlRm9ybTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Nsb3NlRm9ybScsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIC8vIEBvdmVycmlkZVxuICAgICAgZ2V0RXZlbnRzKCkge1xuICAgICAgICBjb25zdCB7IG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9ID0gdGhpc1xuICAgICAgICByZXR1cm4geyBvbkZvY3VzLCBvbkJsdXIsIG9uQ2xpY2sgfVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgc3VibWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VDb21wb25lbnQ/LnN1Ym1pdCh0aGlzLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgb25DbGljaygpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5lbWl0RXZlbnQoJ2NsaWNrJywge1xuICAgICAgICAgIHBhcmVudDogdGhpcy5zY2hlbWFDb21wb25lbnRcbiAgICAgICAgfSlcbiAgICAgICAgLy8gSGF2ZSBidXR0b25zIHRoYXQgZGVmaW5lIHJlc291cmNlcyBjYWxsIGB0aGlzLnN1Ym1pdCgpYCBieSBkZWZhdWx0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiYgLy8gTWVhbmluZzogZG9uJ3QgcHJldmVudCBkZWZhdWx0LlxuICAgICAgICAgIGhhc1Jlc291cmNlKHRoaXMuc2NoZW1hKVxuICAgICAgICApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmlucHV0LmRpdG8tY2hlY2tib3goXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIHR5cGU9XCJjaGVja2JveFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjaGVja2JveCcsIHtcbiAgbmF0aXZlRmllbGQ6IHRydWVcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jaGVja2JveCB7XG4gIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtMb2FkaW5nTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBhc3luY0RhdGFFbnRyaWVzOiB7fVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlRGF0YVNjaGVtYShzY2hlbWEsIG5hbWUsIHtcbiAgICAgIHJlc29sdmVDb3VudGVyID0gMSxcbiAgICAgIC4uLmxvYWRpbmdPcHRpb25zXG4gICAgfSA9IHt9KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgc2NoZW1hID0geyBkYXRhOiBzY2hlbWEgfVxuICAgICAgfVxuICAgICAgbGV0IHsgZGF0YSA9IHVuZGVmaW5lZCwgZGF0YVBhdGggPSBudWxsIH0gPSBzY2hlbWFcbiAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhc3luYyBkYXRhIGxvYWRpbmcgYWxyZWFkeSBpbiBwcm9jZXNzLlxuICAgICAgY29uc3QgYXN5bmNFbnRyeSA9ICh0aGlzLmFzeW5jRGF0YUVudHJpZXNbbmFtZV0gfHw9IHJlYWN0aXZlKHtcbiAgICAgICAgZGVwZW5kZW5jeUZ1bmN0aW9uOiBudWxsLFxuICAgICAgICByZXNvbHZlQ291bnRlcjogMCxcbiAgICAgICAgcmVzb2x2ZWREYXRhOiBudWxsLFxuICAgICAgICByZXNvbHZpbmc6IGZhbHNlXG4gICAgICB9KSlcbiAgICAgIC8vIElmIHRoZSBkYXRhIGNhbGxiYWNrIHByb3ZpZGVkIGEgZGVwZW5kZW5jeSBmdW5jdGlvbiB3aGVuIGl0IHdhcyBjYWxsZWQsXG4gICAgICAvLyBjYWwgaXQgaW4gZXZlcnkgY2FsbCBvZiBgaGFuZGxlRGF0YVNjaGVtYSgpYCB0byBmb3JjZSBWdWUgdG8ga2VlcCB0cmFja1xuICAgICAgLy8gb2YgdGhlIGFzeW5jIGRlcGVuZGVuY2llcy5cbiAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uPy4odGhpcy5jb250ZXh0KVxuXG4gICAgICBpZiAoYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGRhdGEgd2FzIHJlc29sdmVkIGFscmVhZHksIHJldHVybiBpdCBhbmQgY2xlYXIgdGhlIHZhbHVlIG9uY2VcbiAgICAgICAgLy8gYHJlc29sdmVDb3VudGVyYCByZWFjaGVzIHplcm8uIENvdW50aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGRlcGVuZGluZ1xuICAgICAgICAvLyBvbiB0aGUgdXNlIG9mIGRhdGEgYW5kIHJlYWN0aXZpdHksIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBjb21wdXRlZFxuICAgICAgICAvLyBnZXR0ZXIgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhIGlzIGNoYW5naW5nLiBDbGVhcmluZyB0aGUgcmVzb2x2ZWRcbiAgICAgICAgLy8gZGF0YSB3b3JrcyBiZWNhdXNlIFZ1ZSBjYWNoZXMgdGhlIHJlc3VsdCBvZiBjb21wdXRlZCBnZXR0ZXJzIGFuZCBvbmx5XG4gICAgICAgIC8vIHJlZXZhbHVhdGVzIGlmIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZWQuIFRoaXMgaXMgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgYSBjYWNoZWQgdmFsdWUgaGVyZSBkb2Vzbid0IGJsb2NrIC8gb3ZlcnJpZGUgcmVldmFsdWF0aW9uOlxuICAgICAgICBjb25zdCB7IHJlc29sdmVkRGF0YSB9ID0gYXN5bmNFbnRyeVxuICAgICAgICBpZiAoLS1hc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgY2FsbGluZyB0aGUgZGF0YSBmdW5jdGlvbiB0d2ljZTpcbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmluZykge1xuICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgZGF0YSBmdW5jdGlvbiBpcyBhbm90aGVyIGZ1bmN0aW9uLCB0aGVuIHRoZVxuICAgICAgICAgIC8vIGZpcnN0IGRhdGEgZnVuY3Rpb24gaXMgdGhlcmUgdG8gdHJhY2sgZGVwZW5kZW5jaWVzIGFuZCB0aGUgcmVhbFxuICAgICAgICAgIC8vIGRhdGEgbG9hZGluZyBoYXBwZW5zIGluIHRoZSBmdW5jdGlvbiB0aGF0IGl0IHJldHVybmVkLiBLZWVwIHRyYWNrXG4gICAgICAgICAgLy8gaXQgaW4gYGRlcGVuZGVuY3lGdW5jdGlvbmAgc28gaXQgY2FuIGJlIGNhbGxlZCBvbiBlYWNoIGNhbGwgb2ZcbiAgICAgICAgICAvLyBgaGFuZGxlRGF0YVNjaGVtYSgpYCB0byBrZWVwIHRoZSBkZXBlbmRlbmNpZXMgaW50YWN0LCBhbmQgY2FsbFxuICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiB0aGF0IGl0IHJldHVybmVkIG9uY2UgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YTpcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXN1bHQpKSB7XG4gICAgICAgICAgICBhc3luY0VudHJ5LmRlcGVuZGVuY3lGdW5jdGlvbiA9IGRhdGFcbiAgICAgICAgICAgIGRhdGEgPSByZXN1bHQodGhpcy5jb250ZXh0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGF0YSBpcyBhc3luY2hyb25vdXMsIGl0IGNhbid0IGJlIHJldHVybmVkIHN0cmFpZ2h0IGF3YXkuXG4gICAgICAgICAgLy8gQnV0IHdlIGNhbiBjaGVhdCB1c2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCBgcmVzb2x2ZWREYXRhYCxcbiAgICAgICAgICAvLyB3aGljaCBpcyBnb2luZyB0byByZWNlaXZlIHRoZSBsb2FkZWQgZGF0YSBhc3luY2hyb25vdXNseSxcbiAgICAgICAgICAvLyB0cmlnZ2VyaW5nIGEgcmVjb21wdXRlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGxzXG4gICAgICAgICAgLy8gYGhhbmRsZURhdGFTY2hlbWEoKWAuXG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZpbmcgPSB0cnVlXG4gICAgICAgICAgdGhpcy5yZXNvbHZlRGF0YShkYXRhLCBsb2FkaW5nT3B0aW9ucykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZUNvdW50ZXIgPSByZXNvbHZlQ291bnRlclxuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBkYXRhXG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyBDbGVhciBkYXRhIHVudGlsIHByb21pc2UgaXMgcmVzb2x2ZWQgYW5kIGByZXNvbHZlZERhdGFgIGlzIHNldFxuICAgICAgICAgIGRhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVBhdGgpIHtcbiAgICAgICAgZGF0YSA9IGdldFZhbHVlQXREYXRhUGF0aChcbiAgICAgICAgICB0aGlzLnJvb3REYXRhLFxuICAgICAgICAgIG5vcm1hbGl6ZURhdGFQYXRoKGAke3RoaXMuZGF0YVBhdGh9LyR7ZGF0YVBhdGh9YClcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzb2x2ZURhdGEobG9hZCwgbG9hZGluZ09wdGlvbnMgPSB7fSkge1xuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgbGV0IGRhdGEgPSBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gYXdhaXQgKGlzRnVuY3Rpb24obG9hZCkgPyBsb2FkKCkgOiBsb2FkKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihlcnJvci5tZXNzYWdlIHx8IGVycm9yKVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRGF0YU1peGluIGZyb20gJy4vRGF0YU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IHNldFRlbXBvcmFyeUlkLCBpc1JlZmVyZW5jZSB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNBcnJheSxcbiAgaXNTdHJpbmcsXG4gIGlzRnVuY3Rpb24sXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBsYWJlbGl6ZSxcbiAgZGVib3VuY2VBc3luY1xufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtEYXRhTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc09wdGlvbnM6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2VsZWN0ZWRWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zdCBjb252ZXJ0VmFsdWUgPSB2YWx1ZSA9PlxuICAgICAgICAgIHRoaXMucmVsYXRlXG4gICAgICAgICAgICA/IHRoaXMuaGFzT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGlzQXJyYXkodGhpcy52YWx1ZSlcbiAgICAgICAgICA/IHRoaXMudmFsdWUubWFwKGNvbnZlcnRWYWx1ZSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKVxuICAgICAgICAgIDogY29udmVydFZhbHVlKHRoaXMudmFsdWUpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBXaGVuIHJlbGF0aW5nIGFuZCBhcyBzb29uIGFzIHRoZSBvcHRpb25zIGFyZSBhdmFpbGFibGUuLi5cbiAgICAgICAgICB0aGlzLnJlbGF0ZSAmJlxuICAgICAgICAgIHRoaXMuaGFzT3B0aW9ucyAmJiAoXG4gICAgICAgICAgICAvLyAuLi5pZiB0aGUgdmFsdWUgaXMgZm9yY2VkIHRvIG51bGwgYmVjYXVzZSBhIGRpc2FwcGVhcmVkIG9wdGlvbi4uLlxuICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgLy8gLi4ub3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVmZXJlbmNlLCByZXBsYWNlIGl0IHdpdGggaXRzIG9wdGlvblxuICAgICAgICAgICAgLy8gdmFsdWUsIHNvIHRoYXQgaXQnbGwgaG9sZCBhY3R1YWwgZGF0YSwgbm90IGp1c3QgYSByZWZlcmVuY2UgaWQuXG4gICAgICAgICAgICBpc1JlZmVyZW5jZSh0aGlzLnZhbHVlKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnQgPSB2YWx1ZSA9PlxuICAgICAgICAgIHRoaXMucmVsYXRlXG4gICAgICAgICAgICA/IHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIHRoaXMudmFsdWUgPSBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUubWFwKGNvbnZlcnQpXG4gICAgICAgICAgOiBjb252ZXJ0KHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWxlY3RlZE9wdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHRoaXMuc2VsZWN0ZWRWYWx1ZSlcbiAgICB9LFxuXG4gICAgb3B0aW9ucygpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEodGhpcy5zY2hlbWEub3B0aW9ucywgJ29wdGlvbnMnLCB7XG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAxXG4gICAgICB9KSA/PyBbXVxuICAgICAgaWYgKCFpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb25zIGRhdGEsIHNob3VsZCBiZSBhcnJheTogJHtkYXRhfWApXG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICB0aGlzLmhhc09wdGlvbnMgPSBkYXRhLmxlbmd0aCA+IDBcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NPcHRpb25zKGRhdGEpXG4gICAgfSxcblxuICAgIGFjdGl2ZU9wdGlvbnMoKSB7XG4gICAgICAvLyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gYFR5cGVNdWx0aXNlbGVjdGAgdG8gcmV0dXJuIHRoZSBgc2VhcmNoZWRPcHRpb25zYFxuICAgICAgLy8gd2hlbiBhIHNlYXJjaCBmaWx0ZXIgd2FzIGFwcGxpZWQuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXG4gICAgfSxcblxuICAgIHJlbGF0ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlbGF0ZScsIHtcbiAgICAgIC8vIFRPRE86IENvbnZlcnQgdG8gYHJlbGF0ZUJ5OiAnaWQnYFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgLy8gV2UgY2Fubm90IHVzZSBzY2hlbWEgYWNjZXNzb3IgY2FsbGJhY2sgbWFnaWMgZm9yIGByZWxhdGVgIGFzIHdlIG5lZWRcbiAgICAgIC8vIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50J3MgbGlmZS1zcGFuLCBzZWUgYHByb2Nlc3NEYXRhKClgIGJlbG93LlxuICAgICAgY2FsbGJhY2s6IGZhbHNlXG4gICAgfSksXG5cbiAgICBncm91cEJ5OiBnZXRTY2hlbWFBY2Nlc3NvcignZ3JvdXBCeScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgb3B0aW9ucy5sYWJlbEtleWAgLyBgb3B0aW9uTGFiZWxLZXlgP1xuICAgIG9wdGlvbkxhYmVsOiBnZXRTY2hlbWFBY2Nlc3Nvcignb3B0aW9ucy5sYWJlbCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgLy8gSWYgbm8gYGxhYmVsYCB3YXMgcHJvdmlkZWQgYnV0IHRoZSBvcHRpb25zIGFyZSBvYmplY3RzLCBhc3N1bWUgYVxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlIG9mICdsYWJlbCc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbGFiZWwgfHxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbktleSgnbGFiZWwnKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBvcHRpb25zLnZhbHVlS2V5YCAvIGBvcHRpb25WYWx1ZUtleWA/XG4gICAgb3B0aW9uVmFsdWU6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLnZhbHVlJywge1xuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldCh2YWx1ZSkge1xuICAgICAgICAvLyBJZiBubyBgbGFiZWxgIHdhcyBwcm92aWRlZCBidXQgdGhlIG9wdGlvbnMgYXJlIG9iamVjdHMsIGFzc3VtZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgJ3ZhbHVlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZSB8fFxuICAgICAgICAgIHRoaXMucmVsYXRlICYmICdpZCcgfHxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbktleSgndmFsdWUnKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHNlYXJjaCB0byBgb3B0aW9ucy5zZWFyY2hgP1xuICAgIHNlYXJjaEZpbHRlcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3NlYXJjaCcsIHtcbiAgICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQoc2VhcmNoKSB7XG4gICAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbHRlciwgZGVib3VuY2UgfSA9IGlzRnVuY3Rpb24oc2VhcmNoKVxuICAgICAgICAgICAgPyB7IGZpbHRlcjogc2VhcmNoIH1cbiAgICAgICAgICAgIDogc2VhcmNoXG4gICAgICAgICAgcmV0dXJuIGRlYm91bmNlID8gZGVib3VuY2VBc3luYyhmaWx0ZXIsIGRlYm91bmNlKSA6IGZpbHRlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBncm91cEJ5TGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cEJ5ID8gJ2xhYmVsJyA6IG51bGxcbiAgICB9LFxuXG4gICAgZ3JvdXBCeU9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cEJ5ID8gJ29wdGlvbnMnIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0T3B0aW9uS2V5KGtleSkge1xuICAgICAgY29uc3QgW29wdGlvbl0gPSB0aGlzLmFjdGl2ZU9wdGlvbnNcbiAgICAgIHJldHVybiBpc09iamVjdChvcHRpb24pICYmIGtleSBpbiBvcHRpb24gPyBrZXkgOiBudWxsXG4gICAgfSxcblxuICAgIHByb2Nlc3NPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5yZWxhdGUpIHtcbiAgICAgICAgICAvLyBJZiBpZHMgYXJlIG1pc3NpbmcgYW5kIHdlIHdhbnQgdG8gcmVsYXRlLCBzZXQgdGVtcG9yYXJ5IGlkcy5cbiAgICAgICAgICAvLyBOT1RFOiBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgYWN0dWFsIGRhdGEsIG1ha2luZyBhIGNvcHkgd29uJ3Qgd29ya1xuICAgICAgICAgIC8vIGFzIGl0IHdvbid0IHByb3BhZ2F0ZS5cbiAgICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGRhdGEgaXMgZnJvbSB0aGUgZ3JhcGggdGhhdFxuICAgICAgICAgIC8vIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nLlxuICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghKCdpZCcgaW4gb3B0aW9uKSkge1xuICAgICAgICAgICAgICBzZXRUZW1wb3JhcnlJZChvcHRpb24sICdpZCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwQnkpIHtcbiAgICAgICAgICBjb25zdCBncm91cGVkID0ge31cbiAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0cywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gb3B0aW9uW3RoaXMuZ3JvdXBCeV1cbiAgICAgICAgICAgICAgbGV0IGVudHJ5ID0gZ3JvdXBlZFtncm91cF1cbiAgICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gZ3JvdXBlZFtncm91cF0gPSB7XG4gICAgICAgICAgICAgICAgICBbdGhpcy5ncm91cEJ5TGFiZWxdOiBncm91cCxcbiAgICAgICAgICAgICAgICAgIFt0aGlzLmdyb3VwQnlPcHRpb25zXTogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVudHJ5Lm9wdGlvbnMucHVzaChvcHRpb24pXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW11cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zXG4gICAgfSxcblxuICAgIGhhc09wdGlvbihvcHRpb24pIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKVxuICAgIH0sXG5cbiAgICBnZXRPcHRpb25Gb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgY29uc3QgZmluZE9wdGlvbiA9IChvcHRpb25zLCB2YWx1ZSwgZ3JvdXBCeSkgPT4ge1xuICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBvcHRpb24gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHZhbHVlIGFuZCByZXR1cm4gdGhlXG4gICAgICAgIC8vIHdob2xlIG9iamVjdC5cbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IGZpbmRPcHRpb24ob3B0aW9uLm9wdGlvbnMsIHZhbHVlLCBudWxsKVxuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25WYWx1ZVxuICAgICAgICA/IGZpbmRPcHRpb24odGhpcy5hY3RpdmVPcHRpb25zLCB2YWx1ZSwgdGhpcy5ncm91cEJ5KVxuICAgICAgICA6IHZhbHVlXG4gICAgfSxcblxuICAgIGdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikge1xuICAgICAgY29uc3QgeyBvcHRpb25WYWx1ZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvblZhbHVlKVxuICAgICAgICA/IG9wdGlvbj8uW29wdGlvblZhbHVlXVxuICAgICAgICA6IGlzRnVuY3Rpb24ob3B0aW9uVmFsdWUpXG4gICAgICAgICAgPyBvcHRpb25WYWx1ZS5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG9wdGlvbiB9KSlcbiAgICAgICAgICA6IG9wdGlvblxuICAgIH0sXG5cbiAgICBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9uTGFiZWwgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc1N0cmluZyhvcHRpb25MYWJlbClcbiAgICAgICAgPyBvcHRpb24/LltvcHRpb25MYWJlbF1cbiAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdGlvbkxhYmVsKVxuICAgICAgICAgID8gb3B0aW9uTGFiZWwuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBvcHRpb24gfSkpXG4gICAgICAgICAgOiBsYWJlbGl6ZShgJHtvcHRpb259YClcbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHNjaGVtYSwgdmFsdWUsIGRhdGFQYXRoLCBncmFwaCkge1xuICAgIGlmIChzY2hlbWEucmVsYXRlKSB7XG4gICAgICAvLyBGb3IgaW50ZXJuYWxseSByZWxhdGluZyBkYXRhIChgc2NoZW1hLm9wdGlvbnMuZGF0YVBhdGhgKSwgd2UgbmVlZCB0b1xuICAgICAgLy8gcHJvY2VzcyBib3RoIHRoZSBvcHRpb25zIChmb3IgJyNyZWYnKSBhbmQgdGhlIHZhbHVlICgnI2lkJykuXG4gICAgICAvLyBTZWUgYERhdGFNaXhpbi5oYW5kbGVEYXRhU2NoZW1hKClgOlxuICAgICAgY29uc3QgcGF0aCA9IHNjaGVtYS5vcHRpb25zPy5kYXRhUGF0aFxuICAgICAgY29uc3QgcmVsYXRlZERhdGFQYXRoID0gcGF0aFxuICAgICAgICA/IG5vcm1hbGl6ZURhdGFQYXRoKGAke2RhdGFQYXRofS8ke3BhdGh9YClcbiAgICAgICAgOiBudWxsXG4gICAgICBncmFwaC5hZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpXG4gICAgICBpZiAocmVsYXRlZERhdGFQYXRoKSB7XG4gICAgICAgIGdyYXBoLnNldFNvdXJjZVJlbGF0ZWQocmVsYXRlZERhdGFQYXRoKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCByZWxhdGluZyBvYmplY3RzIHRvIGEgc2hhbGxvdyBjb3B5IHdpdGggb25seSB0aGUgaWQgbGVmdC5cbiAgICAgIC8vIFRPRE86IENvbnZlcnQgdG8gdXNpbmcgYHJlbGF0ZUJ5YDpcbiAgICAgIGNvbnN0IHByb2Nlc3NSZWxhdGUgPSB2YWx1ZSA9PiAodmFsdWUgPyB7IGlkOiB2YWx1ZS5pZCB9IDogdmFsdWUpXG4gICAgICAvLyBTZWxlY3RlZCBvcHRpb25zIGNhbiBiZSBib3RoIG9iamVjdHMgJiBhcnJheXMsIGUuZy4gJ2NoZWNrYm94ZXMnOlxuICAgICAgdmFsdWUgPSBpc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzUmVsYXRlKVxuICAgICAgICA6IHByb2Nlc3NSZWxhdGUodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1jaGVja2JveGVzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1jaGVja2JveChcbiAgICAgICAgcmVmPVwiZWxlbWVudFwiXG4gICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICApXG4gICAgICB8IHt7IGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY2hlY2tib3hlcycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgZGVmYXVsdFZhbHVlOiBbXSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkT3B0aW9uczoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRWYWx1ZSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlKVxuICAgICAgfSxcblxuICAgICAgc2V0KG9wdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBvcHRpb24gfHwgW11cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jaGVja2JveGVzIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICAuZGl0by1jaGVja2JveCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNvZGUoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiY29kZVwiXG4gIDpzdHlsZT1cInN0eWxlXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IENvZGVGbGFzayBmcm9tICdjb2RlZmxhc2snXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29kZScsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCAzXG4gICAgfSxcblxuICAgIHN0eWxlKCkge1xuICAgICAgcmV0dXJuIGBoZWlnaHQ6IGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCBmbGFzayA9IG5ldyBDb2RlRmxhc2sodGhpcy4kcmVmcy5jb2RlLCB7XG4gICAgICBsYW5ndWFnZTogdGhpcy5zY2hlbWEubGFuZ3VhZ2UgfHwgJ2phdmFzY3JpcHQnLFxuICAgICAgdGFiU2l6ZTogdGhpcy5zY2hlbWEuaW5kZW50U2l6ZSB8fCAyLFxuICAgICAgbGluZU51bWJlcnM6IGZhbHNlXG4gICAgfSlcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgIGxldCBpZ25vcmVVcGRhdGUgPSBmYWxzZVxuXG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbkZvY3VzID0gKCkgPT4gdGhpcy5vbkZvY3VzKClcblxuICAgIGNvbnN0IG9uQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIG9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICB0aGlzLmRvbU9uKHRoaXMuJHJlZnMuY29kZS5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLCB7XG4gICAgICBmb2N1czogb25Gb2N1cyxcbiAgICAgIGJsdXI6IG9uQmx1clxuICAgIH0pXG5cbiAgICBjb25zdCBzZXRDb2RlID0gY29kZSA9PiB7XG4gICAgICBpZiAoY29kZSAhPT0gZmxhc2suY29kZSkge1xuICAgICAgICBpZ25vcmVVcGRhdGUgPSB0cnVlXG4gICAgICAgIGZsYXNrLnVwZGF0ZUNvZGUoY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICBpZ25vcmVXYXRjaCA9IHRydWVcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIG9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbGFzay5vblVwZGF0ZSh2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlVXBkYXRlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRWYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy4kd2F0Y2goJ3ZhbHVlJywgdmFsdWUgPT4ge1xuICAgICAgaWYgKGlnbm9yZVdhdGNoKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENvZGUodmFsdWUgfHwgJycpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHNldENvZGUodGhpcy52YWx1ZSB8fCAnJylcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKT8uZm9jdXMoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvZGUge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8vIEZvciBwcm9wZXIgc2l6aW5nIG9mIGNvbnRlbnQgYWxvbmcgd2l0aCA6c3R5bGU9XCJzdHlsZVwiIHNldHRpbmcgYWJvdmUsXG4gIC8vIGZvciBwcm9wZXIgbGluZS1oZWlnaHQgY2FsY3VsYXRpb24uXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuXG4gICYuZGl0by13aWR0aC1maWxsIHtcbiAgICB3aWR0aDogYXV0bztcbiAgfVxuXG4gIC5jb2RlZmxhc2sge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgLy8gSWdub3JlIHRoZSBwYXJlbnQgcGFkZGluZyBkZWZpbmVkIGFib3ZlIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHRvIHNldFxuICAgIC8vIHRoZSBkZXNpcmVkIGhlaWdodCB3aXRoIDpzdHlsZT1cInN0eWxlXCIuXG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICAuY29kZWZsYXNrX190ZXh0YXJlYSxcbiAgLmNvZGVmbGFza19fcHJlIHtcbiAgICAvLyBVc2Ugc2FtZSBwYWRkaW5nIGFzIC5kaXRvLWNvZGVcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19jb2RlLFxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplKTtcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tbGluZS1oZWlnaHQpO1xuICB9XG5cbiAgLmNvZGVmbGFza19fbGluZXMge1xuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by1jb2xvcihcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImNsaWNrXCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgLmRpdG8taW5wdXQoOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IHNob3dQb3B1cCB9XCIpXG4gICAgICBpbnB1dChcbiAgICAgICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cImhleFZhbHVlXCJcbiAgICAgICAgdHlwZT1cImlucHV0XCJcbiAgICAgICAgc2l6ZT1cIjhcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIC5kaXRvLWNvbG9yLXByZXZpZXcuZGl0by1pbmhlcml0LWZvY3VzKFxuICAgICAgICB2LWlmPVwidmFsdWVcIlxuICAgICAgKVxuICAgICAgICBkaXYoOnN0eWxlPVwieyBiYWNrZ3JvdW5kOiBgIyR7aGV4VmFsdWUgfHwgJzAwMDAwMDAwJ31gIH1cIilcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgICAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICBAY2xpY2suc3RvcD1cImNsZWFyXCJcbiAgICAgIClcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIFNrZXRjaFBpY2tlci5kaXRvLWNvbG9yLXBpY2tlcihcbiAgICAgIHYtbW9kZWw9XCJjb2xvclZhbHVlXCJcbiAgICAgIDpkaXNhYmxlQWxwaGE9XCIhYWxwaGFcIlxuICAgICAgOmRpc2FibGVGaWVsZHM9XCIhaW5wdXRzXCJcbiAgICAgIDpwcmVzZXRDb2xvcnM9XCJwcmVzZXRzXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHRpbnljb2xvciBmcm9tICd0aW55Y29sb3IyJ1xuaW1wb3J0IHsgU2tldGNoIGFzIFNrZXRjaFBpY2tlciB9IGZyb20gJ0Bsazc3L3Z1ZTMtY29sb3InXG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBUcmlnZ2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvbG9yJywge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIFNrZXRjaFBpY2tlciB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogZmFsc2UsXG4gICAgICBjb252ZXJ0ZWRIZXhWYWx1ZTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNvbG9yVmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwge31cbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmNvbG9yRm9ybWF0XG4gICAgICAgIGNvbnN0IGtleSA9IChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBOT1RFOiB2dWUzLWNvbG9yIGNhbGxzIGl0ICdoZXgnLCB3aGlsZSB0aW55Y29sb3IgY2FsbHMgaXQgJ2hleDYnXG4gICAgICAgICAgICBoZXg6IHZhbHVlPy5hIDwgMSA/ICdoZXg4JyA6ICdoZXgnLFxuICAgICAgICAgICAgcmdiOiAncmdiYSdcbiAgICAgICAgICB9W2Zvcm1hdF0gfHxcbiAgICAgICAgICBmb3JtYXRcbiAgICAgICAgKVxuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGlueWNvbG9yKHZhbHVlKS50b1N0cmluZyhmb3JtYXQpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGhleFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBudWxsXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gdGlueWNvbG9yKHRoaXMudmFsdWUpXG4gICAgICAgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmNvbnZlcnRlZEhleFZhbHVlID0gY29sb3JcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKGNvbG9yLmdldEFscGhhKCkgPCAxID8gJ2hleDgnIDogJ2hleDYnKVxuICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkSGV4VmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmNvbnZlcnRlZEhleFZhbHVlID0gdmFsdWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVE9ETzogYGZvcm1hdGAgY2xhc2hlcyB3aXRoIFR5cGVNaXhpbi5mb3JtYXQoKWAsIHdoaWNoIHNoYWxsIGJlIHJlbmFtZWRcbiAgICAvLyBzb29uIHRvIGBmb3JtYXRWYWx1ZSgpYC4gUmVuYW1lIGBjb2xvckZvcm1hdGAgYmFjayB0byBgZm9ybWF0YCBhZnRlci5cbiAgICBjb2xvckZvcm1hdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Zvcm1hdCcsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdoZXgnXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dBbHBoYWA/XG4gICAgYWxwaGE6IGdldFNjaGVtYUFjY2Vzc29yKCdhbHBoYScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRzYD9cbiAgICBpbnB1dHM6IGdldFNjaGVtYUFjY2Vzc29yKCdpbnB1dHMnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pLFxuXG4gICAgcHJlc2V0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ3ByZXNldHMnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IFtcbiAgICAgICAgJyNmZmZmZmYnLFxuICAgICAgICAnI2MzYzNjMycsXG4gICAgICAgICcjN2Y3ZjdmJyxcbiAgICAgICAgJyMwMDAwMDAnLFxuICAgICAgICAnIzg4MDAxNScsXG4gICAgICAgICcjZWQxYzI0JyxcbiAgICAgICAgJyNmZjdmMjcnLFxuICAgICAgICAnI2ZmZjIwMCcsXG5cbiAgICAgICAgJyMyMmIxNGMnLFxuICAgICAgICAnIzAwYTJlOCcsXG4gICAgICAgICcjM2Y0OGNjJyxcbiAgICAgICAgJyNhMzQ5YTQnLFxuICAgICAgICAnI2I5N2E1NycsXG4gICAgICAgICcjZmZhZWM5JyxcbiAgICAgICAgJyNmZmM5MGUnLFxuICAgICAgICAnIzAwMDAwMDAwJ1xuICAgICAgXVxuICAgIH0pXG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBmb2N1c2VkKGZvY3VzZWQpIHtcbiAgICAgIGlmICghZm9jdXNlZCAmJiB0aGlzLmNvbnZlcnRlZEhleFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGlueWNvbG9yKGAjJHt0aGlzLmNvbnZlcnRlZEhleFZhbHVlfWApXG4gICAgICAgIGlmIChjb2xvcj8uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IGNvbG9yLnRvU3RyaW5nKHRoaXMuY29sb3JGb3JtYXQpXG4gICAgICAgICAgLy8gVE9ETzogRW1pdCAnaW5wdXQnIGhlcmUgaW5zdGVhZCwgYW5kICdjaGFuZ2UnIGluIGJsdXIsIGxpa2Ugb3RoZXJzLlxuICAgICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGNvbG9yLXN3YXRjaC13aWR0aDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5LXNpemU7XG4kY29sb3Itc3dhdGNoLXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAkYm9yZGVyLXdpZHRoO1xuXG4uZGl0by1jb2xvciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICBpbnB1dCB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYnV0dG9uLWNsZWFyIHtcbiAgICBtYXJnaW4tcmlnaHQ6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gIH1cblxuICAuZGl0by1jb2xvci1waWNrZXIge1xuICAgIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB9XG5cbiAgLmRpdG8tY29sb3ItcHJldmlldyB7XG4gICAgYmFja2dyb3VuZDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5O1xuICAgIGJvcmRlci1sZWZ0OiAkYm9yZGVyLXN0eWxlO1xuXG4gICAgJixcbiAgICBkaXYge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6ICRjb2xvci1zd2F0Y2gtd2lkdGg7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkY29sb3Itc3dhdGNoLXJhZGl1cztcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkY29sb3Itc3dhdGNoLXJhZGl1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgdi1iaW5kPVwiJHByb3BzXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4vLyBUaGlzIGlzIHRoZSBnZW5lcmFsIHB1cnBvc2UgJ2NvbXBvbmVudCcgdHlwZSwgd2hpY2ggY2FuIHJlc29sdmUgdG8gYW55IGN1c3RvbVxuLy8gY29tcG9uZW50IHRocm91Z2ggYHNjaGVtYS5jb21wb25lbnRgLCBzZWUgYHJlc29sdmVTY2hlbWFDb21wb25lbnQoKWAuIFRoaXNcbi8vIGNhbiBiZSB1c2VkIHRvIG5lc3QgYXJiaXRyYXJ5IHZ1ZSBjb21wb25lbnRzIGluIHNjaGVtYTpcbi8vIHtcbi8vICAgdHlwZTogJ2NvbXBvbmVudCcsXG4vLyAgIGNvbXBvbmVudDogaW1wb3J0KCcuL2NvbXBvbmVudCcpXG4vLyB9XG5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IHJlc29sdmVTY2hlbWFDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29tcG9uZW50Jywge1xuICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgYGRlZmF1bHRWYWx1ZTogbnVsbGAgdG8gbm90IHNldCBhbnkgZGF0YSBmb3IgY3VzdG9tXG4gIC8vIGNvbXBvbmVudHMsIHVubGVzcyB0aGV5IHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlLlxuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEpIHtcbiAgICBhd2FpdCByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0cmlnZ2VyIGV2YWx1YXRpb24gb2YgYHZhbHVlYCB0aGF0IGRvc2Ugbm90XG4vLy0gaW52b2x2ZSBhY3R1YWxseSByZW5kZXJpbmcgaXQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCB2aXNpYmxlLlxuaW5wdXQuZGl0by10ZXh0LmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDpuYW1lPVwibmFtZVwiXG4gIHR5cGU9XCJ0ZXh0XCJcbiAgOnZhbHVlPVwidmFsdWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpyZWFkb25seT1cInRydWVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RhdGFNaXhpbi5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnY29tcHV0ZWQnLCAnZGF0YScsICdoaWRkZW4nXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgICBkZWZhdWx0VmlzaWJsZTogZmFsc2UsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzXG4gICAgICAgICAgaWYgKHNjaGVtYS5kYXRhIHx8IHNjaGVtYS5kYXRhUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEoc2NoZW1hLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgICAvLyBNb2RpZnlpbmcgYHRoaXMuZGF0YWAgYmVsb3cgdHJpZ2dlcnMgYW5vdGhlciBjYWxsIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgdmFsdWVgIGdldHRlciwgc28gdXNlIGEgdmFsdWUgb2YgMiBmb3IgYHJlc29sdmVDb3VudGVyYCB0b1xuICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc29sdmVkIGRhdGEgdHdpY2UuXG4gICAgICAgICAgICAgIHJlc29sdmVDb3VudGVyOiAyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuZ2V0LmNhbGwodGhpcylcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGVcbiAgY29tcG9uZW50KFxuICAgIDppcz1cImdldENvbXBvbmVudCh0eXBlKVwiXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJkYXRlVmFsdWVcIlxuICAgIDpsb2NhbGU9XCJsb2NhbGVcIlxuICAgIDpkYXRlRm9ybWF0PVwieyAuLi5hcGkuZm9ybWF0cy5kYXRlLCAuLi5kYXRlRm9ybWF0IH1cIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIERhdGVUaW1lUGlja2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSxcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG9ubHkgaGVyZSBzbyB3ZSBnZXQgcGxhY2Vob2xkZXIgYWRkZWQuIENvbWUgdXAgd2l0aCBhXG4gICAgLy8gYmV0dGVyIHdheSB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgcGVyIGNvbXBvbmVudCAoYSBsaXN0IG9mIGFjdHVhbGx5XG4gICAgLy8gc3VwcG9ydGVkIGF0dHJpYnV0ZXMpXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRhdGVWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRhdGVGb3JtYXQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkYXRlRm9ybWF0Jywge1xuICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldENvbXBvbmVudCh0eXBlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0ZTogJ2RhdGUtcGlja2VyJyxcbiAgICAgICAgICB0aW1lOiAndGltZS1waWNrZXInLFxuICAgICAgICAgIGRhdGV0aW1lOiAnZGF0ZS10aW1lLXBpY2tlcidcbiAgICAgICAgfVt0eXBlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzRGF0ZSh2YWx1ZSkgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogdmFsdWVcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4vUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTY2hlbWFQYXJlbnRNaXhpbiBmcm9tICcuLi9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciwgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYSxcbiAgcHJvY2Vzc0Zvcm1zLFxuICBnZXROYW1lZFNjaGVtYXMsXG4gIGdldEJ1dHRvblNjaGVtYXMsXG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICBnZXRWaWV3U2NoZW1hLFxuICBpc0NvbXBhY3QsXG4gIGlzSW5saW5lZCxcbiAgaXNPYmplY3RTb3VyY2UsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzTnVtYmVyLFxuICBlcXVhbHMsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW1Jlc291cmNlTWl4aW4sIFNjaGVtYVBhcmVudE1peGluXSxcblxuICBkZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gICAgcmV0dXJuIGlzTGlzdFNvdXJjZShzY2hlbWEpID8gW10gOiBudWxsXG4gIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB3cmFwcGVkUHJpbWl0aXZlczogbnVsbCxcbiAgICAgIHVud3JhcHBpbmdQcmltaXRpdmVzOiBmYWxzZSxcbiAgICAgIGlnbm9yZVJvdXRlQ2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIGlzT2JqZWN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgaXNMaXN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzTGlzdFNvdXJjZSh0aGlzLnR5cGUpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmhhc0RhdGEoKVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZhbHVlXG4gICAgfSxcblxuICAgIGlzUmVhZHkoKSB7XG4gICAgICAvLyBMaXN0cyB0aGF0IGhhdmUgbm8gZGF0YSBhbmQgbm8gYXNzb2NpYXRlZCByZXNvdXJjZSBzaG91bGQgc3RpbGwgcmVuZGVyLFxuICAgICAgLy8gYXMgdGhleSBtYXkgYmUgZ2V0dGluZyB0aGVpciBkYXRhIGVsc2V3aGVyZSwgZS5nLiBgY29tcHV0ZSgpYC5cbiAgICAgIHJldHVybiB0aGlzLmhhc0RhdGEgfHwgIXRoaXMucHJvdmlkZXNEYXRhXG4gICAgfSxcblxuICAgIGlzSW5WaWV3KCkge1xuICAgICAgcmV0dXJuICEhdGhpcy52aWV3Q29tcG9uZW50XG4gICAgfSxcblxuICAgIHdyYXBQcmltaXRpdmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLndyYXBQcmltaXRpdmVzXG4gICAgfSxcblxuICAgIGxpc3REYXRhOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy52YWx1ZVxuICAgICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gbGlzdCBhcnJheS5cbiAgICAgICAgICBkYXRhID0gZGF0YSAhPSBudWxsID8gW2RhdGFdIDogW11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBkYXRhIGdldHMgaW5oZXJpdGVkIGZyb20gcGFyZW50LCB1bndyYXBwaW5nIGlzIG5vdCBoYXBwZW5pbmdcbiAgICAgICAgICAvLyBhdCB0aGUgcm9vdCBpbiBgc2V0RGF0YSgpYCwgYnV0IGhlcmUgaW5zdGVhZC5cbiAgICAgICAgICBkYXRhID0gdGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSB8fCBkYXRhXG4gICAgICAgIH1cbiAgICAgICAgZGF0YSB8fD0gW11cbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgICBpZiAodGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcykge1xuICAgICAgICAgICAgLy8gV2UncmUgZG9uZSB1bndyYXBwaW5nIG9uY2UgYGxpc3REYXRhYCBpcyByZWV2YWx1YXRlZCwgc28gc2V0XG4gICAgICAgICAgICAvLyB0aGlzIHRvIGBmYWxzZWAgYWdhaW4uIFNlZSBgd3JhcHBlZFByaW1pdGl2ZXNgIHdhdGNoZXIgYWJvdmUuXG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgdG8gYSBsaXN0IG9mIHdyYXBwZWQgcHJpbWl0aXZlcywgYW5kIHJldHVybiBpdC5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy53cmFwcGVkUHJpbWl0aXZlcyA9IGRhdGEubWFwKHZhbHVlID0+ICh7XG4gICAgICAgICAgICAgIFt3cmFwUHJpbWl0aXZlc106IHZhbHVlXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZFByaW1pdGl2ZXNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMud3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmlzT2JqZWN0U291cmNlXG4gICAgICAgICAgICA/IGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gZGF0YVswXVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogZGF0YVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9iamVjdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gQWx3YXlzIGdvIHRocm91Z2ggYGxpc3REYXRhYCBpbnRlcm5hbGx5LCB3aGljaCBkb2VzIGFsbCB0aGVcbiAgICAgICAgLy8gcHJvY2Vzc2luZyBvZiBgd3JhcFByaW1pdGl2ZXNgLCBldGMuXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3REYXRhWzBdIHx8IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHNldChkYXRhKSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEgPSBkYXRhID8gW2RhdGFdIDogW11cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc291cmNlU2NoZW1hKCkge1xuICAgICAgLy8gVGhlIHNvdXJjZVNjaGVtYSBvZiBhIGxpc3QgaXMgdGhlIGxpc3QncyBzY2hlbWEgaXRzZWxmLlxuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hXG4gICAgfSxcblxuICAgIHBhdGgoKSB7XG4gICAgICAvLyBUaGlzIGlzIHVzZWQgaW4gVHlwZUxpc3QgZm9yIERpdG9Gb3JtQ2hvb3Nlci5cbiAgICAgIHJldHVybiB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aCh0aGlzLnNjaGVtYS5wYXRoKVxuICAgIH0sXG5cbiAgICBkZWZhdWx0UXVlcnkoKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHRPcmRlcjogb3JkZXIgfSA9IHRoaXNcbiAgICAgIHJldHVybiBvcmRlciA/IHsgb3JkZXIgfSA6IHt9XG4gICAgfSxcblxuICAgIHF1ZXJ5OiBnZXRTdG9yZUFjY2Vzc29yKCdxdWVyeScsIHtcbiAgICAgIGdldChxdWVyeSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdFF1ZXJ5LFxuICAgICAgICAgIC4uLnF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHNldChxdWVyeSkge1xuICAgICAgICAvLyBBbHdheXMga2VlcCB0aGUgZGlzcGxheWVkIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gc3luYyB3aXRoIHRoZSBzdG9yZWRcbiAgICAgICAgLy8gb25lcy4gVXNlIHNjb3BlIGFuZCBwYWdlIGZyb20gdGhlIGxpc3Qgc2NoZW1hIGFzIGRlZmF1bHRzLCBidXQgYWxsb3dcbiAgICAgICAgLy8gdGhlIHJvdXRlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gb3ZlcnJpZGUgdGhlbS5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHNjb3BlID0gdGhpcy5kZWZhdWx0U2NvcGU/Lm5hbWUsXG4gICAgICAgICAgcGFnZSA9IHRoaXMuc2NoZW1hLnBhZ2VcbiAgICAgICAgfSA9IHRoaXMucXVlcnlcbiAgICAgICAgLy8gUHJlc2VydmUgLyBtZXJnZSBjdXJyZW50bHkgc3RvcmVkIHZhbHVlcy5cbiAgICAgICAgcXVlcnkgPSB7XG4gICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAuLi4oc2NvcGUgIT0gbnVsbCAmJiB7IHNjb3BlIH0pLFxuICAgICAgICAgIC4uLihwYWdlICE9IG51bGwgJiYgeyBwYWdlIH0pLFxuICAgICAgICAgIC4uLnF1ZXJ5XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlcXVhbHMocXVlcnksIHRoaXMuJHJvdXRlLnF1ZXJ5KSkge1xuICAgICAgICAgIC8vIFRlbGwgdGhlIGAkcm91dGVgIHdhdGNoZXIgdG8gaWdub3JlIHRoZSBjaGFuZ2VkIHRyaWdnZXJlZCBoZXJlOlxuICAgICAgICAgIHRoaXMuaWdub3JlUm91dGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoeyBxdWVyeSwgaGFzaDogdGhpcy4kcm91dGUuaGFzaCB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeSAvLyBMZXQgZ2V0U3RvcmVBY2Nlc3NvcigpIGRvIHRoZSBhY3R1YWwgc2V0dGluZ1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgdG90YWw6IGdldFN0b3JlQWNjZXNzb3IoJ3RvdGFsJyksXG5cbiAgICBjb2x1bW5zKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5jb2x1bW5zKVxuICAgIH0sXG5cbiAgICBzY29wZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnNjb3BlcylcbiAgICB9LFxuXG4gICAgZGVmYXVsdFNjb3BlKCkge1xuICAgICAgbGV0IGZpcnN0ID0gbnVsbFxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNjb3BlcykpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuZGVmYXVsdFNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGRlZmF1bHRPcmRlcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0U29ydCB9ID0gY29sdW1uXG4gICAgICAgICAgaWYgKGRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1N0cmluZyhkZWZhdWx0U29ydCkgPyBkZWZhdWx0U29ydCA6ICdhc2MnXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29sdW1uLm5hbWV9ICR7ZGlyZWN0aW9ufWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KSlcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGlua2VkIHZpZXcgc2NoZW1hIGlmIHRoaXMgc291cmNlIGVkaXRzIGl0IGl0cyBpdGVtcyB0aHJvdWdoXG4gICAgLy8gYSBsaW5rZWQgdmlldy5cbiAgICB2aWV3KCkge1xuICAgICAgcmV0dXJuIGdldFZpZXdTY2hlbWEodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgbGlua3NUb1ZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbXBvbmVudHMgPSB7XG4gICd0ZXh0JyhmaWx0ZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvbnRhaW5zJyxcbiAgICAgICAgdmFsdWU6ICdjb250YWlucydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZXF1YWxzJyxcbiAgICAgICAgdmFsdWU6ICdlcXVhbHMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N0YXJ0cyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdzdGFydHMtd2l0aCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZW5kcyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdlbmRzLXdpdGgnXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogaXNBcnJheShmaWx0ZXIub3BlcmF0b3JzKVxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IGZpbHRlci5vcGVyYXRvcnMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLFxuICAgICAgICAgICAgd2lkdGg6ICc0MCUnXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgd2lkdGg6IGZpbHRlci5vcGVyYXRvcnMgPyAnNjAlJyA6ICdmaWxsJ1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzUGFuZWwoZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIHR5cGU6ICdwYW5lbCcsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBuYW1lOiAnJGZpbHRlcnMnLFxuICAgIHRhcmdldDogZGF0YVBhdGgsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBwcm94eS5xdWVyeVxuICAgICAgKVxuICAgIH0sXG4gICAgY29tcG9uZW50czogZ2V0RmlsdGVyc0NvbXBvbmVudHMoZmlsdGVycyksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xlYXI6IHtcbiAgICAgICAgdGV4dDogJ0NsZWFyJyxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgY2xpY2soeyBzY2hlbWFDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50LnJlc2V0RGF0YSgpXG4gICAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGZpbHRlcjoge1xuICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgdGV4dDogJ0ZpbHRlcicsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAgIHNjaGVtYUNvbXBvbmVudC5hcHBseUZpbHRlcnMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgYXBwbHlGaWx0ZXJzKCkge1xuICAgICAgICBwcm94eS5xdWVyeSA9IHtcbiAgICAgICAgICAuLi5wcm94eS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IGZvcm1hdEZpbHRlcnNEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpLFxuICAgICAgICAgIC8vIENsZWFyIHBhZ2luYXRpb24gd2hlbiBhcHBseWluZyBvciBjbGVhcmluZyBmaWx0ZXJzOlxuICAgICAgICAgIHBhZ2U6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYW5lbFxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJzKSB7XG4gIGNvbnN0IGNvbXBzID0ge31cbiAgZm9yIChjb25zdCBmaWx0ZXIgb2YgT2JqZWN0LnZhbHVlcyhmaWx0ZXJzIHx8IHt9KSkge1xuICAgIC8vIFN1cHBvcnQgYm90aCBjdXN0b20gZm9ybXMgYW5kIGRlZmF1bHQgZmlsdGVyIGNvbXBvbmVudHMsIHRocm91Z2ggdGhlXG4gICAgLy8gYGZpbHRlckNvbXBvbmVudHNgIHJlZ2lzdHJ5LiBFdmVuIGZvciBkZWZhdWx0IGZpbHRlcnMsIHN0aWxsIHVzZSB0aGVcbiAgICAvLyBwcm9wZXJ0aWVzIGluIGBmaWx0ZXJgIGFzIHRoZSBiYXNlIGZvciBgZm9ybWAsIHNvIHRoaW5ncyBsaWtlIGBsYWJlbGBcbiAgICAvLyBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgcmVzdWx0aW5nIGZvcm0uXG4gICAgY29uc3QgeyBmaWx0ZXI6IHR5cGUsIC4uLmZvcm0gfSA9IGZpbHRlclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlXG4gICAgICA/IGZpbHRlckNvbXBvbmVudHNbdHlwZV0/LihmaWx0ZXIpXG4gICAgICA6IGZpbHRlci5jb21wb25lbnRzXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvcm0udHlwZSA9ICdmb3JtJ1xuICAgICAgZm9ybS5jb21wb25lbnRzID0ge31cbiAgICAgIC8vIENvbnZlcnQgbGFiZWxzIHRvIHBsYWNlaG9sZGVyczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjb21wb25lbnQubGFiZWwgfHwgbGFiZWxpemUoY29tcG9uZW50Lm5hbWUgfHwga2V5KVxuICAgICAgICAgIGZvcm0uY29tcG9uZW50c1trZXldID0ge1xuICAgICAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wc1tmaWx0ZXIubmFtZV0gPSB7XG4gICAgICAgIGxhYmVsOiBmb3JtLmxhYmVsLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KSxcbiAgICAgICAgZm9ybSxcbiAgICAgICAgaW5saW5lZDogdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZpbHRlciAnJHtmaWx0ZXIubmFtZX0nOiBVbmtub3duIGZpbHRlciB0eXBlICcke3R5cGV9Jy5gXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wc1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkge1xuICBjb25zdCBjb21wb25lbnQgPSBzY2hlbWEuY29tcG9uZW50c1tuYW1lXVxuICByZXR1cm4gY29tcG9uZW50Py5mb3JtPy5jb21wb25lbnRzXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbHRlcnNEYXRhKHNjaGVtYSwgZGF0YSkge1xuICBjb25zdCBmaWx0ZXJzID0gW11cbiAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICBjb25zdCBlbnRyeSA9IGRhdGFbbmFtZV1cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIC8vIE1hcCBjb21wb25lbnRzIHNlcXVlbmNlIHRvIGFyZ3VtZW50czpcbiAgICAgIGNvbnN0IGFyZ3MgPSBPYmplY3Qua2V5cyhnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkpLm1hcChcbiAgICAgICAga2V5ID0+IGVudHJ5W2tleV0gPz8gbnVsbFxuICAgICAgKVxuICAgICAgLy8gT25seSBhcHBseSBmaWx0ZXIgaWYgdGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHRoYXQgYXJlbid0IG51bGw6XG4gICAgICBpZiAoYXJncy5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICBmaWx0ZXJzLnB1c2goYCR7bmFtZX06JHthcmdzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbignLCcpfWApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJzLmxlbmd0aCA/IGZpbHRlcnMgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXJzRGF0YShzY2hlbWEsIHF1ZXJ5KSB7XG4gIGNvbnN0IGZpbHRlcnMgPSB7fVxuICAvLyBTYW1lIGFzIEBkaXRvanMvc2VydmVyJ3MgUXVlcnlQYXJhbWV0ZXJzLmZpbHRlcjogVHJhbnNsYXRlIHRoZSBzdHJpbmcgZGF0YVxuICAvLyBmcm9tICRyb3V0ZS5xdWVyeSBiYWNrIHRvIHBhcmFtIGxpc3RzIHBlciBmaWx0ZXI6XG4gIGlmIChxdWVyeSkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGFzQXJyYXkocXVlcnkuZmlsdGVyKSkge1xuICAgICAgY29uc3QgWywgbmFtZSwganNvbl0gPSBmaWx0ZXIubWF0Y2goL14oXFx3Kyk6KC4qKSQvKVxuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsdGVyc1tuYW1lXSA9IGFzQXJyYXkoSlNPTi5wYXJzZShgWyR7anNvbn1dYCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICB9XG4gIH1cbiAgY29uc3QgZmlsdGVyc0RhdGEgPSB7fVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gc2NoZW1hLmNvbXBvbmVudHMpIHtcbiAgICBjb25zdCBkYXRhID0ge31cbiAgICAvLyBJZiB3ZSBoYXZlIHJldHJpZXZlZCBwYXJhbXMgZnJvbSB0aGUgcXVlcnksIGZldGNoIHRoZSBhc3NvY2lhdGVkXG4gICAgLy8gZm9ybSBjb21wb25lbnRzIHNvIHdlIGNhbiBtYXAgdGhlIHZhbHVlcyBiYWNrIHRvIG9iamVjdCBrZXlzOlxuICAgIGNvbnN0IGFyZ3MgPSBmaWx0ZXJzW25hbWVdXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSlcbiAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgICAgIGRhdGFba2V5XSA9IGFyZ3NbaW5kZXgrK11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJzRGF0YVtuYW1lXSA9IGRhdGFcbiAgfVxuICByZXR1cm4gZmlsdGVyc0RhdGFcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1saXN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwic2NoZW1hLmNsYXNzXCJcbiAgOnN0eWxlPVwic2NoZW1hLnN0eWxlXCJcbilcbiAgLmRpdG8tbmF2aWdhdGlvbihcbiAgICB2LWlmPVwic2NvcGVzIHx8IGhhc1BhZ2luYXRpb25cIlxuICApXG4gICAgRGl0b1Njb3BlcyhcbiAgICAgIHYtaWY9XCJzY29wZXNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOnNjb3Blcz1cInNjb3Blc1wiXG4gICAgKVxuICAgIC8vLSBXaGVuIHRoZXJlJ3Mgb25seSBwYWdpbmF0aW9uIHdpdGhvdXQgc2NvcGVzLCB3ZSBuZWVkIGEgZ29vZCBvbCcgc3BhY2VyXG4gICAgLy8tIGRpdiwgZm9yIHRoZSBsYXlvdXQgbm90IHRvIGJyZWFrLi4uXG4gICAgLmRpdG8tc3BhY2VyKFxuICAgICAgdi1lbHNlLWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgKVxuICAgIERpdG9QYWdpbmF0aW9uKFxuICAgICAgdi1pZj1cImhhc1BhZ2luYXRpb25cIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmxpbWl0PVwicGFnaW5hdGVcIlxuICAgICAgOnRvdGFsPVwidG90YWwgfHwgMFwiXG4gICAgKVxuICB0YWJsZS5kaXRvLXRhYmxlKFxuICAgIDpjbGFzcz1ge1xuICAgICAgJ2RpdG8tdGFibGUtc2VwYXJhdG9ycyc6IGlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWxhcmdlci1wYWRkaW5nJzogaGFzRWRpdEJ1dHRvbnMgJiYgIWlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWFsdGVybmF0ZS1jb2xvcnMnOiAhaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtZXZlbi1jb3VudCc6IGhhc0V2ZW5Db3VudFxuICAgIH1gXG4gIClcbiAgICBEaXRvVGFibGVIZWFkKFxuICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpoYXNFZGl0QnV0dG9ucz1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgRGl0b0RyYWdnYWJsZShcbiAgICAgIHRhZz1cInRib2R5XCJcbiAgICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0RGF0YSwgcGFnaW5hdGlvblJhbmdlKVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhmYWxzZSlcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCJ2YWx1ZSA9PiAobGlzdERhdGEgPSB2YWx1ZSlcIlxuICAgIClcbiAgICAgIHRyKFxuICAgICAgICB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gbGlzdERhdGFcIlxuICAgICAgICA6aWQ9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICA6a2V5PVwiZ2V0SXRlbVVpZChzY2hlbWEsIGl0ZW0pXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBEaXRvVGFibGVDZWxsKFxuICAgICAgICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGNvbHVtbilcIlxuICAgICAgICAgICAgICA6a2V5PVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRDZWxsQ2xhc3MoY29sdW1uKVwiXG4gICAgICAgICAgICAgIDpjZWxsPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgIClcbiAgICAgICAgICB0ZFxuICAgICAgICAgICAgRGl0b1NjaGVtYUlubGluZWQoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc0lubGluZWRcIlxuICAgICAgICAgICAgICA6bGFiZWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4LCBhc09iamVjdDogdHJ1ZSB9KVwiXG4gICAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShpbmRleClcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbXBvbmVudChcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgICAgICAgICAgdi1odG1sPVwicmVuZGVyKGdldENvbnRleHQoaXRlbSwgaW5kZXgpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgaXRlbSwgeyBpbmRleCB9KVwiXG4gICAgICAgICAgICApXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoXG4gICAgICAgICAgdi1pZj1cImhhc0NlbGxFZGl0QnV0dG9uc1wiXG4gICAgICAgIClcbiAgICAgICAgICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoaW5kZXgpXCJcbiAgICAgICAgICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgKVxuICAgIC8vLSBSZW5kZXIgY3JlYXRlIGJ1dHRvbnMgaW5zaWRlIHRhYmxlIHdoZW4gbm90IGluIGEgc2luZ2xlIGNvbXBvbmVudCB2aWV3OlxuICAgIHRmb290KFxuICAgICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmICFzaW5nbGVcIlxuICAgIClcbiAgICAgIHRyXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoOmNvbHNwYW49XCJudW1Db2x1bW5zXCIpXG4gICAgICAgICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgICAgICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgICAgICAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgICAgICAgICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgOmRhdGE9XCJsaXN0RGF0YVwiXG4gICAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIClcbiAgLy8tIFJlbmRlciBjcmVhdGUgYnV0dG9ucyBvdXRzaWRlIHRhYmxlIHdoZW4gaW4gYSBzaW5nbGUgY29tcG9uZW50IHZpZXc6XG4gIERpdG9FZGl0QnV0dG9ucy5kaXRvLWJ1dHRvbnMtbWFpbi5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmIHNpbmdsZVwiXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImxpc3REYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0Vmlld0VkaXRQYXRoLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50LFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRGaWx0ZXJzUGFuZWwgfSBmcm9tICcuLi91dGlscy9maWx0ZXIuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBwaWNrQnksIGVxdWFscywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsaXN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbiwgU29ydGFibGVNaXhpbl0sXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAvLyBObyBuZWVkIGZvciB0cmFuc2Zvcm1hdGlvbiBoZXJlLiBTZWUgVHlwZVRyZWVMaXN0IGZvciBkZXRhaWxzLlxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgZ2V0UGFuZWxTY2hlbWEoc2NoZW1hLCBkYXRhUGF0aCwgc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBmaWx0ZXJzIH0gPSBzY2hlbWFcbiAgICAvLyBTZWUgaWYgdGhpcyBsaXN0IGNvbXBvbmVudCB3YW50cyB0byBkaXNwbGF5IGEgZmlsdGVyIHBhbmVsLCBhbmQgaWYgc28sXG4gICAgLy8gY3JlYXRlIHRoZSBwYW5lbCBzY2hlbWEgZm9yIGl0IHRocm91Z2ggYGdldEZpbHRlcnNQYW5lbCgpYC5cbiAgICBpZiAoZmlsdGVycykge1xuICAgICAgLy8gQXQgdGhlIHRpbWUgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBwYW5lbCBzY2hlbWEsIHRoZSBzY2hlbWFDb21wb25lbnQgaXNcbiAgICAgIC8vIG5vdCBmaWxsZWQgeWV0LCBzbyB3ZSBjYW4ndCBnZXQgdGhlIHRhcmdldCBjb21wb25lbnQgKGRhdGFQYXRoKSByaWdodFxuICAgICAgLy8gYXdheS4gVXNlIGEgcHJveHkgYW5kIGEgZ2V0dGVyIGluc3RlYWQsIHRvIGdldCBhcm91bmQgdGhpczpcbiAgICAgIGNvbnN0IGdldExpc3RDb21wb25lbnQgPSAoKSA9PlxuICAgICAgICBzY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aChcbiAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICBjb21wb25lbnQgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgICApXG5cbiAgICAgIHJldHVybiBnZXRGaWx0ZXJzUGFuZWwoXG4gICAgICAgIGdldE5hbWVkU2NoZW1hcyhmaWx0ZXJzKSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJveHkgdG8gZ2V0IC8gc2V0IHRoZSBxdWVyeSwgc2VlIGdldEZpbHRlcnNQYW5lbCgpXG4gICAgICAgICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldExpc3RDb21wb25lbnQoKT8ucXVlcnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldCBxdWVyeShxdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZ2V0TGlzdENvbXBvbmVudCgpXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmb3IgY29tcGFyaW5nIHdpdGggZXF1YWxzKClcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gb2JqID0+IHBpY2tCeShvYmosIHZhbHVlID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIGlmICghZXF1YWxzKGZpbHRlcihxdWVyeSksIGZpbHRlcihjb21wb25lbnQucXVlcnkpKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5xdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmxvYWREYXRhKGZhbHNlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUGFnaW5hdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRlICYmIHRoaXMudG90YWwgPiB0aGlzLnBhZ2luYXRlXG4gICAgfSxcblxuICAgIGhhc0xpc3RCdXR0b25zKCkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuYnV0dG9uU2NoZW1hcyB8fCB0aGlzLmNyZWF0YWJsZSlcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IGxpc3REYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsaXN0RGF0YS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kZWxldGFibGUgfHxcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0NlbGxFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0lubGluZWQgJiYgdGhpcy5oYXNFZGl0QnV0dG9uc1xuICAgIH0sXG5cbiAgICBoYXNFdmVuQ291bnQoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLmxpc3REYXRhLmxlbmd0aCAlIDIpXG4gICAgfSxcblxuICAgIG51bUNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5jb2x1bW5zID8gT2JqZWN0LmtleXModGhpcy5jb2x1bW5zKS5sZW5ndGggOiAxKSArXG4gICAgICAgICh0aGlzLmhhc0NlbGxFZGl0QnV0dG9ucyA/IDEgOiAwKVxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGF0YVBhdGgoaW5kZXgpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICB9LFxuXG4gICAgZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRWaWV3RWRpdFBhdGgodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dCkgfHwgdGhpcy5wYXRoXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0sIGluZGV4KVxuICAgICAgICByZXR1cm4gYCR7cGF0aH0vJHtpZH1gXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDZWxsQ2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gYGRpdG8tY2VsbC0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIGluZGV4LFxuICAgICAgICBkYXRhUGF0aDogdGhpcy5nZXREYXRhUGF0aChpbmRleClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRmlsdGVyRXJyb3JzKGVycm9ycykge1xuICAgICAgY29uc3QgZmlsdGVyc0RhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgJyRmaWx0ZXJzJylcbiAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0UGFuZWxCeURhdGFQYXRoKGZpbHRlcnNEYXRhUGF0aClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLmNvbHVtbnMpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1saXN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLW5hdmlnYXRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmctYm90dG9tOiAkY29udGVudC1wYWRkaW5nLWhhbGY7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc2NvcGVzLFxuICAgIC5kaXRvLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDAgMSBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgdG8gdGhlIGJvdHRvbTpcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9MYWJlbC5kaXRvLWxhYmVsLWNvbXBvbmVudChcbiAgOmxhYmVsPVwidmFsdWVcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xhYmVsJywge1xuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBhbGlnbkJvdHRvbTogZmFsc2Vcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1sYWJlbC1jb21wb25lbnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDJlbTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbWFya3VwKDppZD1cImRhdGFQYXRoXCIpXG4gIC5kaXRvLW1hcmt1cC10b29sYmFyKDplZGl0b3I9XCJlZGl0b3JcIilcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy10b29sYmFyKFxuICAgICAgdi1pZj1cImdyb3VwZWRCdXR0b25zLmxlbmd0aCA+IDBcIlxuICAgIClcbiAgICAgIC5kaXRvLWJ1dHRvbi1ncm91cChcbiAgICAgICAgdi1mb3I9XCJidXR0b25zIGluIGdyb3VwZWRCdXR0b25zXCJcbiAgICAgIClcbiAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgIHYtZm9yPVwieyBuYW1lLCBpY29uLCBpc0FjdGl2ZSwgb25DbGljayB9IGluIGJ1dHRvbnNcIlxuICAgICAgICAgIDprZXk9XCJuYW1lXCJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuICAgICAgICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICAgICAgICApXG4gICAgICAgICAgSWNvbig6bmFtZT1cImljb25cIilcbiAgRWRpdG9yQ29udGVudC5kaXRvLW1hcmt1cC1lZGl0b3IoXG4gICAgcmVmPVwiZWRpdG9yXCJcbiAgICA6ZWRpdG9yPVwiZWRpdG9yXCJcbiAgICA6c3R5bGU9XCJzdHlsZXNcIlxuICApXG4gIC5kaXRvLXJlc2l6ZShcbiAgICB2LWlmPVwicmVzaXphYmxlXCJcbiAgICBAbW91c2Vkb3duLnN0b3AucHJldmVudD1cIm9uRHJhZ1Jlc2l6ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IEVkaXRvciwgRWRpdG9yQ29udGVudCwgTWFyaywgZ2V0TWFya0F0dHJpYnV0ZXMgfSBmcm9tICdAdGlwdGFwL3Z1ZS0zJ1xuLy8gaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3RpcHRhcC1jb21tYW5kcydcbi8vIEVzc2VudGlhbHM6XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50J1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQnXG4vLyBNYXJrczpcbmltcG9ydCB7IEJvbGQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ib2xkJ1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUnXG5pbXBvcnQgeyBJdGFsaWMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pdGFsaWMnXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGluaydcbmltcG9ydCB7IFN0cmlrZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN0cmlrZSdcbmltcG9ydCB7IFVuZGVybGluZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXVuZGVybGluZSdcbi8vIE5vZGVzOlxuaW1wb3J0IHsgQmxvY2txdW90ZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJsb2NrcXVvdGUnXG5pbXBvcnQgeyBDb2RlQmxvY2sgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrJ1xuaW1wb3J0IHsgSGFyZEJyZWFrIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGFyZC1icmVhaydcbmltcG9ydCB7IEhlYWRpbmcgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oZWFkaW5nJ1xuaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tcGFyYWdyYXBoJ1xuaW1wb3J0IHsgSG9yaXpvbnRhbFJ1bGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ob3Jpem9udGFsLXJ1bGUnXG5pbXBvcnQgeyBPcmRlcmVkTGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLW9yZGVyZWQtbGlzdCdcbmltcG9ydCB7IEJ1bGxldExpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1idWxsZXQtbGlzdCdcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGlzdC1pdGVtJ1xuLy8gVE9ETzpcbi8vIGltcG9ydCB7IEltYWdlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taW1hZ2UnXG4vLyBpbXBvcnQgeyBNZW50aW9uIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbWVudGlvbidcbi8vIGltcG9ydCB7IENvZGVCbG9ja0hpZ2hsaWdodCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2staGlnaGxpZ2h0J1xuLy8gaW1wb3J0IHsgVGFibGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZSdcbi8vIGltcG9ydCB7IFRhYmxlQ2VsbCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWNlbGwnXG4vLyBpbXBvcnQgeyBUYWJsZUhlYWRlciB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWhlYWRlcidcbi8vIGltcG9ydCB7IFRhYmxlTm9kZXMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1ub2Rlcydcbi8vIGltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtcm93J1xuLy8gaW1wb3J0IHsgVGFza0xpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YXNrLWxpc3QnXG4vLyBpbXBvcnQgeyBUYXNrSXRlbSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhc2staXRlbSdcbi8vIFRvb2xzOlxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhpc3RvcnknXG5cbmltcG9ydCB7IEljb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7XG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICB1bmRlcnNjb3JlLFxuICBoeXBoZW5hdGUsXG4gIGRlYm91bmNlLFxuICBjYW1lbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ21hcmt1cCcsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBjb21wb25lbnRzOiB7XG4gICAgRWRpdG9yQ29udGVudCxcbiAgICBJY29uXG4gIH0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRvcjogbnVsbCxcbiAgICAgIGhlaWdodDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDEwXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQgfHwgYGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWFya0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdtYXJrcycsIHtcbiAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgaXRhbGljOiB0cnVlLFxuICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgIHN0cmlrZTogdHJ1ZSxcbiAgICAgICAgc21hbGw6IHRydWUsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICBvbkNsaWNrOiBlZGl0b3IgPT4gdGhpcy5vbkNsaWNrTGluayhlZGl0b3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGJhc2ljTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhlIHBhcmFncmFwaCBjb21tYW5kIGFzIGFjdGl2ZSBpZiBhbnkgb2YgdGhlIGJsb2NrXG4gICAgICAgICAgLy8gY29tbWFuZHMgYXJlIGFsc28gYWN0aXZlOlxuICAgICAgICAgIGlnbm9yZUFjdGl2ZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMub3RoZXJOb2RlQnV0dG9ucy5zb21lKGJ1dHRvbiA9PiBidXR0b24uaXNBY3RpdmUpXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRpbmc6IHtcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdsZXZlbCcsXG4gICAgICAgICAgdmFsdWVzOiBbMSwgMiwgMywgNCwgNSwgNl1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb3RoZXJOb2RlQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ25vZGVzJywge1xuICAgICAgICBidWxsZXRMaXN0OiB0cnVlLFxuICAgICAgICBvcmRlcmVkTGlzdDogdHJ1ZSxcbiAgICAgICAgYmxvY2txdW90ZTogdHJ1ZSxcbiAgICAgICAgY29kZUJsb2NrOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB0b29sQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ3Rvb2xzJywge1xuICAgICAgICB1bmRvOiB0cnVlLFxuICAgICAgICByZWRvOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBncm91cGVkQnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICB9ID0gdGhpc1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICBdLmZpbHRlcihidXR0b25zID0+IGJ1dHRvbnMubGVuZ3RoID4gMClcbiAgICB9LFxuXG4gICAgcGFyc2VPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiB7XG4gICAgICAgICAgJ2NvbGxhcHNlJzogZmFsc2UsXG4gICAgICAgICAgJ3ByZXNlcnZlJzogdHJ1ZSxcbiAgICAgICAgICAncHJlc2VydmUtYWxsJzogJ2Z1bGwnXG4gICAgICAgIH1bdGhpcy53aGl0ZXNwYWNlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlZGl0b3JPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRpdGFibGU6ICF0aGlzLnJlYWR5b25seSxcbiAgICAgICAgYXV0b0ZvY3VzOiB0aGlzLmF1dG9mb2N1cyxcbiAgICAgICAgZGlzYWJsZUlucHV0UnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLmlucHV0LFxuICAgICAgICBkaXNhYmxlUGFzdGVSdWxlczogIXRoaXMuZW5hYmxlUnVsZXMucGFzdGUsXG4gICAgICAgIHBhcnNlT3B0aW9uczogdGhpcy5wYXJzZU9wdGlvbnNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB3aGl0ZXNwYWNlOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2hpdGVzcGFjZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdjb2xsYXBzZSdcbiAgICAgIC8vIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICdjb2xsYXBzZScsICdwcmVzZXJ2ZScsICdwcmVzZXJ2ZS1hbGwnXG4gICAgfSksXG5cbiAgICBlbmFibGVSdWxlczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VuYWJsZVJ1bGVzJywge1xuICAgICAgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlbmFibGVSdWxlcykge1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoZW5hYmxlUnVsZXMpXG4gICAgICAgICAgPyBlbmFibGVSdWxlc1xuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpbnB1dDogISFlbmFibGVSdWxlcyxcbiAgICAgICAgICAgICAgcGFzdGU6ICEhZW5hYmxlUnVsZXNcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVhZHlvbmx5OiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgYXV0b2ZvY3VzOiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgZW5hYmxlUnVsZXM6ICd1cGRhdGVFZGl0b3JPcHRpb25zJ1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlRGVib3VuY2VkID0gZGVib3VuY2UoZWRpdG9yID0+IHtcbiAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKClcbiAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICBvbkNoYW5nZSgpXG4gICAgfSwgMTAwKVxuXG4gICAgY29uc3Qgb25VcGRhdGUgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgc2V0VmFsdWVEZWJvdW5jZWQoZWRpdG9yKVxuICAgICAgdGhpcy5vbklucHV0KClcbiAgICB9XG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSwgZmFsc2UsIHRoaXMucGFyc2VPcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5lZGl0b3JPcHRpb25zLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uVXBkYXRlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5nZXRFeHRlbnNpb25zKCksXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlIHx8ICcnXG4gICAgfSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkRyYWdSZXNpemUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGdldFBvaW50ID0gKHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KSA9PiAoeyB4LCB5IH0pXG5cbiAgICAgIGxldCBwcmV2WSA9IGdldFBvaW50KGV2ZW50KS55XG4gICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuJHJlZnMuZWRpdG9yLiRlbCkuaGVpZ2h0KVxuXG4gICAgICBjb25zdCBtb3VzZW1vdmUgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHsgeSB9ID0gZ2V0UG9pbnQoZXZlbnQpXG4gICAgICAgIGhlaWdodCArPSB5IC0gcHJldllcbiAgICAgICAgcHJldlkgPSB5XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoaGVpZ2h0LCAwKX1weGBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIG1vdXNlbW92ZSxcblxuICAgICAgICBtb3VzZXVwKGV2ZW50KSB7XG4gICAgICAgICAgbW91c2Vtb3ZlKGV2ZW50KVxuICAgICAgICAgIGhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHVwZGF0ZUVkaXRvck9wdGlvbnMoKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRPcHRpb25zKHRoaXMuZWRpdG9yT3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgb25DbGlja0xpbmsoZWRpdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgaHJlZjoge1xuICAgICAgICAgICAgdHlwZTogJ3VybCcsXG4gICAgICAgICAgICBsYWJlbDogJ0xpbmsnLFxuICAgICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgbGFiZWw6ICdUaXRsZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHt9LFxuICAgICAgICAgIGFwcGx5OiB7IHR5cGU6ICdzdWJtaXQnIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgY2xpY2soeyBkaWFsb2dDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudC5yZXNvbHZlKG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGdldE1hcmtBdHRyaWJ1dGVzKHRoaXMuZWRpdG9yLnN0YXRlLCAnbGluaycpXG4gICAgICB9KVxuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IHsgaHJlZiwgdGl0bGUgfSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAvLyBTZWUgaWYgYGhyZWZgIGNhbiBiZSBwYXJzZWQgYXMgYSBVUkwsIGFuZCBpZiBub3QsXG4gICAgICAgICAgLy8gcHJlZml4IGl0IHdpdGggYSBkZWZhdWx0IHByb3RvY29sLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgVVJMKGhyZWYpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBocmVmID0gYGh0dHBzOi8vJHtocmVmfWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnNldExpbmsoeyBocmVmLCB0aXRsZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVuc2V0TGluaygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV4dGVuc2lvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtzID0ge30sXG4gICAgICAgIG5vZGVzID0ge30sXG4gICAgICAgIHRvb2xzID0ge31cbiAgICAgIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gRXNzZW50aWFsczpcbiAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFBhcmFncmFwaCwgLy8gYnV0dG9uIGNhbiBiZSBjb250cm9sbGVkLCBidXQgbm9kZSBuZWVkcyB0byBiZSBvbi5cblxuICAgICAgICAvLyBNYXJrczogYHNjaGVtYS5tYXJrc2BcbiAgICAgICAgbWFya3MuYm9sZCAmJiBCb2xkLFxuICAgICAgICBtYXJrcy5pdGFsaWMgJiYgSXRhbGljLFxuICAgICAgICBtYXJrcy51bmRlcmxpbmUgJiYgVW5kZXJsaW5lLFxuICAgICAgICBtYXJrcy5zdHJpa2UgJiYgU3RyaWtlLFxuICAgICAgICBtYXJrcy5zbWFsbCAmJiBTbWFsbCxcbiAgICAgICAgbWFya3MuY29kZSAmJiBDb2RlLFxuICAgICAgICBtYXJrcy5saW5rICYmIExpbmtXaXRoVGl0bGUsXG5cbiAgICAgICAgLy8gTm9kZXM6IGBzY2hlbWEubm9kZXNgXG4gICAgICAgIG5vZGVzLmJsb2NrcXVvdGUgJiYgQmxvY2txdW90ZSxcbiAgICAgICAgbm9kZXMuY29kZUJsb2NrICYmIENvZGVCbG9jayxcbiAgICAgICAgSGFyZEJyZWFrLCAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbHdheXMgb24/XG4gICAgICAgIG5vZGVzLmhlYWRpbmcgJiYgSGVhZGluZy5jb25maWd1cmUoeyBsZXZlbHM6IG5vZGVzLmhlYWRpbmcgfSksXG4gICAgICAgIG5vZGVzLmhvcml6b250YWxSdWxlICYmIEhvcml6b250YWxSdWxlLFxuICAgICAgICAobm9kZXMub3JkZXJlZExpc3QgfHwgbm9kZXMuYnVsbGV0TGlzdCkgJiYgTGlzdEl0ZW0sXG4gICAgICAgIG5vZGVzLmJ1bGxldExpc3QgJiYgQnVsbGV0TGlzdCxcbiAgICAgICAgbm9kZXMub3JkZXJlZExpc3QgJiYgT3JkZXJlZExpc3QsXG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9JdGVtLFxuICAgICAgICAvLyBub2Rlcy50b2RvTGlzdCAmJiBUb2RvTGlzdCxcblxuICAgICAgICAvLyBUb29sczogYHNjaGVtYS50b29sc2BcbiAgICAgICAgdG9vbHMuaGlzdG9yeSAmJiBIaXN0b3J5XG4gICAgICBdLmZpbHRlcihleHRlbnNpb24gPT4gISFleHRlbnNpb24pXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbnMoc2V0dGluZ3NOYW1lLCBkZXNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXVxuXG4gICAgICBjb25zdCBhZGRCdXR0b24gPSAoeyBuYW1lLCBpY29uLCBhdHRyaWJ1dGVzLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSkgPT4ge1xuICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBpc0FjdGl2ZTogKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaXNBY3RpdmUobmFtZSwgYXR0cmlidXRlcykgJiZcbiAgICAgICAgICAgIChpZ25vcmVBY3RpdmUgPT0gbnVsbCB8fCAhaWdub3JlQWN0aXZlKCkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgdG9nZ2xlJHtjYW1lbGl6ZShuYW1lLCB0cnVlKX1gXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IuY29tbWFuZHNba2V5XSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYXR0cmlidXRlcyA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKClba2V5XShhdHRyaWJ1dGVzKS5mb2N1cygpLnJ1bigpXG4gICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICA/IG9uQ2xpY2sodGhpcy5lZGl0b3IsIGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgOiBjb21tYW5kKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2NoZW1hW3NldHRpbmdzTmFtZV1cbiAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlc2NyaXB0aW9uXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdGlvbnMpKSB7XG4gICAgICAgICAgY29uc3Qgc2V0dGluZ05hbWUgPSBbJ3VuZG8nLCAncmVkbyddLmluY2x1ZGVzKGtleSkgPyAnaGlzdG9yeScgOiBrZXlcbiAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHVuZGVyc2NvcmUoa2V5KVxuICAgICAgICAgIGNvbnN0IGljb24gPSBoeXBoZW5hdGUoa2V5KVxuICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGUsIHZhbHVlcywgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWVzKSAmJiBpc0FycmF5KHNldHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IGhlYWRpbmcgbGV2ZWwgYXR0cnM6XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhZGRCdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGAke2ljb259LSR7dmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgW2F0dHJpYnV0ZV06IHZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRCdXR0b24oeyBuYW1lLCBpY29uLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuXG5jb25zdCBTbWFsbCA9IE1hcmsuY3JlYXRlKHtcbiAgbmFtZTogJ3NtYWxsJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3NtYWxsJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoKSB7XG4gICAgcmV0dXJuIFsnc21hbGwnLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTbWFsbDpcbiAgICAgICAgYXR0cmlidXRlcyA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgTGlua1dpdGhUaXRsZSA9IExpbmsuZXh0ZW5kKHtcbiAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgc2NoZW1hOiB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGhyZWY6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2EnLFxuICAgICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+ICh7XG4gICAgICAgICAgICBocmVmOiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpLFxuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKG5vZGUpIHtcbiAgICAgIHJldHVybiBbJ2EnLCBub2RlLmF0dHJzLCAwXVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1hcmt1cCB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1yZXNpemUge1xuICAgIEBleHRlbmQgJWljb24tcmVzaXplO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdW5zZXQ7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gIH1cblxuICAuUHJvc2VNaXJyb3Ige1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5cbiAgLmRpdG8tbWFya3VwLWVkaXRvciB7XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIC8vIE1vdmUgcGFkZGluZyBcImluc2lkZVwiIGVkaXRvciB0byBjb3JyZWN0bHkgcG9zaXRpb24gc2Nyb2xsYmFyXG4gICAgbWFyZ2luLXJpZ2h0OiAtJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIHBhZGRpbmctcmlnaHQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMtdG9vbGJhciB7XG4gICAgbWFyZ2luOiAkaW5wdXQtcGFkZGluZy12ZXIgMDtcbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMsXG4gIHAsXG4gIHVsLFxuICBvbCxcbiAgcHJlLFxuICBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDFyZW0gMDtcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG4gIH1cblxuICBoMSxcbiAgaDIsXG4gIGgzIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgfVxuXG4gIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICB9XG5cbiAgY29kZSB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICB9XG5cbiAgcHJlIHtcbiAgICBwYWRkaW5nOiAwLjdyZW0gMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcblxuICAgIGNvZGUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgcCBjb2RlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogMCAwLjNyZW07XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gIH1cblxuICBhIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgY29sb3I6IGJsdWU7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIH1cblxuICB1bCxcbiAgb2wge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIGxpIHtcbiAgICAmID4gcCxcbiAgICAmID4gb2wsXG4gICAgJiA+IHVsIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlIHtcbiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICRjb2xvci1saWdodGVyO1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG5cbiAgICBwIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbXVsdGlzZWxlY3QoXG4gIDpjbGFzcz1ge1xuICAgICdkaXRvLW11bHRpc2VsZWN0LXNpbmdsZSc6ICFtdWx0aXBsZSxcbiAgICAnZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlXG4gIH1gXG4pXG4gIFZ1ZU11bHRpc2VsZWN0KFxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgIDpjbGFzcz1cInsgJ211bHRpc2VsZWN0LS1zaG93LWhpZ2hsaWdodCc6IHNob3dIaWdobGlnaHQgfVwiXG4gICAgOnNob3dMYWJlbHM9XCJmYWxzZVwiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIHRhZ1BsYWNlaG9sZGVyPVwiUHJlc3MgZW50ZXIgdG8gYWRkIG5ldyB0YWdcIlxuICAgIDpvcHRpb25zPVwicG9wdWxhdGUgJiYgYWN0aXZlT3B0aW9ucyB8fCBbXVwiXG4gICAgOmN1c3RvbUxhYmVsPVwiZ2V0TGFiZWxGb3JPcHRpb25cIlxuICAgIDp0cmFja0J5PVwib3B0aW9uVmFsdWVcIlxuICAgIDpncm91cExhYmVsPVwiZ3JvdXBCeUxhYmVsXCJcbiAgICA6Z3JvdXBWYWx1ZXM9XCJncm91cEJ5T3B0aW9uc1wiXG4gICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgIDp0YWdnYWJsZT1cInRhZ2dhYmxlXCJcbiAgICA6c2VhcmNoYWJsZT1cInNlYXJjaGFibGVcIlxuICAgIDppbnRlcm5hbFNlYXJjaD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpwcmVzZXJ2ZVNlYXJjaD1cIiEhc2VhcmNoRmlsdGVyXCJcbiAgICA6Y2xlYXJPblNlbGVjdD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpjbG9zZU9uU2VsZWN0PVwiIXN0YXlPcGVuXCJcbiAgICA6bG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG9wZW49XCJvbk9wZW5cIlxuICAgIEBjbG9zZT1cIm9uQ2xvc2VcIlxuICAgIEB0YWc9XCJvbkFkZFRhZ1wiXG4gICAgQHNlYXJjaC1jaGFuZ2U9XCJvblNlYXJjaENoYW5nZVwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgdi1pZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIEBjbGljaz1cImNsZWFyXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcbmltcG9ydCBWdWVNdWx0aXNlbGVjdCBmcm9tICd2dWUtbXVsdGlzZWxlY3QnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaXNCb29sZWFuIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtdWx0aXNlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcbiAgY29tcG9uZW50czogeyBWdWVNdWx0aXNlbGVjdCB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICBzZWFyY2hlZE9wdGlvbnM6IG51bGwsXG4gICAgICBwb3B1bGF0ZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGVcbiAgICAgICAgICA/ICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gb3B0aW9uIGNhbm5vdCBiZSBmb3VuZCwgd2UgbWF5IGJlIGluIHRhZ2dhYmxlIG1vZGUgYW5kXG4gICAgICAgICAgICAgICAgLy8gY2FuIGFkZCBpdC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB8fCB0aGlzLmFkZFRhZ09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBvcHRpb25zIHRoYXQgd2UgY291bGRuJ3QgbWF0Y2guXG4gICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkaXNwbGF5IGFuIGVycm9yIGluc3RlYWQ/XG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRPcHRpb25cbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBvcHRpb25zIG9iamVjdCwgc2luY2UgdnVlLW11bHRpc2VsZWN0IGNhbid0IG1hcCB0aGF0XG4gICAgICAgIC8vIGl0c2VsZiB1bmZvcnR1bmF0ZWx5LiBgdHJhY2stYnlgIGlzIHVzZWQgZm9yIDprZXkgbWFwcGluZyBpdCBzZWVtcy5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKG9wdGlvbiB8fCBbXSkubWFwKHZhbHVlID0+IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpKVxuICAgICAgICAgIDogdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoZWRPcHRpb25zIHx8IHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzZWFyY2hhYmxlOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgdGFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCd0YWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc3RheU9wZW46IGdldFNjaGVtYUFjY2Vzc29yKCdzdGF5T3BlbicsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXIoKSB7XG4gICAgICBsZXQgeyBwbGFjZWhvbGRlciwgc2VhcmNoYWJsZSwgdGFnZ2FibGUgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAoaXNCb29sZWFuKHBsYWNlaG9sZGVyKSkge1xuICAgICAgICBwbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyID8gdW5kZWZpbmVkIDogbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzZWFyY2hhYmxlICYmIHRhZ2dhYmxlXG4gICAgICAgICAgPyBgU2VhcmNoIG9yIGFkZCBhICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgOiBzZWFyY2hhYmxlXG4gICAgICAgICAgICA/IGBTZWxlY3Qgb3Igc2VhcmNoICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICA6IHBsYWNlaG9sZGVyXG4gICAgfSxcblxuICAgIHNob3dIaWdobGlnaHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc01vdW50ZWQgJiYgdGhpcy4kcmVmcy5lbGVtZW50LnBvaW50ZXJEaXJ0eVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaXNNb3VudGVkID0gdHJ1ZVxuICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xuICAgICAgLy8gdnVlLW11bHRpc2VsZWN0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYXV0b2ZvY3VzIGF0dHJpYnV0ZS4gV2UgbmVlZCB0b1xuICAgICAgLy8gaGFuZGxlIGl0IGhlcmUuXG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFkZFRhZ09wdGlvbih0YWcpIHtcbiAgICAgIGlmICh0aGlzLnRhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uTGFiZWwsIG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICAgICAgb3B0aW9uTGFiZWwgJiYgb3B0aW9uVmFsdWVcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF06IHRhZyxcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZWZpbmUgYSBzaW1wbGUgc2NoZW1hIG9wdGlvbiB0byBjb252ZXJ0IHRoZSB0YWcgdmFsdWVcbiAgICAgICAgICAgICAgICAvLyB0byBzb21ldGhpbmcgZWxzZSwgZS5nLiBgdG9UYWc6IHRhZyA9PiB1bmRlcnNjb3JlKHRhZylgXG4gICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXTogdGFnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdGFnXG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIG9wdGlvblxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRyZWZzLmVsZW1lbnQuYWN0aXZhdGUoKVxuICAgIH0sXG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgZmlyZSBibHVyIGV2ZW50cyB3aGlsZSB0aGUgbXVsdGlzZWxlY3QgaXMgb3BlbiAoc2VlXG4gICAgICAvLyBiZWxvdyksIHdlIG5lZWQgdG8gZG8gaXQgaGVyZSwgd2hlbiBpdCdzIGFjdHVhbGx5IGNsb3NlZC5cbiAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICBpZiAoIXRoaXMuJHJlZnMuZWxlbWVudC5pc09wZW4pIHtcbiAgICAgICAgVHlwZU1peGluLm1ldGhvZHMub25CbHVyLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25BZGRUYWcodGFnKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmFkZFRhZ09wdGlvbih0YWcpXG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uU2VhcmNoQ2hhbmdlKHF1ZXJ5KSB7XG4gICAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIpIHtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgLy8gU2V0IGBzZWFyY2hlZE9wdGlvbnNgIHRvIGFuIGVtcHR5IGFycmF5LCBiZWZvcmUgaXQgd2lsbCBiZVxuICAgICAgICAgIC8vIHBvcHVsYXRlZCBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBhY3R1YWwgcmVzdWx0cy5cbiAgICAgICAgICB0aGlzLnNlYXJjaGVkT3B0aW9ucyA9IFtdXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBhd2FpdCB0aGlzLnJlc29sdmVEYXRhKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5zZWFyY2hGaWx0ZXIobmV3IERpdG9Db250ZXh0KHRoaXMsIHsgcXVlcnkgfSkpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFyIGBzZWFyY2hlZE9wdGlvbnNgIHdoZW4gdGhlIHF1ZXJ5IGlzIGNsZWFyZWQuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAndnVlLW11bHRpc2VsZWN0L2Rpc3QvdnVlLW11bHRpc2VsZWN0LmNzcyc7XG5cbiRzcGlubmVyLXdpZHRoOiAkc2VsZWN0LWFycm93LXdpZHRoO1xuJHRhZy1pY29uLXdpZHRoOiAxLjhlbTtcbiR0YWctbWFyZ2luOiAycHg7XG4kdGFnLXBhZGRpbmc6IDNweDtcbiR0YWctbGluZS1oZWlnaHQ6IDFlbTtcblxuLmRpdG8tbXVsdGlzZWxlY3Qge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJi5kaXRvLW11bHRpc2VsZWN0LXNpbmdsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogMTAwJTtcbiAgfVxuXG4gICYuZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogYXV0bztcbiAgfVxuXG4gICYuZGl0by1oYXMtZXJyb3JzIHtcbiAgICAmX190YWdzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbi1jbGVhciB7XG4gICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0IHtcbiAgICAkc2VsZjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiAkY29sb3ItYmxhY2s7XG5cbiAgICAmLS1hY3RpdmUge1xuICAgICAgI3skc2VsZn1fX3BsYWNlaG9sZGVyIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBkaXNwbGF5OiBub25lYCB0byBoaWRlIHBsYWNlLWhvbGRlciwgYXMgdGhlIGxheW91dCB3b3VsZFxuICAgICAgICAvLyBjb2xsYXBzZS5cbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19zaW5nbGUsXG4gICAgICAjeyRzZWxmfV9faW5wdXQge1xuICAgICAgICAvLyBTYWRseSwgdnVlLXNlbGVjdCBzZXRzIGBzdHlsZT1cIndpZHRoXCJgIGluIGFkZGl0aW9uIHRvIHVzaW5nIGNsYXNzZXNcbiAgICAgICAgLy8gc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgICAgd2lkdGg6IHZhcigtLWlucHV0LXdpZHRoKSAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICAgICAgbWFyZ2luOiAtMXB4IDAgMDtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICYjeyRzZWxmfS0tYWJvdmUge1xuICAgICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgfVxuXG4gICAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXItY29sb3I7XG4gICAgICAgICAgbWFyZ2luOiAwIDAgLTFweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFncyB7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBwYWRkaW5nOiAwICRzcGlubmVyLXdpZHRoIDAgMDtcbiAgICAgIC8vIFNvIHRhZ3MgY2FuIGZsb2F0IG9uIG11bHRpcGxlIGxpbmVzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zOlxuICAgICAgcGFkZGluZy1ib3R0b206ICR0YWctbWFyZ2luO1xuICAgIH1cblxuICAgICZfX3RhZyB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgIG1hcmdpbjogJHRhZy1tYXJnaW4gMCAwICR0YWctbWFyZ2luO1xuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZzogJHRhZy1wYWRkaW5nICR0YWctaWNvbi13aWR0aCAkdGFnLXBhZGRpbmcgMC44ZW07XG4gICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIGhlaWdodDogY2FsYygkaW5wdXQtaGVpZ2h0IC0gMiAqICR0YWctcGFkZGluZyk7XG4gICAgfVxuXG4gICAgJl9fdGFncy13cmFwIHtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgfVxuXG4gICAgJl9fc2luZ2xlLFxuICAgICZfX3BsYWNlaG9sZGVyLFxuICAgICZfX2lucHV0IHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1hcmdpbjogMCAwIDFweCAwO1xuICAgICAgLy8gU2FkbHksIHZ1ZS1zZWxlY3Qgc2V0cyBzdHlsZT1cInBhZGRpbmc6IC4uLjtcIiBpbiBhZGRpdGlvbiB0byB1c2luZ1xuICAgICAgLy8gY2xhc3Nlcywgc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nICFpbXBvcnRhbnQ7XG4gICAgICAvLyBTbyBpbnB1dCBjYW4gZmxvYXQgbmV4dCB0byB0YWdzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zIHdpdGhcbiAgICAgIC8vICZfX3RhZ3M6XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlcixcbiAgICAmX19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlciB7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIEVuZm9yY2UgYWN0dWFsIGxpbmUtaGVpZ2h0IGZvciBwb3NpdGlvbmluZy5cbiAgICAgICAgY29udGVudDogJ1xcMjAwYic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0LFxuICAgICZfX3NwaW5uZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIC8vICRib3JkZXItd2lkdGggdG8gcHJldmVudCBtYXNraW5nIGJvcmRlciB3aXRoICZfX3NwaW5uZXJcbiAgICAgIHRvcDogJGJvcmRlci13aWR0aDtcbiAgICAgIHJpZ2h0OiAkYm9yZGVyLXdpZHRoO1xuICAgICAgYm90dG9tOiAkYm9yZGVyLXdpZHRoO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKCRzZWxlY3QtYXJyb3ctd2lkdGggLyAyKTtcblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgICAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgICAgICByaWdodDogY2FsYygtMSAqICRzZWxlY3QtYXJyb3ctc2l6ZSAvIDIpO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3NwaW5uZXIge1xuICAgICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuXG4gICAgICAmOjpiZWZvcmUsXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGxvYWRpbmcgc3Bpbm5lclxuICAgICAgICBib3JkZXItd2lkdGg6IDNweDtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19vcHRpb24ge1xuICAgICAgJG9wdGlvbjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgICAgbWluLWhlaWdodDogdW5zZXQ7XG4gICAgICBoZWlnaHQ6IHVuc2V0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAvLyBJbnN0cnVjdGlvbiB0ZXh0IGZvciBvcHRpb25zXG4gICAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICAgICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBzaG93IHRoZSBoaWdobGlnaHQgb25jZSB0aGUgcHVsbGRvd24gaGFzIHJlY2VpdmVkIG1vdXNlIG9yXG4gICAgICAvLyBrZXlib2FyZCBpbnRlcmFjdGlvbiwgaW4gd2hpY2ggY2FzZSBgJi0tc2hvdy1oaWdobGlnaHRgIHdpbGwgYmUgc2V0LFxuICAgICAgLy8gd2hpY2ggaXMgY29udHJvbGxlZCBieSBgcG9pbnRlckRpcnR5YCBpbiB2dWUtbXVsdGlzZWxlY3QuXG4gICAgICAvLyBVbnRpbCB0aGVuLCBjbGVhciB0aGUgaGlnaGxpZ2h0IHN0eWxlLCBidXQgb25seSBpZiBpdCBpc24ndCBhbHNvXG4gICAgICAvLyBkaXNhYmxlZCBvciBzZWxlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0eWxlLlxuICAgICAgQGF0LXJvb3QgI3skc2VsZn06bm90KCN7JHNlbGZ9LS1zaG93LWhpZ2hsaWdodClcbiAgICAgICAgICAjeyRvcHRpb259Om5vdCgjeyRvcHRpb259LS1kaXNhYmxlZCk6bm90KCN7JG9wdGlvbn0tLXNlbGVjdGVkKSB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgICYtLWhpZ2hsaWdodCB7XG4gICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEBhdC1yb290ICN7JHNlbGZ9I3skc2VsZn0tLXNob3ctaGlnaGxpZ2h0ICN7bGFzdC1zZWxlY3RvcigmKX0ge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYtLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuXG4gICAgICAgICYjeyRvcHRpb259LS1oaWdobGlnaHQge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmLS1kaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFnIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgJl9fdGFnLWljb24ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICAgIHdpZHRoOiAkdGFnLWljb24td2lkdGg7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jbGVhcjtcblxuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3RhZ3MsXG4gICAgJl9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9PSBudWxsID8gdGhpcy52YWx1ZSA6ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdmFsdWUgIT09ICcnXG4gICAgICAgICAgICA/IHRoaXMuaXNJbnRlZ2VyXG4gICAgICAgICAgICAgID8gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlRmxvYXQodmFsdWUpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaXNJbnRlZ2VyKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHN0ZXBWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXAgPT0gbnVsbCAmJiAhdGhpcy5pc0ludGVnZXIgPyAnYW55JyA6IHRoaXMuc3RlcFxuICAgIH0sXG5cbiAgICBkZWNpbWFsczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlY2ltYWxzJywge1xuICAgICAgdHlwZTogTnVtYmVyXG4gICAgfSksXG5cbiAgICBzdGVwOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RlcCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChzdGVwKSB7XG4gICAgICAgIC8vIEZvciBpbnRlZ2Vycywgcm91bmQgdGhlIHN0ZXBzIHRvIHRoZSBuZXh0IGJpZ2dlciBpbnRlZ2VyIHZhbHVlOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgc3RlcCAhPSBudWxsID8gTWF0aC5jZWlsKHN0ZXApIDogc3RlcFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWluOiBnZXRTY2hlbWFBY2Nlc3NvcignbWluJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZ2V0KG1pbikge1xuICAgICAgICBtaW4gPVxuICAgICAgICAgIG1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3JhbmdlJywgeyB0eXBlOiBBcnJheSB9KT8uWzBdXG4gICAgICAgICAgICA6IG1pblxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgbWluICE9IG51bGwgPyBNYXRoLmZsb29yKG1pbikgOiBtaW5cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heDogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtYXgpIHtcbiAgICAgICAgbWF4ID1cbiAgICAgICAgICBtYXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlsxXVxuICAgICAgICAgICAgOiBtYXhcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1heCAhPSBudWxsID8gTWF0aC5jZWlsKG1heCkgOiBtYXhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHJhbmdlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmFuZ2UnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gYHRoaXMubWluYCwgYHRoaXMubWF4YCBhbHJlYWR5IHN1cHBvcnQgYHNjaGVtYS5yYW5nZWAsXG4gICAgICAgIC8vIHNvIHJlZGlyZWN0IHRoZXJlLlxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzXG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/IFttaW4sIG1heF0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG5cbiAgICAgIHNldChyYW5nZSkge1xuICAgICAgICAvLyBQcm92aWRlIGEgc2V0dGVyIHRoYXQgZGVsZWdhdGVzIHRvIGBbdGhpcy5taW4sIHRoaXMubWF4XWAsXG4gICAgICAgIC8vIHNpbmNlIHRob3NlIGFscmVhZHkgaGFuZGxlIGBzY2hlbWEucmFuZ2VgLlxuICAgICAgICBpZiAoaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICA7W3RoaXMubWluLCB0aGlzLm1heF0gPSByYW5nZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHt9XG4gICAgICBjb25zdCB7IHJhbmdlLCBtaW4sIG1heCwgZGVjaW1hbHMsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yYW5nZSA9IHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5taW4gPSBtaW5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5tYXggPSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY2ltYWxzICE9IG51bGwpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuZGVjaW1hbHMgPSBkZWNpbWFsc1xuICAgICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzID0gKGAke3N0ZXB9YC5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGhcbiAgICAgICAgaWYgKGRlY2ltYWxzID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5pbnRlZ2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludGVnZXIpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by1udW1iZXIoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6bWluPVwibWluXCJcbiAgOm1heD1cIm1heFwiXG4gIDpzdGVwPVwic3RlcFZhbHVlXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydudW1iZXInLCAnaW50ZWdlciddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpc0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdpbnRlZ2VyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLy8gT25seSBzaG93IHNwaW4gYnV0dG9ucyBpZiB0aGUgbnVtYmVyIGNvbXBvbmVudCBkZWZpbmVzIGEgc3RlcCBzaXplLlxuaW5wdXRbdHlwZT0nbnVtYmVyJ106bm90KFtzdGVwXSkge1xuICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAmOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW9iamVjdChcbiAgdi1pZj1cImlzUmVhZHlcIlxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cInNjaGVtYS5jbGFzc1wiXG4gIDpzdHlsZT1cInNjaGVtYS5zdHlsZVwiXG4pXG4gIC5kaXRvLW9iamVjdC1jb250ZW50KFxuICAgIHYtaWY9XCJvYmplY3REYXRhXCJcbiAgKVxuICAgIC8vLSBTdXBwb3J0IHRoZSBzYW1lIHJlbmRlcmluZyBvcHRpb25zIGFzIFR5cGVMaXN0OlxuICAgIERpdG9TY2hlbWFJbmxpbmVkKFxuICAgICAgdi1pZj1cImlzSW5saW5lZFwiXG4gICAgICA6bGFiZWw9XCJvYmplY3RMYWJlbFwiXG4gICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBvYmplY3REYXRhLCBjb250ZXh0KVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICApXG4gICAgY29tcG9uZW50KFxuICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgIClcbiAgICBzcGFuKFxuICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgIHYtaHRtbD1cInJlbmRlcihnZXRDb250ZXh0KCkpXCJcbiAgICApXG4gICAgc3BhbihcbiAgICAgIHYtZWxzZVxuICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgb2JqZWN0RGF0YSlcIlxuICAgIClcbiAgRGl0b0VkaXRCdXR0b25zKFxuICAgIDpjcmVhdGFibGU9XCJjcmVhdGFibGVcIlxuICAgIDpkZWxldGFibGU9XCJvYmplY3REYXRhICYmIGRlbGV0YWJsZVwiXG4gICAgOmVkaXRhYmxlPVwib2JqZWN0RGF0YSAmJiBlZGl0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6ZWRpdFBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgIDpwYXRoPVwicGF0aFwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0ob2JqZWN0RGF0YSlcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7IHJlc29sdmVTY2hlbWFDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignb2JqZWN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbl0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgIC8vIE5vIG5lZWQgZm9yIHRyYW5zZm9ybWF0aW9uIGhlcmUuIFNlZSBUeXBlVHJlZUxpc3QgZm9yIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9iamVjdExhYmVsKCkge1xuICAgICAgLy8gT25seSBzaG93IGEgbGFiZWwgaWYgdGhlIG9iamVjdCBpcyBjb2xsYXBzaWJsZS5cbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICAgID8gdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIHRoaXMub2JqZWN0RGF0YSwgeyBhc09iamVjdDogdHJ1ZSB9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgZGF0YTogdGhpcy5vYmplY3REYXRhIH0pXG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1vYmplY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQge1xuICAgIGZsZXg6IDAgMSAxMDAlO1xuICB9XG5cbiAgPiAuZGl0by1idXR0b25zIHtcbiAgICBmbGV4OiAxIDAgMCU7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3BhbmVsJywge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiBmYWxzZSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuICBvbWl0UGFkZGluZzogdHJ1ZSxcblxuICBnZXRQYW5lbFNjaGVtYShzY2hlbWEpIHtcbiAgICAvLyBGb3IgYSBUeXBlUGFuZWwsIHRoZSBjb21wb25lbnQgc2NoZW1hIGlzIGFsc28gdGhlIHBhbmVsIHNjaGVtYSwgYnV0XG4gICAgLy8gcmVtb3ZlIHRoZSBhZGRlZCBuYW1lLCBzbyBpdCBkb2Vzbid0IGdldCBhcHBlbmRlZCB0d2ljZSB0byBkYXRhLXBhdGguXG4gICAgY29uc3QgeyBuYW1lLCAuLi5wYW5lbCB9ID0gc2NoZW1hXG4gICAgcmV0dXJuIHBhbmVsXG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5wcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dmFsdWU9XCJwcm9ncmVzc1ZhbHVlXCJcbiAgOm1heD1cInByb2dyZXNzTWF4XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdwcm9ncmVzcycsIHtcbiAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICBjb21wdXRlZDoge1xuICAgIHByb2dyZXNzVmFsdWUoKSB7XG4gICAgICBsZXQgeyB2YWx1ZSwgcmFuZ2UsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICB2YWx1ZSAtPSByYW5nZVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gc3RlcCkgKiBzdGVwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJydcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBwcm9ncmVzc01heCgpIHtcbiAgICAgIGNvbnN0IHsgcmFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiByYW5nZSA/IHJhbmdlWzFdIC0gcmFuZ2VbMF0gOiBudWxsXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1yYWRpby1idXR0b25zKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1yYWRpby1idXR0b24oXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdyYWRpbycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXJhZGlvLWJ1dHRvbnMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNlY3Rpb24oOmNsYXNzPVwieyAnZGl0by1zZWN0aW9uLWxhYmVsbGVkJzogISFzY2hlbWEubGFiZWwgfVwiKVxuICBEaXRvUGFuZS5kaXRvLXNlY3Rpb24tcGFuZShcbiAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0SXRlbUZvcm1TY2hlbWEsIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlY3Rpb24nLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhc2NoZW1hLm5lc3RlZCAmJiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuICBkZWZhdWx0TmVzdGVkOiBmYWxzZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXN0ZWQgPyB0aGlzLnZhbHVlIDogdGhpcy5kYXRhXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtRm9ybVNjaGVtYVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgICAvLyBQcm9jZXNzIHNlY3Rpb24gY29tcG9uZW50cyBzbyB0aGVpciBmb3JtcyBnZXQgcmVzb2x2ZWQgdG9vLlxuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgc2NoZW1hLCByb3V0ZXMsIGxldmVsKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2VjdGlvbiB7XG4gICYuZGl0by1zZWN0aW9uLWxhYmVsbGVkIHtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBOZXN0aW5nIGlzIG5lZWRlZCB0byBtYWtlIGFuIGFycm93IGFwcGVhciBvdmVyIHRoZSBzZWxlY3QgaXRlbTpcbi5kaXRvLXNlbGVjdFxuICBzZWxlY3QoXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZFZhbHVlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICBAbW91c2Vkb3duPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgICBAZm9jdXM9XCJwb3B1bGF0ZSA9IHRydWVcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwicG9wdWxhdGVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgICAgIClcbiAgICAgICAgb3B0Z3JvdXAoXG4gICAgICAgICAgdi1pZj1cImdyb3VwQnlcIlxuICAgICAgICAgIDpsYWJlbD1cIm9wdGlvbltncm91cEJ5TGFiZWxdXCJcbiAgICAgICAgKVxuICAgICAgICAgIG9wdGlvbihcbiAgICAgICAgICAgIHYtZm9yPVwib3B0IGluIG9wdGlvbltncm91cEJ5T3B0aW9uc11cIlxuICAgICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0KVwiXG4gICAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHQpIH19XG4gICAgICAgIG9wdGlvbihcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWVsc2UtaWY9XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgKVxuICAgICAgb3B0aW9uKDp2YWx1ZT1cInNlbGVjdGVkVmFsdWVcIikge3sgZ2V0TGFiZWxGb3JPcHRpb24oc2VsZWN0ZWRPcHRpb24pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2VsZWN0Jywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIERpc2FibGUgbGF6eS1wb3B1bGF0aW9uIGZvciBub3cuXG4gICAgICAvLyBUT0RPOiBTZXQgdG8gYGZhbHNlYCBPbmNlIGxpbmV0byBlMmUgdGVzdHMgYWRkcmVzcyB0aGVpciBpc3N1ZXMuXG4gICAgICBwb3B1bGF0ZTogdHJ1ZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIFRPRE86IE1vdmUgdG8gZGl0by11aVxuJHNlbGVjdC1hcnJvdy1yaWdodDogY2FsYygoJHNlbGVjdC1hcnJvdy13aWR0aCAtICRzZWxlY3QtYXJyb3ctc2l6ZSkgLyAyKTtcblxuLmRpdG8tc2VsZWN0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgc2VsZWN0IHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkc2VsZWN0LWFycm93LXdpZHRoO1xuICB9XG4gIC8vIEhhbmRsZSAuZGl0by13aWR0aC1maWxsIHNlcGFyYXRlbHkgZHVlIHRvIHJlcXVpcmVkIG5lc3Rpbmcgb2Ygc2VsZWN0OlxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgcmlnaHQ6IGNhbGMoI3skc2VsZWN0LWFycm93LXJpZ2h0fSArICN7JGJvcmRlci13aWR0aH0pO1xuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNsaWRlclxuICBpbnB1dC5kaXRvLXJhbmdlKFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbiAgSW5wdXRGaWVsZC5kaXRvLW51bWJlcihcbiAgICB2LWlmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgICB0eXBlPVwibnVtYmVyXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzbGlkZXInLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRgP1xuICAgIGlucHV0OiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zbGlkZXIge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXJhbmdlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpO1xuICB9XG5cbiAgLmRpdG8tbnVtYmVyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblN3aXRjaEJ1dHRvbi5kaXRvLXN3aXRjaChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgOmxhYmVscz1cImxhYmVsc1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFN3aXRjaEJ1dHRvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3N3aXRjaCcsIHtcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG5cbiAgY29tcG9uZW50czoge1xuICAgIFN3aXRjaEJ1dHRvblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxhYmVsc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by10ZXh0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIDp0eXBlPVwiaW5wdXRUeXBlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5jb25zdCBtYXNrZWRQYXNzd29yZCA9ICcqKioqKioqKioqKioqKioqJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgW1xuICAgICd0ZXh0JyxcbiAgICAnZW1haWwnLFxuICAgICd1cmwnLFxuICAgICdob3N0bmFtZScsXG4gICAgJ2RvbWFpbicsXG4gICAgJ3RlbCcsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnY3JlZGl0Y2FyZCdcbiAgXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcbiAgICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiBzY2hlbWEudHlwZSA9PT0gJ3Bhc3N3b3JkJyxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpbnB1dFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3JlZGl0Y2FyZDogJ3RleHQnLFxuICAgICAgICAgICAgaG9zdG5hbWU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRvbWFpbjogJ3RleHQnXG4gICAgICAgICAgfVt0aGlzLnR5cGVdIHx8XG4gICAgICAgICAgdGhpcy50eXBlXG4gICAgICAgIClcbiAgICAgIH0sXG5cbiAgICAgIGlucHV0VmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnR5cGUgPT09ICdwYXNzd29yZCcgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIXRoaXMuZm9jdXNlZFxuICAgICAgICAgIClcbiAgICAgICAgICAgID8gbWFza2VkUGFzc3dvcmRcbiAgICAgICAgICAgIDogdGhpcy52YWx1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgICBjb25zdCBydWxlID0ge1xuICAgICAgICAgIGVtYWlsOiAnZW1haWwnLFxuICAgICAgICAgIHVybDogJ3VybCcsXG4gICAgICAgICAgaG9zdG5hbWU6ICdob3N0bmFtZScsXG4gICAgICAgICAgZG9tYWluOiAnZG9tYWluJyxcbiAgICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICBjcmVkaXRjYXJkOiAnY3JlZGl0Y2FyZCdcbiAgICAgICAgfVt0aGlzLnR5cGVdXG4gICAgICAgIHJldHVybiBydWxlID8geyBbcnVsZV06IHRydWUgfSA6IHt9XG4gICAgICB9XG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZXh0YXJlYS5kaXRvLXRleHRhcmVhLmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6cm93cz1cImxpbmVzXCJcbiAgOmNsYXNzPVwieyAnZGl0by1yZXNpemFibGUnOiByZXNpemFibGUgfVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd0ZXh0YXJlYScsIHtcbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIHRleHRGaWVsZDogdHJ1ZSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGluZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubGluZXMgfHwgNFxuICAgIH0sXG5cbiAgICByZXNpemFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXNpemFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGV4dGFyZWEge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcmVzaXplOiBub25lO1xuICBtaW4taGVpZ2h0OiBjYWxjKDFlbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSArICN7MiAqICRpbnB1dC1wYWRkaW5nLXZlcn0pO1xuXG4gICYuZGl0by1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogdmVydGljYWw7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJlZS1saXN0XG4gIERpdG9TY29wZXMoXG4gICAgdi1pZj1cInNjb3Blc1wiXG4gICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgIDpzY29wZXM9XCJzY29wZXNcIlxuICApXG4gIC5kaXRvLXRyZWUtcGFuZWxcbiAgICBEaXRvVHJlZUl0ZW0oXG4gICAgICA6c2NoZW1hPVwidHJlZVNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJ0cmVlRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJ0cmVlRGF0YVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDpvcGVuPVwidHJ1ZVwiXG4gICAgKVxuICAgIC5kaXRvLXRyZWUtZm9ybS1jb250YWluZXIoXG4gICAgICB2LWlmPVwiaGFzRWRpdGFibGVGb3Jtc1wiXG4gICAgKVxuICAgICAgLy8tIEluY2x1ZGUgYSByb3V0ZXItdmlldyBmb3IgdGhlIG9wdGlvbmFsIERpdG9Gb3JtSW5saW5lZFxuICAgICAgUm91dGVyVmlld1xuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQge1xuICBoYXNGb3JtU2NoZW1hLFxuICBnZXRGb3JtU2NoZW1hcyxcbiAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWyd0cmVlLWxpc3QnLCAndHJlZS1vYmplY3QnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW1NvdXJjZU1peGluXSxcblxuICAgIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICAgIHByb3ZpZGUoKSB7XG4gICAgICByZXR1cm4geyBjb250YWluZXI6IHRoaXMgfVxuICAgIH0sXG5cbiAgICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlID09PSAndHJlZS1vYmplY3QnID8gJ29iamVjdCcgOiAnbGlzdCdcbiAgICB9LFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5wYXRoYDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGF0aFxuICAgICAgfSxcblxuICAgICAgZWRpdFBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5lZGl0UGF0aGA6XG4gICAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoLnNsaWNlKHRoaXMucGF0aD8ubGVuZ3RoKVxuICAgICAgfSxcblxuICAgICAgdHJlZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8geyBbdGhpcy5uYW1lXTogdGhpcy52YWx1ZSB9XG4gICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICB9LFxuXG4gICAgICB0cmVlRGF0YVBhdGgoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBgbmFtZWAgZnJvbSBgZGF0YVBhdGhgLCBhcyBpdCBpcyBhZGRlZFxuICAgICAgICAvLyB0byBgdHJlZURhdGFgIGFuZCBgdHJlZVNjaGVtYWBcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB0aGlzLmRhdGFQYXRoLnNsaWNlKDAsIHRoaXMuZGF0YVBhdGgubGVuZ3RoIC0gdGhpcy5uYW1lLmxlbmd0aClcbiAgICAgICAgICA6IHRoaXMuZGF0YVBhdGhcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjaGlsZHJlbjoge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnNjaGVtYVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB0aGlzLnNjaGVtYVxuICAgICAgfSxcblxuICAgICAgaGFzRWRpdGFibGVGb3JtcygpIHtcbiAgICAgICAgY29uc3QgaGFzRWRpdGFibGVGb3JtcyA9IHNjaGVtYSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSAmJiAoXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2VkaXRhYmxlJywge1xuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2NoZW1hXG4gICAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICAgIHNjaGVtYS5jaGlsZHJlbiAmJlxuICAgICAgICAgICAgICBoYXNFZGl0YWJsZUZvcm1zKHNjaGVtYS5jaGlsZHJlbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0VkaXRhYmxlRm9ybXModGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWwsXG4gICAgICBuZXN0ZWQgPSB0cnVlLFxuICAgICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgICAgcHJvY2VzcyA9IG51bGxcbiAgICApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLnByb3BlcnRpZXMpLFxuICAgICAgICBTb3VyY2VNaXhpbi5wcm9jZXNzU2NoZW1hKFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgbmVzdGVkLFxuICAgICAgICAgIGZsYXR0ZW4sXG4gICAgICAgICAgLy8gUGFzcyBwcm9jZXNzKCkgdG8gYWRkIG1vcmUgcm91dGVzIHRvIGNoaWxkUm91dGVzOlxuICAgICAgICAgIChjaGlsZFJvdXRlcywgbGV2ZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCBgdHlwZWAgdG8gdGhlIG5lc3RlZCB0cmVlIGxpc3QuXG4gICAgICAgICAgICAgIGNoaWxkcmVuLnR5cGUgPSAndHJlZS1saXN0J1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjYWxsIGBwcm9jZXNzU2NoZW1hKClgIGZvciB0aGUgbmVzdGVkIHRyZWUgbGlzdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZFJvdXRlcyxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgICAgICAgdHJ1ZSwgLy8gUGFzcyBgdHJ1ZWAgZm9yIGBmbGF0dGVuYCBpbiB0cmVlIGxpc3RzLlxuICAgICAgICAgICAgICAgIHByb2Nlc3NcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICB9LFxuXG4gICAgZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nKHNjaGVtYSwgY29udGV4dCkge1xuICAgICAgLy8gQ29udmVydCBuZXN0ZWQgY2hpbGRyZW4gc2NoZW1hIHRvIHN0YW5kLWFsb25lIHNjaGVtYSBjb21wb25lbnQsXG4gICAgICAvLyBwcmVzZW50IGluIGVhY2ggb2YgdGhlIGZvcm1zLCBhcyByZXF1aXJlZCBieSBgcHJvY2Vzc1NjaGVtYURhdGEoKWBcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgcmV0dXJuIGdldEZvcm1TY2hlbWFzKFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgPyBmb3JtID0+ICh7XG4gICAgICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAuLi5mb3JtLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgW2NoaWxkcmVuLm5hbWVdOiBjaGlsZHJlblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgKVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdHJlZS1saXN0IHtcbiAgQGV4dGVuZCAlZmllbGQ7XG5cbiAgLmRpdG8tdHJlZS1wYW5lbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgICA+IC5kaXRvLXRyZWUtaXRlbSB7XG4gICAgICBmbGV4OiAxIDEgMjUlO1xuICAgIH1cblxuICAgID4gLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lciB7XG4gICAgICBmbGV4OiAwIDEgNzUlO1xuICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgICBib3JkZXItbGVmdDogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtIDE7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAxO1xuICAgICAgbWFyZ2luOiAoLSRpbnB1dC1wYWRkaW5nLXZlcikgKC0kaW5wdXQtcGFkZGluZy1ob3IpO1xuICAgICAgbWFyZ2luLWxlZnQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBmaWxlc2l6ZSB9IGZyb20gJ2ZpbGVzaXplJ1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoc2l6ZSkge1xuICByZXR1cm4gZmlsZXNpemUoc2l6ZSwgeyBiYXNlOiAxMCB9KVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXVwbG9hZFxuICB0YWJsZS5kaXRvLXRhYmxlLmRpdG8tdGFibGUtc2VwYXJhdG9ycy5kaXRvLXRhYmxlLWJhY2tncm91bmRcbiAgICAvLy0gU3R5bGluZyBjb21lcyBmcm9tIERpdG9UYWJsZUhlYWRcbiAgICB0aGVhZC5kaXRvLXRhYmxlLWhlYWRcbiAgICAgIHRyXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBOYW1lXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTaXplXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTdGF0dXNcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuXG4gICAgRGl0b0RyYWdnYWJsZShcbiAgICAgIHYtbW9kZWw9XCJmaWxlc1wiXG4gICAgICB0YWc9XCJ0Ym9keVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhmYWxzZSlcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgKVxuICAgICAgdHIoXG4gICAgICAgIHYtZm9yPVwiKGZpbGUsIGluZGV4KSBpbiBmaWxlc1wiXG4gICAgICAgIDprZXk9XCJmaWxlLmtleVwiXG4gICAgICApXG4gICAgICAgIHRkKFxuICAgICAgICAgIHYtaHRtbD1cInJlbmRlckZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgKVxuICAgICAgICB0ZCB7eyBmb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpIH19XG4gICAgICAgIHRkXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWQuZXJyb3JcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IEVycm9yOiB7eyBmaWxlLnVwbG9hZC5lcnJvciB9fVxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImZpbGUudXBsb2FkLmFjdGl2ZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkaW5nLi4uXG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZmlsZS51cGxvYWQuc3VjY2Vzc1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkZWRcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHwgU3RvcmVkXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnNcbiAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgICAgICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgICAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgdi1pZj1cImRlbGV0YWJsZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkZWxldGVGaWxlKGZpbGUsIGluZGV4KVwiXG4gICAgICAgICAgICApXG4gICAgdGZvb3RcbiAgICAgIHRyXG4gICAgICAgIHRkKDpjb2xzcGFuPVwiNFwiKVxuICAgICAgICAgIC5kaXRvLXVwbG9hZC1mb290ZXJcbiAgICAgICAgICAgIHByb2dyZXNzLmRpdG8tcHJvZ3Jlc3MoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgIDp2YWx1ZT1cInVwbG9hZFByb2dyZXNzXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwidXBsb2FkLmFjdGl2ZSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgKSBDYW5jZWwgQWxsXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJpc1VwbG9hZFJlYWR5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cInVwbG9hZC5hY3RpdmUgPSB0cnVlXCJcbiAgICAgICAgICAgICAgKSBVcGxvYWQgQWxsXG4gICAgICAgICAgICAgIFZ1ZVVwbG9hZC5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1hZGQtdXBsb2FkKFxuICAgICAgICAgICAgICAgIHJlZj1cInVwbG9hZFwiXG4gICAgICAgICAgICAgICAgdi1tb2RlbD1cInVwbG9hZHNcIlxuICAgICAgICAgICAgICAgIDppbnB1dElkPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpuYW1lPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA6cG9zdEFjdGlvbj1cInVwbG9hZFBhdGhcIlxuICAgICAgICAgICAgICAgIDpleHRlbnNpb25zPVwiZXh0ZW5zaW9uc1wiXG4gICAgICAgICAgICAgICAgOmFjY2VwdD1cImFjY2VwdFwiXG4gICAgICAgICAgICAgICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIDpzaXplPVwibWF4U2l6ZVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJVcGxvYWQgRmlsZXNcIlxuICAgICAgICAgICAgICAgIEBpbnB1dC1maWx0ZXI9XCJpbnB1dEZpbHRlclwiXG4gICAgICAgICAgICAgICAgQGlucHV0LWZpbGU9XCJpbnB1dEZpbGVcIlxuICAgICAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvcnRhYmxlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMnXG5pbXBvcnQgcGFyc2VGaWxlU2l6ZSBmcm9tICdmaWxlc2l6ZS1wYXJzZXInXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZm9ybWF0RmlsZVNpemUgfSBmcm9tICcuLi91dGlscy91bml0cy5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGVzY2FwZUh0bWwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFZ1ZVVwbG9hZCBmcm9tICd2dWUtdXBsb2FkLWNvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd1cGxvYWQnLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFZ1ZVVwbG9hZCB9LFxuXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cGxvYWRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHVwbG9hZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLnVwbG9hZFxuICAgIH0sXG5cbiAgICBmaWxlcygpIHtcbiAgICAgIHJldHVybiBhc0ZpbGVzKHRoaXMudmFsdWUpXG4gICAgfSxcblxuICAgIG11bHRpcGxlOiBnZXRTY2hlbWFBY2Nlc3NvcignbXVsdGlwbGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAvLyBObyBjYWxsYmFjayBhcyBpdCdzIHVzZWQgaW4gYHByb2Nlc3NWYWx1ZSgpYFxuICAgICAgY2FsbGJhY2s6IGZhbHNlXG4gICAgfSksXG5cbiAgICBleHRlbnNpb25zOiBnZXRTY2hlbWFBY2Nlc3NvcignZXh0ZW5zaW9ucycsIHtcbiAgICAgIHR5cGU6IFtBcnJheSwgU3RyaW5nLCBSZWdFeHBdXG4gICAgfSksXG5cbiAgICBhY2NlcHQ6IGdldFNjaGVtYUFjY2Vzc29yKCdhY2NlcHQnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldChhY2NlcHQpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkoYWNjZXB0KSA/IGFjY2VwdC5qb2luKCcsJykgOiBhY2NlcHRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heFNpemU6IGdldFNjaGVtYUFjY2Vzc29yKCdtYXhTaXplJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGdldChtYXhTaXplKSB7XG4gICAgICAgIHJldHVybiBtYXhTaXplID8gcGFyc2VGaWxlU2l6ZShtYXhTaXplKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZHJhZ2dhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZHJhZ2dhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGRyYWdnYWJsZSkge1xuICAgICAgICByZXR1cm4gZHJhZ2dhYmxlICYmIHRoaXMuZmlsZXMubGVuZ3RoID4gMVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBpc1VwbG9hZFJlYWR5KCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy51cGxvYWRzLmxlbmd0aCAmJlxuICAgICAgICAhKHRoaXMudXBsb2FkLmFjdGl2ZSB8fCB0aGlzLnVwbG9hZC51cGxvYWRlZClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNVcGxvYWRBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRzLmxlbmd0aCAmJiB0aGlzLnVwbG9hZC5hY3RpdmVcbiAgICB9LFxuXG4gICAgdXBsb2FkUHJvZ3Jlc3MoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnVwbG9hZHMucmVkdWNlKCh0b3RhbCwgZmlsZSkgPT4gdG90YWwgKyBmaWxlLnByb2dyZXNzLCAwKSAvXG4gICAgICAgIHRoaXMudXBsb2Fkcy5sZW5ndGhcbiAgICAgIClcbiAgICB9LFxuXG4gICAgdXBsb2FkUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVXJsKHtcbiAgICAgICAgdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgIHBhdGg6IHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgodGhpcy5kYXRhUGF0aClcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb3JtYXRGaWxlU2l6ZSxcblxuICAgIHJlbmRlckZpbGUoZmlsZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IHsgcmVuZGVyIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIHJlbmRlclxuICAgICAgICA/IHJlbmRlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBmaWxlLFxuICAgICAgICAgICAgICBkYXRhOiB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIDogZXNjYXBlSHRtbChmaWxlLm5hbWUpXG4gICAgfSxcblxuICAgIGRlbGV0ZUZpbGUoZmlsZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gZmlsZVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZpbGUgJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMucmVtb3ZlfSAke25hbWV9P2BcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZS51cGxvYWQpIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZC5yZW1vdmUoZmlsZS51cGxvYWQpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgdGl0bGU6ICdTdWNjZXNzZnVsbHkgUmVtb3ZlZCcsXG4gICAgICAgICAgdGV4dDogYCR7bmFtZX0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpbGVJbmRleChmaWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbHVlXG4gICAgICAgID8gdGhpcy52YWx1ZS5maW5kSW5kZXgoaXQgPT4gaXQuaWQgPT09IGZpbGUuaWQpXG4gICAgICAgIDogLTFcbiAgICB9LFxuXG4gICAgYWRkRmlsZShmaWxlKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUucHVzaChmaWxlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBbZmlsZV1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZpbGVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVwbGFjZUZpbGUoZmlsZSwgbmV3RmlsZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEZpbGVJbmRleChmaWxlKVxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlmIChuZXdGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlW2luZGV4XSA9IG5ld0ZpbGVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3RmlsZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW1vdmVGaWxlKGZpbGUpIHtcbiAgICAgIHRoaXMucmVwbGFjZUZpbGUoZmlsZSwgbnVsbClcbiAgICB9LFxuXG4gICAgaW5wdXRGaWxlKG5ld0ZpbGUsIG9sZEZpbGUpIHtcbiAgICAgIGlmIChuZXdGaWxlICYmICFvbGRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHsgaWQsIG5hbWUsIHNpemUgfSA9IG5ld0ZpbGVcbiAgICAgICAgdGhpcy5hZGRGaWxlKHsgaWQsIG5hbWUsIHNpemUsIHVwbG9hZDogbmV3RmlsZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG5ld0ZpbGUgJiYgb2xkRmlsZSkge1xuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MsIGVycm9yIH0gPSBuZXdGaWxlXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ld0ZpbGUucmVzcG9uc2VbMF1cbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgZmlsZS51cGxvYWQgPSBuZXdGaWxlXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSB1cGxvYWQgZmlsZSBvYmplY3Qgd2l0aCB0aGUgZmlsZSBvYmplY3QgcmVjZWl2ZWRcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHVwbG9hZCByZXNwb25zZS5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUZpbGUobmV3RmlsZSwgZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWJvcnQ6ICdVcGxvYWQgYWJvcnRlZCcsXG4gICAgICAgICAgICAgIGRlbmllZDogJ1VwbG9hZCBkZW5pZWQnLFxuICAgICAgICAgICAgICBleHRlbnNpb246IGBVbnN1cHBvcnRlZCBmaWxlLXR5cGU6ICR7bmV3RmlsZS5uYW1lfWAsXG4gICAgICAgICAgICAgIG5ldHdvcms6ICdOZXR3b3JrIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB1cGxvYWQnLFxuICAgICAgICAgICAgICBzZXJ2ZXI6ICdTZXJ2ZXIgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHVwbG9hZCcsXG4gICAgICAgICAgICAgIHNpemU6IGBGaWxlIGlzIHRvbyBsYXJnZTogJHtmb3JtYXRGaWxlU2l6ZShuZXdGaWxlLnNpemUpfWAsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6ICdUaW1lb3V0IG9jY3VycmVkIGR1cmluZyB1cGxvYWQnXG4gICAgICAgICAgICB9W2Vycm9yXSB8fFxuICAgICAgICAgICAgYFVua25vd24gRmlsZSBVcGxvYWQgRXJyb3I6ICcke2Vycm9yfSdgXG4gICAgICAgICAgKVxuICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICB0aXRsZTogJ0ZpbGUgVXBsb2FkIEVycm9yJyxcbiAgICAgICAgICAgIHRleHRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMucmVtb3ZlRmlsZShuZXdGaWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGlucHV0RmlsdGVyKG5ld0ZpbGUgLyosIG9sZEZpbGUsIHByZXZlbnQgKi8pIHtcbiAgICAgIGNvbnN0IHhociA9IG5ld0ZpbGU/LnhoclxuICAgICAgaWYgKHRoaXMuYXBpLmNvcnM/LmNyZWRlbnRpYWxzICYmIHhociAmJiAheGhyLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgIC8vIEZpbHRlciBvdXQgYWxsIG5ld2x5IGFkZGVkIGZpbGVzIHRoYXQgd2VyZW4ndCBhY3R1YWxseSB1cGxvYWRlZC5cbiAgICBjb25zdCBmaWxlcyA9IGFzRmlsZXModmFsdWUpXG4gICAgICAubWFwKCh7IHVwbG9hZCwgLi4uZmlsZSB9KSA9PiAoIXVwbG9hZCB8fCB1cGxvYWQuc3VjY2VzcyA/IGZpbGUgOiBudWxsKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiBmaWxlKVxuICAgIHJldHVybiBzY2hlbWEubXVsdGlwbGUgPyBmaWxlcyA6IGZpbGVzWzBdIHx8IG51bGxcbiAgfVxufSlcblxuZnVuY3Rpb24gYXNGaWxlcyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyBhc0FycmF5KHZhbHVlKSA6IFtdXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by11cGxvYWQge1xuICAuZGl0by10YWJsZSB7XG4gICAgdHIge1xuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tYWRkLXVwbG9hZCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gKiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdXBsb2FkLWZvb3RlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAuZGl0by1wcm9ncmVzcyB7XG4gICAgICBmbGV4OiBhdXRvO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImNvbnN0IGxvZ2dlZERlcHJlY2F0aW9ucyA9IG5ldyBTZXQoKVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlKG1lc3NhZ2UpIHtcbiAgLy8gT25seSBsb2cgZGVwcmVjYXRpb24gbWVzc2FnZXMgb25jZS5cbiAgaWYgKCFsb2dnZWREZXByZWNhdGlvbnMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgbG9nZ2VkRGVwcmVjYXRpb25zLmFkZChtZXNzYWdlKVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBbXG4gICdjcmVhdGUnLCAnY3JlYXRlZCcsXG4gICdzYXZlJywgJ3NhdmVkJyxcbiAgJ3N1Ym1pdCcsICdzdWJtaXR0ZWQnLFxuICAnZGVsZXRlJywgJ2RlbGV0ZWQnLFxuICAnZWRpdCcsICdlZGl0ZWQnLFxuICAnY2xvc2UnLCAnY2xvc2VkJyxcbiAgJ2NhbmNlbCcsICdjYW5jZWxsZWQnLFxuICAnZHJhZycsICdkcmFnZ2VkJ1xuXS5yZWR1Y2UoKHZlcmJzLCB2ZXJiKSA9PiB7XG4gIHZlcmJzW3ZlcmJdID0gdmVyYlxuICByZXR1cm4gdmVyYnNcbn0sIHt9KVxuIiwiaW1wb3J0IHsgY3JlYXRlQXBwLCBoIGFzIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXIsIGNyZWF0ZVdlYkhpc3RvcnkgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IFZ1ZU5vdGlmaWNhdGlvbnMgZnJvbSAnQGt5dmcvdnVlMy1ub3RpZmljYXRpb24nXG5pbXBvcnQge1xuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgYXNBcnJheSxcbiAgaXNBYnNvbHV0ZVVybCxcbiAgbWVyZ2UsXG4gIGh5cGhlbmF0ZSxcbiAgY2FtZWxpemUsXG4gIGRlZmF1bHRGb3JtYXRzXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyBjb21wb25lbnRzIGZyb20gJy4vY29tcG9uZW50cy9pbmRleC5qcydcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4vdHlwZXMvaW5kZXguanMnXG5pbXBvcnQgRGl0b1Jvb3QgZnJvbSAnLi9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSdcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgZGVwcmVjYXRlIH0gZnJvbSAnLi91dGlscy9kZXByZWNhdGUuanMnXG5pbXBvcnQgdmVyYnMgZnJvbSAnLi92ZXJicy5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0FkbWluIHtcbiAgY29uc3RydWN0b3IoZWwsIHtcbiAgICAvLyBgZGl0b2AgY29udGFpbnMgdGhlIGJhc2UgYW5kIGFwaSBzZXR0aW5ncyBwYXNzZWQgZnJvbSBgQWRtaW5Db250cm9sbGVyYFxuICAgIGRpdG8gPSB7fSxcbiAgICBhcGksXG4gICAgdmlld3MgPSB7fSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIC8vIE1lcmdlIGluIGBhcGlgIHNldHRpbmdzIGFzIHBhc3NlZCBmcm9tIGBjb25maWcuYWRtaW5gIGFuZCB0aHJvdWdoIHRoZVxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgIHdpdGggYGFwaWAgdmFsdWVzIGZyb20gZnJvbSAnYWRtaW4vaW5kZXguanMnXG4gICAgLy8gTk9URTogYEFkbWluQ29udHJvbGxlcmAgcHJvdmlkZXMgYGRpdG8uYXBpLmJhc2VgXG4gICAgdGhpcy5hcGkgPSBhcGkgPSBtZXJnZSh7IGJhc2U6ICcvJyB9LCBkaXRvLmFwaSwgYXBpKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcblxuICAgIC8vIFNldHVwIGRlZmF1bHQgYXBpIHNldHRpbmdzOlxuICAgIGFwaS5sb2NhbGUgfHw9ICdlbi1VUydcbiAgICBhcGkuZm9ybWF0cyA9IG1lcmdlKHt9LCBkZWZhdWx0Rm9ybWF0cywgYXBpLmZvcm1hdHMpXG4gICAgYXBpLnJlcXVlc3QgfHw9IG9wdGlvbnMgPT4gcmVxdWVzdChhcGksIG9wdGlvbnMpXG4gICAgYXBpLmdldEFwaVVybCB8fD0gb3B0aW9ucyA9PiBnZXRBcGlVcmwoYXBpLCBvcHRpb25zKVxuICAgIGFwaS5pc0FwaVVybCB8fD0gdXJsID0+IGlzQXBpVXJsKGFwaSwgdXJsKVxuICAgIC8vIFNldHRpbmcgYGFwaS5ub3JtYWxpemVQYXRocyA9IHRydWUgKHBsdXJhbCkgc2V0cyBib3RoOlxuICAgIC8vIGBhcGkubm9ybWFsaXplUGF0aCA9IGh5cGhlbmF0ZWAgYW5kIGBhcGkuZGVub3JtYWxpemVQYXRoID0gY2FtZWxpemVgXG4gICAgYXBpLm5vcm1hbGl6ZVBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZSA6IHZhbCA9PiB2YWxcbiAgICBhcGkuZGVub3JtYWxpemVQYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aHMgPyBjYW1lbGl6ZSA6IHZhbCA9PiB2YWxcblxuICAgIC8vIEFsbG93IGRlZmluaXRpb24gb2YgZGVmYXVsdHMgZm9yIGFkbWluIGNvbXBvbmVudCB0eXBlcywgbmVzdGVkIHBlciB0eXBlOlxuICAgIC8vIGFwaS5kZWZhdWx0cyA9IHtcbiAgICAvLyAgICdtdWx0aXNlbGVjdCc6IHtcbiAgICAvLyAgICAgc2VsZWN0YWJsZTogdHJ1ZVxuICAgIC8vICAgfSxcbiAgICAvLyAgICdmYWtlLXR5cGUnOiBzY2hlbWEgPT4ge1xuICAgIC8vICAgICAvLyBSZXR1cm4gZGVmYXVsdHMsIG9yIGRpcmVjdGx5IG1vZGlmeSB0aGUgc2NoZW1hOlxuICAgIC8vICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwge1xuICAgIC8vICAgICAgIHR5cGU6ICdyZWFsLXR5cGUnLFxuICAgIC8vICAgICAgIGZvcm1hdDogKHsgdmFsdWUgfSkgPT4gYEZvcm1hdHRlZCAke3ZhbHVlfWAsXG4gICAgLy8gICAgICAgcHJvY2VzczogKHsgdmFsdWUgfSkgPT4gYFByb2Nlc3NlZCAke3ZhbHVlfWBcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBhcGkuZGVmYXVsdHMgfHw9IHt9XG5cbiAgICAvLyBBbGxvdyB0aGUgY29uZmlndXJhdGlvbiBvZiBhbGwgYXV0aCByZXNvdXJjZXMsIGxpa2Ugc286XG4gICAgLy8gYXBpLnVzZXJzID0ge1xuICAgIC8vICAgcGF0aDogJy9hZG1pbnMnLFxuICAgIC8vICAgLy8gVGhlc2UgYXJlIHRoZSBkZWZhdWx0czpcbiAgICAvLyAgIGxvZ2luOiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dpbicsXG4gICAgLy8gICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgLy8gICB9LFxuICAgIC8vICAgbG9nb3V0OiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dvdXQnLFxuICAgIC8vICAgICBtZXRob2Q6ICdwb3N0J1xuICAgIC8vICAgfSxcbiAgICAvLyAgIHNlc3Npb246IHtcbiAgICAvLyAgICAgcGF0aDogJ3Nlc3Npb24nLFxuICAgIC8vICAgICBtZXRob2Q6ICdnZXQnXG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIGNvbnN0IHVzZXJzID0gZ2V0UmVzb3VyY2UoYXBpLnVzZXJzLCB7XG4gICAgICB0eXBlOiAnY29sbGVjdGlvbidcbiAgICB9KSB8fCB7fVxuICAgIHVzZXJzLmxvZ2luID0gZ2V0UmVzb3VyY2UodXNlcnMubG9naW4gfHwgJ2xvZ2luJywge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICB1c2Vycy5sb2dvdXQgPSBnZXRSZXNvdXJjZSh1c2Vycy5sb2dvdXQgfHwgJ2xvZ291dCcsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgdXNlcnMuc2Vzc2lvbiA9IGdldFJlc291cmNlKHVzZXJzLnNlc3Npb24gfHwgJ3Nlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgYXBpLnVzZXJzID0gdXNlcnNcblxuICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgb2YgcmVzb3VyY2UgcGF0aCBoYW5kbGVyczpcbiAgICAvLyBhcGkucmVzb3VyY2VzID0ge1xuICAgIC8vICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgIC8vICAgICByZXR1cm4gcmVzb3VyY2UucGFyZW50XG4gICAgLy8gICAgICAgPyBgJHtyZXNvdXJjZS5wYXRofT8ke3Jlc291cmNlLnBhcmVudC5wYXRofV9pZD0ke1xuICAgIC8vICAgICAgICAgIHJlc291cmNlLnBhcmVudC5pZH1gXG4gICAgLy8gICAgICAgOiByZXNvdXJjZS5wYXRoXG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgYXBpLnJlc291cmNlcyA9IHtcbiAgICAgIGFueShyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tyZXNvdXJjZT8udHlwZV0gfHwgdGhpcy5kZWZhdWx0XG4gICAgICAgIHJldHVybiByZXNvdXJjZSAmJiBoYW5kbGVyLmNhbGwodGhpcywgcmVzb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBkZWZhdWx0KHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0aGlzLmFueShyZXNvdXJjZS5wYXJlbnQpXG4gICAgICAgIHJldHVybiBwYXJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtwYXJlbnRQYXRofS8ke3Jlc291cmNlLnBhdGh9YFxuICAgICAgICAgIDogcmVzb3VyY2UucGF0aFxuICAgICAgfSxcblxuICAgICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHJlc291cmNlKVxuICAgICAgfSxcblxuICAgICAgbWVtYmVyKHJlc291cmNlKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFzc3VtZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgcm9vdC1sZXZlbCBjb2xsZWN0aW9uIHJvdXRlcyxcbiAgICAgICAgLy8gdG8gYXZvaWQgZXhjZXNzaXZlIG5lc3Rpbmcgb2YgKHN1Yi0pY29sbGVjdGlvbiByb3V0ZXMuXG4gICAgICAgIHJldHVybiBgJHtyZXNvdXJjZS5wYXRofS8ke3Jlc291cmNlLmlkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVwbG9hZChyZXNvdXJjZSkge1xuICAgICAgICAvLyBEaXRvIFNlcnZlciBoYW5kbGVzIHVwbG9hZCByb3V0ZXMgb24gdGhlIGNvbGxlY3Rpb24gcmVzb3VyY2U6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbGxlY3Rpb24ocmVzb3VyY2UucGFyZW50KX0vdXBsb2FkLyR7cmVzb3VyY2UucGF0aH1gXG4gICAgICB9LFxuXG4gICAgICAuLi5hcGkucmVzb3VyY2VzXG4gICAgfVxuXG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyAvIGV4dGVuZGluZyBvZiBoZWFkZXJzOlxuICAgIC8vIGFwaS5oZWFkZXJzID0ge1xuICAgIC8vICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIC8vIH1cbiAgICBhcGkuaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5hcGkuaGVhZGVyc1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhlbCkpIHtcbiAgICAgIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbClcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSAodGhpcy5hcHAgPSBjcmVhdGVBcHAoe1xuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBEaXRvUm9vdCxcbiAgICAgICAgVnVlTm90aWZpY2F0aW9ucyxcbiAgICAgICAgLy8gVGhpcyBtYXkgb25seSBiZSBuZWVkZWQgdG8gYXZvaWQgdHJlZS1zaGFja2luZyBvZiB0aGVzZSBjb21wb25lbnRzLFxuICAgICAgICAvLyBzaW5jZSB0aGV5IGFjdHVhbGx5IGhhbmRsZSByZWdpc3RyeSBpbnRlcm5hbGx5IGFscmVhZHkuXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9uY2Ugd2UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbi5cbiAgICAgICAgLi4uY29tcG9uZW50cyxcbiAgICAgICAgLi4udHlwZXNcbiAgICAgIH0sXG5cbiAgICAgIC8vIE1vc3QgaW5qZWN0cyBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlIHJlYWN0aXZlbmVzcyBhY3Jvc3NcbiAgICAgIC8vIHByb3ZpZGUvaW5qZWN0LCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy83MDE3I2lzc3VlY29tbWVudC00ODA5MDY2OTFcbiAgICAgIHByb3ZpZGU6IHtcbiAgICAgICAgYXBpLFxuICAgICAgICAvLyBBIGRlZmF1bHQgbGlzdCBvZiB2ZXJicyBhcmUgcHJvdmlkZWQgYnkgJHZlcmJzKCkgYW5kIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGF0IGFueSBwb2ludCBpbiB0aGUgY29tcG9uZW50IGhpZXJhcmNoeS5cbiAgICAgICAgJHZlcmJzOiAoKSA9PiB2ZXJicyxcbiAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0cyBzbyBEaXRvTWl4aW4gY2FuIGluamVjdCB0aGVtIGZvciBhbGwgY29tcG9uZW50czpcbiAgICAgICAgLy8gICBpbmplY3Q6IFsgICckaXNQb3B1bGF0ZWQnLCAnJHNjaGVtYUNvbXBvbmVudCcsICckcm91dGVDb21wb25lbnQnIF1cbiAgICAgICAgJHZpZXdzOiAoKSA9PiB7fSxcbiAgICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0cnVlLFxuICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hUGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcm91dGVDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcmVzb3VyY2VDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkaWFsb2dDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRwYW5lbENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVuZGVyOiAoKSA9PlxuICAgICAgICBjcmVhdGVFbGVtZW50KERpdG9Sb290LCB7XG4gICAgICAgICAgcmVmOiAncm9vdCcsXG4gICAgICAgICAgY2xhc3M6IGRpdG8uc2V0dGluZ3Mucm9vdENsYXNzLFxuICAgICAgICAgIHVucmVzb2x2ZWRWaWV3czogdmlld3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9KVxuICAgIH0pKVxuXG4gICAgYXBwLnVzZShWdWVOb3RpZmljYXRpb25zLCB7XG4gICAgICBuYW1lOiAnbm90aWZ5JyxcbiAgICAgIGNvbXBvbmVudE5hbWU6ICdWdWVOb3RpZmljYXRpb25zJ1xuICAgIH0pXG5cbiAgICAvLyByb290LmNvbXBvbmVudCgndnVlLW1vZGFsJywgVnVlTW9kYWwpXG5cbiAgICBhcHAudXNlKFxuICAgICAgY3JlYXRlUm91dGVyKHtcbiAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNhdGNoLWFsbCByb3V0ZSwgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCByb3V0ZXNcbiAgICAgICAgLy8gb25jZSB0aGUgc2NoZW1hcyBhcmUgbG9hZGVkLCB0byBwcmV2ZW50IHZ1ZS1yb3V0ZXIgZnJvbSBjb21wbGFpbmluZyxcbiAgICAgICAgLy8gc2VlOiBgcmVzb2x2ZVZpZXdzKClgIGluIGBEaXRvUm9vdGAgZm9yIHRoZSBhY3R1YWwgcm91dGUgc2V0dXAuXG4gICAgICAgIHJvdXRlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdjYXRjaC1hbGwnLFxuICAgICAgICAgICAgcGF0aDogJy86XyguKiknLFxuICAgICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGhpc3Rvcnk6IGNyZWF0ZVdlYkhpc3RvcnkoZGl0by5iYXNlKSxcbiAgICAgICAgbGlua0FjdGl2ZUNsYXNzOiAnJyxcbiAgICAgICAgbGlua0V4YWN0QWN0aXZlQ2xhc3M6ICcnXG4gICAgICB9KVxuICAgIClcblxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2RpdG8tYXBwJylcbiAgICBhcHAubW91bnQoZWwpXG4gIH1cblxuICByZWdpc3Rlcih0eXBlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpXG4gIH1cbn1cblxuY2xhc3MgUmVxdWVzdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIHN1cGVyKFxuICAgICAgYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfSAoJHtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgfSlgXG4gICAgKVxuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoYXBpLCB7XG4gIHVybCxcbiAgbWV0aG9kID0gJ2dldCcsXG4gIC8vIFRPRE86IGByZXF1ZXN0LnBhcmFtc2Agd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBxdWVyeWAgb24gMjAyMi0xMS0wMSxcbiAgLy8gcmVtb3ZlIG9uY2Ugbm90IGluIHVzZSBhbnl3aGVyZSBhbnkgbW9yZS5cbiAgcGFyYW1zID0gbnVsbCxcbiAgcXVlcnkgPSBwYXJhbXMgfHwgbnVsbCxcbiAgaGVhZGVycyA9IG51bGwsXG4gIGRhdGEgPSBudWxsXG59KSB7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICBgcmVxdWVzdC5wYXJhbXMgaXMgZGVwcmVjYXRlZC4gVXNlIGFjdGlvbi5tZXRob2QgYW5kIGFjdGlvbi5wYXRoIGluc3RlYWQuYFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGlzQXBpVXJsID0gYXBpLmlzQXBpVXJsKHVybClcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFwaS5nZXRBcGlVcmwoeyB1cmwsIHF1ZXJ5IH0pLCB7XG4gICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAuLi4oZGF0YSAmJiB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihpc0FwaVVybCAmJiBhcGkuaGVhZGVycyksXG4gICAgICAuLi5oZWFkZXJzXG4gICAgfSxcbiAgICBjcmVkZW50aWFsczpcbiAgICAgIGlzQXBpVXJsICYmIGFwaS5jb3JzPy5jcmVkZW50aWFsc1xuICAgICAgICA/ICdpbmNsdWRlJ1xuICAgICAgICA6ICdzYW1lLW9yaWdpbidcbiAgfSlcblxuICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmVzcG9uc2UuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IocmVzcG9uc2UpXG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmZ1bmN0aW9uIGlzQXBpVXJsKGFwaSwgdXJsKSB7XG4gIHJldHVybiAhaXNBYnNvbHV0ZVVybCh1cmwpIHx8IHVybC5zdGFydHNXaXRoKGFwaS51cmwpXG59XG5cbmZ1bmN0aW9uIGdldEFwaVVybChhcGksIHsgdXJsLCBxdWVyeSB9KSB7XG4gIGlmICghaXNBYnNvbHV0ZVVybCh1cmwpKSB7XG4gICAgdXJsID0gY29tYmluZVVybHMoYXBpLnVybCwgdXJsKVxuICB9XG4gIC8vIFN1cHBvcnQgb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycywgdG8gYmUgYXJlIGFkZGVkIHRvIHRoZSBVUkwuXG4gIGNvbnN0IHNlYXJjaCA9IGZvcm1hdFF1ZXJ5KHF1ZXJ5KVxuICByZXR1cm4gc2VhcmNoID8gYCR7dXJsfT8ke3NlYXJjaH1gIDogdXJsXG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVVcmxzKGJhc2VVcmwsIHJlbGF0aXZlVXJsKSB7XG4gIC8vIFVzZSBzYW1lIGFwcHJvYWNoIGFzIGF4aW9zIGBjb21iaW5lVVJMcygpYCB0byBqb2luIGJhc2VVcmwgJiByZWxhdGl2ZVVybDpcbiAgcmV0dXJuIGAke2Jhc2VVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyl9LyR7cmVsYXRpdmVVcmwucmVwbGFjZSgvXlxcLysvLCAnJyl9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRRdWVyeShxdWVyeSkge1xuICBjb25zdCBlbnRyaWVzID0gcXVlcnlcbiAgICA/IGlzQXJyYXkocXVlcnkpXG4gICAgICA/IHF1ZXJ5XG4gICAgICA6IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgIDogW11cbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoXG4gICAgLy8gRXhwYW5kIGFycmF5IHZhbHVlcyBpbnRvIG11bHRpcGxlIGVudHJpZXMgdW5kZXIgdGhlIHNhbWUga2V5LCBzb1xuICAgIC8vIGBmb3JtYXRRdWVyeSh7IGZvbzogWzEsIDJdLCBiYXI6IDMgfSlgID0+ICdmb289MSZmb289MiZiYXI9MycuXG4gICAgZW50cmllcy5yZWR1Y2UoXG4gICAgICAoZW50cmllcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIGFzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHZhbF0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgIH0sXG4gICAgICBbXVxuICAgIClcbiAgKS50b1N0cmluZygpXG59XG4iXSwibmFtZXMiOlsiYXBwU3RhdGUiLCJyZWFjdGl2ZSIsImFwcGVuZERhdGFQYXRoIiwiZGF0YVBhdGgiLCJ0b2tlbiIsInBhcnNlUGFyZW50RGF0YVBhdGgiLCJwYXRoIiwicGFyc2VEYXRhUGF0aCIsInBhcnNlSXRlbURhdGFQYXRoIiwibmVzdGVkIiwiZ2V0SXRlbURhdGFQYXRoIiwibm9ybWFsaXplRGF0YVBhdGgiLCJwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aCIsImlzSW50ZWdlciIsImdldFBhcmVudEl0ZW1EYXRhUGF0aCIsImdldEl0ZW0iLCJyb290SXRlbSIsImdldFZhbHVlQXREYXRhUGF0aCIsImdldFBhcmVudEl0ZW0iLCJnZXRMYXN0RGF0YVBhdGhUb2tlbiIsImdldExhc3REYXRhUGF0aE5hbWUiLCJnZXRMYXN0RGF0YVBhdGhJbmRleCIsImluZGV4IiwidGVtcG9yYXJ5SWQiLCJzZXRUZW1wb3JhcnlJZCIsImRhdGEiLCJpZEtleSIsImlzVGVtcG9yYXJ5SWQiLCJpZCIsImlzUmVmZXJlbmNlIiwiaGFzT3duUHJvcGVydHkiLCJjb250ZXh0cyIsImdldCIsImNvbnRleHQiLCJrZXkiLCJkZWZhdWx0VmFsdWUiLCJvYmplY3QiLCJ0b1JhdyIsInZhbHVlIiwiaXNGdW5jdGlvbiIsInNldCIsIkRpdG9Db250ZXh0IiwiY29tcG9uZW50IiwiaXRlbSIsIm9wdGlvbnMiLCJsb2NhdGlvbiIsInJlc291cmNlIiwiRW1pdHRlck1peGluIiwiZXZlbnQiLCJjYWxsYmFjayIsImlzQXJyYXkiLCJldiIsImlzUGxhaW5PYmplY3QiLCJsaXN0ZW5lcnMiLCJjYWxsYmFja3MiLCJvbiIsImFyZ3MiLCJlbnRyeSIsIl9hIiwiY2IiLCJxdWV1ZSIsInJlc29sdmUiLCJuZXh0IiwicmVzdWx0IiwicmVzIiwiZXJyb3IiLCJ0YXJnZXQiLCJ0eXBlQ2hlY2tlcnMiLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNEYXRlIiwiaXNPYmplY3QiLCJpc1JlZ0V4cCIsInR5cGVDb252ZXJ0ZXJzIiwiYXNBcnJheSIsImlzTWF0Y2hpbmdUeXBlIiwidHlwZXMiLCJ0eXBlIiwiY29udmVydFR5cGUiLCJjb252ZXJ0ZXIiLCJoYXNSZXNvdXJjZSIsInNjaGVtYSIsImdldFJlc291cmNlIiwiZGVmYXVsdHMiLCJwYXJlbnQiLCJkZWZzIiwiZ2V0TWVtYmVyUmVzb3VyY2UiLCJwaWNrQnkiLCJEaXRvTWl4aW4iLCJ1aWQiLCJuZXh0VWlkIiwia2V5T3JEYXRhUGF0aCIsImRlZiIsImNvbnZlcnRlZCIsIm5hbWUiLCJsYWJlbGl6ZSIsImJ1dHRvbiIsInZlcmIiLCJxdWVyeSIsInVybCIsIm1ldGhvZCIsImludGVybmFsIiwiY2hlY2tVc2VyIiwicmVzcG9uc2UiLCJlcXVhbHMiLCJjb21wb25lbnRzIiwiYnV0dG9ucyIsInNldHRpbmdzIiwiY2FjaGUiLCJjYWNoZVBhcmVudCIsImxvYWRDYWNoZSIsImNhY2hlS2V5IiwibG9jYWxlIiwiZm9ybWF0IiwiYSIsImJvZHkiLCJhY2Nlc3NvciIsIndhdGNoIiwiZXZlbnRzIiwiaGFuZGxlcnMiLCJleHByIiwiYWRkRXZlbnQiLCJoeXBoZW5hdGUiLCJoYXNMaXN0ZW5lcnMiLCJwYXJlbnRIYXNMaXN0ZW5lcnMiLCJnZXRDb250ZXh0IiwicGFyYW1zIiwiaXNDcmVkaXRDYXJkIiwiZGVjaW1hbHMiLCJtYXRjaCIsImlzRG9tYWluIiwiaXNFbWFpbCIsImlzSG9zdG5hbWUiLCJtYXgiLCJtaW4iLCJwYXNzd29yZCIsImlzVXJsIiwiVmFsaWRhdGlvbk1peGluIiwibm90aWZ5IiwiaXNWYWxpZCIsInJ1bGUiLCJzZXR0aW5nIiwidmFsaWRhdG9yIiwidmFsaWRhdGlvbnMiLCJ2YWxpZGF0ZSIsIm1lc3NhZ2UiLCJhZGRMYWJlbCIsImVycm9ycyIsImZvY3VzIiwiZ2V0U2NoZW1hQWNjZXNzb3IiLCJnZXRTdG9yZUFjY2Vzc29yIiwiVHlwZU1peGluIiwiY29tcHV0ZVZhbHVlIiwicGFyc2UiLCJzY2hlbWFDb21wb25lbnQiLCJsYWJlbCIsImNhbWVsaXplIiwibmF0aXZlRmllbGQiLCJ0ZXh0RmllbGQiLCJhdHRyaWJ1dGVzIiwiYWRkIiwib25Gb2N1cyIsIm9uQmx1ciIsIm9uSW5wdXQiLCJvbkNoYW5nZSIsImVsZW1lbnQiLCJfYiIsInVpZE1hcCIsImdldFVpZCIsIml0ZW1JZCIsIlNjaGVtYUdyYXBoIiwiX19wdWJsaWNGaWVsZCIsInN1YkdyYXBoIiwicGFydCIsInJlbGF0ZWREYXRhUGF0aCIsIm5hbm9pZCIsImZsYXR0ZW4iLCJncmFwaCIsImVudHJpZXMiLCIkc2V0dGluZ3MiLCJzdWJLZXkiLCJzb3VyY2VTY2hlbWEiLCJjbGlwYm9hcmQiLCJyZWxhdGVkIiwicmVmZXJlbmNlIiwic291cmNlIiwicmVsYXRpb24iLCJ2YWx1ZXMiLCJyZW1vdmVJZCIsInJlZmVyZW5jZUlkIiwicmVmS2V5IiwicmV2VmFsdWUiLCJ0eXBlQ29tcG9uZW50cyIsInVua25vd25UeXBlUmVwb3J0ZWQiLCJyZWdpc3RlclR5cGVDb21wb25lbnQiLCJnZXRUeXBlQ29tcG9uZW50IiwiYWxsb3dOdWxsIiwiaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMiLCJzY2hlbWFzIiwiaXNTaW5nbGVDb21wb25lbnRWaWV3IiwiaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMiLCJnZXRBbGxUYWJTY2hlbWFzIiwiZmluZFNjaGVtYUNvbXBvbmVudCIsInNvbWVTY2hlbWFDb21wb25lbnQiLCJpc1NjaGVtYSIsImlzRm9ybSIsImlzVmlldyIsImlzVGFiIiwiaXNQYW5lbCIsImdldFNjaGVtYUlkZW50aWZpZXIiLCJyZXNvbHZlU2NoZW1hIiwidW53cmFwTW9kdWxlIiwiaXNQcm9taXNlIiwiaXNNb2R1bGUiLCJrZXlzIiwicmVzb2x2ZVNjaGVtYXMiLCJ1bnJlc29sdmVkU2NoZW1hcyIsInJlc29sdmVJdGVtIiwibWFwQ29uY3VycmVudGx5IiwicmVzb2x2ZVNjaGVtYUNvbXBvbmVudCIsIm1hcmtSYXciLCJyZXNvbHZlU2NoZW1hQ29tcG9uZW50cyIsInByb2Nlc3NTY2hlbWFDb21wb25lbnRzIiwiYXBpIiwicm91dGVzIiwibGV2ZWwiLCJwcm9taXNlcyIsInByb2Nlc3MiLCJyZWxhdGl2ZUxldmVsIiwicHJvY2Vzc1NjaGVtYUNvbXBvbmVudCIsImdldEFsbFBhbmVsU2NoZW1hcyIsInByb2Nlc3NEZWZhdWx0cyIsInBhbmVsIiwiZ2V0VHlwZU9wdGlvbnMiLCJwcm9jZXNzVmlldyIsInByb2Nlc3NSb3V0ZVNjaGVtYSIsInJlc29sdmVOZXN0ZWRTY2hlbWFzIiwiY2hpbGRyZW4iLCJtZXJnZSIsInByb2Nlc3NGb3JtcyIsImZvcm0iLCJmb3JtcyIsInByb2Nlc3NGb3JtIiwicHJvY2Vzc1RhYiIsInByb2Nlc3NQYW5lbCIsInRhYnMiLCJwYW5lbHMiLCJ0YWIiLCJoYXNGb3JtU2NoZW1hIiwiaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyIsImdldFZpZXdGb3JtU2NoZW1hIiwidmlldyIsInZpZXdTY2hlbWEiLCJnZXRWaWV3U2NoZW1hIiwiZ2V0Vmlld0VkaXRQYXRoIiwiZ2V0Rm9ybVNjaGVtYXMiLCJtb2RpZnlGb3JtIiwiY29tcGFjdCIsImdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zIiwiZ2V0SXRlbUZvcm1TY2hlbWEiLCJpc0NvbXBhY3QiLCJpc0lubGluZWQiLCJpc05lc3RlZCIsIm9taXRQYWRkaW5nIiwiYWxpZ25Cb3R0b20iLCJnZXREZWZhdWx0VmFsdWUiLCJjbG9uZSIsImlnbm9yZU1pc3NpbmdWYWx1ZSIsInR5cGVPcHRpb25zIiwic2V0RGVmYXVsdFZhbHVlcyIsInByb2Nlc3NTY2hlbWFEYXRhIiwicm9vdERhdGEiLCJjb21wdXRlIiwiY2xvbmVJdGVtIiwiY29weSIsIm9yZGVyS2V5IiwicHJvY2Vzc0RhdGEiLCJzY2hlbWFPbmx5IiwicHJvY2Vzc2VkRGF0YSIsIndyYXBQcmltaXRpdmVzIiwiYiIsImlkMSIsImlkMiIsImV4Y2x1ZGUiLCJwcm9jZXNzVmFsdWUiLCJwcm9jZXNzQmVmb3JlIiwicHJvY2Vzc0FmdGVyIiwicHJvY2Vzc0NvbXBvbmVudHMiLCJnZXREYXRhUGF0aCIsImNvbXBvbmVudFNjaGVtYSIsImNvbXBvbmVudERhdGFQYXRoIiwicHJvY2Vzc0l0ZW0iLCJwcm9jZXNzZWRJdGVtIiwiZ2V0TmFtZWRTY2hlbWFzIiwidG9PYmplY3QiLCJhcnJheSIsInRvU2NoZW1hIiwiZ2V0QnV0dG9uU2NoZW1hcyIsImdldFR5cGUiLCJzY2hlbWFPclR5cGUiLCJnZXRTb3VyY2VUeXBlIiwiZ2V0UGFuZWxFbnRyeSIsInRhYkNvbXBvbmVudCIsImdldFBhbmVsRW50cmllcyIsInBhbmVsU2NoZW1hcyIsInBhbmVsRW50cmllcyIsImdldEFsbFBhbmVsRW50cmllcyIsInBhbmVsU2NoZW1hIiwiaXNPYmplY3RTb3VyY2UiLCJpc0xpc3RTb3VyY2UiLCJnZXRJdGVtSWQiLCJnZXRJdGVtVWlkIiwicmVzb2x2ZU1lcmdlZE9wdGlvbnMiLCJtaXhpbnMiLCJtZXJnZU9wdGlvbnMiLCJ0byIsImZyb20iLCJtaXhpbiIsImRpdG9PcHRpb25LZXlzIiwiRGl0b0NvbXBvbmVudCIsImRlZmluaXRpb24iLCJEaXRvVXNlciIsInJvbGVzIiwicm9sZSIsIlNjaGVtYVBhcmVudE1peGluIiwic2NoZW1hQ29tcG9uZW50cyIsIlZhbGlkYXRvck1peGluIiwiaXQiLCJSb3V0ZU1peGluIiwicm91dGVDb21wb25lbnQiLCJtYXRjaGVkIiwiaSIsInJlY29yZCIsImJyZWFkY3J1bWIiLCJyb3V0ZUNvbXBvbmVudHMiLCJvayIsInRlbXBsYXRlUGF0aCIsInJvb3RQYXRoIiwiZ2V0Q29tbW9uUHJlZml4IiwiaXNMb2FkaW5nIiwiY29weURhdGUiLCJkYXRlIiwieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwibW9kZSIsIm92ZXJyaWRlcyIsInN0ZXAiLCJjdXJyZW50VmFsdWUiLCJzdGF0ZSIsImhvciIsInZlciIsImVudGVyIiwiY3VycmVudE1vZGUiLCJzdGFydFllYXIiLCJmaXJzdERheVdlZWsiLCJudW1EYXlzIiwicHJldk1vbnRoIiwicHJldk1vbnRoTnVtRGF5cyIsInRvZGF5IiwiaXNEYXkiLCJuZXh0TW9udGhOZWVkIiwibmV4dE1vbnRoIiwibG9jYWxlTmFtZXMiLCJuYW1lcyIsImFkZEV2ZW50cyIsImdldEtleSIsImdldEtleU5hdmlnYXRpb24iLCJjbGFzc2VzIiwic2hvdyIsInRyaWdnZXIiLCJwb3B1cCIsImVsIiwiYm91bmRzIiwidHJpZ2dlckxlZnQiLCJ0cmlnZ2VyVG9wIiwidHJpZ2dlcldpZHRoIiwidHJpZ2dlckhlaWdodCIsInBvcHVwV2lkdGgiLCJwb3B1cEhlaWdodCIsInBhcnQxIiwicGFydDIiLCJ3aW5XaWR0aCIsIndpbkhlaWdodCIsImxlZnQiLCJ0b3AiLCJ0cmlnZ2VyQm91bmRzIiwic2l6ZSIsImdldExlbmd0aCIsIlRyaWdnZXIiLCJDYWxlbmRhciIsIklucHV0RmllbGQiLCJkZWZhdWx0Rm9ybWF0cyIsInNjcm9sbFRvIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJwZXJUaWNrIiwic2V0U2VsZWN0aW9uIiwiZmllbGQiLCJzdGFydCIsImVuZCIsInJhbmdlIiwiZm9yY2UiLCJzY3JvbGwiLCJyZWYiLCJsaW5lSGVpZ2h0Iiwic2VsZWN0ZWQiLCJsZW5ndGgiLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsInBhZ2UiLCJwYWdlU2l6ZSIsImN1cnJlbnRQYWdlU2l6ZSIsInNob3dQcmV2Iiwic2hvd05leHQiLCJ0b3RhbCIsImN1cnJlbnRQYWdlIiwic2hvd0xlbmd0aCIsIm51bVBhZ2VzIiwicGFnZVJhbmdlIiwiY2hlY2tlZCIsImRpc2FibGVkIiwidW5jaGVja2VkIiwibW9kZWxWYWx1ZSIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwic2xvdHMiLCJjcmVhdGVFbGVtZW50IiwiVHJhbnNpdGlvbiIsInByb3BzIiwic2V0U3R5bGUiLCJzdHlsZSIsImZvcmNlUmVwYWludCIsIndpZHRoIiwiaGVpZ2h0IiwiVXNlRm9jdXNUcmFwIiwiZGVmaW5lQ29tcG9uZW50IiwidHJhcCIsImFjdGl2YXRlIiwiZGVhY3RpdmF0ZSIsInVucmVmRWxlbWVudCIsImNyZWF0ZUZvY3VzVHJhcCIsIm9uU2NvcGVEaXNwb3NlIiwiaCIsImRpYWxvZ0RhdGEiLCJEb21NaXhpbiIsInJlbW92ZSIsImhhbmRsZXIiLCJEaXRvRGlhbG9nIiwiZXJyIiwidGl0bGUiLCJ0ZXh0IiwibG9nIiwic3RyaXBUYWdzIiwibm90aWZpY2F0aW9ucyIsImR1cmF0aW9uRmFjdG9yIiwicmVqZWN0IiwiZGlhbG9nSWQiLCJhZGRpdGlvbmFsQ29tcG9uZW50cyIsInJlZGlyZWN0QWZ0ZXJMb2dpbiIsImxvZ2luRGF0YSIsInVzZXIiLCJEaXRvVmlldyIsImZ1bGxQYXRoIiwiYWRkUm91dGVzIiwicm91dGVyIiwicmVtb3ZlcnMiLCJyb3V0ZSIsInJlbW92ZVJvdXRlIiwiRGl0b1NwaW5uZXIiLCJjb2xvciIsIlB1bGxkb3duTWl4aW4iLCJzdGFydFRpbWUiLCJvcGVuIiwiY29udGVudCIsImFzT2JqZWN0IiwiSXRlbU1peGluIiwiZXh0ZW5kZWQiLCJpdGVtTGFiZWwiLCJmb3JtTGFiZWwiLCJnZXRGb3JtTGFiZWwiLCJwcmVmaXgiLCJzdWZmaXgiLCJjb2x1bW5zIiwiaGFkTGFiZWwiLCJwYW5lIiwiY3VycmVudFRhYiIsImZpcnN0IiwiZGVmYXVsdFRhYiIsImRhdGFQYXRoT3JOYW1lIiwiZXhwYW5kIiwiY29tcG9uZW50c0J5RGF0YVBhdGgiLCJkYXRhUGF0aHMiLCJjaGVjayIsInVubWF0Y2hlZCIsImVycnMiLCJmdWxsRGF0YVBhdGgiLCJkYXRhUGF0aFBhcnRzIiwiZm91bmQiLCJwcm9wZXJ0eSIsInN1YkNvbXBvbmVudHMiLCJyZWdpc3RyeSIsImVudHJpZXNCeURhdGFQYXRoIiwiX2hvaXN0ZWRfMSIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX0ZyYWdtZW50IiwiX3JlbmRlckxpc3QiLCJfY3R4IiwiX2hvaXN0ZWRfMiIsIl9jcmVhdGVCbG9jayIsIl9jb21wb25lbnRfRGl0b0NvbnRhaW5lciIsIm5lc3RlZERhdGFQYXRoIiwic3RvcmUiLCJfaG9pc3RlZF8zIiwicGFyc2VGcmFjdGlvbiIsImRpdmlkZW5kIiwiZGl2aXNvciIsImNvbnRhaW5lckNsYXNzIiwiYmFzaXMiLCJncm93Iiwic2hyaW5rIiwiYmFzaXNJc0F1dG8iLCJoYXNWTm9kZUNvbnRlbnQiLCJ2bm9kZSIsIkNvbW1lbnQiLCJoYXNTbG90Q29udGVudCIsInNsb3QiLCJ1c2VTbG90cyIsImNhcGl0YWxpemUiLCJjbGlwYm9hcmREYXRhIiwicGFzdGUiLCJyZXBvcnQiLCJqc29uIiwiX2QiLCJfYyIsImRlaW5kZW50IiwiJHNjaGVtYSIsIl9lIiwiTG9hZGluZ01peGluIiwidXBkYXRlUm9vdCIsInVwZGF0ZVZpZXciLCJSZXNvdXJjZU1peGluIiwiYW1vdW50IiwidmVyYnMiLCJjbGVhciIsImxvYWRpbmdPcHRpb25zIiwicmVxdWVzdCIsInNldERhdGEiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwibm90aWZ5U3VjY2VzcyIsIm5vdGlmeUVycm9yIiwicmVzb2x2ZVBhdGgiLCJpc0NyZWF0aW5nIiwicHJvdmlkZXNEYXRhIiwiZGF0YVBhcnRzIiwicGF0aFBhcnRzIiwicm91dGVQYXJ0cyIsImxhc3REYXRhUGFydCIsImwiLCJkYXRhUGFydCIsIm1haW5TY2hlbWFDb21wb25lbnQiLCJwcmVzZW50IiwiY2xvc2VGb3JtIiwiZ2V0VmVyYiIsImJ1dHRvblJlc291cmNlIiwic3VjY2VzcyIsIl9yZXNvdXJjZSIsIl9tZXRob2QiLCJEaXRvRm9ybSIsInNjb3BlIiwiUGFnaW5hdGlvbiIsIlNvcnRhYmxlTWl4aW4iLCJmb3JjZUZhbGxiYWNrIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsImxpc3QiLCJwYWdpbmF0aW9uUmFuZ2UiLCJvZmZzZXQiLCJfbm9ybWFsaXplU3R5bGUiLCJfY2FjaGUiLCJfd2l0aE1vZGlmaWVycyIsIiRldmVudCIsIl9ub3JtYWxpemVDbGFzcyIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfaG9pc3RlZF80IiwiX3RvRGlzcGxheVN0cmluZyIsIl9ob2lzdGVkXzUiLCJfaG9pc3RlZF83IiwiX21lcmdlUHJvcHMiLCJfd2l0aERpcmVjdGl2ZXMiLCJfaG9pc3RlZF84IiwiX2NvbXBvbmVudF9EaXRvTGFiZWwiLCJfY3JlYXRlVk5vZGUiLCJfY29tcG9uZW50X0RpdG9UYWJsZUNlbGwiLCJfY29tcG9uZW50X0RpdG9EcmFnZ2FibGUiLCJfY29tcG9uZW50X0RpdG9UcmVlSXRlbSIsImNoaWxkcmVuU2NoZW1hIiwiY2hpbGRyZW5MaXN0IiwiZWRpdFBhdGgiLCJjaGlsZHJlbk9wZW4iLCJudW1DaGlsZHJlbiIsImNyZWF0YWJsZSIsImVkaXRhYmxlIiwib3JkZXIiLCJjb2x1bW4iLCJyZW5kZXIiLCJlc2NhcGVIdG1sIiwiX19kZWZQcm9wIiwiX19nZXRPd25Qcm9wU3ltYm9scyIsIl9faGFzT3duUHJvcCIsIl9fcHJvcElzRW51bSIsIl9fZGVmTm9ybWFsUHJvcCIsIm9iaiIsIl9fc3ByZWFkVmFsdWVzIiwicHJvcCIsIl9fb2JqUmVzdCIsInVzZVNvcnRhYmxlIiwic29ydGFibGUiLCJkb2N1bWVudCIsImRlZmF1bHREb2N1bWVudCIsInJlc2V0T3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiZSIsIm1vdmVBcnJheUVsZW1lbnQiLCJTb3J0YWJsZSIsInN0b3AiLCJ0cnlPbk1vdW50ZWQiLCJ0cnlPblNjb3BlRGlzcG9zZSIsInRvVmFsdWUiLCJuZXh0VGljayIsIlVzZVNvcnRhYmxlIiwidXNlVk1vZGVsIiwiRGl0b1ZOb2RlIiwiRGl0b1R5cGVDb21wb25lbnQkMSIsIkRpdG9UeXBlQ29tcG9uZW50Iiwib25DbGljayIsIkRhdGFNaXhpbiIsInJlc29sdmVDb3VudGVyIiwiYXN5bmNFbnRyeSIsInJlc29sdmVkRGF0YSIsImxvYWQiLCJPcHRpb25zTWl4aW4iLCJjb252ZXJ0VmFsdWUiLCJjb252ZXJ0Iiwic2VhcmNoIiwiZmlsdGVyIiwiZGVib3VuY2UiLCJkZWJvdW5jZUFzeW5jIiwib3B0aW9uIiwiZ3JvdXBlZCIsInJlc3VsdHMiLCJncm91cCIsImZpbmRPcHRpb24iLCJncm91cEJ5Iiwib3B0aW9uVmFsdWUiLCJvcHRpb25MYWJlbCIsInByb2Nlc3NSZWxhdGUiLCJmbGFzayIsIkNvZGVGbGFzayIsImNoYW5nZWQiLCJpZ25vcmVXYXRjaCIsImlnbm9yZVVwZGF0ZSIsInNldENvZGUiLCJjb2RlIiwic2V0VmFsdWUiLCJTa2V0Y2hQaWNrZXIiLCJ0aW55Y29sb3IiLCJmb2N1c2VkIiwiRGF0ZVRpbWVQaWNrZXIiLCJTb3VyY2VNaXhpbiIsImRlZmF1bHRTb3J0IiwiZGlyZWN0aW9uIiwiZHJhZ2dhYmxlIiwiY29sbGFwc2libGUiLCJsaXN0RGF0YSIsIm9uQ29tcGxldGUiLCJvcGVuZWQiLCJjYWxsT25Db21wbGV0ZSIsImlubGluZWQiLCJwYXJhbSIsIm1ldGEiLCJmb3JtTWV0YSIsImNoaWxkUm91dGVzIiwiZ2V0UGF0aFdpdGhQYXJhbSIsInNvdXJjZVBhdGgiLCJmb3JtUm91dGUiLCJmbGF0Um91dGVzIiwic3ViUm91dGVzIiwiY2hpbGRSb3V0ZSIsImZpbHRlckNvbXBvbmVudHMiLCJkYXRlRm9ybWF0IiwiZ2V0RmlsdGVyc1BhbmVsIiwiZmlsdGVycyIsInByb3h5IiwicGFyc2VGaWx0ZXJzRGF0YSIsImdldEZpbHRlcnNDb21wb25lbnRzIiwiZm9ybWF0RmlsdGVyc0RhdGEiLCJjb21wcyIsImdldENvbXBvbmVudHNGb3JGaWx0ZXIiLCJmaWx0ZXJzRGF0YSIsIl9jb21wb25lbnRfRGl0b1RhYmxlSGVhZCIsIl9jb21wb25lbnRfRGl0b1NjaGVtYUlubGluZWQiLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJfY29tcG9uZW50X0RpdG9FZGl0QnV0dG9ucyIsIl9ob2lzdGVkXzkiLCJnZXRMaXN0Q29tcG9uZW50IiwiZmlsdGVyc0RhdGFQYXRoIiwiRWRpdG9yQ29udGVudCIsIkljb24iLCJlZGl0b3IiLCJtYXJrQnV0dG9ucyIsImJhc2ljTm9kZUJ1dHRvbnMiLCJvdGhlck5vZGVCdXR0b25zIiwidG9vbEJ1dHRvbnMiLCJlbmFibGVSdWxlcyIsInNldFZhbHVlRGVib3VuY2VkIiwib25VcGRhdGUiLCJFZGl0b3IiLCJnZXRQb2ludCIsIngiLCJ5IiwicHJldlkiLCJtb3VzZW1vdmUiLCJkaWFsb2dDb21wb25lbnQiLCJnZXRNYXJrQXR0cmlidXRlcyIsImhyZWYiLCJtYXJrcyIsIm5vZGVzIiwidG9vbHMiLCJEb2N1bWVudCIsIlRleHQiLCJQYXJhZ3JhcGgiLCJCb2xkIiwiSXRhbGljIiwiVW5kZXJsaW5lIiwiU3RyaWtlIiwiU21hbGwiLCJDb2RlIiwiTGlua1dpdGhUaXRsZSIsIkJsb2NrcXVvdGUiLCJDb2RlQmxvY2siLCJIYXJkQnJlYWsiLCJIZWFkaW5nIiwiSG9yaXpvbnRhbFJ1bGUiLCJMaXN0SXRlbSIsIkJ1bGxldExpc3QiLCJPcmRlcmVkTGlzdCIsIkhpc3RvcnkiLCJleHRlbnNpb24iLCJzZXR0aW5nc05hbWUiLCJkZXNjcmlwdGlvbnMiLCJhZGRCdXR0b24iLCJpY29uIiwiaWdub3JlQWN0aXZlIiwiZGVzY3JpcHRpb24iLCJzZXR0aW5nTmFtZSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJNYXJrIiwiY29tbWFuZHMiLCJMaW5rIiwibm9kZSIsIl9jb21wb25lbnRfVnVlTXVsdGlzZWxlY3QiLCJWdWVNdWx0aXNlbGVjdCIsInBsYWNlaG9sZGVyIiwic2VhcmNoYWJsZSIsInRhZ2dhYmxlIiwidGFnIiwiTnVtYmVyTWl4aW4iLCJTd2l0Y2hCdXR0b24iLCJtYXNrZWRQYXNzd29yZCIsImhhc0VkaXRhYmxlRm9ybXMiLCJmb3JtYXRGaWxlU2l6ZSIsImZpbGVzaXplIiwiVnVlVXBsb2FkIiwiYXNGaWxlcyIsImFjY2VwdCIsIm1heFNpemUiLCJwYXJzZUZpbGVTaXplIiwiZmlsZSIsIm5ld0ZpbGUiLCJvbGRGaWxlIiwieGhyIiwiZmlsZXMiLCJ1cGxvYWQiLCJsb2dnZWREZXByZWNhdGlvbnMiLCJkZXByZWNhdGUiLCJEaXRvQWRtaW4iLCJkaXRvIiwidmlld3MiLCJnZXRBcGlVcmwiLCJpc0FwaVVybCIsInZhbCIsInVzZXJzIiwicGFyZW50UGF0aCIsImFwcCIsImNyZWF0ZUFwcCIsIkRpdG9Sb290IiwiVnVlTm90aWZpY2F0aW9ucyIsImNyZWF0ZVJvdXRlciIsImNyZWF0ZVdlYkhpc3RvcnkiLCJSZXF1ZXN0RXJyb3IiLCJoZWFkZXJzIiwiaXNBYnNvbHV0ZVVybCIsImNvbWJpbmVVcmxzIiwiZm9ybWF0UXVlcnkiLCJiYXNlVXJsIiwicmVsYXRpdmVVcmwiXSwibWFwcGluZ3MiOiJtcEdBRUEsTUFBQUEsR0FBZUMsV0FBUyxDQUN0QixNQUFPLEdBQ1AsZ0JBQWlC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RUFBSSxTQUFTNUgsQ0FBRyxFQUUzQkksRUFBVyxNQUFNLE1BQU13SCxFQUFJLFVBQVUsQ0FBRSxJQUFBNUgsRUFBSyxNQUFBRCxDQUFLLENBQUUsRUFBRyxDQUMxRCxPQUFRRSxFQUFPLFlBQWEsRUFDNUIsR0FBSTVFLEdBQVEsQ0FBRSxLQUFNLEtBQUssVUFBVUEsQ0FBSSxHQUN2QyxRQUFTLENBQ1AsR0FBSXl3QixHQUFZbGtCLEVBQUksUUFDcEIsR0FBRzZrQixDQUNKLEVBQ0QsWUFDRVgsS0FBWXh1QixFQUFBc0ssRUFBSSxPQUFKLE1BQUF0SyxFQUFVLGFBQ2xCLFVBQ0EsYUFDVixDQUFHLEVBTUQsSUFKSTZHLEVBQUEvRCxFQUFTLFFBQVEsSUFBSSxjQUFjLElBQW5DLE1BQUErRCxFQUFzQyxTQUFTLHNCQUNqRC9ELEVBQVMsS0FBTyxNQUFNQSxFQUFTLEtBQU0sR0FHbkMsQ0FBQ0EsRUFBUyxHQUNaLE1BQU0sSUFBSW9zQixHQUFhcHNCLENBQVEsRUFFakMsT0FBT0EsQ0FDVCxDQUVBLFNBQVMwckIsR0FBU2xrQixFQUFLNUgsRUFBSyxDQUMxQixNQUFPLENBQUMwc0IsRUFBYSxjQUFDMXNCLENBQUcsR0FBS0EsRUFBSSxXQUFXNEgsRUFBSSxHQUFHLENBQ3RELENBRUEsU0FBU2lrQixHQUFVamtCLEVBQUssQ0FBRSxJQUFBNUgsRUFBSyxNQUFBRCxDQUFLLEVBQUksQ0FDakMyc0IsRUFBQUEsY0FBYzFzQixDQUFHLElBQ3BCQSxFQUFNMnNCLEdBQVkva0IsRUFBSSxJQUFLNUgsQ0FBRyxHQUdoQyxNQUFNMmlCLEVBQVNpSyxHQUFZN3NCLENBQUssRUFDaEMsT0FBTzRpQixFQUFTLEdBQUczaUIsS0FBTzJpQixJQUFXM2lCLENBQ3ZDLENBRUEsU0FBUzJzQixHQUFZRSxFQUFTQyxFQUFhLENBRXpDLE1BQU8sR0FBR0QsRUFBUSxRQUFRLE9BQVEsRUFBRSxLQUFLQyxFQUFZLFFBQVEsT0FBUSxFQUFFLEdBQ3pFLENBRUEsU0FBU0YsR0FBWTdzQixFQUFPLENBQzFCLE1BQU1nRixFQUFVaEYsRUFDWmpELEVBQUFBLFFBQVFpRCxDQUFLLEVBQ1hBLEVBQ0EsT0FBTyxRQUFRQSxDQUFLLEVBQ3RCLENBQUUsRUFDTixPQUFPLElBQUksZ0JBR1RnRixFQUFRLE9BQ04sQ0FBQ0EsRUFBUyxDQUFDakosRUFBS0ksQ0FBSyxJQUFNLENBQ3pCLFVBQVc2dkIsS0FBT3h0QixVQUFRckMsQ0FBSyxFQUM3QjZJLEVBQVEsS0FBSyxDQUFDakosRUFBS2l3QixDQUFHLENBQUMsRUFFekIsT0FBT2huQixDQUNSLEVBQ0QsQ0FBRSxDQUNILENBQ0YsRUFBQyxTQUFVLENBQ2QiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDYsODNdfQ==