@regle/core 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1,1656 @@
1
- import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';function F(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ie(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Ce(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(i=>i.trim()).filter(i=>i.includes("=")).length+e.length}function se(e,...t){let{message:r,validator:n,active:a,...i}=e,$=n.constructor.name==="AsyncFunction";return {...{validator(v,...l){return e.validator(v,...F(l.length?l:t))},message(v,l){return typeof e.message=="function"?e.message(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.message},active(v,l){return typeof e.active=="function"?e.active(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.active??!0},exec(v){let l=e.validator(v,...F(t)),o;return l instanceof Promise?l.then(C=>(o=C,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=l,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...i,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ie(t)}}function ue(e){if(typeof e.validator=="function"){let r=se(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ce(e.validator)>1){let a=function(...i){return se(e,...i)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function De(e){return k(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Ze(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function Ze(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function ce(e,t,r){return e instanceof Function?e(t,r??0):e}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function fe(e,t,r){let n,a=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},0);}),a}function Re(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),i=shallowRef(new Map);function $(p){let R=t.value.get(p);if(R)return R;{let c=ref({});return t.value.set(p,c),c}}function x(p){let R=r.value.get(p);if(R)return R;{let c=ref([]);return r.value.set(p,c),c}}function D(p,R,c){i.value.set(`${p}-${R}`,c);}function v(p,R){return i.value.get(`${p}-${R}`)}function l(p,R){p&&R!=null&&i.value.delete(`${p}-${R}`);}function o(p,R){n.value.set(p,R);}function C(p){return n.value.get(p)??!1}function b(p,R){e.value.set(p,R);}function g(p,R){let c=e.value.get(p);return c?s(R,c)?{valid:!0}:{valid:!1}:void 0}function s(p,R){let c=Object.keys(R),I=Object.keys(p);return I.length!==c.length||!I.every(y=>c.includes(y))?!1:I.every(y=>{let d=p[y],u=R[y];return !u||!d||typeof d=="function"||typeof u=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((f,h)=>{if(typeof u=="number"||typeof u=="boolean")return !0;{let m=F(u._params),P=F(d._params);return m?.[h]===P?.[h]}}):!0})}function A(p){let R=a.value.get(p);if(R)return R;{let c=ref(!1),I=ref(!0),E=ref({}),y=ref(!1);return a.value.set(p,{$pending:c,$valid:I,$metadata:E,$validating:y}),{$pending:c,$valid:I,$metadata:E,$validating:y}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),i.value.clear();}),{addRuleDeclEntry:b,setDirtyEntry:o,checkRuleDeclEntry:g,getDirtyState:C,trySetRuleStatusRef:A,getFieldsEntry:$,getCollectionsEntry:x,getArrayStatus:v,addArrayStatus:D,deleteArrayStatus:l,arrayStatusStorage:i}}function Pe(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>pe(r))}function we(e){return !!e.value&&"$each"in e.value}function Oe(e){return !!e.value&&k(e.value)}function pe(e){return k(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function de(e){return k(e)&&"$fields"in e}function me(e){return !!e&&"$each"in e}function ge(e){return !!e&&"$rules"in e}function $e(e){return "$each"in e||"$errors"in e}function G({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e,t=!1){return de(e)?q(e.$fields):me(e)?{$errors:e.$field.$rules?G({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Ae(r,t))}:ge(e)?e.$error?G({field:e,silent:t}):e.$externalErrors??[]:[]}function te(e,t=!1){return e.map(r=>Ae(r,t))}function q(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>de(n)?[r,q(n.$fields,t)]:me(n)?[r,{$errors:G({field:n.$field,silent:t}),$each:te(n.$each,t)}]:ge(n)?n.$error?[r,G({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Me(e){return computed(()=>q(e.$fields))}var re=(r=>(r.Inline="__inline",r.Async="__async",r))(re||{});function je(e,t){return computed(()=>e.value.some(r=>r[t]))}function Ve(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function tt(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?tt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function ke({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:i,storage:$}){let x=effectScope(),D,v,{$pending:l,$valid:o,$metadata:C,$validating:b}=$.trySetRuleStatusRef(`${i}.${n}`);function g(){D=x.run(()=>{let R=computed(()=>({$invalid:!o.value,$params:d.value,...C.value})),c=computed(()=>X(r)?typeof r.value.active=="function"?r.value.active(a.value,R.value):r.value.active:!0),I=computed(()=>{let f="",h=t?t[n]?.message:void 0;return h&&(typeof h=="function"?f=h(a.value,R.value):f=h),X(r)&&(h&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,R.value):f=r.value.message)),ee(f)&&(f="Error",console.warn(`No error message defined for ${i}.${n}`)),f}),E=computed(()=>X(r)&&r.value.type?Object.values(re).includes(r.value.type)?n:r.value.type:n),y=computed(()=>X(r)?r.value.validator:r.value),d=computed(()=>typeof r.value=="function"?[]:F(r.value._params??[])),u=computed(()=>`${i}.${E.value}`);return {$active:c,$message:I,$type:E,$validator:y,$params:d,$path:u}}),v=watch(D.$params,s,{deep:!0});}g();async function s(){b.value=!0;let R=D.$validator.value,c=!1,I=R(a.value,...D.$params.value);if(I instanceof Promise)try{o.value=!0,e.value&&(l.value=!0);let E=await I;if(typeof E=="boolean")c=E;else {let{$valid:y,...d}=E;c=y,C.value=d;}}catch{c=!1;}finally{l.value=!1;}else if(I!=null)if(typeof I=="boolean")c=I;else {let{$valid:E,...y}=I;c=E,C.value=y;}return o.value=c,b.value=!1,c}function A(){o.value=!0,C.value={},l.value=!1,b.value=!1,g();}function p(){v(),x.stop(),x=effectScope();}return reactive({...D,$pending:l,$valid:o,$metadata:C,$validate:s,$unwatch:p,$watch:g,$reset:A})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){let v=effectScope(),l,o=ref(!1),C=ref(!1),b=ref([]),g,s,A,p,R=()=>{};function c(){b.value=$.value??[];}c();function I(){let S=t.value,T=a.checkRuleDeclEntry(n,S);f.value=Object.fromEntries(Object.entries(S).filter(([O])=>O.startsWith("$"))),u.value=Object.fromEntries(Object.entries(t.value).filter(([O])=>!O.startsWith("$")).map(([O,_])=>{if(_){let oe=toRef(()=>_);return [O,ke({$dirty:o,customMessages:r,rule:oe,ruleKey:O,state:e,path:n,storage:a})]}return []}).filter(O=>!!O.length)),y(),R=l.$debounce.value?fe(d,l.$debounce.value??0):d,T?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&R()),a.addRuleDeclEntry(n,S);}function E(){u.value&&Object.entries(u.value).forEach(([S,T])=>{T.$unwatch();}),p(),o.value&&a.setDirtyEntry(n,o.value),g(),s(),A(),v.stop(),v=effectScope(),D?.();}function y(){u.value&&Object.entries(u.value).forEach(([S,T])=>{T.$watch();}),l=v.run(()=>{let S=computed(()=>o.value),T=computed(()=>f.value.$debounce),O=computed(()=>f.value.$lazy!=null?f.value.$lazy:unref(i.lazy)),_=computed(()=>f.value.$rewardEarly!=null?f.value.$rewardEarly:unref(i.rewardEarly)),oe=computed(()=>f.value.$autoDirty!=null?f.value.$autoDirty:unref(i.autoDirty)),qe=computed(()=>ie.value&&!xe.value&&o.value),Le=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:u.value}})),Je=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:u.value},silent:!0})),xe=computed(()=>C.value||!_.value?Object.entries(u.value).some(([K,Q])=>Q.$pending):!1),ie=computed(()=>b.value?.length?!0:!_.value||_.value&&C.value?Object.entries(u.value).some(([K,Q])=>!Q.$valid):!1),Te=computed(()=>o.value&&!ee(e.value)?b.value?.length?!1:_.value?Object.entries(u.value).every(([K,Q])=>Q.$valid):!ie.value:!1);return watch(Te,K=>{K&&(C.value=!1);}),{$error:qe,$pending:xe,$invalid:ie,$valid:Te,$debounce:T,$lazy:O,$errors:Le,$silentErrors:Je,$rewardEarly:_,$autoDirty:oe,$anyDirty:S}}),A=watch($,c),g=watch(e,()=>{l.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&I(),R(),l.$rewardEarly.value;},{deep:!0}),p=watch(o,()=>{a.setDirtyEntry(n,o.value);}),s=watch(l.$valid,S=>{l.$rewardEarly.value&&S&&(C.value=!1);});}function d(){Object.entries(u.value).forEach(([S,T])=>{T.$validate();});}let u=ref(),f=ref();I();function h(){o.value=!1,b.value=[],Object.entries(u.value).forEach(([S,T])=>{T.$reset();}),l.$lazy.value||Object.entries(u.value).map(([S,T])=>T.$validate());}function m(){o.value=!0,l.$rewardEarly.value,R();}let P=l.$debounce.value?fe(w,l.$debounce.value??0):w;async function w(){try{if(C.value=!0,l.$anyDirty.value&&!l.$pending)return !l.$error.value;{let S=Object.entries(u.value).map(([O,_])=>_.$validate());return (await Promise.allSettled(S)).every(O=>O.status==="fulfilled"?O.value:!1)}}catch{return !1}}function M(){b.value=[];}return l.$lazy.value||w(),reactive({$dirty:o,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$errors:l.$errors,$silentErrors:l.$silentErrors,$externalErrors:b,$value:e,$rules:u,$reset:h,$touch:m,$validate:P,$unwatch:E,$watch:y,$clearExternalErrors:M})}function Be({$id:e,path:t,index:r,options:n,storage:a,value:i,customMessages:$,rules:x,externalErrors:D}){let v=x.$key?x.$key:ve(),l=`${t}.${String(v)}`;typeof i[r]=="object"&&i[r]!=null&&(i[r].$id?l=`${t}.${i[r].$id}`:Object.defineProperties(i[r],{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRefs(i),C=toRef(()=>D.value?.[r]),b=le({state:o[r],rulesDef:toRef(()=>x),customMessages:$,path:l,storage:a,options:n,externalErrors:C});if(b){let g=i[r]?.$id;b.$id=g??String(v),a.addArrayStatus(e,b.$id,b);}return b}function We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$}){let x=effectScope(),D,v=effectScope(),l;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),C=ref(e.value),b=null,g=ref({}),s=a.getCollectionsEntry(n);l=v.run(()=>{let u=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>pe(m)):!1),f=computed(()=>$.value?$e($.value)?$.value.$errors??[]:[]:[]),h=computed(()=>$.value?$e($.value)?$.value.$each??[]:[]:[]);return {isPrimitiveArray:u,$externalErrorsField:f,$externalErrorsEach:h}}),A(),R();function A(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ve(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!l.isPrimitiveArray.value&&(C.value=g.value.$value,Array.isArray(e.value)&&t.value.$each?s.value=e.value.map((u,f)=>{let h=ce(t.value.$each,toRef(()=>e.value[f]),f);if(h){let m=Be({$id:o.value,path:n,rules:h,value:e.value,index:f,options:i,storage:a,externalErrors:l.$externalErrorsEach});return m||null}}).filter(u=>!!u):s.value=[],g.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:l.$externalErrorsField}));}function p(){if(Array.isArray(e.value)){let u=B(s.value);s.value=e.value.map((f,h)=>{if(f.$id&&s.value.find(m=>m.$id===f.$id)){let m=a.getArrayStatus(o.value,f.$id);return m?(m.$value=toRef(()=>f),m):null}else {let m=ce(t.value.$each,toRef(()=>toRef(()=>f)),h);if(m){let P=Be({$id:o.value,path:n,rules:m,value:e.value,index:h,options:i,storage:a,externalErrors:l.$externalErrorsEach});return P||null}}}).filter(f=>!!f),u.filter(f=>!e.value.find(h=>f.$id===h.$id)).forEach((f,h)=>{a.deleteArrayStatus(o.value,h.toString());});}else s.value=[];}function R(){b=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?A():p();},{deep:!0,flush:"pre"}),D=x.run(()=>{let u=computed(()=>g.value.$dirty&&s.value.every(T=>T.$dirty)),f=computed(()=>g.value.$anyDirty||s.value.some(T=>T.$dirty)),h=computed(()=>g.value.$invalid||s.value.some(T=>T.$invalid)),m=computed(()=>g.value.$valid&&s.value.every(T=>T.$valid)),P=computed(()=>g.value.$error||s.value.some(T=>T.$error)),w=computed(()=>g.value.$pending||s.value.some(T=>T.$pending)),M=computed(()=>({$errors:G({field:g.value,silent:!1}),$each:te(s.value)})),S=computed(()=>({$errors:G({field:g.value,silent:!0}),$each:te(s.value,!0)}));return {$dirty:u,$anyDirty:f,$invalid:h,$valid:m,$error:P,$pending:w,$errors:M,$silentErrors:S}}),l.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),b());}function c(){b&&b(),g.value&&g.value.$unwatch(),s.value&&s.value.forEach(u=>{"$dirty"in u&&u.$unwatch();}),x.stop(),x=effectScope(),v.stop(),v=effectScope(!0);}function I(){g.value.$touch(),s.value.forEach(u=>{u.$touch();});}function E(){g.value.$reset(),s.value.forEach(u=>{u.$reset();});}async function y(){try{return (await Promise.all([g.value.$validate(),...s.value.map(f=>f.$validate())])).every(f=>!!f)}catch{return !1}}function d(){}return reactive({$field:g,...D,$each:s,$value:e,$validate:y,$unwatch:c,$watch:R,$touch:I,$reset:E,$clearExternalErrors:d})}function Ee({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:i,options:$,externalErrors:x,validationGroups:D}){let v,l,o;function g(y=!0,d=!1){s.value=null,triggerRef(s);let u=Object.fromEntries(Object.entries(e.value).map(([m,P])=>{if(P){let w=toRef(t.value,m),M=toRef(()=>P),S=toRef(()=>x.value?.[m]);return [m,le({state:w,rulesDef:M,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:S})]}return []}).filter(m=>!!m.length&&m[1]!=null)),f=Object.fromEntries(Object.entries(unref(x)??{}).filter(([m])=>!(m in e.value)).map(([m,P])=>{if(P){let w=toRef(()=>({})),M=toRef(()=>P);return [m,le({state:ref(void 0),rulesDef:w,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:M})]}return []})),h=Object.fromEntries(Object.entries(D?.(u)??{}).map(([m,P])=>P.length?[m,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(w=>[w,je(toRef(()=>P),w)])),...Object.fromEntries(["$errors","$silentErrors"].map(w=>[w,Ve(toRef(()=>P),w)]))}]:[]));s.value={...u,...f,...h},y&&c();}let s=i.getFieldsEntry(n);g();function A(){g(!1),Object.entries(s.value).forEach(([y,d])=>{d.$reset();}),c();}function p(){Object.entries(s.value).forEach(([y,d])=>{d.$touch();});}async function R(){try{return (await Promise.allSettled(Object.entries(s.value).map(([d,u])=>u.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function c(){a&&(o=watch(a,()=>{I(),g();},{deep:!0,flush:"post"})),v=effectScope(),l=v.run(()=>{let y=computed(()=>!!Object.entries(s.value).length&&Object.entries(s.value).every(([M,S])=>S.$dirty)),d=computed(()=>Object.entries(s.value).some(([M,S])=>S.$dirty)),u=computed(()=>Object.entries(s.value).some(([M,S])=>S.$invalid)),f=computed(()=>Object.entries(s.value).every(([M,S])=>S.$valid)),h=computed(()=>Object.entries(s.value).some(([M,S])=>S.$error)),m=computed(()=>Object.entries(s.value).some(([M,S])=>S.$pending)),P=computed(()=>q(s.value)),w=computed(()=>q(s.value,!0));return {$dirty:y,$anyDirty:d,$invalid:u,$valid:f,$error:h,$pending:m,$errors:P,$silentErrors:w}});}function I(){s.value&&Object.entries(s.value).forEach(([y,d])=>{d.$unwatch();}),o?.(),v.stop(),v=effectScope();}function E(){Object.entries(s.value).forEach(([y,d])=>{d.$clearExternalErrors();});}return reactive({...l,$fields:s,$value:t,$reset:A,$touch:p,$validate:R,$unwatch:I,$watch:c,$clearExternalErrors:E})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){return we(t)?We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Pe(e,t)&&De(e)?Ee({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Oe(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$,onUnwatch:D}):null}function be(e,t,r,n){let a=Re(),i=computed(()=>unref(r.externalErrors)),$=reactive(Ee({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:i,validationGroups:r.validationGroups})),x=Me($);return {regle:$,errors:x}}function he(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,i,$){let x=isRef(i)?i:computed(typeof i=="function"?i:()=>i),D={...r,...$},v=isRef(a)?a:ref(a),l=B(toRaw(v.value)),{regle:o,errors:C}=be(x,v,D,e);function b(){o.$unwatch(),g(a,l),o.$reset();}function g(p,R){Object.entries(R).forEach(([c,I])=>{let E=isRef(p)?p.value:p,y=isRef(E[c])?E[c].value:E[c],d=isRef(R[c])?R[c]._value:R[c];Array.isArray(d)&&Array.isArray(y)?(E[c]=[],d.forEach((u,f)=>{E[c][f]={},g(E[c][f],d[f]);})):k(d)?g(y,d):isRef(E[c])?E[c].value=d:E[c]=d;});}let s=computed(()=>!(o.$invalid||o.$pending));async function A(){return o.$touch(),await o.$validate()?v.value:!1}return {regle:o,errors:C,resetAll:b,validateState:A,ready:s,state:v}}return n}var He=he();function ze({rules:e,modifiers:t}){return he(e,t)}export{re as InternalRuleType,ue as createRule,ze as defineRegleConfig,F as unwrapRuleParameters,He as useRegle};
1
+ import { unref, version, isRef, toRef, computed, ref, toRaw, reactive, shallowRef, onScopeDispose, triggerRef, watch, effectScope } from 'vue';
2
+
3
+ // src/core/createRule/unwrapRuleParameters.ts
4
+ function unwrapRuleParameters(params) {
5
+ return params.map((param) => {
6
+ if (param instanceof Function) {
7
+ return param();
8
+ }
9
+ return unref(param);
10
+ });
11
+ }
12
+ function createReactiveParams(params) {
13
+ return params.map((param) => {
14
+ if (param instanceof Function) {
15
+ return param;
16
+ } else if (isRef(param)) {
17
+ return param;
18
+ }
19
+ return toRef(() => param);
20
+ });
21
+ }
22
+ function getFunctionParametersLength(func) {
23
+ const funcStr = func.toString();
24
+ const isArrowFunction = funcStr.includes("=>");
25
+ const params = (isArrowFunction ? funcStr.split("=>")[0] : funcStr).slice(funcStr.indexOf("(") + 1, funcStr.indexOf(")")).split(",").map((param) => param.trim());
26
+ const defaults = params.filter((param) => param.includes("="));
27
+ return defaults.length + func.length;
28
+ }
29
+
30
+ // src/core/createRule/defineRuleProcessors.ts
31
+ function defineRuleProcessors(definition, ...params) {
32
+ const { message, validator, active, ...properties } = definition;
33
+ const isAsync = validator.constructor.name === "AsyncFunction";
34
+ const defaultProcessors = {
35
+ validator(value, ...args) {
36
+ return definition.validator(value, ...unwrapRuleParameters(args.length ? args : params));
37
+ },
38
+ message(value, metadata) {
39
+ if (typeof definition.message === "function") {
40
+ return definition.message(value, {
41
+ ...metadata,
42
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
43
+ });
44
+ } else {
45
+ return definition.message;
46
+ }
47
+ },
48
+ active(value, metadata) {
49
+ if (typeof definition.active === "function") {
50
+ return definition.active(value, {
51
+ ...metadata,
52
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
53
+ });
54
+ } else {
55
+ return definition.active ?? true;
56
+ }
57
+ },
58
+ exec(value) {
59
+ const validator2 = definition.validator(value, ...unwrapRuleParameters(params));
60
+ let rawResult;
61
+ if (validator2 instanceof Promise) {
62
+ return validator2.then((result) => {
63
+ rawResult = result;
64
+ if (typeof rawResult === "object" && "$valid" in rawResult) {
65
+ return rawResult.$valid;
66
+ } else if (typeof rawResult === "boolean") {
67
+ return rawResult;
68
+ }
69
+ return false;
70
+ });
71
+ } else {
72
+ rawResult = validator2;
73
+ }
74
+ if (typeof rawResult === "object" && "$valid" in rawResult) {
75
+ return rawResult.$valid;
76
+ } else if (typeof rawResult === "boolean") {
77
+ return rawResult;
78
+ }
79
+ return false;
80
+ }
81
+ };
82
+ const processors = {
83
+ ...defaultProcessors,
84
+ ...properties,
85
+ ...{
86
+ _validator: definition.validator,
87
+ _message: definition.message,
88
+ _active: definition.active,
89
+ _type: definition.type,
90
+ _patched: false,
91
+ _async: isAsync,
92
+ _params: createReactiveParams(params)
93
+ }
94
+ };
95
+ return processors;
96
+ }
97
+
98
+ // src/core/createRule/createRule.ts
99
+ function createRule(definition) {
100
+ if (typeof definition.validator === "function") {
101
+ let fakeParams = [];
102
+ const staticProcessors = defineRuleProcessors(definition, ...fakeParams);
103
+ const isAsync = definition.validator.constructor.name === "AsyncFunction";
104
+ if (getFunctionParametersLength(definition.validator) > 1) {
105
+ const ruleFactory = function(...params) {
106
+ return defineRuleProcessors(definition, ...params);
107
+ };
108
+ ruleFactory.validator = staticProcessors.validator;
109
+ ruleFactory.message = staticProcessors.message;
110
+ ruleFactory.active = staticProcessors.active;
111
+ ruleFactory.type = staticProcessors.type;
112
+ ruleFactory.exec = staticProcessors.exec;
113
+ ruleFactory._validator = staticProcessors.validator;
114
+ ruleFactory._message = staticProcessors.message;
115
+ ruleFactory._active = staticProcessors.active;
116
+ ruleFactory._type = definition.type;
117
+ ruleFactory._patched = false;
118
+ ruleFactory._async = isAsync;
119
+ return ruleFactory;
120
+ } else {
121
+ return staticProcessors;
122
+ }
123
+ }
124
+ throw new Error("Validator must be a function");
125
+ }
126
+
127
+ // src/utils/object.utils.ts
128
+ function isObject(obj) {
129
+ return typeof obj === "object" && obj !== null && !Array.isArray(obj);
130
+ }
131
+ function isRefObject(obj) {
132
+ return isObject(obj.value);
133
+ }
134
+ function cloneDeep(obj) {
135
+ let result = obj;
136
+ let type = {}.toString.call(obj).slice(8, -1);
137
+ if (type == "Set") {
138
+ result = new Set([...obj].map((value) => cloneDeep(value)));
139
+ }
140
+ if (type == "Map") {
141
+ result = new Map([...obj].map((kv) => [cloneDeep(kv[0]), cloneDeep(kv[1])]));
142
+ }
143
+ if (type == "Date") {
144
+ result = new Date(obj.getTime());
145
+ }
146
+ if (type == "RegExp") {
147
+ result = RegExp(obj.source, getRegExpFlags(obj));
148
+ }
149
+ if (type == "Array" || type == "Object") {
150
+ result = Array.isArray(obj) ? [] : {};
151
+ for (let key in obj) {
152
+ result[key] = cloneDeep(obj[key]);
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ function getRegExpFlags(regExp) {
158
+ if (typeof regExp.source.flags == "string") {
159
+ return regExp.source.flags;
160
+ } else {
161
+ let flags = [];
162
+ regExp.global && flags.push("g");
163
+ regExp.ignoreCase && flags.push("i");
164
+ regExp.multiline && flags.push("m");
165
+ regExp.sticky && flags.push("y");
166
+ regExp.unicode && flags.push("u");
167
+ return flags.join("");
168
+ }
169
+ }
170
+ function unwrapGetter(getter, value, index) {
171
+ if (getter instanceof Function) {
172
+ return getter(value, index ?? 0);
173
+ }
174
+ return getter;
175
+ }
176
+
177
+ // src/utils/isEmpty.ts
178
+ function isEmpty(value) {
179
+ if (value === void 0 || value === null) {
180
+ return true;
181
+ }
182
+ if (value === false) {
183
+ return false;
184
+ }
185
+ if (value instanceof Date) {
186
+ return isNaN(value.getTime());
187
+ }
188
+ if (Array.isArray(value)) {
189
+ return value.length === 0;
190
+ }
191
+ if (typeof value === "object" && value != null) {
192
+ return Object.keys(value).length === 0;
193
+ }
194
+ if (typeof value === "string") {
195
+ return !String(value.trim()).length;
196
+ }
197
+ return false;
198
+ }
199
+
200
+ // src/utils/debounce.ts
201
+ function debounce(func, wait, immediate) {
202
+ let timeout;
203
+ const debouncedFn = (...args) => new Promise((resolve) => {
204
+ clearTimeout(timeout);
205
+ timeout = setTimeout(() => {
206
+ timeout = void 0;
207
+ {
208
+ Promise.resolve(func.apply(this, [...args])).then(resolve);
209
+ }
210
+ }, wait);
211
+ });
212
+ debouncedFn.cancel = () => {
213
+ clearTimeout(timeout);
214
+ timeout = void 0;
215
+ };
216
+ debouncedFn.doImmediately = (...args) => new Promise((resolve) => {
217
+ clearTimeout(timeout);
218
+ timeout = setTimeout(() => {
219
+ timeout = void 0;
220
+ Promise.resolve(func.apply(this, [...args])).then(resolve);
221
+ }, 0);
222
+ });
223
+ return debouncedFn;
224
+ }
225
+ function versionCompare(current, other) {
226
+ const cp = String(current).split(".");
227
+ const op = String(other).split(".");
228
+ for (let depth = 0; depth < Math.min(cp.length, op.length); depth++) {
229
+ const cn = Number(cp[depth]);
230
+ const on = Number(op[depth]);
231
+ if (cn > on) return 1 /* GreaterThan */;
232
+ if (on > cn) return -1 /* LessThan */;
233
+ if (!isNaN(cn) && isNaN(on)) return 1 /* GreaterThan */;
234
+ if (isNaN(cn) && !isNaN(on)) return -1 /* LessThan */;
235
+ }
236
+ return 0 /* EqualTo */;
237
+ }
238
+ var isVueSuperiorOrEqualTo3dotFive = versionCompare(version, "3.5.0") === -1 ? false : true;
239
+
240
+ // src/utils/randomId.ts
241
+ function uniqueIDNuxt() {
242
+ return Math.floor(Math.random() * Date.now()).toString();
243
+ }
244
+ function randomId() {
245
+ if (typeof window === "undefined") {
246
+ return uniqueIDNuxt();
247
+ } else {
248
+ const uint32 = window.crypto.getRandomValues(new Uint32Array(1))[0];
249
+ return uint32.toString(10);
250
+ }
251
+ }
252
+ function useStorage() {
253
+ const ruleDeclStorage = shallowRef(/* @__PURE__ */ new Map());
254
+ const fieldsStorage = shallowRef(
255
+ /* @__PURE__ */ new Map()
256
+ );
257
+ const collectionsStorage = shallowRef(/* @__PURE__ */ new Map());
258
+ const dirtyStorage = shallowRef(/* @__PURE__ */ new Map());
259
+ const ruleStatusStorage = shallowRef(/* @__PURE__ */ new Map());
260
+ const arrayStatusStorage = shallowRef(/* @__PURE__ */ new Map());
261
+ function getFieldsEntry($path) {
262
+ const existingFields = fieldsStorage.value.get($path);
263
+ if (existingFields) {
264
+ return existingFields;
265
+ } else {
266
+ const $fields = ref({});
267
+ fieldsStorage.value.set($path, $fields);
268
+ return $fields;
269
+ }
270
+ }
271
+ function getCollectionsEntry($path) {
272
+ const existingEach = collectionsStorage.value.get($path);
273
+ if (existingEach) {
274
+ return existingEach;
275
+ } else {
276
+ const $each = ref([]);
277
+ collectionsStorage.value.set($path, $each);
278
+ return $each;
279
+ }
280
+ }
281
+ function addArrayStatus($arrayId, itemId, value) {
282
+ arrayStatusStorage.value.set(`${$arrayId}-${itemId}`, value);
283
+ }
284
+ function getArrayStatus($arrayId, itemId) {
285
+ return arrayStatusStorage.value.get(`${$arrayId}-${itemId}`);
286
+ }
287
+ function deleteArrayStatus($arrayId, itemId) {
288
+ if ($arrayId && itemId != null) {
289
+ arrayStatusStorage.value.delete(`${$arrayId}-${itemId}`);
290
+ }
291
+ }
292
+ function setDirtyEntry($path, dirty) {
293
+ dirtyStorage.value.set($path, dirty);
294
+ }
295
+ function getDirtyState(path) {
296
+ return dirtyStorage.value.get(path) ?? false;
297
+ }
298
+ function addRuleDeclEntry($path, options) {
299
+ ruleDeclStorage.value.set($path, options);
300
+ }
301
+ function checkRuleDeclEntry($path, newRules) {
302
+ const storedRulesDefs = ruleDeclStorage.value.get($path);
303
+ if (!storedRulesDefs) return void 0;
304
+ const storedRules = storedRulesDefs;
305
+ const isValidCache = areRulesChanged(newRules, storedRules);
306
+ if (!isValidCache) return { valid: false };
307
+ return { valid: true };
308
+ }
309
+ function areRulesChanged(newRules, storedRules) {
310
+ const storedRulesKeys = Object.keys(storedRules);
311
+ const newRulesKeys = Object.keys(newRules);
312
+ if (newRulesKeys.length !== storedRulesKeys.length) return false;
313
+ const hasAllValidators = newRulesKeys.every((ruleKey) => storedRulesKeys.includes(ruleKey));
314
+ if (!hasAllValidators) return false;
315
+ return newRulesKeys.every((ruleKey) => {
316
+ const newRuleElement = newRules[ruleKey];
317
+ const storedRuleElement = storedRules[ruleKey];
318
+ if (!storedRuleElement || !newRuleElement || typeof newRuleElement === "function" || typeof storedRuleElement === "function")
319
+ return false;
320
+ if (typeof newRuleElement === "number") {
321
+ return false;
322
+ } else if (typeof newRuleElement === "boolean") {
323
+ return false;
324
+ } else if (!newRuleElement._params) return true;
325
+ else {
326
+ return newRuleElement._params?.every((paramKey, index) => {
327
+ if (typeof storedRuleElement === "number" || typeof storedRuleElement === "boolean") {
328
+ return true;
329
+ } else {
330
+ const storedParams = unwrapRuleParameters(storedRuleElement._params);
331
+ const newParams = unwrapRuleParameters(newRuleElement._params);
332
+ return storedParams?.[index] === newParams?.[index];
333
+ }
334
+ });
335
+ }
336
+ });
337
+ }
338
+ function trySetRuleStatusRef(path) {
339
+ const ruleStatus = ruleStatusStorage.value.get(path);
340
+ if (ruleStatus) {
341
+ return ruleStatus;
342
+ } else {
343
+ const $pending = ref(false);
344
+ const $valid = ref(true);
345
+ const $metadata = ref({});
346
+ const $validating = ref(false);
347
+ ruleStatusStorage.value.set(path, { $pending, $valid, $metadata, $validating });
348
+ return { $pending, $valid, $metadata, $validating };
349
+ }
350
+ }
351
+ onScopeDispose(() => {
352
+ ruleDeclStorage.value.clear();
353
+ fieldsStorage.value.clear();
354
+ collectionsStorage.value.clear();
355
+ dirtyStorage.value.clear();
356
+ ruleStatusStorage.value.clear();
357
+ arrayStatusStorage.value.clear();
358
+ });
359
+ return {
360
+ addRuleDeclEntry,
361
+ setDirtyEntry,
362
+ checkRuleDeclEntry,
363
+ getDirtyState,
364
+ trySetRuleStatusRef,
365
+ getFieldsEntry,
366
+ getCollectionsEntry,
367
+ getArrayStatus,
368
+ addArrayStatus,
369
+ deleteArrayStatus,
370
+ arrayStatusStorage
371
+ };
372
+ }
373
+
374
+ // src/core/useRegle/guards/ruleDef.guards.ts
375
+ function isNestedRulesDef(state, rules) {
376
+ return isObject(state.value) && isObject(rules.value) && !Object.entries(rules.value).some((rule) => isRuleDef(rule));
377
+ }
378
+ function isCollectionRulesDef(rules) {
379
+ return !!rules.value && "$each" in rules.value;
380
+ }
381
+ function isValidatorRulesDef(rules) {
382
+ return !!rules.value && isObject(rules.value);
383
+ }
384
+ function isRuleDef(rule) {
385
+ return isObject(rule) && "_validator" in rule;
386
+ }
387
+ function isFormRuleDefinition(rule) {
388
+ return !(typeof rule.value === "function");
389
+ }
390
+
391
+ // src/core/useRegle/guards/rule.status.guards.ts
392
+ function isNestedRulesStatus(rule) {
393
+ return isObject(rule) && "$fields" in rule;
394
+ }
395
+ function isCollectionRulesStatus(rule) {
396
+ return !!rule && "$each" in rule;
397
+ }
398
+ function isFieldStatus(rule) {
399
+ return !!rule && "$rules" in rule;
400
+ }
401
+
402
+ // src/core/useRegle/guards/rule.errors.guards.ts
403
+ function isExternalErrorCollection(value) {
404
+ return "$each" in value || "$errors" in value;
405
+ }
406
+
407
+ // src/core/useRegle/useErrors.ts
408
+ function extractRulesErrors({
409
+ field,
410
+ silent = false
411
+ }) {
412
+ return Object.entries(field.$rules ?? {}).map(([ruleKey, rule]) => {
413
+ if (silent) {
414
+ return rule.$message;
415
+ } else if (!rule.$valid && field.$dirty) {
416
+ return rule.$message;
417
+ }
418
+ return null;
419
+ }).filter((msg) => !!msg).reduce((acc, value) => {
420
+ if (typeof value === "string") {
421
+ return acc?.concat([value]);
422
+ } else {
423
+ return acc?.concat(value);
424
+ }
425
+ }, []).concat(field.$externalErrors ?? []);
426
+ }
427
+ function processFieldErrors(fieldStatus, silent = false) {
428
+ if (isNestedRulesStatus(fieldStatus)) {
429
+ return extractNestedErrors(fieldStatus.$fields);
430
+ } else if (isCollectionRulesStatus(fieldStatus)) {
431
+ return {
432
+ $errors: fieldStatus.$field.$rules ? extractRulesErrors({ field: fieldStatus.$field, silent }) : [],
433
+ $each: fieldStatus.$each.map((field) => processFieldErrors(field, silent))
434
+ };
435
+ } else if (isFieldStatus(fieldStatus)) {
436
+ if (fieldStatus.$error) {
437
+ return extractRulesErrors({
438
+ field: fieldStatus,
439
+ silent
440
+ });
441
+ } else {
442
+ return fieldStatus.$externalErrors ?? [];
443
+ }
444
+ }
445
+ return [];
446
+ }
447
+ function extractCollectionError(each, silent = false) {
448
+ return each.map((field) => processFieldErrors(field, silent));
449
+ }
450
+ function extractNestedErrors(fields, silent = false) {
451
+ return Object.fromEntries(
452
+ Object.entries(fields).map(([fieldKey, fieldStatus]) => {
453
+ if (isNestedRulesStatus(fieldStatus)) {
454
+ return [fieldKey, extractNestedErrors(fieldStatus.$fields, silent)];
455
+ } else if (isCollectionRulesStatus(fieldStatus)) {
456
+ return [
457
+ fieldKey,
458
+ {
459
+ $errors: extractRulesErrors({ field: fieldStatus.$field, silent }),
460
+ $each: extractCollectionError(fieldStatus.$each, silent)
461
+ }
462
+ ];
463
+ } else if (isFieldStatus(fieldStatus)) {
464
+ if (fieldStatus.$error) {
465
+ return [
466
+ fieldKey,
467
+ extractRulesErrors({
468
+ field: fieldStatus,
469
+ silent
470
+ })
471
+ ];
472
+ } else {
473
+ return [fieldKey, fieldStatus.$externalErrors ?? []];
474
+ }
475
+ }
476
+ return [fieldKey, []];
477
+ })
478
+ );
479
+ }
480
+ function useErrors($regle) {
481
+ const errors = computed(() => {
482
+ return extractNestedErrors($regle.$fields);
483
+ });
484
+ return errors;
485
+ }
486
+
487
+ // src/types/rules/rule.internal.types.ts
488
+ var InternalRuleType = /* @__PURE__ */ ((InternalRuleType3) => {
489
+ InternalRuleType3["Inline"] = "__inline";
490
+ InternalRuleType3["Async"] = "__async";
491
+ return InternalRuleType3;
492
+ })(InternalRuleType || {});
493
+ function mergeBooleanGroupProperties(entries, property) {
494
+ return computed(() => {
495
+ return entries.value.some((entry) => {
496
+ return entry[property];
497
+ });
498
+ });
499
+ }
500
+ function mergeArrayGroupProperties(entries, property) {
501
+ return computed(() => {
502
+ return entries.value.reduce((all, entry) => {
503
+ const fetchedProperty = entry[property] || [];
504
+ return all.concat(fetchedProperty);
505
+ }, []);
506
+ });
507
+ }
508
+ function createReactiveRuleStatus({
509
+ $dirty,
510
+ customMessages,
511
+ rule,
512
+ ruleKey,
513
+ state,
514
+ path,
515
+ storage,
516
+ $debounce
517
+ }) {
518
+ let scope = effectScope();
519
+ let scopeState;
520
+ let $unwatchState;
521
+ const { $pending, $valid, $metadata, $validating } = storage.trySetRuleStatusRef(
522
+ `${path}.${ruleKey}`
523
+ );
524
+ function $watch() {
525
+ scopeState = scope.run(() => {
526
+ const $defaultMetadata = computed(() => ({
527
+ $invalid: !$valid.value,
528
+ $params: $params.value,
529
+ ...$metadata.value
530
+ }));
531
+ const $active = computed(() => {
532
+ if (isFormRuleDefinition(rule)) {
533
+ if (typeof rule.value.active === "function") {
534
+ return rule.value.active(state.value, $defaultMetadata.value);
535
+ } else {
536
+ return rule.value.active;
537
+ }
538
+ } else {
539
+ return true;
540
+ }
541
+ });
542
+ const $message = computed(() => {
543
+ let message = "";
544
+ const customMessageRule = customMessages ? customMessages[ruleKey]?.message : void 0;
545
+ if (customMessageRule) {
546
+ if (typeof customMessageRule === "function") {
547
+ message = customMessageRule(state.value, $defaultMetadata.value);
548
+ } else {
549
+ message = customMessageRule;
550
+ }
551
+ }
552
+ if (isFormRuleDefinition(rule)) {
553
+ if (!(customMessageRule && !rule.value._patched)) {
554
+ if (typeof rule.value.message === "function") {
555
+ message = rule.value.message(state.value, $defaultMetadata.value);
556
+ } else {
557
+ message = rule.value.message;
558
+ }
559
+ }
560
+ }
561
+ if (isEmpty(message)) {
562
+ message = "Error";
563
+ console.warn(`No error message defined for ${path}.${ruleKey}`);
564
+ }
565
+ return message;
566
+ });
567
+ const $type = computed(() => {
568
+ if (isFormRuleDefinition(rule) && rule.value.type) {
569
+ return rule.value.type;
570
+ } else {
571
+ return ruleKey;
572
+ }
573
+ });
574
+ const $validator = computed(() => {
575
+ if (isFormRuleDefinition(rule)) {
576
+ return rule.value.validator;
577
+ } else {
578
+ return rule.value;
579
+ }
580
+ });
581
+ const $params = computed(() => {
582
+ if (typeof rule.value === "function") {
583
+ return [];
584
+ }
585
+ return unwrapRuleParameters(rule.value._params ?? []);
586
+ });
587
+ const $path = computed(() => `${path}.${$type.value}`);
588
+ return {
589
+ $active,
590
+ $message,
591
+ $type,
592
+ $validator,
593
+ $params,
594
+ $path
595
+ };
596
+ });
597
+ $unwatchState = watch(scopeState.$params, $validate, {
598
+ deep: true
599
+ });
600
+ }
601
+ $watch();
602
+ async function computeAsyncResult(promise) {
603
+ let ruleResult = false;
604
+ try {
605
+ $valid.value = true;
606
+ if ($dirty.value) {
607
+ $pending.value = true;
608
+ }
609
+ const promiseResult = await promise;
610
+ if (typeof promiseResult === "boolean") {
611
+ ruleResult = promiseResult;
612
+ } else {
613
+ const { $valid: $valid2, ...rest } = promiseResult;
614
+ ruleResult = $valid2;
615
+ $metadata.value = rest;
616
+ }
617
+ } catch (e) {
618
+ ruleResult = false;
619
+ } finally {
620
+ $pending.value = false;
621
+ }
622
+ return ruleResult;
623
+ }
624
+ const $computeAsyncDebounce = debounce(computeAsyncResult, $debounce ?? 100);
625
+ async function $validate() {
626
+ $validating.value = true;
627
+ const validator = scopeState.$validator.value;
628
+ let ruleResult = false;
629
+ const resultOrPromise = validator(state.value, ...scopeState.$params.value);
630
+ if (resultOrPromise instanceof Promise) {
631
+ const promiseDebounce = $computeAsyncDebounce(resultOrPromise);
632
+ ruleResult = await promiseDebounce;
633
+ } else {
634
+ if (resultOrPromise != null) {
635
+ if (typeof resultOrPromise === "boolean") {
636
+ ruleResult = resultOrPromise;
637
+ } else {
638
+ const { $valid: $valid2, ...rest } = resultOrPromise;
639
+ ruleResult = $valid2;
640
+ $metadata.value = rest;
641
+ }
642
+ }
643
+ }
644
+ $valid.value = ruleResult;
645
+ $validating.value = false;
646
+ return ruleResult;
647
+ }
648
+ function $reset() {
649
+ $valid.value = true;
650
+ $metadata.value = {};
651
+ $pending.value = false;
652
+ $validating.value = false;
653
+ $watch();
654
+ }
655
+ function $unwatch() {
656
+ $unwatchState();
657
+ scope.stop();
658
+ scope = effectScope();
659
+ }
660
+ return reactive({
661
+ ...scopeState,
662
+ $pending,
663
+ $valid,
664
+ $metadata,
665
+ $validate,
666
+ $unwatch,
667
+ $watch,
668
+ $reset
669
+ });
670
+ }
671
+
672
+ // src/core/useRegle/useStateProperties/createReactiveFieldStatus.ts
673
+ function createReactiveFieldStatus({
674
+ state,
675
+ rulesDef,
676
+ customMessages,
677
+ path,
678
+ storage,
679
+ options,
680
+ externalErrors,
681
+ index,
682
+ onUnwatch
683
+ }) {
684
+ let scope = effectScope();
685
+ let scopeState;
686
+ const $dirty = ref(false);
687
+ const triggerPunishment = ref(false);
688
+ const $externalErrors = ref([]);
689
+ let $unwatchState;
690
+ let $unwatchValid;
691
+ let $unwatchExternalErrors;
692
+ let $unwatchDirty;
693
+ let $commit = () => {
694
+ };
695
+ function collectExternalErrors() {
696
+ $externalErrors.value = externalErrors.value ?? [];
697
+ }
698
+ collectExternalErrors();
699
+ function createReactiveRulesResult() {
700
+ const declaredRules = rulesDef.value;
701
+ const storeResult = storage.checkRuleDeclEntry(path, declaredRules);
702
+ $localOptions.value = Object.fromEntries(
703
+ Object.entries(declaredRules).filter(([ruleKey]) => ruleKey.startsWith("$"))
704
+ );
705
+ $rules.value = Object.fromEntries(
706
+ Object.entries(rulesDef.value).filter(([ruleKey]) => !ruleKey.startsWith("$")).map(([ruleKey, rule]) => {
707
+ if (rule) {
708
+ const ruleRef = toRef(() => rule);
709
+ return [
710
+ ruleKey,
711
+ createReactiveRuleStatus({
712
+ $dirty,
713
+ customMessages,
714
+ rule: ruleRef,
715
+ ruleKey,
716
+ state,
717
+ path,
718
+ storage,
719
+ $debounce: $localOptions.value.$debounce
720
+ })
721
+ ];
722
+ }
723
+ return [];
724
+ }).filter((ruleDef) => !!ruleDef.length)
725
+ );
726
+ $watch();
727
+ $commit = scopeState.$debounce.value ? debounce($commitHandler, scopeState.$debounce.value ?? 0) : $commitHandler;
728
+ if (storeResult?.valid != null) {
729
+ $dirty.value = storage.getDirtyState(path);
730
+ if ($dirty.value) {
731
+ $commit();
732
+ }
733
+ }
734
+ storage.addRuleDeclEntry(path, declaredRules);
735
+ }
736
+ function $unwatch() {
737
+ if ($rules.value) {
738
+ Object.entries($rules.value).forEach(([_, rule]) => {
739
+ rule.$unwatch();
740
+ });
741
+ }
742
+ $unwatchDirty();
743
+ if ($dirty.value) {
744
+ storage.setDirtyEntry(path, $dirty.value);
745
+ }
746
+ $unwatchState();
747
+ $unwatchValid();
748
+ $unwatchExternalErrors();
749
+ scope.stop();
750
+ scope = effectScope();
751
+ onUnwatch?.();
752
+ }
753
+ function $watch() {
754
+ if ($rules.value) {
755
+ Object.entries($rules.value).forEach(([_, rule]) => {
756
+ rule.$watch();
757
+ });
758
+ }
759
+ scopeState = scope.run(() => {
760
+ const $anyDirty = computed(() => $dirty.value);
761
+ const $debounce = computed(() => {
762
+ return $localOptions.value.$debounce;
763
+ });
764
+ const $lazy = computed(() => {
765
+ if ($localOptions.value.$lazy != null) {
766
+ return $localOptions.value.$lazy;
767
+ }
768
+ return unref(options.lazy);
769
+ });
770
+ const $rewardEarly = computed(() => {
771
+ if ($localOptions.value.$rewardEarly != null) {
772
+ return $localOptions.value.$rewardEarly;
773
+ }
774
+ return unref(options.rewardEarly);
775
+ });
776
+ const $autoDirty = computed(() => {
777
+ if ($localOptions.value.$autoDirty != null) {
778
+ return $localOptions.value.$autoDirty;
779
+ }
780
+ return unref(options.autoDirty);
781
+ });
782
+ const $error = computed(() => {
783
+ return $invalid.value && !$pending.value && $dirty.value;
784
+ });
785
+ const $errors = computed(() => {
786
+ return extractRulesErrors({
787
+ field: {
788
+ $dirty: $dirty.value,
789
+ $externalErrors: $externalErrors.value,
790
+ $rules: $rules.value
791
+ }
792
+ });
793
+ });
794
+ const $silentErrors = computed(() => {
795
+ return extractRulesErrors({
796
+ field: {
797
+ $dirty: $dirty.value,
798
+ $externalErrors: $externalErrors.value,
799
+ $rules: $rules.value
800
+ },
801
+ silent: true
802
+ });
803
+ });
804
+ const $pending = computed(() => {
805
+ if (triggerPunishment.value || !$rewardEarly.value) {
806
+ return Object.entries($rules.value).some(([key, ruleResult]) => {
807
+ return ruleResult.$pending;
808
+ });
809
+ }
810
+ return false;
811
+ });
812
+ const $invalid = computed(() => {
813
+ if ($externalErrors.value?.length) {
814
+ return true;
815
+ } else if (!$rewardEarly.value || $rewardEarly.value && triggerPunishment.value) {
816
+ return Object.entries($rules.value).some(([key, ruleResult]) => {
817
+ return !ruleResult.$valid;
818
+ });
819
+ }
820
+ return false;
821
+ });
822
+ const $valid = computed(() => {
823
+ if ($dirty.value && !isEmpty(state.value)) {
824
+ if ($externalErrors.value?.length) {
825
+ return false;
826
+ } else if ($rewardEarly.value) {
827
+ return Object.entries($rules.value).every(([key, ruleResult]) => {
828
+ return ruleResult.$valid;
829
+ });
830
+ } else {
831
+ return !$invalid.value;
832
+ }
833
+ }
834
+ return false;
835
+ });
836
+ watch($valid, (value) => {
837
+ if (value) {
838
+ triggerPunishment.value = false;
839
+ }
840
+ });
841
+ return {
842
+ $error,
843
+ $pending,
844
+ $invalid,
845
+ $valid,
846
+ $debounce,
847
+ $lazy,
848
+ $errors,
849
+ $silentErrors,
850
+ $rewardEarly,
851
+ $autoDirty,
852
+ $anyDirty
853
+ };
854
+ });
855
+ $unwatchExternalErrors = watch(externalErrors, collectExternalErrors);
856
+ $unwatchState = watch(
857
+ state,
858
+ () => {
859
+ if (scopeState.$autoDirty.value) {
860
+ if (!$dirty.value) {
861
+ $dirty.value = true;
862
+ }
863
+ }
864
+ if (rulesDef.value instanceof Function) {
865
+ createReactiveRulesResult();
866
+ }
867
+ $commit();
868
+ if (!scopeState.$rewardEarly.value !== false) ;
869
+ },
870
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true }
871
+ );
872
+ $unwatchDirty = watch($dirty, () => {
873
+ storage.setDirtyEntry(path, $dirty.value);
874
+ });
875
+ $unwatchValid = watch(scopeState.$valid, (valid) => {
876
+ if (scopeState.$rewardEarly.value && valid) {
877
+ triggerPunishment.value = false;
878
+ }
879
+ });
880
+ }
881
+ function $commitHandler() {
882
+ Object.entries($rules.value).forEach(([key, rule]) => {
883
+ rule.$validate();
884
+ });
885
+ }
886
+ const $rules = ref();
887
+ const $localOptions = ref();
888
+ createReactiveRulesResult();
889
+ function $reset() {
890
+ $dirty.value = false;
891
+ $externalErrors.value = [];
892
+ Object.entries($rules.value).forEach(([key, rule]) => {
893
+ rule.$reset();
894
+ });
895
+ if (!scopeState.$lazy.value) {
896
+ Object.entries($rules.value).map(([key, rule]) => {
897
+ return rule.$validate();
898
+ });
899
+ }
900
+ }
901
+ function $touch() {
902
+ if (!$dirty.value) {
903
+ $dirty.value = true;
904
+ if (!scopeState.$rewardEarly.value !== false) ;
905
+ $commit();
906
+ }
907
+ }
908
+ const $validate = scopeState.$debounce.value ? debounce($validateHandler, scopeState.$debounce.value ?? 0) : $validateHandler;
909
+ async function $validateHandler() {
910
+ try {
911
+ triggerPunishment.value = true;
912
+ if (scopeState.$autoDirty.value && $dirty.value && !scopeState.$pending.value) {
913
+ return !scopeState.$error.value;
914
+ } else {
915
+ const promises = Object.entries($rules.value).map(([key, rule]) => {
916
+ return rule.$validate();
917
+ });
918
+ const results = await Promise.allSettled(promises);
919
+ return results.every((value) => {
920
+ if (value.status === "fulfilled") {
921
+ return value.value;
922
+ } else {
923
+ return false;
924
+ }
925
+ });
926
+ }
927
+ } catch (e) {
928
+ return false;
929
+ }
930
+ }
931
+ function $clearExternalErrors() {
932
+ $externalErrors.value = [];
933
+ }
934
+ if (!scopeState.$lazy.value) {
935
+ $validateHandler();
936
+ }
937
+ return reactive({
938
+ $dirty,
939
+ ...scopeState,
940
+ $externalErrors,
941
+ $value: state,
942
+ $rules,
943
+ $reset,
944
+ $touch,
945
+ $validate,
946
+ $unwatch,
947
+ $watch,
948
+ $clearExternalErrors
949
+ });
950
+ }
951
+
952
+ // src/core/useRegle/useStateProperties/createReactiveCollectionStatus.ts
953
+ function createCollectionElement({
954
+ $id,
955
+ path,
956
+ index,
957
+ options,
958
+ storage,
959
+ stateValue,
960
+ customMessages,
961
+ rules,
962
+ externalErrors
963
+ }) {
964
+ const $fieldId = rules.$key ? rules.$key : randomId();
965
+ let $path = `${path}.${String($fieldId)}`;
966
+ if (typeof stateValue.value === "object" && stateValue.value != null) {
967
+ if (!stateValue.value.$id) {
968
+ Object.defineProperties(stateValue.value, {
969
+ $id: {
970
+ value: $fieldId,
971
+ enumerable: false,
972
+ configurable: false,
973
+ writable: false
974
+ }
975
+ });
976
+ } else {
977
+ $path = `${path}.${stateValue.value.$id}`;
978
+ }
979
+ }
980
+ const $externalErrors = toRef(() => externalErrors.value?.[index]);
981
+ const $status = createReactiveChildrenStatus({
982
+ state: stateValue,
983
+ rulesDef: toRef(() => rules),
984
+ customMessages,
985
+ path: $path,
986
+ storage,
987
+ options,
988
+ externalErrors: $externalErrors
989
+ });
990
+ if ($status) {
991
+ const valueId = stateValue.value?.$id;
992
+ $status.$id = valueId ?? String($fieldId);
993
+ storage.addArrayStatus($id, $status.$id, $status);
994
+ }
995
+ return $status;
996
+ }
997
+ function createReactiveCollectionStatus({
998
+ state,
999
+ rulesDef,
1000
+ customMessages,
1001
+ path,
1002
+ storage,
1003
+ options,
1004
+ externalErrors
1005
+ }) {
1006
+ let scope = effectScope();
1007
+ let scopeState;
1008
+ let immediateScope = effectScope();
1009
+ let immediateScopeState;
1010
+ if (Array.isArray(state.value) && !rulesDef.value.$each) {
1011
+ return null;
1012
+ }
1013
+ const $id = ref();
1014
+ const $value = ref(state.value);
1015
+ let $unwatchState = null;
1016
+ const $fieldStatus = ref({});
1017
+ const $eachStatus = storage.getCollectionsEntry(path);
1018
+ immediateScopeState = immediateScope.run(() => {
1019
+ const isPrimitiveArray = computed(() => {
1020
+ if (Array.isArray(state.value) && state.value.length) {
1021
+ return state.value.some((s) => typeof s !== "object");
1022
+ } else if (rulesDef.value.$each && !(rulesDef.value.$each instanceof Function)) {
1023
+ return Object.values(rulesDef.value.$each).every((rule) => isRuleDef(rule));
1024
+ }
1025
+ return false;
1026
+ });
1027
+ const $externalErrorsField = computed(() => {
1028
+ if (externalErrors.value) {
1029
+ if (isExternalErrorCollection(externalErrors.value)) {
1030
+ return externalErrors.value.$errors ?? [];
1031
+ }
1032
+ return [];
1033
+ }
1034
+ return [];
1035
+ });
1036
+ const $externalErrorsEach = computed(() => {
1037
+ if (externalErrors.value) {
1038
+ if (isExternalErrorCollection(externalErrors.value)) {
1039
+ return externalErrors.value.$each ?? [];
1040
+ }
1041
+ return [];
1042
+ }
1043
+ return [];
1044
+ });
1045
+ return {
1046
+ isPrimitiveArray,
1047
+ $externalErrorsField,
1048
+ $externalErrorsEach
1049
+ };
1050
+ });
1051
+ createStatus();
1052
+ $watch();
1053
+ function createStatus() {
1054
+ if (typeof state.value === "object") {
1055
+ if (state.value != null && !state.value?.$id && state.value !== null) {
1056
+ $id.value = randomId();
1057
+ Object.defineProperties(state.value, {
1058
+ $id: {
1059
+ value: $id.value,
1060
+ enumerable: false,
1061
+ configurable: false,
1062
+ writable: false
1063
+ }
1064
+ });
1065
+ } else if (state.value?.$id) {
1066
+ $id.value = state.value.$id;
1067
+ }
1068
+ }
1069
+ if (immediateScopeState.isPrimitiveArray.value) {
1070
+ return;
1071
+ }
1072
+ $value.value = $fieldStatus.value.$value;
1073
+ if (Array.isArray(state.value) && rulesDef.value.$each) {
1074
+ $eachStatus.value = state.value.map((value, index) => {
1075
+ const unwrapped$Each = unwrapGetter(
1076
+ rulesDef.value.$each,
1077
+ toRef(() => value),
1078
+ index
1079
+ );
1080
+ if (unwrapped$Each) {
1081
+ const element = createCollectionElement({
1082
+ $id: $id.value,
1083
+ path,
1084
+ rules: unwrapped$Each,
1085
+ stateValue: toRef(() => value),
1086
+ index,
1087
+ options,
1088
+ storage,
1089
+ externalErrors: immediateScopeState.$externalErrorsEach
1090
+ });
1091
+ if (element) {
1092
+ return element;
1093
+ }
1094
+ return null;
1095
+ }
1096
+ }).filter((each) => !!each);
1097
+ } else {
1098
+ $eachStatus.value = [];
1099
+ }
1100
+ $fieldStatus.value = createReactiveFieldStatus({
1101
+ state,
1102
+ rulesDef,
1103
+ customMessages,
1104
+ path,
1105
+ storage,
1106
+ options,
1107
+ externalErrors: immediateScopeState.$externalErrorsField
1108
+ });
1109
+ }
1110
+ function updateStatus() {
1111
+ if (Array.isArray(state.value)) {
1112
+ const previousStatus = cloneDeep($eachStatus.value);
1113
+ $eachStatus.value = state.value.map((value, index) => {
1114
+ const currentValue = toRef(() => value);
1115
+ if (value.$id && $eachStatus.value.find((each) => each.$id === value.$id)) {
1116
+ const existingStatus = storage.getArrayStatus($id.value, value.$id);
1117
+ if (existingStatus) {
1118
+ existingStatus.$value = currentValue;
1119
+ return existingStatus;
1120
+ }
1121
+ return null;
1122
+ } else {
1123
+ const unwrapped$Each = unwrapGetter(rulesDef.value.$each, currentValue, index);
1124
+ if (unwrapped$Each) {
1125
+ const element = createCollectionElement({
1126
+ $id: $id.value,
1127
+ path,
1128
+ rules: unwrapped$Each,
1129
+ stateValue: currentValue,
1130
+ index,
1131
+ options,
1132
+ storage,
1133
+ externalErrors: immediateScopeState.$externalErrorsEach
1134
+ });
1135
+ if (element) {
1136
+ return element;
1137
+ }
1138
+ return null;
1139
+ }
1140
+ }
1141
+ }).filter((each) => !!each);
1142
+ previousStatus.filter(($each) => !state.value.find((f) => $each.$id === f.$id)).forEach(($each, index) => {
1143
+ storage.deleteArrayStatus($id.value, index.toString());
1144
+ });
1145
+ } else {
1146
+ $eachStatus.value = [];
1147
+ }
1148
+ }
1149
+ function $watch() {
1150
+ $unwatchState = watch(
1151
+ state,
1152
+ () => {
1153
+ if (state.value != null && !Object.hasOwn(state.value, "$id")) {
1154
+ createStatus();
1155
+ } else {
1156
+ updateStatus();
1157
+ }
1158
+ },
1159
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true, flush: "pre" }
1160
+ );
1161
+ scopeState = scope.run(() => {
1162
+ const $dirty = computed(() => {
1163
+ return $fieldStatus.value.$dirty && $eachStatus.value.every((statusOrField) => {
1164
+ return statusOrField.$dirty;
1165
+ });
1166
+ });
1167
+ const $anyDirty = computed(() => {
1168
+ return $fieldStatus.value.$anyDirty || $eachStatus.value.some((statusOrField) => {
1169
+ return statusOrField.$dirty;
1170
+ });
1171
+ });
1172
+ const $invalid = computed(() => {
1173
+ return $fieldStatus.value.$invalid || $eachStatus.value.some((statusOrField) => {
1174
+ return statusOrField.$invalid;
1175
+ });
1176
+ });
1177
+ const $valid = computed(
1178
+ () => $fieldStatus.value.$valid && $eachStatus.value.every((statusOrField) => {
1179
+ return statusOrField.$valid;
1180
+ })
1181
+ );
1182
+ const $error = computed(() => {
1183
+ return $fieldStatus.value.$error || $eachStatus.value.some((statusOrField) => {
1184
+ return statusOrField.$error;
1185
+ });
1186
+ });
1187
+ const $pending = computed(() => {
1188
+ return $fieldStatus.value.$pending || $eachStatus.value.some((statusOrField) => {
1189
+ return statusOrField.$pending;
1190
+ });
1191
+ });
1192
+ const $errors = computed(() => {
1193
+ return {
1194
+ $errors: extractRulesErrors({ field: $fieldStatus.value, silent: false }),
1195
+ $each: extractCollectionError($eachStatus.value)
1196
+ };
1197
+ });
1198
+ const $silentErrors = computed(() => {
1199
+ return {
1200
+ $errors: extractRulesErrors({ field: $fieldStatus.value, silent: true }),
1201
+ $each: extractCollectionError($eachStatus.value, true)
1202
+ };
1203
+ });
1204
+ return {
1205
+ $dirty,
1206
+ $anyDirty,
1207
+ $invalid,
1208
+ $valid,
1209
+ $error,
1210
+ $pending,
1211
+ $errors,
1212
+ $silentErrors
1213
+ };
1214
+ });
1215
+ if (immediateScopeState.isPrimitiveArray.value) {
1216
+ console.warn(
1217
+ `${path} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`
1218
+ );
1219
+ $unwatchState();
1220
+ }
1221
+ }
1222
+ function $unwatch() {
1223
+ if ($unwatchState) {
1224
+ $unwatchState();
1225
+ }
1226
+ if ($fieldStatus.value) {
1227
+ $fieldStatus.value.$unwatch();
1228
+ }
1229
+ if ($eachStatus.value) {
1230
+ $eachStatus.value.forEach((element) => {
1231
+ if ("$dirty" in element) {
1232
+ element.$unwatch();
1233
+ }
1234
+ });
1235
+ }
1236
+ scope.stop();
1237
+ scope = effectScope();
1238
+ immediateScope.stop();
1239
+ immediateScope = effectScope(true);
1240
+ }
1241
+ function $touch() {
1242
+ $fieldStatus.value.$touch();
1243
+ $eachStatus.value.forEach(($each) => {
1244
+ $each.$touch();
1245
+ });
1246
+ }
1247
+ function $reset() {
1248
+ $fieldStatus.value.$reset();
1249
+ $eachStatus.value.forEach(($each) => {
1250
+ $each.$reset();
1251
+ });
1252
+ }
1253
+ async function $validate() {
1254
+ try {
1255
+ const results = await Promise.all([
1256
+ $fieldStatus.value.$validate(),
1257
+ ...$eachStatus.value.map((rule) => {
1258
+ return rule.$validate();
1259
+ })
1260
+ ]);
1261
+ return results.every((value) => !!value);
1262
+ } catch (e) {
1263
+ return false;
1264
+ }
1265
+ }
1266
+ function $clearExternalErrors() {
1267
+ }
1268
+ return reactive({
1269
+ $field: $fieldStatus,
1270
+ ...scopeState,
1271
+ $each: $eachStatus,
1272
+ $value: state,
1273
+ $validate,
1274
+ $unwatch,
1275
+ $watch,
1276
+ $touch,
1277
+ $reset,
1278
+ $clearExternalErrors
1279
+ });
1280
+ }
1281
+
1282
+ // src/core/useRegle/useStateProperties/createReactiveNestedStatus.ts
1283
+ function createReactiveNestedStatus({
1284
+ scopeRules,
1285
+ state,
1286
+ customMessages,
1287
+ path = "",
1288
+ rootRules,
1289
+ storage,
1290
+ options,
1291
+ externalErrors,
1292
+ validationGroups
1293
+ }) {
1294
+ let scope;
1295
+ let scopeState;
1296
+ let $unwatchFields;
1297
+ function createReactiveFieldsStatus(watch5 = true, forceFromGetter = false) {
1298
+ $fields.value = null;
1299
+ triggerRef($fields);
1300
+ const scopedRulesStatus = Object.fromEntries(
1301
+ Object.entries(scopeRules.value).map(([statePropKey, statePropRules]) => {
1302
+ if (statePropRules) {
1303
+ const stateRef = toRef(state.value, statePropKey);
1304
+ const statePropRulesRef = toRef(() => statePropRules);
1305
+ const $externalErrors = toRef(() => externalErrors.value?.[statePropKey]);
1306
+ return [
1307
+ statePropKey,
1308
+ createReactiveChildrenStatus({
1309
+ state: stateRef,
1310
+ rulesDef: statePropRulesRef,
1311
+ customMessages,
1312
+ path: path ? `${path}.${statePropKey}` : statePropKey,
1313
+ storage,
1314
+ options,
1315
+ externalErrors: $externalErrors
1316
+ })
1317
+ ];
1318
+ }
1319
+ return [];
1320
+ }).filter(
1321
+ (rule) => !!rule.length && rule[1] != null
1322
+ )
1323
+ );
1324
+ const externalRulesStatus = Object.fromEntries(
1325
+ Object.entries(unref(externalErrors) ?? {}).filter(([key]) => !(key in scopeRules.value)).map(([key, errors]) => {
1326
+ if (errors) {
1327
+ const statePropRulesRef = toRef(() => ({}));
1328
+ const $externalErrors = toRef(() => errors);
1329
+ return [
1330
+ key,
1331
+ createReactiveChildrenStatus({
1332
+ state: ref(void 0),
1333
+ rulesDef: statePropRulesRef,
1334
+ customMessages,
1335
+ path: path ? `${path}.${key}` : key,
1336
+ storage,
1337
+ options,
1338
+ externalErrors: $externalErrors
1339
+ })
1340
+ ];
1341
+ }
1342
+ return [];
1343
+ })
1344
+ );
1345
+ const groups = Object.fromEntries(
1346
+ Object.entries(validationGroups?.(scopedRulesStatus) ?? {}).map(([key, entries]) => {
1347
+ if (entries.length) {
1348
+ return [
1349
+ key,
1350
+ {
1351
+ ...Object.fromEntries(
1352
+ ["$invalid", "$error", "$pending", "$dirty", "$valid"].map(
1353
+ (property) => [
1354
+ property,
1355
+ mergeBooleanGroupProperties(
1356
+ toRef(() => entries),
1357
+ property
1358
+ )
1359
+ ]
1360
+ )
1361
+ ),
1362
+ ...Object.fromEntries(
1363
+ ["$errors", "$silentErrors"].map((property) => [
1364
+ property,
1365
+ mergeArrayGroupProperties(
1366
+ toRef(() => entries),
1367
+ property
1368
+ )
1369
+ ])
1370
+ )
1371
+ }
1372
+ ];
1373
+ }
1374
+ return [];
1375
+ })
1376
+ );
1377
+ $fields.value = { ...scopedRulesStatus, ...externalRulesStatus, ...groups };
1378
+ if (watch5) {
1379
+ $watch();
1380
+ }
1381
+ }
1382
+ let $fields = storage.getFieldsEntry(path);
1383
+ createReactiveFieldsStatus();
1384
+ function $reset() {
1385
+ createReactiveFieldsStatus(false);
1386
+ Object.entries($fields.value).forEach(([_, statusOrField]) => {
1387
+ statusOrField.$reset();
1388
+ });
1389
+ $watch();
1390
+ }
1391
+ function $touch() {
1392
+ Object.entries($fields.value).forEach(([_, statusOrField]) => {
1393
+ statusOrField.$touch();
1394
+ });
1395
+ }
1396
+ async function $validate() {
1397
+ try {
1398
+ const results = await Promise.allSettled(
1399
+ Object.entries($fields.value).map(([_, statusOrField]) => {
1400
+ return statusOrField.$validate();
1401
+ })
1402
+ );
1403
+ return results.every((value) => {
1404
+ if (value.status === "fulfilled") {
1405
+ return value.value;
1406
+ } else {
1407
+ return false;
1408
+ }
1409
+ });
1410
+ } catch (e) {
1411
+ return false;
1412
+ }
1413
+ }
1414
+ function $watch() {
1415
+ if (rootRules) {
1416
+ $unwatchFields = watch(
1417
+ rootRules,
1418
+ () => {
1419
+ $unwatch();
1420
+ createReactiveFieldsStatus();
1421
+ },
1422
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true, flush: "post" }
1423
+ );
1424
+ }
1425
+ scope = effectScope();
1426
+ scopeState = scope.run(() => {
1427
+ const $dirty = computed(() => {
1428
+ return !!Object.entries($fields.value).length && Object.entries($fields.value).every(([key, statusOrField]) => {
1429
+ return statusOrField.$dirty;
1430
+ });
1431
+ });
1432
+ const $anyDirty = computed(() => {
1433
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1434
+ return statusOrField.$dirty;
1435
+ });
1436
+ });
1437
+ const $invalid = computed(() => {
1438
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1439
+ return statusOrField.$invalid;
1440
+ });
1441
+ });
1442
+ const $valid = computed(() => {
1443
+ return Object.entries($fields.value).every(([key, statusOrField]) => {
1444
+ return statusOrField.$valid;
1445
+ });
1446
+ });
1447
+ const $error = computed(() => {
1448
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1449
+ return statusOrField.$error;
1450
+ });
1451
+ });
1452
+ const $pending = computed(() => {
1453
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1454
+ return statusOrField.$pending;
1455
+ });
1456
+ });
1457
+ const $errors = computed(() => {
1458
+ return extractNestedErrors($fields.value);
1459
+ });
1460
+ const $silentErrors = computed(() => {
1461
+ return extractNestedErrors($fields.value, true);
1462
+ });
1463
+ return {
1464
+ $dirty,
1465
+ $anyDirty,
1466
+ $invalid,
1467
+ $valid,
1468
+ $error,
1469
+ $pending,
1470
+ $errors,
1471
+ $silentErrors
1472
+ };
1473
+ });
1474
+ }
1475
+ function $unwatch() {
1476
+ if ($fields.value) {
1477
+ Object.entries($fields.value).forEach(([_, field]) => {
1478
+ field.$unwatch();
1479
+ });
1480
+ }
1481
+ $unwatchFields?.();
1482
+ scope.stop();
1483
+ scope = effectScope();
1484
+ }
1485
+ function $clearExternalErrors() {
1486
+ Object.entries($fields.value).forEach(([_, field]) => {
1487
+ field.$clearExternalErrors();
1488
+ });
1489
+ }
1490
+ return reactive({
1491
+ ...scopeState,
1492
+ $fields,
1493
+ $value: state,
1494
+ $reset,
1495
+ $touch,
1496
+ $validate,
1497
+ $unwatch,
1498
+ $watch,
1499
+ $clearExternalErrors
1500
+ });
1501
+ }
1502
+ function createReactiveChildrenStatus({
1503
+ state,
1504
+ rulesDef,
1505
+ customMessages,
1506
+ path,
1507
+ storage,
1508
+ options,
1509
+ externalErrors,
1510
+ index,
1511
+ onUnwatch
1512
+ }) {
1513
+ if (isCollectionRulesDef(rulesDef)) {
1514
+ return createReactiveCollectionStatus({
1515
+ state,
1516
+ rulesDef,
1517
+ customMessages,
1518
+ path,
1519
+ storage,
1520
+ options,
1521
+ index,
1522
+ externalErrors
1523
+ });
1524
+ } else if (isNestedRulesDef(state, rulesDef) && isRefObject(state)) {
1525
+ return createReactiveNestedStatus({
1526
+ scopeRules: rulesDef,
1527
+ state,
1528
+ customMessages,
1529
+ path,
1530
+ storage,
1531
+ options,
1532
+ index,
1533
+ externalErrors
1534
+ });
1535
+ } else if (isValidatorRulesDef(rulesDef)) {
1536
+ return createReactiveFieldStatus({
1537
+ state,
1538
+ rulesDef,
1539
+ customMessages,
1540
+ path,
1541
+ storage,
1542
+ options,
1543
+ index,
1544
+ externalErrors,
1545
+ onUnwatch
1546
+ });
1547
+ }
1548
+ return null;
1549
+ }
1550
+
1551
+ // src/core/useRegle/useStateProperties/useStateProperties.ts
1552
+ function useStateProperties(scopeRules, state, options, customRules) {
1553
+ const storage = useStorage();
1554
+ const externalErrors = computed(() => unref(options.externalErrors));
1555
+ const regle = reactive(
1556
+ createReactiveNestedStatus({
1557
+ rootRules: scopeRules,
1558
+ scopeRules,
1559
+ state,
1560
+ customMessages: customRules?.(),
1561
+ storage,
1562
+ options,
1563
+ externalErrors,
1564
+ validationGroups: options.validationGroups
1565
+ })
1566
+ );
1567
+ const errors = useErrors(regle);
1568
+ return { regle, errors };
1569
+ }
1570
+
1571
+ // src/core/useRegle/useRegle.ts
1572
+ function createUseRegleComposable(customRules, options) {
1573
+ const globalOptions = {
1574
+ autoDirty: options?.autoDirty ?? true,
1575
+ lazy: options?.lazy ?? false,
1576
+ rewardEarly: options?.rewardEarly ?? false
1577
+ };
1578
+ function useRegle2(state, rulesFactory, options2) {
1579
+ const scopeRules = isRef(rulesFactory) ? rulesFactory : computed(
1580
+ typeof rulesFactory === "function" ? rulesFactory : () => rulesFactory
1581
+ );
1582
+ const resolvedOptions = {
1583
+ ...globalOptions,
1584
+ ...options2
1585
+ };
1586
+ const processedState = isRef(state) ? state : ref(state);
1587
+ const initialState = cloneDeep(toRaw(processedState.value));
1588
+ const { regle, errors } = useStateProperties(
1589
+ scopeRules,
1590
+ processedState,
1591
+ resolvedOptions,
1592
+ customRules
1593
+ );
1594
+ function resetAll() {
1595
+ regle.$unwatch();
1596
+ resetValuesRecursively(state, initialState);
1597
+ regle.$reset();
1598
+ }
1599
+ function resetValuesRecursively(current, initial) {
1600
+ Object.entries(initial).forEach(([key, value]) => {
1601
+ let currentRef = isRef(current) ? current.value : current;
1602
+ let currentValue = isRef(currentRef[key]) ? currentRef[key].value : currentRef[key];
1603
+ let initialRef = isRef(initial[key]) ? initial[key]._value : initial[key];
1604
+ if (Array.isArray(initialRef) && Array.isArray(currentValue)) {
1605
+ currentRef[key] = [];
1606
+ initialRef.forEach((val, index) => {
1607
+ currentRef[key][index] = {};
1608
+ resetValuesRecursively(currentRef[key][index], initialRef[index]);
1609
+ });
1610
+ } else if (isObject(initialRef)) {
1611
+ resetValuesRecursively(currentValue, initialRef);
1612
+ } else {
1613
+ if (isRef(currentRef[key])) {
1614
+ currentRef[key].value = initialRef;
1615
+ } else {
1616
+ currentRef[key] = initialRef;
1617
+ }
1618
+ }
1619
+ });
1620
+ }
1621
+ const ready = computed(() => {
1622
+ return !(regle.$invalid || regle.$pending);
1623
+ });
1624
+ async function validateState() {
1625
+ regle.$touch();
1626
+ const result = await regle.$validate();
1627
+ if (result) {
1628
+ return processedState.value;
1629
+ }
1630
+ return false;
1631
+ }
1632
+ return {
1633
+ regle,
1634
+ errors,
1635
+ resetAll,
1636
+ validateState,
1637
+ ready,
1638
+ state: processedState
1639
+ };
1640
+ }
1641
+ return useRegle2;
1642
+ }
1643
+ var useRegle = createUseRegleComposable();
1644
+
1645
+ // src/core/defineRegleConfig.ts
1646
+ function defineRegleConfig({
1647
+ rules,
1648
+ modifiers
1649
+ }) {
1650
+ const useRegle2 = createUseRegleComposable(rules, modifiers);
1651
+ return useRegle2;
1652
+ }
1653
+
1654
+ export { InternalRuleType, createRule, defineRegleConfig, unwrapRuleParameters, useRegle };
1655
+ //# sourceMappingURL=index.js.map
1656
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL2NyZWF0ZVJ1bGUvdW53cmFwUnVsZVBhcmFtZXRlcnMudHMiLCIuLi9zcmMvY29yZS9jcmVhdGVSdWxlL2RlZmluZVJ1bGVQcm9jZXNzb3JzLnRzIiwiLi4vc3JjL2NvcmUvY3JlYXRlUnVsZS9jcmVhdGVSdWxlLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdC51dGlscy50cyIsIi4uL3NyYy91dGlscy9pc0VtcHR5LnRzIiwiLi4vc3JjL3V0aWxzL2RlYm91bmNlLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24tY29tcGFyZS50cyIsIi4uL3NyYy91dGlscy9yYW5kb21JZC50cyIsIi4uL3NyYy9jb3JlL3VzZVN0b3JhZ2UvdXNlU3RvcmFnZS50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL2d1YXJkcy9ydWxlRGVmLmd1YXJkcy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL2d1YXJkcy9ydWxlLnN0YXR1cy5ndWFyZHMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS9ndWFyZHMvcnVsZS5lcnJvcnMuZ3VhcmRzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlRXJyb3JzLnRzIiwiLi4vc3JjL3R5cGVzL3J1bGVzL3J1bGUuaW50ZXJuYWwudHlwZXMudHMiLCIuLi9zcmMvdHlwZXMvdXRpbHMvZ3JvdXBzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy9jcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy9jcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy91c2VTdGF0ZVByb3BlcnRpZXMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS91c2VSZWdsZS50cyIsIi4uL3NyYy9jb3JlL2RlZmluZVJlZ2xlQ29uZmlnLnRzIl0sIm5hbWVzIjpbInZhbGlkYXRvciIsIkludGVybmFsUnVsZVR5cGUiLCJjb21wdXRlZCIsIiR2YWxpZCIsImVmZmVjdFNjb3BlIiwicmVmIiwidG9SZWYiLCJ1bnJlZiIsIndhdGNoIiwicmVhY3RpdmUiLCJ1c2VSZWdsZSIsIm9wdGlvbnMiLCJpc1JlZiIsInRvUmF3Il0sIm1hcHBpbmdzIjoiOzs7QUFPTyxTQUFTLHFCQUE0QyxNQUE4QixFQUFBO0FBQ3hGLEVBQU8sT0FBQSxNQUFBLENBQU8sR0FBSSxDQUFBLENBQUMsS0FBVSxLQUFBO0FBQzNCLElBQUEsSUFBSSxpQkFBaUIsUUFBVSxFQUFBO0FBQzdCLE1BQUEsT0FBTyxLQUFNLEVBQUE7QUFBQTtBQUVmLElBQUEsT0FBTyxNQUFNLEtBQUssQ0FBQTtBQUFBLEdBQ25CLENBQUE7QUFDSDtBQU1PLFNBQVMscUJBQTRDLE1BQThCLEVBQUE7QUFDeEYsRUFBTyxPQUFBLE1BQUEsQ0FBTyxHQUFJLENBQUEsQ0FBQyxLQUFVLEtBQUE7QUFDM0IsSUFBQSxJQUFJLGlCQUFpQixRQUFVLEVBQUE7QUFDN0IsTUFBTyxPQUFBLEtBQUE7QUFBQSxLQUNULE1BQUEsSUFBVyxLQUFNLENBQUEsS0FBSyxDQUFHLEVBQUE7QUFDdkIsTUFBTyxPQUFBLEtBQUE7QUFBQTtBQUVULElBQU8sT0FBQSxLQUFBLENBQU0sTUFBTSxLQUFLLENBQUE7QUFBQSxHQUN6QixDQUFBO0FBQ0g7QUFLTyxTQUFTLDRCQUE0QixJQUF3QixFQUFBO0FBQ2xFLEVBQU0sTUFBQSxPQUFBLEdBQVUsS0FBSyxRQUFTLEVBQUE7QUFDOUIsRUFBTSxNQUFBLGVBQUEsR0FBa0IsT0FBUSxDQUFBLFFBQUEsQ0FBUyxJQUFJLENBQUE7QUFDN0MsRUFBQSxNQUFN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bEMsQ0FBQTtBQUVELElBQUEsZUFBZSxhQUFvRSxHQUFBO0FBQ2pGLE1BQUEsS0FBQSxDQUFNLE1BQU8sRUFBQTtBQUNiLE1BQU0sTUFBQSxNQUFBLEdBQVMsTUFBTSxLQUFBLENBQU0sU0FBVSxFQUFBO0FBQ3JDLE1BQUEsSUFBSSxNQUFRLEVBQUE7QUFDVixRQUFBLE9BQU8sY0FBZSxDQUFBLEtBQUE7QUFBQTtBQUV4QixNQUFPLE9BQUEsS0FBQTtBQUFBO0FBR1QsSUFBTyxPQUFBO0FBQUEsTUFDTCxLQUFBO0FBQUEsTUFDQSxNQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxhQUFBO0FBQUEsTUFDQSxLQUFBO0FBQUEsTUFDQSxLQUFPLEVBQUE7QUFBQSxLQUNUO0FBQUE7QUFHRixFQUFPUSxPQUFBQSxTQUFBQTtBQUNUO0FBRU8sSUFBTSxXQUFXLHdCQUF5Qjs7O0FDaEkxQyxTQUFTLGlCQUFzRSxDQUFBO0FBQUEsRUFDcEYsS0FBQTtBQUFBLEVBQ0E7QUFDRixDQUdHLEVBQUE7QUFDRCxFQUFNQSxNQUFBQSxTQUFBQSxHQUFXLHdCQUF1QyxDQUFBLEtBQUEsRUFBTyxTQUFTLENBQUE7QUFFeEUsRUFBT0EsT0FBQUEsU0FBQUE7QUFDVCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUmVmLCB0b1JlZiwgdW5yZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbURlY2wgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsZWFuIGxpc3Qgb2YgcGFyYW1ldGVyc1xuICogUmVtb3ZpbmcgUmVmIGFuZCBleGVjdXRpbmcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSB1bndyYXBlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwUnVsZVBhcmFtZXRlcnM8VFBhcmFtcyBleHRlbmRzIGFueVtdPihwYXJhbXM6IFBhcmFtRGVjbFtdKTogVFBhcmFtcyB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gcGFyYW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHVucmVmKHBhcmFtKTtcbiAgfSkgYXMgVFBhcmFtcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2xlYW4gbGlzdCBvZiBwYXJhbWV0ZXJzXG4gKiBSZW1vdmluZyBSZWYgYW5kIGV4ZWN1dGluZyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHVud3JhcGVkIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZVBhcmFtczxUUGFyYW1zIGV4dGVuZHMgYW55W10+KHBhcmFtczogUGFyYW1EZWNsW10pOiBUUGFyYW1zIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9IGVsc2UgaWYgKGlzUmVmKHBhcmFtKSkge1xuICAgICAgcmV0dXJuIHBhcmFtO1xuICAgIH1cbiAgICByZXR1cm4gdG9SZWYoKCkgPT4gcGFyYW0pO1xuICB9KSBhcyBUUGFyYW1zO1xufVxuXG4vKipcbiAqIER1ZSB0byBgZnVuY3Rpb24ubGVuZ3RoYCBub3QgcmV0dXJuaW5nIGRlZmF1bHQgcGFyYW1ldGVycywgaXQgbmVlZCB0byBwYXJzZSB0aGUgZnVuYy50b1N0cmluZygpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvblBhcmFtZXRlcnNMZW5ndGgoZnVuYzogRnVuY3Rpb24pOiBudW1iZXIge1xuICBjb25zdCBmdW5jU3RyID0gZnVuYy50b1N0cmluZygpO1xuICBjb25zdCBpc0Fycm93RnVuY3Rpb24gPSBmdW5jU3RyLmluY2x1ZGVzKCc9PicpO1xuICBjb25zdCBwYXJhbXMgPSAoaXNBcnJvd0Z1bmN0aW9uID8gZnVuY1N0ci5zcGxpdCgnPT4nKVswXSA6IGZ1bmNTdHIpXG4gICAgLnNsaWNlKGZ1bmNTdHIuaW5kZXhPZignKCcpICsgMSwgZnVuY1N0ci5pbmRleE9mKCcpJykpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChwYXJhbSkgPT4gcGFyYW0udHJpbSgpKTtcbiAgY29uc3QgZGVmYXVsdHMgPSBwYXJhbXMuZmlsdGVyKChwYXJhbSkgPT4gcGFyYW0uaW5jbHVkZXMoJz0nKSk7XG4gIHJldHVybiBkZWZhdWx0cy5sZW5ndGggKyBmdW5jLmxlbmd0aDtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgJEludGVybmFsUmVnbGVSdWxlSW5pdCxcbiAgJEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZVBhcmFtcywgdW53cmFwUnVsZVBhcmFtZXRlcnMgfSBmcm9tICcuL3Vud3JhcFJ1bGVQYXJhbWV0ZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJ1bGVQcm9jZXNzb3JzKFxuICBkZWZpbml0aW9uOiAkSW50ZXJuYWxSZWdsZVJ1bGVJbml0LFxuICAuLi5wYXJhbXM6IGFueVtdXG4pOiAkSW50ZXJuYWxSZWdsZVJ1bGVEZWZpbml0aW9uIHtcbiAgY29uc3QgeyBtZXNzYWdlLCB2YWxpZGF0b3IsIGFjdGl2ZSwgLi4ucHJvcGVydGllcyB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBpc0FzeW5jID0gdmFsaWRhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcblxuICBjb25zdCBkZWZhdWx0UHJvY2Vzc29ycyA9IHtcbiAgICB2YWxpZGF0b3IodmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBkZWZpbml0aW9uLnZhbGlkYXRvcih2YWx1ZSwgLi4udW53cmFwUnVsZVBhcmFtZXRlcnMoYXJncy5sZW5ndGggPyBhcmdzIDogcGFyYW1zKSk7XG4gICAgfSxcbiAgICBtZXNzYWdlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiAkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZmluaXRpb24ubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbi5tZXNzYWdlKHZhbHVlLCB7XG4gICAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgICAgJHBhcmFtczogdW53cmFwUnVsZVBhcmFtZXRlcnMobWV0YWRhdGEuJHBhcmFtcz8ubGVuZ3RoID8gbWV0YWRhdGEuJHBhcmFtcyA6IHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb24ubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWN0aXZlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiAkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZmluaXRpb24uYWN0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uLmFjdGl2ZSh2YWx1ZSwge1xuICAgICAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgICAgICRwYXJhbXM6IHVud3JhcFJ1bGVQYXJhbWV0ZXJzKG1ldGFkYXRhLiRwYXJhbXM/Lmxlbmd0aCA/IG1ldGFkYXRhLiRwYXJhbXMgOiBwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uLmFjdGl2ZSA/PyB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXhlYyh2YWx1ZTogYW55KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWZpbml0aW9uLnZhbGlkYXRvcih2YWx1ZSwgLi4udW53cmFwUnVsZVBhcmFtZXRlcnMocGFyYW1zKSk7XG4gICAgICBsZXQgcmF3UmVzdWx0OiBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb247XG4gICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJhd1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAodHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ29iamVjdCcgJiYgJyR2YWxpZCcgaW4gcmF3UmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmF3UmVzdWx0LiR2YWxpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHJhd1Jlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1Jlc3VsdCA9IHZhbGlkYXRvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdvYmplY3QnICYmICckdmFsaWQnIGluIHJhd1Jlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmF3UmVzdWx0LiR2YWxpZDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiByYXdSZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBwcm9jZXNzb3JzID0ge1xuICAgIC4uLmRlZmF1bHRQcm9jZXNzb3JzLFxuICAgIC4uLnByb3BlcnRpZXMsXG4gICAgLi4ue1xuICAgICAgX3ZhbGlkYXRvcjogZGVmaW5pdGlvbi52YWxpZGF0b3IgYXMgYW55LFxuICAgICAgX21lc3NhZ2U6IGRlZmluaXRpb24ubWVzc2FnZSxcbiAgICAgIF9hY3RpdmU6IGRlZmluaXRpb24uYWN0aXZlLFxuICAgICAgX3R5cGU6IGRlZmluaXRpb24udHlwZSxcbiAgICAgIF9wYXRjaGVkOiBmYWxzZSxcbiAgICAgIF9hc3luYzogaXNBc3luYyxcbiAgICAgIF9wYXJhbXM6IGNyZWF0ZVJlYWN0aXZlUGFyYW1zPG5ldmVyPihwYXJhbXMpLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHByb2Nlc3NvcnM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEluZmVyUmVnbGVSdWxlLFxuICBSZWdsZVJ1bGVJbml0LFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZVR5cGVSZXR1cm4sXG4gIFJlZ2xlVW5pdmVyc2FsUGFyYW1zLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBkZWZpbmVSdWxlUHJvY2Vzc29ycyB9IGZyb20gJy4vZGVmaW5lUnVsZVByb2Nlc3NvcnMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzTGVuZ3RoIH0gZnJvbSAnLi91bndyYXBSdWxlUGFyYW1ldGVycyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGUgYSB0eXBlZCBjdXN0b20gcnVsZSB0aGF0IGNhbiBiZSB1c2VkIGxpa2UgZGVmYXVsdCBydWxlcy5cbiAqIEl0IGNhbiBhbHNvIGJlIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwgb3B0aW9uc1xuICpcbiAqIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgaWYgdGhlIHJ1bGUgaXMgYXN5bmNcbiAqXG4gKiBAdHlwZVBhcmFtIFRWYWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZSB0aGUgcnVsZSBzaG91bGQgcmVjZWl2ZVxuICogQHR5cGVQYXJhbSBUUGFyYW1zIC0gVHVwbGUgZGVjbGFyYXRpb24gb2YgdGhlIHJ1bGUgcGFyYW1ldGVycyAoaWYgYW55KVxuICpcbiAqIEBwYXJhbSBkZWZpbml0aW9uIC0gVGhlIHJ1bGUgcHJvY2Vzc29ycyBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBBIHJ1bGUgZGVmaW5pdGlvbiB0aGF0IGNhbiBiZSBjYWxsYWJsZSBkZXBlbmRpbmcgb24gcGFyYW1zIHByZXNlbmNlXG4gKlxuICogQGV4ZW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgc2ltcGxlIHJ1bGUgd2l0aCBubyBwYXJhbXNcbiAqIGltcG9ydCB7cnVsZUhlbHBlcnN9IGZyb20gJ0ByZWdsZS9ydWxlcyc7XG4gKlxuICogZXhwb3J0IGNvbnN0IGlzRm9vID0gY3JlYXRlUnVsZSh7XG4gKiAgIHZhbGlkYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gKiAgICAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAnZm9vJztcbiAqICAgICAgIH1cbiAqICAgICAgIHJldHVybiB0cnVlXG4gKiAgIH0sXG4gKiAgIG1lc3NhZ2U6IFwiVGhlIHZhbHVlIHNob3VsZCBiZSAnZm9vJ1wiXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdWxlPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbiAgVEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyB0cnVlIDogZmFsc2UsXG4+KFxuICBkZWZpbml0aW9uOiBSZWdsZVJ1bGVJbml0PFRWYWx1ZSwgVFBhcmFtcywgVFJldHVybiwgVE1ldGFkYXRhLCBUQXN5bmM+XG4pOiBJbmZlclJlZ2xlUnVsZTxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYywgVE1ldGFkYXRhPiB7XG4gIGlmICh0eXBlb2YgZGVmaW5pdGlvbi52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBsZXQgZmFrZVBhcmFtczogYW55W10gPSBbXTtcbiAgICBjb25zdCBzdGF0aWNQcm9jZXNzb3JzID0gZGVmaW5lUnVsZVByb2Nlc3NvcnMoZGVmaW5pdGlvbiBhcyBhbnksIC4uLmZha2VQYXJhbXMpO1xuXG4gICAgY29uc3QgaXNBc3luYyA9IGRlZmluaXRpb24udmFsaWRhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgICAvLyBGb3IgdmFsaWRhdG9ycyBuZWVkaW5nIGEgcGFyYW1zIGxpa2UgbWF4TGVuZ3RoIG9yIHJlcXVpcmVkSWZcbiAgICBpZiAoZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzTGVuZ3RoKGRlZmluaXRpb24udmFsaWRhdG9yKSA+IDEpIHtcbiAgICAgIC8vIEZvciB2YWxpZGF0b3JzIHdpdGggcGFyYW0sIHJldHVybiBhIGZ1bmN0aW9uIHByb3ZpZGluZyBwYXJhbXMgZm9yIGFsbCB0aGUgcnVsZSBwcm9jZXNzb3JzXG4gICAgICBjb25zdCBydWxlRmFjdG9yeSA9IGZ1bmN0aW9uICguLi5wYXJhbXM6IFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+KSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVSdWxlUHJvY2Vzc29ycyhkZWZpbml0aW9uIGFzIGFueSwgLi4ucGFyYW1zKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFzc2lnbiBhbGwgdGhlIGludGVybmFscyB0byB0aGUgcnVsZSByYXcgZnVuY3Rpb24gc28gdGhleSBhcmUgYWNjZXNzaWJsZSB3aXRob3V0IGNhbGxpbmcgaXRcbiAgICAgIHJ1bGVGYWN0b3J5LnZhbGlkYXRvciA9IHN0YXRpY1Byb2Nlc3NvcnMudmFsaWRhdG9yO1xuICAgICAgcnVsZUZhY3RvcnkubWVzc2FnZSA9IHN0YXRpY1Byb2Nlc3NvcnMubWVzc2FnZTtcbiAgICAgIHJ1bGVGYWN0b3J5LmFjdGl2ZSA9IHN0YXRpY1Byb2Nlc3NvcnMuYWN0aXZlO1xuICAgICAgcnVsZUZhY3RvcnkudHlwZSA9IHN0YXRpY1Byb2Nlc3NvcnMudHlwZTtcbiAgICAgIHJ1bGVGYWN0b3J5LmV4ZWMgPSBzdGF0aWNQcm9jZXNzb3JzLmV4ZWM7XG5cbiAgICAgIHJ1bGVGYWN0b3J5Ll92YWxpZGF0b3IgPSBzdGF0aWNQcm9jZXNzb3JzLnZhbGlkYXRvcjtcbiAgICAgIHJ1bGVGYWN0b3J5Ll9tZXNzYWdlID0gc3RhdGljUHJvY2Vzc29ycy5tZXNzYWdlO1xuICAgICAgcnVsZUZhY3RvcnkuX2FjdGl2ZSA9IHN0YXRpY1Byb2Nlc3NvcnMuYWN0aXZlO1xuICAgICAgcnVsZUZhY3RvcnkuX3R5cGUgPSBkZWZpbml0aW9uLnR5cGU7XG4gICAgICBydWxlRmFjdG9yeS5fcGF0Y2hlZCA9IGZhbHNlO1xuICAgICAgcnVsZUZhY3RvcnkuX2FzeW5jID0gaXNBc3luYyBhcyBUQXN5bmM7XG4gICAgICByZXR1cm4gcnVsZUZhY3RvcnkgYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGljUHJvY2Vzc29ycyBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVmFsaWRhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUgeyBNYXliZUdldHRlciB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZPYmplY3Qob2JqOiBSZWY8dW5rbm93bj4pOiBvYmogaXMgUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9iai52YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZURlZXA8VD4ob2JqOiBUKTogVCB7XG4gIGxldCByZXN1bHQgPSBvYmogYXMgYW55O1xuICBsZXQgdHlwZSA9IHt9LnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG4gIGlmICh0eXBlID09ICdTZXQnKSB7XG4gICAgcmVzdWx0ID0gbmV3IFNldChbLi4uKG9iaiBhcyBhbnkpXS5tYXAoKHZhbHVlKSA9PiBjbG9uZURlZXAodmFsdWUpKSk7XG4gIH1cbiAgaWYgKHR5cGUgPT0gJ01hcCcpIHtcbiAgICByZXN1bHQgPSBuZXcgTWFwKFsuLi4ob2JqIGFzIGFueSldLm1hcCgoa3YpID0+IFtjbG9uZURlZXAoa3ZbMF0pLCBjbG9uZURlZXAoa3ZbMV0pXSkpO1xuICB9XG4gIGlmICh0eXBlID09ICdEYXRlJykge1xuICAgIHJlc3VsdCA9IG5ldyBEYXRlKChvYmogYXMgYW55KS5nZXRUaW1lKCkpO1xuICB9XG4gIGlmICh0eXBlID09ICdSZWdFeHAnKSB7XG4gICAgcmVzdWx0ID0gUmVnRXhwKChvYmogYXMgYW55KS5zb3VyY2UsIGdldFJlZ0V4cEZsYWdzKG9iaikpO1xuICB9XG4gIGlmICh0eXBlID09ICdBcnJheScgfHwgdHlwZSA9PSAnT2JqZWN0Jykge1xuICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgLy8gaW5jbHVkZSBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgcmVzdWx0W2tleV0gPSBjbG9uZURlZXAob2JqW2tleV0pO1xuICAgIH1cbiAgfVxuICAvLyBwcmltaXRpdmVzIGFuZCBub24tc3VwcG9ydGVkIG9iamVjdHMgKGUuZy4gZnVuY3Rpb25zKSBsYW5kIGhlcmVcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnRXhwRmxhZ3MocmVnRXhwOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiByZWdFeHAuc291cmNlLmZsYWdzID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZ0V4cC5zb3VyY2UuZmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZsYWdzID0gW107XG4gICAgcmVnRXhwLmdsb2JhbCAmJiBmbGFncy5wdXNoKCdnJyk7XG4gICAgcmVnRXhwLmlnbm9yZUNhc2UgJiYgZmxhZ3MucHVzaCgnaScpO1xuICAgIHJlZ0V4cC5tdWx0aWxpbmUgJiYgZmxhZ3MucHVzaCgnbScpO1xuICAgIHJlZ0V4cC5zdGlja3kgJiYgZmxhZ3MucHVzaCgneScpO1xuICAgIHJlZ0V4cC51bmljb2RlICYmIGZsYWdzLnB1c2goJ3UnKTtcbiAgICByZXR1cm4gZmxhZ3Muam9pbignJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcEdldHRlcjxUIGV4dGVuZHMgYW55PihcbiAgZ2V0dGVyOiBNYXliZUdldHRlcjxULCBhbnk+LFxuICB2YWx1ZTogUmVmPGFueT4sXG4gIGluZGV4PzogbnVtYmVyXG4pOiBUIHtcbiAgaWYgKGdldHRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGdldHRlcih2YWx1ZSwgaW5kZXggPz8gMCk7XG4gIH1cbiAgcmV0dXJuIGdldHRlcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIC8vIGludmFsaWQgZGF0ZSB3b24ndCBwYXNzXG4gICAgcmV0dXJuIGlzTmFOKHZhbHVlLmdldFRpbWUoKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gIVN0cmluZyh2YWx1ZS50cmltKCkpLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbnRlcmZhY2UgRGVib3VuY2VkRnVuY3Rpb24ge1xuICAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgY2FuY2VsKCk6IHZvaWQ7XG4gIGRvSW1tZWRpYXRlbHkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSB8IFByb21pc2U8YW55Pj4oXG4gIHRoaXM6IGFueSxcbiAgZnVuYzogVCxcbiAgd2FpdDogbnVtYmVyLFxuICBpbW1lZGlhdGU/OiBib29sZWFuXG4pOiBUIHtcbiAgbGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZWJvdW5jZWRGbjogRGVib3VuY2VkRnVuY3Rpb24gPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmdW5jLmFwcGx5KHRoaXMsIFsuLi5hcmdzXSBhcyBhbnkpKS50aGVuKHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgICB9LCB3YWl0KTtcbiAgICAgIGlmIChpbW1lZGlhdGUgJiYgIXRpbWVvdXQpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZ1bmMuYXBwbHkodGhpcywgWy4uLmFyZ3NdIGFzIGFueSkpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgZGVib3VuY2VkRm4uY2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGRlYm91bmNlZEZuLmRvSW1tZWRpYXRlbHkgPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZnVuYy5hcHBseSh0aGlzLCBbLi4uYXJnc10gYXMgYW55KSkudGhlbihyZXNvbHZlKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuXG4gIHJldHVybiBkZWJvdW5jZWRGbiBhcyB1bmtub3duIGFzIFQ7XG59XG4iLCJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAndnVlJztcblxuZXhwb3J0IHR5cGUgVmVyc2lvbiA9IHN0cmluZyB8IG51bWJlcjtcbmV4cG9ydCBlbnVtIFZlcnNpb25JcyB7XG4gIExlc3NUaGFuID0gLTEsXG4gIEVxdWFsVG8gPSAwLFxuICBHcmVhdGVyVGhhbiA9IDEsXG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gdmVyc2lvbnMgcXVpY2tseS5cbiAqIEBwYXJhbSBjdXJyZW50IElzIHRoaXMgdmVyc2lvbiBncmVhdGVyLCBlcXVhbCB0bywgb3IgbGVzcyB0aGFuIHRoZSBvdGhlcj9cbiAqIEBwYXJhbSBvdGhlciBUaGUgdmVyc2lvbiB0byBjb21wYXJlIGFnYWluc3QgdGhlIGN1cnJlbnQgdmVyc2lvblxuICogQHJldHVybiAxIGlmIGN1cnJlbnQgaXMgZ3JlYXRlciB0aGFuIG90aGVyLCAwIGlmIHRoZXkgYXJlIGVxdWFsIG9yIGVxdWl2YWxlbnQsIGFuZCAtMSBpZiBjdXJyZW50IGlzIGxlc3MgdGhhbiBvdGhlclxuICovXG5mdW5jdGlvbiB2ZXJzaW9uQ29tcGFyZShjdXJyZW50OiBWZXJzaW9uLCBvdGhlcjogVmVyc2lvbik6IFZlcnNpb25JcyB7XG4gIGNvbnN0IGNwID0gU3RyaW5nKGN1cnJlbnQpLnNwbGl0KCcuJyk7XG4gIGNvbnN0IG9wID0gU3RyaW5nKG90aGVyKS5zcGxpdCgnLicpO1xuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTWF0aC5taW4oY3AubGVuZ3RoLCBvcC5sZW5ndGgpOyBkZXB0aCsrKSB7XG4gICAgY29uc3QgY24gPSBOdW1iZXIoY3BbZGVwdGhdKTtcbiAgICBjb25zdCBvbiA9IE51bWJlcihvcFtkZXB0aF0pO1xuICAgIGlmIChjbiA+IG9uKSByZXR1cm4gVmVyc2lvbklzLkdyZWF0ZXJUaGFuO1xuICAgIGlmIChvbiA+IGNuKSByZXR1cm4gVmVyc2lvbklzLkxlc3NUaGFuO1xuICAgIGlmICghaXNOYU4oY24pICYmIGlzTmFOKG9uKSkgcmV0dXJuIFZlcnNpb25Jcy5HcmVhdGVyVGhhbjtcbiAgICBpZiAoaXNOYU4oY24pICYmICFpc05hTihvbikpIHJldHVybiBWZXJzaW9uSXMuTGVzc1RoYW47XG4gIH1cbiAgcmV0dXJuIFZlcnNpb25Jcy5FcXVhbFRvO1xufVxuXG5leHBvcnQgY29uc3QgaXNWdWVTdXBlcmlvck9yRXF1YWxUbzNkb3RGaXZlID1cbiAgdmVyc2lvbkNvbXBhcmUodmVyc2lvbiwgJzMuNS4wJykgPT09IC0xID8gZmFsc2UgOiB0cnVlO1xuIiwiZnVuY3Rpb24gdW5pcXVlSUROdXh0KCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogRGF0ZS5ub3coKSkudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUlkKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB1bmlxdWVJRE51eHQoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB1aW50MzIgPSB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuICAgIHJldHVybiB1aW50MzIudG9TdHJpbmcoMTApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBvblNjb3BlRGlzcG9zZSwgcmVmLCBzaGFsbG93UmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHsgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLCBSZWdsZVJ1bGVEZWNsIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdW53cmFwUnVsZVBhcmFtZXRlcnMgfSBmcm9tICcuLi9jcmVhdGVSdWxlL3Vud3JhcFJ1bGVQYXJhbWV0ZXJzJztcblxuZXhwb3J0IHR5cGUgU3RvcmVkUnVsZVN0YXR1cyA9IHtcbiAgJHZhbGlkOiBSZWY8Ym9vbGVhbj47XG4gICRwZW5kaW5nOiBSZWY8Ym9vbGVhbj47XG4gICRtZXRhZGF0YTogUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAkdmFsaWRhdGluZzogUmVmPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IHR5cGUgUmVnbGVTdG9yYWdlID0gUmV0dXJuVHlwZTx0eXBlb2YgdXNlU3RvcmFnZT47XG5cbi8qKlxuICogSW5zcGlyZWQgYnkgVnVlbGlkYXRlIHN0b3JhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0b3JhZ2UoKSB7XG4gIGNvbnN0IHJ1bGVEZWNsU3RvcmFnZSA9IHNoYWxsb3dSZWYobmV3IE1hcDxzdHJpbmcsIFJlZ2xlUnVsZURlY2w8YW55LCBhbnk+PigpKTtcbiAgY29uc3QgZmllbGRzU3RvcmFnZSA9IHNoYWxsb3dSZWYoXG4gICAgbmV3IE1hcDxzdHJpbmcsIFJlZjxSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+Pj4oKVxuICApO1xuICBjb25zdCBjb2xsZWN0aW9uc1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBSZWY8QXJyYXk8JEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4+KCkpO1xuICBjb25zdCBkaXJ0eVN0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpKTtcbiAgY29uc3QgcnVsZVN0YXR1c1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRSdWxlU3RhdHVzPigpKTtcblxuICBjb25zdCBhcnJheVN0YXR1c1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+KCkpO1xuXG4gIGZ1bmN0aW9uIGdldEZpZWxkc0VudHJ5KCRwYXRoOiBzdHJpbmcpOiBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRmllbGRzID0gZmllbGRzU3RvcmFnZS52YWx1ZS5nZXQoJHBhdGgpO1xuICAgIGlmIChleGlzdGluZ0ZpZWxkcykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nRmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkZmllbGRzID0gcmVmKHt9KSBhcyBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj47XG4gICAgICBmaWVsZHNTdG9yYWdlLnZhbHVlLnNldCgkcGF0aCwgJGZpZWxkcyk7XG4gICAgICByZXR1cm4gJGZpZWxkcztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uc0VudHJ5KCRwYXRoOiBzdHJpbmcpOiBSZWY8QXJyYXk8JEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRWFjaCA9IGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5nZXQoJHBhdGgpO1xuICAgIGlmIChleGlzdGluZ0VhY2gpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0VhY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0ICRlYWNoID0gcmVmPEFycmF5PCRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+KFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5zZXQoJHBhdGgsICRlYWNoKTtcbiAgICAgIHJldHVybiAkZWFjaDtcbiAgICB9XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uc1xuXG4gIGZ1bmN0aW9uIGFkZEFycmF5U3RhdHVzKCRhcnJheUlkOiBzdHJpbmcsIGl0ZW1JZDogc3RyaW5nLCB2YWx1ZTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlKSB7XG4gICAgYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLnNldChgJHskYXJyYXlJZH0tJHtpdGVtSWR9YCwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QXJyYXlTdGF0dXMoJGFycmF5SWQ6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLmdldChgJHskYXJyYXlJZH0tJHtpdGVtSWR9YCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVBcnJheVN0YXR1cygkYXJyYXlJZDogc3RyaW5nLCBpdGVtSWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoJGFycmF5SWQgJiYgaXRlbUlkICE9IG51bGwpIHtcbiAgICAgIGFycmF5U3RhdHVzU3RvcmFnZS52YWx1ZS5kZWxldGUoYCR7JGFycmF5SWR9LSR7aXRlbUlkfWApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldERpcnR5RW50cnkoJHBhdGg6IHN0cmluZywgZGlydHk6IGJvb2xlYW4pIHtcbiAgICBkaXJ0eVN0b3JhZ2UudmFsdWUuc2V0KCRwYXRoLCBkaXJ0eSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXJ0eVN0YXRlKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBkaXJ0eVN0b3JhZ2UudmFsdWUuZ2V0KHBhdGgpID8/IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkUnVsZURlY2xFbnRyeSgkcGF0aDogc3RyaW5nLCBvcHRpb25zOiBSZWdsZVJ1bGVEZWNsPGFueSwgYW55Pikge1xuICAgIHJ1bGVEZWNsU3RvcmFnZS52YWx1ZS5zZXQoJHBhdGgsIG9wdGlvbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tSdWxlRGVjbEVudHJ5KFxuICAgICRwYXRoOiBzdHJpbmcsXG4gICAgbmV3UnVsZXM6IFJlZ2xlUnVsZURlY2xcbiAgKTogeyB2YWxpZDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yZWRSdWxlc0RlZnMgPSBydWxlRGVjbFN0b3JhZ2UudmFsdWUuZ2V0KCRwYXRoKTtcblxuICAgIGlmICghc3RvcmVkUnVsZXNEZWZzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc3RvcmVkUnVsZXMgPSBzdG9yZWRSdWxlc0RlZnM7XG5cbiAgICBjb25zdCBpc1ZhbGlkQ2FjaGUgPSBhcmVSdWxlc0NoYW5nZWQobmV3UnVsZXMsIHN0b3JlZFJ1bGVzKTtcblxuICAgIGlmICghaXNWYWxpZENhY2hlKSByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYXJlUnVsZXNDaGFuZ2VkKG5ld1J1bGVzOiBSZWdsZVJ1bGVEZWNsLCBzdG9yZWRSdWxlczogUmVnbGVSdWxlRGVjbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0b3JlZFJ1bGVzS2V5cyA9IE9iamVjdC5rZXlzKHN0b3JlZFJ1bGVzKTtcbiAgICBjb25zdCBuZXdSdWxlc0tleXMgPSBPYmplY3Qua2V5cyhuZXdSdWxlcyk7XG5cbiAgICBpZiAobmV3UnVsZXNLZXlzLmxlbmd0aCAhPT0gc3RvcmVkUnVsZXNLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaGFzQWxsVmFsaWRhdG9ycyA9IG5ld1J1bGVzS2V5cy5ldmVyeSgocnVsZUtleSkgPT4gc3RvcmVkUnVsZXNLZXlzLmluY2x1ZGVzKHJ1bGVLZXkpKTtcbiAgICBpZiAoIWhhc0FsbFZhbGlkYXRvcnMpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZXdSdWxlc0tleXMuZXZlcnkoKHJ1bGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IG5ld1J1bGVFbGVtZW50ID0gbmV3UnVsZXNbcnVsZUtleV07XG4gICAgICBjb25zdCBzdG9yZWRSdWxlRWxlbWVudCA9IHN0b3JlZFJ1bGVzW3J1bGVLZXldO1xuICAgICAgaWYgKFxuICAgICAgICAhc3RvcmVkUnVsZUVsZW1lbnQgfHxcbiAgICAgICAgIW5ld1J1bGVFbGVtZW50IHx8XG4gICAgICAgIHR5cGVvZiBuZXdSdWxlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2Ygc3RvcmVkUnVsZUVsZW1lbnQgPT09ICdmdW5jdGlvbidcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gJGRlYm91bmNlXG4gICAgICBpZiAodHlwZW9mIG5ld1J1bGVFbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vICRsYXp5LCAkYXV0b0RpcnR5IGV0Yy4uXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXdSdWxlRWxlbWVudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIW5ld1J1bGVFbGVtZW50Ll9wYXJhbXMpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXdSdWxlRWxlbWVudC5fcGFyYW1zPy5ldmVyeSgocGFyYW1LZXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdG9yZWRSdWxlRWxlbWVudCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHN0b3JlZFJ1bGVFbGVtZW50ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZWRQYXJhbXMgPSB1bndyYXBSdWxlUGFyYW1ldGVycyhzdG9yZWRSdWxlRWxlbWVudC5fcGFyYW1zIGFzIGFueVtdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHVud3JhcFJ1bGVQYXJhbWV0ZXJzKG5ld1J1bGVFbGVtZW50Ll9wYXJhbXMgYXMgYW55W10pO1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlZFBhcmFtcz8uW2luZGV4XSA9PT0gbmV3UGFyYW1zPy5baW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTZXRSdWxlU3RhdHVzUmVmKHBhdGg6IHN0cmluZyk6IFN0b3JlZFJ1bGVTdGF0dXMge1xuICAgIGNvbnN0IHJ1bGVTdGF0dXMgPSBydWxlU3RhdHVzU3RvcmFnZS52YWx1ZS5nZXQocGF0aCk7XG4gICAgaWYgKHJ1bGVTdGF0dXMpIHtcbiAgICAgIHJldHVybiBydWxlU3RhdHVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkcGVuZGluZyA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCAkdmFsaWQgPSByZWYodHJ1ZSk7XG4gICAgICBjb25zdCAkbWV0YWRhdGEgPSByZWYoe30pO1xuICAgICAgY29uc3QgJHZhbGlkYXRpbmcgPSByZWYoZmFsc2UpO1xuICAgICAgcnVsZVN0YXR1c1N0b3JhZ2UudmFsdWUuc2V0KHBhdGgsIHsgJHBlbmRpbmcsICR2YWxpZCwgJG1ldGFkYXRhLCAkdmFsaWRhdGluZyB9KTtcbiAgICAgIHJldHVybiB7ICRwZW5kaW5nLCAkdmFsaWQsICRtZXRhZGF0YSwgJHZhbGlkYXRpbmcgfTtcbiAgICB9XG4gIH1cblxuICBvblNjb3BlRGlzcG9zZSgoKSA9PiB7XG4gICAgcnVsZURlY2xTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gICAgZmllbGRzU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGRpcnR5U3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIHJ1bGVTdGF0dXNTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gICAgYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYWRkUnVsZURlY2xFbnRyeSxcbiAgICBzZXREaXJ0eUVudHJ5LFxuICAgIGNoZWNrUnVsZURlY2xFbnRyeSxcbiAgICBnZXREaXJ0eVN0YXRlLFxuICAgIHRyeVNldFJ1bGVTdGF0dXNSZWYsXG4gICAgZ2V0RmllbGRzRW50cnksXG4gICAgZ2V0Q29sbGVjdGlvbnNFbnRyeSxcbiAgICBnZXRBcnJheVN0YXR1cyxcbiAgICBhZGRBcnJheVN0YXR1cyxcbiAgICBkZWxldGVBcnJheVN0YXR1cyxcbiAgICBhcnJheVN0YXR1c1N0b3JhZ2UsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzLFxuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25SdWxlRGVjbCxcbiAgJEludGVybmFsUmVnbGVQYXJ0aWFsVmFsaWRhdGlvblRyZWUsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZURlY2wsXG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgTWF5YmVHZXR0ZXIsXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzT2JqZWN0LCB1bndyYXBHZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZFJ1bGVzRGVmKFxuICBzdGF0ZTogUmVmPHVua25vd24+LFxuICBydWxlczogUmVmPCRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzPlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPiB7XG4gIHJldHVybiAoXG4gICAgaXNPYmplY3Qoc3RhdGUudmFsdWUpICYmXG4gICAgaXNPYmplY3QocnVsZXMudmFsdWUpICYmXG4gICAgIU9iamVjdC5lbnRyaWVzKHJ1bGVzLnZhbHVlKS5zb21lKChydWxlKSA9PiBpc1J1bGVEZWYocnVsZSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25SdWxlc0RlZihcbiAgcnVsZXM6IFJlZjwkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcywgYW55PlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsPiB7XG4gIHJldHVybiAhIXJ1bGVzLnZhbHVlICYmICckZWFjaCcgaW4gcnVsZXMudmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkYXRvclJ1bGVzRGVmKFxuICBydWxlczogUmVmPCRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzPlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlUnVsZURlY2w+IHtcbiAgcmV0dXJuICEhcnVsZXMudmFsdWUgJiYgaXNPYmplY3QocnVsZXMudmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSdWxlRGVmKHJ1bGU6IHVua25vd24pOiBydWxlIGlzIFJlZ2xlUnVsZURlZmluaXRpb248YW55LCBhbnk+IHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJ1bGUpICYmICdfdmFsaWRhdG9yJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtUnVsZURlZmluaXRpb24oXG4gIHJ1bGU6IFJlZjx1bmtub3duPlxuKTogcnVsZSBpcyBSZWY8UmVnbGVSdWxlRGVmaW5pdGlvbjxhbnksIGFueT4+IHtcbiAgcmV0dXJuICEodHlwZW9mIHJ1bGUudmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtSW5saW5lKFxuICBydWxlOiBSZWY8dW5rbm93bj5cbik6IHJ1bGUgaXMgUmVmPElubGluZVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueVtdLCBhbnk+PiB7XG4gIHJldHVybiB0eXBlb2YgcnVsZS52YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhdGVBcnJheShzdGF0ZTogUmVmPHVua25vd24+KTogc3RhdGUgaXMgUmVmPCh1bmtub3duICYgeyAkaWQ/OiBzdHJpbmcgfSlbXT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9ycyxcbiAgUmVnbGVFeHRlcm5hbEVycm9yVHJlZSxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZFJ1bGVzU3RhdHVzKHJ1bGU6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSk6IHJ1bGUgaXMgJEludGVybmFsUmVnbGVTdGF0dXMge1xuICByZXR1cm4gaXNPYmplY3QocnVsZSkgJiYgJyRmaWVsZHMnIGluIHJ1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cyhcbiAgcnVsZTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlXG4pOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyB7XG4gIHJldHVybiAhIXJ1bGUgJiYgJyRlYWNoJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFN0YXR1cyhydWxlOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUpOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlRmllbGRTdGF0dXMge1xuICByZXR1cm4gISFydWxlICYmICckcnVsZXMnIGluIHJ1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1J1bGVTdGF0dXMocnVsZTogdW5rbm93bik6IHJ1bGUgaXMgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJ1bGUpICYmICckdHlwZScgaW4gcnVsZSAmJiAnJG1lc3NhZ2UnIGluIHJ1bGU7XG59XG5cbi8vICAtLSBFeHRlcm5hbEVycm9yc1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWRFeHRlcm5hbEVycm9yU3RhdHVzKFxuICBydWxlOiAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzXG4pOiBydWxlIGlzIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWU8YW55PiB7XG4gIHJldHVybiAhIXJ1bGUgJiYgJyRlYWNoJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uRXh0ZXJuYWxFcnJvclN0YXR1cyhcbiAgcnVsZTogJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1xuKTogcnVsZSBpcyBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9yczxhbnk+IHtcbiAgcmV0dXJuICEhcnVsZSAmJiAnJGVhY2gnIGluIHJ1bGU7XG59XG4iLCJpbXBvcnQgdHlwZSB7ICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMsIFJlZ2xlRXh0ZXJuYWxDb2xsZWN0aW9uRXJyb3JzIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbihcbiAgdmFsdWU6ICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNcbik6IHZhbHVlIGlzIFJlZ2xlRXh0ZXJuYWxDb2xsZWN0aW9uRXJyb3JzIHtcbiAgcmV0dXJuICckZWFjaCcgaW4gdmFsdWUgfHwgJyRlcnJvcnMnIGluIHZhbHVlO1xufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlRXJyb3JzLFxuICAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvblJ1bGVzU3RhdHVzLCBpc0ZpZWxkU3RhdHVzLCBpc05lc3RlZFJ1bGVzU3RhdHVzIH0gZnJvbSAnLi9ndWFyZHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgZmllbGQsXG4gIHNpbGVudCA9IGZhbHNlLFxufToge1xuICBmaWVsZDogUGljazwkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLCAnJHJ1bGVzJyB8ICckZGlydHknIHwgJyRleHRlcm5hbEVycm9ycyc+O1xuICBzaWxlbnQ/OiBib29sZWFuO1xufSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpZWxkLiRydWxlcyA/PyB7fSlcbiAgICAubWFwKChbcnVsZUtleSwgcnVsZV0pID0+IHtcbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUuJG1lc3NhZ2U7XG4gICAgICB9IGVsc2UgaWYgKCFydWxlLiR2YWxpZCAmJiBmaWVsZC4kZGlydHkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUuJG1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgLmZpbHRlcigobXNnKTogbXNnIGlzIHN0cmluZyB8IHN0cmluZ1tdID0+ICEhbXNnKVxuICAgIC5yZWR1Y2U8c3RyaW5nW10+KChhY2MsIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gYWNjPy5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWNjPy5jb25jYXQodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIFtdKVxuICAgIC5jb25jYXQoZmllbGQuJGV4dGVybmFsRXJyb3JzID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0ZpZWxkRXJyb3JzKFxuICBmaWVsZFN0YXR1czogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBzaWxlbnQgPSBmYWxzZVxuKTogJEludGVybmFsUmVnbGVFcnJvcnMge1xuICBpZiAoaXNOZXN0ZWRSdWxlc1N0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICByZXR1cm4gZXh0cmFjdE5lc3RlZEVycm9ycyhmaWVsZFN0YXR1cy4kZmllbGRzKTtcbiAgfSBlbHNlIGlmIChpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGVycm9yczogZmllbGRTdGF0dXMuJGZpZWxkLiRydWxlc1xuICAgICAgICA/IGV4dHJhY3RSdWxlc0Vycm9ycyh7IGZpZWxkOiBmaWVsZFN0YXR1cy4kZmllbGQsIHNpbGVudCB9KVxuICAgICAgICA6IFtdLFxuICAgICAgJGVhY2g6IGZpZWxkU3RhdHVzLiRlYWNoLm1hcCgoZmllbGQpID0+IHByb2Nlc3NGaWVsZEVycm9ycyhmaWVsZCwgc2lsZW50KSksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgIGlmIChmaWVsZFN0YXR1cy4kZXJyb3IpIHtcbiAgICAgIHJldHVybiBleHRyYWN0UnVsZXNFcnJvcnMoe1xuICAgICAgICBmaWVsZDogZmllbGRTdGF0dXMsXG4gICAgICAgIHNpbGVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmllbGRTdGF0dXMuJGV4dGVybmFsRXJyb3JzID8/IFtdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKFxuICBlYWNoOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGVbXSxcbiAgc2lsZW50ID0gZmFsc2Vcbik6ICRJbnRlcm5hbFJlZ2xlRXJyb3JzW10ge1xuICByZXR1cm4gZWFjaC5tYXAoKGZpZWxkKSA9PiBwcm9jZXNzRmllbGRFcnJvcnMoZmllbGQsIHNpbGVudCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE5lc3RlZEVycm9ycyhcbiAgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+IHwgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlW10sXG4gIHNpbGVudCA9IGZhbHNlXG4pOiBSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZUVycm9ycz4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykubWFwKChbZmllbGRLZXksIGZpZWxkU3RhdHVzXSkgPT4ge1xuICAgICAgaWYgKGlzTmVzdGVkUnVsZXNTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiBbZmllbGRLZXksIGV4dHJhY3ROZXN0ZWRFcnJvcnMoZmllbGRTdGF0dXMuJGZpZWxkcywgc2lsZW50KV07XG4gICAgICB9IGVsc2UgaWYgKGlzQ29sbGVjdGlvblJ1bGVzU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGZpZWxkS2V5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgICRlcnJvcnM6IGV4dHJhY3RSdWxlc0Vycm9ycyh7IGZpZWxkOiBmaWVsZFN0YXR1cy4kZmllbGQsIHNpbGVudCB9KSxcbiAgICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKGZpZWxkU3RhdHVzLiRlYWNoLCBzaWxlbnQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzRmllbGRTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgICAgIGlmIChmaWVsZFN0YXR1cy4kZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgICBleHRyYWN0UnVsZXNFcnJvcnMoe1xuICAgICAgICAgICAgICBmaWVsZDogZmllbGRTdGF0dXMsXG4gICAgICAgICAgICAgIHNpbGVudCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtmaWVsZEtleSwgZmllbGRTdGF0dXMuJGV4dGVybmFsRXJyb3JzID8/IFtdXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtmaWVsZEtleSwgW11dO1xuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VFcnJvcnMoJHJlZ2xlOiAkSW50ZXJuYWxSZWdsZVN0YXR1cykge1xuICBjb25zdCBlcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGV4dHJhY3ROZXN0ZWRFcnJvcnMoJHJlZ2xlLiRmaWVsZHMpO1xuICB9KTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHtcbiAgUG9zc2libGVSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyLFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG59IGZyb20gJy4vcnVsZS5kZWZpbml0aW9uLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVVuaXZlcnNhbFBhcmFtcyB9IGZyb20gJy4vcnVsZS5wYXJhbXMudHlwZXMnO1xuXG4vKipcbiAqIEludGVybmFsIGRlZmluaXRpb24gb2YgdGhlIHJ1bGUsIGNhbiBiZSB1c2VkIHRvIHJlc2V0IG9yIHBhdGNoIHRoZSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnbGVJbnRlcm5hbFJ1bGVEZWZzPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnkgPSBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSA9IFtdLFxuICBUQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IGJvb2xlYW4sXG4+IHtcbiAgX3ZhbGlkYXRvcjogKFxuICAgIHZhbHVlOiBNYXliZTxUVmFsdWU+LFxuICAgIC4uLmFyZ3M6IFRQYXJhbXNcbiAgKSA9PiBUQXN5bmMgZXh0ZW5kcyBmYWxzZSA/IFRNZXRhZGF0YSA6IFByb21pc2U8VE1ldGFkYXRhPjtcbiAgX21lc3NhZ2U6XG4gICAgfCBzdHJpbmdcbiAgICB8IHN0cmluZ1tdXG4gICAgfCAoKHZhbHVlOiBNYXliZTxUVmFsdWU+LCBtZXRhZGF0YTogUG9zc2libGVSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSk7XG4gIF9hY3RpdmU/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgKCh2YWx1ZTogTWF5YmU8VFZhbHVlPiwgbWV0YWRhdGE6IFBvc3NpYmxlUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcikgPT4gYm9vbGVhbik7XG4gIF90eXBlPzogc3RyaW5nO1xuICBfcGF0Y2hlZDogYm9vbGVhbjtcbiAgX3BhcmFtcz86IFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+O1xuICBfYXN5bmM6IFRBc3luYztcbn1cblxuZXhwb3J0IGVudW0gSW50ZXJuYWxSdWxlVHlwZSB7XG4gIElubGluZSA9ICdfX2lubGluZScsXG4gIEFzeW5jID0gJ19fYXN5bmMnLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIHRvUmVmcyB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnkgfSBmcm9tICcuLi9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyhcbiAgZW50cmllczogUmVmPFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnlbXT4sXG4gIHByb3BlcnR5OiBFeHRyYWN0PFxuICAgIGtleW9mIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnksXG4gICAgJyRpbnZhbGlkJyB8ICckZXJyb3InIHwgJyRwZW5kaW5nJyB8ICckZGlydHknIHwgJyR2YWxpZCdcbiAgPlxuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGVudHJpZXMudmFsdWUuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVtwcm9wZXJ0eV07XG4gICAgfSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMoXG4gIGVudHJpZXM6IFJlZjxSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+LFxuICBwcm9wZXJ0eTogRXh0cmFjdDxrZXlvZiBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5LCAnJGVycm9ycycgfCAnJHNpbGVudEVycm9ycyc+XG4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gZW50cmllcy52YWx1ZS5yZWR1Y2UoKGFsbCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGZldGNoZWRQcm9wZXJ0eSA9IGVudHJ5W3Byb3BlcnR5XSB8fCBbXTtcbiAgICAgIHJldHVybiBhbGwuY29uY2F0KGZldGNoZWRQcm9wZXJ0eSk7XG4gICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0U2NvcGUsIHJlYWN0aXZlLCB0b1Jhdywgd2F0Y2ggfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXMsXG4gIEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlLFxuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxSdWxlVHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGRlYm91bmNlLCBpc0VtcHR5IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgdW53cmFwUnVsZVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9jcmVhdGVSdWxlL3Vud3JhcFJ1bGVQYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHsgUmVnbGVTdG9yYWdlIH0gZnJvbSAnLi4vLi4vdXNlU3RvcmFnZSc7XG5pbXBvcnQgeyBpc0Zvcm1SdWxlRGVmaW5pdGlvbiB9IGZyb20gJy4uL2d1YXJkcyc7XG5cbmludGVyZmFjZSBDcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXNPcHRpb25zIHtcbiAgc3RhdGU6IFJlZjx1bmtub3duPjtcbiAgcnVsZUtleTogc3RyaW5nO1xuICBydWxlOiBSZWY8SW5saW5lUnVsZURlY2xhcmF0aW9uPGFueSwgYW55W10sIGFueT4gfCBSZWdsZVJ1bGVEZWZpbml0aW9uPGFueSwgYW55LCBhbnk+PjtcbiAgJGRpcnR5OiBSZWY8Ym9vbGVhbj47XG4gIGN1c3RvbU1lc3NhZ2VzPzogUGFydGlhbDxDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZT47XG4gIHBhdGg6IHN0cmluZztcbiAgc3RvcmFnZTogUmVnbGVTdG9yYWdlO1xuICAkZGVib3VuY2U/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXMoe1xuICAkZGlydHksXG4gIGN1c3RvbU1lc3NhZ2VzLFxuICBydWxlLFxuICBydWxlS2V5LFxuICBzdGF0ZSxcbiAgcGF0aCxcbiAgc3RvcmFnZSxcbiAgJGRlYm91bmNlLFxufTogQ3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzT3B0aW9ucyk6ICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cyB7XG4gIHR5cGUgU2NvcGVTdGF0ZSA9IHtcbiAgICAkYWN0aXZlOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkbWVzc2FnZTogQ29tcHV0ZWRSZWY8c3RyaW5nIHwgc3RyaW5nW10+O1xuICAgICR0eXBlOiBDb21wdXRlZFJlZjxzdHJpbmc+O1xuICAgICR2YWxpZGF0b3I6IENvbXB1dGVkUmVmPFxuICAgICAgUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxcbiAgICAgICAgYW55LFxuICAgICAgICBhbnksXG4gICAgICAgIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPlxuICAgICAgPlxuICAgID47XG4gICAgJHBhcmFtczogQ29tcHV0ZWRSZWY8YW55W10+O1xuICAgICRwYXRoOiBDb21wdXRlZFJlZjxzdHJpbmc+O1xuICB9O1xuICBsZXQgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICBsZXQgc2NvcGVTdGF0ZSE6IFNjb3BlU3RhdGU7XG5cbiAgbGV0ICR1bndhdGNoU3RhdGU6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3QgeyAkcGVuZGluZywgJHZhbGlkLCAkbWV0YWRhdGEsICR2YWxpZGF0aW5nIH0gPSBzdG9yYWdlLnRyeVNldFJ1bGVTdGF0dXNSZWYoXG4gICAgYCR7cGF0aH0uJHtydWxlS2V5fWBcbiAgKTtcblxuICBmdW5jdGlvbiAkd2F0Y2goKSB7XG4gICAgc2NvcGVTdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCAkZGVmYXVsdE1ldGFkYXRhID0gY29tcHV0ZWQ8JEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcj4oKCkgPT4gKHtcbiAgICAgICAgJGludmFsaWQ6ICEkdmFsaWQudmFsdWUsXG4gICAgICAgICRwYXJhbXM6ICRwYXJhbXMudmFsdWUsXG4gICAgICAgIC4uLiRtZXRhZGF0YS52YWx1ZSxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgJGFjdGl2ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKGlzRm9ybVJ1bGVEZWZpbml0aW9uKHJ1bGUpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydWxlLnZhbHVlLmFjdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUudmFsdWUuYWN0aXZlKHN0YXRlLnZhbHVlLCAkZGVmYXVsdE1ldGFkYXRhLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUudmFsdWUuYWN0aXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRtZXNzYWdlID0gY29tcHV0ZWQ8c3RyaW5nIHwgc3RyaW5nW10+KCgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gICAgICAgIGNvbnN0IGN1c3RvbU1lc3NhZ2VSdWxlID0gY3VzdG9tTWVzc2FnZXMgPyBjdXN0b21NZXNzYWdlc1tydWxlS2V5XT8ubWVzc2FnZSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZVJ1bGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU1lc3NhZ2VSdWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gY3VzdG9tTWVzc2FnZVJ1bGUoc3RhdGUudmFsdWUsICRkZWZhdWx0TWV0YWRhdGEudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gY3VzdG9tTWVzc2FnZVJ1bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Zvcm1SdWxlRGVmaW5pdGlvbihydWxlKSkge1xuICAgICAgICAgIGlmICghKGN1c3RvbU1lc3NhZ2VSdWxlICYmICFydWxlLnZhbHVlLl9wYXRjaGVkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBydWxlLnZhbHVlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IHJ1bGUudmFsdWUubWVzc2FnZShzdGF0ZS52YWx1ZSwgJGRlZmF1bHRNZXRhZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gcnVsZS52YWx1ZS5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0VtcHR5KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgbWVzc2FnZSA9ICdFcnJvcic7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBObyBlcnJvciBtZXNzYWdlIGRlZmluZWQgZm9yICR7cGF0aH0uJHtydWxlS2V5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHR5cGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zvcm1SdWxlRGVmaW5pdGlvbihydWxlKSAmJiBydWxlLnZhbHVlLnR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gcnVsZS52YWx1ZS50eXBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBydWxlS2V5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHZhbGlkYXRvciA9IGNvbXB1dGVkPFxuICAgICAgICBSZWdsZVJ1bGVEZWZpbml0aW9uUHJvY2Vzc29yPGFueSwgYW55LCBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPj5cbiAgICAgID4oKCkgPT4ge1xuICAgICAgICBpZiAoaXNGb3JtUnVsZURlZmluaXRpb24ocnVsZSkpIHtcbiAgICAgICAgICByZXR1cm4gcnVsZS52YWx1ZS52YWxpZGF0b3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUudmFsdWUgYXMgSW5saW5lUnVsZURlY2xhcmF0aW9uPGFueSwgYW55W10sIGFueT47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGFyYW1zID0gY29tcHV0ZWQ8YW55W10+KCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBydWxlLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bndyYXBSdWxlUGFyYW1ldGVycyhydWxlLnZhbHVlLl9wYXJhbXMgPz8gW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRwYXRoID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiBgJHtwYXRofS4keyR0eXBlLnZhbHVlfWApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkYWN0aXZlLFxuICAgICAgICAkbWVzc2FnZSxcbiAgICAgICAgJHR5cGUsXG4gICAgICAgICR2YWxpZGF0b3IsXG4gICAgICAgICRwYXJhbXMsXG4gICAgICAgICRwYXRoLFxuICAgICAgfSBzYXRpc2ZpZXMgU2NvcGVTdGF0ZTtcbiAgICB9KSE7XG5cbiAgICAkdW53YXRjaFN0YXRlID0gd2F0Y2goc2NvcGVTdGF0ZS4kcGFyYW1zLCAkdmFsaWRhdGUsIHtcbiAgICAgIGRlZXA6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAkd2F0Y2goKTtcblxuICBhc3luYyBmdW5jdGlvbiBjb21wdXRlQXN5bmNSZXN1bHQocHJvbWlzZTogUHJvbWlzZTxSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24+KSB7XG4gICAgbGV0IHJ1bGVSZXN1bHQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgJHZhbGlkLnZhbHVlID0gdHJ1ZTtcbiAgICAgIGlmICgkZGlydHkudmFsdWUpIHtcbiAgICAgICAgJHBlbmRpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvbWlzZVJlc3VsdCA9IGF3YWl0IHByb21pc2U7XG4gICAgICBpZiAodHlwZW9mIHByb21pc2VSZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICBydWxlUmVzdWx0ID0gcHJvbWlzZVJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgJHZhbGlkLCAuLi5yZXN0IH0gPSBwcm9taXNlUmVzdWx0O1xuICAgICAgICBydWxlUmVzdWx0ID0gJHZhbGlkO1xuICAgICAgICAkbWV0YWRhdGEudmFsdWUgPSByZXN0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJ1bGVSZXN1bHQgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgJHBlbmRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZVJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0ICRjb21wdXRlQXN5bmNEZWJvdW5jZSA9IGRlYm91bmNlKGNvbXB1dGVBc3luY1Jlc3VsdCwgJGRlYm91bmNlID8/IDEwMCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gJHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICR2YWxpZGF0aW5nLnZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY29wZVN0YXRlLiR2YWxpZGF0b3IudmFsdWU7XG4gICAgbGV0IHJ1bGVSZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCByZXN1bHRPclByb21pc2UgPSB2YWxpZGF0b3Ioc3RhdGUudmFsdWUsIC4uLnNjb3BlU3RhdGUuJHBhcmFtcy52YWx1ZSk7XG5cbiAgICBpZiAocmVzdWx0T3JQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgY29uc3QgcHJvbWlzZURlYm91bmNlID0gJGNvbXB1dGVBc3luY0RlYm91bmNlKHJlc3VsdE9yUHJvbWlzZSk7XG4gICAgICBydWxlUmVzdWx0ID0gYXdhaXQgcHJvbWlzZURlYm91bmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzdWx0T3JQcm9taXNlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRPclByb21pc2UgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHJ1bGVSZXN1bHQgPSByZXN1bHRPclByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyAkdmFsaWQsIC4uLnJlc3QgfSA9IHJlc3VsdE9yUHJvbWlzZTtcbiAgICAgICAgICBydWxlUmVzdWx0ID0gJHZhbGlkO1xuICAgICAgICAgICRtZXRhZGF0YS52YWx1ZSA9IHJlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgJHZhbGlkLnZhbHVlID0gcnVsZVJlc3VsdDtcblxuICAgICR2YWxpZGF0aW5nLnZhbHVlID0gZmFsc2U7XG5cbiAgICByZXR1cm4gcnVsZVJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uICRyZXNldCgpIHtcbiAgICAkdmFsaWQudmFsdWUgPSB0cnVlO1xuICAgICRtZXRhZGF0YS52YWx1ZSA9IHt9O1xuICAgICRwZW5kaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgJHZhbGlkYXRpbmcudmFsdWUgPSBmYWxzZTtcblxuICAgICR3YXRjaCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgJHVud2F0Y2hTdGF0ZSgpO1xuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIH1cblxuICByZXR1cm4gcmVhY3RpdmUoe1xuICAgIC4uLnNjb3BlU3RhdGUsXG4gICAgJHBlbmRpbmcsXG4gICAgJHZhbGlkLFxuICAgICRtZXRhZGF0YSxcbiAgICAkdmFsaWRhdGUsXG4gICAgJHVud2F0Y2gsXG4gICAgJHdhdGNoLFxuICAgICRyZXNldCxcbiAgfSkgc2F0aXNmaWVzICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cztcbn1cbiIsImltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYsIFJlZiwgV2F0Y2hTdG9wSGFuZGxlIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3RTY29wZSwgcmVhY3RpdmUsIHJlZiwgdG9SZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlRmllbGRTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZURlY2wsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cyxcbiAgQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWUsXG4gIEZpZWxkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxuICBSZWdsZVJ1bGVEZWNsLFxuICBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGlzRW1wdHksIGlzVnVlU3VwZXJpb3JPckVxdWFsVG8zZG90Rml2ZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVnbGVTdG9yYWdlIH0gZnJvbSAnLi4vLi4vdXNlU3RvcmFnZSc7XG5pbXBvcnQgeyBleHRyYWN0UnVsZXNFcnJvcnMgfSBmcm9tICcuLi91c2VFcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXMnO1xuXG5pbnRlcmZhY2UgQ3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1c0FyZ3Mge1xuICBzdGF0ZTogUmVmPHVua25vd24+O1xuICBydWxlc0RlZjogUmVmPCRJbnRlcm5hbFJlZ2xlUnVsZURlY2w+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xuICBleHRlcm5hbEVycm9yczogUmVhZG9ubHk8UmVmPHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIG9uVW53YXRjaD86ICgpID0+IHZvaWQ7XG59XG5cbnR5cGUgU2NvcGVSZXR1cm5TdGF0ZSA9IHtcbiAgJGVycm9yOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGVycm9yczogQ29tcHV0ZWRSZWY8c3RyaW5nW10+O1xuICAkc2lsZW50RXJyb3JzOiBDb21wdXRlZFJlZjxzdHJpbmdbXT47XG4gICRwZW5kaW5nOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGludmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkZGVib3VuY2U6IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD47XG4gICRsYXp5OiBDb21wdXRlZFJlZjxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgJHJld2FyZEVhcmx5OiBDb21wdXRlZFJlZjxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgJGF1dG9EaXJ0eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gICRhbnlEaXJ0eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyh7XG4gIHN0YXRlLFxuICBydWxlc0RlZixcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGgsXG4gIHN0b3JhZ2UsXG4gIG9wdGlvbnMsXG4gIGV4dGVybmFsRXJyb3JzLFxuICBpbmRleCxcbiAgb25VbndhdGNoLFxufTogQ3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1c0FyZ3MpOiAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzIHtcbiAgbGV0IHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVJldHVyblN0YXRlO1xuXG4gIGNvbnN0ICRkaXJ0eSA9IHJlZihmYWxzZSk7XG5cbiAgY29uc3QgdHJpZ2dlclB1bmlzaG1lbnQgPSByZWYoZmFsc2UpO1xuXG4gIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHJlZjxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oW10pO1xuXG4gIGxldCAkdW53YXRjaFN0YXRlOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaFZhbGlkOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaEV4dGVybmFsRXJyb3JzOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaERpcnR5OiBXYXRjaFN0b3BIYW5kbGU7XG5cbiAgbGV0ICRjb21taXQgPSAoKSA9PiB7fTtcblxuICBmdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxFcnJvcnMoKSB7XG4gICAgJGV4dGVybmFsRXJyb3JzLnZhbHVlID0gZXh0ZXJuYWxFcnJvcnMudmFsdWUgPz8gW107XG4gIH1cbiAgY29sbGVjdEV4dGVybmFsRXJyb3JzKCk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVSdWxlc1Jlc3VsdCgpIHtcbiAgICBjb25zdCBkZWNsYXJlZFJ1bGVzID0gcnVsZXNEZWYudmFsdWUgYXMgUmVnbGVSdWxlRGVjbDxhbnksIGFueT47XG4gICAgY29uc3Qgc3RvcmVSZXN1bHQgPSBzdG9yYWdlLmNoZWNrUnVsZURlY2xFbnRyeShwYXRoLCBkZWNsYXJlZFJ1bGVzKTtcblxuICAgICRsb2NhbE9wdGlvbnMudmFsdWUgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhkZWNsYXJlZFJ1bGVzKS5maWx0ZXIoKFtydWxlS2V5XSkgPT4gcnVsZUtleS5zdGFydHNXaXRoKCckJykpXG4gICAgKTtcblxuICAgICRydWxlcy52YWx1ZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bGVzRGVmLnZhbHVlKVxuICAgICAgICAuZmlsdGVyKChbcnVsZUtleV0pID0+ICFydWxlS2V5LnN0YXJ0c1dpdGgoJyQnKSlcbiAgICAgICAgLm1hcCgoW3J1bGVLZXksIHJ1bGVdKSA9PiB7XG4gICAgICAgICAgaWYgKHJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZWYgPSB0b1JlZigoKSA9PiBydWxlKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIHJ1bGVLZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cyh7XG4gICAgICAgICAgICAgICAgJGRpcnR5LFxuICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIHJ1bGU6IHJ1bGVSZWYgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJ1bGVLZXksXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICRkZWJvdW5jZTogJGxvY2FsT3B0aW9ucy52YWx1ZS4kZGVib3VuY2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChydWxlRGVmKTogcnVsZURlZiBpcyBbc3RyaW5nLCAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXNdID0+ICEhcnVsZURlZi5sZW5ndGgpXG4gICAgKTtcblxuICAgICR3YXRjaCgpO1xuXG4gICAgJGNvbW1pdCA9IHNjb3BlU3RhdGUuJGRlYm91bmNlLnZhbHVlXG4gICAgICA/IGRlYm91bmNlKCRjb21taXRIYW5kbGVyLCBzY29wZVN0YXRlLiRkZWJvdW5jZS52YWx1ZSA/PyAwKVxuICAgICAgOiAkY29tbWl0SGFuZGxlcjtcblxuICAgIGlmIChzdG9yZVJlc3VsdD8udmFsaWQgIT0gbnVsbCkge1xuICAgICAgJGRpcnR5LnZhbHVlID0gc3RvcmFnZS5nZXREaXJ0eVN0YXRlKHBhdGgpO1xuICAgICAgaWYgKCRkaXJ0eS52YWx1ZSkge1xuICAgICAgICAkY29tbWl0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RvcmFnZS5hZGRSdWxlRGVjbEVudHJ5KHBhdGgsIGRlY2xhcmVkUnVsZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCRydWxlcy52YWx1ZSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5mb3JFYWNoKChbXywgcnVsZV0pID0+IHtcbiAgICAgICAgcnVsZS4kdW53YXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgICR1bndhdGNoRGlydHkoKTtcbiAgICBpZiAoJGRpcnR5LnZhbHVlKSB7XG4gICAgICBzdG9yYWdlLnNldERpcnR5RW50cnkocGF0aCwgJGRpcnR5LnZhbHVlKTtcbiAgICB9XG4gICAgJHVud2F0Y2hTdGF0ZSgpO1xuICAgICR1bndhdGNoVmFsaWQoKTtcbiAgICAkdW53YXRjaEV4dGVybmFsRXJyb3JzKCk7XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgICBvblVud2F0Y2g/LigpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHdhdGNoKCkge1xuICAgIGlmICgkcnVsZXMudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZm9yRWFjaCgoW18sIHJ1bGVdKSA9PiB7XG4gICAgICAgIHJ1bGUuJHdhdGNoKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVTdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCAkYW55RGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAkZGlydHkudmFsdWUpO1xuICAgICAgY29uc3QgJGRlYm91bmNlID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRkZWJvdW5jZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkbGF6eSA9IGNvbXB1dGVkPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgaWYgKCRsb2NhbE9wdGlvbnMudmFsdWUuJGxhenkgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRsYXp5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnJlZihvcHRpb25zLmxhenkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRyZXdhcmRFYXJseSA9IGNvbXB1dGVkPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgaWYgKCRsb2NhbE9wdGlvbnMudmFsdWUuJHJld2FyZEVhcmx5ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gJGxvY2FsT3B0aW9ucy52YWx1ZS4kcmV3YXJkRWFybHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucmVmKG9wdGlvbnMucmV3YXJkRWFybHkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRhdXRvRGlydHkgPSBjb21wdXRlZDxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIGlmICgkbG9jYWxPcHRpb25zLnZhbHVlLiRhdXRvRGlydHkgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRhdXRvRGlydHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucmVmKG9wdGlvbnMuYXV0b0RpcnR5KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAkaW52YWxpZC52YWx1ZSAmJiAhJHBlbmRpbmcudmFsdWUgJiYgJGRpcnR5LnZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgICBmaWVsZDoge1xuICAgICAgICAgICAgJGRpcnR5OiAkZGlydHkudmFsdWUsXG4gICAgICAgICAgICAkZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycy52YWx1ZSxcbiAgICAgICAgICAgICRydWxlczogJHJ1bGVzLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRzaWxlbnRFcnJvcnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgICBmaWVsZDoge1xuICAgICAgICAgICAgJGRpcnR5OiAkZGlydHkudmFsdWUsXG4gICAgICAgICAgICAkZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycy52YWx1ZSxcbiAgICAgICAgICAgICRydWxlczogJHJ1bGVzLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKHRyaWdnZXJQdW5pc2htZW50LnZhbHVlIHx8ICEkcmV3YXJkRWFybHkudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5zb21lKChba2V5LCBydWxlUmVzdWx0XSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGVSZXN1bHQuJHBlbmRpbmc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRpbnZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICBpZiAoJGV4dGVybmFsRXJyb3JzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghJHJld2FyZEVhcmx5LnZhbHVlIHx8ICgkcmV3YXJkRWFybHkudmFsdWUgJiYgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuc29tZSgoW2tleSwgcnVsZVJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhcnVsZVJlc3VsdC4kdmFsaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICR2YWxpZCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKCRkaXJ0eS52YWx1ZSAmJiAhaXNFbXB0eShzdGF0ZS52YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoJGV4dGVybmFsRXJyb3JzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCRyZXdhcmRFYXJseS52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZXZlcnkoKFtrZXksIHJ1bGVSZXN1bHRdKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBydWxlUmVzdWx0LiR2YWxpZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gISRpbnZhbGlkLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgd2F0Y2goJHZhbGlkLCAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgICRlcnJvcixcbiAgICAgICAgJHBlbmRpbmcsXG4gICAgICAgICRpbnZhbGlkLFxuICAgICAgICAkdmFsaWQsXG4gICAgICAgICRkZWJvdW5jZSxcbiAgICAgICAgJGxhenksXG4gICAgICAgICRlcnJvcnMsXG4gICAgICAgICRzaWxlbnRFcnJvcnMsXG4gICAgICAgICRyZXdhcmRFYXJseSxcbiAgICAgICAgJGF1dG9EaXJ0eSxcbiAgICAgICAgJGFueURpcnR5LFxuICAgICAgfSBzYXRpc2ZpZXMgU2NvcGVSZXR1cm5TdGF0ZTtcbiAgICB9KSBhcyBTY29wZVJldHVyblN0YXRlO1xuXG4gICAgJHVud2F0Y2hFeHRlcm5hbEVycm9ycyA9IHdhdGNoKGV4dGVybmFsRXJyb3JzLCBjb2xsZWN0RXh0ZXJuYWxFcnJvcnMpO1xuICAgICR1bndhdGNoU3RhdGUgPSB3YXRjaChcbiAgICAgIHN0YXRlLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoc2NvcGVTdGF0ZS4kYXV0b0RpcnR5LnZhbHVlKSB7XG4gICAgICAgICAgaWYgKCEkZGlydHkudmFsdWUpIHtcbiAgICAgICAgICAgICRkaXJ0eS52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlc0RlZi52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgY3JlYXRlUmVhY3RpdmVSdWxlc1Jlc3VsdCgpO1xuICAgICAgICB9XG4gICAgICAgICRjb21taXQoKTtcbiAgICAgICAgaWYgKCFzY29wZVN0YXRlLiRyZXdhcmRFYXJseS52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyAkY2xlYXJFeHRlcm5hbEVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBkZWVwOiBpc1Z1ZVN1cGVyaW9yT3JFcXVhbFRvM2RvdEZpdmUgPyAxIDogdHJ1ZSB9XG4gICAgKTtcblxuICAgICR1bndhdGNoRGlydHkgPSB3YXRjaCgkZGlydHksICgpID0+IHtcbiAgICAgIHN0b3JhZ2Uuc2V0RGlydHlFbnRyeShwYXRoLCAkZGlydHkudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgJHVud2F0Y2hWYWxpZCA9IHdhdGNoKHNjb3BlU3RhdGUuJHZhbGlkLCAodmFsaWQpID0+IHtcbiAgICAgIGlmIChzY29wZVN0YXRlLiRyZXdhcmRFYXJseS52YWx1ZSAmJiB2YWxpZCkge1xuICAgICAgICB0cmlnZ2VyUHVuaXNobWVudC52YWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gJGNvbW1pdEhhbmRsZXIoKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5mb3JFYWNoKChba2V5LCBydWxlXSkgPT4ge1xuICAgICAgcnVsZS4kdmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0ICRydWxlcyA9IHJlZigpIGFzIFJlZjxSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXM+PjtcbiAgY29uc3QgJGxvY2FsT3B0aW9ucyA9IHJlZigpIGFzIFJlZjxGaWVsZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucz47XG5cbiAgY3JlYXRlUmVhY3RpdmVSdWxlc1Jlc3VsdCgpO1xuXG4gIGZ1bmN0aW9uICRyZXNldCgpOiB2b2lkIHtcbiAgICAkZGlydHkudmFsdWUgPSBmYWxzZTtcbiAgICAkZXh0ZXJuYWxFcnJvcnMudmFsdWUgPSBbXTtcbiAgICBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLmZvckVhY2goKFtrZXksIHJ1bGVdKSA9PiB7XG4gICAgICBydWxlLiRyZXNldCgpO1xuICAgIH0pO1xuICAgIGlmICghc2NvcGVTdGF0ZS4kbGF6eS52YWx1ZSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5tYXAoKFtrZXksIHJ1bGVdKSA9PiB7XG4gICAgICAgIHJldHVybiBydWxlLiR2YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJHRvdWNoKCk6IHZvaWQge1xuICAgIGlmICghJGRpcnR5LnZhbHVlKSB7XG4gICAgICAkZGlydHkudmFsdWUgPSB0cnVlO1xuICAgICAgaWYgKCFzY29wZVN0YXRlLiRyZXdhcmRFYXJseS52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy8gJGNsZWFyRXh0ZXJuYWxFcnJvcnMoKTtcbiAgICAgIH1cbiAgICAgICRjb21taXQoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCAkdmFsaWRhdGUgPSBzY29wZVN0YXRlLiRkZWJvdW5jZS52YWx1ZVxuICAgID8gZGVib3VuY2UoJHZhbGlkYXRlSGFuZGxlciwgc2NvcGVTdGF0ZS4kZGVib3VuY2UudmFsdWUgPz8gMClcbiAgICA6ICR2YWxpZGF0ZUhhbmRsZXI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gJHZhbGlkYXRlSGFuZGxlcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUgPSB0cnVlO1xuICAgICAgaWYgKHNjb3BlU3RhdGUuJGF1dG9EaXJ0eS52YWx1ZSAmJiAkZGlydHkudmFsdWUgJiYgIXNjb3BlU3RhdGUuJHBlbmRpbmcudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICFzY29wZVN0YXRlLiRlcnJvci52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5tYXAoKFtrZXksIHJ1bGVdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUuJHZhbGlkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJGNsZWFyRXh0ZXJuYWxFcnJvcnMoKSB7XG4gICAgJGV4dGVybmFsRXJyb3JzLnZhbHVlID0gW107XG4gIH1cblxuICBpZiAoIXNjb3BlU3RhdGUuJGxhenkudmFsdWUpIHtcbiAgICAkdmFsaWRhdGVIYW5kbGVyKCk7XG4gIH1cblxuICByZXR1cm4gcmVhY3RpdmUoe1xuICAgICRkaXJ0eSxcbiAgICAuLi5zY29wZVN0YXRlLFxuICAgICRleHRlcm5hbEVycm9ycyxcbiAgICAkdmFsdWU6IHN0YXRlLFxuICAgICRydWxlczogJHJ1bGVzLFxuICAgICRyZXNldCxcbiAgICAkdG91Y2gsXG4gICAgJHZhbGlkYXRlLFxuICAgICR1bndhdGNoLFxuICAgICR3YXRjaCxcbiAgICAkY2xlYXJFeHRlcm5hbEVycm9ycyxcbiAgfSkgc2F0aXNmaWVzICRJbnRlcm5hbFJlZ2xlRmllbGRTdGF0dXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgcmVmLCB0b1JlZiwgd2F0Y2ggfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzLFxuICAkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcyxcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzLFxuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25SdWxlRGVjbCxcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUsXG4gIEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlLFxuICBEZWVwTWF5YmVSZWYsXG4gIFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGVDb2xsZWN0aW9uUnVsZURlY2xLZXlQcm9wZXJ0eSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgcmFuZG9tSWQsIHVud3JhcEdldHRlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGlzVnVlU3VwZXJpb3JPckVxdWFsVG8zZG90Rml2ZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3ZlcnNpb24tY29tcGFyZSc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlU3RvcmFnZSB9IGZyb20gJy4uLy4uL3VzZVN0b3JhZ2UnO1xuaW1wb3J0IHsgaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbiwgaXNSdWxlRGVmIH0gZnJvbSAnLi4vZ3VhcmRzJztcbmltcG9ydCB7IGV4dHJhY3RDb2xsZWN0aW9uRXJyb3IsIGV4dHJhY3RSdWxlc0Vycm9ycyB9IGZyb20gJy4uL3VzZUVycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMgfSBmcm9tICcuL2NyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzJztcblxudHlwZSBTdGF0ZVdpdGhJZCA9IHVua25vd24gJiB7ICRpZD86IHN0cmluZyB9O1xuXG5mdW5jdGlvbiBjcmVhdGVDb2xsZWN0aW9uRWxlbWVudCh7XG4gICRpZCxcbiAgcGF0aCxcbiAgaW5kZXgsXG4gIG9wdGlvbnMsXG4gIHN0b3JhZ2UsXG4gIHN0YXRlVmFsdWUsXG4gIGN1c3RvbU1lc3NhZ2VzLFxuICBydWxlcyxcbiAgZXh0ZXJuYWxFcnJvcnMsXG59OiB7XG4gICRpZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHN0YXRlVmFsdWU6IFJlZjxTdGF0ZVdpdGhJZD47XG4gIGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU7XG4gIHN0b3JhZ2U6IFJlZ2xlU3RvcmFnZTtcbiAgb3B0aW9uczogRGVlcE1heWJlUmVmPFJlcXVpcmVkRGVlcDxSZWdsZUJlaGF2aW91ck9wdGlvbnM+PjtcbiAgcnVsZXM6ICRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzICYgUmVnbGVDb2xsZWN0aW9uUnVsZURlY2xLZXlQcm9wZXJ0eTtcbiAgZXh0ZXJuYWxFcnJvcnM6IENvbXB1dGVkUmVmPCRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNbXSB8IHVuZGVmaW5lZD47XG59KTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlIHwgbnVsbCB7XG4gIGNvbnN0ICRmaWVsZElkID0gcnVsZXMuJGtleSA/IHJ1bGVzLiRrZXkgOiByYW5kb21JZCgpO1xuICBsZXQgJHBhdGggPSBgJHtwYXRofS4ke1N0cmluZygkZmllbGRJZCl9YDtcblxuICBpZiAodHlwZW9mIHN0YXRlVmFsdWUudmFsdWUgPT09ICdvYmplY3QnICYmIHN0YXRlVmFsdWUudmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICghc3RhdGVWYWx1ZS52YWx1ZS4kaWQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0YXRlVmFsdWUudmFsdWUsIHtcbiAgICAgICAgJGlkOiB7XG4gICAgICAgICAgdmFsdWU6ICRmaWVsZElkLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwYXRoID0gYCR7cGF0aH0uJHtzdGF0ZVZhbHVlLnZhbHVlLiRpZH1gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHRvUmVmKCgpID0+IGV4dGVybmFsRXJyb3JzLnZhbHVlPy5baW5kZXhdKTtcblxuICBjb25zdCAkc3RhdHVzID0gY3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyh7XG4gICAgc3RhdGU6IHN0YXRlVmFsdWUsXG4gICAgcnVsZXNEZWY6IHRvUmVmKCgpID0+IHJ1bGVzKSxcbiAgICBjdXN0b21NZXNzYWdlcyxcbiAgICBwYXRoOiAkcGF0aCxcbiAgICBzdG9yYWdlLFxuICAgIG9wdGlvbnMsXG4gICAgZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycyxcbiAgfSk7XG5cbiAgaWYgKCRzdGF0dXMpIHtcbiAgICBjb25zdCB2YWx1ZUlkID0gc3RhdGVWYWx1ZS52YWx1ZT8uJGlkO1xuICAgICRzdGF0dXMuJGlkID0gdmFsdWVJZCA/PyBTdHJpbmcoJGZpZWxkSWQpO1xuICAgIHN0b3JhZ2UuYWRkQXJyYXlTdGF0dXMoJGlkLCAkc3RhdHVzLiRpZCwgJHN0YXR1cyk7XG4gIH1cblxuICByZXR1cm4gJHN0YXR1cztcbn1cblxuaW50ZXJmYWNlIENyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1c0FyZ3Mge1xuICBzdGF0ZTogUmVmPFN0YXRlV2l0aElkW10gJiBTdGF0ZVdpdGhJZD47XG4gIHJ1bGVzRGVmOiBSZWY8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uUnVsZURlY2w+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xuICBleHRlcm5hbEVycm9yczogUmVhZG9ubHk8UmVmPCRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMgfCB1bmRlZmluZWQ+Pjtcbn1cblxuaW50ZXJmYWNlIFNjb3BlUmV0dXJuU3RhdGUge1xuICAkZGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkYW55RGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkaW52YWxpZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICR2YWxpZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRlcnJvcjogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRwZW5kaW5nOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGVycm9yczogQ29tcHV0ZWRSZWY8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzPjtcbiAgJHNpbGVudEVycm9yczogQ29tcHV0ZWRSZWY8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzPjtcbn1cblxuaW50ZXJmYWNlIEltbWVkaWF0ZVNjb3BlUmV0dXJuU3RhdGUge1xuICBpc1ByaW1pdGl2ZUFycmF5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGV4dGVybmFsRXJyb3JzRmllbGQ6IENvbXB1dGVkUmVmPHN0cmluZ1tdPjtcbiAgJGV4dGVybmFsRXJyb3JzRWFjaDogQ29tcHV0ZWRSZWY8JEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1tdPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cyh7XG4gIHN0YXRlLFxuICBydWxlc0RlZixcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGgsXG4gIHN0b3JhZ2UsXG4gIG9wdGlvbnMsXG4gIGV4dGVybmFsRXJyb3JzLFxufTogQ3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzQXJncyk6ICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyB8IG51bGwge1xuICBsZXQgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICBsZXQgc2NvcGVTdGF0ZSE6IFNjb3BlUmV0dXJuU3RhdGU7XG5cbiAgbGV0IGltbWVkaWF0ZVNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IGltbWVkaWF0ZVNjb3BlU3RhdGUhOiBJbW1lZGlhdGVTY29wZVJldHVyblN0YXRlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnZhbHVlKSAmJiAhcnVsZXNEZWYudmFsdWUuJGVhY2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCAkaWQgPSByZWY8c3RyaW5nPigpIGFzIFJlZjxzdHJpbmc+O1xuICBjb25zdCAkdmFsdWUgPSByZWYoc3RhdGUudmFsdWUpO1xuXG4gIGxldCAkdW53YXRjaFN0YXRlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCAkZmllbGRTdGF0dXMgPSByZWYoe30pIGFzIFJlZjwkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzPjtcbiAgY29uc3QgJGVhY2hTdGF0dXMgPSBzdG9yYWdlLmdldENvbGxlY3Rpb25zRW50cnkocGF0aCk7XG5cbiAgaW1tZWRpYXRlU2NvcGVTdGF0ZSA9IGltbWVkaWF0ZVNjb3BlLnJ1bigoKSA9PiB7XG4gICAgY29uc3QgaXNQcmltaXRpdmVBcnJheSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnZhbHVlKSAmJiBzdGF0ZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnZhbHVlLnNvbWUoKHMpID0+IHR5cGVvZiBzICE9PSAnb2JqZWN0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJ1bGVzRGVmLnZhbHVlLiRlYWNoICYmICEocnVsZXNEZWYudmFsdWUuJGVhY2ggaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocnVsZXNEZWYudmFsdWUuJGVhY2gpLmV2ZXJ5KChydWxlKSA9PiBpc1J1bGVEZWYocnVsZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgJGV4dGVybmFsRXJyb3JzRmllbGQgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgaWYgKGV4dGVybmFsRXJyb3JzLnZhbHVlKSB7XG4gICAgICAgIGlmIChpc0V4dGVybmFsRXJyb3JDb2xsZWN0aW9uKGV4dGVybmFsRXJyb3JzLnZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBleHRlcm5hbEVycm9ycy52YWx1ZS4kZXJyb3JzID8/IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcblxuICAgIGNvbnN0ICRleHRlcm5hbEVycm9yc0VhY2ggPSBjb21wdXRlZDwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzW10+KCgpID0+IHtcbiAgICAgIGlmIChleHRlcm5hbEVycm9ycy52YWx1ZSkge1xuICAgICAgICBpZiAoaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbihleHRlcm5hbEVycm9ycy52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZXh0ZXJuYWxFcnJvcnMudmFsdWUuJGVhY2ggPz8gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpc1ByaW1pdGl2ZUFycmF5LFxuICAgICAgJGV4dGVybmFsRXJyb3JzRmllbGQsXG4gICAgICAkZXh0ZXJuYWxFcnJvcnNFYWNoLFxuICAgIH0gc2F0aXNmaWVzIEltbWVkaWF0ZVNjb3BlUmV0dXJuU3RhdGU7XG4gIH0pITtcblxuICBjcmVhdGVTdGF0dXMoKTtcbiAgJHdhdGNoKCk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdHVzKCkge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT0gbnVsbCAmJiAhc3RhdGUudmFsdWU/LiRpZCAmJiBzdGF0ZS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAkaWQudmFsdWUgPSByYW5kb21JZCgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdGF0ZS52YWx1ZSwge1xuICAgICAgICAgICRpZDoge1xuICAgICAgICAgICAgdmFsdWU6ICRpZC52YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUudmFsdWU/LiRpZCkge1xuICAgICAgICAkaWQudmFsdWUgPSBzdGF0ZS52YWx1ZS4kaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGltbWVkaWF0ZVNjb3BlU3RhdGUuaXNQcmltaXRpdmVBcnJheS52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgICR2YWx1ZS52YWx1ZSA9ICRmaWVsZFN0YXR1cy52YWx1ZS4kdmFsdWU7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSkgJiYgcnVsZXNEZWYudmFsdWUuJGVhY2gpIHtcbiAgICAgICRlYWNoU3RhdHVzLnZhbHVlID0gc3RhdGUudmFsdWVcbiAgICAgICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdW53cmFwcGVkJEVhY2ggPSB1bndyYXBHZXR0ZXIoXG4gICAgICAgICAgICBydWxlc0RlZi52YWx1ZS4kZWFjaCxcbiAgICAgICAgICAgIHRvUmVmKCgpID0+IHZhbHVlKSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodW53cmFwcGVkJEVhY2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjcmVhdGVDb2xsZWN0aW9uRWxlbWVudCh7XG4gICAgICAgICAgICAgICRpZDogJGlkLnZhbHVlLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBydWxlczogdW53cmFwcGVkJEVhY2gsXG4gICAgICAgICAgICAgIHN0YXRlVmFsdWU6IHRvUmVmKCgpID0+IHZhbHVlKSxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgIGV4dGVybmFsRXJyb3JzOiBpbW1lZGlhdGVTY29wZVN0YXRlLiRleHRlcm5hbEVycm9yc0VhY2gsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlYWNoKSA9PiAhIWVhY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IFtdO1xuICAgIH1cblxuICAgICRmaWVsZFN0YXR1cy52YWx1ZSA9IGNyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMoe1xuICAgICAgc3RhdGUsXG4gICAgICBydWxlc0RlZixcbiAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgcGF0aCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0ZXJuYWxFcnJvcnM6IGltbWVkaWF0ZVNjb3BlU3RhdGUuJGV4dGVybmFsRXJyb3JzRmllbGQsXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTdGF0dXMoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGUudmFsdWUpKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1N0YXR1cyA9IGNsb25lRGVlcCgkZWFjaFN0YXR1cy52YWx1ZSk7XG5cbiAgICAgICRlYWNoU3RhdHVzLnZhbHVlID0gc3RhdGUudmFsdWVcbiAgICAgICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdG9SZWYoKCkgPT4gdmFsdWUpO1xuICAgICAgICAgIGlmICh2YWx1ZS4kaWQgJiYgJGVhY2hTdGF0dXMudmFsdWUuZmluZCgoZWFjaCkgPT4gZWFjaC4kaWQgPT09IHZhbHVlLiRpZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU3RhdHVzID0gc3RvcmFnZS5nZXRBcnJheVN0YXR1cygkaWQudmFsdWUsIHZhbHVlLiRpZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdTdGF0dXMpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdTdGF0dXMuJHZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTdGF0dXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW53cmFwcGVkJEVhY2ggPSB1bndyYXBHZXR0ZXIocnVsZXNEZWYudmFsdWUuJGVhY2gsIGN1cnJlbnRWYWx1ZSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKHVud3JhcHBlZCRFYWNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjcmVhdGVDb2xsZWN0aW9uRWxlbWVudCh7XG4gICAgICAgICAgICAgICAgJGlkOiAkaWQudmFsdWUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBydWxlczogdW53cmFwcGVkJEVhY2gsXG4gICAgICAgICAgICAgICAgc3RhdGVWYWx1ZTogY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBleHRlcm5hbEVycm9yczogaW1tZWRpYXRlU2NvcGVTdGF0ZS4kZXh0ZXJuYWxFcnJvcnNFYWNoLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGVhY2gpID0+ICEhZWFjaCk7XG5cbiAgICAgIHByZXZpb3VzU3RhdHVzXG4gICAgICAgIC5maWx0ZXIoKCRlYWNoKSA9PiAhc3RhdGUudmFsdWUuZmluZCgoZikgPT4gJGVhY2guJGlkID09PSBmLiRpZCkpXG4gICAgICAgIC5mb3JFYWNoKCgkZWFjaCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBzdG9yYWdlLmRlbGV0ZUFycmF5U3RhdHVzKCRpZC52YWx1ZSwgaW5kZXgudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uICR3YXRjaCgpIHtcbiAgICAkdW53YXRjaFN0YXRlID0gd2F0Y2goXG4gICAgICBzdGF0ZSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLnZhbHVlICE9IG51bGwgJiYgIU9iamVjdC5oYXNPd24oc3RhdGUudmFsdWUgYXMgYW55LCAnJGlkJykpIHtcbiAgICAgICAgICBjcmVhdGVTdGF0dXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVTdGF0dXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgZGVlcDogaXNWdWVTdXBlcmlvck9yRXF1YWxUbzNkb3RGaXZlID8gMSA6IHRydWUsIGZsdXNoOiAncHJlJyB9XG4gICAgKTtcbiAgICBzY29wZVN0YXRlID0gc2NvcGUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0ICRkaXJ0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJGRpcnR5ICYmXG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZXZlcnkoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRkaXJ0eTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRhbnlEaXJ0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJGFueURpcnR5IHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGRpcnR5O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGludmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRpbnZhbGlkIHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGludmFsaWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHZhbGlkICYmXG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZXZlcnkoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiR2YWxpZDtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgJGVycm9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICRmaWVsZFN0YXR1cy52YWx1ZS4kZXJyb3IgfHxcbiAgICAgICAgICAkZWFjaFN0YXR1cy52YWx1ZS5zb21lKChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZXJyb3I7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHBlbmRpbmcgfHxcbiAgICAgICAgICAkZWFjaFN0YXR1cy52YWx1ZS5zb21lKChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kcGVuZGluZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZDwkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25FcnJvcnM+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAkZXJyb3JzOiBleHRyYWN0UnVsZXNFcnJvcnMoeyBmaWVsZDogJGZpZWxkU3RhdHVzLnZhbHVlLCBzaWxlbnQ6IGZhbHNlIH0pLFxuICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKCRlYWNoU3RhdHVzLnZhbHVlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkc2lsZW50RXJyb3JzID0gY29tcHV0ZWQ8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzPigoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJGVycm9yczogZXh0cmFjdFJ1bGVzRXJyb3JzKHsgZmllbGQ6ICRmaWVsZFN0YXR1cy52YWx1ZSwgc2lsZW50OiB0cnVlIH0pLFxuICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKCRlYWNoU3RhdHVzLnZhbHVlLCB0cnVlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkZGlydHksXG4gICAgICAgICRhbnlEaXJ0eSxcbiAgICAgICAgJGludmFsaWQsXG4gICAgICAgICR2YWxpZCxcbiAgICAgICAgJGVycm9yLFxuICAgICAgICAkcGVuZGluZyxcbiAgICAgICAgJGVycm9ycyxcbiAgICAgICAgJHNpbGVudEVycm9ycyxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlUmV0dXJuU3RhdGU7XG4gICAgfSkhO1xuXG4gICAgaWYgKGltbWVkaWF0ZVNjb3BlU3RhdGUuaXNQcmltaXRpdmVBcnJheS52YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtwYXRofSBpcyBhIEFycmF5IG9mIHByaW1pdGl2ZXMuIFRyYWNraW5nIGNhbiBiZSBsb3N0IHdoZW4gcmVhc3NpZ25pbmcgdGhlIEFycmF5LiBXZSBhZHZpc2UgdG8gdXNlIGFuIEFycmF5IG9mIG9iamVjdHMgaW5zdGVhZGBcbiAgICAgICk7XG4gICAgICAkdW53YXRjaFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCR1bndhdGNoU3RhdGUpIHtcbiAgICAgICR1bndhdGNoU3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKCRmaWVsZFN0YXR1cy52YWx1ZSkge1xuICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR1bndhdGNoKCk7XG4gICAgfVxuICAgIGlmICgkZWFjaFN0YXR1cy52YWx1ZSkge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoJyRkaXJ0eScgaW4gZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuJHVud2F0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gICAgaW1tZWRpYXRlU2NvcGUuc3RvcCgpO1xuICAgIGltbWVkaWF0ZVNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiAkdG91Y2goKTogdm9pZCB7XG4gICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR0b3VjaCgpO1xuICAgICRlYWNoU3RhdHVzLnZhbHVlLmZvckVhY2goKCRlYWNoKSA9PiB7XG4gICAgICAkZWFjaC4kdG91Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRyZXNldCgpOiB2b2lkIHtcbiAgICAkZmllbGRTdGF0dXMudmFsdWUuJHJlc2V0KCk7XG4gICAgJGVhY2hTdGF0dXMudmFsdWUuZm9yRWFjaCgoJGVhY2gpID0+IHtcbiAgICAgICRlYWNoLiRyZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gJHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHZhbGlkYXRlKCksXG4gICAgICAgIC4uLiRlYWNoU3RhdHVzLnZhbHVlLm1hcCgocnVsZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBydWxlLiR2YWxpZGF0ZSgpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHZhbHVlKSA9PiAhIXZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJGNsZWFyRXh0ZXJuYWxFcnJvcnMoKSB7XG4gICAgLy8gVE9ETyBjbGVhciBleHRlcm5hbCBlcnJvcnNcbiAgfVxuXG4gIHJldHVybiByZWFjdGl2ZSh7XG4gICAgJGZpZWxkOiAkZmllbGRTdGF0dXMsXG4gICAgLi4uc2NvcGVTdGF0ZSxcbiAgICAkZWFjaDogJGVhY2hTdGF0dXMsXG4gICAgJHZhbHVlOiBzdGF0ZSxcbiAgICAkdmFsaWRhdGUsXG4gICAgJHVud2F0Y2gsXG4gICAgJHdhdGNoLFxuICAgICR0b3VjaCxcbiAgICAkcmVzZXQsXG4gICAgJGNsZWFyRXh0ZXJuYWxFcnJvcnMsXG4gIH0pIHNhdGlzZmllcyAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBFZmZlY3RTY29wZSwgUmVmLCBXYXRjaFN0b3BIYW5kbGUgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgcmVmLCB0b1JlZiwgdHJpZ2dlclJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgRGVlcE1heWJlUmVmLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9ycyxcbiAgJEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsXG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBNYXliZUdldHRlcixcbiAgUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxuICBSZWdsZUV4dGVybmFsRXJyb3JUcmVlLFxuICBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5LFxuICBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgJEludGVybmFsUmVnbGVFcnJvcnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMsIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzUmVmT2JqZWN0LCBpc1Z1ZVN1cGVyaW9yT3JFcXVhbFRvM2RvdEZpdmUsIHVud3JhcEdldHRlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVnbGVTdG9yYWdlIH0gZnJvbSAnLi4vLi4vdXNlU3RvcmFnZSc7XG5pbXBvcnQge1xuICBpc0NvbGxlY3Rpb25SdWxlc0RlZixcbiAgaXNOZXN0ZWRSdWxlc0RlZixcbiAgaXNTdGF0ZUFycmF5LFxuICBpc1ZhbGlkYXRvclJ1bGVzRGVmLFxufSBmcm9tICcuLi9ndWFyZHMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZUNvbGxlY3Rpb25TdGF0dXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyc7XG5pbXBvcnQgeyBleHRyYWN0TmVzdGVkRXJyb3JzIH0gZnJvbSAnLi4vdXNlRXJyb3JzJztcblxuaW50ZXJmYWNlIENyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzIHtcbiAgcm9vdFJ1bGVzPzogUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPjtcbiAgc2NvcGVSdWxlczogUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPjtcbiAgc3RhdGU6IFJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbiAgY3VzdG9tTWVzc2FnZXM/OiBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZTtcbiAgcGF0aD86IHN0cmluZztcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHN0b3JhZ2U6IFJlZ2xlU3RvcmFnZTtcbiAgb3B0aW9uczogUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnM7XG4gIGV4dGVybmFsRXJyb3JzOiBSZWFkb25seTxSZWY8UmVnbGVFeHRlcm5hbEVycm9yVHJlZSB8IHVuZGVmaW5lZD4+O1xuICB2YWxpZGF0aW9uR3JvdXBzPzpcbiAgICB8ICgocnVsZXM6IHtcbiAgICAgICAgW3g6IHN0cmluZ106ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZTtcbiAgICAgIH0pID0+IFJlY29yZDxzdHJpbmcsIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnlbXT4pXG4gICAgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyh7XG4gIHNjb3BlUnVsZXMsXG4gIHN0YXRlLFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcGF0aCA9ICcnLFxuICByb290UnVsZXMsXG4gIHN0b3JhZ2UsXG4gIG9wdGlvbnMsXG4gIGV4dGVybmFsRXJyb3JzLFxuICB2YWxpZGF0aW9uR3JvdXBzLFxufTogQ3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMpOiAkSW50ZXJuYWxSZWdsZVN0YXR1cyB7XG4gIHR5cGUgU2NvcGVTdGF0ZSA9IHtcbiAgICAkZGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRhbnlEaXJ0eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJGludmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICR2YWxpZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJGVycm9yOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkcGVuZGluZzogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJGVycm9yczogQ29tcHV0ZWRSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVFcnJvcnM+PjtcbiAgICAkc2lsZW50RXJyb3JzOiBDb21wdXRlZFJlZjxSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZUVycm9ycz4+O1xuICB9O1xuICBsZXQgc2NvcGU6IEVmZmVjdFNjb3BlO1xuICBsZXQgc2NvcGVTdGF0ZSE6IFNjb3BlU3RhdGU7XG4gIGxldCAkdW53YXRjaEZpZWxkczogV2F0Y2hTdG9wSGFuZGxlO1xuICBsZXQgJHVud2F0Y2hTdGF0ZTogV2F0Y2hTdG9wSGFuZGxlO1xuICBsZXQgJHVud2F0Y2hHcm91cHM6IFdhdGNoU3RvcEhhbmRsZTtcblxuICBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cyh3YXRjaCA9IHRydWUsIGZvcmNlRnJvbUdldHRlciA9IGZhbHNlKSB7XG4gICAgJGZpZWxkcy52YWx1ZSA9IG51bGwhO1xuICAgIHRyaWdnZXJSZWYoJGZpZWxkcyk7XG5cbiAgICBjb25zdCBzY29wZWRSdWxlc1N0YXR1cyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHNjb3BlUnVsZXMudmFsdWUpXG4gICAgICAgIC5tYXAoKFtzdGF0ZVByb3BLZXksIHN0YXRlUHJvcFJ1bGVzXSkgPT4ge1xuICAgICAgICAgIGlmIChzdGF0ZVByb3BSdWxlcykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVSZWYgPSB0b1JlZihzdGF0ZS52YWx1ZSwgc3RhdGVQcm9wS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlUHJvcFJ1bGVzUmVmID0gdG9SZWYoKCkgPT4gc3RhdGVQcm9wUnVsZXMpO1xuICAgICAgICAgICAgY29uc3QgJGV4dGVybmFsRXJyb3JzID0gdG9SZWYoKCkgPT4gZXh0ZXJuYWxFcnJvcnMudmFsdWU/LltzdGF0ZVByb3BLZXldKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIHN0YXRlUHJvcEtleSxcbiAgICAgICAgICAgICAgY3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyh7XG4gICAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlUmVmLFxuICAgICAgICAgICAgICAgIHJ1bGVzRGVmOiBzdGF0ZVByb3BSdWxlc1JlZixcbiAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoID8gYCR7cGF0aH0uJHtzdGF0ZVByb3BLZXl9YCA6IHN0YXRlUHJvcEtleSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKHJ1bGUpOiBydWxlIGlzIFtzdHJpbmcsICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZV0gPT4gISFydWxlLmxlbmd0aCAmJiBydWxlWzFdICE9IG51bGxcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBleHRlcm5hbFJ1bGVzU3RhdHVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModW5yZWYoZXh0ZXJuYWxFcnJvcnMpID8/IHt9KVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIShrZXkgaW4gc2NvcGVSdWxlcy52YWx1ZSkpXG4gICAgICAgIC5tYXAoKFtrZXksIGVycm9yc10pID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZVByb3BSdWxlc1JlZiA9IHRvUmVmKCgpID0+ICh7fSkpO1xuICAgICAgICAgICAgY29uc3QgJGV4dGVybmFsRXJyb3JzID0gdG9SZWYoKCkgPT4gZXJyb3JzKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgY3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyh7XG4gICAgICAgICAgICAgICAgc3RhdGU6IHJlZih1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIHJ1bGVzRGVmOiBzdGF0ZVByb3BSdWxlc1JlZixcbiAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbGlkYXRpb25Hcm91cHM/LihzY29wZWRSdWxlc1N0YXR1cykgPz8ge30pLm1hcCgoW2tleSwgZW50cmllc10pID0+IHtcbiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIChbJyRpbnZhbGlkJywgJyRlcnJvcicsICckcGVuZGluZycsICckZGlydHknLCAnJHZhbGlkJ10gYXMgY29uc3QpLm1hcChcbiAgICAgICAgICAgICAgICAgIChwcm9wZXJ0eSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VCb29sZWFuR3JvdXBQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgIHRvUmVmKCgpID0+IGVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgKFsnJGVycm9ycycsICckc2lsZW50RXJyb3JzJ10gYXMgY29uc3QpLm1hcCgocHJvcGVydHkpID0+IFtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgbWVyZ2VBcnJheUdyb3VwUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgdG9SZWYoKCkgPT4gZW50cmllcyksXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgJGZpZWxkcy52YWx1ZSA9IHsgLi4uc2NvcGVkUnVsZXNTdGF0dXMsIC4uLmV4dGVybmFsUnVsZXNTdGF0dXMsIC4uLmdyb3VwcyB9O1xuICAgIGlmICh3YXRjaCkge1xuICAgICAgJHdhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgbGV0ICRmaWVsZHM6IFJlZjxSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+PiA9IHN0b3JhZ2UuZ2V0RmllbGRzRW50cnkocGF0aCk7XG4gIGNyZWF0ZVJlYWN0aXZlRmllbGRzU3RhdHVzKCk7XG5cbiAgZnVuY3Rpb24gJHJlc2V0KCk6IHZvaWQge1xuICAgIGNyZWF0ZVJlYWN0aXZlRmllbGRzU3RhdHVzKGZhbHNlKTtcbiAgICBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5mb3JFYWNoKChbXywgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgIHN0YXR1c09yRmllbGQuJHJlc2V0KCk7XG4gICAgfSk7XG4gICAgJHdhdGNoKCk7XG4gIH1cblxuICBmdW5jdGlvbiAkdG91Y2goKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZm9yRWFjaCgoW18sIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICBzdGF0dXNPckZpZWxkLiR0b3VjaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gJHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5tYXAoKFtfLCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiR2YWxpZGF0ZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiAkd2F0Y2goKSB7XG4gICAgaWYgKHJvb3RSdWxlcykge1xuICAgICAgJHVud2F0Y2hGaWVsZHMgPSB3YXRjaChcbiAgICAgICAgcm9vdFJ1bGVzLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgJHVud2F0Y2goKTtcbiAgICAgICAgICBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cygpO1xuICAgICAgICB9LFxuICAgICAgICB7IGRlZXA6IGlzVnVlU3VwZXJpb3JPckVxdWFsVG8zZG90Rml2ZSA/IDEgOiB0cnVlLCBmbHVzaDogJ3Bvc3QnIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICAgIHNjb3BlU3RhdGUgPSBzY29wZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgJGRpcnR5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkubGVuZ3RoICYmXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZXZlcnkoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZGlydHk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkYW55RGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRkaXJ0eTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGludmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRpbnZhbGlkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5ldmVyeSgoW2tleSwgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kdmFsaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLnNvbWUoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLnNvbWUoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJHBlbmRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TmVzdGVkRXJyb3JzKCRmaWVsZHMudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCAkc2lsZW50RXJyb3JzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdE5lc3RlZEVycm9ycygkZmllbGRzLnZhbHVlLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkZGlydHksXG4gICAgICAgICRhbnlEaXJ0eSxcbiAgICAgICAgJGludmFsaWQsXG4gICAgICAgICR2YWxpZCxcbiAgICAgICAgJGVycm9yLFxuICAgICAgICAkcGVuZGluZyxcbiAgICAgICAgJGVycm9ycyxcbiAgICAgICAgJHNpbGVudEVycm9ycyxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlU3RhdGU7XG4gICAgfSkhO1xuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCRmaWVsZHMudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBmaWVsZF0pID0+IHtcbiAgICAgICAgZmllbGQuJHVud2F0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgICR1bndhdGNoRmllbGRzPy4oKTtcbiAgICAkdW53YXRjaFN0YXRlPy4oKTtcbiAgICAkdW53YXRjaEdyb3Vwcz8uKCk7XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRjbGVhckV4dGVybmFsRXJyb3JzKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBmaWVsZF0pID0+IHtcbiAgICAgIGZpZWxkLiRjbGVhckV4dGVybmFsRXJyb3JzKCk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVhY3RpdmUoe1xuICAgIC4uLnNjb3BlU3RhdGUsXG4gICAgJGZpZWxkcyxcbiAgICAkdmFsdWU6IHN0YXRlLFxuICAgICRyZXNldCxcbiAgICAkdG91Y2gsXG4gICAgJHZhbGlkYXRlLFxuICAgICR1bndhdGNoLFxuICAgICR3YXRjaCxcbiAgICAkY2xlYXJFeHRlcm5hbEVycm9ycyxcbiAgfSkgc2F0aXNmaWVzICRJbnRlcm5hbFJlZ2xlU3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgQ3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyB7XG4gIHN0YXRlOiBSZWY8dW5rbm93bj47XG4gIHJ1bGVzRGVmOiBSZWY8JEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsIGFueT47XG4gIGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU7XG4gIHBhdGg6IHN0cmluZztcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHN0b3JhZ2U6IFJlZ2xlU3RvcmFnZTtcbiAgb3B0aW9uczogRGVlcE1heWJlUmVmPFJlcXVpcmVkRGVlcDxSZWdsZUJlaGF2aW91ck9wdGlvbnM+PjtcbiAgZXh0ZXJuYWxFcnJvcnM6IFJlYWRvbmx5PFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzIHwgdW5kZWZpbmVkPj47XG4gIG9uVW53YXRjaD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzKHtcbiAgc3RhdGUsXG4gIHJ1bGVzRGVmLFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcGF0aCxcbiAgc3RvcmFnZSxcbiAgb3B0aW9ucyxcbiAgZXh0ZXJuYWxFcnJvcnMsXG4gIGluZGV4LFxuICBvblVud2F0Y2gsXG59OiBDcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzKTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlIHwgbnVsbCB7XG4gIGlmIChpc0NvbGxlY3Rpb25SdWxlc0RlZihydWxlc0RlZikpIHtcbiAgICByZXR1cm4gY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzKHtcbiAgICAgIHN0YXRlOiBzdGF0ZSBhcyBSZWY8dW5rbm93biAmIHsgJGlkPzogc3RyaW5nIH1bXT4sXG4gICAgICBydWxlc0RlZixcbiAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgcGF0aCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBvcHRpb25zLFxuICAgICAgaW5kZXgsXG4gICAgICBleHRlcm5hbEVycm9ycyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc05lc3RlZFJ1bGVzRGVmKHN0YXRlLCBydWxlc0RlZikgJiYgaXNSZWZPYmplY3Qoc3RhdGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKHtcbiAgICAgIHNjb3BlUnVsZXM6IHJ1bGVzRGVmLFxuICAgICAgc3RhdGUsXG4gICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgIHBhdGgsXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGluZGV4LFxuICAgICAgZXh0ZXJuYWxFcnJvcnM6IGV4dGVybmFsRXJyb3JzIGFzIFJlYWRvbmx5PFJlZjxSZWdsZUV4dGVybmFsRXJyb3JUcmVlIHwgdW5kZWZpbmVkPj4sXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZGF0b3JSdWxlc0RlZihydWxlc0RlZikpIHtcbiAgICByZXR1cm4gY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyh7XG4gICAgICBzdGF0ZSxcbiAgICAgIHJ1bGVzRGVmLFxuICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICBwYXRoLFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbmRleCxcbiAgICAgIGV4dGVybmFsRXJyb3JzOiBleHRlcm5hbEVycm9ycyBhcyBSZWY8c3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgb25VbndhdGNoLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIHJlYWN0aXZlLCB1bnJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVzZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi91c2VTdG9yYWdlJztcbmltcG9ydCB7IHVzZUVycm9ycyB9IGZyb20gJy4uL3VzZUVycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlU3RhdGVQcm9wZXJ0aWVzKFxuICBzY29wZVJ1bGVzOiBDb21wdXRlZFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT4sXG4gIHN0YXRlOiBSZWY8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxuICBjdXN0b21SdWxlcz86ICgpID0+IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlXG4pIHtcbiAgY29uc3Qgc3RvcmFnZSA9IHVzZVN0b3JhZ2UoKTtcblxuICBjb25zdCBleHRlcm5hbEVycm9ycyA9IGNvbXB1dGVkKCgpID0+IHVucmVmKG9wdGlvbnMuZXh0ZXJuYWxFcnJvcnMpKTtcblxuICBjb25zdCByZWdsZSA9IHJlYWN0aXZlKFxuICAgIGNyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKHtcbiAgICAgIHJvb3RSdWxlczogc2NvcGVSdWxlcyxcbiAgICAgIHNjb3BlUnVsZXMsXG4gICAgICBzdGF0ZSxcbiAgICAgIGN1c3RvbU1lc3NhZ2VzOiBjdXN0b21SdWxlcz8uKCksXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dGVybmFsRXJyb3JzLFxuICAgICAgdmFsaWRhdGlvbkdyb3Vwczogb3B0aW9ucy52YWxpZGF0aW9uR3JvdXBzLFxuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgZXJyb3JzID0gdXNlRXJyb3JzKHJlZ2xlKTtcblxuICByZXR1cm4geyByZWdsZSwgZXJyb3JzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBpc1JlZiwgcmVmLCB0b1JhdyB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBBbGxSdWxlc0RlY2xhcmF0aW9ucyxcbiAgRGVlcFJlYWN0aXZlU3RhdGUsXG4gIERlZXBTYWZlRm9ybVN0YXRlLFxuICBMb2NhbFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGUsXG4gIFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGVFcnJvclRyZWUsXG4gIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWUsXG4gIFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBSZWdsZVN0YXR1cyxcbiAgUmVnbGVWYWxpZGF0aW9uR3JvdXBFbnRyeSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgRGVlcE1heWJlUmVmIH0gZnJvbSAnLi4vLi4vdHlwZXMvdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IHVzZVN0YXRlUHJvcGVydGllcyB9IGZyb20gJy4vdXNlU3RhdGVQcm9wZXJ0aWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZVJlZ2xlQ29tcG9zYWJsZTxUQ3VzdG9tUnVsZXMgZXh0ZW5kcyBQYXJ0aWFsPEFsbFJ1bGVzRGVjbGFyYXRpb25zPj4oXG4gIGN1c3RvbVJ1bGVzPzogKCkgPT4gVEN1c3RvbVJ1bGVzLFxuICBvcHRpb25zPzogUmVnbGVCZWhhdmlvdXJPcHRpb25zXG4pIHtcbiAgY29uc3QgZ2xvYmFsT3B0aW9uczogUmVxdWlyZWREZWVwPFJlZ2xlQmVoYXZpb3VyT3B0aW9ucz4gPSB7XG4gICAgYXV0b0RpcnR5OiBvcHRpb25zPy5hdXRvRGlydHkgPz8gdHJ1ZSxcbiAgICBsYXp5OiBvcHRpb25zPy5sYXp5ID8/IGZhbHNlLFxuICAgIHJld2FyZEVhcmx5OiBvcHRpb25zPy5yZXdhcmRFYXJseSA/PyBmYWxzZSxcbiAgfTtcblxuICBmdW5jdGlvbiB1c2VSZWdsZTxcbiAgICBUU3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRSdWxlcyBleHRlbmRzIFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPFRTdGF0ZSwgUGFydGlhbDxBbGxSdWxlc0RlY2xhcmF0aW9ucz4gJiBUQ3VzdG9tUnVsZXM+LFxuICAgIFRFeHRlcm5hbCBleHRlbmRzIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWU8VFN0YXRlPixcbiAgICBUVmFsaWRhdGlvbkdyb3VwcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnlbXT4sXG4gICAgVFZhbGlkID0ga2V5b2YgVFJ1bGVzIGV4dGVuZHMga2V5b2YgUmVnbGVQYXJ0aWFsVmFsaWRhdGlvblRyZWU8XG4gICAgICBUU3RhdGUsXG4gICAgICBQYXJ0aWFsPEFsbFJ1bGVzRGVjbGFyYXRpb25zPiAmIFRDdXN0b21SdWxlc1xuICAgID5cbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZSxcbiAgPihcbiAgICBzdGF0ZTogTWF5YmVSZWY8VFN0YXRlPiB8IERlZXBSZWFjdGl2ZVN0YXRlPFRTdGF0ZT4sXG4gICAgcnVsZXNGYWN0b3J5OiBUVmFsaWQgZXh0ZW5kcyB0cnVlID8gVFJ1bGVzIHwgKCgpID0+IFRSdWxlcykgfCBDb21wdXRlZFJlZjxUUnVsZXM+IDogbmV2ZXIsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGVlcE1heWJlUmVmPFJlZ2xlQmVoYXZpb3VyT3B0aW9ucz4+ICZcbiAgICAgIExvY2FsUmVnbGVCZWhhdmlvdXJPcHRpb25zPFRTdGF0ZSwgVFJ1bGVzLCBURXh0ZXJuYWwsIFRWYWxpZGF0aW9uR3JvdXBzPlxuICApOiBSZWdsZTxUU3RhdGUsIFRSdWxlcywgVEV4dGVybmFsLCBUVmFsaWRhdGlvbkdyb3Vwcz4ge1xuICAgIGNvbnN0IHNjb3BlUnVsZXMgPSBpc1JlZihydWxlc0ZhY3RvcnkpXG4gICAgICA/IHJ1bGVzRmFjdG9yeVxuICAgICAgOiBjb21wdXRlZChcbiAgICAgICAgICAodHlwZW9mIChydWxlc0ZhY3RvcnkgYXMgVFJ1bGVzIHwgKCgpID0+IFRSdWxlcykpID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHJ1bGVzRmFjdG9yeVxuICAgICAgICAgICAgOiAoKSA9PiBydWxlc0ZhY3RvcnkpIGFzIGFueVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyA9IHtcbiAgICAgIC4uLmdsb2JhbE9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkU3RhdGUgPSBpc1JlZihzdGF0ZSkgPyBzdGF0ZSA6IChyZWYoc3RhdGUpIGFzIFJlZjxUU3RhdGU+KTtcblxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGNsb25lRGVlcCh0b1Jhdyhwcm9jZXNzZWRTdGF0ZS52YWx1ZSkpO1xuXG4gICAgY29uc3QgeyByZWdsZSwgZXJyb3JzIH0gPSB1c2VTdGF0ZVByb3BlcnRpZXMoXG4gICAgICBzY29wZVJ1bGVzIGFzIENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPixcbiAgICAgIHByb2Nlc3NlZFN0YXRlLFxuICAgICAgcmVzb2x2ZWRPcHRpb25zLFxuICAgICAgY3VzdG9tUnVsZXNcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7XG4gICAgICByZWdsZS4kdW53YXRjaCgpO1xuICAgICAgcmVzZXRWYWx1ZXNSZWN1cnNpdmVseShzdGF0ZSwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIHJlZ2xlLiRyZXNldCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoXG4gICAgICBjdXJyZW50OiBSZWY8UmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4+IHwgUmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4sXG4gICAgICBpbml0aWFsOiBSZWNvcmQ8c3RyaW5nLCBNYXliZVJlZjxhbnk+PlxuICAgICkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoaW5pdGlhbCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50UmVmID0gaXNSZWY8UmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4+KGN1cnJlbnQpID8gY3VycmVudC52YWx1ZSA6IGN1cnJlbnQ7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBpc1JlZihjdXJyZW50UmVmW2tleV0pID8gY3VycmVudFJlZltrZXldLnZhbHVlIDogY3VycmVudFJlZltrZXldO1xuICAgICAgICBsZXQgaW5pdGlhbFJlZiA9IGlzUmVmKGluaXRpYWxba2V5XSkgPyAoaW5pdGlhbFtrZXldIGFzIGFueSkuX3ZhbHVlIDogaW5pdGlhbFtrZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsUmVmKSAmJiBBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICBjdXJyZW50UmVmW2tleV0gPSBbXTtcbiAgICAgICAgICBpbml0aWFsUmVmLmZvckVhY2goKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWZba2V5XVtpbmRleF0gPSB7fTtcbiAgICAgICAgICAgIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoY3VycmVudFJlZltrZXldW2luZGV4XSwgaW5pdGlhbFJlZltpbmRleF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGluaXRpYWxSZWYpKSB7XG4gICAgICAgICAgcmVzZXRWYWx1ZXNSZWN1cnNpdmVseShjdXJyZW50VmFsdWUsIGluaXRpYWxSZWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc1JlZihjdXJyZW50UmVmW2tleV0pKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVmW2tleV0udmFsdWUgPSBpbml0aWFsUmVmO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50UmVmW2tleV0gPSBpbml0aWFsUmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICByZXR1cm4gIShyZWdsZS4kaW52YWxpZCB8fCByZWdsZS4kcGVuZGluZyk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVN0YXRlKCk6IFByb21pc2U8ZmFsc2UgfCBEZWVwU2FmZUZvcm1TdGF0ZTxUU3RhdGUsIFRSdWxlcz4+IHtcbiAgICAgIHJlZ2xlLiR0b3VjaCgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVnbGUuJHZhbGlkYXRlKCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRTdGF0ZS52YWx1ZSBhcyBhbnk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2xlOiByZWdsZSBhcyB1bmtub3duIGFzIFJlZ2xlU3RhdHVzPFRTdGF0ZSwgVFJ1bGVzLCBUVmFsaWRhdGlvbkdyb3Vwcz4sXG4gICAgICBlcnJvcnM6IGVycm9ycyBhcyBSZWdsZUVycm9yVHJlZTxUUnVsZXM+LFxuICAgICAgcmVzZXRBbGwsXG4gICAgICB2YWxpZGF0ZVN0YXRlLFxuICAgICAgcmVhZHksXG4gICAgICBzdGF0ZTogcHJvY2Vzc2VkU3RhdGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1c2VSZWdsZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVJlZ2xlID0gY3JlYXRlVXNlUmVnbGVDb21wb3NhYmxlKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEFsbFJ1bGVzRGVjbGFyYXRpb25zLCBSZWdsZUJlaGF2aW91ck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVVc2VSZWdsZUNvbXBvc2FibGUgfSBmcm9tICcuL3VzZVJlZ2xlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZ2xlQ29uZmlnPFRDdXN0b21SdWxlcyBleHRlbmRzIFBhcnRpYWw8QWxsUnVsZXNEZWNsYXJhdGlvbnM+Pih7XG4gIHJ1bGVzLFxuICBtb2RpZmllcnMsXG59OiB7XG4gIHJ1bGVzPzogKCkgPT4gVEN1c3RvbVJ1bGVzO1xuICBtb2RpZmllcnM/OiBSZWdsZUJlaGF2aW91ck9wdGlvbnM7XG59KSB7XG4gIGNvbnN0IHVzZVJlZ2xlID0gY3JlYXRlVXNlUmVnbGVDb21wb3NhYmxlPFRDdXN0b21SdWxlcz4ocnVsZXMsIG1vZGlmaWVycyk7XG5cbiAgcmV0dXJuIHVzZVJlZ2xlO1xufVxuIl19