@worktif/runtime 0.3.0-edge.14 → 0.3.0-edge.16
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/out/dist/bin/purenow.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var Xt=Object.create;var be=Object.defineProperty;var er=Object.getOwnPropertyDescriptor;var tr=Object.getOwnPropertyNames;var rr=Object.getPrototypeOf,nr=Object.prototype.hasOwnProperty;var or=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ir=(n,e)=>{for(var t in e)be(n,t,{get:e[t],enumerable:!0})},ct=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of tr(e))!nr.call(n,o)&&o!==t&&be(n,o,{get:()=>e[o],enumerable:!(r=er(e,o))||r.enumerable});return n};var N=(n,e,t)=>(t=n!=null?Xt(rr(n)):{},ct(e||!n||!n.__esModule?be(t,"default",{value:n,enumerable:!0}):t,n)),sr=n=>ct(be({},"__esModule",{value:!0}),n);var Re=or(()=>{var Rt;(function(n){(function(e){var t=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:h(),r=o(n);typeof t.Reflect<"u"&&(r=o(t.Reflect,r)),e(r,t),typeof t.Reflect>"u"&&(t.Reflect=n);function o(w,R){return function(b,B){Object.defineProperty(w,b,{configurable:!0,writable:!0,value:B}),R&&R(b,B)}}function a(){try{return Function("return this;")()}catch{}}function d(){try{return(0,eval)("(function() { return this; })()")}catch{}}function h(){return a()||d()}})(function(e,t){var r=Object.prototype.hasOwnProperty,o=typeof Symbol=="function",a=o&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",d=o&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",h=typeof Object.create=="function",w={__proto__:[]}instanceof Array,R=!h&&!w,b={create:h?function(){return Ae(Object.create(null))}:w?function(){return Ae({__proto__:null})}:function(){return Ae({})},has:R?function(i,s){return r.call(i,s)}:function(i,s){return s in i},get:R?function(i,s){return r.call(i,s)?i[s]:void 0}:function(i,s){return i[s]}},B=Object.getPrototypeOf(Function),M=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Jt(),j=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:Ht(),F=typeof WeakMap=="function"?WeakMap:qt(),x=o?Symbol.for("@reflect-metadata:registry"):void 0,te=zt(),X=Kt(te);function ye(i,s,l,u){if(v(l)){if(!tt(i))throw new TypeError;if(!rt(s))throw new TypeError;return $t(i,s)}else{if(!tt(i))throw new TypeError;if(!P(s))throw new TypeError;if(!P(u)&&!v(u)&&!ne(u))throw new TypeError;return ne(u)&&(u=void 0),l=K(l),Nt(i,s,l,u)}}e("decorate",ye);function re(i,s){function l(u,y){if(!P(u))throw new TypeError;if(!v(y)&&!Ut(y))throw new TypeError;qe(i,s,u,y)}return l}e("metadata",re);function ve(i,s,l,u){if(!P(l))throw new TypeError;return v(u)||(u=K(u)),qe(i,s,l,u)}e("defineMetadata",ve);function le(i,s,l){if(!P(s))throw new TypeError;return v(l)||(l=K(l)),Ye(i,s,l)}e("hasMetadata",le);function q(i,s,l){if(!P(s))throw new TypeError;return v(l)||(l=K(l)),_e(i,s,l)}e("hasOwnMetadata",q);function Ke(i,s,l){if(!P(s))throw new TypeError;return v(l)||(l=K(l)),Je(i,s,l)}e("getMetadata",Ke);function At(i,s,l){if(!P(s))throw new TypeError;return v(l)||(l=K(l)),He(i,s,l)}e("getOwnMetadata",At);function It(i,s){if(!P(i))throw new TypeError;return v(s)||(s=K(s)),Ze(i,s)}e("getMetadataKeys",It);function Bt(i,s){if(!P(i))throw new TypeError;return v(s)||(s=K(s)),Qe(i,s)}e("getOwnMetadataKeys",Bt);function jt(i,s,l){if(!P(s))throw new TypeError;if(v(l)||(l=K(l)),!P(s))throw new TypeError;v(l)||(l=K(l));var u=ce(s,l,!1);return v(u)?!1:u.OrdinaryDeleteMetadata(i,s,l)}e("deleteMetadata",jt);function $t(i,s){for(var l=i.length-1;l>=0;--l){var u=i[l],y=u(s);if(!v(y)&&!ne(y)){if(!rt(y))throw new TypeError;s=y}}return s}function Nt(i,s,l,u){for(var y=i.length-1;y>=0;--y){var A=i[y],$=A(s,l,u);if(!v($)&&!ne($)){if(!P($))throw new TypeError;u=$}}return u}function Ye(i,s,l){var u=_e(i,s,l);if(u)return!0;var y=Pe(s);return ne(y)?!1:Ye(i,y,l)}function _e(i,s,l){var u=ce(s,l,!1);return v(u)?!1:et(u.OrdinaryHasOwnMetadata(i,s,l))}function Je(i,s,l){var u=_e(i,s,l);if(u)return He(i,s,l);var y=Pe(s);if(!ne(y))return Je(i,y,l)}function He(i,s,l){var u=ce(s,l,!1);if(!v(u))return u.OrdinaryGetOwnMetadata(i,s,l)}function qe(i,s,l,u){var y=ce(l,u,!0);y.OrdinaryDefineOwnMetadata(i,s,l,u)}function Ze(i,s){var l=Qe(i,s),u=Pe(i);if(u===null)return l;var y=Ze(u,s);if(y.length<=0)return l;if(l.length<=0)return y;for(var A=new j,$=[],S=0,f=l;S<f.length;S++){var p=f[S],m=A.has(p);m||(A.add(p),$.push(p))}for(var g=0,k=y;g<k.length;g++){var p=k[g],m=A.has(p);m||(A.add(p),$.push(p))}return $}function Qe(i,s){var l=ce(i,s,!1);return l?l.OrdinaryOwnMetadataKeys(i,s):[]}function Xe(i){if(i===null)return 1;switch(typeof i){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return i===null?1:6;default:return 6}}function v(i){return i===void 0}function ne(i){return i===null}function Ft(i){return typeof i=="symbol"}function P(i){return typeof i=="object"?i!==null:typeof i=="function"}function Wt(i,s){switch(Xe(i)){case 0:return i;case 1:return i;case 2:return i;case 3:return i;case 4:return i;case 5:return i}var l=s===3?"string":s===5?"number":"default",u=nt(i,a);if(u!==void 0){var y=u.call(i,l);if(P(y))throw new TypeError;return y}return Lt(i,l==="default"?"number":l)}function Lt(i,s){if(s==="string"){var l=i.toString;if(oe(l)){var u=l.call(i);if(!P(u))return u}var y=i.valueOf;if(oe(y)){var u=y.call(i);if(!P(u))return u}}else{var y=i.valueOf;if(oe(y)){var u=y.call(i);if(!P(u))return u}var A=i.toString;if(oe(A)){var u=A.call(i);if(!P(u))return u}}throw new TypeError}function et(i){return!!i}function Gt(i){return""+i}function K(i){var s=Wt(i,3);return Ft(s)?s:Gt(s)}function tt(i){return Array.isArray?Array.isArray(i):i instanceof Object?i instanceof Array:Object.prototype.toString.call(i)==="[object Array]"}function oe(i){return typeof i=="function"}function rt(i){return typeof i=="function"}function Ut(i){switch(Xe(i)){case 3:return!0;case 4:return!0;default:return!1}}function Me(i,s){return i===s||i!==i&&s!==s}function nt(i,s){var l=i[s];if(l!=null){if(!oe(l))throw new TypeError;return l}}function ot(i){var s=nt(i,d);if(!oe(s))throw new TypeError;var l=s.call(i);if(!P(l))throw new TypeError;return l}function it(i){return i.value}function st(i){var s=i.next();return s.done?!1:s}function at(i){var s=i.return;s&&s.call(i)}function Pe(i){var s=Object.getPrototypeOf(i);if(typeof i!="function"||i===B||s!==B)return s;var l=i.prototype,u=l&&Object.getPrototypeOf(l);if(u==null||u===Object.prototype)return s;var y=u.constructor;return typeof y!="function"||y===i?s:y}function Vt(){var i;!v(x)&&typeof t.Reflect<"u"&&!(x in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(i=Yt(t.Reflect));var s,l,u,y=new F,A={registerProvider:$,getProvider:f,setProvider:m};return A;function $(g){if(!Object.isExtensible(A))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case i===g:break;case v(s):s=g;break;case s===g:break;case v(l):l=g;break;case l===g:break;default:u===void 0&&(u=new j),u.add(g);break}}function S(g,k){if(!v(s)){if(s.isProviderFor(g,k))return s;if(!v(l)){if(l.isProviderFor(g,k))return s;if(!v(u))for(var C=ot(u);;){var I=st(C);if(!I)return;var U=it(I);if(U.isProviderFor(g,k))return at(C),U}}}if(!v(i)&&i.isProviderFor(g,k))return i}function f(g,k){var C=y.get(g),I;return v(C)||(I=C.get(k)),v(I)&&(I=S(g,k),v(I)||(v(C)&&(C=new M,y.set(g,C)),C.set(k,I))),I}function p(g){if(v(g))throw new TypeError;return s===g||l===g||!v(u)&&u.has(g)}function m(g,k,C){if(!p(C))throw new Error("Metadata provider not registered.");var I=f(g,k);if(I!==C){if(!v(I))return!1;var U=y.get(g);v(U)&&(U=new M,y.set(g,U)),U.set(k,C)}return!0}}function zt(){var i;return!v(x)&&P(t.Reflect)&&Object.isExtensible(t.Reflect)&&(i=t.Reflect[x]),v(i)&&(i=Vt()),!v(x)&&P(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,x,{enumerable:!1,configurable:!1,writable:!1,value:i}),i}function Kt(i){var s=new F,l={isProviderFor:function(p,m){var g=s.get(p);return v(g)?!1:g.has(m)},OrdinaryDefineOwnMetadata:$,OrdinaryHasOwnMetadata:y,OrdinaryGetOwnMetadata:A,OrdinaryOwnMetadataKeys:S,OrdinaryDeleteMetadata:f};return te.registerProvider(l),l;function u(p,m,g){var k=s.get(p),C=!1;if(v(k)){if(!g)return;k=new M,s.set(p,k),C=!0}var I=k.get(m);if(v(I)){if(!g)return;if(I=new M,k.set(m,I),!i.setProvider(p,m,l))throw k.delete(m),C&&s.delete(p),new Error("Wrong provider for target.")}return I}function y(p,m,g){var k=u(m,g,!1);return v(k)?!1:et(k.has(p))}function A(p,m,g){var k=u(m,g,!1);if(!v(k))return k.get(p)}function $(p,m,g,k){var C=u(g,k,!0);C.set(p,m)}function S(p,m){var g=[],k=u(p,m,!1);if(v(k))return g;for(var C=k.keys(),I=ot(C),U=0;;){var lt=st(I);if(!lt)return g.length=U,g;var Zt=it(lt);try{g[U]=Zt}catch(Qt){try{at(I)}finally{throw Qt}}U++}}function f(p,m,g){var k=u(m,g,!1);if(v(k)||!k.delete(p))return!1;if(k.size===0){var C=s.get(m);v(C)||(C.delete(g),C.size===0&&s.delete(C))}return!0}}function Yt(i){var s=i.defineMetadata,l=i.hasOwnMetadata,u=i.getOwnMetadata,y=i.getOwnMetadataKeys,A=i.deleteMetadata,$=new F,S={isProviderFor:function(f,p){var m=$.get(f);return!v(m)&&m.has(p)?!0:y(f,p).length?(v(m)&&(m=new j,$.set(f,m)),m.add(p),!0):!1},OrdinaryDefineOwnMetadata:s,OrdinaryHasOwnMetadata:l,OrdinaryGetOwnMetadata:u,OrdinaryOwnMetadataKeys:y,OrdinaryDeleteMetadata:A};return S}function ce(i,s,l){var u=te.getProvider(i,s);if(!v(u))return u;if(l){if(te.setProvider(i,s,X))return X;throw new Error("Illegal state.")}}function Jt(){var i={},s=[],l=(function(){function S(f,p,m){this._index=0,this._keys=f,this._values=p,this._selector=m}return S.prototype["@@iterator"]=function(){return this},S.prototype[d]=function(){return this},S.prototype.next=function(){var f=this._index;if(f>=0&&f<this._keys.length){var p=this._selector(this._keys[f],this._values[f]);return f+1>=this._keys.length?(this._index=-1,this._keys=s,this._values=s):this._index++,{value:p,done:!1}}return{value:void 0,done:!0}},S.prototype.throw=function(f){throw this._index>=0&&(this._index=-1,this._keys=s,this._values=s),f},S.prototype.return=function(f){return this._index>=0&&(this._index=-1,this._keys=s,this._values=s),{value:f,done:!0}},S})(),u=(function(){function S(){this._keys=[],this._values=[],this._cacheKey=i,this._cacheIndex=-2}return Object.defineProperty(S.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),S.prototype.has=function(f){return this._find(f,!1)>=0},S.prototype.get=function(f){var p=this._find(f,!1);return p>=0?this._values[p]:void 0},S.prototype.set=function(f,p){var m=this._find(f,!0);return this._values[m]=p,this},S.prototype.delete=function(f){var p=this._find(f,!1);if(p>=0){for(var m=this._keys.length,g=p+1;g<m;g++)this._keys[g-1]=this._keys[g],this._values[g-1]=this._values[g];return this._keys.length--,this._values.length--,Me(f,this._cacheKey)&&(this._cacheKey=i,this._cacheIndex=-2),!0}return!1},S.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=i,this._cacheIndex=-2},S.prototype.keys=function(){return new l(this._keys,this._values,y)},S.prototype.values=function(){return new l(this._keys,this._values,A)},S.prototype.entries=function(){return new l(this._keys,this._values,$)},S.prototype["@@iterator"]=function(){return this.entries()},S.prototype[d]=function(){return this.entries()},S.prototype._find=function(f,p){if(!Me(this._cacheKey,f)){this._cacheIndex=-1;for(var m=0;m<this._keys.length;m++)if(Me(this._keys[m],f)){this._cacheIndex=m;break}}return this._cacheIndex<0&&p&&(this._cacheIndex=this._keys.length,this._keys.push(f),this._values.push(void 0)),this._cacheIndex},S})();return u;function y(S,f){return S}function A(S,f){return f}function $(S,f){return[S,f]}}function Ht(){var i=(function(){function s(){this._map=new M}return Object.defineProperty(s.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),s.prototype.has=function(l){return this._map.has(l)},s.prototype.add=function(l){return this._map.set(l,l),this},s.prototype.delete=function(l){return this._map.delete(l)},s.prototype.clear=function(){this._map.clear()},s.prototype.keys=function(){return this._map.keys()},s.prototype.values=function(){return this._map.keys()},s.prototype.entries=function(){return this._map.entries()},s.prototype["@@iterator"]=function(){return this.keys()},s.prototype[d]=function(){return this.keys()},s})();return i}function qt(){var i=16,s=b.create(),l=u();return(function(){function f(){this._key=u()}return f.prototype.has=function(p){var m=y(p,!1);return m!==void 0?b.has(m,this._key):!1},f.prototype.get=function(p){var m=y(p,!1);return m!==void 0?b.get(m,this._key):void 0},f.prototype.set=function(p,m){var g=y(p,!0);return g[this._key]=m,this},f.prototype.delete=function(p){var m=y(p,!1);return m!==void 0?delete m[this._key]:!1},f.prototype.clear=function(){this._key=u()},f})();function u(){var f;do f="@@WeakMap@@"+S();while(b.has(s,f));return s[f]=!0,f}function y(f,p){if(!r.call(f,l)){if(!p)return;Object.defineProperty(f,l,{value:b.create()})}return f[l]}function A(f,p){for(var m=0;m<p;++m)f[m]=Math.random()*255|0;return f}function $(f){if(typeof Uint8Array=="function"){var p=new Uint8Array(f);return typeof crypto<"u"?crypto.getRandomValues(p):typeof msCrypto<"u"?msCrypto.getRandomValues(p):A(p,f),p}return A(new Array(f),f)}function S(){var f=$(i);f[6]=f[6]&79|64,f[8]=f[8]&191|128;for(var p="",m=0;m<i;++m){var g=f[m];(m===4||m===6||m===8)&&(p+="-"),g<16&&(p+="0"),p+=g.toString(16).toLowerCase()}return p}}function Ae(i){return i.__=void 0,delete i.__,i}})})(Rt||(Rt={}))});var Mr={};ir(Mr,{main:()=>Pt});module.exports=sr(Mr);var Ar=10,ut=(n=0)=>e=>`\x1B[${e+n}m`,dt=(n=0)=>e=>`\x1B[${38+n};5;${e}m`,ft=(n=0)=>(e,t,r)=>`\x1B[${38+n};2;${e};${t};${r}m`,O={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},pt=Object.keys(O.modifier),Ie=Object.keys(O.color),Be=Object.keys(O.bgColor),mt=[...Ie,...Be];function ar(){let n=new Map;for(let[e,t]of Object.entries(O)){for(let[r,o]of Object.entries(t))O[r]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},t[r]=O[r],n.set(o[0],o[1]);Object.defineProperty(O,e,{value:t,enumerable:!1})}return Object.defineProperty(O,"codes",{value:n,enumerable:!1}),O.color.close="\x1B[39m",O.bgColor.close="\x1B[49m",O.color.ansi=ut(),O.color.ansi256=dt(),O.color.ansi16m=ft(),O.bgColor.ansi=ut(10),O.bgColor.ansi256=dt(10),O.bgColor.ansi16m=ft(10),Object.defineProperties(O,{rgbToAnsi256:{value(e,t,r){return e===t&&t===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(r/255*5)},enumerable:!1},hexToRgb:{value(e){let t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!t)return[0,0,0];let[r]=t;r.length===3&&(r=[...r].map(a=>a+a).join(""));let o=Number.parseInt(r,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:e=>O.rgbToAnsi256(...O.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let t,r,o;if(e>=232)t=((e-232)*10+8)/255,r=t,o=t;else{e-=16;let h=e%36;t=Math.floor(e/36)/5,r=Math.floor(h/6)/5,o=h%6/5}let a=Math.max(t,r,o)*2;if(a===0)return 30;let d=30+(Math.round(o)<<2|Math.round(r)<<1|Math.round(t));return a===2&&(d+=60),d},enumerable:!1},rgbToAnsi:{value:(e,t,r)=>O.ansi256ToAnsi(O.rgbToAnsi256(e,t,r)),enumerable:!1},hexToAnsi:{value:e=>O.ansi256ToAnsi(O.hexToAnsi256(e)),enumerable:!1}}),O}var lr=ar(),V=lr;var Se=N(require("node:process"),1),gt=N(require("node:os"),1),je=N(require("node:tty"),1);function G(n,e=globalThis.Deno?globalThis.Deno.args:Se.default.argv){let t=n.startsWith("-")?"":n.length===1?"-":"--",r=e.indexOf(t+n),o=e.indexOf("--");return r!==-1&&(o===-1||r<o)}var{env:D}=Se.default,we;G("no-color")||G("no-colors")||G("color=false")||G("color=never")?we=0:(G("color")||G("colors")||G("color=true")||G("color=always"))&&(we=1);function cr(){if("FORCE_COLOR"in D)return D.FORCE_COLOR==="true"?1:D.FORCE_COLOR==="false"?0:D.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(D.FORCE_COLOR,10),3)}function ur(n){return n===0?!1:{level:n,hasBasic:!0,has256:n>=2,has16m:n>=3}}function dr(n,{streamIsTTY:e,sniffFlags:t=!0}={}){let r=cr();r!==void 0&&(we=r);let o=t?we:r;if(o===0)return 0;if(t){if(G("color=16m")||G("color=full")||G("color=truecolor"))return 3;if(G("color=256"))return 2}if("TF_BUILD"in D&&"AGENT_NAME"in D)return 1;if(n&&!e&&o===void 0)return 0;let a=o||0;if(D.TERM==="dumb")return a;if(Se.default.platform==="win32"){let d=gt.default.release().split(".");return Number(d[0])>=10&&Number(d[2])>=10586?Number(d[2])>=14931?3:2:1}if("CI"in D)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(d=>d in D)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(d=>d in D)||D.CI_NAME==="codeship"?1:a;if("TEAMCITY_VERSION"in D)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(D.TEAMCITY_VERSION)?1:0;if(D.COLORTERM==="truecolor"||D.TERM==="xterm-kitty"||D.TERM==="xterm-ghostty"||D.TERM==="wezterm")return 3;if("TERM_PROGRAM"in D){let d=Number.parseInt((D.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(D.TERM_PROGRAM){case"iTerm.app":return d>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(D.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(D.TERM)||"COLORTERM"in D?1:a}function ht(n,e={}){let t=dr(n,{streamIsTTY:n&&n.isTTY,...e});return ur(t)}var fr={stdout:ht({isTTY:je.default.isatty(1)}),stderr:ht({isTTY:je.default.isatty(2)})},yt=fr;function vt(n,e,t){let r=n.indexOf(e);if(r===-1)return n;let o=e.length,a=0,d="";do d+=n.slice(a,r)+e+t,a=r+o,r=n.indexOf(e,a);while(r!==-1);return d+=n.slice(a),d}function bt(n,e,t,r){let o=0,a="";do{let d=n[r-1]==="\r";a+=n.slice(o,d?r-1:r)+e+(d?`\r
|
|
2
|
+
"use strict";var _n=Object.create;var xe=Object.defineProperty;var Pn=Object.getOwnPropertyDescriptor;var jn=Object.getOwnPropertyNames;var In=Object.getPrototypeOf,An=Object.prototype.hasOwnProperty;var V=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Bn=(r,e)=>{for(var n in e)xe(r,n,{get:e[n],enumerable:!0})},kt=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of jn(e))!An.call(r,o)&&o!==n&&xe(r,o,{get:()=>e[o],enumerable:!(t=Pn(e,o))||t.enumerable});return r};var B=(r,e,n)=>(n=r!=null?_n(In(r)):{},kt(e||!r||!r.__esModule?xe(n,"default",{value:r,enumerable:!0}):n,r)),$n=r=>kt(xe({},"__esModule",{value:!0}),r);var Ct=V((Cr,St)=>{"use strict";St.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Ue=V((Er,Rt)=>{var ge=Ct(),Et={};for(let r of Object.keys(ge))Et[ge[r]]=r;var y={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};Rt.exports=y;for(let r of Object.keys(y)){if(!("channels"in y[r]))throw new Error("missing channels property: "+r);if(!("labels"in y[r]))throw new Error("missing channel labels property: "+r);if(y[r].labels.length!==y[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:n}=y[r];delete y[r].channels,delete y[r].labels,Object.defineProperty(y[r],"channels",{value:e}),Object.defineProperty(y[r],"labels",{value:n})}y.rgb.hsl=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.min(e,n,t),i=Math.max(e,n,t),s=i-o,c,f;i===o?c=0:e===i?c=(n-t)/s:n===i?c=2+(t-e)/s:t===i&&(c=4+(e-n)/s),c=Math.min(c*60,360),c<0&&(c+=360);let b=(o+i)/2;return i===o?f=0:b<=.5?f=s/(i+o):f=s/(2-i-o),[c,f*100,b*100]},y.rgb.hsv=function(r){let e,n,t,o,i,s=r[0]/255,c=r[1]/255,f=r[2]/255,b=Math.max(s,c,f),w=b-Math.min(s,c,f),R=function(O){return(b-O)/6/w+1/2};return w===0?(o=0,i=0):(i=w/b,e=R(s),n=R(c),t=R(f),s===b?o=t-n:c===b?o=1/3+e-t:f===b&&(o=2/3+n-e),o<0?o+=1:o>1&&(o-=1)),[o*360,i*100,b*100]},y.rgb.hwb=function(r){let e=r[0],n=r[1],t=r[2],o=y.rgb.hsl(r)[0],i=1/255*Math.min(e,Math.min(n,t));return t=1-1/255*Math.max(e,Math.max(n,t)),[o,i*100,t*100]},y.rgb.cmyk=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.min(1-e,1-n,1-t),i=(1-e-o)/(1-o)||0,s=(1-n-o)/(1-o)||0,c=(1-t-o)/(1-o)||0;return[i*100,s*100,c*100,o*100]};function Fn(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}y.rgb.keyword=function(r){let e=Et[r];if(e)return e;let n=1/0,t;for(let o of Object.keys(ge)){let i=ge[o],s=Fn(r,i);s<n&&(n=s,t=o)}return t},y.keyword.rgb=function(r){return ge[r]},y.rgb.xyz=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92;let o=e*.4124+n*.3576+t*.1805,i=e*.2126+n*.7152+t*.0722,s=e*.0193+n*.1192+t*.9505;return[o*100,i*100,s*100]},y.rgb.lab=function(r){let e=y.rgb.xyz(r),n=e[0],t=e[1],o=e[2];n/=95.047,t/=100,o/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let i=116*t-16,s=500*(n-t),c=200*(t-o);return[i,s,c]},y.hsl.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100,o,i,s;if(n===0)return s=t*255,[s,s,s];t<.5?o=t*(1+n):o=t+n-t*n;let c=2*t-o,f=[0,0,0];for(let b=0;b<3;b++)i=e+1/3*-(b-1),i<0&&i++,i>1&&i--,6*i<1?s=c+(o-c)*6*i:2*i<1?s=o:3*i<2?s=c+(o-c)*(2/3-i)*6:s=c,f[b]=s*255;return f},y.hsl.hsv=function(r){let e=r[0],n=r[1]/100,t=r[2]/100,o=n,i=Math.max(t,.01);t*=2,n*=t<=1?t:2-t,o*=i<=1?i:2-i;let s=(t+n)/2,c=t===0?2*o/(i+o):2*n/(t+n);return[e,c*100,s*100]},y.hsv.rgb=function(r){let e=r[0]/60,n=r[1]/100,t=r[2]/100,o=Math.floor(e)%6,i=e-Math.floor(e),s=255*t*(1-n),c=255*t*(1-n*i),f=255*t*(1-n*(1-i));switch(t*=255,o){case 0:return[t,f,s];case 1:return[c,t,s];case 2:return[s,t,f];case 3:return[s,c,t];case 4:return[f,s,t];case 5:return[t,s,c]}},y.hsv.hsl=function(r){let e=r[0],n=r[1]/100,t=r[2]/100,o=Math.max(t,.01),i,s;s=(2-n)*t;let c=(2-n)*o;return i=n*o,i/=c<=1?c:2-c,i=i||0,s/=2,[e,i*100,s*100]},y.hwb.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100,o=n+t,i;o>1&&(n/=o,t/=o);let s=Math.floor(6*e),c=1-t;i=6*e-s,(s&1)!==0&&(i=1-i);let f=n+i*(c-n),b,w,R;switch(s){default:case 6:case 0:b=c,w=f,R=n;break;case 1:b=f,w=c,R=n;break;case 2:b=n,w=c,R=f;break;case 3:b=n,w=f,R=c;break;case 4:b=f,w=n,R=c;break;case 5:b=c,w=n,R=f;break}return[b*255,w*255,R*255]},y.cmyk.rgb=function(r){let e=r[0]/100,n=r[1]/100,t=r[2]/100,o=r[3]/100,i=1-Math.min(1,e*(1-o)+o),s=1-Math.min(1,n*(1-o)+o),c=1-Math.min(1,t*(1-o)+o);return[i*255,s*255,c*255]},y.xyz.rgb=function(r){let e=r[0]/100,n=r[1]/100,t=r[2]/100,o,i,s;return o=e*3.2406+n*-1.5372+t*-.4986,i=e*-.9689+n*1.8758+t*.0415,s=e*.0557+n*-.204+t*1.057,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=Math.min(Math.max(0,o),1),i=Math.min(Math.max(0,i),1),s=Math.min(Math.max(0,s),1),[o*255,i*255,s*255]},y.xyz.lab=function(r){let e=r[0],n=r[1],t=r[2];e/=95.047,n/=100,t/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,t=t>.008856?t**(1/3):7.787*t+16/116;let o=116*n-16,i=500*(e-n),s=200*(n-t);return[o,i,s]},y.lab.xyz=function(r){let e=r[0],n=r[1],t=r[2],o,i,s;i=(e+16)/116,o=n/500+i,s=i-t/200;let c=i**3,f=o**3,b=s**3;return i=c>.008856?c:(i-16/116)/7.787,o=f>.008856?f:(o-16/116)/7.787,s=b>.008856?b:(s-16/116)/7.787,o*=95.047,i*=100,s*=108.883,[o,i,s]},y.lab.lch=function(r){let e=r[0],n=r[1],t=r[2],o;o=Math.atan2(t,n)*360/2/Math.PI,o<0&&(o+=360);let s=Math.sqrt(n*n+t*t);return[e,s,o]},y.lch.lab=function(r){let e=r[0],n=r[1],o=r[2]/360*2*Math.PI,i=n*Math.cos(o),s=n*Math.sin(o);return[e,i,s]},y.rgb.ansi16=function(r,e=null){let[n,t,o]=r,i=e===null?y.rgb.hsv(r)[2]:e;if(i=Math.round(i/50),i===0)return 30;let s=30+(Math.round(o/255)<<2|Math.round(t/255)<<1|Math.round(n/255));return i===2&&(s+=60),s},y.hsv.ansi16=function(r){return y.rgb.ansi16(y.hsv.rgb(r),r[2])},y.rgb.ansi256=function(r){let e=r[0],n=r[1],t=r[2];return e===n&&n===t?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(t/255*5)},y.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let n=(~~(r>50)+1)*.5,t=(e&1)*n*255,o=(e>>1&1)*n*255,i=(e>>2&1)*n*255;return[t,o,i]},y.ansi256.rgb=function(r){if(r>=232){let i=(r-232)*10+8;return[i,i,i]}r-=16;let e,n=Math.floor(r/36)/5*255,t=Math.floor((e=r%36)/6)/5*255,o=e%6/5*255;return[n,t,o]},y.rgb.hex=function(r){let n=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(n.length)+n},y.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let n=e[0];e[0].length===3&&(n=n.split("").map(c=>c+c).join(""));let t=parseInt(n,16),o=t>>16&255,i=t>>8&255,s=t&255;return[o,i,s]},y.rgb.hcg=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.max(Math.max(e,n),t),i=Math.min(Math.min(e,n),t),s=o-i,c,f;return s<1?c=i/(1-s):c=0,s<=0?f=0:o===e?f=(n-t)/s%6:o===n?f=2+(t-e)/s:f=4+(e-n)/s,f/=6,f%=1,[f*360,s*100,c*100]},y.hsl.hcg=function(r){let e=r[1]/100,n=r[2]/100,t=n<.5?2*e*n:2*e*(1-n),o=0;return t<1&&(o=(n-.5*t)/(1-t)),[r[0],t*100,o*100]},y.hsv.hcg=function(r){let e=r[1]/100,n=r[2]/100,t=e*n,o=0;return t<1&&(o=(n-t)/(1-t)),[r[0],t*100,o*100]},y.hcg.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100;if(n===0)return[t*255,t*255,t*255];let o=[0,0,0],i=e%1*6,s=i%1,c=1-s,f=0;switch(Math.floor(i)){case 0:o[0]=1,o[1]=s,o[2]=0;break;case 1:o[0]=c,o[1]=1,o[2]=0;break;case 2:o[0]=0,o[1]=1,o[2]=s;break;case 3:o[0]=0,o[1]=c,o[2]=1;break;case 4:o[0]=s,o[1]=0,o[2]=1;break;default:o[0]=1,o[1]=0,o[2]=c}return f=(1-n)*t,[(n*o[0]+f)*255,(n*o[1]+f)*255,(n*o[2]+f)*255]},y.hcg.hsv=function(r){let e=r[1]/100,n=r[2]/100,t=e+n*(1-e),o=0;return t>0&&(o=e/t),[r[0],o*100,t*100]},y.hcg.hsl=function(r){let e=r[1]/100,t=r[2]/100*(1-e)+.5*e,o=0;return t>0&&t<.5?o=e/(2*t):t>=.5&&t<1&&(o=e/(2*(1-t))),[r[0],o*100,t*100]},y.hcg.hwb=function(r){let e=r[1]/100,n=r[2]/100,t=e+n*(1-e);return[r[0],(t-e)*100,(1-t)*100]},y.hwb.hcg=function(r){let e=r[1]/100,t=1-r[2]/100,o=t-e,i=0;return o<1&&(i=(t-o)/(1-o)),[r[0],o*100,i*100]},y.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]},y.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]},y.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]},y.gray.hsl=function(r){return[0,0,r[0]]},y.gray.hsv=y.gray.hsl,y.gray.hwb=function(r){return[0,100,r[0]]},y.gray.cmyk=function(r){return[0,0,0,r[0]]},y.gray.lab=function(r){return[r[0],0,0]},y.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,t=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(t.length)+t},y.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var Ot=V((Rr,xt)=>{var Oe=Ue();function Wn(){let r={},e=Object.keys(Oe);for(let n=e.length,t=0;t<n;t++)r[e[t]]={distance:-1,parent:null};return r}function Nn(r){let e=Wn(),n=[r];for(e[r].distance=0;n.length;){let t=n.pop(),o=Object.keys(Oe[t]);for(let i=o.length,s=0;s<i;s++){let c=o[s],f=e[c];f.distance===-1&&(f.distance=e[t].distance+1,f.parent=t,n.unshift(c))}}return e}function Ln(r,e){return function(n){return e(r(n))}}function Gn(r,e){let n=[e[r].parent,r],t=Oe[e[r].parent][r],o=e[r].parent;for(;e[o].parent;)n.unshift(e[o].parent),t=Ln(Oe[e[o].parent][o],t),o=e[o].parent;return t.conversion=n,t}xt.exports=function(r){let e=Nn(r),n={},t=Object.keys(e);for(let o=t.length,i=0;i<o;i++){let s=t[i];e[s].parent!==null&&(n[s]=Gn(s,e))}return n}});var Dt=V((xr,Tt)=>{var Ve=Ue(),zn=Ot(),le={},Un=Object.keys(Ve);function Vn(r){let e=function(...n){let t=n[0];return t==null?t:(t.length>1&&(n=t),r(n))};return"conversion"in r&&(e.conversion=r.conversion),e}function qn(r){let e=function(...n){let t=n[0];if(t==null)return t;t.length>1&&(n=t);let o=r(n);if(typeof o=="object")for(let i=o.length,s=0;s<i;s++)o[s]=Math.round(o[s]);return o};return"conversion"in r&&(e.conversion=r.conversion),e}Un.forEach(r=>{le[r]={},Object.defineProperty(le[r],"channels",{value:Ve[r].channels}),Object.defineProperty(le[r],"labels",{value:Ve[r].labels});let e=zn(r);Object.keys(e).forEach(t=>{let o=e[t];le[r][t]=qn(o),le[r][t].raw=Vn(o)})}),Tt.exports=le});var At=V((Or,It)=>{"use strict";var Mt=(r,e)=>(...n)=>`\x1B[${r(...n)+e}m`,_t=(r,e)=>(...n)=>{let t=r(...n);return`\x1B[${38+e};5;${t}m`},Pt=(r,e)=>(...n)=>{let t=r(...n);return`\x1B[${38+e};2;${t[0]};${t[1]};${t[2]}m`},Te=r=>r,jt=(r,e,n)=>[r,e,n],ce=(r,e,n)=>{Object.defineProperty(r,e,{get:()=>{let t=n();return Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0}),t},enumerable:!0,configurable:!0})},qe,ue=(r,e,n,t)=>{qe===void 0&&(qe=Dt());let o=t?10:0,i={};for(let[s,c]of Object.entries(qe)){let f=s==="ansi16"?"ansi":s;s===e?i[f]=r(n,o):typeof c=="object"&&(i[f]=r(c[e],o))}return i};function Kn(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[n,t]of Object.entries(e)){for(let[o,i]of Object.entries(t))e[o]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},t[o]=e[o],r.set(i[0],i[1]);Object.defineProperty(e,n,{value:t,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",ce(e.color,"ansi",()=>ue(Mt,"ansi16",Te,!1)),ce(e.color,"ansi256",()=>ue(_t,"ansi256",Te,!1)),ce(e.color,"ansi16m",()=>ue(Pt,"rgb",jt,!1)),ce(e.bgColor,"ansi",()=>ue(Mt,"ansi16",Te,!0)),ce(e.bgColor,"ansi256",()=>ue(_t,"ansi256",Te,!0)),ce(e.bgColor,"ansi16m",()=>ue(Pt,"rgb",jt,!0)),e}Object.defineProperty(It,"exports",{enumerable:!0,get:Kn})});var $t=V((Tr,Bt)=>{"use strict";Bt.exports=(r,e=process.argv)=>{let n=r.startsWith("-")?"":r.length===1?"-":"--",t=e.indexOf(n+r),o=e.indexOf("--");return t!==-1&&(o===-1||t<o)}});var Nt=V((Dr,Wt)=>{"use strict";var Jn=require("os"),Ft=require("tty"),z=$t(),{env:W}=process,Q;z("no-color")||z("no-colors")||z("color=false")||z("color=never")?Q=0:(z("color")||z("colors")||z("color=true")||z("color=always"))&&(Q=1),"FORCE_COLOR"in W&&(W.FORCE_COLOR==="true"?Q=1:W.FORCE_COLOR==="false"?Q=0:Q=W.FORCE_COLOR.length===0?1:Math.min(parseInt(W.FORCE_COLOR,10),3));function Ke(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function Je(r,e){if(Q===0)return 0;if(z("color=16m")||z("color=full")||z("color=truecolor"))return 3;if(z("color=256"))return 2;if(r&&!e&&Q===void 0)return 0;let n=Q||0;if(W.TERM==="dumb")return n;if(process.platform==="win32"){let t=Jn.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in W)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(t=>t in W)||W.CI_NAME==="codeship"?1:n;if("TEAMCITY_VERSION"in W)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(W.TEAMCITY_VERSION)?1:0;if(W.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in W){let t=parseInt((W.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(W.TERM_PROGRAM){case"iTerm.app":return t>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(W.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(W.TERM)||"COLORTERM"in W?1:n}function Hn(r){let e=Je(r,r&&r.isTTY);return Ke(e)}Wt.exports={supportsColor:Hn,stdout:Ke(Je(!0,Ft.isatty(1))),stderr:Ke(Je(!0,Ft.isatty(2)))}});var Gt=V((Mr,Lt)=>{"use strict";var Yn=(r,e,n)=>{let t=r.indexOf(e);if(t===-1)return r;let o=e.length,i=0,s="";do s+=r.substr(i,t-i)+e+n,i=t+o,t=r.indexOf(e,i);while(t!==-1);return s+=r.substr(i),s},Zn=(r,e,n,t)=>{let o=0,i="";do{let s=r[t-1]==="\r";i+=r.substr(o,(s?t-1:t)-o)+e+(s?`\r
|
|
3
3
|
`:`
|
|
4
|
-
`)+
|
|
5
|
-
`,o)}while(
|
|
6
|
-
`);return
|
|
7
|
-
`)}formatValidationError(e,t,r=!1){let o=[];return o.push("Validation Error"),o.push(""),o.push(`Field: ${e}`),o.push(`Issue: ${t}`),o.push(""),r&&(o.push("--- Technical Details (--verbose) ---"),o.push(`Field validation failed for: ${e}`),o.push(`Validation message: ${t}`),o.push("")),o.join(`
|
|
8
|
-
`)}
|
|
9
|
-
`)}
|
|
10
|
-
`)}
|
|
11
|
-
`)}
|
|
12
|
-
Update your purenow.config.ts to add this stage.`);(0,T.buildStaticHtml)(),o.info(c.bold(`Deploying to AWS (stage: ${c.cyan(h)})...`)),console.log();let R=new T.DeployService(a),b=new T.BuildService(a),B=new T.CdkBootstrapService(o),M=await(0,T.detectAndValidateCredentials)(o),j=w.awsRegion??M.region??"us-east-1";await this.validateCredentials(R,w,o),await this.ensureBootstrapped(B,r,w,M,o,a),await this.performPreDeploymentValidation(h,r,t,o,a);let F=await this.executeStacksDeployment(e,h,r,o,t.skipBuild,t.verbose);return await this.clearS3CacheDeployment(F.infraStack,r,j,o),await this.uploadReactBundle(F.infraStack,r,j,o,a),await this.uploadPublicAssets(F.infraStack,r,j,o,a),await this.invalidateCloudFrontCache(F.runtimeWebStack,r,j,o),await this.injectApiGatewayUrl(F.runtimeWebStack,r,o,a),this.displayStacksDeploymentSummary(F,o),{success:!0,exitCode:0}}catch(h){return h instanceof T.DeploymentError||h instanceof T.BuildError?(o.error(h.message),h.hint&&(console.log(),o.info(c.dim(h.hint)))):h instanceof T.BootstrapCredentialsError||h instanceof T.BootstrapRegionError||o.error(h instanceof Error?h.message:String(h)),{success:!1,error:h instanceof Error?h:new Error(String(h)),exitCode:1}}}displayStacksDeploymentSummary(e,t){super.displayStacksDeploymentSummary(e,t,{modified:!0}),console.log(),console.log(c.bold("Runtime Web Stack:")),console.log(c.dim(" "),c.cyan("Stack Name:"),c.white(e.runtimeWebStack.stackName)),console.log(c.dim(" "),c.cyan("Duration:"),c.white(this.formatDuration(e.runtimeWebStack.duration))),e.runtimeWebStack.outputs.apiGatewayUrl&&console.log(c.dim(" "),c.cyan("API Gateway:"),c.white(e.runtimeWebStack.outputs.apiGatewayUrl)),e.runtimeWebStack.outputs.lambdaArnList&&e.runtimeWebStack.outputs.lambdaArnList.length>0&&(console.log(c.dim(" "),c.cyan("Lambdas:"),c.white(e.runtimeWebStack.outputs.lambdaArnList.length)),e.runtimeWebStack.outputs.lambdaArnList.forEach((r,o)=>{console.log(c.dim(" "),c.cyan(" Lambda ARN:"),c.white(r))})),console.log(),console.log(c.bold("Deployment Info:")),console.log(c.dim(" "),c.cyan("Region:"),c.white(e.infraStack.region)),console.log(c.dim(" "),c.cyan("Stage:"),c.white(e.infraStack.stage)),console.log()}};var he=N(require("fs")),ee=N(require("path")),Y=require("@worktif/purenow/bin");function vr(n){return n==="lambda"||n==="cdk"||n==="all"}async function Ve(n,e,t,r=process.cwd(),o){try{let a=n.target||"all";if(vr(a)&&o)try{if(o.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(R){R instanceof Y.FriendlyEnvironmentError&&(t.warn("AWS credentials not configured"),console.log(),t.info(c.dim("Building without AWS credentials. You will need to configure them before deployment.")),console.log())}(0,Y.buildStaticHtml)();let d=new Y.BuildService(r);t.info(c.bold("Building Runtime application...")),console.log();let h,w=!1;return a==="all"?(w=he.existsSync(ee.join(r,"src/core/index.ts")),h=await br(d,e,t)):h=await wr(d,a,e,t),w&&await Sr(d,e,t),kr(h,r,t),{success:!0,exitCode:0}}catch(a){return a instanceof Y.BuildError?(t.error(a.message),a.hint&&(console.log(),t.info(c.dim(a.hint)))):t.error(a instanceof Error?a.message:String(a)),{success:!1,error:a instanceof Error?a:new Error(String(a)),exitCode:1}}}async function br(n,e,t){let o=he.existsSync(ee.join(process.cwd(),"src/core/index.ts"))?["react","lambda","cdk"]:["react"],a=[];for(let d of o){let h=t.spinner(`Building ${d} bundle...`);h.start();let w=await n.buildTarget(d,e);if(a.push(w),w.success)h.succeed(`${Oe(d)} bundle (${Ue(w.duration)})`);else throw h.fail(`${Oe(d)} bundle failed`),new Y.BuildError(`Build failed for target '${d}'`,w.error?.message)}return a}async function wr(n,e,t,r){let o=r.spinner(`Building ${e} bundle...`);o.start();let a=await n.buildTarget(e,t);if(a.success)o.succeed(`${Oe(e)} bundle (${Ue(a.duration)})`);else throw o.fail(`${Oe(e)} bundle failed`),new Y.BuildError(`Build failed for target '${e}'`,a.error?.message);return[a]}async function Sr(n,e,t){let r=t.spinner("Generating type declarations...");r.start();try{await n.generateTypes(e),r.succeed("Type declarations")}catch(o){throw r.fail("Type declarations failed"),o}}function kr(n,e,t){console.log();let r=n.reduce((o,a)=>o+a.duration,0);t.success(c.bold(`Build complete in ${Ue(r)}`)),console.log(),console.log(c.bold("Artifacts:"));for(let o of n)if(o.success){let a=ee.resolve(e,o.outputPath),d=Rr(a),h=ee.relative(e,a);console.log(c.dim(" "),c.white(h),c.dim(`(${d})`))}console.log()}function Rr(n){try{let e=he.statSync(n);return Cr(e.size)}catch{return"unknown"}}function Cr(n){if(n===0)return"0 B";let e=1024,t=["B","KB","MB","GB"],r=Math.floor(Math.log(n)/Math.log(e));return`${(n/Math.pow(e,r)).toFixed(1)} ${t[r]}`}function Ue(n){return n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`}function Oe(n){return n.charAt(0).toUpperCase()+n.slice(1)}var W=N(require("path")),_t=N(require("fs")),Q=require("@worktif/purenow/bin");async function ze(n,e,t=process.cwd(),r){let o=e.spinner(n.cdk?"Initializing CDK infrastructure...":"Initializing Runtime project...");try{let a=new fe(t),d=new Q.PromptService;if(n.cdk&&!n.force&&a.cdkDirectoryExists(t))throw new Q.ValidationError("CDK directory already exists","Use --force flag to overwrite existing CDK infrastructure");let h=n.dir||(n.cdk?"cdk":t),w=n.cdk?"cdk":n.template||"basic",R="runtime-web",b=n.force||!1,B=W.basename(W.resolve(t,n.cdk?t:h));if(!n.cdk&&!b){let M=W.resolve(t,h),j=await Dr(M);if(j.length>0){if(console.log(),e.warn("Existing project files detected:"),j.forEach(x=>{console.log(c.dim(` - ${x}`))}),console.log(),!await d.confirm("Do you want to overwrite these files?",!1))return console.log(),e.info("Project initialization cancelled. Existing files preserved."),console.log(),{success:!0,exitCode:0};b=!0}}if(o.start(),await a.scaffold(w,h,{projectName:B,force:b},R),o.succeed(n.cdk?"CDK infrastructure initialized successfully!":"Runtime project initialized successfully!"),n.cdk){if(Tr(e,B,h,t),r){let M=W.resolve(t,h);await Or(e,r,M)}}else Er(e,B,h,t),await new Q.PromptService().confirm("Do you want to initialize AWS CDK infrastructure for this project now?",!0)?(await xr(e,B,W.resolve(t,h),R,a,r)).success||(e.warn("CDK initialization failed, but your Runtime project was created successfully."),e.info("You can initialize CDK later by running: npm install && runtime init --cdk")):(console.log(),e.info("You can initialize CDK later by running: npm install && runtime init --cdk"),console.log());return{success:!0,exitCode:0}}catch(a){return o.fail(n.cdk?"Failed to initialize CDK infrastructure":"Failed to initialize Runtime project"),a instanceof Q.ValidationError?(e.error(a.message),a.hint&&e.info(c.dim(a.hint))):e.error(a instanceof Error?a.message:String(a)),{success:!1,error:a instanceof Error?a:new Error(String(a)),exitCode:1}}}function Er(n,e,t,r){let o=W.resolve(r,t),a=o===r;console.log(),n.success(c.bold(`Runtime project '${e}' created successfully!`)),console.log(),console.log(c.bold("Project structure:")),console.log(c.dim(" \u251C\u2500\u2500 src/")),console.log(c.dim(" \u2502 \u251C\u2500\u2500 index.tsx # React app entry")),console.log(c.dim(" \u2502 \u251C\u2500\u2500 App.tsx # Root component")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 routes.tsx # React Router routes")),console.log(c.dim(" \u251C\u2500\u2500 public/")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 index.html")),console.log(c.dim(" \u251C\u2500\u2500 runtime.config.ts # Runtime configuration")),console.log(c.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(c.dim(" \u2514\u2500\u2500 package.json")),console.log(),console.log(c.bold("Next steps:")),console.log(),a||console.log(c.cyan(` cd ${W.relative(r,o)}`)),console.log(),console.log(c.bold("Development:")),console.log(),console.log(c.cyan(" npx runtime dev")),console.log(c.dim(" # Start local development server")),console.log(),console.log(c.bold("Build & Deploy:")),console.log(),console.log(c.cyan(" npx runtime build")),console.log(c.dim(" # Build all targets (React, Lambda, CDK)")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.dim(" # Deploy to AWS")),console.log(),console.log(c.bold("\u{1F4DA} Learn more:")),console.log(c.dim(" https://runtimeweb.com/docs")),console.log()}function Tr(n,e,t,r){let o=W.resolve(r,t),a=W.relative(r,o);console.log(),n.success(c.bold(`CDK infrastructure for '${e}' created successfully!`)),console.log(),console.log(c.bold("CDK structure:")),console.log(c.dim(" cdk/")),console.log(c.dim(" \u251C\u2500\u2500 bin/")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 app.ts # CDK app entry point")),console.log(c.dim(" \u251C\u2500\u2500 cdk.json # CDK configuration")),console.log(c.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(c.dim(" \u2514\u2500\u2500 .env.example # Environment variables template")),console.log(),console.log(c.bold("Ready to deploy:")),console.log(),console.log(c.cyan(` cd ${a}`)),console.log(c.dim(" # All dependencies are already installed")),console.log(),console.log(c.bold("Deploy to AWS:")),console.log(),console.log(c.cyan(" npx runtime init --cdk")),console.log(c.dim(" # Bootstrap CDK (only needed once per account/region)")),console.log(),console.log(c.cyan(" cdk diff")),console.log(c.dim(" # Preview changes before deploying")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.dim(" # Deploy your infrastructure")),console.log(),console.log(c.bold("\u{1F3AF} Deploy to different stages:")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.cyan(" npx runtime deploy --stage staging")),console.log(c.cyan(" npx runtime deploy --stage prod")),console.log(),console.log(c.bold("\u{1F4DA} Learn more:")),console.log(c.dim(" Runtime CDK: https://runtimeweb.com/docs/cdk")),console.log(c.dim(" AWS CDK: https://docs.aws.amazon.com/cdk/")),console.log()}async function xr(n,e,t,r,o,a){let{PromptService:d,PackageManagerService:h,CdkInitService:w,AwsCredentialsDetector:R,AwsRegionResolver:b}=await import("@worktif/purenow/bin"),B=new d,M=new h,j=new w(o,M,n),F=new R;try{console.log();let x=await j.checkCdkDirectoryExists(t);if(x&&!await B.confirm("A /cdk folder already exists. Overwrite it?",!1))return console.log(),n.info("Existing CDK setup preserved."),console.log(),{success:!0,exitCode:0};let X=await new b().resolveRegion(),ye=X.region||b.getDefaultRegion();n.debug(`Resolved AWS region: ${ye} (source: ${X.source})`);let re={projectName:e,stage:"dev",region:ye,enableSeo:!0},ve=M.detectPackageManager(t);n.info(`Using package manager: ${c.cyan(ve)}`),console.log();let le=n.spinner("Initializing CDK infrastructure...");le.start();let q=await j.initializeCdk({projectDir:t,projectName:re.projectName,stage:re.stage,region:re.region,enableSeo:re.enableSeo,overwriteExisting:x,runBootstrap:!1,packageManager:ve},r);return q.success?(le.succeed("CDK infrastructure initialized successfully!"),q.projectDependenciesInstalled&&n.info(c.green("\u2713 Project dependencies installed")),q.cdkDependenciesInstalled&&n.info(c.green("\u2713 CDK dependencies installed")),{success:!0,exitCode:0}):(le.fail("Failed to initialize CDK infrastructure"),q.error&&n.error(q.error.message),{success:!1,error:q.error,exitCode:1})}catch(x){return n.error(x instanceof Error?x.message:String(x)),{success:!1,error:x instanceof Error?x:new Error(String(x)),exitCode:1}}}async function Or(n,e,t){console.log();try{if(!e.getConfig().isAwsCredentialsDump())n.info(c.green("\u2713 AWS credentials detected")),console.log(),n.info("Your CDK infrastructure is ready. You can now:"),console.log(),console.log(c.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(c.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();else{(0,Q.logCredentialsError)(n);return}}catch(r){if(r instanceof Error){n.warn(c.yellow("! AWS credentials not configured.")),console.log(),n.info("CDK infrastructure files were created successfully in /cdk"),n.info("However, AWS credentials are required for deployment."),console.log(),n.info("Please configure AWS credentials before deploying:"),console.log(),console.log(c.bold("Option 1: AWS CLI (Recommended)")),console.log(c.dim(" $ aws configure")),console.log(),console.log(c.bold("Option 2: Environment Variables")),console.log(c.dim(" $ export AWS_ACCESS_KEY_ID=your_key_id")),console.log(c.dim(" $ export AWS_SECRET_ACCESS_KEY=your_secret_key")),console.log(c.dim(" $ export AWS_REGION=us-east-1")),console.log(),console.log(c.bold("Option 3: AWS Profile")),console.log(c.dim(" $ export AWS_PROFILE=your_profile_name")),console.log(),n.info("After configuring credentials, you can deploy by running:"),console.log(),console.log(c.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(c.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();return}throw r}}async function Dr(n){let e=[],t=["package.json","node_modules","src/index.tsx","src/App.tsx","runtime.config.ts","purenow.config.ts","tsconfig.json"];for(let r of t){let o=W.join(n,r);try{await _t.promises.access(o),e.push(r)}catch{}}return e}var $n=N(Re());var Gn=N(Re()),L=N(require("process")),De=require("@worktif/purenow/bin"),ge=class n extends De.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:n.defaultToolName,helperToolName:"Runtime Web",title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,De.purenowCommandConfig)(n.defaultToolName),this.addBuildCommands()}addBuildCommands(){let e=[{name:"build:browser",target:"react",desc:"Build browser bundle (ESM)"},{name:"build:lambda",target:"lambda",desc:"Build Lambda bundle (CommonJS)"},{name:"build:lib",target:"lib",desc:"Build library bundle (CommonJS)"},{name:"build:lib-esm",target:"lib-esm",desc:"Build library bundle (ESM)"},{name:"build:infra",target:"infra",desc:"Build infrastructure bundle"},{name:"build:cli",target:"cli",desc:"Build CLI bundle"},{name:"build:bin",target:"bin",desc:"Build bin utilities bundle"},{name:"build:cdk",target:"cdk",desc:"Build CDK application bundle"}];for(let{name:t,target:r,desc:o}of e)this.program.command(t).description(o).option("--dev","Enable development mode",!1).option("--skip-validation","Skip bundle validation",!1).option("-v, --verbose","Enable verbose output",!1).action(async a=>{try{await Ve({target:r},{},console)}catch(d){console.error(`${t} failed:`,d instanceof Error?d.message:String(d)),L.default.exit(1)}});this.program.command("dev:validate").description("Start development mode bundle validation with real-time feedback").option("-t, --targets <targets>","Comma-separated list of targets to validate","react,lambda").option("--no-watch","Disable file watching",!1).option("--interval <ms>","Validation interval in milliseconds","5000").option("--no-immediate","Skip immediate validation on startup",!1).option("-v, --verbose","Enable verbose output",!1).action(async t=>{try{let o={targets:t.targets.split(",").map(a=>a.trim()),watch:t.watch,interval:parseInt(t.interval,10),immediate:t.immediate,verbose:t.verbose};console.log("Dev validation not implemented yet")}catch(r){console.error("Development validation failed:",r instanceof Error?r.message:String(r)),L.default.exit(1)}})}async createContext(e,t=L.default.cwd()){let r=await super.createContext({...e,config:e.config??"runtime.config.ts"},t),o=new Ee(t);return{...r,stacksDeployService:o}}async deployCommand(e,t,r){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let d=await new me().deployCommand(o.stacksDeployService,e,o.config,o.logger,o.cwd,o.envValidator);d.success||L.default.exit(d.exitCode)}catch(a){o.logger.error(a instanceof Error?a.message:String(a)),L.default.exit(1)}}async initCommand(e,t,r){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let d=await ze(e,o.logger,o.cwd,o.envValidator);d.success||L.default.exit(d.exitCode)}catch(a){o.logger.error(a instanceof Error?a.message:String(a)),L.default.exit(1)}}async destroyCommand(e,t,r){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let{destroyCommand:a}=await import("@worktif/purenow/bin"),d=await a({...e,backupDir:"./.runtime-backups"},o.logger,o.cwd);d.success||L.default.exit(d.exitCode)}catch(a){o.logger.error(a instanceof Error?a.message:String(a)),L.default.exit(1)}}async run(e){await this.program.parseAsync(e||L.default.argv)}static handleError(e){let t=new Ce,r=!!L.default.env.DEBUG;if(e instanceof Z){let o=t.formatTemplateError(e,r);console.error(o)}else if(e instanceof ae){let o=t.formatTemplateStructureError(e,r);console.error(o)}else if(e instanceof Error){let o=t.formatError(e,r);console.error(o)}else console.error("Unknown error:",String(e));L.default.exit(1)}};function Mt(){return new ge}var z=N(require("process"));async function Pt(){try{await Mt().run()}catch(n){ge.handleError(n)}}function to(n){n instanceof Error?(console.error(c.red("\u2717"),"Error:",n.message),z.default.env.DEBUG&&console.error(n.stack)):console.error(c.red("\u2717"),"Unknown error:",String(n)),z.default.exit(1)}function _r(){z.default.on("uncaughtException",n=>{console.error(c.red("\u2717"),"Uncaught exception:",n.message),z.default.env.DEBUG&&console.error(n.stack),z.default.exit(1)}),z.default.on("unhandledRejection",n=>{console.error(c.red("\u2717"),"Unhandled rejection:",n),z.default.env.DEBUG&&n instanceof Error&&console.error(n.stack),z.default.exit(1)})}_r(),Pt().catch(n=>{console.error(c.red("\u2717"),"Fatal error:",n.message),z.default.env.DEBUG&&console.error(n.stack),z.default.exit(1)});0&&(module.exports={main});
|
|
4
|
+
`)+n,o=t+1,t=r.indexOf(`
|
|
5
|
+
`,o)}while(t!==-1);return i+=r.substr(o),i};Lt.exports={stringReplaceAll:Yn,stringEncaseCRLFWithFirstIndex:Zn}});var Kt=V((_r,qt)=>{"use strict";var Xn=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,zt=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Qn=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,er=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,tr=new Map([["n",`
|
|
6
|
+
`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function Ut(r){let e=r[0]==="u",n=r[1]==="{";return e&&!n&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&n?String.fromCodePoint(parseInt(r.slice(2,-1),16)):tr.get(r)||r}function nr(r,e){let n=[],t=e.trim().split(/\s*,\s*/g),o;for(let i of t){let s=Number(i);if(!Number.isNaN(s))n.push(s);else if(o=i.match(Qn))n.push(o[2].replace(er,(c,f,b)=>f?Ut(f):b));else throw new Error(`Invalid Chalk template style argument: ${i} (in style '${r}')`)}return n}function rr(r){zt.lastIndex=0;let e=[],n;for(;(n=zt.exec(r))!==null;){let t=n[1];if(n[2]){let o=nr(t,n[2]);e.push([t].concat(o))}else e.push([t])}return e}function Vt(r,e){let n={};for(let o of e)for(let i of o.styles)n[i[0]]=o.inverse?null:i.slice(1);let t=r;for(let[o,i]of Object.entries(n))if(Array.isArray(i)){if(!(o in t))throw new Error(`Unknown Chalk style: ${o}`);t=i.length>0?t[o](...i):t[o]}return t}qt.exports=(r,e)=>{let n=[],t=[],o=[];if(e.replace(Xn,(i,s,c,f,b,w)=>{if(s)o.push(Ut(s));else if(f){let R=o.join("");o=[],t.push(n.length===0?R:Vt(r,n)(R)),n.push({inverse:c,styles:rr(f)})}else if(b){if(n.length===0)throw new Error("Found extraneous } in Chalk template literal");t.push(Vt(r,n)(o.join(""))),o=[],n.pop()}else o.push(w)}),t.push(o.join("")),n.length>0){let i=`Chalk template literal is missing ${n.length} closing bracket${n.length===1?"":"s"} (\`}\`)`;throw new Error(i)}return t.join("")}});var ve=V((Pr,Qt)=>{"use strict";var ye=At(),{stdout:He,stderr:Ye}=Nt(),{stringReplaceAll:or,stringEncaseCRLFWithFirstIndex:ir}=Gt(),{isArray:De}=Array,Jt=["ansi","ansi","ansi256","ansi16m"],fe=Object.create(null),sr=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let n=He?He.level:0;r.level=e.level===void 0?n:e.level},Ze=class{constructor(e){return Ht(e)}},Ht=r=>{let e={};return sr(e,r),e.template=(...n)=>Xt(e.template,...n),Object.setPrototypeOf(e,Me.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=Ze,e.template};function Me(r){return Ht(r)}for(let[r,e]of Object.entries(ye))fe[r]={get(){let n=_e(this,Xe(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:n}),n}};fe.visible={get(){let r=_e(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var Yt=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of Yt)fe[r]={get(){let{level:e}=this;return function(...n){let t=Xe(ye.color[Jt[e]][r](...n),ye.color.close,this._styler);return _e(this,t,this._isEmpty)}}};for(let r of Yt){let e="bg"+r[0].toUpperCase()+r.slice(1);fe[e]={get(){let{level:n}=this;return function(...t){let o=Xe(ye.bgColor[Jt[n]][r](...t),ye.bgColor.close,this._styler);return _e(this,o,this._isEmpty)}}}}var ar=Object.defineProperties(()=>{},{...fe,level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}}),Xe=(r,e,n)=>{let t,o;return n===void 0?(t=r,o=e):(t=n.openAll+r,o=e+n.closeAll),{open:r,close:e,openAll:t,closeAll:o,parent:n}},_e=(r,e,n)=>{let t=(...o)=>De(o[0])&&De(o[0].raw)?Zt(t,Xt(t,...o)):Zt(t,o.length===1?""+o[0]:o.join(" "));return Object.setPrototypeOf(t,ar),t._generator=r,t._styler=e,t._isEmpty=n,t},Zt=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let n=r._styler;if(n===void 0)return e;let{openAll:t,closeAll:o}=n;if(e.indexOf("\x1B")!==-1)for(;n!==void 0;)e=or(e,n.close,n.open),n=n.parent;let i=e.indexOf(`
|
|
7
|
+
`);return i!==-1&&(e=ir(e,o,t,i)),t+e+o},Qe,Xt=(r,...e)=>{let[n]=e;if(!De(n)||!De(n.raw))return e.join(" ");let t=e.slice(1),o=[n.raw[0]];for(let i=1;i<n.length;i++)o.push(String(t[i-1]).replace(/[{}\\]/g,"\\$&"),String(n.raw[i]));return Qe===void 0&&(Qe=Kt()),Qe(r,o.join(""))};Object.defineProperties(Me.prototype,fe);var Pe=Me();Pe.supportsColor=He,Pe.stderr=Me({level:Ye?Ye.level:0}),Pe.stderr.supportsColor=Ye,Qt.exports=Pe});var je=V(()=>{var en;(function(r){(function(e){var n=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:c(),t=o(r);typeof n.Reflect<"u"&&(t=o(n.Reflect,t)),e(t,n),typeof n.Reflect>"u"&&(n.Reflect=r);function o(f,b){return function(w,R){Object.defineProperty(f,w,{configurable:!0,writable:!0,value:R}),b&&b(w,R)}}function i(){try{return Function("return this;")()}catch{}}function s(){try{return(0,eval)("(function() { return this; })()")}catch{}}function c(){return i()||s()}})(function(e,n){var t=Object.prototype.hasOwnProperty,o=typeof Symbol=="function",i=o&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",s=o&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",c=typeof Object.create=="function",f={__proto__:[]}instanceof Array,b=!c&&!f,w={create:c?function(){return ze(Object.create(null))}:f?function(){return ze({__proto__:null})}:function(){return ze({})},has:b?function(a,l){return t.call(a,l)}:function(a,l){return l in a},get:b?function(a,l){return t.call(a,l)?a[l]:void 0}:function(a,l){return a[l]}},R=Object.getPrototypeOf(Function),O=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:xn(),$=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:On(),N=typeof WeakMap=="function"?WeakMap:Tn(),_=o?Symbol.for("@reflect-metadata:registry"):void 0,oe=Cn(),ne=En(oe);function Ee(a,l,u,d){if(S(u)){if(!pt(a))throw new TypeError;if(!mt(l))throw new TypeError;return hn(a,l)}else{if(!pt(a))throw new TypeError;if(!j(l))throw new TypeError;if(!j(d)&&!S(d)&&!se(d))throw new TypeError;return se(d)&&(d=void 0),u=K(u),gn(a,l,u,d)}}e("decorate",Ee);function ie(a,l){function u(d,k){if(!j(d))throw new TypeError;if(!S(k)&&!kn(k))throw new TypeError;lt(a,l,d,k)}return u}e("metadata",ie);function Re(a,l,u,d){if(!j(u))throw new TypeError;return S(d)||(d=K(d)),lt(a,l,u,d)}e("defineMetadata",Re);function me(a,l,u){if(!j(l))throw new TypeError;return S(u)||(u=K(u)),it(a,l,u)}e("hasMetadata",me);function X(a,l,u){if(!j(l))throw new TypeError;return S(u)||(u=K(u)),Ne(a,l,u)}e("hasOwnMetadata",X);function ot(a,l,u){if(!j(l))throw new TypeError;return S(u)||(u=K(u)),st(a,l,u)}e("getMetadata",ot);function fn(a,l,u){if(!j(l))throw new TypeError;return S(u)||(u=K(u)),at(a,l,u)}e("getOwnMetadata",fn);function dn(a,l){if(!j(a))throw new TypeError;return S(l)||(l=K(l)),ct(a,l)}e("getMetadataKeys",dn);function pn(a,l){if(!j(a))throw new TypeError;return S(l)||(l=K(l)),ut(a,l)}e("getOwnMetadataKeys",pn);function mn(a,l,u){if(!j(l))throw new TypeError;if(S(u)||(u=K(u)),!j(l))throw new TypeError;S(u)||(u=K(u));var d=he(l,u,!1);return S(d)?!1:d.OrdinaryDeleteMetadata(a,l,u)}e("deleteMetadata",mn);function hn(a,l){for(var u=a.length-1;u>=0;--u){var d=a[u],k=d(l);if(!S(k)&&!se(k)){if(!mt(k))throw new TypeError;l=k}}return l}function gn(a,l,u,d){for(var k=a.length-1;k>=0;--k){var I=a[k],F=I(l,u,d);if(!S(F)&&!se(F)){if(!j(F))throw new TypeError;d=F}}return d}function it(a,l,u){var d=Ne(a,l,u);if(d)return!0;var k=Ge(l);return se(k)?!1:it(a,k,u)}function Ne(a,l,u){var d=he(l,u,!1);return S(d)?!1:dt(d.OrdinaryHasOwnMetadata(a,l,u))}function st(a,l,u){var d=Ne(a,l,u);if(d)return at(a,l,u);var k=Ge(l);if(!se(k))return st(a,k,u)}function at(a,l,u){var d=he(l,u,!1);if(!S(d))return d.OrdinaryGetOwnMetadata(a,l,u)}function lt(a,l,u,d){var k=he(u,d,!0);k.OrdinaryDefineOwnMetadata(a,l,u,d)}function ct(a,l){var u=ut(a,l),d=Ge(a);if(d===null)return u;var k=ct(d,l);if(k.length<=0)return u;if(u.length<=0)return k;for(var I=new $,F=[],C=0,p=u;C<p.length;C++){var h=p[C],g=I.has(h);g||(I.add(h),F.push(h))}for(var v=0,E=k;v<E.length;v++){var h=E[v],g=I.has(h);g||(I.add(h),F.push(h))}return F}function ut(a,l){var u=he(a,l,!1);return u?u.OrdinaryOwnMetadataKeys(a,l):[]}function ft(a){if(a===null)return 1;switch(typeof a){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return a===null?1:6;default:return 6}}function S(a){return a===void 0}function se(a){return a===null}function yn(a){return typeof a=="symbol"}function j(a){return typeof a=="object"?a!==null:typeof a=="function"}function vn(a,l){switch(ft(a)){case 0:return a;case 1:return a;case 2:return a;case 3:return a;case 4:return a;case 5:return a}var u=l===3?"string":l===5?"number":"default",d=ht(a,i);if(d!==void 0){var k=d.call(a,u);if(j(k))throw new TypeError;return k}return bn(a,u==="default"?"number":u)}function bn(a,l){if(l==="string"){var u=a.toString;if(ae(u)){var d=u.call(a);if(!j(d))return d}var k=a.valueOf;if(ae(k)){var d=k.call(a);if(!j(d))return d}}else{var k=a.valueOf;if(ae(k)){var d=k.call(a);if(!j(d))return d}var I=a.toString;if(ae(I)){var d=I.call(a);if(!j(d))return d}}throw new TypeError}function dt(a){return!!a}function wn(a){return""+a}function K(a){var l=vn(a,3);return yn(l)?l:wn(l)}function pt(a){return Array.isArray?Array.isArray(a):a instanceof Object?a instanceof Array:Object.prototype.toString.call(a)==="[object Array]"}function ae(a){return typeof a=="function"}function mt(a){return typeof a=="function"}function kn(a){switch(ft(a)){case 3:return!0;case 4:return!0;default:return!1}}function Le(a,l){return a===l||a!==a&&l!==l}function ht(a,l){var u=a[l];if(u!=null){if(!ae(u))throw new TypeError;return u}}function gt(a){var l=ht(a,s);if(!ae(l))throw new TypeError;var u=l.call(a);if(!j(u))throw new TypeError;return u}function yt(a){return a.value}function vt(a){var l=a.next();return l.done?!1:l}function bt(a){var l=a.return;l&&l.call(a)}function Ge(a){var l=Object.getPrototypeOf(a);if(typeof a!="function"||a===R||l!==R)return l;var u=a.prototype,d=u&&Object.getPrototypeOf(u);if(d==null||d===Object.prototype)return l;var k=d.constructor;return typeof k!="function"||k===a?l:k}function Sn(){var a;!S(_)&&typeof n.Reflect<"u"&&!(_ in n.Reflect)&&typeof n.Reflect.defineMetadata=="function"&&(a=Rn(n.Reflect));var l,u,d,k=new N,I={registerProvider:F,getProvider:p,setProvider:g};return I;function F(v){if(!Object.isExtensible(I))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case a===v:break;case S(l):l=v;break;case l===v:break;case S(u):u=v;break;case u===v:break;default:d===void 0&&(d=new $),d.add(v);break}}function C(v,E){if(!S(l)){if(l.isProviderFor(v,E))return l;if(!S(u)){if(u.isProviderFor(v,E))return l;if(!S(d))for(var T=gt(d);;){var A=vt(T);if(!A)return;var U=yt(A);if(U.isProviderFor(v,E))return bt(T),U}}}if(!S(a)&&a.isProviderFor(v,E))return a}function p(v,E){var T=k.get(v),A;return S(T)||(A=T.get(E)),S(A)&&(A=C(v,E),S(A)||(S(T)&&(T=new O,k.set(v,T)),T.set(E,A))),A}function h(v){if(S(v))throw new TypeError;return l===v||u===v||!S(d)&&d.has(v)}function g(v,E,T){if(!h(T))throw new Error("Metadata provider not registered.");var A=p(v,E);if(A!==T){if(!S(A))return!1;var U=k.get(v);S(U)&&(U=new O,k.set(v,U)),U.set(E,T)}return!0}}function Cn(){var a;return!S(_)&&j(n.Reflect)&&Object.isExtensible(n.Reflect)&&(a=n.Reflect[_]),S(a)&&(a=Sn()),!S(_)&&j(n.Reflect)&&Object.isExtensible(n.Reflect)&&Object.defineProperty(n.Reflect,_,{enumerable:!1,configurable:!1,writable:!1,value:a}),a}function En(a){var l=new N,u={isProviderFor:function(h,g){var v=l.get(h);return S(v)?!1:v.has(g)},OrdinaryDefineOwnMetadata:F,OrdinaryHasOwnMetadata:k,OrdinaryGetOwnMetadata:I,OrdinaryOwnMetadataKeys:C,OrdinaryDeleteMetadata:p};return oe.registerProvider(u),u;function d(h,g,v){var E=l.get(h),T=!1;if(S(E)){if(!v)return;E=new O,l.set(h,E),T=!0}var A=E.get(g);if(S(A)){if(!v)return;if(A=new O,E.set(g,A),!a.setProvider(h,g,u))throw E.delete(g),T&&l.delete(h),new Error("Wrong provider for target.")}return A}function k(h,g,v){var E=d(g,v,!1);return S(E)?!1:dt(E.has(h))}function I(h,g,v){var E=d(g,v,!1);if(!S(E))return E.get(h)}function F(h,g,v,E){var T=d(v,E,!0);T.set(h,g)}function C(h,g){var v=[],E=d(h,g,!1);if(S(E))return v;for(var T=E.keys(),A=gt(T),U=0;;){var wt=vt(A);if(!wt)return v.length=U,v;var Dn=yt(wt);try{v[U]=Dn}catch(Mn){try{bt(A)}finally{throw Mn}}U++}}function p(h,g,v){var E=d(g,v,!1);if(S(E)||!E.delete(h))return!1;if(E.size===0){var T=l.get(g);S(T)||(T.delete(v),T.size===0&&l.delete(T))}return!0}}function Rn(a){var l=a.defineMetadata,u=a.hasOwnMetadata,d=a.getOwnMetadata,k=a.getOwnMetadataKeys,I=a.deleteMetadata,F=new N,C={isProviderFor:function(p,h){var g=F.get(p);return!S(g)&&g.has(h)?!0:k(p,h).length?(S(g)&&(g=new $,F.set(p,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:l,OrdinaryHasOwnMetadata:u,OrdinaryGetOwnMetadata:d,OrdinaryOwnMetadataKeys:k,OrdinaryDeleteMetadata:I};return C}function he(a,l,u){var d=oe.getProvider(a,l);if(!S(d))return d;if(u){if(oe.setProvider(a,l,ne))return ne;throw new Error("Illegal state.")}}function xn(){var a={},l=[],u=(function(){function C(p,h,g){this._index=0,this._keys=p,this._values=h,this._selector=g}return C.prototype["@@iterator"]=function(){return this},C.prototype[s]=function(){return this},C.prototype.next=function(){var p=this._index;if(p>=0&&p<this._keys.length){var h=this._selector(this._keys[p],this._values[p]);return p+1>=this._keys.length?(this._index=-1,this._keys=l,this._values=l):this._index++,{value:h,done:!1}}return{value:void 0,done:!0}},C.prototype.throw=function(p){throw this._index>=0&&(this._index=-1,this._keys=l,this._values=l),p},C.prototype.return=function(p){return this._index>=0&&(this._index=-1,this._keys=l,this._values=l),{value:p,done:!0}},C})(),d=(function(){function C(){this._keys=[],this._values=[],this._cacheKey=a,this._cacheIndex=-2}return Object.defineProperty(C.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),C.prototype.has=function(p){return this._find(p,!1)>=0},C.prototype.get=function(p){var h=this._find(p,!1);return h>=0?this._values[h]:void 0},C.prototype.set=function(p,h){var g=this._find(p,!0);return this._values[g]=h,this},C.prototype.delete=function(p){var h=this._find(p,!1);if(h>=0){for(var g=this._keys.length,v=h+1;v<g;v++)this._keys[v-1]=this._keys[v],this._values[v-1]=this._values[v];return this._keys.length--,this._values.length--,Le(p,this._cacheKey)&&(this._cacheKey=a,this._cacheIndex=-2),!0}return!1},C.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=a,this._cacheIndex=-2},C.prototype.keys=function(){return new u(this._keys,this._values,k)},C.prototype.values=function(){return new u(this._keys,this._values,I)},C.prototype.entries=function(){return new u(this._keys,this._values,F)},C.prototype["@@iterator"]=function(){return this.entries()},C.prototype[s]=function(){return this.entries()},C.prototype._find=function(p,h){if(!Le(this._cacheKey,p)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if(Le(this._keys[g],p)){this._cacheIndex=g;break}}return this._cacheIndex<0&&h&&(this._cacheIndex=this._keys.length,this._keys.push(p),this._values.push(void 0)),this._cacheIndex},C})();return d;function k(C,p){return C}function I(C,p){return p}function F(C,p){return[C,p]}}function On(){var a=(function(){function l(){this._map=new O}return Object.defineProperty(l.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),l.prototype.has=function(u){return this._map.has(u)},l.prototype.add=function(u){return this._map.set(u,u),this},l.prototype.delete=function(u){return this._map.delete(u)},l.prototype.clear=function(){this._map.clear()},l.prototype.keys=function(){return this._map.keys()},l.prototype.values=function(){return this._map.keys()},l.prototype.entries=function(){return this._map.entries()},l.prototype["@@iterator"]=function(){return this.keys()},l.prototype[s]=function(){return this.keys()},l})();return a}function Tn(){var a=16,l=w.create(),u=d();return(function(){function p(){this._key=d()}return p.prototype.has=function(h){var g=k(h,!1);return g!==void 0?w.has(g,this._key):!1},p.prototype.get=function(h){var g=k(h,!1);return g!==void 0?w.get(g,this._key):void 0},p.prototype.set=function(h,g){var v=k(h,!0);return v[this._key]=g,this},p.prototype.delete=function(h){var g=k(h,!1);return g!==void 0?delete g[this._key]:!1},p.prototype.clear=function(){this._key=d()},p})();function d(){var p;do p="@@WeakMap@@"+C();while(w.has(l,p));return l[p]=!0,p}function k(p,h){if(!t.call(p,u)){if(!h)return;Object.defineProperty(p,u,{value:w.create()})}return p[u]}function I(p,h){for(var g=0;g<h;++g)p[g]=Math.random()*255|0;return p}function F(p){if(typeof Uint8Array=="function"){var h=new Uint8Array(p);return typeof crypto<"u"?crypto.getRandomValues(h):typeof msCrypto<"u"?msCrypto.getRandomValues(h):I(h,p),h}return I(new Array(p),p)}function C(){var p=F(a);p[6]=p[6]&79|64,p[8]=p[8]&191|128;for(var h="",g=0;g<a;++g){var v=p[g];(g===4||g===6||g===8)&&(h+="-"),v<16&&(h+="0"),h+=v.toString(16).toLowerCase()}return h}}function ze(a){return a.__=void 0,delete a.__,a}})})(en||(en={}))});var kr={};Bn(kr,{main:()=>un});module.exports=$n(kr);var H=class extends Error{constructor(n,t,o){super(n);this.code=t;this.hint=o;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}},tn=class extends H{constructor(e,n){super(e,"RUNTIME_CONFIG_ERROR",n),this.name="RuntimeConfigError"}},nn=class extends H{constructor(e,n){super(e,"RUNTIME_BUILD_ERROR",n),this.name="RuntimeBuildError"}},et=class extends H{constructor(e,n){super(e,"RUNTIME_DEPLOYMENT_ERROR",n),this.name="RuntimeDeploymentError"}},rn=class extends et{constructor(e,n){super(e,n),this.name="DeploymentError"}},on=class extends H{constructor(e,n){super(e,"RUNTIME_VALIDATION_ERROR",n),this.name="RuntimeValidationError"}},ee=class extends H{constructor(n,t,o,i,s,c,f){super(n,"RUNTIME_TEMPLATE_ERROR",f);this.templateName=t;this.coreDir=o;this.searchedPaths=i;this.packageContext=s;this.resolutionStrategy=c;this.name="RuntimeTemplateError"}},de=class extends H{constructor(n,t,o,i){super(n,"RUNTIME_TEMPLATE_STRUCTURE_ERROR",i);this.templateDir=t;this.validationErrors=o;this.name="RuntimeTemplateStructureError"}},Ie=class{formatError(e,n=!1){let t=[];return t.push(`Error: ${e.name||"RuntimeError"}`),t.push(""),t.push(`Message: ${e.message}`),t.push(""),e instanceof H&&e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&e.stack&&(t.push("--- Stack Trace (--verbose) ---"),t.push(e.stack),t.push("")),t.join(`
|
|
8
|
+
`)}formatValidationError(e,n,t=!1){let o=[];return o.push("Validation Error"),o.push(""),o.push(`Field: ${e}`),o.push(`Issue: ${n}`),o.push(""),t&&(o.push("--- Technical Details (--verbose) ---"),o.push(`Field validation failed for: ${e}`),o.push(`Validation message: ${n}`),o.push("")),o.join(`
|
|
9
|
+
`)}formatDeploymentError(e,n,t,o=!1){let i=[];return i.push("Deployment Error"),i.push(""),i.push(`Stack: ${e}`),i.push(`Operation: ${n}`),i.push(`Issue: ${t}`),i.push(""),i.push("Troubleshooting:"),i.push("1. Check AWS credentials and permissions"),i.push("2. Verify stack configuration"),i.push("3. Review CloudFormation events in AWS Console"),i.push(""),o&&(i.push("--- Technical Details (--verbose) ---"),i.push(`Stack name: ${e}`),i.push(`Failed operation: ${n}`),i.push(`Error details: ${t}`),i.push("")),i.join(`
|
|
10
|
+
`)}formatTemplateError(e,n=!1){let t=[];return t.push("Runtime Template Error"),t.push(""),t.push(`Issue: ${e.message}`),t.push(""),e.templateName&&t.push(`Template: ${e.templateName}`),e.coreDir&&t.push(`Core Directory: ${e.coreDir}`),e.packageContext&&t.push(`Package Context: ${e.packageContext}`),e.resolutionStrategy&&t.push(`Resolution Strategy: ${e.resolutionStrategy}`),t.push(""),e.searchedPaths&&e.searchedPaths.length>0&&(t.push("Searched Paths:"),e.searchedPaths.forEach(o=>{t.push(` - ${o}`)}),t.push("")),t.push("Troubleshooting:"),t.push("1. Ensure @worktif/runtime package is properly installed"),t.push("2. Verify the package contains src/bin/templates/runtime-web/ directory"),t.push("3. Check that runtime-web directory contains template subdirectories"),t.push("4. If running from source, ensure you're in the runtime package directory"),t.push("5. Try reinstalling the runtime package: npm install @worktif/runtime"),t.push(""),e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&(t.push("--- Technical Details (--verbose) ---"),t.push(`Error code: ${e.code}`),e.stack&&(t.push("Stack trace:"),t.push(e.stack)),t.push("")),t.join(`
|
|
11
|
+
`)}formatTemplateStructureError(e,n=!1){let t=[];return t.push("Runtime Template Structure Error"),t.push(""),t.push(`Issue: ${e.message}`),t.push(""),e.templateDir&&(t.push(`Template Directory: ${e.templateDir}`),t.push("")),e.validationErrors&&e.validationErrors.length>0&&(t.push("Validation Errors:"),e.validationErrors.forEach(o=>{t.push(` - ${o}`)}),t.push("")),t.push("Troubleshooting:"),t.push("1. Verify the runtime package installation is complete"),t.push("2. Check that src/bin/templates/runtime-web/ exists in the package"),t.push("3. Ensure template directories contain the required files"),t.push("4. Try reinstalling: npm install @worktif/runtime"),t.push("5. If developing locally, ensure templates are built correctly"),t.push(""),e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&(t.push("--- Technical Details (--verbose) ---"),t.push(`Error code: ${e.code}`),e.stack&&(t.push("Stack trace:"),t.push(e.stack)),t.push("")),t.join(`
|
|
12
|
+
`)}},sn=class{constructor(e=!1){this.verbose=e}info(e,n){let t={level:"info",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.log(JSON.stringify(t,null,2)):console.log(e)}warn(e,n){let t={level:"warn",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.warn(JSON.stringify(t,null,2)):console.warn(`Warning: ${e}`)}error(e,n){let t={level:"error",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.error(JSON.stringify(t,null,2)):console.error(`Error: ${e}`)}debug(e,n){if(!this.verbose)return;let t={level:"debug",message:e,timestamp:new Date().toISOString(),...n};console.debug(JSON.stringify(t,null,2))}};var D=B(require("fs")),P=B(require("path")),an=require("@worktif/purenow/bin"),be=class extends an.TemplateService{constructor(e=process.cwd()){super(e),this.runtimeTemplatesDir=this.resolveRuntimeTemplateDirectory()}async scaffold(e,n,t,o="runtime-web"){let i=this.validateTemplateStructure(o);if(!i.valid)throw new de("Runtime template directory validation failed",this.runtimeTemplatesDir,i.errors,"Ensure the runtime package is properly installed and contains the expected template structure");let s=P.join(this.runtimeTemplatesDir,o,e);if(!D.existsSync(s)){let b=this.getAvailableTemplates(o),w=this.getTemplateResolutionInfo();throw new ee(`Runtime template '${e}' not found`,e,o,[s],w.packageContext||"unknown",w.resolutionStrategy,b.length>0?`Available templates: ${b.join(", ")}. Try: runtime init <project-name> --template ${b[0]}`:`No templates found in '${o}'. The runtime package may not be properly installed.`)}if(D.readdirSync(s).length===0){let b=this.getTemplateResolutionInfo();throw new ee(`Runtime template '${e}' directory is empty`,e,o,[s],b.packageContext||"unknown",b.resolutionStrategy,"This indicates a corrupted or incomplete template installation. Try reinstalling the runtime package.")}let f=this.templatesDir;this.templatesDir=this.runtimeTemplatesDir;try{let b=this.copyTemplateFiles;this.copyTemplateFiles=async(w,R,O)=>{let $={...O,packageVersion:this.getRuntimePackageVersion(),PURENOW_VERSION:this.getRuntimePackageVersion(),STACK_NAME:O.projectName,PROJECT_NAME:O.projectName,REGION:"us-east-1",ENABLE_SEO:"false",STAGE:"dev"};return b.call(this,w,R,$)},await super.scaffold(e,n,t,o)}finally{this.templatesDir=f}}resolveRuntimeTemplateDirectory(){let e=[],n=[],t=this.detectRuntimePackageRoot();if(t){let w=P.join(t,"src","bin","templates");e.push(w),n.push({path:w,strategy:"package.json detection",valid:this.validateTemplateDirectory(w)})}let o=this.getModuleBasedPaths();for(let w of o)e.push(w),n.push({path:w,strategy:"module location",valid:this.validateTemplateDirectory(w)});let i=this.getNodeModulePaths();for(let w of i)e.push(w),n.push({path:w,strategy:"node_modules resolution",valid:this.validateTemplateDirectory(w)});let s=this.getEnvironmentBasedPaths();for(let w of s)e.push(w),n.push({path:w,strategy:"environment detection",valid:this.validateTemplateDirectory(w)});let c=n.find(w=>w.valid);if(c)return c.path;let f=n.map(w=>w.path),b=this.detectRuntimePackageRoot();throw new ee("Runtime templates directory not found",void 0,"runtime-web",f,b||"unknown","comprehensive search","Ensure @worktif/runtime package is properly installed with template directory structure")}detectRuntimePackageRoot(){let e=__dirname;for(;e!==P.dirname(e);){let n=P.join(e,"package.json");if(D.existsSync(n))try{if(JSON.parse(D.readFileSync(n,"utf-8")).name==="@worktif/runtime")return e}catch{}e=P.dirname(e)}return null}getModuleBasedPaths(){return[P.join(__dirname,"templates"),P.join(__dirname,"..","templates"),P.join(__dirname,"..","..","bin","templates"),P.join(__dirname,"..","..","..","src","bin","templates")]}getNodeModulePaths(){let e=[];try{let n=require.resolve("@worktif/runtime/package.json"),t=P.dirname(n);e.push(P.join(t,"src","bin","templates")),e.push(P.join(t,"out","dist","bin","templates"))}catch{}return e}getEnvironmentBasedPaths(){let e=[];if(process.argv[1]){let n=P.dirname(process.argv[1]);e.push(P.join(n,"templates")),e.push(P.join(n,"..","templates"))}return e.push(P.join(process.cwd(),"src","bin","templates")),e.push(P.join(process.cwd(),"node_modules","@worktif","runtime","src","bin","templates")),e}validateTemplateDirectory(e){try{if(!D.existsSync(e)||!D.statSync(e).isDirectory())return!1;let t=P.join(e,"runtime-web");return!D.existsSync(t)||!D.statSync(t).isDirectory()?!1:D.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name).length>0}catch{return!1}}getAvailableTemplates(e){try{let n=P.join(this.runtimeTemplatesDir,e);return D.existsSync(n)?D.readdirSync(n,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name):[]}catch{return[]}}validateRuntimeTemplates(){try{return this.validateTemplateDirectory(this.runtimeTemplatesDir)}catch{return!1}}validateTemplateStructure(e="runtime-web"){let n=[];try{if(!D.existsSync(this.runtimeTemplatesDir))return n.push(`Templates directory does not exist: ${this.runtimeTemplatesDir}`),{valid:!1,errors:n};let t=P.join(this.runtimeTemplatesDir,e);if(!D.existsSync(t))return n.push(`Core directory does not exist: ${t}`),{valid:!1,errors:n};if(!D.statSync(t).isDirectory())return n.push(`Core path is not a directory: ${t}`),{valid:!1,errors:n};let i=D.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);if(i.length===0)return n.push(`No template directories found in: ${t}`),{valid:!1,errors:n};for(let s of i){let c=P.join(t,s);D.readdirSync(c).length===0&&n.push(`Template directory is empty: ${c}`)}return{valid:n.length===0,errors:n}}catch(t){return n.push(`Validation error: ${t instanceof Error?t.message:String(t)}`),{valid:!1,errors:n}}}getRuntimeTemplatesDirectory(){return this.runtimeTemplatesDir}getRuntimePackageVersion(){try{let e=this.detectRuntimePackageRoot();if(e){let n=P.join(e,"package.json");if(D.existsSync(n))return JSON.parse(D.readFileSync(n,"utf-8")).version||"0.3.0"}try{let n=require.resolve("@worktif/runtime/package.json");return JSON.parse(D.readFileSync(n,"utf-8")).version||"0.3.0"}catch{return"0.3.0"}}catch{return"0.3.0"}}getTemplateResolutionInfo(){let e=this.detectRuntimePackageRoot(),n="unknown";e&&this.runtimeTemplatesDir.includes(e)?n="package.json detection":this.runtimeTemplatesDir.includes("node_modules")?n="node_modules resolution":this.runtimeTemplatesDir.includes(__dirname)?n="module location":n="environment detection";let t=[];try{D.existsSync(this.runtimeTemplatesDir)&&t.push(...D.readdirSync(this.runtimeTemplatesDir,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name))}catch{}return{runtimeTemplatesDir:this.runtimeTemplatesDir,isValid:this.validateRuntimeTemplates(),availableCores:t,packageContext:e,resolutionStrategy:n}}};function we(r){if(!r||typeof r!="string")throw new Error("Stack name must be a non-empty string");let e=r.replace(/[^a-zA-Z0-9-]/g,"-");return/^[a-zA-Z]/.test(e)||(e="stack-"+e),e=e.replace(/-+/g,"-"),e=e.replace(/-+$/,""),e.length>128&&(e=e.substring(0,128).replace(/-+$/,"")),e||(e="stack"),e}var Be=B(require("fs")),Y=require("@worktif/purenow/bin"),Ae=class extends Y.StacksDeployService{constructor(n=process.cwd()){super(n);this.cwd=n;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(n,t){let{stage:o,config:i}=n,s=we(`${n.config.projectName}-PurenowInfra-${o}`),c=we(`${n.config.projectName}-PurenowRuntime-${o}`),f=we(`${n.config.projectName}-RuntimeWeb-${o}`);if(!(0,Y.getStage)(i,o))throw new Y.DeploymentError(`Stage '${o}' not found in configuration`,`Available stages: ${i.stages.map(N=>N.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let w=await this.deployCdkStack(s,o,i);if(!w.success)throw new Y.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let R=await this.deployCdkStack(c,o,i);if(!R.success)throw new Y.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let O=await this.deployCdkStack(f,o,i);if(!O.success)throw new Y.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let $=Date.now()-t;return{success:!0,infraStack:w,runtimeStack:R,runtimeWebStack:O,duration:$}}parseStackOutputs(n,t){let o=super.parseStackOutputs(n,t);if(!Be.existsSync(t))return o;try{let i=Be.readFileSync(t,"utf-8"),c=JSON.parse(i)[n];c&&(o.lambdaArnList=Object.keys(c).filter(f=>f.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(f=>c[f]))}catch(i){console.warn(`Failed to parse outputs file for ${n}: ${i instanceof Error?i.message:String(i)}`)}return o}getRegionSignature(n){return n?n.split("-").filter(Boolean).map(t=>t[0]??"").join(""):""}resourceName({name:n,serviceName:t,stage:o,region:i}){let s=we(this.getRegionSignature(i||"us-east-1"));return`${t}-${n}-${s}-${o}`}};var Hr=B(je()),x=B(ve()),$e=B(require("process")),M=require("@worktif/purenow/bin"),ke=class extends M.DeploymentService{async deployCommand(e,n,t,o,i=$e.default.cwd(),s){try{if(s)try{if(s.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(_){if(_ instanceof Error){let ne=new M.FriendlyErrorFormatter().formatMissingCredentialsError(["AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY"],!1);console.error(ne),$e.default.exit(1)}throw _}let c=n.stage||$e.default.env.STAGE||t.stages[0]?.name||"dev",f=(0,M.getStage)(t,c);if(!f)throw new M.DeploymentError(`Stage '${c}' not found in configuration`,`Available stages: ${t.stages.map(_=>_.name).join(", ")}
|
|
13
|
+
Update your purenow.config.ts to add this stage.`);(0,M.buildStaticHtml)(),o.info(x.default.bold(`Deploying to AWS (stage: ${x.default.cyan(c)})...`)),console.log();let b=new M.DeployService(i),w=new M.BuildService(i),R=new M.CdkBootstrapService(o),O=await(0,M.detectAndValidateCredentials)(o),$=f.awsRegion??O.region??"us-east-1";await this.validateCredentials(b,f,o),await this.ensureBootstrapped(R,t,f,O,o,i),await this.performPreDeploymentValidation(c,t,n,o,i);let N=await this.executeStacksDeployment(e,c,t,o,n.skipBuild,n.verbose);return await this.clearS3CacheDeployment(N.infraStack,t,$,o),await this.uploadReactBundle(N.infraStack,t,$,o,i),await this.uploadPublicAssets(N.infraStack,t,$,o,i),await this.invalidateCloudFrontCache(N.runtimeWebStack,t,$,o),await this.injectApiGatewayUrl(N.runtimeWebStack,t,o,i),this.displayStacksDeploymentSummary(N,o),{success:!0,exitCode:0}}catch(c){return c instanceof M.DeploymentError||c instanceof M.BuildError?(o.error(c.message),c.hint&&(console.log(),o.info(x.default.dim(c.hint)))):c instanceof M.BootstrapCredentialsError||c instanceof M.BootstrapRegionError||o.error(c instanceof Error?c.message:String(c)),{success:!1,error:c instanceof Error?c:new Error(String(c)),exitCode:1}}}displayStacksDeploymentSummary(e,n){super.displayStacksDeploymentSummary(e,n,{modified:!0}),console.log(),console.log(x.default.bold("Runtime Web Stack:")),console.log(x.default.dim(" "),x.default.cyan("Stack Name:"),x.default.white(e.runtimeWebStack.stackName)),console.log(x.default.dim(" "),x.default.cyan("Duration:"),x.default.white(this.formatDuration(e.runtimeWebStack.duration))),e.runtimeWebStack.outputs.apiGatewayUrl&&console.log(x.default.dim(" "),x.default.cyan("API Gateway:"),x.default.white(e.runtimeWebStack.outputs.apiGatewayUrl)),e.runtimeWebStack.outputs.lambdaArnList&&e.runtimeWebStack.outputs.lambdaArnList.length>0&&(console.log(x.default.dim(" "),x.default.cyan("Lambdas:"),x.default.white(e.runtimeWebStack.outputs.lambdaArnList.length)),e.runtimeWebStack.outputs.lambdaArnList.forEach((t,o)=>{console.log(x.default.dim(" "),x.default.cyan(" Lambda ARN:"),x.default.white(t))})),console.log(),console.log(x.default.bold("Deployment Info:")),console.log(x.default.dim(" "),x.default.cyan("Region:"),x.default.white(e.infraStack.region)),console.log(x.default.dim(" "),x.default.cyan("Stage:"),x.default.white(e.infraStack.stage)),console.log()}};var Se=B(require("fs")),re=B(require("path")),Z=B(ve()),J=require("@worktif/purenow/bin");function lr(r){return r==="lambda"||r==="cdk"||r==="all"}async function nt(r,e,n,t=process.cwd(),o){try{let i=r.target||"all";if(lr(i)&&o)try{if(o.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(b){b instanceof J.FriendlyEnvironmentError&&(n.warn("AWS credentials not configured"),console.log(),n.info(Z.default.dim("Building without AWS credentials. You will need to configure them before deployment.")),console.log())}(0,J.buildStaticHtml)();let s=new J.BuildService(t);n.info(Z.default.bold("Building Runtime application...")),console.log();let c,f=!1;return i==="all"?(f=Se.existsSync(re.join(t,"src/core/index.ts")),c=await cr(s,e,n)):c=await ur(s,i,e,n),f&&await fr(s,e,n),dr(c,t,n),{success:!0,exitCode:0}}catch(i){return i instanceof J.BuildError?(n.error(i.message),i.hint&&(console.log(),n.info(Z.default.dim(i.hint)))):n.error(i instanceof Error?i.message:String(i)),{success:!1,error:i instanceof Error?i:new Error(String(i)),exitCode:1}}}async function cr(r,e,n){let o=Se.existsSync(re.join(process.cwd(),"src/core/index.ts"))?["react","lambda","cdk"]:["react"],i=[];for(let s of o){let c=n.spinner(`Building ${s} bundle...`);c.start();let f=await r.buildTarget(s,e);if(i.push(f),f.success)c.succeed(`${Fe(s)} bundle (${tt(f.duration)})`);else throw c.fail(`${Fe(s)} bundle failed`),new J.BuildError(`Build failed for target '${s}'`,f.error?.message)}return i}async function ur(r,e,n,t){let o=t.spinner(`Building ${e} bundle...`);o.start();let i=await r.buildTarget(e,n);if(i.success)o.succeed(`${Fe(e)} bundle (${tt(i.duration)})`);else throw o.fail(`${Fe(e)} bundle failed`),new J.BuildError(`Build failed for target '${e}'`,i.error?.message);return[i]}async function fr(r,e,n){let t=n.spinner("Generating type declarations...");t.start();try{await r.generateTypes(e),t.succeed("Type declarations")}catch(o){throw t.fail("Type declarations failed"),o}}function dr(r,e,n){console.log();let t=r.reduce((o,i)=>o+i.duration,0);n.success(Z.default.bold(`Build complete in ${tt(t)}`)),console.log(),console.log(Z.default.bold("Artifacts:"));for(let o of r)if(o.success){let i=re.resolve(e,o.outputPath),s=pr(i),c=re.relative(e,i);console.log(Z.default.dim(" "),Z.default.white(c),Z.default.dim(`(${s})`))}console.log()}function pr(r){try{let e=Se.statSync(r);return mr(e.size)}catch{return"unknown"}}function mr(r){if(r===0)return"0 B";let e=1024,n=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(e));return`${(r/Math.pow(e,t)).toFixed(1)} ${n[t]}`}function tt(r){return r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`}function Fe(r){return r.charAt(0).toUpperCase()+r.slice(1)}var L=B(require("path")),ln=B(require("fs")),te=require("@worktif/purenow/bin"),m=B(ve());async function rt(r,e,n=process.cwd(),t){let o=e.spinner(r.cdk?"Initializing CDK infrastructure...":"Initializing Runtime project...");try{let i=new be(n),s=new te.PromptService;if(r.cdk&&!r.force&&i.cdkDirectoryExists(n))throw new te.ValidationError("CDK directory already exists","Use --force flag to overwrite existing CDK infrastructure");let c=r.dir||(r.cdk?"cdk":n),f=r.cdk?"cdk":r.template||"basic",b="runtime-web",w=r.force||!1,R=L.basename(L.resolve(n,r.cdk?n:c));if(!r.cdk&&!w){let O=L.resolve(n,c),$=await br(O);if($.length>0){if(console.log(),e.warn("Existing project files detected:"),$.forEach(_=>{console.log(m.default.dim(` - ${_}`))}),console.log(),!await s.confirm("Do you want to overwrite these files?",!1))return console.log(),e.info("Project initialization cancelled. Existing files preserved."),console.log(),{success:!0,exitCode:0};w=!0}}if(o.start(),await i.scaffold(f,c,{projectName:R,force:w},b),o.succeed(r.cdk?"CDK infrastructure initialized successfully!":"Runtime project initialized successfully!"),r.cdk){if(gr(e,R,c,n),t){let O=L.resolve(n,c);await vr(e,t,O)}}else hr(e,R,c,n),await new te.PromptService().confirm("Do you want to initialize AWS CDK infrastructure for this project now?",!0)?(await yr(e,R,L.resolve(n,c),b,i,t)).success||(e.warn("CDK initialization failed, but your Runtime project was created successfully."),e.info("You can initialize CDK later by running: npm install && runtime init --cdk")):(console.log(),e.info("You can initialize CDK later by running: npm install && runtime init --cdk"),console.log());return{success:!0,exitCode:0}}catch(i){return o.fail(r.cdk?"Failed to initialize CDK infrastructure":"Failed to initialize Runtime project"),i instanceof te.ValidationError?(e.error(i.message),i.hint&&e.info(m.default.dim(i.hint))):e.error(i instanceof Error?i.message:String(i)),{success:!1,error:i instanceof Error?i:new Error(String(i)),exitCode:1}}}function hr(r,e,n,t){let o=L.resolve(t,n),i=o===t;console.log(),r.success(m.default.bold(`Runtime project '${e}' created successfully!`)),console.log(),console.log(m.default.bold("Project structure:")),console.log(m.default.dim(" \u251C\u2500\u2500 src/")),console.log(m.default.dim(" \u2502 \u251C\u2500\u2500 index.tsx # React app entry")),console.log(m.default.dim(" \u2502 \u251C\u2500\u2500 App.tsx # Root component")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 routes.tsx # React Router routes")),console.log(m.default.dim(" \u251C\u2500\u2500 public/")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 index.html")),console.log(m.default.dim(" \u251C\u2500\u2500 runtime.config.ts # Runtime configuration")),console.log(m.default.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(m.default.dim(" \u2514\u2500\u2500 package.json")),console.log(),console.log(m.default.bold("Next steps:")),console.log(),i||console.log(m.default.cyan(` cd ${L.relative(t,o)}`)),console.log(),console.log(m.default.bold("Development:")),console.log(),console.log(m.default.cyan(" npx runtime dev")),console.log(m.default.dim(" # Start local development server")),console.log(),console.log(m.default.bold("Build & Deploy:")),console.log(),console.log(m.default.cyan(" npx runtime build")),console.log(m.default.dim(" # Build all targets (React, Lambda, CDK)")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.dim(" # Deploy to AWS")),console.log(),console.log(m.default.bold("\u{1F4DA} Learn more:")),console.log(m.default.dim(" https://runtimeweb.com/docs")),console.log()}function gr(r,e,n,t){let o=L.resolve(t,n),i=L.relative(t,o);console.log(),r.success(m.default.bold(`CDK infrastructure for '${e}' created successfully!`)),console.log(),console.log(m.default.bold("CDK structure:")),console.log(m.default.dim(" cdk/")),console.log(m.default.dim(" \u251C\u2500\u2500 bin/")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 app.ts # CDK app entry point")),console.log(m.default.dim(" \u251C\u2500\u2500 cdk.json # CDK configuration")),console.log(m.default.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(m.default.dim(" \u2514\u2500\u2500 .env.example # Environment variables template")),console.log(),console.log(m.default.bold("Ready to deploy:")),console.log(),console.log(m.default.cyan(` cd ${i}`)),console.log(m.default.dim(" # All dependencies are already installed")),console.log(),console.log(m.default.bold("Deploy to AWS:")),console.log(),console.log(m.default.cyan(" npx runtime init --cdk")),console.log(m.default.dim(" # Bootstrap CDK (only needed once per account/region)")),console.log(),console.log(m.default.cyan(" cdk diff")),console.log(m.default.dim(" # Preview changes before deploying")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.dim(" # Deploy your infrastructure")),console.log(),console.log(m.default.bold("\u{1F3AF} Deploy to different stages:")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.cyan(" npx runtime deploy --stage staging")),console.log(m.default.cyan(" npx runtime deploy --stage prod")),console.log(),console.log(m.default.bold("\u{1F4DA} Learn more:")),console.log(m.default.dim(" Runtime CDK: https://runtimeweb.com/docs/cdk")),console.log(m.default.dim(" AWS CDK: https://docs.aws.amazon.com/cdk/")),console.log()}async function yr(r,e,n,t,o,i){let{PromptService:s,PackageManagerService:c,CdkInitService:f,AwsCredentialsDetector:b,AwsRegionResolver:w}=await import("@worktif/purenow/bin"),R=new s,O=new c,$=new f(o,O,r),N=new b;try{console.log();let _=await $.checkCdkDirectoryExists(n);if(_&&!await R.confirm("A /cdk folder already exists. Overwrite it?",!1))return console.log(),r.info("Existing CDK setup preserved."),console.log(),{success:!0,exitCode:0};let ne=await new w().resolveRegion(),Ee=ne.region||w.getDefaultRegion();r.debug(`Resolved AWS region: ${Ee} (source: ${ne.source})`);let ie={projectName:e,stage:"dev",region:Ee,enableSeo:!0},Re=O.detectPackageManager(n);r.info(`Using package manager: ${m.default.cyan(Re)}`),console.log();let me=r.spinner("Initializing CDK infrastructure...");me.start();let X=await $.initializeCdk({projectDir:n,projectName:ie.projectName,stage:ie.stage,region:ie.region,enableSeo:ie.enableSeo,overwriteExisting:_,runBootstrap:!1,packageManager:Re},t);return X.success?(me.succeed("CDK infrastructure initialized successfully!"),X.projectDependenciesInstalled&&r.info(m.default.green("\u2713 Project dependencies installed")),X.cdkDependenciesInstalled&&r.info(m.default.green("\u2713 CDK dependencies installed")),{success:!0,exitCode:0}):(me.fail("Failed to initialize CDK infrastructure"),X.error&&r.error(X.error.message),{success:!1,error:X.error,exitCode:1})}catch(_){return r.error(_ instanceof Error?_.message:String(_)),{success:!1,error:_ instanceof Error?_:new Error(String(_)),exitCode:1}}}async function vr(r,e,n){console.log();try{if(!e.getConfig().isAwsCredentialsDump())r.info(m.default.green("\u2713 AWS credentials detected")),console.log(),r.info("Your CDK infrastructure is ready. You can now:"),console.log(),console.log(m.default.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(m.default.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();else{(0,te.logCredentialsError)(r);return}}catch(t){if(t instanceof Error){r.warn(m.default.yellow("! AWS credentials not configured.")),console.log(),r.info("CDK infrastructure files were created successfully in /cdk"),r.info("However, AWS credentials are required for deployment."),console.log(),r.info("Please configure AWS credentials before deploying:"),console.log(),console.log(m.default.bold("Option 1: AWS CLI (Recommended)")),console.log(m.default.dim(" $ aws configure")),console.log(),console.log(m.default.bold("Option 2: Environment Variables")),console.log(m.default.dim(" $ export AWS_ACCESS_KEY_ID=your_key_id")),console.log(m.default.dim(" $ export AWS_SECRET_ACCESS_KEY=your_secret_key")),console.log(m.default.dim(" $ export AWS_REGION=us-east-1")),console.log(),console.log(m.default.bold("Option 3: AWS Profile")),console.log(m.default.dim(" $ export AWS_PROFILE=your_profile_name")),console.log(),r.info("After configuring credentials, you can deploy by running:"),console.log(),console.log(m.default.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(m.default.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();return}throw t}}async function br(r){let e=[],n=["package.json","node_modules","src/index.tsx","src/App.tsx","runtime.config.ts","purenow.config.ts","tsconfig.json"];for(let t of n){let o=L.join(r,t);try{await ln.promises.access(o),e.push(t)}catch{}}return e}var Eo=B(je());var Do=B(je()),G=B(require("process")),We=require("@worktif/purenow/bin"),Ce=class r extends We.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:r.defaultToolName,helperToolName:"Runtime Web",title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,We.purenowCommandConfig)(r.defaultToolName),this.addBuildCommands()}addBuildCommands(){let e=[{name:"build:browser",target:"react",desc:"Build browser bundle (ESM)"},{name:"build:lambda",target:"lambda",desc:"Build Lambda bundle (CommonJS)"},{name:"build:lib",target:"lib",desc:"Build library bundle (CommonJS)"},{name:"build:lib-esm",target:"lib-esm",desc:"Build library bundle (ESM)"},{name:"build:infra",target:"infra",desc:"Build infrastructure bundle"},{name:"build:cli",target:"cli",desc:"Build CLI bundle"},{name:"build:bin",target:"bin",desc:"Build bin utilities bundle"},{name:"build:cdk",target:"cdk",desc:"Build CDK application bundle"}];for(let{name:n,target:t,desc:o}of e)this.program.command(n).description(o).option("--dev","Enable development mode",!1).option("--skip-validation","Skip bundle validation",!1).option("-v, --verbose","Enable verbose output",!1).action(async i=>{try{await nt({target:t},{},console)}catch(s){console.error(`${n} failed:`,s instanceof Error?s.message:String(s)),G.default.exit(1)}});this.program.command("dev:validate").description("Start development mode bundle validation with real-time feedback").option("-t, --targets <targets>","Comma-separated list of targets to validate","react,lambda").option("--no-watch","Disable file watching",!1).option("--interval <ms>","Validation interval in milliseconds","5000").option("--no-immediate","Skip immediate validation on startup",!1).option("-v, --verbose","Enable verbose output",!1).action(async n=>{try{let o={targets:n.targets.split(",").map(i=>i.trim()),watch:n.watch,interval:parseInt(n.interval,10),immediate:n.immediate,verbose:n.verbose};console.log("Dev validation not implemented yet")}catch(t){console.error("Development validation failed:",t instanceof Error?t.message:String(t)),G.default.exit(1)}})}async createContext(e,n=G.default.cwd()){let t=await super.createContext({...e,config:e.config??"runtime.config.ts"},n),o=new Ae(n);return{...t,stacksDeployService:o}}async deployCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let s=await new ke().deployCommand(o.stacksDeployService,e,o.config,o.logger,o.cwd,o.envValidator);s.success||G.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),G.default.exit(1)}}async initCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let s=await rt(e,o.logger,o.cwd,o.envValidator);s.success||G.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),G.default.exit(1)}}async destroyCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let{destroyCommand:i}=await import("@worktif/purenow/bin"),s=await i({...e,backupDir:"./.runtime-backups"},o.logger,o.cwd);s.success||G.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),G.default.exit(1)}}async run(e){await this.program.parseAsync(e||G.default.argv)}static handleError(e){let n=new Ie,t=!!G.default.env.DEBUG;if(e instanceof ee){let o=n.formatTemplateError(e,t);console.error(o)}else if(e instanceof de){let o=n.formatTemplateStructureError(e,t);console.error(o)}else if(e instanceof Error){let o=n.formatError(e,t);console.error(o)}else console.error("Unknown error:",String(e));G.default.exit(1)}};function cn(){return new Ce}var pe=B(ve()),q=B(require("process"));async function un(){try{await cn().run()}catch(r){Ce.handleError(r)}}function Lo(r){r instanceof Error?(console.error(pe.default.red("\u2717"),"Error:",r.message),q.default.env.DEBUG&&console.error(r.stack)):console.error(pe.default.red("\u2717"),"Unknown error:",String(r)),q.default.exit(1)}function wr(){q.default.on("uncaughtException",r=>{console.error(pe.default.red("\u2717"),"Uncaught exception:",r.message),q.default.env.DEBUG&&console.error(r.stack),q.default.exit(1)}),q.default.on("unhandledRejection",r=>{console.error(pe.default.red("\u2717"),"Unhandled rejection:",r),q.default.env.DEBUG&&r instanceof Error&&console.error(r.stack),q.default.exit(1)})}wr(),un().catch(r=>{console.error(pe.default.red("\u2717"),"Fatal error:",r.message),q.default.env.DEBUG&&console.error(r.stack),q.default.exit(1)});0&&(module.exports={main});
|
|
13
14
|
/*! Bundled license information:
|
|
14
15
|
|
|
15
16
|
reflect-metadata/Reflect.js:
|
|
@@ -28,4 +29,4 @@ reflect-metadata/Reflect.js:
|
|
|
28
29
|
and limitations under the License.
|
|
29
30
|
***************************************************************************** *)
|
|
30
31
|
*/
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnVuaXgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS92ZW5kb3IvYW5zaS1zdHlsZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS92ZW5kb3Ivc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS91dGlsaXRpZXMuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL3V0aWxzL2Vycm9ycy50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3RlbXBsYXRlLnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3N0YWNrLW5hbWUtc2FuaXRpemVyLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvcHVyZW5vdy1ydW50aW1lLXN0YWNrcy1kZXBsb3kuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL3J1bnRpbWUtd2ViLWRlcGxveW1lbnQuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2J1aWxkLmNvbW1hbmQudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9jb21tYW5kcy9pbml0LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9ydW50aW1lLXdlYi1jbGkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgXHUwMEE3IDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBjb25zdCBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVJ1bnRpbWVDbGksIFJ1bnRpbWVXZWJDbGkgfSBmcm9tICdAYmluL3J1bnRpbWUtd2ViLWNsaSc7XG5cbi8qKlxuICogTWFpbiBDTEkgZW50cnkgcG9pbnQgd2l0aCBydW50aW1lLXdlYiBleHRlbnNpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbiAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG5cbiAgICAvLyBQYXJzZSBhbmQgZXhlY3V0ZSBDTEkgY29tbWFuZHNcbiAgICBhd2FpdCBjbGkucnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQHRvZG86IHRlc3QgdGhpcyBjdXN0b20gZm9ybWF0dGVyIHNvbHV0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRvIG9yaWdpbmFsXG4gICAgUnVudGltZVdlYkNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgZXJyb3JzIHdpdGggZm9ybWF0dGVkIG91dHB1dFxuICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogdW5rbm93bik6IG5ldmVyIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdFcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmtub3duIGVycm9yOicsIFN0cmluZyhlcnJvcikpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBnbG9iYWwgZXJyb3IgaGFuZGxlcnMgZm9yIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcbiAqL1xuZnVuY3Rpb24gc2V0dXBHbG9iYWxFcnJvckhhbmRsZXJzKCkge1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmNhdWdodCBleGNlcHRpb246JywgZXJyb3IubWVzc2FnZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmhhbmRsZWQgcmVqZWN0aW9uOicsIHJlYXNvbik7XG4gICAgaWYgKHByb2Nlc3MuZW52LkRFQlVHICYmIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHJlYXNvbi5zdGFjayk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG5cbi8vIFNldHVwIGVycm9yIGhhbmRsZXJzXG5zZXR1cEdsb2JhbEVycm9ySGFuZGxlcnMoKTtcblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdGYXRhbCBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4vLyB9XG4iLCAiY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG5jb25zdCBzdHlsZXMgPSB7XG5cdG1vZGlmaWVyOiB7XG5cdFx0cmVzZXQ6IFswLCAwXSxcblx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0Ym9sZDogWzEsIDIyXSxcblx0XHRkaW06IFsyLCAyMl0sXG5cdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdHVuZGVybGluZTogWzQsIDI0XSxcblx0XHRvdmVybGluZTogWzUzLCA1NV0sXG5cdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRoaWRkZW46IFs4LCAyOF0sXG5cdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XSxcblx0fSxcblx0Y29sb3I6IHtcblx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0cmVkOiBbMzEsIDM5XSxcblx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRibHVlOiBbMzQsIDM5XSxcblx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHR3aGl0ZTogWzM3LCAzOV0sXG5cblx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0Z3JheTogWzkwLCAzOV0sIC8vIEFsaWFzIG9mIGBibGFja0JyaWdodGBcblx0XHRncmV5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG5cdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0Y3lhbkJyaWdodDogWzk2LCAzOV0sXG5cdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldLFxuXHR9LFxuXHRiZ0NvbG9yOiB7XG5cdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0YmdSZWQ6IFs0MSwgNDldLFxuXHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRiZ0JsdWU6IFs0NCwgNDldLFxuXHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRiZ1doaXRlOiBbNDcsIDQ5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRiZ0dyYXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdHcmV5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuXHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0YmdHcmVlbkJyaWdodDogWzEwMiwgNDldLFxuXHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0YmdNYWdlbnRhQnJpZ2h0OiBbMTA1LCA0OV0sXG5cdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldLFxuXHR9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1vZGlmaWVyTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMubW9kaWZpZXIpO1xuZXhwb3J0IGNvbnN0IGZvcmVncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmNvbG9yKTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5iZ0NvbG9yKTtcbmV4cG9ydCBjb25zdCBjb2xvck5hbWVzID0gWy4uLmZvcmVncm91bmRDb2xvck5hbWVzLCAuLi5iYWNrZ3JvdW5kQ29sb3JOYW1lc107XG5cbmZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuXHRjb25zdCBjb2RlcyA9IG5ldyBNYXAoKTtcblxuXHRmb3IgKGNvbnN0IFtncm91cE5hbWUsIGdyb3VwXSBvZiBPYmplY3QuZW50cmllcyhzdHlsZXMpKSB7XG5cdFx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG5cdFx0XHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcblx0XHRcdFx0Y2xvc2U6IGBcXHUwMDFCWyR7c3R5bGVbMV19bWAsXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHR9KTtcblxuXHRzdHlsZXMuY29sb3IuY2xvc2UgPSAnXFx1MDAxQlszOW0nO1xuXHRzdHlsZXMuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG5cblx0c3R5bGVzLmNvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bSgpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpID0gd3JhcEFuc2kxNihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlKHJlZCwgZ3JlZW4sIGJsdWUpIHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0XHRcdFx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdFx0XHRcdGlmIChyZWQgPT09IGdyZWVuICYmIGdyZWVuID09PSBibHVlKSB7XG5cdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAxNjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMjMxO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDE2XG5cdFx0XHRcdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgKDYgKiBNYXRoLnJvdW5kKGdyZWVuIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyBNYXRoLnJvdW5kKGJsdWUgLyAyNTUgKiA1KTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvUmdiOiB7XG5cdFx0XHR2YWx1ZShoZXgpIHtcblx0XHRcdFx0Y29uc3QgbWF0Y2hlcyA9IC9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWMoaGV4LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdHJldHVybiBbMCwgMCwgMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgW2NvbG9yU3RyaW5nXSA9IG1hdGNoZXM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gWy4uLmNvbG9yU3RyaW5nXS5tYXAoY2hhcmFjdGVyID0+IGNoYXJhY3RlciArIGNoYXJhY3Rlcikuam9pbignJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gMTYpICYgMHhGRixcblx0XHRcdFx0XHQoaW50ZWdlciA+PiA4KSAmIDB4RkYsXG5cdFx0XHRcdFx0aW50ZWdlciAmIDB4RkYsXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLnJnYlRvQW5zaTI1NiguLi5zdHlsZXMuaGV4VG9SZ2IoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGFuc2kyNTZUb0Fuc2k6IHtcblx0XHRcdHZhbHVlKGNvZGUpIHtcblx0XHRcdFx0aWYgKGNvZGUgPCA4KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwICsgY29kZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2RlIDwgMTYpIHtcblx0XHRcdFx0XHRyZXR1cm4gOTAgKyAoY29kZSAtIDgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHJlZDtcblx0XHRcdFx0bGV0IGdyZWVuO1xuXHRcdFx0XHRsZXQgYmx1ZTtcblxuXHRcdFx0XHRpZiAoY29kZSA+PSAyMzIpIHtcblx0XHRcdFx0XHRyZWQgPSAoKChjb2RlIC0gMjMyKSAqIDEwKSArIDgpIC8gMjU1O1xuXHRcdFx0XHRcdGdyZWVuID0gcmVkO1xuXHRcdFx0XHRcdGJsdWUgPSByZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29kZSAtPSAxNjtcblxuXHRcdFx0XHRcdGNvbnN0IHJlbWFpbmRlciA9IGNvZGUgJSAzNjtcblxuXHRcdFx0XHRcdHJlZCA9IE1hdGguZmxvb3IoY29kZSAvIDM2KSAvIDU7XG5cdFx0XHRcdFx0Z3JlZW4gPSBNYXRoLmZsb29yKHJlbWFpbmRlciAvIDYpIC8gNTtcblx0XHRcdFx0XHRibHVlID0gKHJlbWFpbmRlciAlIDYpIC8gNTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gTWF0aC5tYXgocmVkLCBncmVlbiwgYmx1ZSkgKiAyO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiAzMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG5cdFx0XHRcdGxldCByZXN1bHQgPSAzMCArICgoTWF0aC5yb3VuZChibHVlKSA8PCAyKSB8IChNYXRoLnJvdW5kKGdyZWVuKSA8PCAxKSB8IE1hdGgucm91bmQocmVkKSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IDYwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdHJnYlRvQW5zaToge1xuXHRcdFx0dmFsdWU6IChyZWQsIGdyZWVuLCBibHVlKSA9PiBzdHlsZXMuYW5zaTI1NlRvQW5zaShzdHlsZXMucmdiVG9BbnNpMjU2KHJlZCwgZ3JlZW4sIGJsdWUpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5oZXhUb0Fuc2kyNTYoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG5jb25zdCBhbnNpU3R5bGVzID0gYXNzZW1ibGVTdHlsZXMoKTtcblxuZXhwb3J0IGRlZmF1bHQgYW5zaVN0eWxlcztcbiIsICJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHR0eSBmcm9tICdub2RlOnR0eSc7XG5cbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvaGFzLWZsYWcvYmxvYi9tYWluL2luZGV4LmpzXG4vLy8gZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vPy5hcmdzID8/IHByb2Nlc3MuYXJndikge1xuZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vID8gZ2xvYmFsVGhpcy5EZW5vLmFyZ3MgOiBwcm9jZXNzLmFyZ3YpIHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn1cblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZmxhZ0ZvcmNlQ29sb3I7XG5pZiAoXG5cdGhhc0ZsYWcoJ25vLWNvbG9yJylcblx0fHwgaGFzRmxhZygnbm8tY29sb3JzJylcblx0fHwgaGFzRmxhZygnY29sb3I9ZmFsc2UnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1uZXZlcicpXG4pIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChcblx0aGFzRmxhZygnY29sb3InKVxuXHR8fCBoYXNGbGFnKCdjb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlJylcblx0fHwgaGFzRmxhZygnY29sb3I9YWx3YXlzJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDE7XG59XG5cbmZ1bmN0aW9uIGVudkZvcmNlQ29sb3IoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oTnVtYmVyLnBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDMsXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9zdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHtzdHJlYW1Jc1RUWSwgc25pZmZGbGFncyA9IHRydWV9ID0ge30pIHtcblx0Y29uc3Qgbm9GbGFnRm9yY2VDb2xvciA9IGVudkZvcmNlQ29sb3IoKTtcblx0aWYgKG5vRmxhZ0ZvcmNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZsYWdGb3JjZUNvbG9yID0gbm9GbGFnRm9yY2VDb2xvcjtcblx0fVxuXG5cdGNvbnN0IGZvcmNlQ29sb3IgPSBzbmlmZkZsYWdzID8gZmxhZ0ZvcmNlQ29sb3IgOiBub0ZsYWdGb3JjZUNvbG9yO1xuXG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoc25pZmZGbGFncykge1xuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKVxuXHRcdFx0fHwgaGFzRmxhZygnY29sb3I9ZnVsbCcpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgQXp1cmUgRGV2T3BzIHBpcGVsaW5lcy5cblx0Ly8gSGFzIHRvIGJlIGFib3ZlIHRoZSBgIXN0cmVhbUlzVFRZYCBjaGVjay5cblx0aWYgKCdURl9CVUlMRCcgaW4gZW52ICYmICdBR0VOVF9OQU1FJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTBcblx0XHRcdCYmIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwXzU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0XzkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnR0lUSFVCX0FDVElPTlMnLCAnR0lURUFfQUNUSU9OUycsICdDSVJDTEVDSSddLnNvbWUoa2V5ID0+IGtleSBpbiBlbnYpKSB7XG5cdFx0XHRyZXR1cm4gMztcblx0XHR9XG5cblx0XHRpZiAoWydUUkFWSVMnLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0JVSUxES0lURScsICdEUk9ORSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGVudi5URVJNID09PSAneHRlcm0ta2l0dHknKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoZW52LlRFUk0gPT09ICd4dGVybS1naG9zdHR5Jykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGVudi5URVJNID09PSAnd2V6dGVybScpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzoge1xuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHR9XG5cblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzoge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdXBwb3J0c0NvbG9yKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxldmVsID0gX3N1cHBvcnRzQ29sb3Ioc3RyZWFtLCB7XG5cdFx0c3RyZWFtSXNUVFk6IHN0cmVhbSAmJiBzdHJlYW0uaXNUVFksXG5cdFx0Li4ub3B0aW9ucyxcblx0fSk7XG5cblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxuY29uc3Qgc3VwcG9ydHNDb2xvciA9IHtcblx0c3Rkb3V0OiBjcmVhdGVTdXBwb3J0c0NvbG9yKHtpc1RUWTogdHR5LmlzYXR0eSgxKX0pLFxuXHRzdGRlcnI6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDIpfSksXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzdXBwb3J0c0NvbG9yO1xuIiwgIi8vIFRPRE86IFdoZW4gdGFyZ2V0aW5nIE5vZGUuanMgMTYsIHVzZSBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikge1xuXHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcpO1xuXHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCBpbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgcHJlZml4LCBwb3N0Zml4LCBpbmRleCkge1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdGNvbnN0IGdvdENSID0gc3RyaW5nW2luZGV4IC0gMV0gPT09ICdcXHInO1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCwgKGdvdENSID8gaW5kZXggLSAxIDogaW5kZXgpKSArIHByZWZpeCArIChnb3RDUiA/ICdcXHJcXG4nIDogJ1xcbicpICsgcG9zdGZpeDtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgMTtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuIiwgImltcG9ydCBhbnNpU3R5bGVzIGZyb20gJyNhbnNpLXN0eWxlcyc7XG5pbXBvcnQgc3VwcG9ydHNDb2xvciBmcm9tICcjc3VwcG9ydHMtY29sb3InO1xuaW1wb3J0IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvb3JkZXJcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4LFxufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHN1cHBvcnRzQ29sb3I7XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFN5bWJvbCgnR0VORVJBVE9SJyk7XG5jb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuY29uc3QgSVNfRU1QVFkgPSBTeW1ib2woJ0lTX0VNUFRZJyk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCBcdTIxOTIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nLFxuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuZXhwb3J0IGNsYXNzIENoYWxrIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xuXHR9XG59XG5cbmNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBjaGFsayA9ICguLi5zdHJpbmdzKSA9PiBzdHJpbmdzLmpvaW4oJyAnKTtcblx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIGNyZWF0ZUNoYWxrLnByb3RvdHlwZSk7XG5cblx0cmV0dXJuIGNoYWxrO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQ2hhbGsob3B0aW9ucykge1xuXHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xufVxuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoY3JlYXRlQ2hhbGsucHJvdG90eXBlLCBGdW5jdGlvbi5wcm90b3R5cGUpO1xuXG5mb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhhbnNpU3R5bGVzKSkge1xuXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCBjcmVhdGVTdHlsZXIoc3R5bGUub3Blbiwgc3R5bGUuY2xvc2UsIHRoaXNbU1RZTEVSXSksIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdFx0fSxcblx0fTtcbn1cblxuc3R5bGVzLnZpc2libGUgPSB7XG5cdGdldCgpIHtcblx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzW1NUWUxFUl0sIHRydWUpO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmlzaWJsZScsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdHJldHVybiBidWlsZGVyO1xuXHR9LFxufTtcblxuY29uc3QgZ2V0TW9kZWxBbnNpID0gKG1vZGVsLCBsZXZlbCwgdHlwZSwgLi4uYXJndW1lbnRzXykgPT4ge1xuXHRpZiAobW9kZWwgPT09ICdyZ2InKSB7XG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTE2bScpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kxNm0oLi4uYXJndW1lbnRzXyk7XG5cdFx0fVxuXG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTI1NicpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kyNTYoYW5zaVN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uYXJndW1lbnRzXykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2koYW5zaVN0eWxlcy5yZ2JUb0Fuc2koLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0aWYgKG1vZGVsID09PSAnaGV4Jykge1xuXHRcdHJldHVybiBnZXRNb2RlbEFuc2koJ3JnYicsIGxldmVsLCB0eXBlLCAuLi5hbnNpU3R5bGVzLmhleFRvUmdiKC4uLmFyZ3VtZW50c18pKTtcblx0fVxuXG5cdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdW21vZGVsXSguLi5hcmd1bWVudHNfKTtcbn07XG5cbmNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAnYW5zaTI1NiddO1xuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0c3R5bGVzW21vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnY29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG5cblx0Y29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG5cdHN0eWxlc1tiZ01vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnYmdDb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsIHRoaXNbU1RZTEVSXSk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHR9O1xufVxuXG5jb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCB7XG5cdC4uLnN0eWxlcyxcblx0bGV2ZWw6IHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB0aGlzW0dFTkVSQVRPUl0ubGV2ZWw7XG5cdFx0fSxcblx0XHRzZXQobGV2ZWwpIHtcblx0XHRcdHRoaXNbR0VORVJBVE9SXS5sZXZlbCA9IGxldmVsO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgY3JlYXRlU3R5bGVyID0gKG9wZW4sIGNsb3NlLCBwYXJlbnQpID0+IHtcblx0bGV0IG9wZW5BbGw7XG5cdGxldCBjbG9zZUFsbDtcblx0aWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0b3BlbkFsbCA9IG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZTtcblx0fSBlbHNlIHtcblx0XHRvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZW4sXG5cdFx0Y2xvc2UsXG5cdFx0b3BlbkFsbCxcblx0XHRjbG9zZUFsbCxcblx0XHRwYXJlbnQsXG5cdH07XG59O1xuXG5jb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG5cdC8vIFNpbmdsZSBhcmd1bWVudCBpcyBob3QgcGF0aCwgaW1wbGljaXQgY29lcmNpb24gaXMgZmFzdGVyIHRoYW4gYW55dGhpbmdcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdGNvbnN0IGJ1aWxkZXIgPSAoLi4uYXJndW1lbnRzXykgPT4gYXBwbHlTdHlsZShidWlsZGVyLCAoYXJndW1lbnRzXy5sZW5ndGggPT09IDEpID8gKCcnICsgYXJndW1lbnRzX1swXSkgOiBhcmd1bWVudHNfLmpvaW4oJyAnKSk7XG5cblx0Ly8gV2UgYWx0ZXIgdGhlIHByb3RvdHlwZSBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcblxuXHRidWlsZGVyW0dFTkVSQVRPUl0gPSBzZWxmO1xuXHRidWlsZGVyW1NUWUxFUl0gPSBfc3R5bGVyO1xuXHRidWlsZGVyW0lTX0VNUFRZXSA9IF9pc0VtcHR5O1xuXG5cdHJldHVybiBidWlsZGVyO1xufTtcblxuY29uc3QgYXBwbHlTdHlsZSA9IChzZWxmLCBzdHJpbmcpID0+IHtcblx0aWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNlbGZbSVNfRU1QVFldID8gJycgOiBzdHJpbmc7XG5cdH1cblxuXHRsZXQgc3R5bGVyID0gc2VsZltTVFlMRVJdO1xuXG5cdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuXHRpZiAoc3RyaW5nLmluY2x1ZGVzKCdcXHUwMDFCJykpIHtcblx0XHR3aGlsZSAoc3R5bGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdFx0Ly8gb3RoZXJ3aXNlIG9ubHkgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBzYWlkIGNsb3NpbmcgY29kZVxuXHRcdFx0Ly8gd2lsbCBiZSBjb2xvcmVkLCBhbmQgdGhlIHJlc3Qgd2lsbCBzaW1wbHkgYmUgJ3BsYWluJy5cblx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuXHRcdFx0c3R5bGVyID0gc3R5bGVyLnBhcmVudDtcblx0XHR9XG5cdH1cblxuXHQvLyBXZSBjYW4gbW92ZSBib3RoIG5leHQgYWN0aW9ucyBvdXQgb2YgbG9vcCwgYmVjYXVzZSByZW1haW5pbmcgYWN0aW9ucyBpbiBsb29wIHdvbid0IGhhdmVcblx0Ly8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG5cdGNvbnN0IGxmSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG5cdGlmIChsZkluZGV4ICE9PSAtMSkge1xuXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcblx0fVxuXG5cdHJldHVybiBvcGVuQWxsICsgc3RyaW5nICsgY2xvc2VBbGw7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjcmVhdGVDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG5cbmNvbnN0IGNoYWxrID0gY3JlYXRlQ2hhbGsoKTtcbmV4cG9ydCBjb25zdCBjaGFsa1N0ZGVyciA9IGNyZWF0ZUNoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTtcblxuZXhwb3J0IHtcblx0bW9kaWZpZXJOYW1lcyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzLFxuXHRjb2xvck5hbWVzLFxuXG5cdC8vIFRPRE86IFJlbW92ZSB0aGVzZSBhbGlhc2VzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0bW9kaWZpZXJOYW1lcyBhcyBtb2RpZmllcnMsXG5cdGZvcmVncm91bmRDb2xvck5hbWVzIGFzIGZvcmVncm91bmRDb2xvcnMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzIGFzIGJhY2tncm91bmRDb2xvcnMsXG5cdGNvbG9yTmFtZXMgYXMgY29sb3JzLFxufSBmcm9tICcuL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG5cdHN0ZG91dENvbG9yIGFzIHN1cHBvcnRzQ29sb3IsXG5cdHN0ZGVyckNvbG9yIGFzIHN1cHBvcnRzQ29sb3JTdGRlcnIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjaGFsaztcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgYWxsIFJ1bnRpbWUgQ0xJIGVycm9yc1xuICogRm9sbG93cyBwdXJlbm93IGVycm9yIHBhdHRlcm5zIHdpdGhvdXQgZW1vamlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDbGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQ2xpRXJyb3InO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQgb3IgbWlzc2luZ1xuICogRXh0ZW5kcyBwdXJlbm93IENvbmZpZ0Vycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb25maWdFcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX0NPTkZJR19FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQ29uZmlnRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSBidWlsZCBvcGVyYXRpb25zIGZhaWxcbiAqIEV4dGVuZHMgcHVyZW5vdyBCdWlsZEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVCdWlsZEVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQlVJTERfRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZUJ1aWxkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSBkZXBsb3ltZW50IG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IERlcGxveW1lbnRFcnJvciBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGVwbG95bWVudEVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfREVQTE9ZTUVOVF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lRGVwbG95bWVudEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEFsaWFzIGZvciBSdW50aW1lRGVwbG95bWVudEVycm9yIHRvIG1hdGNoIHB1cmVub3cgcGF0dGVybnNcbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRFcnJvciBleHRlbmRzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnRGVwbG95bWVudEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgdmFsaWRhdGlvbiBjaGVja3MgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IFZhbGlkYXRpb25FcnJvciBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfVkFMSURBVElPTl9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lVmFsaWRhdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgdGVtcGxhdGUgcmVzb2x1dGlvbiBmYWlsc1xuICogUHJvdmlkZXMgZGV0YWlsZWQgY29udGV4dCBhYm91dCBwYWNrYWdlIHJlc29sdXRpb24gYW5kIHNlYXJjaGVkIHBhdGhzXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lVGVtcGxhdGVFcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGVOYW1lPzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjb3JlRGlyPzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzZWFyY2hlZFBhdGhzPzogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IHBhY2thZ2VDb250ZXh0Pzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXNvbHV0aW9uU3RyYXRlZ3k/OiBzdHJpbmcsXG4gICAgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfVEVNUExBVEVfRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZVRlbXBsYXRlRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIGludmFsaWRcbiAqIFByb3ZpZGVzIGRldGFpbGVkIHZhbGlkYXRpb24gZXJyb3JzIGFuZCB0cm91Ymxlc2hvb3RpbmcgZ3VpZGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZURpcj86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9ycz86IHN0cmluZ1tdLFxuICAgIGhpbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX1RFTVBMQVRFX1NUUlVDVFVSRV9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBGcmllbmRseSBlcnJvciBmb3JtYXR0ZXIgZm9yIHJ1bnRpbWUgd29ya3NwYWNlXG4gKiBGb2xsb3dzIHB1cmVub3cgRnJpZW5kbHlFcnJvckZvcm1hdHRlciBwYXR0ZXJuIHdpdGhvdXQgZW1vamlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIHtcbiAgLyoqXG4gICAqIEZvcm1hdCBlcnJvciBhcyBodW1hbi1yZWFkYWJsZSBtZXNzYWdlIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdEVycm9yKGVycm9yOiBFcnJvciwgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEhlYWRlciB3aXRob3V0IGVtb2ppXG4gICAgbGluZXMucHVzaChgRXJyb3I6ICR7ZXJyb3IubmFtZSB8fCAnUnVudGltZUVycm9yJ31gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIEVycm9yIG1lc3NhZ2VcbiAgICBsaW5lcy5wdXNoKGBNZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBIaW50IGlmIGF2YWlsYWJsZVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bnRpbWVDbGlFcnJvciAmJiBlcnJvci5oaW50KSB7XG4gICAgICBsaW5lcy5wdXNoKGBIaW50OiAke2Vycm9yLmhpbnR9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBTdGFjayB0cmFjZSBpbiB2ZXJib3NlIG1vZGVcbiAgICBpZiAodmVyYm9zZSAmJiBlcnJvci5zdGFjaykge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFN0YWNrIFRyYWNlICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChlcnJvci5zdGFjayk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHZhbGlkYXRpb24gZXJyb3Igd2l0aG91dCBlbW9qaVxuICAgKi9cbiAgZm9ybWF0VmFsaWRhdGlvbkVycm9yKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCdWYWxpZGF0aW9uIEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgRmllbGQ6ICR7ZmllbGROYW1lfWApO1xuICAgIGxpbmVzLnB1c2goYElzc3VlOiAke21lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFRlY2huaWNhbCBEZXRhaWxzICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChgRmllbGQgdmFsaWRhdGlvbiBmYWlsZWQgZm9yOiAke2ZpZWxkTmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goYFZhbGlkYXRpb24gbWVzc2FnZTogJHttZXNzYWdlfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkZXBsb3ltZW50IGVycm9yIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdERlcGxveW1lbnRFcnJvcihcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnRGVwbG95bWVudCBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYFN0YWNrOiAke3N0YWNrTmFtZX1gKTtcbiAgICBsaW5lcy5wdXNoKGBPcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgIGxpbmVzLnB1c2goYElzc3VlOiAke21lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBsaW5lcy5wdXNoKCdUcm91Ymxlc2hvb3Rpbmc6Jyk7XG4gICAgbGluZXMucHVzaCgnMS4gQ2hlY2sgQVdTIGNyZWRlbnRpYWxzIGFuZCBwZXJtaXNzaW9ucycpO1xuICAgIGxpbmVzLnB1c2goJzIuIFZlcmlmeSBzdGFjayBjb25maWd1cmF0aW9uJyk7XG4gICAgbGluZXMucHVzaCgnMy4gUmV2aWV3IENsb3VkRm9ybWF0aW9uIGV2ZW50cyBpbiBBV1MgQ29uc29sZScpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYFN0YWNrIG5hbWU6ICR7c3RhY2tOYW1lfWApO1xuICAgICAgbGluZXMucHVzaChgRmFpbGVkIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgICBsaW5lcy5wdXNoKGBFcnJvciBkZXRhaWxzOiAke21lc3NhZ2V9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJ1bnRpbWUgdGVtcGxhdGUgZXJyb3Igd2l0aCBkZXRhaWxlZCBjb250ZXh0XG4gICAqL1xuICBmb3JtYXRUZW1wbGF0ZUVycm9yKGVycm9yOiBSdW50aW1lVGVtcGxhdGVFcnJvciwgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ1J1bnRpbWUgVGVtcGxhdGUgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gVGVtcGxhdGUgY29udGV4dFxuICAgIGlmIChlcnJvci50ZW1wbGF0ZU5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYFRlbXBsYXRlOiAke2Vycm9yLnRlbXBsYXRlTmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLmNvcmVEaXIpIHtcbiAgICAgIGxpbmVzLnB1c2goYENvcmUgRGlyZWN0b3J5OiAke2Vycm9yLmNvcmVEaXJ9YCk7XG4gICAgfVxuICAgIGlmIChlcnJvci5wYWNrYWdlQ29udGV4dCkge1xuICAgICAgbGluZXMucHVzaChgUGFja2FnZSBDb250ZXh0OiAke2Vycm9yLnBhY2thZ2VDb250ZXh0fWApO1xuICAgIH1cbiAgICBpZiAoZXJyb3IucmVzb2x1dGlvblN0cmF0ZWd5KSB7XG4gICAgICBsaW5lcy5wdXNoKGBSZXNvbHV0aW9uIFN0cmF0ZWd5OiAke2Vycm9yLnJlc29sdXRpb25TdHJhdGVneX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBTZWFyY2hlZCBwYXRoc1xuICAgIGlmIChlcnJvci5zZWFyY2hlZFBhdGhzICYmIGVycm9yLnNlYXJjaGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnU2VhcmNoZWQgUGF0aHM6Jyk7XG4gICAgICBlcnJvci5zZWFyY2hlZFBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgLSAke3BhdGh9YCk7XG4gICAgICB9KTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIFRyb3VibGVzaG9vdGluZyBndWlkYW5jZVxuICAgIGxpbmVzLnB1c2goJ1Ryb3VibGVzaG9vdGluZzonKTtcbiAgICBsaW5lcy5wdXNoKCcxLiBFbnN1cmUgQHdvcmt0aWYvcnVudGltZSBwYWNrYWdlIGlzIHByb3Blcmx5IGluc3RhbGxlZCcpO1xuICAgIGxpbmVzLnB1c2goJzIuIFZlcmlmeSB0aGUgcGFja2FnZSBjb250YWlucyBzcmMvYmluL3RlbXBsYXRlcy9ydW50aW1lLXdlYi8gZGlyZWN0b3J5Jyk7XG4gICAgbGluZXMucHVzaCgnMy4gQ2hlY2sgdGhhdCBydW50aW1lLXdlYiBkaXJlY3RvcnkgY29udGFpbnMgdGVtcGxhdGUgc3ViZGlyZWN0b3JpZXMnKTtcbiAgICBsaW5lcy5wdXNoKCc0LiBJZiBydW5uaW5nIGZyb20gc291cmNlLCBlbnN1cmUgeW91XFwncmUgaW4gdGhlIHJ1bnRpbWUgcGFja2FnZSBkaXJlY3RvcnknKTtcbiAgICBsaW5lcy5wdXNoKCc1LiBUcnkgcmVpbnN0YWxsaW5nIHRoZSBydW50aW1lIHBhY2thZ2U6IG5wbSBpbnN0YWxsIEB3b3JrdGlmL3J1bnRpbWUnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIEhpbnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgIGxpbmVzLnB1c2goYEhpbnQ6ICR7ZXJyb3IuaGludH1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBFcnJvciBjb2RlOiAke2Vycm9yLmNvZGV9YCk7XG4gICAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgbGluZXMucHVzaCgnU3RhY2sgdHJhY2U6Jyk7XG4gICAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBydW50aW1lIHRlbXBsYXRlIHN0cnVjdHVyZSBlcnJvciB3aXRoIHZhbGlkYXRpb24gZGV0YWlsc1xuICAgKi9cbiAgZm9ybWF0VGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcihlcnJvcjogUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCdSdW50aW1lIFRlbXBsYXRlIFN0cnVjdHVyZSBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYElzc3VlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAoZXJyb3IudGVtcGxhdGVEaXIpIHtcbiAgICAgIGxpbmVzLnB1c2goYFRlbXBsYXRlIERpcmVjdG9yeTogJHtlcnJvci50ZW1wbGF0ZURpcn1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRpb24gZXJyb3JzXG4gICAgaWYgKGVycm9yLnZhbGlkYXRpb25FcnJvcnMgJiYgZXJyb3IudmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdWYWxpZGF0aW9uIEVycm9yczonKTtcbiAgICAgIGVycm9yLnZhbGlkYXRpb25FcnJvcnMuZm9yRWFjaCh2YWxpZGF0aW9uRXJyb3IgPT4ge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHt2YWxpZGF0aW9uRXJyb3J9YCk7XG4gICAgICB9KTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIFRyb3VibGVzaG9vdGluZyBndWlkYW5jZVxuICAgIGxpbmVzLnB1c2goJ1Ryb3VibGVzaG9vdGluZzonKTtcbiAgICBsaW5lcy5wdXNoKCcxLiBWZXJpZnkgdGhlIHJ1bnRpbWUgcGFja2FnZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGUnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBDaGVjayB0aGF0IHNyYy9iaW4vdGVtcGxhdGVzL3J1bnRpbWUtd2ViLyBleGlzdHMgaW4gdGhlIHBhY2thZ2UnKTtcbiAgICBsaW5lcy5wdXNoKCczLiBFbnN1cmUgdGVtcGxhdGUgZGlyZWN0b3JpZXMgY29udGFpbiB0aGUgcmVxdWlyZWQgZmlsZXMnKTtcbiAgICBsaW5lcy5wdXNoKCc0LiBUcnkgcmVpbnN0YWxsaW5nOiBucG0gaW5zdGFsbCBAd29ya3RpZi9ydW50aW1lJyk7XG4gICAgbGluZXMucHVzaCgnNS4gSWYgZGV2ZWxvcGluZyBsb2NhbGx5LCBlbnN1cmUgdGVtcGxhdGVzIGFyZSBidWlsdCBjb3JyZWN0bHknKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIEhpbnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgIGxpbmVzLnB1c2goYEhpbnQ6ICR7ZXJyb3IuaGludH1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBFcnJvciBjb2RlOiAke2Vycm9yLmNvZGV9YCk7XG4gICAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgbGluZXMucHVzaCgnU3RhY2sgdHJhY2U6Jyk7XG4gICAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCBsb2dnZXIgZm9yIHJ1bnRpbWUgd29ya3NwYWNlXG4gKiBGb2xsb3dzIHB1cmVub3cgbG9nZ2luZyBwYXR0ZXJucyB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lU3RydWN0dXJlZExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnd2FybicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgYXMgUHVyZW5vd1RlbXBsYXRlU2VydmljZSwgdHlwZSBTY2FmZm9sZE9wdGlvbnMsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUnVudGltZVRlbXBsYXRlRXJyb3IsIFJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIH0gZnJvbSAnQGJpbi91dGlscy9lcnJvcnMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGNvbXBhdGliaWxpdHlcbmV4cG9ydCB0eXBlIHsgU2NhZmZvbGRPcHRpb25zLCBUZW1wbGF0ZUNvbnRleHQgfTtcblxuLyoqXG4gKiBSdW50aW1lLXNwZWNpZmljIHRlbXBsYXRlIHNlcnZpY2UgdGhhdCBleHRlbmRzIHB1cmVub3cncyBUZW1wbGF0ZVNlcnZpY2VcbiAqIHRvIHJlc29sdmUgdGVtcGxhdGVzIGZyb20gdGhlIHJ1bnRpbWUgcGFja2FnZSdzIGZpbGUgc3lzdGVtIGluc3RlYWQgb2YgcHVyZW5vdydzLlxuICogXG4gKiBUaGlzIHNlcnZpY2UgYWRkcmVzc2VzIHRoZSBpc3N1ZSB3aGVyZSBgQHdvcmt0aWYvcnVudGltZSBpbml0YCB3YXMgdXNpbmdcbiAqIHB1cmVub3cgdGVtcGxhdGVzIGluc3RlYWQgb2YgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIGV4dGVuZHMgUHVyZW5vd1RlbXBsYXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZVRlbXBsYXRlc0Rpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSkge1xuICAgIHN1cGVyKGN3ZCk7XG5cbiAgICAvLyBSZXNvbHZlIHJ1bnRpbWUgcGFja2FnZSB0ZW1wbGF0ZSBkaXJlY3RvcnlcbiAgICB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIgPSB0aGlzLnJlc29sdmVSdW50aW1lVGVtcGxhdGVEaXJlY3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FmZm9sZCBhIG5ldyBwcm9qZWN0IHVzaW5nIHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGVzXG4gICAqIFxuICAgKiBPdmVycmlkZXMgdGhlIHBhcmVudCBtZXRob2QgdG8gdXNlIHJ1bnRpbWUgdGVtcGxhdGVzIGZyb20gdGhlXG4gICAqIHJ1bnRpbWUgcGFja2FnZSdzIGZpbGUgc3lzdGVtIGluc3RlYWQgb2YgcHVyZW5vdyB0ZW1wbGF0ZXMuXG4gICAqIFxuICAgKiBJbXBsZW1lbnRzIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBhbmQgZmFsbGJhY2sgc3RyYXRlZ2llczpcbiAgICogLSBWYWxpZGF0ZXMgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBiZWZvcmUgcHJvY2VlZGluZ1xuICAgKiAtIFByb3ZpZGVzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzIGZvciB0cm91Ymxlc2hvb3RpbmdcbiAgICogLSBFbnN1cmVzIHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgcmVzb2x1dGlvblxuICAgKi9cbiAgYXN5bmMgc2NhZmZvbGQoXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2NhZmZvbGRPcHRpb25zLFxuICAgIGNvcmVEaXI6IHN0cmluZyA9ICdydW50aW1lLXdlYicsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZhbGlkYXRlIHJ1bnRpbWUgdGVtcGxhdGVzIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZVRlbXBsYXRlU3RydWN0dXJlKGNvcmVEaXIpO1xuICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yKFxuICAgICAgICBgUnVudGltZSB0ZW1wbGF0ZSBkaXJlY3RvcnkgdmFsaWRhdGlvbiBmYWlsZWRgLFxuICAgICAgICB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsXG4gICAgICAgIHZhbGlkYXRpb24uZXJyb3JzLFxuICAgICAgICBgRW5zdXJlIHRoZSBydW50aW1lIHBhY2thZ2UgaXMgcHJvcGVybHkgaW5zdGFsbGVkIGFuZCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdGVtcGxhdGUgc3RydWN0dXJlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLCBjb3JlRGlyLCB0ZW1wbGF0ZU5hbWUpO1xuXG4gICAgLy8gVmFsaWRhdGUgc3BlY2lmaWMgdGVtcGxhdGUgZXhpc3RzIGluIHJ1bnRpbWUgcGFja2FnZVxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVUZW1wbGF0ZXMgPSB0aGlzLmdldEF2YWlsYWJsZVRlbXBsYXRlcyhjb3JlRGlyKTtcbiAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gdGhpcy5nZXRUZW1wbGF0ZVJlc29sdXRpb25JbmZvKCk7XG5cbiAgICAgIHRocm93IG5ldyBSdW50aW1lVGVtcGxhdGVFcnJvcihcbiAgICAgICAgYFJ1bnRpbWUgdGVtcGxhdGUgJyR7dGVtcGxhdGVOYW1lfScgbm90IGZvdW5kYCxcbiAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICBjb3JlRGlyLFxuICAgICAgICBbdGVtcGxhdGVQYXRoXSxcbiAgICAgICAgcmVzb2x1dGlvbkluZm8ucGFja2FnZUNvbnRleHQgfHwgJ3Vua25vd24nLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5yZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgICAgIGF2YWlsYWJsZVRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgQXZhaWxhYmxlIHRlbXBsYXRlczogJHthdmFpbGFibGVUZW1wbGF0ZXMuam9pbignLCAnKX0uIFRyeTogcnVudGltZSBpbml0IDxwcm9qZWN0LW5hbWU+IC0tdGVtcGxhdGUgJHthdmFpbGFibGVUZW1wbGF0ZXNbMF19YFxuICAgICAgICAgIDogYE5vIHRlbXBsYXRlcyBmb3VuZCBpbiAnJHtjb3JlRGlyfScuIFRoZSBydW50aW1lIHBhY2thZ2UgbWF5IG5vdCBiZSBwcm9wZXJseSBpbnN0YWxsZWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0ZW1wbGF0ZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRlbXBsYXRlUGF0aCk7XG4gICAgaWYgKHRlbXBsYXRlRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCByZXNvbHV0aW9uSW5mbyA9IHRoaXMuZ2V0VGVtcGxhdGVSZXNvbHV0aW9uSW5mbygpO1xuXG4gICAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlRXJyb3IoXG4gICAgICAgIGBSdW50aW1lIHRlbXBsYXRlICcke3RlbXBsYXRlTmFtZX0nIGRpcmVjdG9yeSBpcyBlbXB0eWAsXG4gICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgY29yZURpcixcbiAgICAgICAgW3RlbXBsYXRlUGF0aF0sXG4gICAgICAgIHJlc29sdXRpb25JbmZvLnBhY2thZ2VDb250ZXh0IHx8ICd1bmtub3duJyxcbiAgICAgICAgcmVzb2x1dGlvbkluZm8ucmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgICBgVGhpcyBpbmRpY2F0ZXMgYSBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZSB0ZW1wbGF0ZSBpbnN0YWxsYXRpb24uIFRyeSByZWluc3RhbGxpbmcgdGhlIHJ1bnRpbWUgcGFja2FnZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgcGFyZW50IGNsYXNzIGxvZ2ljIGJ1dCB3aXRoIHJ1bnRpbWUgdGVtcGxhdGUgcGF0aFxuICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgb3ZlcnJpZGUgdGhlIHRlbXBsYXRlc0RpciBmb3IgdGhpcyBvcGVyYXRpb25cbiAgICBjb25zdCBvcmlnaW5hbFRlbXBsYXRlc0RpciA9ICh0aGlzIGFzIGFueSkudGVtcGxhdGVzRGlyO1xuICAgICh0aGlzIGFzIGFueSkudGVtcGxhdGVzRGlyID0gdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE92ZXJyaWRlIHRoZSBjb3B5VGVtcGxhdGVGaWxlcyBtZXRob2QgdG8gaW5jbHVkZSBydW50aW1lLXNwZWNpZmljIHZhcmlhYmxlc1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb3B5VGVtcGxhdGVGaWxlcyA9ICh0aGlzIGFzIGFueSkuY29weVRlbXBsYXRlRmlsZXM7XG4gICAgICAodGhpcyBhcyBhbnkpLmNvcHlUZW1wbGF0ZUZpbGVzID0gYXN5bmMgKHNvdXJjZVBhdGg6IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpID0+IHtcbiAgICAgICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgdmFyaWFibGVzIHRvIHRoZSBjb250ZXh0XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVDb250ZXh0ID0ge1xuICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgcGFja2FnZVZlcnNpb246IHRoaXMuZ2V0UnVudGltZVBhY2thZ2VWZXJzaW9uKCksXG4gICAgICAgICAgUFVSRU5PV19WRVJTSU9OOiB0aGlzLmdldFJ1bnRpbWVQYWNrYWdlVmVyc2lvbigpLFxuICAgICAgICAgIFNUQUNLX05BTUU6IGNvbnRleHQucHJvamVjdE5hbWUsXG4gICAgICAgICAgUFJPSkVDVF9OQU1FOiBjb250ZXh0LnByb2plY3ROYW1lLFxuICAgICAgICAgIFJFR0lPTjogJ3VzLWVhc3QtMScsXG4gICAgICAgICAgRU5BQkxFX1NFTzogJ2ZhbHNlJyxcbiAgICAgICAgICBTVEFHRTogJ2RldicsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvcmlnaW5hbENvcHlUZW1wbGF0ZUZpbGVzLmNhbGwodGhpcywgc291cmNlUGF0aCwgdGFyZ2V0UGF0aCwgcnVudGltZUNvbnRleHQpO1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgc3VwZXIuc2NhZmZvbGQodGVtcGxhdGVOYW1lLCB0YXJnZXREaXIsIG9wdGlvbnMsIGNvcmVEaXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlc0RpclxuICAgICAgKHRoaXMgYXMgYW55KS50ZW1wbGF0ZXNEaXIgPSBvcmlnaW5hbFRlbXBsYXRlc0RpcjtcbiAgICB9XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHJ1bnRpbWUgcGFja2FnZSdzIHRlbXBsYXRlIGRpcmVjdG9yeVxuICAgKiBcbiAgICogVGhpcyBtZXRob2QgZGV0ZWN0cyB0aGUgcnVudGltZSBwYWNrYWdlIGNvbnRleHQgYW5kIGZpbmRzIHRoZSBjb3JyZWN0XG4gICAqIHRlbXBsYXRlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHJ1bnRpbWUgcGFja2FnZSdzIGZpbGUgc3lzdGVtLlxuICAgKiBcbiAgICogSW1wbGVtZW50cyBtdWx0aXBsZSBmYWxsYmFjayBzdHJhdGVnaWVzIGZvciByb2J1c3QgdGVtcGxhdGUgcGF0aCBkZXRlY3Rpb246XG4gICAqIDEuIFBhY2thZ2UuanNvbiBkZXRlY3Rpb24gKG1vc3QgcmVsaWFibGUpXG4gICAqIDIuIE1vZHVsZSBsb2NhdGlvbi1iYXNlZCBkZXRlY3Rpb25cbiAgICogMy4gTm9kZS5qcyBtb2R1bGUgcmVzb2x1dGlvblxuICAgKiA0LiBFbnZpcm9ubWVudC1iYXNlZCBkZXRlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVJ1bnRpbWVUZW1wbGF0ZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlYXJjaFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBzdHJhdGVneTogc3RyaW5nOyB2YWxpZDogYm9vbGVhbiB9PiA9IFtdO1xuXG4gICAgLy8gU3RyYXRlZ3kgMTogUGFja2FnZS5qc29uIGRldGVjdGlvbiAobW9zdCByZWxpYWJsZSlcbiAgICBjb25zdCBwYWNrYWdlQmFzZWRQYXRoID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcbiAgICBpZiAocGFja2FnZUJhc2VkUGF0aCkge1xuICAgICAgY29uc3QgdGVtcGxhdGVzUGF0aCA9IHBhdGguam9pbihwYWNrYWdlQmFzZWRQYXRoLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKTtcbiAgICAgIHNlYXJjaFBhdGhzLnB1c2godGVtcGxhdGVzUGF0aCk7XG4gICAgICBzZWFyY2hSZXN1bHRzLnB1c2goe1xuICAgICAgICBwYXRoOiB0ZW1wbGF0ZXNQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ3BhY2thZ2UuanNvbiBkZXRlY3Rpb24nLFxuICAgICAgICB2YWxpZDogdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KHRlbXBsYXRlc1BhdGgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdHJhdGVneSAyOiBNb2R1bGUgbG9jYXRpb24tYmFzZWQgZGV0ZWN0aW9uXG4gICAgY29uc3QgbW9kdWxlQmFzZWRQYXRocyA9IHRoaXMuZ2V0TW9kdWxlQmFzZWRQYXRocygpO1xuICAgIGZvciAoY29uc3QgbW9kdWxlUGF0aCBvZiBtb2R1bGVCYXNlZFBhdGhzKSB7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKG1vZHVsZVBhdGgpO1xuICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgcGF0aDogbW9kdWxlUGF0aCxcbiAgICAgICAgc3RyYXRlZ3k6ICdtb2R1bGUgbG9jYXRpb24nLFxuICAgICAgICB2YWxpZDogdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KG1vZHVsZVBhdGgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdHJhdGVneSAzOiBOb2RlLmpzIG1vZHVsZSByZXNvbHV0aW9uXG4gICAgY29uc3Qgbm9kZU1vZHVsZVBhdGhzID0gdGhpcy5nZXROb2RlTW9kdWxlUGF0aHMoKTtcbiAgICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVQYXRoIG9mIG5vZGVNb2R1bGVQYXRocykge1xuICAgICAgc2VhcmNoUGF0aHMucHVzaChub2RlTW9kdWxlUGF0aCk7XG4gICAgICBzZWFyY2hSZXN1bHRzLnB1c2goe1xuICAgICAgICBwYXRoOiBub2RlTW9kdWxlUGF0aCxcbiAgICAgICAgc3RyYXRlZ3k6ICdub2RlX21vZHVsZXMgcmVzb2x1dGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3Rvcnkobm9kZU1vZHVsZVBhdGgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdHJhdGVneSA0OiBFbnZpcm9ubWVudC1iYXNlZCBkZXRlY3Rpb25cbiAgICBjb25zdCBlbnZCYXNlZFBhdGhzID0gdGhpcy5nZXRFbnZpcm9ubWVudEJhc2VkUGF0aHMoKTtcbiAgICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52QmFzZWRQYXRocykge1xuICAgICAgc2VhcmNoUGF0aHMucHVzaChlbnZQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IGVudlBhdGgsXG4gICAgICAgIHN0cmF0ZWd5OiAnZW52aXJvbm1lbnQgZGV0ZWN0aW9uJyxcbiAgICAgICAgdmFsaWQ6IHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeShlbnZQYXRoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3QgdmFsaWQgcGF0aFxuICAgIGNvbnN0IHZhbGlkUmVzdWx0ID0gc2VhcmNoUmVzdWx0cy5maW5kKHJlc3VsdCA9PiByZXN1bHQudmFsaWQpO1xuXG4gICAgaWYgKHZhbGlkUmVzdWx0KSB7XG4gICAgICByZXR1cm4gdmFsaWRSZXN1bHQucGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB2YWxpZCBwYXRoIGZvdW5kLCBwcm92aWRlIGRldGFpbGVkIGVycm9yIGluZm9ybWF0aW9uXG4gICAgY29uc3Qgc2VhcmNoZWRQYXRocyA9IHNlYXJjaFJlc3VsdHMubWFwKHJlc3VsdCA9PiByZXN1bHQucGF0aCk7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSB0aGlzLmRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpO1xuXG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVUZW1wbGF0ZUVycm9yKFxuICAgICAgYFJ1bnRpbWUgdGVtcGxhdGVzIGRpcmVjdG9yeSBub3QgZm91bmRgLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3J1bnRpbWUtd2ViJyxcbiAgICAgIHNlYXJjaGVkUGF0aHMsXG4gICAgICBwYWNrYWdlUm9vdCB8fCAndW5rbm93bicsXG4gICAgICAnY29tcHJlaGVuc2l2ZSBzZWFyY2gnLFxuICAgICAgYEVuc3VyZSBAd29ya3RpZi9ydW50aW1lIHBhY2thZ2UgaXMgcHJvcGVybHkgaW5zdGFsbGVkIHdpdGggdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBydW50aW1lIHBhY2thZ2Ugcm9vdCBieSBzZWFyY2hpbmcgZm9yIHBhY2thZ2UuanNvbiB3aXRoIEB3b3JrdGlmL3J1bnRpbWVcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBjdXJyZW50RGlyID0gX19kaXJuYW1lO1xuXG4gICAgLy8gU2VhcmNoIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgcGFja2FnZS5qc29uXG4gICAgd2hpbGUgKGN1cnJlbnREaXIgIT09IHBhdGguZGlybmFtZShjdXJyZW50RGlyKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgICAgICAgaWYgKHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd29ya3RpZi9ydW50aW1lJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvbnRpbnVlIHNlYXJjaGluZyBpZiBKU09OIHBhcnNlIGZhaWxzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zc2libGUgdGVtcGxhdGUgcGF0aHMgYmFzZWQgb24gbW9kdWxlIGxvY2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldE1vZHVsZUJhc2VkUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBpbnN0YWxsZWQgcnVudGltZSBwYWNrYWdlXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAndGVtcGxhdGVzJyksXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBzb3VyY2UgZHVyaW5nIGRldmVsb3BtZW50XG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAndGVtcGxhdGVzJyksXG4gICAgICAvLyBBbHRlcm5hdGl2ZTogcmVsYXRpdmUgdG8gdGhlIHJ1bnRpbWUgcGFja2FnZSByb290XG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnYmluJywgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gQnVuZGxlZCBsb2NhdGlvblxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJyksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zc2libGUgdGVtcGxhdGUgcGF0aHMgZnJvbSBub2RlX21vZHVsZXMgcmVzb2x1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb2RlTW9kdWxlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byByZXNvbHZlIEB3b3JrdGlmL3J1bnRpbWUgcGFja2FnZVxuICAgICAgY29uc3QgcnVudGltZVBhY2thZ2VQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya3RpZi9ydW50aW1lL3BhY2thZ2UuanNvbicpO1xuICAgICAgY29uc3QgcnVudGltZVJvb3QgPSBwYXRoLmRpcm5hbWUocnVudGltZVBhY2thZ2VQYXRoKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKHJ1bnRpbWVSb290LCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSk7XG4gICAgICBwYXRocy5wdXNoKHBhdGguam9pbihydW50aW1lUm9vdCwgJ291dCcsICdkaXN0JywgJ2JpbicsICd0ZW1wbGF0ZXMnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFBhY2thZ2Ugbm90IGZvdW5kIGluIG5vZGVfbW9kdWxlcywgY29udGludWUgd2l0aCBvdGhlciBzdHJhdGVnaWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSB0ZW1wbGF0ZSBwYXRocyBiYXNlZCBvbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbnZpcm9ubWVudEJhc2VkUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgaWYgcnVubmluZyBmcm9tIENMSSBiaW5hcnlcbiAgICBpZiAocHJvY2Vzcy5hcmd2WzFdKSB7XG4gICAgICBjb25zdCBjbGlQYXRoID0gcGF0aC5kaXJuYW1lKHByb2Nlc3MuYXJndlsxXSk7XG4gICAgICBwYXRocy5wdXNoKHBhdGguam9pbihjbGlQYXRoLCAndGVtcGxhdGVzJykpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLmpvaW4oY2xpUGF0aCwgJy4uJywgJ3RlbXBsYXRlcycpKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJykpO1xuICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMnLCAnQHdvcmt0aWYnLCAncnVudGltZScsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcblxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IGEgdGVtcGxhdGUgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBleHBlY3RlZCBzdHJ1Y3R1cmVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeSh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyh0ZW1wbGF0ZVBhdGgpO1xuICAgICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBydW50aW1lLXdlYiBzdWJkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBydW50aW1lV2ViUGF0aCA9IHBhdGguam9pbih0ZW1wbGF0ZVBhdGgsICdydW50aW1lLXdlYicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJ1bnRpbWVXZWJQYXRoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJ1bnRpbWUtd2ViIGNvbnRhaW5zIHRlbXBsYXRlIGRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBydW50aW1lV2ViU3RhdCA9IGZzLnN0YXRTeW5jKHJ1bnRpbWVXZWJQYXRoKTtcbiAgICAgIGlmICghcnVudGltZVdlYlN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSBydW50aW1lLXdlYiBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHJ1bnRpbWVXZWJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5Lm5hbWUpO1xuXG4gICAgICByZXR1cm4gdGVtcGxhdGVEaXJzLmxlbmd0aCA+IDA7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIEdldCBhdmFpbGFibGUgdGVtcGxhdGVzIGluIHRoZSBzcGVjaWZpZWQgY29yZSBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgZ2V0QXZhaWxhYmxlVGVtcGxhdGVzKGNvcmVEaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29yZVBhdGggPSBwYXRoLmpvaW4odGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLCBjb3JlRGlyKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb3JlUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoY29yZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bnRpbWUgdGVtcGxhdGVzIGRpcmVjdG9yeSBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAqIFxuICAgKiBQZXJmb3JtcyBjb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gb2YgdGhlIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6XG4gICAqIC0gVmVyaWZpZXMgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgYWNjZXNzaWJsZVxuICAgKiAtIFZhbGlkYXRlcyBydW50aW1lLXdlYiBzdWJkaXJlY3RvcnkgZXhpc3RzXG4gICAqIC0gQ2hlY2tzIHRoYXQgdGVtcGxhdGVzIGNvbnRhaW4gcmVxdWlyZWQgZmlsZXNcbiAgICogLSBWYWxpZGF0ZXMgdGVtcGxhdGUgc3RydWN0dXJlIGludGVncml0eVxuICAgKi9cbiAgdmFsaWRhdGVSdW50aW1lVGVtcGxhdGVzKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KHRoaXMucnVudGltZVRlbXBsYXRlc0Rpcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGEgc3BlY2lmaWMgY29yZSBkaXJlY3RvcnlcbiAgICovXG4gIHZhbGlkYXRlVGVtcGxhdGVTdHJ1Y3R1cmUoY29yZURpcjogc3RyaW5nID0gJ3J1bnRpbWUtd2ViJyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIG1haW4gdGVtcGxhdGVzIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBUZW1wbGF0ZXMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke3RoaXMucnVudGltZVRlbXBsYXRlc0Rpcn1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgY29yZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBjb3JlUGF0aCA9IHBhdGguam9pbih0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIGNvcmVEaXIpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvcmVQYXRoKSkge1xuICAgICAgICBlcnJvcnMucHVzaChgQ29yZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7Y29yZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGNvcmUgZGlyZWN0b3J5IGlzIGFjdHVhbGx5IGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBjb3JlU3RhdCA9IGZzLnN0YXRTeW5jKGNvcmVQYXRoKTtcbiAgICAgIGlmICghY29yZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaChgQ29yZSBwYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogJHtjb3JlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGF2YWlsYWJsZSB0ZW1wbGF0ZXNcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGlycyA9IGZzLnJlYWRkaXJTeW5jKGNvcmVQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5Lm5hbWUpO1xuXG4gICAgICBpZiAodGVtcGxhdGVEaXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlcnJvcnMucHVzaChgTm8gdGVtcGxhdGUgZGlyZWN0b3JpZXMgZm91bmQgaW46ICR7Y29yZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGVhY2ggdGVtcGxhdGUgZGlyZWN0b3J5XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlRGlyIG9mIHRlbXBsYXRlRGlycykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY29yZVBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRlbXBsYXRlUGF0aCk7XG5cbiAgICAgICAgaWYgKHRlbXBsYXRlRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYFRlbXBsYXRlIGRpcmVjdG9yeSBpcyBlbXB0eTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgVmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJlc29sdmVkIHJ1bnRpbWUgdGVtcGxhdGVzIGRpcmVjdG9yeSBwYXRoXG4gICAqL1xuICBnZXRSdW50aW1lVGVtcGxhdGVzRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZVRlbXBsYXRlc0RpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJ1bnRpbWUgcGFja2FnZSB2ZXJzaW9uIGZvciB0ZW1wbGF0ZSBzdWJzdGl0dXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0UnVudGltZVBhY2thZ2VWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBnZXQgdmVyc2lvbiBmcm9tIHJ1bnRpbWUgcGFja2FnZS5qc29uXG4gICAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHRoaXMuZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk7XG4gICAgICBpZiAocGFja2FnZVJvb3QpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHBhY2thZ2VSb290LCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uIHx8ICcwLjMuMCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW50aW1lUGFja2FnZVBhdGggPSByZXF1aXJlLnJlc29sdmUoJ0B3b3JrdGlmL3J1bnRpbWUvcGFja2FnZS5qc29uJyk7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocnVudGltZVBhY2thZ2VQYXRoLCAndXRmLTgnKSk7XG4gICAgICAgIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uIHx8ICcwLjMuMCc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmluYWwgZmFsbGJhY2tcbiAgICAgICAgcmV0dXJuICcwLjMuMCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJzAuMy4wJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRlbXBsYXRlIHJlc29sdXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgKi9cbiAgZ2V0VGVtcGxhdGVSZXNvbHV0aW9uSW5mbygpOiB7XG4gICAgcnVudGltZVRlbXBsYXRlc0Rpcjogc3RyaW5nO1xuICAgIGlzVmFsaWQ6IGJvb2xlYW47XG4gICAgYXZhaWxhYmxlQ29yZXM6IHN0cmluZ1tdO1xuICAgIHBhY2thZ2VDb250ZXh0OiBzdHJpbmcgfCBudWxsO1xuICAgIHJlc29sdXRpb25TdHJhdGVneTogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHRoaXMuZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcmVzb2x1dGlvbiBzdHJhdGVneSB3YXMgdXNlZFxuICAgIGxldCByZXNvbHV0aW9uU3RyYXRlZ3kgPSAndW5rbm93bic7XG4gICAgaWYgKHBhY2thZ2VSb290ICYmIHRoaXMucnVudGltZVRlbXBsYXRlc0Rpci5pbmNsdWRlcyhwYWNrYWdlUm9vdCkpIHtcbiAgICAgIHJlc29sdXRpb25TdHJhdGVneSA9ICdwYWNrYWdlLmpzb24gZGV0ZWN0aW9uJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucnVudGltZVRlbXBsYXRlc0Rpci5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgIHJlc29sdXRpb25TdHJhdGVneSA9ICdub2RlX21vZHVsZXMgcmVzb2x1dGlvbic7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIuaW5jbHVkZXMoX19kaXJuYW1lKSkge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ21vZHVsZSBsb2NhdGlvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdXRpb25TdHJhdGVneSA9ICdlbnZpcm9ubWVudCBkZXRlY3Rpb24nO1xuICAgIH1cblxuICAgIC8vIEdldCBhdmFpbGFibGUgY29yZSBkaXJlY3Rvcmllc1xuICAgIGNvbnN0IGF2YWlsYWJsZUNvcmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIpKSB7XG4gICAgICAgIGF2YWlsYWJsZUNvcmVzLnB1c2goLi4uZnMucmVhZGRpclN5bmModGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIHdoZW4gcmVhZGluZyBkaXJlY3RvcnlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcnVudGltZVRlbXBsYXRlc0RpcjogdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLFxuICAgICAgaXNWYWxpZDogdGhpcy52YWxpZGF0ZVJ1bnRpbWVUZW1wbGF0ZXMoKSxcbiAgICAgIGF2YWlsYWJsZUNvcmVzLFxuICAgICAgcGFja2FnZUNvbnRleHQ6IHBhY2thZ2VSb290LFxuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgIH07XG4gIH1cbn1cblxuLy8gRXhwb3J0IGFzIFRlbXBsYXRlU2VydmljZSBmb3IgY29tcGF0aWJpbGl0eVxuZXhwb3J0IHsgUnVudGltZVRlbXBsYXRlU2VydmljZSBhcyBUZW1wbGF0ZVNlcnZpY2UgfTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbi8qKlxuICogU2FuaXRpemVzIGEgc3RhY2sgbmFtZSB0byBiZSBjb21wYXRpYmxlIHdpdGggQVdTIENsb3VkRm9ybWF0aW9uIG5hbWluZyByZXF1aXJlbWVudHMuXG4gKiBcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWVzIG11c3Q6XG4gKiAtIEJlIDEtMTI4IGNoYXJhY3RlcnMgbG9uZ1xuICogLSBDb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnNcbiAqIC0gU3RhcnQgd2l0aCBhbiBhbHBoYWJldGljIGNoYXJhY3RlclxuICogLSBOb3QgZW5kIHdpdGggYSBoeXBoZW5cbiAqIFxuICogQHBhcmFtIG5hbWUgLSBUaGUgc3RhY2sgbmFtZSB0byBzYW5pdGl6ZVxuICogQHJldHVybnMgVGhlIHNhbml0aXplZCBzdGFjayBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVN0YWNrTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gUmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMgd2l0aCBoeXBoZW5zXG4gICAgbGV0IHNhbml0aXplZCA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTktXS9nLCAnLScpO1xuXG4gICAgLy8gRW5zdXJlIGl0IHN0YXJ0cyB3aXRoIGEgbGV0dGVyXG4gICAgaWYgKCEvXlthLXpBLVpdLy50ZXN0KHNhbml0aXplZCkpIHtcbiAgICAgICAgc2FuaXRpemVkID0gJ3N0YWNrLScgKyBzYW5pdGl6ZWQ7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZSgvLSsvZywgJy0nKTtcblxuICAgIC8vIFJlbW92ZSB0cmFpbGluZyBoeXBoZW5zXG4gICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UoLy0rJC8sICcnKTtcblxuICAgIC8vIEVuc3VyZSBpdCdzIG5vdCB0b28gbG9uZyAoQ2xvdWRGb3JtYXRpb24gbGltaXQgaXMgMTI4IGNoYXJhY3RlcnMpXG4gICAgaWYgKHNhbml0aXplZC5sZW5ndGggPiAxMjgpIHtcbiAgICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnN1YnN0cmluZygwLCAxMjgpLnJlcGxhY2UoLy0rJC8sICcnKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgaXQncyBub3QgZW1wdHkgYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgaWYgKCFzYW5pdGl6ZWQpIHtcbiAgICAgICAgc2FuaXRpemVkID0gJ3N0YWNrJztcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xufSIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IFB1cmVub3dJbmZyYVJlc291cmNlT3B0aW9ucywgUHVyZW5vd0luZnJhUmVzb3VyY2VzIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9pbmZyYSc7XG5pbXBvcnQgeyBzYW5pdGl6ZVN0YWNrTmFtZSB9IGZyb20gJ0B1dGlscy9zdGFjay1uYW1lLXNhbml0aXplcic7XG5pbXBvcnQge1xuICBEZXBsb3ltZW50RXJyb3IsXG4gIHR5cGUgRGVwbG95bWVudE91dHB1dHMsXG4gIGdldFN0YWdlLFxuICBTdGFja3NEZXBsb3lPcHRpb25zLCBTdGFja3NEZXBsb3lSZXN1bHQsXG4gIFN0YWNrc0RlcGxveVNlcnZpY2UsXG59IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0IH0gZnJvbSAnLi9wdXJlbm93LXJ1bnRpbWUtc3RhY2tzLWRlcGxveS5zZXJ2aWNlLnR5cGVzJztcblxuXG5leHBvcnQgY2xhc3MgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlIGV4dGVuZHMgU3RhY2tzRGVwbG95U2VydmljZSBpbXBsZW1lbnRzIFB1cmVub3dJbmZyYVJlc291cmNlcyB7XG4gIHByb3RlY3RlZCByZWFkb25seSBERUZBVUxUX0NES19ESVIgPSAnY2RrJztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBUd29TdGFja0RlcGxveVNlcnZpY2UgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjd2QgLSBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChwcm9qZWN0IHJvb3QpXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKSB7XG4gICAgc3VwZXIoY3dkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBmaXJzdCBkZXBsb3ltZW50IHdvcmtmbG93OiBkZXBsb3kgSW5mcmEgXHUyMTkyIHJlYWQgb3V0cHV0cyBcdTIxOTIgZGVwbG95IFJ1bnRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRGVwbG95bWVudCBvcHRpb25zXG4gICAqIEBwYXJhbSBzdGFydFRpbWUgLSBEZXBsb3ltZW50IHN0YXJ0IHRpbWVzdGFtcFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gZGVwbG95bWVudCByZXN1bHRcbiAgICogQHRocm93cyB7RGVwbG95bWVudEVycm9yfSBJZiBJbmZyYSBvciBSdW50aW1lIGRlcGxveW1lbnQgZmFpbHNcbiAgICpcbiAgICogQHRvZG86IGNvbXBsZXRlIGV4dGVuc2libGUgZGVwbG95bWVudCBhcHByb2FjaCB3aXRoIGR1cmF0aW9uIG1ldHJpYyBhdHRlbmRhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZXhlY3V0ZURlcGxveTxUIGV4dGVuZHMgU3RhY2tzRGVwbG95UmVzdWx0ID0gU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICBvcHRpb25zOiBTdGFja3NEZXBsb3lPcHRpb25zLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHN0YWdlLCBjb25maWcgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBTYW5pdGl6ZSBzdGFjayBuYW1lcyBmb3IgQVdTIENsb3VkRm9ybWF0aW9uIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBpbmZyYVN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1QdXJlbm93SW5mcmEtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dSdW50aW1lLSR7c3RhZ2V9YCk7XG4gICAgY29uc3QgcnVudGltZVdlYlN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1SdW50aW1lV2ViLSR7c3RhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFnZUNvbmZpZyA9IGdldFN0YWdlKGNvbmZpZywgc3RhZ2UpO1xuICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgIGBTdGFnZSAnJHtzdGFnZX0nIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGNsb3VkRm9ybWF0aW9uQ2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHtcbiAgICAvLyAgIHJlZ2lvbjogc3RhZ2VDb25maWcuYXdzUmVnaW9uLFxuICAgIC8vIH0pO1xuXG4gICAgLy8gU3RlcCAxOiBEZXBsb3kgSW5mcmEgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIEluZnJhc3RydWN0dXJlIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgaW5mcmFSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgaW5mcmFTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFpbmZyYVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnUnVudGltZSBzdGFjayB3aWxsIG5vdCBiZSBkZXBsb3llZC4gRml4IEluZnJhIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBSZWFkIEluZnJhIG91dHB1dHNcbiAgICAvLyBjb25zb2xlLmxvZygnUmVhZGluZyBJbmZyYXN0cnVjdHVyZSBvdXRwdXRzLi4uJyk7XG4gICAgLy8gY29uc3QgaW5mcmFPdXRwdXRzID0gYXdhaXQgdGhpcy5nZXRJbmZyYU91dHB1dHMoY2xvdWRGb3JtYXRpb25DbGllbnQsIHN0YWdlLCBjb25maWcsIGluZnJhU3RhY2tOYW1lLCBzdGFnZUNvbmZpZz8uYXdzUHJvZmlsZSk7XG4gICAgLy8gY29uc29sZS5sb2coYFJldHJpZXZlZCAke09iamVjdC5rZXlzKGluZnJhT3V0cHV0cykubGVuZ3RofSBvdXRwdXRzIGZyb20gSW5mcmFzdHJ1Y3R1cmUgc3RhY2tgKTtcblxuICAgIC8vIFN0ZXAgMzogRGVwbG95IFJ1bnRpbWUgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIFB1cmVub3dSdW50aW1lIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUnVudGltZVdlYiBzdGFjay4uLicpO1xuICAgIGNvbnN0IHJ1bnRpbWVXZWJSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgcnVudGltZVdlYlN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIXJ1bnRpbWVXZWJSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgJ1J1bnRpbWVXZWIgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgaXMgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5LiBGaXggUnVudGltZSBpc3N1ZXMgYW5kIHJldHJ5LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgaW5mcmFTdGFjazogaW5mcmFSZXN1bHQsXG4gICAgICBydW50aW1lU3RhY2s6IHJ1bnRpbWVSZXN1bHQsXG4gICAgICBydW50aW1lV2ViU3RhY2s6IHJ1bnRpbWVXZWJSZXN1bHQsXG4gICAgICBkdXJhdGlvbixcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZGVwbG95bWVudCBvdXRwdXRzIGZyb20gQ0RLIG91dHB1dHMgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrTmFtZSAtIE5hbWUgb2YgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrXG4gICAqIEByZXR1cm5zIERlcGxveW1lbnQgb3V0cHV0cyBtYXBcbiAgICpcbiAgICogQGltcG9ydGFudDogT1BUSU1JU0UgVEhJUyBTT0xVVElPTlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0gb3V0cHV0c1BhdGhcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWU6IHN0cmluZywgb3V0cHV0c1BhdGg6IHN0cmluZyk6IERlcGxveW1lbnRPdXRwdXRzIHtcbiAgICBjb25zdCBvdXRwdXRzOiBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzID0gc3VwZXIucGFyc2VTdGFja091dHB1dHMoc3RhY2tOYW1lLCBvdXRwdXRzUGF0aCkgYXMgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cztcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICAgIHJldHVybiBvdXRwdXRzO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXRzRmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgY2RrT3V0cHV0cyA9IEpTT04ucGFyc2Uob3V0cHV0c0ZpbGVDb250ZW50KTtcblxuICAgICAgLy8gQ0RLIG91dHB1dHMgZmlsZSBzdHJ1Y3R1cmU6IHsgXCJTdGFja05hbWVcIjogeyBcIk91dHB1dEtleVwiOiBcIk91dHB1dFZhbHVlXCIgfSB9XG4gICAgICBjb25zdCBzdGFja091dHB1dHMgPSBjZGtPdXRwdXRzW3N0YWNrTmFtZV07XG4gICAgICBpZiAoc3RhY2tPdXRwdXRzKSB7XG4gICAgICAgIG91dHB1dHMubGFtYmRhQXJuTGlzdCA9IE9iamVjdC5rZXlzKHN0YWNrT3V0cHV0cylcbiAgICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ga2V5Lm1hdGNoKC8oPzpMYW1iZGEpW2EtekEtWl0rQXJuJC8pKVxuICAgICAgICAgIC5tYXAoKGxhbWJkYU1hdGNoOiBhbnkpID0+IHN0YWNrT3V0cHV0c1tsYW1iZGFNYXRjaF0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvdXRwdXRzIGZpbGUgZm9yICR7c3RhY2tOYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dHM7XG4gIH1cblxuXG4gIC8vIEBub3RlOiBkdXBsaWNhdGVzXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzaWduYXR1cmUgZm9yIHRoZSBwcm92aWRlZCByZWdpb24gYnkgZXh0cmFjdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggc2VnbWVudCBpbiB0aGUgcmVnaW9uIHN0cmluZywgZGVsaW1pdGVkIGJ5IGh5cGhlbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpb24gLSBUaGUgcmVnaW9uIHN0cmluZyB0byBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlIGZyb20uIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGEgaHlwaGVuLXNlcGFyYXRlZCBzdHJpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCByZWdpb24gc2lnbmF0dXJlLCBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggdmFsaWQgc2VnbWVudC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGlucHV0IGlzIGludmFsaWQgb3IgZW1wdHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXJlZ2lvbikgcmV0dXJuICcnO1xuXG4gICAgcmV0dXJuIHJlZ2lvblxuICAgICAgLnNwbGl0KCctJylcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAocGFydCA9PiBwYXJ0WzBdID8/ICcnKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlc291cmNlIG5hbWUgYnkgY29uY2F0ZW5hdGluZyBzZXJ2aWNlIG5hbWUsIHJlc291cmNlIG5hbWUsXG4gICAqIHNpbXBsaWZpZWQgcmVnaW9uLCBhbmQgc3RhZ2Ugd2l0aCBoeXBoZW5zIGFzIHNlcGFyYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5uYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNlcnZpY2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZWdpb25TaW1wbGlmaWVkIC0gVGhlIHNpbXBsaWZpZWQgcmVnaW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc3RhZ2UgLSBUaGUgZGVwbG95bWVudCBzdGFnZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb25jYXRlbmF0ZWQgcmVzb3VyY2UgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZXNvdXJjZU5hbWUoeyBuYW1lLCBzZXJ2aWNlTmFtZSwgc3RhZ2UsIHJlZ2lvbiB9OiBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lvblNpbXBsaWZpZWQgPSBzYW5pdGl6ZVN0YWNrTmFtZSh0aGlzLmdldFJlZ2lvblNpZ25hdHVyZShyZWdpb24gfHwgJ3VzLWVhc3QtMScpKTtcbiAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LSR7bmFtZX0tJHtyZWdpb25TaW1wbGlmaWVkfS0ke3N0YWdlfWA7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogUmVhY3QgU2VydmVybGVzcyA8cmVhY3Qtc2VydmVybGVzcz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG4vLyBjb25zdCBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgQm9vdHN0cmFwQ3JlZGVudGlhbHNFcnJvcixcbiAgQm9vdHN0cmFwUmVnaW9uRXJyb3IsXG4gIEJ1aWxkRXJyb3IsXG4gIEJ1aWxkU2VydmljZSxcbiAgYnVpbGRTdGF0aWNIdG1sLFxuICBDZGtCb290c3RyYXBTZXJ2aWNlLFxuICBDb21tYW5kUmVzdWx0LFxuICBEZXBsb3ltZW50RXJyb3IsXG4gIERlcGxveW1lbnRTZXJ2aWNlLFxuICBEZXBsb3lPcHRpb25zLFxuICBEZXBsb3lTZXJ2aWNlLFxuICBkZXRlY3RBbmRWYWxpZGF0ZUNyZWRlbnRpYWxzLFxuICBFbnZpcm9ubWVudFZhbGlkYXRvcixcbiAgRnJpZW5kbHlFcnJvckZvcm1hdHRlcixcbiAgZ2V0U3RhZ2UsXG4gIExvZ2dlcixcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd0NsaUNvbmZpZyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvdXRpbHMnO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UgZXh0ZW5kcyBEZXBsb3ltZW50U2VydmljZSB7XG4gIC8qKlxuICAgKiBEZXBsb3kgYXBwbGljYXRpb24gdG8gQVdTXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVwbG95Q29tbWFuZChcbiAgICBzdGFja3NEZXBsb3lTZXJ2aWNlOiBTdGFja3NEZXBsb3lTZXJ2aWNlLFxuICAgIG9wdGlvbnM6IERlcGxveU9wdGlvbnMsXG4gICAgY29uZmlnOiBQdXJlbm93Q2xpQ29uZmlnLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnZWYWxpZGF0b3I/OiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbiAgKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIEFXUyBjcmVkZW50aWFscyBlYXJseSBpZiB2YWxpZGF0b3IgcHJvdmlkZWRcbiAgICAgIGlmIChlbnZWYWxpZGF0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBlbnZWYWxpZGF0b3IuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgaWYgKGNvbmZpZy5pc0F3c0NyZWRlbnRpYWxzRHVtcCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBjcmVkZW50aWFscyBETyBOT1QgZXhpc3QsIHBsZWFzZSBjb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzIGZpcnN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvckZvcm1hdHRlciA9IG5ldyBGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JGb3JtYXR0ZXIuZm9ybWF0TWlzc2luZ0NyZWRlbnRpYWxzRXJyb3IoWydBV1NfQUNDRVNTX0tFWV9JRCcsICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknXSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRvZG86IHNldCBzdGFnZSBvcmRlciBkZXRlY3RvciB0byBkb2N1bWVudGF0aW9uIFJFQURNRS5tZCB0byBrbm93XG4gICAgICAvLyAgICAgICAgQ0xJIHN0YWdlIFx1MjAxMz4gZW52IFNUQUdFIFx1MjAxMz4gY29uZmlnLnN0YWdlWzBdIFx1MjAxMz4gZGV2IChkZWZhdWx0KVxuICAgICAgLy8gICBcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcdTIwMTNcbiAgICAgIC8vIERldGVybWluZSBzdGFnZVxuICAgICAgY29uc3Qgc3RhZ2UgPSBvcHRpb25zLnN0YWdlIHx8IHByb2Nlc3MuZW52LlNUQUdFIHx8IGNvbmZpZy5zdGFnZXNbMF0/Lm5hbWUgfHwgJ2Rldic7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHN0YWdlIGV4aXN0cyBpbiBjb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBzdGFnZUNvbmZpZyA9IGdldFN0YWdlKGNvbmZpZywgc3RhZ2UpO1xuICAgICAgaWYgKCFzdGFnZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAgIGBTdGFnZSAnJHtzdGFnZX0nIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICBgQXZhaWxhYmxlIHN0YWdlczogJHtjb25maWcuc3RhZ2VzLm1hcChzID0+IHMubmFtZSkuam9pbignLCAnKX1cXG5gICtcbiAgICAgICAgICBgVXBkYXRlIHlvdXIgcHVyZW5vdy5jb25maWcudHMgdG8gYWRkIHRoaXMgc3RhZ2UuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYnVpbGRTdGF0aWNIdG1sKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmJvbGQoYERlcGxveWluZyB0byBBV1MgKHN0YWdlOiAke2NoYWxrLmN5YW4oc3RhZ2UpfSkuLi5gKSk7XG4gICAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICAgIC8vIEluaXRpYWxpemUgc2VydmljZXNcbiAgICAgIGNvbnN0IGRlcGxveVNlcnZpY2UgPSBuZXcgRGVwbG95U2VydmljZShjd2QpO1xuICAgICAgY29uc3QgYnVpbGRTZXJ2aWNlID0gbmV3IEJ1aWxkU2VydmljZShjd2QpO1xuICAgICAgY29uc3QgYm9vdHN0cmFwU2VydmljZSA9IG5ldyBDZGtCb290c3RyYXBTZXJ2aWNlKGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMTogRGV0ZWN0IGFuZCB2YWxpZGF0ZSBBV1MgY3JlZGVudGlhbHNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgZGV0ZWN0QW5kVmFsaWRhdGVDcmVkZW50aWFscyhsb2dnZXIpO1xuICAgICAgY29uc3QgcmVnaW9uID0gc3RhZ2VDb25maWcuYXdzUmVnaW9uID8/IGNyZWRlbnRpYWxzLnJlZ2lvbiA/PyAndXMtZWFzdC0xJztcblxuICAgICAgLy8gU3RlcCAyOiBWYWxpZGF0ZSBBV1MgY3JlZGVudGlhbHMgd2l0aCBTVFNcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVDcmVkZW50aWFscyhkZXBsb3lTZXJ2aWNlLCBzdGFnZUNvbmZpZywgbG9nZ2VyKTtcblxuICAgICAgLy8gU3RlcCAzOiBFbnN1cmUgQ0RLIGVudmlyb25tZW50IGlzIGJvb3RzdHJhcHBlZFxuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVCb290c3RyYXBwZWQoYm9vdHN0cmFwU2VydmljZSwgY29uZmlnLCBzdGFnZUNvbmZpZywgY3JlZGVudGlhbHMsIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA0OiBQcmUtZGVwbG95bWVudCB2YWxpZGF0aW9uXG4gICAgICBhd2FpdCB0aGlzLnBlcmZvcm1QcmVEZXBsb3ltZW50VmFsaWRhdGlvbihzdGFnZSwgY29uZmlnLCBvcHRpb25zLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgNTogRXhlY3V0ZSB0d28tc3RhY2sgZGVwbG95bWVudFxuICAgICAgY29uc3QgcmVzdWx0OiBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWNrc0RlcGxveW1lbnQ8UHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQ+KFxuICAgICAgICBzdGFja3NEZXBsb3lTZXJ2aWNlLFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIG9wdGlvbnMuc2tpcEJ1aWxkLFxuICAgICAgICBvcHRpb25zLnZlcmJvc2UsXG4gICAgICApO1xuXG4gICAgICAvLyBTdGVwIDY6IENsZWFyIFMzIGNhY2hlIGlmIGVuYWJsZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYXJTM0NhY2hlRGVwbG95bWVudChyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgNzogVXBsb2FkIFJlYWN0IEJ1aWxkIHRvIFMzXG4gICAgICBhd2FpdCB0aGlzLnVwbG9hZFJlYWN0QnVuZGxlKHJlc3VsdC5pbmZyYVN0YWNrLCBjb25maWcsIHJlZ2lvbiwgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDg6IFVwbG9hZCBwdWJsaWMgYXNzZXRzIHRvIFMzXG4gICAgICBhd2FpdCB0aGlzLnVwbG9hZFB1YmxpY0Fzc2V0cyhyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA5OiBJbnZhbGlkYXRlIENsb3VkRnJvbnQgY2FjaGVcbiAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRDYWNoZShyZXN1bHQucnVudGltZVdlYlN0YWNrLCBjb25maWcsIHJlZ2lvbiwgbG9nZ2VyKTtcblxuICAgICAgLy8gU3RlcCAxMDogSW5qZWN0IEFQSSBHYXRld2F5IFVSTCBpbnRvIC5lbnYgZmlsZVxuICAgICAgYXdhaXQgdGhpcy5pbmplY3RBcGlHYXRld2F5VXJsKHJlc3VsdC5ydW50aW1lV2ViU3RhY2ssIGNvbmZpZywgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDExOiBEaXNwbGF5IGRlcGxveW1lbnQgc3VtbWFyeVxuICAgICAgdGhpcy5kaXNwbGF5U3RhY2tzRGVwbG95bWVudFN1bW1hcnkocmVzdWx0LCBsb2dnZXIpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERlcGxveW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEJ1aWxkRXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZGltKGVycm9yLmhpbnQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEJvb3RzdHJhcENyZWRlbnRpYWxzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBCb290c3RyYXBSZWdpb25FcnJvcikge1xuICAgICAgICAvLyBCb290c3RyYXAgY3JlZGVudGlhbC9yZWdpb24gZXJyb3JzIGFscmVhZHkgbG9nZ2VkIGluIGRldGVjdEFuZFZhbGlkYXRlQ3JlZGVudGlhbHNcbiAgICAgICAgLy8gSnVzdCByZXR1cm4gd2l0aCBleGl0IGNvZGUgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgIGV4aXRDb2RlOiAxLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSB0d28tc3RhY2sgZGVwbG95bWVudCBzdW1tYXJ5IHdpdGggb3V0cHV0cyBmcm9tIGJvdGggSW5mcmEgYW5kIFJ1bnRpbWUgc3RhY2tzXG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KFxuICAgIHJlc3VsdDogUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQsXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIEBub3RlOiBkaXNwbGF5IGFsbCBQdXJlbm93IGRlcGxveW1lbnQgaW5mbyBieSBkZWZhdWx0XG4gICAgc3VwZXIuZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KHJlc3VsdCwgbG9nZ2VyLCB7IG1vZGlmaWVkOiB0cnVlIH0pO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1J1bnRpbWUgV2ViIFN0YWNrOicpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1N0YWNrIE5hbWU6JyksXG4gICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLnN0YWNrTmFtZSksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ0R1cmF0aW9uOicpLFxuICAgICAgY2hhbGsud2hpdGUodGhpcy5mb3JtYXREdXJhdGlvbihyZXN1bHQucnVudGltZVdlYlN0YWNrLmR1cmF0aW9uKSksXG4gICAgKTtcblxuICAgIC8vIERpc3BsYXkgQVBJIEdhdGV3YXkgVVJMIGZyb20gUnVudGltZSBzdGFja1xuICAgIGlmIChyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMuYXBpR2F0ZXdheVVybCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsuY3lhbignQVBJIEdhdGV3YXk6JyksXG4gICAgICAgIGNoYWxrLndoaXRlKHJlc3VsdC5ydW50aW1lV2ViU3RhY2sub3V0cHV0cy5hcGlHYXRld2F5VXJsKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBMYW1iZGEgQVJOIGZyb20gUnVudGltZSBzdGFja1xuICAgIGlmIChyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdCAmJiByZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKCcgICcpLFxuICAgICAgICBjaGFsay5jeWFuKCdMYW1iZGFzOicpLFxuICAgICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5sZW5ndGgpLFxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5ydW50aW1lV2ViU3RhY2sub3V0cHV0cy5sYW1iZGFBcm5MaXN0LmZvckVhY2goKGxhbWJkYUFybjogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgICBjaGFsay5jeWFuKCcgIExhbWJkYSBBUk46JyksXG4gICAgICAgICAgY2hhbGsud2hpdGUobGFtYmRhQXJuKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgcmVnaW9uIGFuZCBzdGFnZVxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdEZXBsb3ltZW50IEluZm86JykpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuZGltKCcgICcpLFxuICAgICAgY2hhbGsuY3lhbignUmVnaW9uOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LmluZnJhU3RhY2sucmVnaW9uKSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuZGltKCcgICcpLFxuICAgICAgY2hhbGsuY3lhbignU3RhZ2U6JyksXG4gICAgICBjaGFsay53aGl0ZShyZXN1bHQuaW5mcmFTdGFjay5zdGFnZSksXG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgfVxuXG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIExvZ2dlcixcbiAgQnVpbGRSZXN1bHQsXG4gIEJ1aWxkU2VydmljZSxcbiAgQnVpbGRUYXJnZXQsXG4gIEJ1aWxkRXJyb3IsXG4gIEZyaWVuZGx5RW52aXJvbm1lbnRFcnJvcixcbiAgLy8gUHVyZW5vd0NsaUNvbmZpZywgLy8gVE9ETzogSW1wb3J0IGZyb20gcHJvcGVyIGxvY2F0aW9uXG4gIGJ1aWxkU3RhdGljSHRtbFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGJ1aWxkIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICAvKiogU3BlY2lmaWMgdGFyZ2V0IHRvIGJ1aWxkIChyZWFjdCwgbGFtYmRhLCBjZGssIG9yIGFsbCkgKi9cbiAgdGFyZ2V0PzogJ3JlYWN0JyB8ICdsYW1iZGEnIHwgJ2NkaycgfCAnYWxsJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBidWlsZCB0YXJnZXQgcmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzXG4gKi9cbmZ1bmN0aW9uIHRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHModGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTGFtYmRhIGFuZCBDREsgdGFyZ2V0cyBtYXkgbmVlZCBBV1MgY3JlZGVudGlhbHMgZm9yIGRlcGxveW1lbnQtcmVsYXRlZCBvcGVyYXRpb25zXG4gIC8vIFJlYWN0IHRhcmdldCBkb2VzIG5vdCByZXF1aXJlIEFXUyBjcmVkZW50aWFsc1xuICByZXR1cm4gdGFyZ2V0ID09PSAnbGFtYmRhJyB8fCB0YXJnZXQgPT09ICdjZGsnIHx8IHRhcmdldCA9PT0gJ2FsbCc7XG59XG5cbi8qKlxuICogQnVpbGQgYXBwbGljYXRpb24gdGFyZ2V0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21tYW5kKFxuICBvcHRpb25zOiBCdWlsZE9wdGlvbnMsXG4gIGNvbmZpZzogYW55LCAvLyBUT0RPOiBVc2UgcHJvcGVyIFB1cmVub3dDbGlDb25maWcgdHlwZVxuICBsb2dnZXI6IExvZ2dlcixcbiAgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBlbnZWYWxpZGF0b3I/OiBhbnksIC8vIFRPRE86IEltcG9ydCBwcm9wZXIgdHlwZSBmcm9tIHB1cmVub3dcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0IHx8ICdhbGwnO1xuXG4gICAgLy8gVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIGlmIGJ1aWxkaW5nIEFXUyB0YXJnZXRzIGFuZCB2YWxpZGF0b3IgcHJvdmlkZWRcbiAgICBpZiAodGFyZ2V0UmVxdWlyZXNDcmVkZW50aWFscyh0YXJnZXQpICYmIGVudlZhbGlkYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICBpZiAoY29uZmlnLmlzQXdzQ3JlZGVudGlhbHNEdW1wKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBjcmVkZW50aWFscyBETyBOT1QgZXhpc3QsIHBsZWFzZSBjb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzIGZpcnN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZvciBidWlsZCBjb21tYW5kLCB3ZSdsbCBzaG93IGEgd2FybmluZyBidXQgYWxsb3cgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlXG4gICAgICAgIC8vIHNpbmNlIHRoZSBidWlsZCBpdHNlbGYgZG9lc24ndCByZXF1aXJlIEFXUyBjcmVkZW50aWFscywgb25seSBkZXBsb3ltZW50IGRvZXNcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRnJpZW5kbHlFbnZpcm9ubWVudEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0FXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZGltKCdCdWlsZGluZyB3aXRob3V0IEFXUyBjcmVkZW50aWFscy4gWW91IHdpbGwgbmVlZCB0byBjb25maWd1cmUgdGhlbSBiZWZvcmUgZGVwbG95bWVudC4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgY29uc3QgYnVpbGRTZXJ2aWNlID0gbmV3IEJ1aWxkU2VydmljZShjd2QpO1xuXG4gICAgbG9nZ2VyLmluZm8oY2hhbGsuYm9sZCgnQnVpbGRpbmcgUnVudGltZSBhcHBsaWNhdGlvbi4uLicpKTtcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICBsZXQgcmVzdWx0czogQnVpbGRSZXN1bHRbXTtcbiAgICBsZXQgc2hvdWxkR2VuZXJhdGVUeXBlcyA9IGZhbHNlO1xuXG4gICAgaWYgKHRhcmdldCA9PT0gJ2FsbCcpIHtcbiAgICAgIC8vIEJ1aWxkIGFsbCB0YXJnZXRzXG4gICAgICAvLyBPbmx5IGdlbmVyYXRlIHR5cGVzIGZvciBSdW50aW1lIHBhY2thZ2UgaXRzZWxmLCBub3QgY29uc3VtZXIgcHJvamVjdHNcbiAgICAgIGNvbnN0IGlzUnVudGltZVBhY2thZ2UgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjd2QsICdzcmMvY29yZS9pbmRleC50cycpKTtcbiAgICAgIHNob3VsZEdlbmVyYXRlVHlwZXMgPSBpc1J1bnRpbWVQYWNrYWdlO1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IGJ1aWxkQWxsVGFyZ2V0cyhidWlsZFNlcnZpY2UsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnVpbGQgc3BlY2lmaWMgdGFyZ2V0XG4gICAgICByZXN1bHRzID0gYXdhaXQgYnVpbGRTaW5nbGVUYXJnZXQoYnVpbGRTZXJ2aWNlLCB0YXJnZXQsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBpZiBidWlsZGluZyBhbGwgdGFyZ2V0cyAoUnVudGltZSBwYWNrYWdlIG9ubHkpXG4gICAgaWYgKHNob3VsZEdlbmVyYXRlVHlwZXMpIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucyhidWlsZFNlcnZpY2UsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IGJ1aWxkIHN1bW1hcnlcbiAgICBkaXNwbGF5QnVpbGRTdW1tYXJ5KHJlc3VsdHMsIGN3ZCwgbG9nZ2VyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZXhpdENvZGU6IDAsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5kaW0oZXJyb3IuaGludCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcbiAgICAgIGV4aXRDb2RlOiAxLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBhbGwgdGFyZ2V0cyBzZXF1ZW50aWFsbHkgd2l0aCBwcm9ncmVzcyBpbmRpY2F0b3JzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWxsVGFyZ2V0cyhcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8QnVpbGRSZXN1bHRbXT4ge1xuICAvLyBDaGVjayBpZiB3ZSdyZSBpbiB0aGUgUnVudGltZSBwYWNrYWdlIGl0c2VsZiBvciBhIGNvbnN1bWVyIHByb2plY3RcbiAgY29uc3QgaXNSdW50aW1lUGFja2FnZSA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdzcmMvY29yZS9pbmRleC50cycpKTtcblxuICAvLyBGb3IgY29uc3VtZXIgcHJvamVjdHMsIG9ubHkgYnVpbGQgUmVhY3RcbiAgLy8gTGFtYmRhIGFuZCBDREsgYXJlIGludGVybmFsIHRvIFJ1bnRpbWUgYW5kIHByZS1idWlsdCBpbiB0aGUgcGFja2FnZVxuICBjb25zdCB0YXJnZXRzOiBCdWlsZFRhcmdldFtdID0gaXNSdW50aW1lUGFja2FnZVxuICAgID8gWydyZWFjdCcsICdsYW1iZGEnLCAnY2RrJ11cbiAgICA6IFsncmVhY3QnXTtcblxuICBjb25zdCByZXN1bHRzOiBCdWlsZFJlc3VsdFtdID0gW107XG5cbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcihgQnVpbGRpbmcgJHt0YXJnZXR9IGJ1bmRsZS4uLmApO1xuICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2VydmljZS5idWlsZFRhcmdldCh0YXJnZXQsIGNvbmZpZyk7XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSAoJHtmb3JtYXREdXJhdGlvbihyZXN1bHQuZHVyYXRpb24pfSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bpbm5lci5mYWlsKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlIGZhaWxlZGApO1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkRXJyb3IoXG4gICAgICAgIGBCdWlsZCBmYWlsZWQgZm9yIHRhcmdldCAnJHt0YXJnZXR9J2AsXG4gICAgICAgIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQnVpbGQgYSBzaW5nbGUgdGFyZ2V0IHdpdGggcHJvZ3Jlc3MgaW5kaWNhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU2luZ2xlVGFyZ2V0KFxuICBidWlsZFNlcnZpY2U6IEJ1aWxkU2VydmljZSxcbiAgdGFyZ2V0OiBCdWlsZFRhcmdldCxcbiAgY29uZmlnOiBhbnksXG4gIGxvZ2dlcjogTG9nZ2VyLFxuKTogUHJvbWlzZTxCdWlsZFJlc3VsdFtdPiB7XG4gIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcihgQnVpbGRpbmcgJHt0YXJnZXR9IGJ1bmRsZS4uLmApO1xuICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTZXJ2aWNlLmJ1aWxkVGFyZ2V0KHRhcmdldCwgY29uZmlnKTtcblxuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBzcGlubmVyLnN1Y2NlZWQoYCR7Y2FwaXRhbGl6ZSh0YXJnZXQpfSBidW5kbGUgKCR7Zm9ybWF0RHVyYXRpb24ocmVzdWx0LmR1cmF0aW9uKX0pYCk7XG4gIH0gZWxzZSB7XG4gICAgc3Bpbm5lci5mYWlsKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlIGZhaWxlZGApO1xuICAgIHRocm93IG5ldyBCdWlsZEVycm9yKFxuICAgICAgYEJ1aWxkIGZhaWxlZCBmb3IgdGFyZ2V0ICcke3RhcmdldH0nYCxcbiAgICAgIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHRdO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucyhcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoJ0dlbmVyYXRpbmcgdHlwZSBkZWNsYXJhdGlvbnMuLi4nKTtcbiAgc3Bpbm5lci5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRTZXJ2aWNlLmdlbmVyYXRlVHlwZXMoY29uZmlnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1R5cGUgZGVjbGFyYXRpb25zJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdUeXBlIGRlY2xhcmF0aW9ucyBmYWlsZWQnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgYnVpbGQgc3VtbWFyeSB3aXRoIGFydGlmYWN0IGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlCdWlsZFN1bW1hcnkoXG4gIHJlc3VsdHM6IEJ1aWxkUmVzdWx0W10sXG4gIGN3ZDogc3RyaW5nLFxuICBsb2dnZXI6IExvZ2dlcixcbik6IHZvaWQge1xuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgLy8gQ2FsY3VsYXRlIHRvdGFsIGR1cmF0aW9uXG4gIGNvbnN0IHRvdGFsRHVyYXRpb24gPSByZXN1bHRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLmR1cmF0aW9uLCAwKTtcblxuICBsb2dnZXIuc3VjY2VzcyhjaGFsay5ib2xkKGBCdWlsZCBjb21wbGV0ZSBpbiAke2Zvcm1hdER1cmF0aW9uKHRvdGFsRHVyYXRpb24pfWApKTtcblxuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0FydGlmYWN0czonKSk7XG5cbiAgLy8gRGlzcGxheSBlYWNoIGFydGlmYWN0IHdpdGggc2l6ZVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsIHJlc3VsdC5vdXRwdXRQYXRoKTtcbiAgICAgIGNvbnN0IHNpemUgPSBnZXRGaWxlU2l6ZShmdWxsUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGN3ZCwgZnVsbFBhdGgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKCcgICcpLFxuICAgICAgICBjaGFsay53aGl0ZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgICBjaGFsay5kaW0oYCgke3NpemV9KWApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG59XG5cbi8qKlxuICogR2V0IGZpbGUgc2l6ZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gZ2V0RmlsZVNpemUoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZvcm1hdEJ5dGVzKHN0YXRzLnNpemUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGJ5dGVzIHRvIGh1bWFuLXJlYWRhYmxlIHNpemVcbiAqL1xuZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChieXRlcyA9PT0gMCkgcmV0dXJuICcwIEInO1xuXG4gIGNvbnN0IGsgPSAxMDI0O1xuICBjb25zdCBzaXplcyA9IFsnQicsICdLQicsICdNQicsICdHQiddO1xuICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG5cbiAgcmV0dXJuIGAkeyhieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDEpfSAke3NpemVzW2ldfWA7XG59XG5cbi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB0byBodW1hbi1yZWFkYWJsZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtcyA8IDEwMDApIHtcbiAgICByZXR1cm4gYCR7bXN9bXNgO1xuICB9XG5cbiAgY29uc3Qgc2Vjb25kcyA9IChtcyAvIDEwMDApLnRvRml4ZWQoMSk7XG4gIHJldHVybiBgJHtzZWNvbmRzfXNgO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENvbW1hbmRSZXN1bHQsIExvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgQ2RrSW5pdFNlcnZpY2UsXG4gICAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgICBQYWNrYWdlTWFuYWdlcixcbiAgICBQYWNrYWdlTWFuYWdlclNlcnZpY2UsXG4gICAgQXdzQ3JlZGVudGlhbHNEZXRlY3RvcixcbiAgICBsb2dDcmVkZW50aWFsc0Vycm9yLFxuICAgIEF3c1JlZ2lvblJlc29sdmVyLFxuICAgIFByb21wdFNlcnZpY2UsXG4gICAgVmFsaWRhdGlvbkVycm9yLFxuICAgIEVudmlyb25tZW50VmFsaWRhdG9yLFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBydW50aW1lIGluaXQgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVJbml0T3B0aW9ucyB7XG4gICAgLyoqIFRhcmdldCBkaXJlY3RvcnkgZm9yIHRoZSBuZXcgcHJvamVjdCAqL1xuICAgIGRpcj86IHN0cmluZztcbiAgICAvKiogVGVtcGxhdGUgbmFtZSB0byB1c2UgKi9cbiAgICB0ZW1wbGF0ZT86IHN0cmluZztcbiAgICAvKiogSW5pdGlhbGl6ZSBDREsgaW5mcmFzdHJ1Y3R1cmUgb25seSAqL1xuICAgIGNkaz86IGJvb2xlYW47XG4gICAgLyoqIFByb2plY3QgY29yZSBpbnN0YW5jZTogYWx3YXlzIHJ1bnRpbWUtd2ViIGZvciBydW50aW1lIHBhY2thZ2UgKi9cbiAgICBjb3JlPzogc3RyaW5nO1xuICAgIC8qKiBGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi9cbiAgICBmb3JjZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBSdW50aW1lIHByb2plY3QgdXNpbmcgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZXNcbiAqIFxuICogVGhpcyBjb21tYW5kIGV4dGVuZHMgcHVyZW5vdydzIGluaXQgZnVuY3Rpb25hbGl0eSBidXQgdXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gKiB0byBlbnN1cmUgdGVtcGxhdGVzIGFyZSByZXNvbHZlZCBmcm9tIHRoZSBydW50aW1lIHBhY2thZ2UncyBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bnRpbWVJbml0Q29tbWFuZChcbiAgICBvcHRpb25zOiBSdW50aW1lSW5pdE9wdGlvbnMsXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudlZhbGlkYXRvcj86IEVudmlyb25tZW50VmFsaWRhdG9yLFxuKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gICAgLy8gTm90ZTogZW52VmFsaWRhdG9yIGlzIG9wdGlvbmFsIGFuZCBvbmx5IHVzZWQgZm9yIENESyBib290c3RyYXBcbiAgICAvLyBJbml0IGNvbW1hbmQgZG9lcyBOT1QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHNcbiAgICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoXG4gICAgICAgIG9wdGlvbnMuY2RrID8gJ0luaXRpYWxpemluZyBDREsgaW5mcmFzdHJ1Y3R1cmUuLi4nIDogJ0luaXRpYWxpemluZyBSdW50aW1lIHByb2plY3QuLi4nLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgcnVudGltZSB0ZW1wbGF0ZSBzZXJ2aWNlICh1c2VzIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UpXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlU2VydmljZSA9IG5ldyBUZW1wbGF0ZVNlcnZpY2UoY3dkKTtcbiAgICAgICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgQ0RLIGRpcmVjdG9yeSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKHVubGVzcyBmb3JjZSBmbGFnIGlzIHNldClcbiAgICAgICAgaWYgKG9wdGlvbnMuY2RrICYmICFvcHRpb25zLmZvcmNlICYmIHRlbXBsYXRlU2VydmljZS5jZGtEaXJlY3RvcnlFeGlzdHMoY3dkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgICAnQ0RLIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cycsXG4gICAgICAgICAgICAgICAgJ1VzZSAtLWZvcmNlIGZsYWcgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIENESyBpbmZyYXN0cnVjdHVyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBvcHRpb25zIHdpdGggcnVudGltZS1zcGVjaWZpYyBkZWZhdWx0c1xuICAgICAgICBjb25zdCB0YXJnZXREaXIgPSBvcHRpb25zLmRpciB8fCAob3B0aW9ucy5jZGsgPyAnY2RrJyA6IGN3ZCk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gb3B0aW9ucy5jZGsgPyAnY2RrJyA6IChvcHRpb25zLnRlbXBsYXRlIHx8ICdiYXNpYycpO1xuICAgICAgICBjb25zdCBjb3JlID0gJ3J1bnRpbWUtd2ViJzsgLy8gQWx3YXlzIHVzZSBydW50aW1lLXdlYiBmb3IgcnVudGltZSBwYWNrYWdlXG4gICAgICAgIGxldCBmb3JjZSA9IG9wdGlvbnMuZm9yY2UgfHwgZmFsc2U7XG5cbiAgICAgICAgLy8gRGVyaXZlIHByb2plY3QgbmFtZSBmcm9tIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGN3ZCwgb3B0aW9ucy5jZGsgPyBjd2QgOiB0YXJnZXREaXIpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgcHJvamVjdCBmaWxlcyAoaWYgbm90IENESy1vbmx5IGluaXQpXG4gICAgICAgIGlmICghb3B0aW9ucy5jZGsgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFRhcmdldERpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0ZpbGVzID0gYXdhaXQgY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyhyZXNvbHZlZFRhcmdldERpcik7XG5cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGlzdGluZyBwcm9qZWN0IGZpbGVzIGRldGVjdGVkOicpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIC0gJHtmaWxlfWApKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkT3ZlcndyaXRlID0gYXdhaXQgcHJvbXB0U2VydmljZS5jb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAnRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZXNlIGZpbGVzPycsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBEZWZhdWx0IHRvIE5vXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2hvdWxkT3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9qZWN0IGluaXRpYWxpemF0aW9uIGNhbmNlbGxlZC4gRXhpc3RpbmcgZmlsZXMgcHJlc2VydmVkLicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFVzZXIgY29uZmlybWVkIG92ZXJ3cml0ZVxuICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyBVc2UgUnVudGltZVRlbXBsYXRlU2VydmljZSB0byBzY2FmZm9sZCB3aXRoIHJ1bnRpbWUtd2ViIHRlbXBsYXRlc1xuICAgICAgICBhd2FpdCB0ZW1wbGF0ZVNlcnZpY2Uuc2NhZmZvbGQoXG4gICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgIHRhcmdldERpciwge1xuICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICBmb3JjZSxcbiAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcmUsIC8vIEFsd2F5cyBydW50aW1lLXdlYlxuICAgICAgICApO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChcbiAgICAgICAgICAgIG9wdGlvbnMuY2RrID8gJ0NESyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkhJyA6ICdSdW50aW1lIHByb2plY3QgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRGlzcGxheSBzdWNjZXNzIG1lc3NhZ2UgYW5kIG5leHQgc3RlcHNcbiAgICAgICAgaWYgKG9wdGlvbnMuY2RrKSB7XG4gICAgICAgICAgICBkaXNwbGF5Q2RrU3VjY2Vzc01lc3NhZ2UobG9nZ2VyLCBwcm9qZWN0TmFtZSwgdGFyZ2V0RGlyLCBjd2QpO1xuXG4gICAgICAgICAgICAvLyBGb3IgQ0RLLW9ubHkgaW5pdCwgY2hlY2sgY3JlZGVudGlhbHMgYW5kIG9mZmVyIGJvb3RzdHJhcFxuICAgICAgICAgICAgaWYgKGVudlZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2RrRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMobG9nZ2VyLCBlbnZWYWxpZGF0b3IsIHJlc29sdmVkQ2RrRGlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXlSdW50aW1lU3VjY2Vzc01lc3NhZ2UobG9nZ2VyLCBwcm9qZWN0TmFtZSwgdGFyZ2V0RGlyLCBjd2QpO1xuXG4gICAgICAgICAgICAvLyBBZnRlciBtYWluIHByb2plY3QgaW5pdGlhbGl6YXRpb24sIHByb21wdCBmb3IgQ0RLIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgICBjb25zdCBwcm9tcHRTZXJ2aWNlID0gbmV3IFByb21wdFNlcnZpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEluaXRDZGsgPSBhd2FpdCBwcm9tcHRTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICAgICAgICAgJ0RvIHlvdSB3YW50IHRvIGluaXRpYWxpemUgQVdTIENESyBpbmZyYXN0cnVjdHVyZSBmb3IgdGhpcyBwcm9qZWN0IG5vdz8nLFxuICAgICAgICAgICAgICAgIHRydWUsIC8vIERlZmF1bHQgdG8gWWVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc2hvdWxkSW5pdENkaykge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgQ0RLIHdvcmtmbG93IHdpdGggcnVudGltZS13ZWIgY29yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNka1Jlc3VsdCA9IGF3YWl0IGluaXRpYWxpemVDZGtXb3JrZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKSxcbiAgICAgICAgICAgICAgICAgICAgY29yZSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBlbnZWYWxpZGF0b3IsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY2RrUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ0RLIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgYnV0IG1haW4gcHJvamVjdCBpcyBPS1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignQ0RLIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgYnV0IHlvdXIgUnVudGltZSBwcm9qZWN0IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gaW5pdGlhbGl6ZSBDREsgbGF0ZXIgYnkgcnVubmluZzogbnBtIGluc3RhbGwgJiYgcnVudGltZSBpbml0IC0tY2RrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGRlY2xpbmVkIENESyBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gaW5pdGlhbGl6ZSBDREsgbGF0ZXIgYnkgcnVubmluZzogbnBtIGluc3RhbGwgJiYgcnVudGltZSBpbml0IC0tY2RrJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKG9wdGlvbnMuY2RrID8gJ0ZhaWxlZCB0byBpbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZScgOiAnRmFpbGVkIHRvIGluaXRpYWxpemUgUnVudGltZSBwcm9qZWN0Jyk7XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBzdWNjZXNzIG1lc3NhZ2UgZm9yIFJ1bnRpbWUgcHJvamVjdHMgd2l0aCBuZXh0IHN0ZXBzXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlSdW50aW1lU3VjY2Vzc01lc3NhZ2UoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBjd2Q6IHN0cmluZyxcbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICBjb25zdCBpc0N1cnJlbnREaXIgPSByZXNvbHZlZERpciA9PT0gY3dkO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoY2hhbGsuYm9sZChgUnVudGltZSBwcm9qZWN0ICcke3Byb2plY3ROYW1lfScgY3JlYXRlZCBzdWNjZXNzZnVsbHkhYCkpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnUHJvamVjdCBzdHJ1Y3R1cmU6JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgc3JjLycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTFDXHUyNTAwXHUyNTAwIGluZGV4LnRzeCAgICAgICAjIFJlYWN0IGFwcCBlbnRyeScpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTFDXHUyNTAwXHUyNTAwIEFwcC50c3ggICAgICAgICAjIFJvb3QgY29tcG9uZW50JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgcm91dGVzLnRzeCAgICAgICMgUmVhY3QgUm91dGVyIHJvdXRlcycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHB1YmxpYy8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxNFx1MjUwMFx1MjUwMCBpbmRleC5odG1sJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgcnVudGltZS5jb25maWcudHMgICAjIFJ1bnRpbWUgY29uZmlndXJhdGlvbicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHRzY29uZmlnLmpzb24gICAgICAgIyBUeXBlU2NyaXB0IGNvbmZpZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTE0XHUyNTAwXHUyNTAwIHBhY2thZ2UuanNvbicpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ05leHQgc3RlcHM6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBpZiAoIWlzQ3VycmVudERpcikge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAgIGNkICR7cGF0aC5yZWxhdGl2ZShjd2QsIHJlc29sdmVkRGlyKX1gKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGV2ZWxvcG1lbnQ6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgU3RhcnQgbG9jYWwgZGV2ZWxvcG1lbnQgc2VydmVyJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnQnVpbGQgJiBEZXBsb3k6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBidWlsZCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBCdWlsZCBhbGwgdGFyZ2V0cyAoUmVhY3QsIExhbWJkYSwgQ0RLKScpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIERlcGxveSB0byBBV1MnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0RcdURDREEgTGVhcm4gbW9yZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIGh0dHBzOi8vcnVudGltZXdlYi5jb20vZG9jcycpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbn1cblxuLyoqXG4gKiBEaXNwbGF5IENESy1zcGVjaWZpYyBzdWNjZXNzIG1lc3NhZ2Ugd2l0aCBuZXh0IHN0ZXBzXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlDZGtTdWNjZXNzTWVzc2FnZShcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICAgIHRhcmdldERpcjogc3RyaW5nLFxuICAgIGN3ZDogc3RyaW5nLFxuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZWREaXIgPSBwYXRoLnJlc29sdmUoY3dkLCB0YXJnZXREaXIpO1xuICAgIGNvbnN0IHJlbGF0aXZlRGlyID0gcGF0aC5yZWxhdGl2ZShjd2QsIHJlc29sdmVkRGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIGxvZ2dlci5zdWNjZXNzKGNoYWxrLmJvbGQoYENESyBpbmZyYXN0cnVjdHVyZSBmb3IgJyR7cHJvamVjdE5hbWV9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFgKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdDREsgc3RydWN0dXJlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgY2RrLycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIGJpbi8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxNFx1MjUwMFx1MjUwMCBhcHAudHMgICAgICAgICAgIyBDREsgYXBwIGVudHJ5IHBvaW50JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgY2RrLmpzb24gICAgICAgICAgICAjIENESyBjb25maWd1cmF0aW9uJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgdHNjb25maWcuanNvbiAgICAgICAjIFR5cGVTY3JpcHQgY29uZmlnJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MTRcdTI1MDBcdTI1MDAgLmVudi5leGFtcGxlICAgICAgICAjIEVudmlyb25tZW50IHZhcmlhYmxlcyB0ZW1wbGF0ZScpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1JlYWR5IHRvIGRlcGxveTonKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYCAgY2QgJHtyZWxhdGl2ZURpcn1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQWxsIGRlcGVuZGVuY2llcyBhcmUgYWxyZWFkeSBpbnN0YWxsZWQnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdEZXBsb3kgdG8gQVdTOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkaycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBCb290c3RyYXAgQ0RLIChvbmx5IG5lZWRlZCBvbmNlIHBlciBhY2NvdW50L3JlZ2lvbiknKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIGNkayBkaWZmJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIFByZXZpZXcgY2hhbmdlcyBiZWZvcmUgZGVwbG95aW5nJykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgRGVwbG95IHlvdXIgaW5mcmFzdHJ1Y3R1cmUnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0NcdURGQUYgRGVwbG95IHRvIGRpZmZlcmVudCBzdGFnZXM6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBzdGFnaW5nJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgcHJvZCcpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1x1RDgzRFx1RENEQSBMZWFybiBtb3JlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgUnVudGltZSBDREs6IGh0dHBzOi8vcnVudGltZXdlYi5jb20vZG9jcy9jZGsnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIEFXUyBDREs6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlIHdvcmtmbG93IHVzaW5nIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUNka1dvcmtmbG93KFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICAgIGNvcmU6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZVNlcnZpY2U6IFRlbXBsYXRlU2VydmljZSxcbiAgICBlbnZWYWxpZGF0b3I/OiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIC8vIEltcG9ydCB0aGUgQ0RLIHdvcmtmbG93IGxvZ2ljIGZyb20gcHVyZW5vdyBidXQgdXNlIG91ciBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gICAgY29uc3Qge1xuICAgICAgICBQcm9tcHRTZXJ2aWNlLFxuICAgICAgICBQYWNrYWdlTWFuYWdlclNlcnZpY2UsXG4gICAgICAgIENka0luaXRTZXJ2aWNlLFxuICAgICAgICBBd3NDcmVkZW50aWFsc0RldGVjdG9yLFxuICAgICAgICBBd3NSZWdpb25SZXNvbHZlcixcbiAgICB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya3RpZi9wdXJlbm93L2JpbicpO1xuXG4gICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXJTZXJ2aWNlID0gbmV3IFBhY2thZ2VNYW5hZ2VyU2VydmljZSgpO1xuICAgIGNvbnN0IGNka0luaXRTZXJ2aWNlID0gbmV3IENka0luaXRTZXJ2aWNlKHRlbXBsYXRlU2VydmljZSwgcGFja2FnZU1hbmFnZXJTZXJ2aWNlLCBsb2dnZXIpO1xuICAgIGNvbnN0IGF3c0RldGVjdG9yID0gbmV3IEF3c0NyZWRlbnRpYWxzRGV0ZWN0b3IoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgICAgICAvLyBDaGVjayBpZiAvY2RrIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2RrRXhpc3RzID0gYXdhaXQgY2RrSW5pdFNlcnZpY2UuY2hlY2tDZGtEaXJlY3RvcnlFeGlzdHMocHJvamVjdERpcik7XG5cbiAgICAgICAgaWYgKGNka0V4aXN0cykge1xuICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBvdmVyd3JpdGVcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZE92ZXJ3cml0ZSA9IGF3YWl0IHByb21wdFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgICAgICAgICAnQSAvY2RrIGZvbGRlciBhbHJlYWR5IGV4aXN0cy4gT3ZlcndyaXRlIGl0PycsXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIERlZmF1bHQgdG8gTm9cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkT3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBkZWNsaW5lZCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeGlzdGluZyBDREsgc2V0dXAgcHJlc2VydmVkLicpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgQVdTIHJlZ2lvbiB1c2luZyBTREsncyBkZWZhdWx0IHByb3ZpZGVyIGNoYWluXG4gICAgICAgIGNvbnN0IHJlZ2lvblJlc29sdmVyID0gbmV3IEF3c1JlZ2lvblJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lvblJlc3VsdCA9IGF3YWl0IHJlZ2lvblJlc29sdmVyLnJlc29sdmVSZWdpb24oKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSZWdpb24gPSByZWdpb25SZXN1bHQucmVnaW9uIHx8IEF3c1JlZ2lvblJlc29sdmVyLmdldERlZmF1bHRSZWdpb24oKTtcblxuICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIEFXUyByZWdpb246ICR7cmVzb2x2ZWRSZWdpb259IChzb3VyY2U6ICR7cmVnaW9uUmVzdWx0LnNvdXJjZX0pYCk7XG5cbiAgICAgICAgLy8gTG9hZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gKHVzZSBkZWZhdWx0cyBpZiBub3QgYXZhaWxhYmxlKVxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgIHN0YWdlOiAnZGV2JyxcbiAgICAgICAgICAgIHJlZ2lvbjogcmVzb2x2ZWRSZWdpb24sXG4gICAgICAgICAgICBlbmFibGVTZW86IHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRGV0ZWN0IHBhY2thZ2UgbWFuYWdlclxuICAgICAgICBjb25zdCBkZXRlY3RlZE1hbmFnZXIgPSBwYWNrYWdlTWFuYWdlclNlcnZpY2UuZGV0ZWN0UGFja2FnZU1hbmFnZXIocHJvamVjdERpcik7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIHBhY2thZ2UgbWFuYWdlcjogJHtjaGFsay5jeWFuKGRldGVjdGVkTWFuYWdlcil9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgICAgICAvLyBJbml0aWFsaXplIENESyB3aXRoIGF1dG9tYXRlZCBpbnN0YWxsYXRpb25cbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKCdJbml0aWFsaXppbmcgQ0RLIGluZnJhc3RydWN0dXJlLi4uJyk7XG4gICAgICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjZGtJbml0U2VydmljZS5pbml0aWFsaXplQ2RrKHtcbiAgICAgICAgICAgIHByb2plY3REaXIsXG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogY29uZmlnLnByb2plY3ROYW1lLFxuICAgICAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgICAgICAgIGVuYWJsZVNlbzogY29uZmlnLmVuYWJsZVNlbyxcbiAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nOiBjZGtFeGlzdHMsXG4gICAgICAgICAgICBydW5Cb290c3RyYXA6IGZhbHNlLCAvLyBXZSdsbCBoYW5kbGUgYm9vdHN0cmFwIHNlcGFyYXRlbHlcbiAgICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyOiBkZXRlY3RlZE1hbmFnZXIsXG4gICAgICAgIH0sIGNvcmUpO1xuXG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlJyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHJlc3VsdC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0NESyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSBpbnN0YWxsYXRpb24gc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LnByb2plY3REZXBlbmRlbmNpZXNJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmdyZWVuKCdcdTI3MTMgUHJvamVjdCBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuY2RrRGVwZW5kZW5jaWVzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIENESyBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlIGNyZWRlbnRpYWxzIGNoZWNrIGZvciBDREstb25seSBpbml0IChydW50aW1lIGluaXQgLS1jZGspXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNka09ubHlDcmVkZW50aWFscyhcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBlbnZWYWxpZGF0b3I6IEVudmlyb25tZW50VmFsaWRhdG9yLFxuICAgIGNka0Rpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBnZXQgdmFsaWRhdGVkIGNvbmZpZ1xuICAgICAgICBjb25zdCBjb25maWcgPSBlbnZWYWxpZGF0b3IuZ2V0Q29uZmlnKCk7XG4gICAgICAgIGNvbnN0IGlzQXdzQ3JlZGVudGlhbHNWYWxpZCA9ICFjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKTtcblxuICAgICAgICBpZiAoIWlzQXdzQ3JlZGVudGlhbHNWYWxpZCkge1xuICAgICAgICAgICAgbG9nQ3JlZGVudGlhbHNFcnJvcihsb2dnZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ3JlZGVudGlhbHMgYXJlIHZhbGlkIC0gaW5mb3JtIHVzZXJcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmdyZWVuKCdcdTI3MTMgQVdTIGNyZWRlbnRpYWxzIGRldGVjdGVkJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3VyIENESyBpbmZyYXN0cnVjdHVyZSBpcyByZWFkeS4gWW91IGNhbiBub3c6Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBpbml0IC0tY2RrICAgICAgICAgICMgQm9vdHN0cmFwIHlvdXIgQVdTIGVudmlyb25tZW50IChmaXJzdCB0aW1lIG9ubHkpJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYgICMgRGVwbG95IHlvdXIgaW5mcmFzdHJ1Y3R1cmUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENyZWRlbnRpYWxzIHZhbGlkYXRpb24gZmFpbGVkIC0gZGlzcGxheSBmcmllbmRseSB3YXJuaW5nXG4gICAgICAgICAgICBsb2dnZXIud2FybihjaGFsay55ZWxsb3coJyEgIEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZC4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NESyBpbmZyYXN0cnVjdHVyZSBmaWxlcyB3ZXJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IGluIC9jZGsnKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdIb3dldmVyLCBBV1MgY3JlZGVudGlhbHMgYXJlIHJlcXVpcmVkIGZvciBkZXBsb3ltZW50LicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBiZWZvcmUgZGVwbG95aW5nOicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbiAxOiBBV1MgQ0xJIChSZWNvbW1lbmRlZCknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBhd3MgY29uZmlndXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbiAyOiBFbnZpcm9ubWVudCBWYXJpYWJsZXMnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX0FDQ0VTU19LRVlfSUQ9eW91cl9rZXlfaWQnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZPXlvdXJfc2VjcmV0X2tleScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAkIGV4cG9ydCBBV1NfUkVHSU9OPXVzLWVhc3QtMScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMzogQVdTIFByb2ZpbGUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1BST0ZJTEU9eW91cl9wcm9maWxlX25hbWUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FmdGVyIGNvbmZpZ3VyaW5nIGNyZWRlbnRpYWxzLCB5b3UgY2FuIGRlcGxveSBieSBydW5uaW5nOicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkayAgICAgICAgICAjIEJvb3RzdHJhcCB5b3VyIEFXUyBlbnZpcm9ubWVudCAoZmlyc3QgdGltZSBvbmx5KScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2ICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuZXhwZWN0ZWQgZXJyb3IgLSByZXRocm93XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgZXhpc3RpbmcgcHJvamVjdCBmaWxlcyB0aGF0IHdvdWxkIGJlIG92ZXJ3cml0dGVuXG4gKlxuICogQHBhcmFtIHByb2plY3REaXIgLSBQcm9qZWN0IGRpcmVjdG9yeSBwYXRoXG4gKiBAcmV0dXJucyBBcnJheSBvZiBleGlzdGluZyBmaWxlIHBhdGhzIChyZWxhdGl2ZSB0byBwcm9qZWN0IGRpcilcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEtleSBmaWxlcyB0aGF0IGluZGljYXRlIGFuIGV4aXN0aW5nIHByb2plY3RcbiAgICBjb25zdCBrZXlGaWxlcyA9IFtcbiAgICAgICAgJ3BhY2thZ2UuanNvbicsXG4gICAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgICAnc3JjL2luZGV4LnRzeCcsXG4gICAgICAgICdzcmMvQXBwLnRzeCcsXG4gICAgICAgICdydW50aW1lLmNvbmZpZy50cycsXG4gICAgICAgICdwdXJlbm93LmNvbmZpZy50cycsXG4gICAgICAgICd0c2NvbmZpZy5qc29uJyxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGtleUZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsIGZpbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdGaWxlcztcbn0iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5leHBvcnQgeyBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UgfSBmcm9tICcuL3J1bnRpbWUtd2ViLWRlcGxveW1lbnQuc2VydmljZSc7XG5leHBvcnQge1xuICAgIGJ1aWxkQ29tbWFuZCxcbiAgICB0eXBlIEJ1aWxkT3B0aW9uc1xufSBmcm9tICcuL2J1aWxkLmNvbW1hbmQnO1xuZXhwb3J0IHtcbiAgICBydW50aW1lSW5pdENvbW1hbmQsXG4gICAgdHlwZSBSdW50aW1lSW5pdE9wdGlvbnNcbn0gZnJvbSAnLi9pbml0JztcbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcblxuaW1wb3J0IHtcbiAgR2xvYmFsT3B0aW9ucyxcbiAgUHVyZW5vd0NsaSxcbiAgUHVyZW5vd0NsaUNvbnRleHQsXG4gIHB1cmVub3dDb21tYW5kQ29uZmlnLFxuICB0eXBlIFN0cmF0ZWd5Q29udGFpbmVyLFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5cbmltcG9ydCB7IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dCwgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBidWlsZENvbW1hbmQsXG4gIHR5cGUgQnVpbGRPcHRpb25zLFxuICAvLyBkZXZWYWxpZGF0aW9uQ29tbWFuZCwgLy8gVE9ETzogSW1wbGVtZW50IGRldiB2YWxpZGF0aW9uXG4gIC8vIHR5cGUgRGV2VmFsaWRhdGlvbk9wdGlvbnMsXG4gIFJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSxcbn0gZnJvbSAnQGJpbi9jb21tYW5kcyc7XG5cbmltcG9ydCB7IHJ1bnRpbWVJbml0Q29tbWFuZCwgdHlwZSBSdW50aW1lSW5pdE9wdGlvbnMgfSBmcm9tICdAYmluL2NvbW1hbmRzL2luaXQnO1xuXG5pbXBvcnQgeyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciwgUnVudGltZVRlbXBsYXRlRXJyb3IsIFJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIH0gZnJvbSAnQGJpbi91dGlscy9lcnJvcnMnO1xuaW1wb3J0IHsgUnVudGltZVRlbXBsYXRlU2VydmljZSBhcyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICdAYmluL3NlcnZpY2VzL3RlbXBsYXRlLnNlcnZpY2UnO1xuXG4vKipcbiAqIFJ1bnRpbWUgQ0xJIHRoYXQgcHJvcGVybHkgZXh0ZW5kcyBQdXJlbm93Q2xpIHVzaW5nIHRoZSBleHRlbnNpYmxlIGFyY2hpdGVjdHVyZVxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwdXJlbm93J3MgRXh0ZW5zaWJsZUNsaUNvcmUuYWRkQ29tbWFuZHMoKSBhbmQgYWRkQWN0aW9ucygpXG4gKiB0byBhZGQgcnVudGltZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHdoaWxlIHByZXNlcnZpbmcgYWxsIGV4aXN0aW5nIHB1cmVub3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lV2ViQ2xpIGV4dGVuZHMgUHVyZW5vd0NsaSB7XG4gIHN0YXRpYyBkZWZhdWx0VG9vbE5hbWU6IHN0cmluZyA9ICdydW50aW1lJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBJbml0aWFsaXplIHdpdGggcnVudGltZS1zcGVjaWZpYyBzdHJhdGVnaWVzXG4gICAgLy8gY29uc3Qgc3RyYXRlZ2llcyA9IG5ldyBTdHJhdGVneUNvbnRhaW5lcigpO1xuICAgIC8vXG4gICAgLy8gLy8gQWRkIHJ1bnRpbWUgZGVwbG95bWVudCBzdHJhdGVneSBmb3IgdGhyZWUtc3RhY2sgZGVwbG95bWVudFxuICAgIC8vIHN0cmF0ZWdpZXMuYWRkU3RyYXRlZ3kobmV3IFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3koKSk7XG5cbiAgICBzdXBlcih2b2lkIDAgLypzdHJhdGVnaWVzKi8sIHtcbiAgICAgIHRvb2xOYW1lOiBSdW50aW1lV2ViQ2xpLmRlZmF1bHRUb29sTmFtZSxcbiAgICAgIGhlbHBlclRvb2xOYW1lOiAnUnVudGltZSBXZWInLFxuICAgICAgdGl0bGU6ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZmFsbGJhY2tWZXJzaW9uOiAnMC4yLjEzNScsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbW1hbmRzID0gcHVyZW5vd0NvbW1hbmRDb25maWcoUnVudGltZVdlYkNsaS5kZWZhdWx0VG9vbE5hbWUpO1xuXG4gICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgYnVpbGQgY29tbWFuZHNcbiAgICB0aGlzLmFkZEJ1aWxkQ29tbWFuZHMoKTtcblxuICAgIC8vIEluaXRpYWxpemUgcnVudGltZS13ZWIgZXh0ZW5zaW9uc1xuICAgIC8vIHRoaXMucnVudGltZUV4dGVuc2lvbnMgPSBuZXcgUnVudGltZVdlYkNsaUV4dGVuc2lvbnMoKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGNvbW1hbmRzIHVzaW5nIGV4dGVuc2libGUgYXJjaGl0ZWN0dXJlXG4gICAgLy8gQG5vdGU6IGlzIG5vdCBuZWNlc3NhcnksIHdlIGV4cGVjdCB0byByZWRlZmluZSBkZXBsb3ltZW50IHN0cmF0ZWd5IG9ubHlcbiAgICAvLyB0aGlzLmFkZFJ1bnRpbWVDb21tYW5kcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBydW50aW1lLXNwZWNpZmljIGJ1aWxkIGNvbW1hbmRzXG4gICAqL1xuICBwcml2YXRlIGFkZEJ1aWxkQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgLy8gRW5oYW5jZWQgYnVpbGQgY29tbWFuZCB3aXRoIG11bHRpcGxlIHRhcmdldCBzdXBwb3J0XG4gICAgLy8gdGhpcy5wcm9ncmFtXG4gICAgLy8gICAuY29tbWFuZCgnYnVpbGQnKVxuICAgIC8vICAgLmRlc2NyaXB0aW9uKCdCdWlsZCBydW50aW1lIGJ1bmRsZXMgZm9yIGRpZmZlcmVudCB0YXJnZXRzJylcbiAgICAvLyAgIC5vcHRpb24oJy10LCAtLXRhcmdldCA8dGFyZ2V0PicsICdCdWlsZCB0YXJnZXQgKGFsbHxicm93c2VyfGxhbWJkYXxsaWJ8bGliLWVzbXxpbmZyYXxjbGl8YmlufGNkayknLCAnYWxsJylcbiAgICAvLyAgIC5vcHRpb24oJy0tZGV2JywgJ0VuYWJsZSBkZXZlbG9wbWVudCBtb2RlIChmYXN0ZXIgYnVpbGRzLCBzb3VyY2UgbWFwcyknLCBmYWxzZSlcbiAgICAvLyAgIC5vcHRpb24oJy0td2F0Y2gnLCAnRW5hYmxlIHdhdGNoIG1vZGUgZm9yIGNvbnRpbnVvdXMgcmVidWlsZHMnLCBmYWxzZSlcbiAgICAvLyAgIC5vcHRpb24oJy0tc2tpcC12YWxpZGF0aW9uJywgJ1NraXAgYnVuZGxlIHZhbGlkYXRpb24nLCBmYWxzZSlcbiAgICAvLyAgIC5vcHRpb24oJy0tZGV2LXZhbGlkYXRpb24nLCAnRW5hYmxlIGVuaGFuY2VkIGRldmVsb3BtZW50IHZhbGlkYXRpb24nLCBmYWxzZSlcbiAgICAvLyAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLW91dGRpciA8ZGlyPicsICdPdmVycmlkZSBvdXRwdXQgZGlyZWN0b3J5JylcbiAgICAvLyAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAvLyAgICAgdHJ5IHtcbiAgICAvLyAgICAgICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICAvLyAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgPT09ICdicm93c2VyJyA/ICdyZWFjdCcgOiBvcHRpb25zLnRhcmdldCxcbiAgICAvLyAgICAgICAgIGRldjogb3B0aW9ucy5kZXYsXG4gICAgLy8gICAgICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCxcbiAgICAvLyAgICAgICAgIHNraXBWYWxpZGF0aW9uOiBvcHRpb25zLnNraXBWYWxpZGF0aW9uLFxuICAgIC8vICAgICAgICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICAgIC8vICAgICAgICAgb3V0ZGlyOiBvcHRpb25zLm91dGRpcixcbiAgICAvLyAgICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgICAgYXdhaXQgYnVpbGRDb21tYW5kKGJ1aWxkT3B0aW9ucyk7XG4gICAgLy9cbiAgICAvLyAgICAgICAvLyBSdW4gZGV2ZWxvcG1lbnQgdmFsaWRhdGlvbiBpZiByZXF1ZXN0ZWRcbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5kZXZWYWxpZGF0aW9uKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZygnXFxuXHVEODNEXHVERDBEIFN0YXJ0aW5nIGRldmVsb3BtZW50IHZhbGlkYXRpb24uLi4nKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IGRldk9wdGlvbnM6IERldlZhbGlkYXRpb25PcHRpb25zID0ge1xuICAgIC8vICAgICAgICAgICB0YXJnZXRzOiBbb3B0aW9ucy50YXJnZXQgPT09ICdicm93c2VyJyA/ICdyZWFjdCcgOiBvcHRpb25zLnRhcmdldF0sXG4gICAgLy8gICAgICAgICAgIHdhdGNoOiBmYWxzZSwgLy8gU2luZ2xlIHJ1biBmb3IgYnVpbGQgY29tbWFuZFxuICAgIC8vICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgLy8gICAgICAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyAgICAgICAgIH07XG4gICAgLy9cbiAgICAvLyAgICAgICAgIGNvbnN0IHsgRGV2VmFsaWRhdGlvblNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnQGJpbi9jb21tYW5kcycpO1xuICAgIC8vICAgICAgICAgY29uc3QgZGV2U2VydmljZSA9IG5ldyBEZXZWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIC8vICAgICAgICAgYXdhaXQgZGV2U2VydmljZS5ydW5WYWxpZGF0aW9uKGRldk9wdGlvbnMudGFyZ2V0cyEsIGRldk9wdGlvbnMudmVyYm9zZSk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0J1aWxkIGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgIC8vICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSk7XG5cbiAgICAvLyBJbmRpdmlkdWFsIHRhcmdldCBidWlsZCBjb21tYW5kcyBmb3IgY29udmVuaWVuY2VcbiAgICBjb25zdCB0YXJnZXRzID0gW1xuICAgICAgeyBuYW1lOiAnYnVpbGQ6YnJvd3NlcicsIHRhcmdldDogJ3JlYWN0JywgZGVzYzogJ0J1aWxkIGJyb3dzZXIgYnVuZGxlIChFU00pJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6bGFtYmRhJywgdGFyZ2V0OiAnbGFtYmRhJywgZGVzYzogJ0J1aWxkIExhbWJkYSBidW5kbGUgKENvbW1vbkpTKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxpYicsIHRhcmdldDogJ2xpYicsIGRlc2M6ICdCdWlsZCBsaWJyYXJ5IGJ1bmRsZSAoQ29tbW9uSlMpJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6bGliLWVzbScsIHRhcmdldDogJ2xpYi1lc20nLCBkZXNjOiAnQnVpbGQgbGlicmFyeSBidW5kbGUgKEVTTSknIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDppbmZyYScsIHRhcmdldDogJ2luZnJhJywgZGVzYzogJ0J1aWxkIGluZnJhc3RydWN0dXJlIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmNsaScsIHRhcmdldDogJ2NsaScsIGRlc2M6ICdCdWlsZCBDTEkgYnVuZGxlJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6YmluJywgdGFyZ2V0OiAnYmluJywgZGVzYzogJ0J1aWxkIGJpbiB1dGlsaXRpZXMgYnVuZGxlJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6Y2RrJywgdGFyZ2V0OiAnY2RrJywgZGVzYzogJ0J1aWxkIENESyBhcHBsaWNhdGlvbiBidW5kbGUnIH0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgeyBuYW1lLCB0YXJnZXQsIGRlc2MgfSBvZiB0YXJnZXRzKSB7XG4gICAgICB0aGlzLnByb2dyYW1cbiAgICAgICAgLmNvbW1hbmQobmFtZSlcbiAgICAgICAgLmRlc2NyaXB0aW9uKGRlc2MpXG4gICAgICAgIC5vcHRpb24oJy0tZGV2JywgJ0VuYWJsZSBkZXZlbG9wbWVudCBtb2RlJywgZmFsc2UpXG4gICAgICAgIC5vcHRpb24oJy0tc2tpcC12YWxpZGF0aW9uJywgJ1NraXAgYnVuZGxlIHZhbGlkYXRpb24nLCBmYWxzZSlcbiAgICAgICAgLm9wdGlvbignLXYsIC0tdmVyYm9zZScsICdFbmFibGUgdmVyYm9zZSBvdXRwdXQnLCBmYWxzZSlcbiAgICAgICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQgYXMgYW55LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gR2V0IGNvbmZpZyBhbmQgbG9nZ2VyIGZyb20gc29tZXdoZXJlIC0gdGhpcyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBwcm9wZXJseVxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge30gYXMgYW55OyAvLyBUT0RPOiBHZXQgcHJvcGVyIGNvbmZpZ1xuICAgICAgICAgICAgY29uc3QgbG9nZ2VyID0gY29uc29sZSBhcyBhbnk7IC8vIFRPRE86IEdldCBwcm9wZXIgbG9nZ2VyXG5cbiAgICAgICAgICAgIGF3YWl0IGJ1aWxkQ29tbWFuZChidWlsZE9wdGlvbnMsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtuYW1lfSBmYWlsZWQ6YCwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERldmVsb3BtZW50IHZhbGlkYXRpb24gY29tbWFuZFxuICAgIHRoaXMucHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoJ2Rldjp2YWxpZGF0ZScpXG4gICAgICAuZGVzY3JpcHRpb24oJ1N0YXJ0IGRldmVsb3BtZW50IG1vZGUgYnVuZGxlIHZhbGlkYXRpb24gd2l0aCByZWFsLXRpbWUgZmVlZGJhY2snKVxuICAgICAgLm9wdGlvbignLXQsIC0tdGFyZ2V0cyA8dGFyZ2V0cz4nLCAnQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cyB0byB2YWxpZGF0ZScsICdyZWFjdCxsYW1iZGEnKVxuICAgICAgLm9wdGlvbignLS1uby13YXRjaCcsICdEaXNhYmxlIGZpbGUgd2F0Y2hpbmcnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy0taW50ZXJ2YWwgPG1zPicsICdWYWxpZGF0aW9uIGludGVydmFsIGluIG1pbGxpc2Vjb25kcycsICc1MDAwJylcbiAgICAgIC5vcHRpb24oJy0tbm8taW1tZWRpYXRlJywgJ1NraXAgaW1tZWRpYXRlIHZhbGlkYXRpb24gb24gc3RhcnR1cCcsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLXYsIC0tdmVyYm9zZScsICdFbmFibGUgdmVyYm9zZSBvdXRwdXQnLCBmYWxzZSlcbiAgICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gb3B0aW9ucy50YXJnZXRzLnNwbGl0KCcsJykubWFwKCh0OiBzdHJpbmcpID0+IHQudHJpbSgpKTtcbiAgICAgICAgICBjb25zdCBkZXZPcHRpb25zOiBhbnkgPSB7IC8vIFRPRE86IFVzZSBwcm9wZXIgRGV2VmFsaWRhdGlvbk9wdGlvbnMgdHlwZVxuICAgICAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgICAgIHdhdGNoOiBvcHRpb25zLndhdGNoLFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHBhcnNlSW50KG9wdGlvbnMuaW50ZXJ2YWwsIDEwKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogb3B0aW9ucy5pbW1lZGlhdGUsXG4gICAgICAgICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIGF3YWl0IGRldlZhbGlkYXRpb25Db21tYW5kKGRldk9wdGlvbnMpOyAvLyBUT0RPOiBJbXBsZW1lbnQgZGV2IHZhbGlkYXRpb25cbiAgICAgICAgICBjb25zb2xlLmxvZygnRGV2IHZhbGlkYXRpb24gbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RldmVsb3BtZW50IHZhbGlkYXRpb24gZmFpbGVkOicsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUHVyZW5vdy1zcGVjaWZpYyBjb250ZXh0IHdpdGggYWxsIHJlcXVpcmVkIHNlcnZpY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29udGV4dDxUIGV4dGVuZHMgUHVyZW5vd0NsaUNvbnRleHQgPSBQdXJlbm93UnVudGltZUNsaUNvbnRleHQ+KFxuICAgIGdsb2JhbE9wdHM6IEdsb2JhbE9wdGlvbnMsIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcHVyZW5vd0NvbnRleHQgPVxuICAgICAgYXdhaXQgc3VwZXIuY3JlYXRlQ29udGV4dDxQdXJlbm93Q2xpQ29udGV4dD4oe1xuICAgICAgICAuLi5nbG9iYWxPcHRzLFxuICAgICAgICBjb25maWc6IGdsb2JhbE9wdHMuY29uZmlnID8/ICdydW50aW1lLmNvbmZpZy50cydcbiAgICAgIH0sIGN3ZCk7XG5cbiAgICAvLyBDcmVhdGUgc3RhY2tzIGRlcGxveW1lbnQgc2VydmljZVxuICAgIGNvbnN0IHN0YWNrc0RlcGxveVNlcnZpY2UgPSBuZXcgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlKGN3ZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucHVyZW5vd0NvbnRleHQsXG4gICAgICBzdGFja3NEZXBsb3lTZXJ2aWNlLFxuICAgIH0gYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIGRlcGxveSBjb21tYW5kIChyZXF1aXJlcyBBV1MgY3JlZGVudGlhbHMpXG4gICAqL1xuICBhc3luYyBkZXBsb3lDb21tYW5kKG9wdGlvbnM6IHVua25vd24sIGNtZDogQ29tbWFuZCwgc3RyYXRlZ2llcz86IFN0cmF0ZWd5Q29udGFpbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgaGVscCB3YXMgcmVxdWVzdGVkIC0gbGV0IENvbW1hbmRlci5qcyBoYW5kbGUgaXRcbiAgICBpZiAodGhpcy5pc0hlbHBSZXF1ZXN0ZWQoY21kKSkge1xuICAgICAgY21kLmhlbHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0KG9wdGlvbnMsIGNtZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGVmYXVsdCBkZXBsb3ltZW50IGJlaGF2aW9yXG4gICAgICBjb25zdCBkZXBsb3ltZW50U2VydmljZSA9IG5ldyBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcGxveW1lbnRTZXJ2aWNlLmRlcGxveUNvbW1hbmQoXG4gICAgICAgIGNvbnRleHQuc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICAgICAgb3B0aW9ucyBhcyBhbnksXG4gICAgICAgIGNvbnRleHQuY29uZmlnLFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBwcm9jZXNzLmV4aXQocmVzdWx0LmV4aXRDb2RlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBmb3IgaW5pdCBjb21tYW5kICh1c2VzIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UpXG4gICAqL1xuICBhc3luYyBpbml0Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBydW50aW1lLXNwZWNpZmljIGluaXQgY29tbWFuZCB3aXRoIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2VcbiAgICAgIGNvbnN0IGluaXRPcHRpb25zID0gb3B0aW9ucyBhcyBSdW50aW1lSW5pdE9wdGlvbnM7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bnRpbWVJbml0Q29tbWFuZChcbiAgICAgICAgaW5pdE9wdGlvbnMsXG4gICAgICAgIGNvbnRleHQubG9nZ2VyLFxuICAgICAgICBjb250ZXh0LmN3ZCxcbiAgICAgICAgY29udGV4dC5lbnZWYWxpZGF0b3IsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChyZXN1bHQuZXhpdENvZGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZvciBkZXN0cm95IGNvbW1hbmQgKHJlcXVpcmVzIEFXUyBjcmVkZW50aWFscylcbiAgICovXG4gIGFzeW5jIGRlc3Ryb3lDb21tYW5kKG9wdGlvbnM6IHVua25vd24sIGNtZDogQ29tbWFuZCwgc3RyYXRlZ2llcz86IFN0cmF0ZWd5Q29udGFpbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgaGVscCB3YXMgcmVxdWVzdGVkIC0gbGV0IENvbW1hbmRlci5qcyBoYW5kbGUgaXRcbiAgICBpZiAodGhpcy5pc0hlbHBSZXF1ZXN0ZWQoY21kKSkge1xuICAgICAgY21kLmhlbHAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0KG9wdGlvbnMsIGNtZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IGFuZCBleGVjdXRlIGRlc3Ryb3kgY29tbWFuZFxuICAgICAgY29uc3QgeyBkZXN0cm95Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya3RpZi9wdXJlbm93L2JpbicpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVzdHJveUNvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5vcHRpb25zIGFzIGFueSxcbiAgICAgICAgICBiYWNrdXBEaXI6ICcuLy5ydW50aW1lLWJhY2t1cHMnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQubG9nZ2VyLFxuICAgICAgICBjb250ZXh0LmN3ZCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KHJlc3VsdC5leGl0Q29kZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgQ0xJIHdpdGggcHJvdmlkZWQgYXJndW1lbnRzXG4gICAqL1xuICBhc3luYyBydW4oYXJncz86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wcm9ncmFtLnBhcnNlQXN5bmMoYXJncyB8fCBwcm9jZXNzLmFyZ3YpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlcnJvcnMgd2l0aCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgKG5vIGVtb2ppKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBoYW5kbGVFcnJvcihlcnJvcjogdW5rbm93bik6IG5ldmVyIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIoKTtcbiAgICBjb25zdCB2ZXJib3NlID0gISFwcm9jZXNzLmVudi5ERUJVRztcblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bnRpbWVUZW1wbGF0ZUVycm9yKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRFcnJvciA9IGZvcm1hdHRlci5mb3JtYXRUZW1wbGF0ZUVycm9yKGVycm9yLCB2ZXJib3NlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkRXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0VGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEVycm9yID0gZm9ybWF0dGVyLmZvcm1hdEVycm9yKGVycm9yLCB2ZXJib3NlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGVycm9yOicsIFN0cmluZyhlcnJvcikpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgQ0xJIGluc3RhbmNlIHRoYXQgcHJvcGVybHkgZXh0ZW5kcyBwdXJlbm93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdW50aW1lQ2xpKCk6IFJ1bnRpbWVXZWJDbGkge1xuICByZXR1cm4gbmV3IFJ1bnRpbWVXZWJDbGkoKTtcbn1cblxuLy8gLyoqXG4vLyAgKiBNYWluIENMSSBlbnRyeSBwb2ludCB1c2luZyBwcm9wZXIgcHVyZW5vdyBleHRlbnNpb25cbi8vICAqL1xuLy8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4vLyAgIHRyeSB7XG4vLyAgICAgLy8gQ3JlYXRlIENMSSBpbnN0YW5jZSB0aGF0IGV4dGVuZHMgUHVyZW5vd0NsaVxuLy8gICAgIGNvbnN0IGNsaSA9IGNyZWF0ZVJ1bnRpbWVDbGkoKTtcbi8vXG4vLyAgICAgLy8gUGFyc2UgYW5kIGV4ZWN1dGUgQ0xJIGNvbW1hbmRzXG4vLyAgICAgYXdhaXQgY2xpLnJ1bigpO1xuLy8gICB9IGNhdGNoIChlcnJvcikge1xuLy8gICAgIFB1cmVub3dSdW50aW1lQ2xpLmhhbmRsZUVycm9yKGVycm9yKTtcbi8vICAgfVxuLy8gfVxuXG4vLyBSdW4gQ0xJIGlmIHRoaXMgZmlsZSBpcyBleGVjdXRlZCBkaXJlY3RseVxuLy8gaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4vLyAgIG1haW4oKS5jYXRjaChQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcik7XG4vLyB9XG4iXSwKICAibWFwcGluZ3MiOiAiO3lvQkFBQSxJQUFBQSxHQUFBQyxHQUFBLEtBY0EsSUFBSUMsSUFDSCxTQUFVQSxFQUFTLEVBR2YsU0FBVUMsRUFBUyxDQUNoQixJQUFJQyxFQUFPLE9BQU8sWUFBZSxTQUFXLFdBQ3hDLE9BQU8sUUFBVyxTQUFXLE9BQ3pCLE9BQU8sTUFBUyxTQUFXLEtBQ3ZCLE9BQU8sTUFBUyxTQUFXLEtBQ3ZCQyxFQUFlLEVBQzNCQyxFQUFXQyxFQUFhTCxDQUFPLEVBQy9CLE9BQU9FLEVBQUssUUFBWSxNQUN4QkUsRUFBV0MsRUFBYUgsRUFBSyxRQUFTRSxDQUFRLEdB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SyxDQUNqQyxDQUNGLENBS0EsU0FBU0UsR0FBWUYsRUFBdUIsQ0FDdENBLGFBQWlCLE9BQ25CLFFBQVEsTUFBTUcsRUFBTSxJQUFJLFFBQUcsRUFBRyxTQUFVSCxFQUFNLE9BQU8sRUFDakQsRUFBQUksUUFBUSxJQUFJLE9BQ2QsUUFBUSxNQUFNSixFQUFNLEtBQUssR0FHM0IsUUFBUSxNQUFNRyxFQUFNLElBQUksUUFBRyxFQUFHLGlCQUFrQixPQUFPSCxDQUFLLENBQUMsRUFFL0QsRUFBQUksUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FLQSxTQUFTQyxJQUEyQixDQUNsQyxFQUFBRCxRQUFRLEdBQUcsb0JBQXNCSixHQUFpQixDQUNoRCxRQUFRLE1BQU1HLEVBQU0sSUFBSSxRQUFHLEVBQUcsc0JBQXVCSCxFQUFNLE9BQU8sRUFDOUQsRUFBQUksUUFBUSxJQUFJLE9BQ2QsUUFBUSxNQUFNSixFQUFNLEtBQUssRUFFM0IsRUFBQUksUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FBQyxFQUVELEVBQUFBLFFBQVEsR0FBRyxxQkFBdUJFLEdBQWdCLENBQ2hELFFBQVEsTUFBTUgsRUFBTSxJQUFJLFFBQUcsRUFBRyx1QkFBd0JHLENBQU0sRUFDeEQsRUFBQUYsUUFBUSxJQUFJLE9BQVNFLGFBQWtCLE9BQ3pDLFFBQVEsTUFBTUEsRUFBTyxLQUFLLEVBRTVCLEVBQUFGLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQUMsQ0FDSCxDQUdBQyxHQUF5QixFQUl6QlAsR0FBSyxFQUFFLE1BQU9FLEdBQVUsQ0FDdEIsUUFBUSxNQUFNRyxFQUFNLElBQUksUUFBRyxFQUFHLGVBQWdCSCxFQUFNLE9BQU8sRUFDdkQsRUFBQUksUUFBUSxJQUFJLE9BQ2QsUUFBUSxNQUFNSixFQUFNLEtBQUssRUFFM0IsRUFBQUksUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FBQyIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX1JlZmxlY3QiLCAiX19jb21tb25KU01pbiIsICJSZWZsZWN0IiwgImZhY3RvcnkiLCAicm9vdCIsICJzbG9wcHlNb2RlVGhpcyIsICJleHBvcnRlciIsICJtYWtlRXhwb3J0ZXIiLCAidGFyZ2V0IiwgInByZXZpb3VzIiwgImtleSIsICJ2YWx1ZSIsICJmdW5jdGlvblRoaXMiLCAiaW5kaXJlY3RFdmFsVGhpcyIsICJoYXNPd24iLCAic3VwcG9ydHNTeW1ib2wiLCAidG9QcmltaXRpdmVTeW1ib2wiLCAiaXRlcmF0b3JTeW1ib2wiLCAic3VwcG9ydHNDcmVhdGUiLCAic3VwcG9ydHNQcm90byIsICJkb3duTGV2ZWwiLCAiSGFzaE1hcCIsICJNYWtlRGljdGlvbmFyeSIsICJtYXAiLCAiZnVuY3Rpb25Qcm90b3R5cGUiLCAiX01hcCIsICJDcmVhdGVNYXBQb2x5ZmlsbCIsICJfU2V0IiwgIkNyZWF0ZVNldFBvbHlmaWxsIiwgIl9XZWFrTWFwIiwgIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsICJyZWdpc3RyeVN5bWJvbCIsICJtZXRhZGF0YVJlZ2lzdHJ5IiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJtZXRhZGF0YVByb3ZpZGVyIiwgIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCAiZGVjb3JhdGUiLCAiZGVjb3JhdG9ycyIsICJwcm9wZXJ0eUtleSIsICJhdHRyaWJ1dGVzIiwgIklzVW5kZWZpbmVkIiwgIklzQXJyYXkiLCAiSXNDb25zdHJ1Y3RvciIsICJEZWNvcmF0ZUNvbnN0cnVjdG9yIiwgIklzT2JqZWN0IiwgIklzTnVsbCIsICJUb1Byb3BlcnR5S2V5IiwgIkRlY29yYXRlUHJvcGVydHkiLCAibWV0YWRhdGEiLCAibWV0YWRhdGFLZXkiLCAibWV0YWRhdGFWYWx1ZSIsICJkZWNvcmF0b3IiLCAiSXNQcm9wZXJ0eUtleSIsICJPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImhhc01ldGFkYXRhIiwgIk9yZGluYXJ5SGFzTWV0YWRhdGEiLCAiaGFzT3duTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeUdldE1ldGFkYXRhIiwgImdldE93bk1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5TWV0YWRhdGFLZXlzIiwgImdldE93bk1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyIsICJkZWxldGVNZXRhZGF0YSIsICJwcm92aWRlciIsICJHZXRNZXRhZGF0YVByb3ZpZGVyIiwgImkiLCAiZGVjb3JhdGVkIiwgImRlc2NyaXB0b3IiLCAiTWV0YWRhdGFLZXkiLCAiTyIsICJQIiwgInBhcmVudCIsICJPcmRpbmFyeUdldFByb3RvdHlwZU9mIiwgIlRvQm9vbGVhbiIsICJNZXRhZGF0YVZhbHVlIiwgIm93bktleXMiLCAicGFyZW50S2V5cyIsICJzZXQiLCAia2V5cyIsICJfaSIsICJvd25LZXlzXzEiLCAiaGFzS2V5IiwgIl9hIiwgInBhcmVudEtleXNfMSIsICJUeXBlIiwgIngiLCAiSXNTeW1ib2wiLCAiVG9QcmltaXRpdmUiLCAiaW5wdXQiLCAiUHJlZmVycmVkVHlwZSIsICJoaW50IiwgImV4b3RpY1RvUHJpbSIsICJHZXRNZXRob2QiLCAicmVzdWx0IiwgIk9yZGluYXJ5VG9QcmltaXRpdmUiLCAidG9TdHJpbmdfMSIsICJJc0NhbGxhYmxlIiwgInZhbHVlT2YiLCAidG9TdHJpbmdfMiIsICJhcmd1bWVudCIsICJUb1N0cmluZyIsICJTYW1lVmFsdWVaZXJvIiwgInkiLCAiViIsICJmdW5jIiwgIkdldEl0ZXJhdG9yIiwgIm9iaiIsICJtZXRob2QiLCAiaXRlcmF0b3IiLCAiSXRlcmF0b3JWYWx1ZSIsICJpdGVyUmVzdWx0IiwgIkl0ZXJhdG9yU3RlcCIsICJJdGVyYXRvckNsb3NlIiwgImYiLCAicHJvdG8iLCAicHJvdG90eXBlIiwgInByb3RvdHlwZVByb3RvIiwgImNvbnN0cnVjdG9yIiwgIkNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAiZmFsbGJhY2siLCAiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsICJmaXJzdCIsICJzZWNvbmQiLCAicmVzdCIsICJ0YXJnZXRQcm92aWRlck1hcCIsICJyZWdpc3RyeSIsICJyZWdpc3RlclByb3ZpZGVyIiwgImdldFByb3ZpZGVyIiwgInNldFByb3ZpZGVyIiwgImdldFByb3ZpZGVyTm9DYWNoZSIsICJuZXh0IiwgInByb3ZpZGVyTWFwIiwgImhhc1Byb3ZpZGVyIiwgImV4aXN0aW5nUHJvdmlkZXIiLCAidGFyZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlEZWxldGVNZXRhZGF0YSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwgIkNyZWF0ZSIsICJjcmVhdGVkVGFyZ2V0TWV0YWRhdGEiLCAibWV0YWRhdGFNYXAiLCAia2V5c09iaiIsICJrIiwgIm5leHRWYWx1ZSIsICJlIiwgInJlZmxlY3QiLCAibWV0YWRhdGFPd25lciIsICJtZXRhZGF0YVByb3BlcnR5U2V0IiwgInJlZ2lzdGVyZWRQcm92aWRlciIsICJjYWNoZVNlbnRpbmVsIiwgImFycmF5U2VudGluZWwiLCAiTWFwSXRlcmF0b3IiLCAidmFsdWVzIiwgInNlbGVjdG9yIiwgImluZGV4IiwgImVycm9yIiwgIk1hcCIsICJzaXplIiwgImdldEtleSIsICJnZXRWYWx1ZSIsICJnZXRFbnRyeSIsICJpbnNlcnQiLCAiXyIsICJTZXQiLCAiVVVJRF9TSVpFIiwgInJvb3RLZXkiLCAiQ3JlYXRlVW5pcXVlS2V5IiwgIldlYWtNYXAiLCAidGFibGUiLCAiR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUiLCAiQ3JlYXRlVVVJRCIsICJjcmVhdGUiLCAiRmlsbFJhbmRvbUJ5dGVzIiwgImJ1ZmZlciIsICJHZW5SYW5kb21CeXRlcyIsICJhcnJheSIsICJkYXRhIiwgIm9mZnNldCIsICJieXRlIiwgImluZGV4X3VuaXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJtYWluIiwgIl9fdG9Db21tb25KUyIsICJBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUIiwgIndyYXBBbnNpMTYiLCAib2Zmc2V0IiwgImNvZGUiLCAid3JhcEFuc2kyNTYiLCAid3JhcEFuc2kxNm0iLCAicmVkIiwgImdyZWVuIiwgImJsdWUiLCAic3R5bGVzIiwgIm1vZGlmaWVyTmFtZXMiLCAiZm9yZWdyb3VuZENvbG9yTmFtZXMiLCAiYmFja2dyb3VuZENvbG9yTmFtZXMiLCAiY29sb3JOYW1lcyIsICJhc3NlbWJsZVN0eWxlcyIsICJjb2RlcyIsICJncm91cE5hbWUiLCAiZ3JvdXAiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgImhleCIsICJtYXRjaGVzIiwgImNvbG9yU3RyaW5nIiwgImNoYXJhY3RlciIsICJpbnRlZ2VyIiwgInJlbWFpbmRlciIsICJ2YWx1ZSIsICJyZXN1bHQiLCAiYW5zaVN0eWxlcyIsICJhbnNpX3N0eWxlc19kZWZhdWx0IiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW1wb3J0X25vZGVfb3MiLCAiaW1wb3J0X25vZGVfdHR5IiwgImhhc0ZsYWciLCAiZmxhZyIsICJhcmd2IiwgInByb2Nlc3MiLCAicHJlZml4IiwgInBvc2l0aW9uIiwgInRlcm1pbmF0b3JQb3NpdGlvbiIsICJlbnYiLCAiZmxhZ0ZvcmNlQ29sb3IiLCAiZW52Rm9yY2VDb2xvciIsICJ0cmFuc2xhdGVMZXZlbCIsICJsZXZlbCIsICJfc3VwcG9ydHNDb2xvciIsICJoYXZlU3RyZWFtIiwgInN0cmVhbUlzVFRZIiwgInNuaWZmRmxhZ3MiLCAibm9GbGFnRm9yY2VDb2xvciIsICJmb3JjZUNvbG9yIiwgIm1pbiIsICJvc1JlbGVhc2UiLCAib3MiLCAia2V5IiwgInNpZ24iLCAidmVyc2lvbiIsICJjcmVhdGVTdXBwb3J0c0NvbG9yIiwgInN0cmVhbSIsICJvcHRpb25zIiwgInN1cHBvcnRzQ29sb3IiLCAidHR5IiwgInN1cHBvcnRzX2NvbG9yX2RlZmF1bHQiLCAic3RyaW5nUmVwbGFjZUFsbCIsICJzdHJpbmciLCAic3Vic3RyaW5nIiwgInJlcGxhY2VyIiwgImluZGV4IiwgInN1YnN0cmluZ0xlbmd0aCIsICJlbmRJbmRleCIsICJyZXR1cm5WYWx1ZSIsICJzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgiLCAicHJlZml4IiwgInBvc3RmaXgiLCAiZ290Q1IiLCAic3Rkb3V0Q29sb3IiLCAic3RkZXJyQ29sb3IiLCAic3VwcG9ydHNfY29sb3JfZGVmYXVsdCIsICJHRU5FUkFUT1IiLCAiU1RZTEVSIiwgIklTX0VNUFRZIiwgImxldmVsTWFwcGluZyIsICJzdHlsZXMiLCAiYXBwbHlPcHRpb25zIiwgIm9iamVjdCIsICJvcHRpb25zIiwgImNvbG9yTGV2ZWwiLCAiQ2hhbGsiLCAiY2hhbGtGYWN0b3J5IiwgImNoYWxrIiwgInN0cmluZ3MiLCAiY3JlYXRlQ2hhbGsiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgImFuc2lfc3R5bGVzX2RlZmF1bHQiLCAiYnVpbGRlciIsICJjcmVhdGVCdWlsZGVyIiwgImNyZWF0ZVN0eWxlciIsICJnZXRNb2RlbEFuc2kiLCAibW9kZWwiLCAibGV2ZWwiLCAidHlwZSIsICJhcmd1bWVudHNfIiwgInVzZWRNb2RlbHMiLCAic3R5bGVyIiwgImJnTW9kZWwiLCAicHJvdG8iLCAib3BlbiIsICJjbG9zZSIsICJwYXJlbnQiLCAib3BlbkFsbCIsICJjbG9zZUFsbCIsICJzZWxmIiwgIl9zdHlsZXIiLCAiX2lzRW1wdHkiLCAiYXBwbHlTdHlsZSIsICJzdHJpbmciLCAic3RyaW5nUmVwbGFjZUFsbCIsICJsZkluZGV4IiwgInN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCIsICJjaGFsa1N0ZGVyciIsICJzb3VyY2VfZGVmYXVsdCIsICJSdW50aW1lQ2xpRXJyb3IiLCAibWVzc2FnZSIsICJjb2RlIiwgImhpbnQiLCAiUnVudGltZUNvbmZpZ0Vycm9yIiwgIlJ1bnRpbWVCdWlsZEVycm9yIiwgIlJ1bnRpbWVEZXBsb3ltZW50RXJyb3IiLCAiRGVwbG95bWVudEVycm9yIiwgIlJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IiLCAiUnVudGltZVRlbXBsYXRlRXJyb3IiLCAidGVtcGxhdGVOYW1lIiwgImNvcmVEaXIiLCAic2VhcmNoZWRQYXRocyIsICJwYWNrYWdlQ29udGV4dCIsICJyZXNvbHV0aW9uU3RyYXRlZ3kiLCAiUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IiLCAidGVtcGxhdGVEaXIiLCAidmFsaWRhdGlvbkVycm9ycyIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJlcnJvciIsICJ2ZXJib3NlIiwgImxpbmVzIiwgImZpZWxkTmFtZSIsICJzdGFja05hbWUiLCAib3BlcmF0aW9uIiwgInBhdGgiLCAidmFsaWRhdGlvbkVycm9yIiwgIlJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIiwgIm1ldGFkYXRhIiwgImxvZ0VudHJ5IiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X2JpbiIsICJSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIiwgIlB1cmVub3dUZW1wbGF0ZVNlcnZpY2UiLCAiY3dkIiwgInRlbXBsYXRlTmFtZSIsICJ0YXJnZXREaXIiLCAib3B0aW9ucyIsICJjb3JlRGlyIiwgInZhbGlkYXRpb24iLCAiUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IiLCAidGVtcGxhdGVQYXRoIiwgImF2YWlsYWJsZVRlbXBsYXRlcyIsICJyZXNvbHV0aW9uSW5mbyIsICJSdW50aW1lVGVtcGxhdGVFcnJvciIsICJvcmlnaW5hbFRlbXBsYXRlc0RpciIsICJvcmlnaW5hbENvcHlUZW1wbGF0ZUZpbGVzIiwgInNvdXJjZVBhdGgiLCAidGFyZ2V0UGF0aCIsICJjb250ZXh0IiwgInJ1bnRpbWVDb250ZXh0IiwgInNlYXJjaFBhdGhzIiwgInNlYXJjaFJlc3VsdHMiLCAicGFja2FnZUJhc2VkUGF0aCIsICJ0ZW1wbGF0ZXNQYXRoIiwgIm1vZHVsZUJhc2VkUGF0aHMiLCAibW9kdWxlUGF0aCIsICJub2RlTW9kdWxlUGF0aHMiLCAibm9kZU1vZHVsZVBhdGgiLCAiZW52QmFzZWRQYXRocyIsICJlbnZQYXRoIiwgInZhbGlkUmVzdWx0IiwgInJlc3VsdCIsICJzZWFyY2hlZFBhdGhzIiwgInBhY2thZ2VSb290IiwgImN1cnJlbnREaXIiLCAicGFja2FnZUpzb25QYXRoIiwgInBhdGhzIiwgInJ1bnRpbWVQYWNrYWdlUGF0aCIsICJydW50aW1lUm9vdCIsICJjbGlQYXRoIiwgInJ1bnRpbWVXZWJQYXRoIiwgImVudHJ5IiwgImNvcmVQYXRoIiwgImVycm9ycyIsICJ0ZW1wbGF0ZURpcnMiLCAidGVtcGxhdGVEaXIiLCAiZXJyb3IiLCAicmVzb2x1dGlvblN0cmF0ZWd5IiwgImF2YWlsYWJsZUNvcmVzIiwgInNhbml0aXplU3RhY2tOYW1lIiwgIm5hbWUiLCAic2FuaXRpemVkIiwgImZzIiwgImltcG9ydF9iaW4iLCAiUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlIiwgImN3ZCIsICJvcHRpb25zIiwgInN0YXJ0VGltZSIsICJzdGFnZSIsICJjb25maWciLCAiaW5mcmFTdGFja05hbWUiLCAic2FuaXRpemVTdGFja05hbWUiLCAicnVudGltZVN0YWNrTmFtZSIsICJydW50aW1lV2ViU3RhY2tOYW1lIiwgInMiLCAiaW5mcmFSZXN1bHQiLCAicnVudGltZVJlc3VsdCIsICJydW50aW1lV2ViUmVzdWx0IiwgImR1cmF0aW9uIiwgInN0YWNrTmFtZSIsICJvdXRwdXRzUGF0aCIsICJvdXRwdXRzIiwgIm91dHB1dHNGaWxlQ29udGVudCIsICJzdGFja091dHB1dHMiLCAia2V5IiwgImxhbWJkYU1hdGNoIiwgImVycm9yIiwgInJlZ2lvbiIsICJwYXJ0IiwgIm5hbWUiLCAic2VydmljZU5hbWUiLCAicmVnaW9uU2ltcGxpZmllZCIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJpbXBvcnRfcHJvY2VzcyIsICJpbXBvcnRfYmluIiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJzdGFja3NEZXBsb3lTZXJ2aWNlIiwgIm9wdGlvbnMiLCAiY29uZmlnIiwgImxvZ2dlciIsICJjd2QiLCAicHJvY2VzcyIsICJlbnZWYWxpZGF0b3IiLCAiZXJyb3IiLCAibWVzc2FnZSIsICJzdGFnZSIsICJzdGFnZUNvbmZpZyIsICJzIiwgInNvdXJjZV9kZWZhdWx0IiwgImRlcGxveVNlcnZpY2UiLCAiYnVpbGRTZXJ2aWNlIiwgImJvb3RzdHJhcFNlcnZpY2UiLCAiY3JlZGVudGlhbHMiLCAicmVnaW9uIiwgInJlc3VsdCIsICJsYW1iZGFBcm4iLCAiaW5kZXgiLCAiZnMiLCAicGF0aCIsICJpbXBvcnRfYmluIiwgInRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHMiLCAidGFyZ2V0IiwgImJ1aWxkQ29tbWFuZCIsICJvcHRpb25zIiwgImNvbmZpZyIsICJsb2dnZXIiLCAiY3dkIiwgImVudlZhbGlkYXRvciIsICJlcnJvciIsICJzb3VyY2VfZGVmYXVsdCIsICJidWlsZFNlcnZpY2UiLCAicmVzdWx0cyIsICJzaG91bGRHZW5lcmF0ZVR5cGVzIiwgImJ1aWxkQWxsVGFyZ2V0cyIsICJidWlsZFNpbmdsZVRhcmdldCIsICJnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMiLCAiZGlzcGxheUJ1aWxkU3VtbWFyeSIsICJ0YXJnZXRzIiwgInNwaW5uZXIiLCAicmVzdWx0IiwgImNhcGl0YWxpemUiLCAiZm9ybWF0RHVyYXRpb24iLCAidG90YWxEdXJhdGlvbiIsICJzdW0iLCAiciIsICJmdWxsUGF0aCIsICJzaXplIiwgImdldEZpbGVTaXplIiwgInJlbGF0aXZlUGF0aCIsICJmaWxlUGF0aCIsICJzdGF0cyIsICJmb3JtYXRCeXRlcyIsICJieXRlcyIsICJrIiwgInNpemVzIiwgImkiLCAibXMiLCAic3RyIiwgInBhdGgiLCAiZnMiLCAiaW1wb3J0X2JpbiIsICJydW50aW1lSW5pdENvbW1hbmQiLCAib3B0aW9ucyIsICJsb2dnZXIiLCAiY3dkIiwgImVudlZhbGlkYXRvciIsICJzcGlubmVyIiwgInRlbXBsYXRlU2VydmljZSIsICJSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIiwgInByb21wdFNlcnZpY2UiLCAidGFyZ2V0RGlyIiwgInRlbXBsYXRlIiwgImNvcmUiLCAiZm9yY2UiLCAicHJvamVjdE5hbWUiLCAicmVzb2x2ZWRUYXJnZXREaXIiLCAiZXhpc3RpbmdGaWxlcyIsICJjaGVja0V4aXN0aW5nUHJvamVjdEZpbGVzIiwgImZpbGUiLCAic291cmNlX2RlZmF1bHQiLCAiZGlzcGxheUNka1N1Y2Nlc3NNZXNzYWdlIiwgInJlc29sdmVkQ2RrRGlyIiwgImhhbmRsZUNka09ubHlDcmVkZW50aWFscyIsICJkaXNwbGF5UnVudGltZVN1Y2Nlc3NNZXNzYWdlIiwgImluaXRpYWxpemVDZGtXb3JrZmxvdyIsICJlcnJvciIsICJyZXNvbHZlZERpciIsICJpc0N1cnJlbnREaXIiLCAicmVsYXRpdmVEaXIiLCAicHJvamVjdERpciIsICJQcm9tcHRTZXJ2aWNlIiwgIlBhY2thZ2VNYW5hZ2VyU2VydmljZSIsICJDZGtJbml0U2VydmljZSIsICJBd3NDcmVkZW50aWFsc0RldGVjdG9yIiwgIkF3c1JlZ2lvblJlc29sdmVyIiwgInBhY2thZ2VNYW5hZ2VyU2VydmljZSIsICJjZGtJbml0U2VydmljZSIsICJhd3NEZXRlY3RvciIsICJjZGtFeGlzdHMiLCAicmVnaW9uUmVzdWx0IiwgInJlc29sdmVkUmVnaW9uIiwgImNvbmZpZyIsICJkZXRlY3RlZE1hbmFnZXIiLCAicmVzdWx0IiwgImNka0RpciIsICJrZXlGaWxlcyIsICJmaWxlUGF0aCIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJpbXBvcnRfcHJvY2VzcyIsICJpbXBvcnRfYmluIiwgIlJ1bnRpbWVXZWJDbGkiLCAiX1J1bnRpbWVXZWJDbGkiLCAidGFyZ2V0cyIsICJuYW1lIiwgInRhcmdldCIsICJkZXNjIiwgIm9wdGlvbnMiLCAiYnVpbGRDb21tYW5kIiwgImVycm9yIiwgInByb2Nlc3MiLCAiZGV2T3B0aW9ucyIsICJ0IiwgImdsb2JhbE9wdHMiLCAiY3dkIiwgInB1cmVub3dDb250ZXh0IiwgInN0YWNrc0RlcGxveVNlcnZpY2UiLCAiUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlIiwgImNtZCIsICJzdHJhdGVnaWVzIiwgImNvbnRleHQiLCAicmVzdWx0IiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJydW50aW1lSW5pdENvbW1hbmQiLCAiZGVzdHJveUNvbW1hbmQiLCAiYXJncyIsICJmb3JtYXR0ZXIiLCAiUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIiLCAidmVyYm9zZSIsICJSdW50aW1lVGVtcGxhdGVFcnJvciIsICJmb3JtYXR0ZWRFcnJvciIsICJSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciIsICJjcmVhdGVSdW50aW1lQ2xpIiwgImltcG9ydF9wcm9jZXNzIiwgIm1haW4iLCAiY3JlYXRlUnVudGltZUNsaSIsICJlcnJvciIsICJSdW50aW1lV2ViQ2xpIiwgImhhbmRsZUVycm9yIiwgInNvdXJjZV9kZWZhdWx0IiwgInByb2Nlc3MiLCAic2V0dXBHbG9iYWxFcnJvckhhbmRsZXJzIiwgInJlYXNvbiJdCn0K
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Fuc2ktc3R5bGVzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9oYXMtZmxhZy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS91dGlsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdGVtcGxhdGVzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnVuaXgudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi91dGlscy9lcnJvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL3NyYy91dGlscy9zdGFjay1uYW1lLXNhbml0aXplci50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9jb21tYW5kcy9ydW50aW1lLXdlYi1kZXBsb3ltZW50LnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9jb21tYW5kcy9idWlsZC5jb21tYW5kLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvaW5pdC50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcnVudGltZS13ZWItY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwgIi8qIE1JVCBsaWNlbnNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbmNvbnN0IGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG5jb25zdCByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG59XG5cbmNvbnN0IGNvbnZlcnQgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbi8vIEhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCkpIHtcblx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0fVxuXG5cdGNvbnN0IHtjaGFubmVscywgbGFiZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgcmRpZjtcblx0bGV0IGdkaWY7XG5cdGxldCBiZGlmO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IDA7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF07XG5cdGNvbnN0IGcgPSByZ2JbMV07XG5cdGxldCBiID0gcmdiWzJdO1xuXHRjb25zdCBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdGNvbnN0IHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHRjb25zdCBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHQvKlxuXHRcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuXHQqL1xuXHRyZXR1cm4gKFxuXHRcdCgoeFswXSAtIHlbMF0pICoqIDIpICtcblx0XHQoKHhbMV0gLSB5WzFdKSAqKiAyKSArXG5cdFx0KCh4WzJdIC0geVsyXSkgKiogMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0bGV0IGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKGNvbnN0IGtleXdvcmQgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgciA9IHJnYlswXSAvIDI1NTtcblx0bGV0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGxldCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/ICgoKHIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyAoKChnICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gKCgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0Y29uc3QgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0Y29uc3QgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0Y29uc3QgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF0gLyAzNjA7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdGNvbnN0IHQxID0gMiAqIGwgLSB0MjtcblxuXHRjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF07XG5cdGxldCBzID0gaHNsWzFdIC8gMTAwO1xuXHRsZXQgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHNtaW4gPSBzO1xuXHRjb25zdCBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0Y29uc3QgdiA9IChsICsgcykgLyAyO1xuXHRjb25zdCBzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdIC8gNjA7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGxldCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0Y29uc3QgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHRjb25zdCBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdGNvbnN0IHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF07XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0bGV0IHNsO1xuXHRsZXQgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGNvbnN0IGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IGggPSBod2JbMF0gLyAzNjA7XG5cdGxldCB3aCA9IGh3YlsxXSAvIDEwMDtcblx0bGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCByYXRpbyA9IHdoICsgYmw7XG5cdGxldCBmO1xuXG5cdC8vIFdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0Y29uc3QgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHRjb25zdCB2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0Y29uc3QgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyAgZyA9IG47ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47ICBnID0gdjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyAgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgIGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyAgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgIGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHRjb25zdCBjID0gY215a1swXSAvIDEwMDtcblx0Y29uc3QgbSA9IGNteWtbMV0gLyAxMDA7XG5cdGNvbnN0IHkgPSBjbXlrWzJdIC8gMTAwO1xuXHRjb25zdCBrID0gY215a1szXSAvIDEwMDtcblxuXHRjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgYiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG5cdGNvbnN0IHkgPSB4eXpbMV0gLyAxMDA7XG5cdGNvbnN0IHogPSB4eXpbMl0gLyAxMDA7XG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAociAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoZyAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoYiAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IHg7XG5cdGxldCB5O1xuXHRsZXQgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdGNvbnN0IHkyID0geSAqKiAzO1xuXHRjb25zdCB4MiA9IHggKiogMztcblx0Y29uc3QgejIgPSB6ICoqIDM7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IGg7XG5cblx0Y29uc3QgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0Y29uc3QgbCA9IGxjaFswXTtcblx0Y29uc3QgYyA9IGxjaFsxXTtcblx0Y29uc3QgaCA9IGxjaFsyXTtcblxuXHRjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0Y29uc3QgYSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncywgc2F0dXJhdGlvbiA9IG51bGwpIHtcblx0Y29uc3QgW3IsIGcsIGJdID0gYXJncztcblx0bGV0IHZhbHVlID0gc2F0dXJhdGlvbiA9PT0gbnVsbCA/IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXSA6IHNhdHVyYXRpb247IC8vIEhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdGxldCBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIE9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdGNvbnN0IGcgPSBhcmdzWzFdO1xuXHRjb25zdCBiID0gYXJnc1syXTtcblxuXHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdGNvbnN0IGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRsZXQgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0Y29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdGNvbnN0IHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0Y29uc3QgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHRsZXQgcmVtO1xuXHRjb25zdCByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0Y29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0bGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHRjb25zdCByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0Y29uc3QgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0Y29uc3QgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHRjb25zdCBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0bGV0IGdyYXlzY2FsZTtcblx0bGV0IGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hO1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IGwgPCAwLjUgPyAoMi4wICogcyAqIGwpIDogKDIuMCAqIHMgKiAoMS4wIC0gbCkpO1xuXG5cdGxldCBmID0gMDtcblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gcyAqIHY7XG5cdGxldCBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG5cdGNvbnN0IGhpID0gKGggJSAxKSAqIDY7XG5cdGNvbnN0IHYgPSBoaSAlIDE7XG5cdGNvbnN0IHcgPSAxIC0gdjtcblx0bGV0IG1nID0gMDtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHRsZXQgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgdyA9IGh3YlsxXSAvIDEwMDtcblx0Y29uc3QgYiA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgdiA9IDEgLSBiO1xuXHRjb25zdCBjID0gdiAtIHc7XG5cdGxldCBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmhzdiA9IGNvbnZlcnQuZ3JheS5oc2w7XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0Y29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwgImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuXG4vKlxuXHRUaGlzIGZ1bmN0aW9uIHJvdXRlcyBhIG1vZGVsIHRvIGFsbCBvdGhlciBtb2RlbHMuXG5cblx0YWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSByb3V0ZWQgaGF2ZSBhIHByb3BlcnR5IGAuY29udmVyc2lvbmAgYXR0YWNoZWRcblx0dG8gdGhlIHJldHVybmVkIHN5bnRoZXRpYyBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuXHRvZiBzdHJpbmdzLCBlYWNoIHdpdGggdGhlIHN0ZXBzIGluIGJldHdlZW4gdGhlICdmcm9tJyBhbmQgJ3RvJ1xuXHRjb2xvciBtb2RlbHMgKGluY2x1c2l2ZSkuXG5cblx0Y29udmVyc2lvbnMgdGhhdCBhcmUgbm90IHBvc3NpYmxlIHNpbXBseSBhcmUgbm90IGluY2x1ZGVkLlxuKi9cblxuZnVuY3Rpb24gYnVpbGRHcmFwaCgpIHtcblx0Y29uc3QgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHRjb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdGNvbnN0IGdyYXBoID0gYnVpbGRHcmFwaCgpO1xuXHRjb25zdCBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyBVbnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0Y29uc3QgYWRqYWNlbnRzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnNbY3VycmVudF0pO1xuXG5cdFx0Zm9yIChsZXQgbGVuID0gYWRqYWNlbnRzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3QgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHRjb25zdCBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHRjb25zdCBwYXRoID0gW2dyYXBoW3RvTW9kZWxdLnBhcmVudCwgdG9Nb2RlbF07XG5cdGxldCBmbiA9IGNvbnZlcnNpb25zW2dyYXBoW3RvTW9kZWxdLnBhcmVudF1bdG9Nb2RlbF07XG5cblx0bGV0IGN1ciA9IGdyYXBoW3RvTW9kZWxdLnBhcmVudDtcblx0d2hpbGUgKGdyYXBoW2N1cl0ucGFyZW50KSB7XG5cdFx0cGF0aC51bnNoaWZ0KGdyYXBoW2N1cl0ucGFyZW50KTtcblx0XHRmbiA9IGxpbmsoY29udmVyc2lvbnNbZ3JhcGhbY3VyXS5wYXJlbnRdW2N1cl0sIGZuKTtcblx0XHRjdXIgPSBncmFwaFtjdXJdLnBhcmVudDtcblx0fVxuXG5cdGZuLmNvbnZlcnNpb24gPSBwYXRoO1xuXHRyZXR1cm4gZm47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHRjb25zdCBjb252ZXJzaW9uID0ge307XG5cblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoZ3JhcGgpO1xuXHRmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Y29uc3QgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHRjb25zdCBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIE5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwgImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuY29uc3Qgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbmNvbnN0IGNvbnZlcnQgPSB7fTtcblxuY29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHRjb25zdCB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQgPSBmbihhcmdzKTtcblxuXHRcdC8vIFdlJ3JlIGFzc3VtaW5nIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgaGVyZS5cblx0XHQvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG5cdFx0Ly8gaW4gY29udmVyc2lvbiBmdW5jdGlvbnMuXG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGxldCBsZW4gPSByZXN1bHQubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IE1hdGgucm91bmQocmVzdWx0W2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIFByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxubW9kZWxzLmZvckVhY2goZnJvbU1vZGVsID0+IHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0Y29uc3Qgcm91dGVzID0gcm91dGUoZnJvbU1vZGVsKTtcblx0Y29uc3Qgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2godG9Nb2RlbCA9PiB7XG5cdFx0Y29uc3QgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7Y29kZSArIG9mZnNldH1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xufTtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcblx0Y29uc3QgcmdiID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmdiWzBdfTske3JnYlsxXX07JHtyZ2JbMl19bWA7XG59O1xuXG5jb25zdCBhbnNpMmFuc2kgPSBuID0+IG47XG5jb25zdCByZ2IycmdiID0gKHIsIGcsIGIpID0+IFtyLCBnLCBiXTtcblxuY29uc3Qgc2V0TGF6eVByb3BlcnR5ID0gKG9iamVjdCwgcHJvcGVydHksIGdldCkgPT4ge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwge1xuXHRcdGdldDogKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBnZXQoKTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdH0pO1xufTtcblxuLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCdjb2xvci1jb252ZXJ0Jyl9ICovXG5sZXQgY29sb3JDb252ZXJ0O1xuY29uc3QgbWFrZUR5bmFtaWNTdHlsZXMgPSAod3JhcCwgdGFyZ2V0U3BhY2UsIGlkZW50aXR5LCBpc0JhY2tncm91bmQpID0+IHtcblx0aWYgKGNvbG9yQ29udmVydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29sb3JDb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xuXHR9XG5cblx0Y29uc3Qgb2Zmc2V0ID0gaXNCYWNrZ3JvdW5kID8gMTAgOiAwO1xuXHRjb25zdCBzdHlsZXMgPSB7fTtcblxuXHRmb3IgKGNvbnN0IFtzb3VyY2VTcGFjZSwgc3VpdGVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbG9yQ29udmVydCkpIHtcblx0XHRjb25zdCBuYW1lID0gc291cmNlU3BhY2UgPT09ICdhbnNpMTYnID8gJ2Fuc2knIDogc291cmNlU3BhY2U7XG5cdFx0aWYgKHNvdXJjZVNwYWNlID09PSB0YXJnZXRTcGFjZSkge1xuXHRcdFx0c3R5bGVzW25hbWVdID0gd3JhcChpZGVudGl0eSwgb2Zmc2V0KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzdWl0ZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoc3VpdGVbdGFyZ2V0U3BhY2VdLCBvZmZzZXQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59O1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHN0eWxlcyA9IHtcblx0XHRtb2RpZmllcjoge1xuXHRcdFx0cmVzZXQ6IFswLCAwXSxcblx0XHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0XHRkaW06IFsyLCAyMl0sXG5cdFx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XVxuXHRcdH0sXG5cdFx0Y29sb3I6IHtcblx0XHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRcdGN5YW46IFszNiwgMzldLFxuXHRcdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldXG5cdFx0fSxcblx0XHRiZ0NvbG9yOiB7XG5cdFx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV1cblx0XHR9XG5cdH07XG5cblx0Ly8gQWxpYXMgYnJpZ2h0IGJsYWNrIGFzIGdyYXkgKGFuZCBncmV5KVxuXHRzdHlsZXMuY29sb3IuZ3JheSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcblx0c3R5bGVzLmJnQ29sb3IuYmdHcmF5ID0gc3R5bGVzLmJnQ29sb3IuYmdCbGFja0JyaWdodDtcblx0c3R5bGVzLmNvbG9yLmdyZXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JleSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5jb2xvciwgJ2Fuc2kyNTYnLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTI1NiwgJ2Fuc2kyNTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCB0cnVlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kxNm0nLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2bSwgJ3JnYicsIHJnYjJyZ2IsIHRydWUpKTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgaGFzRmxhZyA9IHJlcXVpcmUoJ2hhcy1mbGFnJyk7XG5cbmNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxubGV0IGZvcmNlQ29sb3I7XG5pZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRoYXNGbGFnKCduby1jb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1mYWxzZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJykpIHtcblx0Zm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHxcblx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG5cdGZvcmNlQ29sb3IgPSAxO1xufVxuXG5pZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYpIHtcblx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDE7XG5cdH0gZWxzZSBpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yY2VDb2xvciA9IGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4ocGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gM1xuXHR9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHN0cmVhbUlzVFRZKSB7XG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj1mdWxsJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0dJVEhVQl9BQ1RJT05TJywgJ0JVSUxES0lURSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBwYXJzZUludCgoZW52LlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cblx0XHRzd2l0Y2ggKGVudi5URVJNX1BST0dSQU0pIHtcblx0XHRcdGNhc2UgJ2lUZXJtLmFwcCc6XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0fVxuXHR9XG5cblx0aWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5mdW5jdGlvbiBnZXRTdXBwb3J0TGV2ZWwoc3RyZWFtKSB7XG5cdGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0sIHN0cmVhbSAmJiBzdHJlYW0uaXNUVFkpO1xuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsLFxuXHRzdGRvdXQ6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgxKSkpLFxuXHRzdGRlcnI6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgyKSkpXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyaW5nUmVwbGFjZUFsbCA9IChzdHJpbmcsIHN1YnN0cmluZywgcmVwbGFjZXIpID0+IHtcblx0bGV0IGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nKTtcblx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCBzdWJzdHJpbmdMZW5ndGggPSBzdWJzdHJpbmcubGVuZ3RoO1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zdWJzdHIoZW5kSW5kZXgsIGluZGV4IC0gZW5kSW5kZXgpICsgc3Vic3RyaW5nICsgcmVwbGFjZXI7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIHN1YnN0cmluZ0xlbmd0aDtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zdWJzdHIoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuXG5jb25zdCBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXggPSAoc3RyaW5nLCBwcmVmaXgsIHBvc3RmaXgsIGluZGV4KSA9PiB7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0Y29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCwgKGdvdENSID8gaW5kZXggLSAxIDogaW5kZXgpIC0gZW5kSW5kZXgpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyAxO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc3Vic3RyKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN0cmluZ1JlcGxhY2VBbGwsXG5cdHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleFxufTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBURU1QTEFURV9SRUdFWCA9IC8oPzpcXFxcKHUoPzpbYS1mXFxkXXs0fXxcXHtbYS1mXFxkXXsxLDZ9XFx9KXx4W2EtZlxcZF17Mn18LikpfCg/Olxceyh+KT8oXFx3Kyg/OlxcKFteKV0qXFwpKT8oPzpcXC5cXHcrKD86XFwoW14pXSpcXCkpPykqKSg/OlsgXFx0XXwoPz1cXHI/XFxuKSkpfChcXH0pfCgoPzoufFtcXHJcXG5cXGZdKSs/KS9naTtcbmNvbnN0IFNUWUxFX1JFR0VYID0gLyg/Ol58XFwuKShcXHcrKSg/OlxcKChbXildKilcXCkpPy9nO1xuY29uc3QgU1RSSU5HX1JFR0VYID0gL14oWydcIl0pKCg/OlxcXFwufCg/IVxcMSlbXlxcXFxdKSopXFwxJC87XG5jb25zdCBFU0NBUEVfUkVHRVggPSAvXFxcXCh1KD86W2EtZlxcZF17NH18e1thLWZcXGRdezEsNn19KXx4W2EtZlxcZF17Mn18Lil8KFteXFxcXF0pL2dpO1xuXG5jb25zdCBFU0NBUEVTID0gbmV3IE1hcChbXG5cdFsnbicsICdcXG4nXSxcblx0WydyJywgJ1xcciddLFxuXHRbJ3QnLCAnXFx0J10sXG5cdFsnYicsICdcXGInXSxcblx0WydmJywgJ1xcZiddLFxuXHRbJ3YnLCAnXFx2J10sXG5cdFsnMCcsICdcXDAnXSxcblx0WydcXFxcJywgJ1xcXFwnXSxcblx0WydlJywgJ1xcdTAwMUInXSxcblx0WydhJywgJ1xcdTAwMDcnXVxuXSk7XG5cbmZ1bmN0aW9uIHVuZXNjYXBlKGMpIHtcblx0Y29uc3QgdSA9IGNbMF0gPT09ICd1Jztcblx0Y29uc3QgYnJhY2tldCA9IGNbMV0gPT09ICd7JztcblxuXHRpZiAoKHUgJiYgIWJyYWNrZXQgJiYgYy5sZW5ndGggPT09IDUpIHx8IChjWzBdID09PSAneCcgJiYgYy5sZW5ndGggPT09IDMpKSB7XG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYy5zbGljZSgxKSwgMTYpKTtcblx0fVxuXG5cdGlmICh1ICYmIGJyYWNrZXQpIHtcblx0XHRyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoYy5zbGljZSgyLCAtMSksIDE2KSk7XG5cdH1cblxuXHRyZXR1cm4gRVNDQVBFUy5nZXQoYykgfHwgYztcbn1cblxuZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMobmFtZSwgYXJndW1lbnRzXykge1xuXHRjb25zdCByZXN1bHRzID0gW107XG5cdGNvbnN0IGNodW5rcyA9IGFyZ3VtZW50c18udHJpbSgpLnNwbGl0KC9cXHMqLFxccyovZyk7XG5cdGxldCBtYXRjaGVzO1xuXG5cdGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG5cdFx0Y29uc3QgbnVtYmVyID0gTnVtYmVyKGNodW5rKTtcblx0XHRpZiAoIU51bWJlci5pc05hTihudW1iZXIpKSB7XG5cdFx0XHRyZXN1bHRzLnB1c2gobnVtYmVyKTtcblx0XHR9IGVsc2UgaWYgKChtYXRjaGVzID0gY2h1bmsubWF0Y2goU1RSSU5HX1JFR0VYKSkpIHtcblx0XHRcdHJlc3VsdHMucHVzaChtYXRjaGVzWzJdLnJlcGxhY2UoRVNDQVBFX1JFR0VYLCAobSwgZXNjYXBlLCBjaGFyYWN0ZXIpID0+IGVzY2FwZSA/IHVuZXNjYXBlKGVzY2FwZSkgOiBjaGFyYWN0ZXIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIENoYWxrIHRlbXBsYXRlIHN0eWxlIGFyZ3VtZW50OiAke2NodW5rfSAoaW4gc3R5bGUgJyR7bmFtZX0nKWApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0eWxlKHN0eWxlKSB7XG5cdFNUWUxFX1JFR0VYLmxhc3RJbmRleCA9IDA7XG5cblx0Y29uc3QgcmVzdWx0cyA9IFtdO1xuXHRsZXQgbWF0Y2hlcztcblxuXHR3aGlsZSAoKG1hdGNoZXMgPSBTVFlMRV9SRUdFWC5leGVjKHN0eWxlKSkgIT09IG51bGwpIHtcblx0XHRjb25zdCBuYW1lID0gbWF0Y2hlc1sxXTtcblxuXHRcdGlmIChtYXRjaGVzWzJdKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gcGFyc2VBcmd1bWVudHMobmFtZSwgbWF0Y2hlc1syXSk7XG5cdFx0XHRyZXN1bHRzLnB1c2goW25hbWVdLmNvbmNhdChhcmdzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdHMucHVzaChbbmFtZV0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0eWxlKGNoYWxrLCBzdHlsZXMpIHtcblx0Y29uc3QgZW5hYmxlZCA9IHt9O1xuXG5cdGZvciAoY29uc3QgbGF5ZXIgb2Ygc3R5bGVzKSB7XG5cdFx0Zm9yIChjb25zdCBzdHlsZSBvZiBsYXllci5zdHlsZXMpIHtcblx0XHRcdGVuYWJsZWRbc3R5bGVbMF1dID0gbGF5ZXIuaW52ZXJzZSA/IG51bGwgOiBzdHlsZS5zbGljZSgxKTtcblx0XHR9XG5cdH1cblxuXHRsZXQgY3VycmVudCA9IGNoYWxrO1xuXHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlc10gb2YgT2JqZWN0LmVudHJpZXMoZW5hYmxlZCkpIHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKCEoc3R5bGVOYW1lIGluIGN1cnJlbnQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQ2hhbGsgc3R5bGU6ICR7c3R5bGVOYW1lfWApO1xuXHRcdH1cblxuXHRcdGN1cnJlbnQgPSBzdHlsZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRbc3R5bGVOYW1lXSguLi5zdHlsZXMpIDogY3VycmVudFtzdHlsZU5hbWVdO1xuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gKGNoYWxrLCB0ZW1wb3JhcnkpID0+IHtcblx0Y29uc3Qgc3R5bGVzID0gW107XG5cdGNvbnN0IGNodW5rcyA9IFtdO1xuXHRsZXQgY2h1bmsgPSBbXTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXHR0ZW1wb3JhcnkucmVwbGFjZShURU1QTEFURV9SRUdFWCwgKG0sIGVzY2FwZUNoYXJhY3RlciwgaW52ZXJzZSwgc3R5bGUsIGNsb3NlLCBjaGFyYWN0ZXIpID0+IHtcblx0XHRpZiAoZXNjYXBlQ2hhcmFjdGVyKSB7XG5cdFx0XHRjaHVuay5wdXNoKHVuZXNjYXBlKGVzY2FwZUNoYXJhY3RlcikpO1xuXHRcdH0gZWxzZSBpZiAoc3R5bGUpIHtcblx0XHRcdGNvbnN0IHN0cmluZyA9IGNodW5rLmpvaW4oJycpO1xuXHRcdFx0Y2h1bmsgPSBbXTtcblx0XHRcdGNodW5rcy5wdXNoKHN0eWxlcy5sZW5ndGggPT09IDAgPyBzdHJpbmcgOiBidWlsZFN0eWxlKGNoYWxrLCBzdHlsZXMpKHN0cmluZykpO1xuXHRcdFx0c3R5bGVzLnB1c2goe2ludmVyc2UsIHN0eWxlczogcGFyc2VTdHlsZShzdHlsZSl9KTtcblx0XHR9IGVsc2UgaWYgKGNsb3NlKSB7XG5cdFx0XHRpZiAoc3R5bGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGV4dHJhbmVvdXMgfSBpbiBDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsJyk7XG5cdFx0XHR9XG5cblx0XHRcdGNodW5rcy5wdXNoKGJ1aWxkU3R5bGUoY2hhbGssIHN0eWxlcykoY2h1bmsuam9pbignJykpKTtcblx0XHRcdGNodW5rID0gW107XG5cdFx0XHRzdHlsZXMucG9wKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNodW5rLnB1c2goY2hhcmFjdGVyKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNodW5rcy5wdXNoKGNodW5rLmpvaW4oJycpKTtcblxuXHRpZiAoc3R5bGVzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBlcnJNZXNzYWdlID0gYENoYWxrIHRlbXBsYXRlIGxpdGVyYWwgaXMgbWlzc2luZyAke3N0eWxlcy5sZW5ndGh9IGNsb3NpbmcgYnJhY2tldCR7c3R5bGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSAoXFxgfVxcYClgO1xuXHRcdHRocm93IG5ldyBFcnJvcihlcnJNZXNzYWdlKTtcblx0fVxuXG5cdHJldHVybiBjaHVua3Muam9pbignJyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFuc2lTdHlsZXMgPSByZXF1aXJlKCdhbnNpLXN0eWxlcycpO1xuY29uc3Qge3N0ZG91dDogc3Rkb3V0Q29sb3IsIHN0ZGVycjogc3RkZXJyQ29sb3J9ID0gcmVxdWlyZSgnc3VwcG9ydHMtY29sb3InKTtcbmNvbnN0IHtcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4XG59ID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vLyBgc3VwcG9ydHNDb2xvci5sZXZlbGAgXHUyMTkyIGBhbnNpU3R5bGVzLmNvbG9yW25hbWVdYCBtYXBwaW5nXG5jb25zdCBsZXZlbE1hcHBpbmcgPSBbXG5cdCdhbnNpJyxcblx0J2Fuc2knLFxuXHQnYW5zaTI1NicsXG5cdCdhbnNpMTZtJ1xuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuY2xhc3MgQ2hhbGtDbGFzcyB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RydWN0b3ItcmV0dXJuXG5cdFx0cmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcblx0fVxufVxuXG5jb25zdCBjaGFsa0ZhY3RvcnkgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgY2hhbGsgPSB7fTtcblx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuXHRjaGFsay50ZW1wbGF0ZSA9ICguLi5hcmd1bWVudHNfKSA9PiBjaGFsa1RhZyhjaGFsay50ZW1wbGF0ZSwgLi4uYXJndW1lbnRzXyk7XG5cblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWxrLCBDaGFsay5wcm90b3R5cGUpO1xuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGsudGVtcGxhdGUsIGNoYWxrKTtcblxuXHRjaGFsay50ZW1wbGF0ZS5jb25zdHJ1Y3RvciA9ICgpID0+IHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2BjaGFsay5jb25zdHJ1Y3RvcigpYCBpcyBkZXByZWNhdGVkLiBVc2UgYG5ldyBjaGFsay5JbnN0YW5jZSgpYCBpbnN0ZWFkLicpO1xuXHR9O1xuXG5cdGNoYWxrLnRlbXBsYXRlLkluc3RhbmNlID0gQ2hhbGtDbGFzcztcblxuXHRyZXR1cm4gY2hhbGsudGVtcGxhdGU7XG59O1xuXG5mdW5jdGlvbiBDaGFsayhvcHRpb25zKSB7XG5cdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG59XG5cbmZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMpKSB7XG5cdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIGNyZWF0ZVN0eWxlcihzdHlsZS5vcGVuLCBzdHlsZS5jbG9zZSwgdGhpcy5fc3R5bGVyKSwgdGhpcy5faXNFbXB0eSk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgc3R5bGVOYW1lLCB7dmFsdWU6IGJ1aWxkZXJ9KTtcblx0XHRcdHJldHVybiBidWlsZGVyO1xuXHRcdH1cblx0fTtcbn1cblxuc3R5bGVzLnZpc2libGUgPSB7XG5cdGdldCgpIHtcblx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzLl9zdHlsZXIsIHRydWUpO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmlzaWJsZScsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdHJldHVybiBidWlsZGVyO1xuXHR9XG59O1xuXG5jb25zdCB1c2VkTW9kZWxzID0gWydyZ2InLCAnaGV4JywgJ2tleXdvcmQnLCAnaHNsJywgJ2hzdicsICdod2InLCAnYW5zaScsICdhbnNpMjU2J107XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRzdHlsZXNbbW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihhbnNpU3R5bGVzLmNvbG9yW2xldmVsTWFwcGluZ1tsZXZlbF1dW21vZGVsXSguLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpcy5fc3R5bGVyKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzLl9pc0VtcHR5KTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xufVxuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0Y29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG5cdHN0eWxlc1tiZ01vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoYW5zaVN0eWxlcy5iZ0NvbG9yW2xldmVsTWFwcGluZ1tsZXZlbF1dW21vZGVsXSguLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5iZ0NvbG9yLmNsb3NlLCB0aGlzLl9zdHlsZXIpO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXMuX2lzRW1wdHkpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH07XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcblx0Li4uc3R5bGVzLFxuXHRsZXZlbDoge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRvci5sZXZlbDtcblx0XHR9LFxuXHRcdHNldChsZXZlbCkge1xuXHRcdFx0dGhpcy5fZ2VuZXJhdG9yLmxldmVsID0gbGV2ZWw7XG5cdFx0fVxuXHR9XG59KTtcblxuY29uc3QgY3JlYXRlU3R5bGVyID0gKG9wZW4sIGNsb3NlLCBwYXJlbnQpID0+IHtcblx0bGV0IG9wZW5BbGw7XG5cdGxldCBjbG9zZUFsbDtcblx0aWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0b3BlbkFsbCA9IG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZTtcblx0fSBlbHNlIHtcblx0XHRvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZW4sXG5cdFx0Y2xvc2UsXG5cdFx0b3BlbkFsbCxcblx0XHRjbG9zZUFsbCxcblx0XHRwYXJlbnRcblx0fTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcblx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiB7XG5cdFx0aWYgKGlzQXJyYXkoYXJndW1lbnRzX1swXSkgJiYgaXNBcnJheShhcmd1bWVudHNfWzBdLnJhdykpIHtcblx0XHRcdC8vIENhbGxlZCBhcyBhIHRlbXBsYXRlIGxpdGVyYWwsIGZvciBleGFtcGxlOiBjaGFsay5yZWRgMiArIDMgPSB7Ym9sZCAkezIrM319YFxuXHRcdFx0cmV0dXJuIGFwcGx5U3R5bGUoYnVpbGRlciwgY2hhbGtUYWcoYnVpbGRlciwgLi4uYXJndW1lbnRzXykpO1xuXHRcdH1cblxuXHRcdC8vIFNpbmdsZSBhcmd1bWVudCBpcyBob3QgcGF0aCwgaW1wbGljaXQgY29lcmNpb24gaXMgZmFzdGVyIHRoYW4gYW55dGhpbmdcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0XHRyZXR1cm4gYXBwbHlTdHlsZShidWlsZGVyLCAoYXJndW1lbnRzXy5sZW5ndGggPT09IDEpID8gKCcnICsgYXJndW1lbnRzX1swXSkgOiBhcmd1bWVudHNfLmpvaW4oJyAnKSk7XG5cdH07XG5cblx0Ly8gV2UgYWx0ZXIgdGhlIHByb3RvdHlwZSBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcblxuXHRidWlsZGVyLl9nZW5lcmF0b3IgPSBzZWxmO1xuXHRidWlsZGVyLl9zdHlsZXIgPSBfc3R5bGVyO1xuXHRidWlsZGVyLl9pc0VtcHR5ID0gX2lzRW1wdHk7XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59O1xuXG5jb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZi5sZXZlbCA8PSAwIHx8ICFzdHJpbmcpIHtcblx0XHRyZXR1cm4gc2VsZi5faXNFbXB0eSA/ICcnIDogc3RyaW5nO1xuXHR9XG5cblx0bGV0IHN0eWxlciA9IHNlbGYuX3N0eWxlcjtcblxuXHRpZiAoc3R5bGVyID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qge29wZW5BbGwsIGNsb3NlQWxsfSA9IHN0eWxlcjtcblx0aWYgKHN0cmluZy5pbmRleE9mKCdcXHUwMDFCJykgIT09IC0xKSB7XG5cdFx0d2hpbGUgKHN0eWxlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBSZXBsYWNlIGFueSBpbnN0YW5jZXMgYWxyZWFkeSBwcmVzZW50IHdpdGggYSByZS1vcGVuaW5nIGNvZGVcblx0XHRcdC8vIG90aGVyd2lzZSBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgdW50aWwgc2FpZCBjbG9zaW5nIGNvZGVcblx0XHRcdC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3R5bGVyLmNsb3NlLCBzdHlsZXIub3Blbik7XG5cblx0XHRcdHN0eWxlciA9IHN0eWxlci5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gV2UgY2FuIG1vdmUgYm90aCBuZXh0IGFjdGlvbnMgb3V0IG9mIGxvb3AsIGJlY2F1c2UgcmVtYWluaW5nIGFjdGlvbnMgaW4gbG9vcCB3b24ndCBoYXZlXG5cdC8vIGFueS92aXNpYmxlIGVmZmVjdCBvbiBwYXJ0cyB3ZSBhZGQgaGVyZS4gQ2xvc2UgdGhlIHN0eWxpbmcgYmVmb3JlIGEgbGluZWJyZWFrIGFuZCByZW9wZW5cblx0Ly8gYWZ0ZXIgbmV4dCBsaW5lIHRvIGZpeCBhIGJsZWVkIGlzc3VlIG9uIG1hY09TOiBodHRwczovL2dpdGh1Yi5jb20vY2hhbGsvY2hhbGsvcHVsbC85MlxuXHRjb25zdCBsZkluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicpO1xuXHRpZiAobGZJbmRleCAhPT0gLTEpIHtcblx0XHRzdHJpbmcgPSBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBjbG9zZUFsbCwgb3BlbkFsbCwgbGZJbmRleCk7XG5cdH1cblxuXHRyZXR1cm4gb3BlbkFsbCArIHN0cmluZyArIGNsb3NlQWxsO1xufTtcblxubGV0IHRlbXBsYXRlO1xuY29uc3QgY2hhbGtUYWcgPSAoY2hhbGssIC4uLnN0cmluZ3MpID0+IHtcblx0Y29uc3QgW2ZpcnN0U3RyaW5nXSA9IHN0cmluZ3M7XG5cblx0aWYgKCFpc0FycmF5KGZpcnN0U3RyaW5nKSB8fCAhaXNBcnJheShmaXJzdFN0cmluZy5yYXcpKSB7XG5cdFx0Ly8gSWYgY2hhbGsoKSB3YXMgY2FsbGVkIGJ5IGl0c2VsZiBvciB3aXRoIGEgc3RyaW5nLFxuXHRcdC8vIHJldHVybiB0aGUgc3RyaW5nIGl0c2VsZiBhcyBhIHN0cmluZy5cblx0XHRyZXR1cm4gc3RyaW5ncy5qb2luKCcgJyk7XG5cdH1cblxuXHRjb25zdCBhcmd1bWVudHNfID0gc3RyaW5ncy5zbGljZSgxKTtcblx0Y29uc3QgcGFydHMgPSBbZmlyc3RTdHJpbmcucmF3WzBdXTtcblxuXHRmb3IgKGxldCBpID0gMTsgaSA8IGZpcnN0U3RyaW5nLmxlbmd0aDsgaSsrKSB7XG5cdFx0cGFydHMucHVzaChcblx0XHRcdFN0cmluZyhhcmd1bWVudHNfW2kgLSAxXSkucmVwbGFjZSgvW3t9XFxcXF0vZywgJ1xcXFwkJicpLFxuXHRcdFx0U3RyaW5nKGZpcnN0U3RyaW5nLnJhd1tpXSlcblx0XHQpO1xuXHR9XG5cblx0aWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcblx0XHR0ZW1wbGF0ZSA9IHJlcXVpcmUoJy4vdGVtcGxhdGVzJyk7XG5cdH1cblxuXHRyZXR1cm4gdGVtcGxhdGUoY2hhbGssIHBhcnRzLmpvaW4oJycpKTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuY29uc3QgY2hhbGsgPSBDaGFsaygpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbmNoYWxrLnN1cHBvcnRzQ29sb3IgPSBzdGRvdXRDb2xvcjtcbmNoYWxrLnN0ZGVyciA9IENoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5jaGFsay5zdGRlcnIuc3VwcG9ydHNDb2xvciA9IHN0ZGVyckNvbG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoYWxrO1xuIiwgIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgXHUwMEE3IDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBjb25zdCBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVJ1bnRpbWVDbGksIFJ1bnRpbWVXZWJDbGkgfSBmcm9tICdAYmluL3J1bnRpbWUtd2ViLWNsaSc7XG5cbi8qKlxuICogTWFpbiBDTEkgZW50cnkgcG9pbnQgd2l0aCBydW50aW1lLXdlYiBleHRlbnNpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbiAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG5cbiAgICAvLyBQYXJzZSBhbmQgZXhlY3V0ZSBDTEkgY29tbWFuZHNcbiAgICBhd2FpdCBjbGkucnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQHRvZG86IHRlc3QgdGhpcyBjdXN0b20gZm9ybWF0dGVyIHNvbHV0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRvIG9yaWdpbmFsXG4gICAgUnVudGltZVdlYkNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgZXJyb3JzIHdpdGggZm9ybWF0dGVkIG91dHB1dFxuICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogdW5rbm93bik6IG5ldmVyIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdFcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmtub3duIGVycm9yOicsIFN0cmluZyhlcnJvcikpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBnbG9iYWwgZXJyb3IgaGFuZGxlcnMgZm9yIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcbiAqL1xuZnVuY3Rpb24gc2V0dXBHbG9iYWxFcnJvckhhbmRsZXJzKCkge1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmNhdWdodCBleGNlcHRpb246JywgZXJyb3IubWVzc2FnZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdVbmhhbmRsZWQgcmVqZWN0aW9uOicsIHJlYXNvbik7XG4gICAgaWYgKHByb2Nlc3MuZW52LkRFQlVHICYmIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHJlYXNvbi5zdGFjayk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG5cbi8vIFNldHVwIGVycm9yIGhhbmRsZXJzXG5zZXR1cEdsb2JhbEVycm9ySGFuZGxlcnMoKTtcblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXHUyNzE3JyksICdGYXRhbCBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4vLyB9XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIEJhc2UgZXJyb3IgY2xhc3MgZm9yIGFsbCBSdW50aW1lIENMSSBlcnJvcnNcbiAqIEZvbGxvd3MgcHVyZW5vdyBlcnJvciBwYXR0ZXJucyB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lQ2xpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29kZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBoaW50Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZUNsaUVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIG9yIG1pc3NpbmdcbiAqIEV4dGVuZHMgcHVyZW5vdyBDb25maWdFcnJvciBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lQ29uZmlnRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9DT05GSUdfRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZUNvbmZpZ0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgYnVpbGQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgQnVpbGRFcnJvciBwYXR0ZXJuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lQnVpbGRFcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX0JVSUxEX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVCdWlsZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgZGVwbG95bWVudCBvcGVyYXRpb25zIGZhaWxcbiAqIEV4dGVuZHMgcHVyZW5vdyBEZXBsb3ltZW50RXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZURlcGxveW1lbnRFcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX0RFUExPWU1FTlRfRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZURlcGxveW1lbnRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBbGlhcyBmb3IgUnVudGltZURlcGxveW1lbnRFcnJvciB0byBtYXRjaCBwdXJlbm93IHBhdHRlcm5zXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lRGVwbG95bWVudEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ0RlcGxveW1lbnRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIHZhbGlkYXRpb24gY2hlY2tzIGZhaWxcbiAqIEV4dGVuZHMgcHVyZW5vdyBWYWxpZGF0aW9uRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVZhbGlkYXRpb25FcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX1ZBTElEQVRJT05fRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZVZhbGlkYXRpb25FcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIHRlbXBsYXRlIHJlc29sdXRpb24gZmFpbHNcbiAqIFByb3ZpZGVzIGRldGFpbGVkIGNvbnRleHQgYWJvdXQgcGFja2FnZSByZXNvbHV0aW9uIGFuZCBzZWFyY2hlZCBwYXRoc1xuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVRlbXBsYXRlRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlTmFtZT86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29yZURpcj86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoZWRQYXRocz86IHN0cmluZ1tdLFxuICAgIHB1YmxpYyByZWFkb25seSBwYWNrYWdlQ29udGV4dD86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x1dGlvblN0cmF0ZWd5Pzogc3RyaW5nLFxuICAgIGhpbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsICdSVU5USU1FX1RFTVBMQVRFX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVUZW1wbGF0ZUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHJ1bnRpbWUgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBpbnZhbGlkXG4gKiBQcm92aWRlcyBkZXRhaWxlZCB2YWxpZGF0aW9uIGVycm9ycyBhbmQgdHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciBleHRlbmRzIFJ1bnRpbWVDbGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGVEaXI/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbGlkYXRpb25FcnJvcnM/OiBzdHJpbmdbXSxcbiAgICBoaW50Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9URU1QTEFURV9TVFJVQ1RVUkVfRVJST1InLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSAnUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRnJpZW5kbHkgZXJyb3IgZm9ybWF0dGVyIGZvciBydW50aW1lIHdvcmtzcGFjZVxuICogRm9sbG93cyBwdXJlbm93IEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIgcGF0dGVybiB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB7XG4gIC8qKlxuICAgKiBGb3JtYXQgZXJyb3IgYXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRFcnJvcihlcnJvcjogRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIZWFkZXIgd2l0aG91dCBlbW9qaVxuICAgIGxpbmVzLnB1c2goYEVycm9yOiAke2Vycm9yLm5hbWUgfHwgJ1J1bnRpbWVFcnJvcid9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBFcnJvciBtZXNzYWdlXG4gICAgbGluZXMucHVzaChgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lQ2xpRXJyb3IgJiYgZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gU3RhY2sgdHJhY2UgaW4gdmVyYm9zZSBtb2RlXG4gICAgaWYgKHZlcmJvc2UgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBTdGFjayBUcmFjZSAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB2YWxpZGF0aW9uIGVycm9yIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdFZhbGlkYXRpb25FcnJvcihcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnVmFsaWRhdGlvbiBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYEZpZWxkOiAke2ZpZWxkTmFtZX1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEZpZWxkIHZhbGlkYXRpb24gZmFpbGVkIGZvcjogJHtmaWVsZE5hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBWYWxpZGF0aW9uIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZGVwbG95bWVudCBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXREZXBsb3ltZW50RXJyb3IoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ0RlcGxveW1lbnQgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBTdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgbGluZXMucHVzaChgT3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIENoZWNrIEFXUyBjcmVkZW50aWFscyBhbmQgcGVybWlzc2lvbnMnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBWZXJpZnkgc3RhY2sgY29uZmlndXJhdGlvbicpO1xuICAgIGxpbmVzLnB1c2goJzMuIFJldmlldyBDbG91ZEZvcm1hdGlvbiBldmVudHMgaW4gQVdTIENvbnNvbGUnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBTdGFjayBuYW1lOiAke3N0YWNrTmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEZhaWxlZCBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgZGV0YWlsczogJHttZXNzYWdlfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBydW50aW1lIHRlbXBsYXRlIGVycm9yIHdpdGggZGV0YWlsZWQgY29udGV4dFxuICAgKi9cbiAgZm9ybWF0VGVtcGxhdGVFcnJvcihlcnJvcjogUnVudGltZVRlbXBsYXRlRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCdSdW50aW1lIFRlbXBsYXRlIEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIFRlbXBsYXRlIGNvbnRleHRcbiAgICBpZiAoZXJyb3IudGVtcGxhdGVOYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGBUZW1wbGF0ZTogJHtlcnJvci50ZW1wbGF0ZU5hbWV9YCk7XG4gICAgfVxuICAgIGlmIChlcnJvci5jb3JlRGlyKSB7XG4gICAgICBsaW5lcy5wdXNoKGBDb3JlIERpcmVjdG9yeTogJHtlcnJvci5jb3JlRGlyfWApO1xuICAgIH1cbiAgICBpZiAoZXJyb3IucGFja2FnZUNvbnRleHQpIHtcbiAgICAgIGxpbmVzLnB1c2goYFBhY2thZ2UgQ29udGV4dDogJHtlcnJvci5wYWNrYWdlQ29udGV4dH1gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLnJlc29sdXRpb25TdHJhdGVneSkge1xuICAgICAgbGluZXMucHVzaChgUmVzb2x1dGlvbiBTdHJhdGVneTogJHtlcnJvci5yZXNvbHV0aW9uU3RyYXRlZ3l9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gU2VhcmNoZWQgcGF0aHNcbiAgICBpZiAoZXJyb3Iuc2VhcmNoZWRQYXRocyAmJiBlcnJvci5zZWFyY2hlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJ1NlYXJjaGVkIFBhdGhzOicpO1xuICAgICAgZXJyb3Iuc2VhcmNoZWRQYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHtwYXRofWApO1xuICAgICAgfSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBUcm91Ymxlc2hvb3RpbmcgZ3VpZGFuY2VcbiAgICBsaW5lcy5wdXNoKCdUcm91Ymxlc2hvb3Rpbmc6Jyk7XG4gICAgbGluZXMucHVzaCgnMS4gRW5zdXJlIEB3b3JrdGlmL3J1bnRpbWUgcGFja2FnZSBpcyBwcm9wZXJseSBpbnN0YWxsZWQnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBWZXJpZnkgdGhlIHBhY2thZ2UgY29udGFpbnMgc3JjL2Jpbi90ZW1wbGF0ZXMvcnVudGltZS13ZWIvIGRpcmVjdG9yeScpO1xuICAgIGxpbmVzLnB1c2goJzMuIENoZWNrIHRoYXQgcnVudGltZS13ZWIgZGlyZWN0b3J5IGNvbnRhaW5zIHRlbXBsYXRlIHN1YmRpcmVjdG9yaWVzJyk7XG4gICAgbGluZXMucHVzaCgnNC4gSWYgcnVubmluZyBmcm9tIHNvdXJjZSwgZW5zdXJlIHlvdVxcJ3JlIGluIHRoZSBydW50aW1lIHBhY2thZ2UgZGlyZWN0b3J5Jyk7XG4gICAgbGluZXMucHVzaCgnNS4gVHJ5IHJlaW5zdGFsbGluZyB0aGUgcnVudGltZSBwYWNrYWdlOiBucG0gaW5zdGFsbCBAd29ya3RpZi9ydW50aW1lJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBIaW50IGlmIGF2YWlsYWJsZVxuICAgIGlmIChlcnJvci5oaW50KSB7XG4gICAgICBsaW5lcy5wdXNoKGBIaW50OiAke2Vycm9yLmhpbnR9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFRlY2huaWNhbCBEZXRhaWxzICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgY29kZTogJHtlcnJvci5jb2RlfWApO1xuICAgICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJ1N0YWNrIHRyYWNlOicpO1xuICAgICAgICBsaW5lcy5wdXNoKGVycm9yLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgcnVudGltZSB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgZXJyb3Igd2l0aCB2YWxpZGF0aW9uIGRldGFpbHNcbiAgICovXG4gIGZvcm1hdFRlbXBsYXRlU3RydWN0dXJlRXJyb3IoZXJyb3I6IFJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnUnVudGltZSBUZW1wbGF0ZSBTdHJ1Y3R1cmUgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKGVycm9yLnRlbXBsYXRlRGlyKSB7XG4gICAgICBsaW5lcy5wdXNoKGBUZW1wbGF0ZSBEaXJlY3Rvcnk6ICR7ZXJyb3IudGVtcGxhdGVEaXJ9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0aW9uIGVycm9yc1xuICAgIGlmIChlcnJvci52YWxpZGF0aW9uRXJyb3JzICYmIGVycm9yLnZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnVmFsaWRhdGlvbiBFcnJvcnM6Jyk7XG4gICAgICBlcnJvci52YWxpZGF0aW9uRXJyb3JzLmZvckVhY2godmFsaWRhdGlvbkVycm9yID0+IHtcbiAgICAgICAgbGluZXMucHVzaChgICAtICR7dmFsaWRhdGlvbkVycm9yfWApO1xuICAgICAgfSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBUcm91Ymxlc2hvb3RpbmcgZ3VpZGFuY2VcbiAgICBsaW5lcy5wdXNoKCdUcm91Ymxlc2hvb3Rpbmc6Jyk7XG4gICAgbGluZXMucHVzaCgnMS4gVmVyaWZ5IHRoZSBydW50aW1lIHBhY2thZ2UgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlJyk7XG4gICAgbGluZXMucHVzaCgnMi4gQ2hlY2sgdGhhdCBzcmMvYmluL3RlbXBsYXRlcy9ydW50aW1lLXdlYi8gZXhpc3RzIGluIHRoZSBwYWNrYWdlJyk7XG4gICAgbGluZXMucHVzaCgnMy4gRW5zdXJlIHRlbXBsYXRlIGRpcmVjdG9yaWVzIGNvbnRhaW4gdGhlIHJlcXVpcmVkIGZpbGVzJyk7XG4gICAgbGluZXMucHVzaCgnNC4gVHJ5IHJlaW5zdGFsbGluZzogbnBtIGluc3RhbGwgQHdvcmt0aWYvcnVudGltZScpO1xuICAgIGxpbmVzLnB1c2goJzUuIElmIGRldmVsb3BpbmcgbG9jYWxseSwgZW5zdXJlIHRlbXBsYXRlcyBhcmUgYnVpbHQgY29ycmVjdGx5Jyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBIaW50IGlmIGF2YWlsYWJsZVxuICAgIGlmIChlcnJvci5oaW50KSB7XG4gICAgICBsaW5lcy5wdXNoKGBIaW50OiAke2Vycm9yLmhpbnR9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFRlY2huaWNhbCBEZXRhaWxzICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgY29kZTogJHtlcnJvci5jb2RlfWApO1xuICAgICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJ1N0YWNrIHRyYWNlOicpO1xuICAgICAgICBsaW5lcy5wdXNoKGVycm9yLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nZ2VyIGZvciBydW50aW1lIHdvcmtzcGFjZVxuICogRm9sbG93cyBwdXJlbm93IGxvZ2dpbmcgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVN0cnVjdHVyZWRMb2dnZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsb2dFbnRyeSwgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ3dhcm4nLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihKU09OLnN0cmluZ2lmeShsb2dFbnRyeSwgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShsb2dFbnRyeSwgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZlcmJvc2UpIHJldHVybjtcblxuICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgbGV2ZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgY29uc29sZS5kZWJ1ZyhKU09OLnN0cmluZ2lmeShsb2dFbnRyeSwgbnVsbCwgMikpO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVGVtcGxhdGVTZXJ2aWNlIGFzIFB1cmVub3dUZW1wbGF0ZVNlcnZpY2UsIHR5cGUgU2NhZmZvbGRPcHRpb25zLCB0eXBlIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciB9IGZyb20gJ0BiaW4vdXRpbHMvZXJyb3JzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBjb21wYXRpYmlsaXR5XG5leHBvcnQgdHlwZSB7IFNjYWZmb2xkT3B0aW9ucywgVGVtcGxhdGVDb250ZXh0IH07XG5cbi8qKlxuICogUnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZSBzZXJ2aWNlIHRoYXQgZXh0ZW5kcyBwdXJlbm93J3MgVGVtcGxhdGVTZXJ2aWNlXG4gKiB0byByZXNvbHZlIHRlbXBsYXRlcyBmcm9tIHRoZSBydW50aW1lIHBhY2thZ2UncyBmaWxlIHN5c3RlbSBpbnN0ZWFkIG9mIHB1cmVub3cncy5cbiAqIFxuICogVGhpcyBzZXJ2aWNlIGFkZHJlc3NlcyB0aGUgaXNzdWUgd2hlcmUgYEB3b3JrdGlmL3J1bnRpbWUgaW5pdGAgd2FzIHVzaW5nXG4gKiBwdXJlbm93IHRlbXBsYXRlcyBpbnN0ZWFkIG9mIHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGVzLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVRlbXBsYXRlU2VydmljZSBleHRlbmRzIFB1cmVub3dUZW1wbGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWVUZW1wbGF0ZXNEaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuXG4gICAgLy8gUmVzb2x2ZSBydW50aW1lIHBhY2thZ2UgdGVtcGxhdGUgZGlyZWN0b3J5XG4gICAgdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyID0gdGhpcy5yZXNvbHZlUnVudGltZVRlbXBsYXRlRGlyZWN0b3J5KCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhZmZvbGQgYSBuZXcgcHJvamVjdCB1c2luZyBydW50aW1lLXNwZWNpZmljIHRlbXBsYXRlc1xuICAgKiBcbiAgICogT3ZlcnJpZGVzIHRoZSBwYXJlbnQgbWV0aG9kIHRvIHVzZSBydW50aW1lIHRlbXBsYXRlcyBmcm9tIHRoZVxuICAgKiBydW50aW1lIHBhY2thZ2UncyBmaWxlIHN5c3RlbSBpbnN0ZWFkIG9mIHB1cmVub3cgdGVtcGxhdGVzLlxuICAgKiBcbiAgICogSW1wbGVtZW50cyBjb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gYW5kIGZhbGxiYWNrIHN0cmF0ZWdpZXM6XG4gICAqIC0gVmFsaWRhdGVzIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmVmb3JlIHByb2NlZWRpbmdcbiAgICogLSBQcm92aWRlcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcyBmb3IgdHJvdWJsZXNob290aW5nXG4gICAqIC0gRW5zdXJlcyBydW50aW1lLXNwZWNpZmljIHRlbXBsYXRlIHJlc29sdXRpb25cbiAgICovXG4gIGFzeW5jIHNjYWZmb2xkKFxuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nLFxuICAgIHRhcmdldERpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNjYWZmb2xkT3B0aW9ucyxcbiAgICBjb3JlRGlyOiBzdHJpbmcgPSAncnVudGltZS13ZWInLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBWYWxpZGF0ZSBydW50aW1lIHRlbXBsYXRlcyBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGVUZW1wbGF0ZVN0cnVjdHVyZShjb3JlRGlyKTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcihcbiAgICAgICAgYFJ1bnRpbWUgdGVtcGxhdGUgZGlyZWN0b3J5IHZhbGlkYXRpb24gZmFpbGVkYCxcbiAgICAgICAgdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLFxuICAgICAgICB2YWxpZGF0aW9uLmVycm9ycyxcbiAgICAgICAgYEVuc3VyZSB0aGUgcnVudGltZSBwYWNrYWdlIGlzIHByb3Blcmx5IGluc3RhbGxlZCBhbmQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHRlbXBsYXRlIHN0cnVjdHVyZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMucnVudGltZVRlbXBsYXRlc0RpciwgY29yZURpciwgdGVtcGxhdGVOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIHRlbXBsYXRlIGV4aXN0cyBpbiBydW50aW1lIHBhY2thZ2VcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlVGVtcGxhdGVzID0gdGhpcy5nZXRBdmFpbGFibGVUZW1wbGF0ZXMoY29yZURpcik7XG4gICAgICBjb25zdCByZXNvbHV0aW9uSW5mbyA9IHRoaXMuZ2V0VGVtcGxhdGVSZXNvbHV0aW9uSW5mbygpO1xuXG4gICAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlRXJyb3IoXG4gICAgICAgIGBSdW50aW1lIHRlbXBsYXRlICcke3RlbXBsYXRlTmFtZX0nIG5vdCBmb3VuZGAsXG4gICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgY29yZURpcixcbiAgICAgICAgW3RlbXBsYXRlUGF0aF0sXG4gICAgICAgIHJlc29sdXRpb25JbmZvLnBhY2thZ2VDb250ZXh0IHx8ICd1bmtub3duJyxcbiAgICAgICAgcmVzb2x1dGlvbkluZm8ucmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgICBhdmFpbGFibGVUZW1wbGF0ZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYEF2YWlsYWJsZSB0ZW1wbGF0ZXM6ICR7YXZhaWxhYmxlVGVtcGxhdGVzLmpvaW4oJywgJyl9LiBUcnk6IHJ1bnRpbWUgaW5pdCA8cHJvamVjdC1uYW1lPiAtLXRlbXBsYXRlICR7YXZhaWxhYmxlVGVtcGxhdGVzWzBdfWBcbiAgICAgICAgICA6IGBObyB0ZW1wbGF0ZXMgZm91bmQgaW4gJyR7Y29yZURpcn0nLiBUaGUgcnVudGltZSBwYWNrYWdlIG1heSBub3QgYmUgcHJvcGVybHkgaW5zdGFsbGVkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGVtcGxhdGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eVxuICAgIGNvbnN0IHRlbXBsYXRlRmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0ZW1wbGF0ZVBhdGgpO1xuICAgIGlmICh0ZW1wbGF0ZUZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSB0aGlzLmdldFRlbXBsYXRlUmVzb2x1dGlvbkluZm8oKTtcblxuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVUZW1wbGF0ZUVycm9yKFxuICAgICAgICBgUnVudGltZSB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZU5hbWV9JyBkaXJlY3RvcnkgaXMgZW1wdHlgLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUsXG4gICAgICAgIGNvcmVEaXIsXG4gICAgICAgIFt0ZW1wbGF0ZVBhdGhdLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5wYWNrYWdlQ29udGV4dCB8fCAndW5rbm93bicsXG4gICAgICAgIHJlc29sdXRpb25JbmZvLnJlc29sdXRpb25TdHJhdGVneSxcbiAgICAgICAgYFRoaXMgaW5kaWNhdGVzIGEgY29ycnVwdGVkIG9yIGluY29tcGxldGUgdGVtcGxhdGUgaW5zdGFsbGF0aW9uLiBUcnkgcmVpbnN0YWxsaW5nIHRoZSBydW50aW1lIHBhY2thZ2UuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHBhcmVudCBjbGFzcyBsb2dpYyBidXQgd2l0aCBydW50aW1lIHRlbXBsYXRlIHBhdGhcbiAgICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSB0ZW1wbGF0ZXNEaXIgZm9yIHRoaXMgb3BlcmF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxUZW1wbGF0ZXNEaXIgPSAodGhpcyBhcyBhbnkpLnRlbXBsYXRlc0RpcjtcbiAgICAodGhpcyBhcyBhbnkpLnRlbXBsYXRlc0RpciA9IHRoaXMucnVudGltZVRlbXBsYXRlc0RpcjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBPdmVycmlkZSB0aGUgY29weVRlbXBsYXRlRmlsZXMgbWV0aG9kIHRvIGluY2x1ZGUgcnVudGltZS1zcGVjaWZpYyB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29weVRlbXBsYXRlRmlsZXMgPSAodGhpcyBhcyBhbnkpLmNvcHlUZW1wbGF0ZUZpbGVzO1xuICAgICAgKHRoaXMgYXMgYW55KS5jb3B5VGVtcGxhdGVGaWxlcyA9IGFzeW5jIChzb3VyY2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgY29udGV4dDogVGVtcGxhdGVDb250ZXh0KSA9PiB7XG4gICAgICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIHZhcmlhYmxlcyB0byB0aGUgY29udGV4dFxuICAgICAgICBjb25zdCBydW50aW1lQ29udGV4dCA9IHtcbiAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgIHBhY2thZ2VWZXJzaW9uOiB0aGlzLmdldFJ1bnRpbWVQYWNrYWdlVmVyc2lvbigpLFxuICAgICAgICAgIFBVUkVOT1dfVkVSU0lPTjogdGhpcy5nZXRSdW50aW1lUGFja2FnZVZlcnNpb24oKSxcbiAgICAgICAgICBTVEFDS19OQU1FOiBjb250ZXh0LnByb2plY3ROYW1lLFxuICAgICAgICAgIFBST0pFQ1RfTkFNRTogY29udGV4dC5wcm9qZWN0TmFtZSxcbiAgICAgICAgICBSRUdJT046ICd1cy1lYXN0LTEnLFxuICAgICAgICAgIEVOQUJMRV9TRU86ICdmYWxzZScsXG4gICAgICAgICAgU1RBR0U6ICdkZXYnLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxDb3B5VGVtcGxhdGVGaWxlcy5jYWxsKHRoaXMsIHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIHJ1bnRpbWVDb250ZXh0KTtcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHN1cGVyLnNjYWZmb2xkKHRlbXBsYXRlTmFtZSwgdGFyZ2V0RGlyLCBvcHRpb25zLCBjb3JlRGlyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0ZW1wbGF0ZXNEaXJcbiAgICAgICh0aGlzIGFzIGFueSkudGVtcGxhdGVzRGlyID0gb3JpZ2luYWxUZW1wbGF0ZXNEaXI7XG4gICAgfVxuICB9XG5cblxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBydW50aW1lIHBhY2thZ2UncyB0ZW1wbGF0ZSBkaXJlY3RvcnlcbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIGRldGVjdHMgdGhlIHJ1bnRpbWUgcGFja2FnZSBjb250ZXh0IGFuZCBmaW5kcyB0aGUgY29ycmVjdFxuICAgKiB0ZW1wbGF0ZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBydW50aW1lIHBhY2thZ2UncyBmaWxlIHN5c3RlbS5cbiAgICogXG4gICAqIEltcGxlbWVudHMgbXVsdGlwbGUgZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3Igcm9idXN0IHRlbXBsYXRlIHBhdGggZGV0ZWN0aW9uOlxuICAgKiAxLiBQYWNrYWdlLmpzb24gZGV0ZWN0aW9uIChtb3N0IHJlbGlhYmxlKVxuICAgKiAyLiBNb2R1bGUgbG9jYXRpb24tYmFzZWQgZGV0ZWN0aW9uXG4gICAqIDMuIE5vZGUuanMgbW9kdWxlIHJlc29sdXRpb25cbiAgICogNC4gRW52aXJvbm1lbnQtYmFzZWQgZGV0ZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVSdW50aW1lVGVtcGxhdGVEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWFyY2hQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWFyY2hSZXN1bHRzOiBBcnJheTx7IHBhdGg6IHN0cmluZzsgc3RyYXRlZ3k6IHN0cmluZzsgdmFsaWQ6IGJvb2xlYW4gfT4gPSBbXTtcblxuICAgIC8vIFN0cmF0ZWd5IDE6IFBhY2thZ2UuanNvbiBkZXRlY3Rpb24gKG1vc3QgcmVsaWFibGUpXG4gICAgY29uc3QgcGFja2FnZUJhc2VkUGF0aCA9IHRoaXMuZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk7XG4gICAgaWYgKHBhY2thZ2VCYXNlZFBhdGgpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlc1BhdGggPSBwYXRoLmpvaW4ocGFja2FnZUJhc2VkUGF0aCwgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJyk7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKHRlbXBsYXRlc1BhdGgpO1xuICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgcGF0aDogdGVtcGxhdGVzUGF0aCxcbiAgICAgICAgc3RyYXRlZ3k6ICdwYWNrYWdlLmpzb24gZGV0ZWN0aW9uJyxcbiAgICAgICAgdmFsaWQ6IHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeSh0ZW1wbGF0ZXNQYXRoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgMjogTW9kdWxlIGxvY2F0aW9uLWJhc2VkIGRldGVjdGlvblxuICAgIGNvbnN0IG1vZHVsZUJhc2VkUGF0aHMgPSB0aGlzLmdldE1vZHVsZUJhc2VkUGF0aHMoKTtcbiAgICBmb3IgKGNvbnN0IG1vZHVsZVBhdGggb2YgbW9kdWxlQmFzZWRQYXRocykge1xuICAgICAgc2VhcmNoUGF0aHMucHVzaChtb2R1bGVQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG1vZHVsZVBhdGgsXG4gICAgICAgIHN0cmF0ZWd5OiAnbW9kdWxlIGxvY2F0aW9uJyxcbiAgICAgICAgdmFsaWQ6IHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeShtb2R1bGVQYXRoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgMzogTm9kZS5qcyBtb2R1bGUgcmVzb2x1dGlvblxuICAgIGNvbnN0IG5vZGVNb2R1bGVQYXRocyA9IHRoaXMuZ2V0Tm9kZU1vZHVsZVBhdGhzKCk7XG4gICAgZm9yIChjb25zdCBub2RlTW9kdWxlUGF0aCBvZiBub2RlTW9kdWxlUGF0aHMpIHtcbiAgICAgIHNlYXJjaFBhdGhzLnB1c2gobm9kZU1vZHVsZVBhdGgpO1xuICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgcGF0aDogbm9kZU1vZHVsZVBhdGgsXG4gICAgICAgIHN0cmF0ZWd5OiAnbm9kZV9tb2R1bGVzIHJlc29sdXRpb24nLFxuICAgICAgICB2YWxpZDogdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KG5vZGVNb2R1bGVQYXRoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgNDogRW52aXJvbm1lbnQtYmFzZWQgZGV0ZWN0aW9uXG4gICAgY29uc3QgZW52QmFzZWRQYXRocyA9IHRoaXMuZ2V0RW52aXJvbm1lbnRCYXNlZFBhdGhzKCk7XG4gICAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudkJhc2VkUGF0aHMpIHtcbiAgICAgIHNlYXJjaFBhdGhzLnB1c2goZW52UGF0aCk7XG4gICAgICBzZWFyY2hSZXN1bHRzLnB1c2goe1xuICAgICAgICBwYXRoOiBlbnZQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ2Vudmlyb25tZW50IGRldGVjdGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkoZW52UGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHZhbGlkIHBhdGhcbiAgICBjb25zdCB2YWxpZFJlc3VsdCA9IHNlYXJjaFJlc3VsdHMuZmluZChyZXN1bHQgPT4gcmVzdWx0LnZhbGlkKTtcblxuICAgIGlmICh2YWxpZFJlc3VsdCkge1xuICAgICAgcmV0dXJuIHZhbGlkUmVzdWx0LnBhdGg7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdmFsaWQgcGF0aCBmb3VuZCwgcHJvdmlkZSBkZXRhaWxlZCBlcnJvciBpbmZvcm1hdGlvblxuICAgIGNvbnN0IHNlYXJjaGVkUGF0aHMgPSBzZWFyY2hSZXN1bHRzLm1hcChyZXN1bHQgPT4gcmVzdWx0LnBhdGgpO1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcblxuICAgIHRocm93IG5ldyBSdW50aW1lVGVtcGxhdGVFcnJvcihcbiAgICAgIGBSdW50aW1lIHRlbXBsYXRlcyBkaXJlY3Rvcnkgbm90IGZvdW5kYCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdydW50aW1lLXdlYicsXG4gICAgICBzZWFyY2hlZFBhdGhzLFxuICAgICAgcGFja2FnZVJvb3QgfHwgJ3Vua25vd24nLFxuICAgICAgJ2NvbXByZWhlbnNpdmUgc2VhcmNoJyxcbiAgICAgIGBFbnN1cmUgQHdvcmt0aWYvcnVudGltZSBwYWNrYWdlIGlzIHByb3Blcmx5IGluc3RhbGxlZCB3aXRoIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmVgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgcnVudGltZSBwYWNrYWdlIHJvb3QgYnkgc2VhcmNoaW5nIGZvciBwYWNrYWdlLmpzb24gd2l0aCBAd29ya3RpZi9ydW50aW1lXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBsZXQgY3VycmVudERpciA9IF9fZGlybmFtZTtcblxuICAgIC8vIFNlYXJjaCB1cCB0aGUgZGlyZWN0b3J5IHRyZWUgZm9yIHBhY2thZ2UuanNvblxuICAgIHdoaWxlIChjdXJyZW50RGlyICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudERpcikpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgIGlmIChwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdvcmt0aWYvcnVudGltZScpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBDb250aW51ZSBzZWFyY2hpbmcgaWYgSlNPTiBwYXJzZSBmYWlsc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHRlbXBsYXRlIHBhdGhzIGJhc2VkIG9uIG1vZHVsZSBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNb2R1bGVCYXNlZFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gaW5zdGFsbGVkIHJ1bnRpbWUgcGFja2FnZVxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gc291cmNlIGR1cmluZyBkZXZlbG9wbWVudFxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gQWx0ZXJuYXRpdmU6IHJlbGF0aXZlIHRvIHRoZSBydW50aW1lIHBhY2thZ2Ugcm9vdFxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIEJ1bmRsZWQgbG9jYXRpb25cbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHRlbXBsYXRlIHBhdGhzIGZyb20gbm9kZV9tb2R1bGVzIHJlc29sdXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Tm9kZU1vZHVsZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gcmVzb2x2ZSBAd29ya3RpZi9ydW50aW1lIHBhY2thZ2VcbiAgICAgIGNvbnN0IHJ1bnRpbWVQYWNrYWdlUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHdvcmt0aWYvcnVudGltZS9wYWNrYWdlLmpzb24nKTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVSb290ID0gcGF0aC5kaXJuYW1lKHJ1bnRpbWVQYWNrYWdlUGF0aCk7XG4gICAgICBwYXRocy5wdXNoKHBhdGguam9pbihydW50aW1lUm9vdCwgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJykpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocnVudGltZVJvb3QsICdvdXQnLCAnZGlzdCcsICdiaW4nLCAndGVtcGxhdGVzJykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBQYWNrYWdlIG5vdCBmb3VuZCBpbiBub2RlX21vZHVsZXMsIGNvbnRpbnVlIHdpdGggb3RoZXIgc3RyYXRlZ2llc1xuICAgIH1cblxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zc2libGUgdGVtcGxhdGUgcGF0aHMgYmFzZWQgb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0RW52aXJvbm1lbnRCYXNlZFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGlmIHJ1bm5pbmcgZnJvbSBDTEkgYmluYXJ5XG4gICAgaWYgKHByb2Nlc3MuYXJndlsxXSkge1xuICAgICAgY29uc3QgY2xpUGF0aCA9IHBhdGguZGlybmFtZShwcm9jZXNzLmFyZ3ZbMV0pO1xuICAgICAgcGF0aHMucHVzaChwYXRoLmpvaW4oY2xpUGF0aCwgJ3RlbXBsYXRlcycpKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKGNsaVBhdGgsICcuLicsICd0ZW1wbGF0ZXMnKSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcbiAgICBwYXRocy5wdXNoKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzJywgJ0B3b3JrdGlmJywgJ3J1bnRpbWUnLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSk7XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIHRlbXBsYXRlIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZXhwZWN0ZWQgc3RydWN0dXJlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmModGVtcGxhdGVQYXRoKTtcbiAgICAgIGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcnVudGltZS13ZWIgc3ViZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgcnVudGltZVdlYlBhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAncnVudGltZS13ZWInKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhydW50aW1lV2ViUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBydW50aW1lLXdlYiBjb250YWlucyB0ZW1wbGF0ZSBkaXJlY3Rvcmllc1xuICAgICAgY29uc3QgcnVudGltZVdlYlN0YXQgPSBmcy5zdGF0U3luYyhydW50aW1lV2ViUGF0aCk7XG4gICAgICBpZiAoIXJ1bnRpbWVXZWJTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgcnVudGltZS13ZWIgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlbXBsYXRlXG4gICAgICBjb25zdCB0ZW1wbGF0ZURpcnMgPSBmcy5yZWFkZGlyU3luYyhydW50aW1lV2ViUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcblxuICAgICAgcmV0dXJuIHRlbXBsYXRlRGlycy5sZW5ndGggPiAwO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuXG4gIC8qKlxuICAgKiBHZXQgYXZhaWxhYmxlIHRlbXBsYXRlcyBpbiB0aGUgc3BlY2lmaWVkIGNvcmUgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIGdldEF2YWlsYWJsZVRlbXBsYXRlcyhjb3JlRGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvcmVQYXRoID0gcGF0aC5qb2luKHRoaXMucnVudGltZVRlbXBsYXRlc0RpciwgY29yZURpcik7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29yZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKGNvcmVQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5Lm5hbWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW50aW1lIHRlbXBsYXRlcyBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyB2YWxpZFxuICAgKiBcbiAgICogUGVyZm9ybXMgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlOlxuICAgKiAtIFZlcmlmaWVzIGRpcmVjdG9yeSBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGVcbiAgICogLSBWYWxpZGF0ZXMgcnVudGltZS13ZWIgc3ViZGlyZWN0b3J5IGV4aXN0c1xuICAgKiAtIENoZWNrcyB0aGF0IHRlbXBsYXRlcyBjb250YWluIHJlcXVpcmVkIGZpbGVzXG4gICAqIC0gVmFsaWRhdGVzIHRlbXBsYXRlIHN0cnVjdHVyZSBpbnRlZ3JpdHlcbiAgICovXG4gIHZhbGlkYXRlUnVudGltZVRlbXBsYXRlcygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeSh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhIHNwZWNpZmljIGNvcmUgZGlyZWN0b3J5XG4gICAqL1xuICB2YWxpZGF0ZVRlbXBsYXRlU3RydWN0dXJlKGNvcmVEaXI6IHN0cmluZyA9ICdydW50aW1lLXdlYicpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiBtYWluIHRlbXBsYXRlcyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyKSkge1xuICAgICAgICBlcnJvcnMucHVzaChgVGVtcGxhdGVzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJHt0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXJ9YCk7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGNvcmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgY29yZVBhdGggPSBwYXRoLmpvaW4odGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLCBjb3JlRGlyKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb3JlUGF0aCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYENvcmUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2NvcmVQYXRofWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBjb3JlIGRpcmVjdG9yeSBpcyBhY3R1YWxseSBhIGRpcmVjdG9yeVxuICAgICAgY29uc3QgY29yZVN0YXQgPSBmcy5zdGF0U3luYyhjb3JlUGF0aCk7XG4gICAgICBpZiAoIWNvcmVTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYENvcmUgcGF0aCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7Y29yZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhdmFpbGFibGUgdGVtcGxhdGVzXG4gICAgICBjb25zdCB0ZW1wbGF0ZURpcnMgPSBmcy5yZWFkZGlyU3luYyhjb3JlUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcblxuICAgICAgaWYgKHRlbXBsYXRlRGlycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYE5vIHRlbXBsYXRlIGRpcmVjdG9yaWVzIGZvdW5kIGluOiAke2NvcmVQYXRofWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBlYWNoIHRlbXBsYXRlIGRpcmVjdG9yeVxuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZURpciBvZiB0ZW1wbGF0ZURpcnMpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKGNvcmVQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0ZW1wbGF0ZVBhdGgpO1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZUZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBUZW1wbGF0ZSBkaXJlY3RvcnkgaXMgZW1wdHk6ICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goYFZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByZXNvbHZlZCBydW50aW1lIHRlbXBsYXRlcyBkaXJlY3RvcnkgcGF0aFxuICAgKi9cbiAgZ2V0UnVudGltZVRlbXBsYXRlc0RpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBydW50aW1lIHBhY2thZ2UgdmVyc2lvbiBmb3IgdGVtcGxhdGUgc3Vic3RpdHV0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldFJ1bnRpbWVQYWNrYWdlVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IHZlcnNpb24gZnJvbSBydW50aW1lIHBhY2thZ2UuanNvblxuICAgICAgY29uc3QgcGFja2FnZVJvb3QgPSB0aGlzLmRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpO1xuICAgICAgaWYgKHBhY2thZ2VSb290KSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlUm9vdCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbiB8fCAnMC4zLjAnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZhbGxiYWNrOiB0cnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcnVudGltZVBhY2thZ2VQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya3RpZi9ydW50aW1lL3BhY2thZ2UuanNvbicpO1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHJ1bnRpbWVQYWNrYWdlUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbiB8fCAnMC4zLjAnO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZpbmFsIGZhbGxiYWNrXG4gICAgICAgIHJldHVybiAnMC4zLjAnO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICcwLjMuMCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0ZW1wbGF0ZSByZXNvbHV0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICovXG4gIGdldFRlbXBsYXRlUmVzb2x1dGlvbkluZm8oKToge1xuICAgIHJ1bnRpbWVUZW1wbGF0ZXNEaXI6IHN0cmluZztcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGF2YWlsYWJsZUNvcmVzOiBzdHJpbmdbXTtcbiAgICBwYWNrYWdlQ29udGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICByZXNvbHV0aW9uU3RyYXRlZ3k6IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSB0aGlzLmRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHJlc29sdXRpb24gc3RyYXRlZ3kgd2FzIHVzZWRcbiAgICBsZXQgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ3Vua25vd24nO1xuICAgIGlmIChwYWNrYWdlUm9vdCAmJiB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIuaW5jbHVkZXMocGFja2FnZVJvb3QpKSB7XG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3kgPSAncGFja2FnZS5qc29uIGRldGVjdGlvbic7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSB7XG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3kgPSAnbm9kZV9tb2R1bGVzIHJlc29sdXRpb24nO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLmluY2x1ZGVzKF9fZGlybmFtZSkpIHtcbiAgICAgIHJlc29sdXRpb25TdHJhdGVneSA9ICdtb2R1bGUgbG9jYXRpb24nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3kgPSAnZW52aXJvbm1lbnQgZGV0ZWN0aW9uJztcbiAgICB9XG5cbiAgICAvLyBHZXQgYXZhaWxhYmxlIGNvcmUgZGlyZWN0b3JpZXNcbiAgICBjb25zdCBhdmFpbGFibGVDb3Jlczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyKSkge1xuICAgICAgICBhdmFpbGFibGVDb3Jlcy5wdXNoKC4uLmZzLnJlYWRkaXJTeW5jKHRoaXMucnVudGltZVRlbXBsYXRlc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyB3aGVuIHJlYWRpbmcgZGlyZWN0b3J5XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVUZW1wbGF0ZXNEaXI6IHRoaXMucnVudGltZVRlbXBsYXRlc0RpcixcbiAgICAgIGlzVmFsaWQ6IHRoaXMudmFsaWRhdGVSdW50aW1lVGVtcGxhdGVzKCksXG4gICAgICBhdmFpbGFibGVDb3JlcyxcbiAgICAgIHBhY2thZ2VDb250ZXh0OiBwYWNrYWdlUm9vdCxcbiAgICAgIHJlc29sdXRpb25TdHJhdGVneSxcbiAgICB9O1xuICB9XG59XG5cbi8vIEV4cG9ydCBhcyBUZW1wbGF0ZVNlcnZpY2UgZm9yIGNvbXBhdGliaWxpdHlcbmV4cG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH07XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIFNhbml0aXplcyBhIHN0YWNrIG5hbWUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEFXUyBDbG91ZEZvcm1hdGlvbiBuYW1pbmcgcmVxdWlyZW1lbnRzLlxuICogXG4gKiBDbG91ZEZvcm1hdGlvbiBzdGFjayBuYW1lcyBtdXN0OlxuICogLSBCZSAxLTEyOCBjaGFyYWN0ZXJzIGxvbmdcbiAqIC0gQ29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBoeXBoZW5zXG4gKiAtIFN0YXJ0IHdpdGggYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXJcbiAqIC0gTm90IGVuZCB3aXRoIGEgaHlwaGVuXG4gKiBcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHN0YWNrIG5hbWUgdG8gc2FuaXRpemVcbiAqIEByZXR1cm5zIFRoZSBzYW5pdGl6ZWQgc3RhY2sgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVTdGFja05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGggaHlwaGVuc1xuICAgIGxldCBzYW5pdGl6ZWQgPSBuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05LV0vZywgJy0nKTtcblxuICAgIC8vIEVuc3VyZSBpdCBzdGFydHMgd2l0aCBhIGxldHRlclxuICAgIGlmICghL15bYS16QS1aXS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgICAgIHNhbml0aXplZCA9ICdzdGFjay0nICsgc2FuaXRpemVkO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UoLy0rL2csICctJyk7XG5cbiAgICAvLyBSZW1vdmUgdHJhaWxpbmcgaHlwaGVuc1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5yZXBsYWNlKC8tKyQvLCAnJyk7XG5cbiAgICAvLyBFbnN1cmUgaXQncyBub3QgdG9vIGxvbmcgKENsb3VkRm9ybWF0aW9uIGxpbWl0IGlzIDEyOCBjaGFyYWN0ZXJzKVxuICAgIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gMTI4KSB7XG4gICAgICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgMTI4KS5yZXBsYWNlKC8tKyQvLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGl0J3Mgbm90IGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICAgIHNhbml0aXplZCA9ICdzdGFjayc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbn0iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMsIFB1cmVub3dJbmZyYVJlc291cmNlcyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvaW5mcmEnO1xuaW1wb3J0IHsgc2FuaXRpemVTdGFja05hbWUgfSBmcm9tICdAdXRpbHMvc3RhY2stbmFtZS1zYW5pdGl6ZXInO1xuaW1wb3J0IHtcbiAgRGVwbG95bWVudEVycm9yLFxuICB0eXBlIERlcGxveW1lbnRPdXRwdXRzLFxuICBnZXRTdGFnZSxcbiAgU3RhY2tzRGVwbG95T3B0aW9ucywgU3RhY2tzRGVwbG95UmVzdWx0LFxuICBTdGFja3NEZXBsb3lTZXJ2aWNlLFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzLCBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCB9IGZyb20gJy4vcHVyZW5vdy1ydW50aW1lLXN0YWNrcy1kZXBsb3kuc2VydmljZS50eXBlcyc7XG5cblxuZXhwb3J0IGNsYXNzIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSBleHRlbmRzIFN0YWNrc0RlcGxveVNlcnZpY2UgaW1wbGVtZW50cyBQdXJlbm93SW5mcmFSZXNvdXJjZXMge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9DREtfRElSID0gJ2Nkayc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVHdvU3RhY2tEZXBsb3lTZXJ2aWNlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY3dkIC0gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAocHJvamVjdCByb290KVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSkge1xuICAgIHN1cGVyKGN3ZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgZmlyc3QgZGVwbG95bWVudCB3b3JrZmxvdzogZGVwbG95IEluZnJhIFx1MjE5MiByZWFkIG91dHB1dHMgXHUyMTkyIGRlcGxveSBSdW50aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIERlcGxveW1lbnQgb3B0aW9uc1xuICAgKiBAcGFyYW0gc3RhcnRUaW1lIC0gRGVwbG95bWVudCBzdGFydCB0aW1lc3RhbXBcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGRlcGxveW1lbnQgcmVzdWx0XG4gICAqIEB0aHJvd3Mge0RlcGxveW1lbnRFcnJvcn0gSWYgSW5mcmEgb3IgUnVudGltZSBkZXBsb3ltZW50IGZhaWxzXG4gICAqXG4gICAqIEB0b2RvOiBjb21wbGV0ZSBleHRlbnNpYmxlIGRlcGxveW1lbnQgYXBwcm9hY2ggd2l0aCBkdXJhdGlvbiBtZXRyaWMgYXR0ZW5kYW5jZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVEZXBsb3k8VCBleHRlbmRzIFN0YWNrc0RlcGxveVJlc3VsdCA9IFN0YWNrc0RlcGxveVJlc3VsdD4oXG4gICAgb3B0aW9uczogU3RhY2tzRGVwbG95T3B0aW9ucyxcbiAgICBzdGFydFRpbWU6IG51bWJlcixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgeyBzdGFnZSwgY29uZmlnIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gU2FuaXRpemUgc3RhY2sgbmFtZXMgZm9yIEFXUyBDbG91ZEZvcm1hdGlvbiBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgaW5mcmFTdGFja05hbWUgPSBzYW5pdGl6ZVN0YWNrTmFtZShgJHtvcHRpb25zLmNvbmZpZy5wcm9qZWN0TmFtZX0tUHVyZW5vd0luZnJhLSR7c3RhZ2V9YCk7XG4gICAgY29uc3QgcnVudGltZVN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1QdXJlbm93UnVudGltZS0ke3N0YWdlfWApO1xuICAgIGNvbnN0IHJ1bnRpbWVXZWJTdGFja05hbWUgPSBzYW5pdGl6ZVN0YWNrTmFtZShgJHtvcHRpb25zLmNvbmZpZy5wcm9qZWN0TmFtZX0tUnVudGltZVdlYi0ke3N0YWdlfWApO1xuXG4gICAgY29uc3Qgc3RhZ2VDb25maWcgPSBnZXRTdGFnZShjb25maWcsIHN0YWdlKTtcbiAgICBpZiAoIXN0YWdlQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICBgU3RhZ2UgJyR7c3RhZ2V9JyBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbmAsXG4gICAgICAgIGBBdmFpbGFibGUgc3RhZ2VzOiAke2NvbmZpZy5zdGFnZXMubWFwKChzOiBhbnkpID0+IHMubmFtZSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdCBjbG91ZEZvcm1hdGlvbkNsaWVudCA9IG5ldyBDbG91ZEZvcm1hdGlvbkNsaWVudCh7XG4gICAgLy8gICByZWdpb246IHN0YWdlQ29uZmlnLmF3c1JlZ2lvbixcbiAgICAvLyB9KTtcblxuICAgIC8vIFN0ZXAgMTogRGVwbG95IEluZnJhIHN0YWNrXG4gICAgY29uc29sZS5sb2coJ0RlcGxveWluZyBJbmZyYXN0cnVjdHVyZSBzdGFjay4uLicpO1xuICAgIGNvbnN0IGluZnJhUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lDZGtTdGFjayhcbiAgICAgIGluZnJhU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghaW5mcmFSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgJ0luZnJhc3RydWN0dXJlIGRlcGxveW1lbnQgZmFpbGVkJyxcbiAgICAgICAgJ1J1bnRpbWUgc3RhY2sgd2lsbCBub3QgYmUgZGVwbG95ZWQuIEZpeCBJbmZyYSBpc3N1ZXMgYW5kIHJldHJ5LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogUmVhZCBJbmZyYSBvdXRwdXRzXG4gICAgLy8gY29uc29sZS5sb2coJ1JlYWRpbmcgSW5mcmFzdHJ1Y3R1cmUgb3V0cHV0cy4uLicpO1xuICAgIC8vIGNvbnN0IGluZnJhT3V0cHV0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mcmFPdXRwdXRzKGNsb3VkRm9ybWF0aW9uQ2xpZW50LCBzdGFnZSwgY29uZmlnLCBpbmZyYVN0YWNrTmFtZSwgc3RhZ2VDb25maWc/LmF3c1Byb2ZpbGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKGBSZXRyaWV2ZWQgJHtPYmplY3Qua2V5cyhpbmZyYU91dHB1dHMpLmxlbmd0aH0gb3V0cHV0cyBmcm9tIEluZnJhc3RydWN0dXJlIHN0YWNrYCk7XG5cbiAgICAvLyBTdGVwIDM6IERlcGxveSBSdW50aW1lIHN0YWNrXG4gICAgY29uc29sZS5sb2coJ0RlcGxveWluZyBQdXJlbm93UnVudGltZSBzdGFjay4uLicpO1xuICAgIGNvbnN0IHJ1bnRpbWVSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgcnVudGltZVN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIXJ1bnRpbWVSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgJ1J1bnRpbWUgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgaXMgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5LiBGaXggUnVudGltZSBpc3N1ZXMgYW5kIHJldHJ5LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRGVwbG95IFJ1bnRpbWUgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIFJ1bnRpbWVXZWIgc3RhY2suLi4nKTtcbiAgICBjb25zdCBydW50aW1lV2ViUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lDZGtTdGFjayhcbiAgICAgIHJ1bnRpbWVXZWJTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFydW50aW1lV2ViUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdSdW50aW1lV2ViIGRlcGxveW1lbnQgZmFpbGVkJyxcbiAgICAgICAgJ0luZnJhc3RydWN0dXJlIGlzIGRlcGxveWVkIHN1Y2Nlc3NmdWxseS4gRml4IFJ1bnRpbWUgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGluZnJhU3RhY2s6IGluZnJhUmVzdWx0LFxuICAgICAgcnVudGltZVN0YWNrOiBydW50aW1lUmVzdWx0LFxuICAgICAgcnVudGltZVdlYlN0YWNrOiBydW50aW1lV2ViUmVzdWx0LFxuICAgICAgZHVyYXRpb24sXG4gICAgfSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGRlcGxveW1lbnQgb3V0cHV0cyBmcm9tIENESyBvdXRwdXRzIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBzdGFja05hbWUgLSBOYW1lIG9mIHRoZSBDbG91ZEZvcm1hdGlvbiBzdGFja1xuICAgKiBAcmV0dXJucyBEZXBsb3ltZW50IG91dHB1dHMgbWFwXG4gICAqXG4gICAqIEBpbXBvcnRhbnQ6IE9QVElNSVNFIFRISVMgU09MVVRJT05cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIG91dHB1dHNQYXRoXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VTdGFja091dHB1dHMoc3RhY2tOYW1lOiBzdHJpbmcsIG91dHB1dHNQYXRoOiBzdHJpbmcpOiBEZXBsb3ltZW50T3V0cHV0cyB7XG4gICAgY29uc3Qgb3V0cHV0czogUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cyA9IHN1cGVyLnBhcnNlU3RhY2tPdXRwdXRzKHN0YWNrTmFtZSwgb3V0cHV0c1BhdGgpIGFzIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHM7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0c1BhdGgpKSB7XG4gICAgICByZXR1cm4gb3V0cHV0cztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0c0ZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG91dHB1dHNQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGNka091dHB1dHMgPSBKU09OLnBhcnNlKG91dHB1dHNGaWxlQ29udGVudCk7XG5cbiAgICAgIC8vIENESyBvdXRwdXRzIGZpbGUgc3RydWN0dXJlOiB7IFwiU3RhY2tOYW1lXCI6IHsgXCJPdXRwdXRLZXlcIjogXCJPdXRwdXRWYWx1ZVwiIH0gfVxuICAgICAgY29uc3Qgc3RhY2tPdXRwdXRzID0gY2RrT3V0cHV0c1tzdGFja05hbWVdO1xuICAgICAgaWYgKHN0YWNrT3V0cHV0cykge1xuICAgICAgICBvdXRwdXRzLmxhbWJkYUFybkxpc3QgPSBPYmplY3Qua2V5cyhzdGFja091dHB1dHMpXG4gICAgICAgICAgLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+IGtleS5tYXRjaCgvKD86TGFtYmRhKVthLXpBLVpdK0FybiQvKSlcbiAgICAgICAgICAubWFwKChsYW1iZGFNYXRjaDogYW55KSA9PiBzdGFja091dHB1dHNbbGFtYmRhTWF0Y2hdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcGFyc2Ugb3V0cHV0cyBmaWxlIGZvciAke3N0YWNrTmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXRzO1xuICB9XG5cblxuICAvLyBAbm90ZTogZHVwbGljYXRlc1xuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2lnbmF0dXJlIGZvciB0aGUgcHJvdmlkZWQgcmVnaW9uIGJ5IGV4dHJhY3RpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBlYWNoIHNlZ21lbnQgaW4gdGhlIHJlZ2lvbiBzdHJpbmcsIGRlbGltaXRlZCBieSBoeXBoZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaW9uIC0gVGhlIHJlZ2lvbiBzdHJpbmcgdG8gZ2VuZXJhdGUgdGhlIHNpZ25hdHVyZSBmcm9tLiBJdCBpcyBleHBlY3RlZCB0byBiZSBhIGh5cGhlbi1zZXBhcmF0ZWQgc3RyaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgcmVnaW9uIHNpZ25hdHVyZSwgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBlYWNoIHZhbGlkIHNlZ21lbnQuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkIG9yIGVtcHR5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFJlZ2lvblNpZ25hdHVyZShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWdpb24pIHJldHVybiAnJztcblxuICAgIHJldHVybiByZWdpb25cbiAgICAgIC5zcGxpdCgnLScpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHBhcnQgPT4gcGFydFswXSA/PyAnJylcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXNvdXJjZSBuYW1lIGJ5IGNvbmNhdGVuYXRpbmcgc2VydmljZSBuYW1lLCByZXNvdXJjZSBuYW1lLFxuICAgKiBzaW1wbGlmaWVkIHJlZ2lvbiwgYW5kIHN0YWdlIHdpdGggaHlwaGVucyBhcyBzZXBhcmF0b3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zZXJ2aWNlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVnaW9uU2ltcGxpZmllZCAtIFRoZSBzaW1wbGlmaWVkIHJlZ2lvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnN0YWdlIC0gVGhlIGRlcGxveW1lbnQgc3RhZ2Ugb2YgdGhlIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29uY2F0ZW5hdGVkIHJlc291cmNlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VOYW1lKHsgbmFtZSwgc2VydmljZU5hbWUsIHN0YWdlLCByZWdpb24gfTogUHVyZW5vd0luZnJhUmVzb3VyY2VPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdpb25TaW1wbGlmaWVkID0gc2FuaXRpemVTdGFja05hbWUodGhpcy5nZXRSZWdpb25TaWduYXR1cmUocmVnaW9uIHx8ICd1cy1lYXN0LTEnKSk7XG4gICAgcmV0dXJuIGAke3NlcnZpY2VOYW1lfS0ke25hbWV9LSR7cmVnaW9uU2ltcGxpZmllZH0tJHtzdGFnZX1gO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gY29uc3QgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIEJvb3RzdHJhcENyZWRlbnRpYWxzRXJyb3IsXG4gIEJvb3RzdHJhcFJlZ2lvbkVycm9yLFxuICBCdWlsZEVycm9yLFxuICBCdWlsZFNlcnZpY2UsXG4gIGJ1aWxkU3RhdGljSHRtbCxcbiAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgQ29tbWFuZFJlc3VsdCxcbiAgRGVwbG95bWVudEVycm9yLFxuICBEZXBsb3ltZW50U2VydmljZSxcbiAgRGVwbG95T3B0aW9ucyxcbiAgRGVwbG95U2VydmljZSxcbiAgZGV0ZWN0QW5kVmFsaWRhdGVDcmVkZW50aWFscyxcbiAgRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gIEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIGdldFN0YWdlLFxuICBMb2dnZXIsXG4gIFN0YWNrc0RlcGxveVNlcnZpY2UsXG59IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dDbGlDb25maWcgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3V0aWxzJztcblxuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICdAYmluL3NlcnZpY2VzJztcblxuXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIGV4dGVuZHMgRGVwbG95bWVudFNlcnZpY2Uge1xuICAvKipcbiAgICogRGVwbG95IGFwcGxpY2F0aW9uIHRvIEFXU1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveUNvbW1hbmQoXG4gICAgc3RhY2tzRGVwbG95U2VydmljZTogU3RhY2tzRGVwbG95U2VydmljZSxcbiAgICBvcHRpb25zOiBEZXBsb3lPcHRpb25zLFxuICAgIGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBBV1MgY3JlZGVudGlhbHMgZWFybHkgaWYgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgICBpZiAoZW52VmFsaWRhdG9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICAgIGlmIChjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JGb3JtYXR0ZXIgPSBuZXcgRnJpZW5kbHlFcnJvckZvcm1hdHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yRm9ybWF0dGVyLmZvcm1hdE1pc3NpbmdDcmVkZW50aWFsc0Vycm9yKFsnQVdTX0FDQ0VTU19LRVlfSUQnLCAnQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZJ10sIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0b2RvOiBzZXQgc3RhZ2Ugb3JkZXIgZGV0ZWN0b3IgdG8gZG9jdW1lbnRhdGlvbiBSRUFETUUubWQgdG8ga25vd1xuICAgICAgLy8gICAgICAgIENMSSBzdGFnZSBcdTIwMTM+IGVudiBTVEFHRSBcdTIwMTM+IGNvbmZpZy5zdGFnZVswXSBcdTIwMTM+IGRldiAoZGVmYXVsdClcbiAgICAgIC8vICAgXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXG4gICAgICAvLyBEZXRlcm1pbmUgc3RhZ2VcbiAgICAgIGNvbnN0IHN0YWdlID0gb3B0aW9ucy5zdGFnZSB8fCBwcm9jZXNzLmVudi5TVEFHRSB8fCBjb25maWcuc3RhZ2VzWzBdPy5uYW1lIHx8ICdkZXYnO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzdGFnZSBleGlzdHMgaW4gY29uZmlndXJhdGlvblxuICAgICAgY29uc3Qgc3RhZ2VDb25maWcgPSBnZXRTdGFnZShjb25maWcsIHN0YWdlKTtcbiAgICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgICBgU3RhZ2UgJyR7c3RhZ2V9JyBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyl9XFxuYCArXG4gICAgICAgICAgYFVwZGF0ZSB5b3VyIHB1cmVub3cuY29uZmlnLnRzIHRvIGFkZCB0aGlzIHN0YWdlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhjaGFsay5ib2xkKGBEZXBsb3lpbmcgdG8gQVdTIChzdGFnZTogJHtjaGFsay5jeWFuKHN0YWdlKX0pLi4uYCkpO1xuICAgICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgICAvLyBJbml0aWFsaXplIHNlcnZpY2VzXG4gICAgICBjb25zdCBkZXBsb3lTZXJ2aWNlID0gbmV3IERlcGxveVNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNlcnZpY2UgPSBuZXcgQ2RrQm9vdHN0cmFwU2VydmljZShsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDE6IERldGVjdCBhbmQgdmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IGRldGVjdEFuZFZhbGlkYXRlQ3JlZGVudGlhbHMobG9nZ2VyKTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHN0YWdlQ29uZmlnLmF3c1JlZ2lvbiA/PyBjcmVkZW50aWFscy5yZWdpb24gPz8gJ3VzLWVhc3QtMSc7XG5cbiAgICAgIC8vIFN0ZXAgMjogVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIHdpdGggU1RTXG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ3JlZGVudGlhbHMoZGVwbG95U2VydmljZSwgc3RhZ2VDb25maWcsIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMzogRW5zdXJlIENESyBlbnZpcm9ubWVudCBpcyBib290c3RyYXBwZWRcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQm9vdHN0cmFwcGVkKGJvb3RzdHJhcFNlcnZpY2UsIGNvbmZpZywgc3RhZ2VDb25maWcsIGNyZWRlbnRpYWxzLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgNDogUHJlLWRlcGxveW1lbnQgdmFsaWRhdGlvblxuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtUHJlRGVwbG95bWVudFZhbGlkYXRpb24oc3RhZ2UsIGNvbmZpZywgb3B0aW9ucywgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDU6IEV4ZWN1dGUgdHdvLXN0YWNrIGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdDogUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFja3NEZXBsb3ltZW50PFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBvcHRpb25zLnNraXBCdWlsZCxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NlLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RlcCA2OiBDbGVhciBTMyBjYWNoZSBpZiBlbmFibGVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyUzNDYWNoZURlcGxveW1lbnQocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDc6IFVwbG9hZCBSZWFjdCBCdWlsZCB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRSZWFjdEJ1bmRsZShyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA4OiBVcGxvYWQgcHVibGljIGFzc2V0cyB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRQdWJsaWNBc3NldHMocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgOTogSW52YWxpZGF0ZSBDbG91ZEZyb250IGNhY2hlXG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250Q2FjaGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMTA6IEluamVjdCBBUEkgR2F0ZXdheSBVUkwgaW50byAuZW52IGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuaW5qZWN0QXBpR2F0ZXdheVVybChyZXN1bHQucnVudGltZVdlYlN0YWNrLCBjb25maWcsIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCAxMTogRGlzcGxheSBkZXBsb3ltZW50IHN1bW1hcnlcbiAgICAgIHRoaXMuZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KHJlc3VsdCwgbG9nZ2VyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZXBsb3ltZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCb290c3RyYXBDcmVkZW50aWFsc0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgQm9vdHN0cmFwUmVnaW9uRXJyb3IpIHtcbiAgICAgICAgLy8gQm9vdHN0cmFwIGNyZWRlbnRpYWwvcmVnaW9uIGVycm9ycyBhbHJlYWR5IGxvZ2dlZCBpbiBkZXRlY3RBbmRWYWxpZGF0ZUNyZWRlbnRpYWxzXG4gICAgICAgIC8vIEp1c3QgcmV0dXJuIHdpdGggZXhpdCBjb2RlIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdHdvLXN0YWNrIGRlcGxveW1lbnQgc3VtbWFyeSB3aXRoIG91dHB1dHMgZnJvbSBib3RoIEluZnJhIGFuZCBSdW50aW1lIHN0YWNrc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShcbiAgICByZXN1bHQ6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApOiB2b2lkIHtcbiAgICAvLyBAbm90ZTogZGlzcGxheSBhbGwgUHVyZW5vdyBkZXBsb3ltZW50IGluZm8gYnkgZGVmYXVsdFxuICAgIHN1cGVyLmRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShyZXN1bHQsIGxvZ2dlciwgeyBtb2RpZmllZDogdHJ1ZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSdW50aW1lIFdlYiBTdGFjazonKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdTdGFjayBOYW1lOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5zdGFja05hbWUpLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdEdXJhdGlvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHRoaXMuZm9ybWF0RHVyYXRpb24ocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5kdXJhdGlvbikpLFxuICAgICk7XG5cbiAgICAvLyBEaXNwbGF5IEFQSSBHYXRld2F5IFVSTCBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmFwaUdhdGV3YXlVcmwpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgIGNoYWxrLmN5YW4oJ0FQSSBHYXRld2F5OicpLFxuICAgICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMuYXBpR2F0ZXdheVVybCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgTGFtYmRhIEFSTiBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QgJiYgcmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsuY3lhbignTGFtYmRhczonKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoKSxcbiAgICAgICk7XG4gICAgICByZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5mb3JFYWNoKChsYW1iZGFBcm46IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgICAgY2hhbGsuY3lhbignICBMYW1iZGEgQVJOOicpLFxuICAgICAgICAgIGNoYWxrLndoaXRlKGxhbWJkYUFybiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHJlZ2lvbiBhbmQgc3RhZ2VcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95bWVudCBJbmZvOicpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1JlZ2lvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHJlc3VsdC5pbmZyYVN0YWNrLnJlZ2lvbiksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1N0YWdlOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LmluZnJhU3RhY2suc3RhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIH1cblxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzdWx0LFxuICBMb2dnZXIsXG4gIEJ1aWxkUmVzdWx0LFxuICBCdWlsZFNlcnZpY2UsXG4gIEJ1aWxkVGFyZ2V0LFxuICBCdWlsZEVycm9yLFxuICBGcmllbmRseUVudmlyb25tZW50RXJyb3IsXG4gIC8vIFB1cmVub3dDbGlDb25maWcsIC8vIFRPRE86IEltcG9ydCBmcm9tIHByb3BlciBsb2NhdGlvblxuICBidWlsZFN0YXRpY0h0bWxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBidWlsZCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqIFNwZWNpZmljIHRhcmdldCB0byBidWlsZCAocmVhY3QsIGxhbWJkYSwgY2RrLCBvciBhbGwpICovXG4gIHRhcmdldD86ICdyZWFjdCcgfCAnbGFtYmRhJyB8ICdjZGsnIHwgJ2FsbCc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYnVpbGQgdGFyZ2V0IHJlcXVpcmVzIEFXUyBjcmVkZW50aWFsc1xuICovXG5mdW5jdGlvbiB0YXJnZXRSZXF1aXJlc0NyZWRlbnRpYWxzKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIExhbWJkYSBhbmQgQ0RLIHRhcmdldHMgbWF5IG5lZWQgQVdTIGNyZWRlbnRpYWxzIGZvciBkZXBsb3ltZW50LXJlbGF0ZWQgb3BlcmF0aW9uc1xuICAvLyBSZWFjdCB0YXJnZXQgZG9lcyBub3QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHNcbiAgcmV0dXJuIHRhcmdldCA9PT0gJ2xhbWJkYScgfHwgdGFyZ2V0ID09PSAnY2RrJyB8fCB0YXJnZXQgPT09ICdhbGwnO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFwcGxpY2F0aW9uIHRhcmdldHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChcbiAgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICBjb25maWc6IGFueSwgLy8gVE9ETzogVXNlIHByb3BlciBQdXJlbm93Q2xpQ29uZmlnIHR5cGVcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgZW52VmFsaWRhdG9yPzogYW55LCAvLyBUT0RPOiBJbXBvcnQgcHJvcGVyIHR5cGUgZnJvbSBwdXJlbm93XG4pOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLnRhcmdldCB8fCAnYWxsJztcblxuICAgIC8vIFZhbGlkYXRlIEFXUyBjcmVkZW50aWFscyBpZiBidWlsZGluZyBBV1MgdGFyZ2V0cyBhbmQgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgaWYgKHRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHModGFyZ2V0KSAmJiBlbnZWYWxpZGF0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGVudlZhbGlkYXRvci5nZXRDb25maWcoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pc0F3c0NyZWRlbnRpYWxzRHVtcCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGb3IgYnVpbGQgY29tbWFuZCwgd2UnbGwgc2hvdyBhIHdhcm5pbmcgYnV0IGFsbG93IHRoZSBidWlsZCB0byBjb250aW51ZVxuICAgICAgICAvLyBzaW5jZSB0aGUgYnVpbGQgaXRzZWxmIGRvZXNuJ3QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHMsIG9ubHkgZGVwbG95bWVudCBkb2VzXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZyaWVuZGx5RW52aXJvbm1lbnRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbSgnQnVpbGRpbmcgd2l0aG91dCBBV1MgY3JlZGVudGlhbHMuIFlvdSB3aWxsIG5lZWQgdG8gY29uZmlndXJlIHRoZW0gYmVmb3JlIGRlcGxveW1lbnQuJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZFN0YXRpY0h0bWwoKTtcblxuICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcblxuICAgIGxvZ2dlci5pbmZvKGNoYWxrLmJvbGQoJ0J1aWxkaW5nIFJ1bnRpbWUgYXBwbGljYXRpb24uLi4nKSk7XG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgbGV0IHJlc3VsdHM6IEJ1aWxkUmVzdWx0W107XG4gICAgbGV0IHNob3VsZEdlbmVyYXRlVHlwZXMgPSBmYWxzZTtcblxuICAgIGlmICh0YXJnZXQgPT09ICdhbGwnKSB7XG4gICAgICAvLyBCdWlsZCBhbGwgdGFyZ2V0c1xuICAgICAgLy8gT25seSBnZW5lcmF0ZSB0eXBlcyBmb3IgUnVudGltZSBwYWNrYWdlIGl0c2VsZiwgbm90IGNvbnN1bWVyIHByb2plY3RzXG4gICAgICBjb25zdCBpc1J1bnRpbWVQYWNrYWdlID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCAnc3JjL2NvcmUvaW5kZXgudHMnKSk7XG4gICAgICBzaG91bGRHZW5lcmF0ZVR5cGVzID0gaXNSdW50aW1lUGFja2FnZTtcbiAgICAgIHJlc3VsdHMgPSBhd2FpdCBidWlsZEFsbFRhcmdldHMoYnVpbGRTZXJ2aWNlLCBjb25maWcsIGxvZ2dlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJ1aWxkIHNwZWNpZmljIHRhcmdldFxuICAgICAgcmVzdWx0cyA9IGF3YWl0IGJ1aWxkU2luZ2xlVGFyZ2V0KGJ1aWxkU2VydmljZSwgdGFyZ2V0LCBjb25maWcsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbnMgaWYgYnVpbGRpbmcgYWxsIHRhcmdldHMgKFJ1bnRpbWUgcGFja2FnZSBvbmx5KVxuICAgIGlmIChzaG91bGRHZW5lcmF0ZVR5cGVzKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoYnVpbGRTZXJ2aWNlLCBjb25maWcsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBidWlsZCBzdW1tYXJ5XG4gICAgZGlzcGxheUJ1aWxkU3VtbWFyeShyZXN1bHRzLCBjd2QsIGxvZ2dlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGV4aXRDb2RlOiAwLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQnVpbGRFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZGltKGVycm9yLmhpbnQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICBleGl0Q29kZTogMSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYWxsIHRhcmdldHMgc2VxdWVudGlhbGx5IHdpdGggcHJvZ3Jlc3MgaW5kaWNhdG9yc1xuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEFsbFRhcmdldHMoXG4gIGJ1aWxkU2VydmljZTogQnVpbGRTZXJ2aWNlLFxuICBjb25maWc6IGFueSxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiBQcm9taXNlPEJ1aWxkUmVzdWx0W10+IHtcbiAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gdGhlIFJ1bnRpbWUgcGFja2FnZSBpdHNlbGYgb3IgYSBjb25zdW1lciBwcm9qZWN0XG4gIGNvbnN0IGlzUnVudGltZVBhY2thZ2UgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjL2NvcmUvaW5kZXgudHMnKSk7XG5cbiAgLy8gRm9yIGNvbnN1bWVyIHByb2plY3RzLCBvbmx5IGJ1aWxkIFJlYWN0XG4gIC8vIExhbWJkYSBhbmQgQ0RLIGFyZSBpbnRlcm5hbCB0byBSdW50aW1lIGFuZCBwcmUtYnVpbHQgaW4gdGhlIHBhY2thZ2VcbiAgY29uc3QgdGFyZ2V0czogQnVpbGRUYXJnZXRbXSA9IGlzUnVudGltZVBhY2thZ2VcbiAgICA/IFsncmVhY3QnLCAnbGFtYmRhJywgJ2NkayddXG4gICAgOiBbJ3JlYWN0J107XG5cbiAgY29uc3QgcmVzdWx0czogQnVpbGRSZXN1bHRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoYEJ1aWxkaW5nICR7dGFyZ2V0fSBidW5kbGUuLi5gKTtcbiAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNlcnZpY2UuYnVpbGRUYXJnZXQodGFyZ2V0LCBjb25maWcpO1xuICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYCR7Y2FwaXRhbGl6ZSh0YXJnZXQpfSBidW5kbGUgKCR7Zm9ybWF0RHVyYXRpb24ocmVzdWx0LmR1cmF0aW9uKX0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwaW5uZXIuZmFpbChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSBmYWlsZWRgKTtcbiAgICAgIHRocm93IG5ldyBCdWlsZEVycm9yKFxuICAgICAgICBgQnVpbGQgZmFpbGVkIGZvciB0YXJnZXQgJyR7dGFyZ2V0fSdgLFxuICAgICAgICByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2luZ2xlIHRhcmdldCB3aXRoIHByb2dyZXNzIGluZGljYXRvclxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFNpbmdsZVRhcmdldChcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIHRhcmdldDogQnVpbGRUYXJnZXQsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8QnVpbGRSZXN1bHRbXT4ge1xuICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoYEJ1aWxkaW5nICR7dGFyZ2V0fSBidW5kbGUuLi5gKTtcbiAgc3Bpbm5lci5zdGFydCgpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2VydmljZS5idWlsZFRhcmdldCh0YXJnZXQsIGNvbmZpZyk7XG5cbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgc3Bpbm5lci5zdWNjZWVkKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlICgke2Zvcm1hdER1cmF0aW9uKHJlc3VsdC5kdXJhdGlvbil9KWApO1xuICB9IGVsc2Uge1xuICAgIHNwaW5uZXIuZmFpbChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSBmYWlsZWRgKTtcbiAgICB0aHJvdyBuZXcgQnVpbGRFcnJvcihcbiAgICAgIGBCdWlsZCBmYWlsZWQgZm9yIHRhcmdldCAnJHt0YXJnZXR9J2AsXG4gICAgICByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzdWx0XTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoXG4gIGJ1aWxkU2VydmljZTogQnVpbGRTZXJ2aWNlLFxuICBjb25maWc6IGFueSxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKCdHZW5lcmF0aW5nIHR5cGUgZGVjbGFyYXRpb25zLi4uJyk7XG4gIHNwaW5uZXIuc3RhcnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkU2VydmljZS5nZW5lcmF0ZVR5cGVzKGNvbmZpZyk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlIGRlY2xhcmF0aW9ucycpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnVHlwZSBkZWNsYXJhdGlvbnMgZmFpbGVkJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IGJ1aWxkIHN1bW1hcnkgd2l0aCBhcnRpZmFjdCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5QnVpbGRTdW1tYXJ5KFxuICByZXN1bHRzOiBCdWlsZFJlc3VsdFtdLFxuICBjd2Q6IHN0cmluZyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiB2b2lkIHtcbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gIC8vIENhbGN1bGF0ZSB0b3RhbCBkdXJhdGlvblxuICBjb25zdCB0b3RhbER1cmF0aW9uID0gcmVzdWx0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5kdXJhdGlvbiwgMCk7XG5cbiAgbG9nZ2VyLnN1Y2Nlc3MoY2hhbGsuYm9sZChgQnVpbGQgY29tcGxldGUgaW4gJHtmb3JtYXREdXJhdGlvbih0b3RhbER1cmF0aW9uKX1gKSk7XG5cbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdBcnRpZmFjdHM6JykpO1xuXG4gIC8vIERpc3BsYXkgZWFjaCBhcnRpZmFjdCB3aXRoIHNpemVcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCByZXN1bHQub3V0cHV0UGF0aCk7XG4gICAgICBjb25zdCBzaXplID0gZ2V0RmlsZVNpemUoZnVsbFBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjd2QsIGZ1bGxQYXRoKTtcblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgY2hhbGsuZGltKGAoJHtzaXplfSlgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxufVxuXG4vKipcbiAqIEdldCBmaWxlIHNpemUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpO1xuICAgIHJldHVybiBmb3JtYXRCeXRlcyhzdGF0cy5zaXplKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCBieXRlcyB0byBodW1hbi1yZWFkYWJsZSBzaXplXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcblxuICBjb25zdCBrID0gMTAyNDtcbiAgY29uc3Qgc2l6ZXMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InXTtcbiAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuXG4gIHJldHVybiBgJHsoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgxKX0gJHtzaXplc1tpXX1gO1xufVxuXG4vKipcbiAqIEZvcm1hdCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbiAgfVxuXG4gIGNvbnN0IHNlY29uZHMgPSAobXMgLyAxMDAwKS50b0ZpeGVkKDEpO1xuICByZXR1cm4gYCR7c2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBDb21tYW5kUmVzdWx0LCBMb2dnZXIgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIGFzIFRlbXBsYXRlU2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIENka0luaXRTZXJ2aWNlLFxuICAgIENka0Jvb3RzdHJhcFNlcnZpY2UsXG4gICAgUGFja2FnZU1hbmFnZXIsXG4gICAgUGFja2FnZU1hbmFnZXJTZXJ2aWNlLFxuICAgIEF3c0NyZWRlbnRpYWxzRGV0ZWN0b3IsXG4gICAgbG9nQ3JlZGVudGlhbHNFcnJvcixcbiAgICBBd3NSZWdpb25SZXNvbHZlcixcbiAgICBQcm9tcHRTZXJ2aWNlLFxuICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICBFbnZpcm9ubWVudFZhbGlkYXRvcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgcnVudGltZSBpbml0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lSW5pdE9wdGlvbnMge1xuICAgIC8qKiBUYXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgbmV3IHByb2plY3QgKi9cbiAgICBkaXI/OiBzdHJpbmc7XG4gICAgLyoqIFRlbXBsYXRlIG5hbWUgdG8gdXNlICovXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7XG4gICAgLyoqIEluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlIG9ubHkgKi9cbiAgICBjZGs/OiBib29sZWFuO1xuICAgIC8qKiBQcm9qZWN0IGNvcmUgaW5zdGFuY2U6IGFsd2F5cyBydW50aW1lLXdlYiBmb3IgcnVudGltZSBwYWNrYWdlICovXG4gICAgY29yZT86IHN0cmluZztcbiAgICAvKiogRm9yY2Ugb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovXG4gICAgZm9yY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgUnVudGltZSBwcm9qZWN0IHVzaW5nIHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGVzXG4gKiBcbiAqIFRoaXMgY29tbWFuZCBleHRlbmRzIHB1cmVub3cncyBpbml0IGZ1bmN0aW9uYWxpdHkgYnV0IHVzZXMgUnVudGltZVRlbXBsYXRlU2VydmljZVxuICogdG8gZW5zdXJlIHRlbXBsYXRlcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW50aW1lSW5pdENvbW1hbmQoXG4gICAgb3B0aW9uczogUnVudGltZUluaXRPcHRpb25zLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnZWYWxpZGF0b3I/OiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIC8vIE5vdGU6IGVudlZhbGlkYXRvciBpcyBvcHRpb25hbCBhbmQgb25seSB1c2VkIGZvciBDREsgYm9vdHN0cmFwXG4gICAgLy8gSW5pdCBjb21tYW5kIGRvZXMgTk9UIHJlcXVpcmUgQVdTIGNyZWRlbnRpYWxzXG4gICAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKFxuICAgICAgICBvcHRpb25zLmNkayA/ICdJbml0aWFsaXppbmcgQ0RLIGluZnJhc3RydWN0dXJlLi4uJyA6ICdJbml0aWFsaXppbmcgUnVudGltZSBwcm9qZWN0Li4uJyxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQ3JlYXRlIHJ1bnRpbWUgdGVtcGxhdGUgc2VydmljZSAodXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlKVxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVNlcnZpY2UgPSBuZXcgVGVtcGxhdGVTZXJ2aWNlKGN3ZCk7XG4gICAgICAgIGNvbnN0IHByb21wdFNlcnZpY2UgPSBuZXcgUHJvbXB0U2VydmljZSgpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIENESyBkaXJlY3RvcnkgZG9lc24ndCBhbHJlYWR5IGV4aXN0ICh1bmxlc3MgZm9yY2UgZmxhZyBpcyBzZXQpXG4gICAgICAgIGlmIChvcHRpb25zLmNkayAmJiAhb3B0aW9ucy5mb3JjZSAmJiB0ZW1wbGF0ZVNlcnZpY2UuY2RrRGlyZWN0b3J5RXhpc3RzKGN3ZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0NESyBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMnLFxuICAgICAgICAgICAgICAgICdVc2UgLS1mb3JjZSBmbGFnIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBDREsgaW5mcmFzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgb3B0aW9ucyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgZGVmYXVsdHNcbiAgICAgICAgY29uc3QgdGFyZ2V0RGlyID0gb3B0aW9ucy5kaXIgfHwgKG9wdGlvbnMuY2RrID8gJ2NkaycgOiBjd2QpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG9wdGlvbnMuY2RrID8gJ2NkaycgOiAob3B0aW9ucy50ZW1wbGF0ZSB8fCAnYmFzaWMnKTtcbiAgICAgICAgY29uc3QgY29yZSA9ICdydW50aW1lLXdlYic7IC8vIEFsd2F5cyB1c2UgcnVudGltZS13ZWIgZm9yIHJ1bnRpbWUgcGFja2FnZVxuICAgICAgICBsZXQgZm9yY2UgPSBvcHRpb25zLmZvcmNlIHx8IGZhbHNlO1xuXG4gICAgICAgIC8vIERlcml2ZSBwcm9qZWN0IG5hbWUgZnJvbSBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgcHJvamVjdE5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjd2QsIG9wdGlvbnMuY2RrID8gY3dkIDogdGFyZ2V0RGlyKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgZmlsZXMgKGlmIG5vdCBDREstb25seSBpbml0KVxuICAgICAgICBpZiAoIW9wdGlvbnMuY2RrICYmICFmb3JjZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUYXJnZXREaXIgPSBwYXRoLnJlc29sdmUoY3dkLCB0YXJnZXREaXIpO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdGaWxlcyA9IGF3YWl0IGNoZWNrRXhpc3RpbmdQcm9qZWN0RmlsZXMocmVzb2x2ZWRUYXJnZXREaXIpO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhpc3RpbmcgcHJvamVjdCBmaWxlcyBkZXRlY3RlZDonKTtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAtICR7ZmlsZX1gKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZE92ZXJ3cml0ZSA9IGF3YWl0IHByb21wdFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgJ0RvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGVzZSBmaWxlcz8nLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gRGVmYXVsdCB0byBOb1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZE92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCBpbml0aWFsaXphdGlvbiBjYW5jZWxsZWQuIEV4aXN0aW5nIGZpbGVzIHByZXNlcnZlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBVc2VyIGNvbmZpcm1lZCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgLy8gVXNlIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgdG8gc2NhZmZvbGQgd2l0aCBydW50aW1lLXdlYiB0ZW1wbGF0ZXNcbiAgICAgICAgYXdhaXQgdGVtcGxhdGVTZXJ2aWNlLnNjYWZmb2xkKFxuICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICB0YXJnZXREaXIsIHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lLFxuICAgICAgICAgICAgZm9yY2UsXG4gICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlLCAvLyBBbHdheXMgcnVudGltZS13ZWJcbiAgICAgICAgKTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXG4gICAgICAgICAgICBvcHRpb25zLmNkayA/ICdDREsgaW5mcmFzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScgOiAnUnVudGltZSBwcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlIGFuZCBuZXh0IHN0ZXBzXG4gICAgICAgIGlmIChvcHRpb25zLmNkaykge1xuICAgICAgICAgICAgZGlzcGxheUNka1N1Y2Nlc3NNZXNzYWdlKGxvZ2dlciwgcHJvamVjdE5hbWUsIHRhcmdldERpciwgY3dkKTtcblxuICAgICAgICAgICAgLy8gRm9yIENESy1vbmx5IGluaXQsIGNoZWNrIGNyZWRlbnRpYWxzIGFuZCBvZmZlciBib290c3RyYXBcbiAgICAgICAgICAgIGlmIChlbnZWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENka0RpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2RrT25seUNyZWRlbnRpYWxzKGxvZ2dlciwgZW52VmFsaWRhdG9yLCByZXNvbHZlZENka0Rpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5UnVudGltZVN1Y2Nlc3NNZXNzYWdlKGxvZ2dlciwgcHJvamVjdE5hbWUsIHRhcmdldERpciwgY3dkKTtcblxuICAgICAgICAgICAgLy8gQWZ0ZXIgbWFpbiBwcm9qZWN0IGluaXRpYWxpemF0aW9uLCBwcm9tcHQgZm9yIENESyBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRJbml0Q2RrID0gYXdhaXQgcHJvbXB0U2VydmljZS5jb25maXJtKFxuICAgICAgICAgICAgICAgICdEbyB5b3Ugd2FudCB0byBpbml0aWFsaXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgZm9yIHRoaXMgcHJvamVjdCBub3c/JyxcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBEZWZhdWx0IHRvIFllc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHNob3VsZEluaXRDZGspIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIENESyB3b3JrZmxvdyB3aXRoIHJ1bnRpbWUtd2ViIGNvcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjZGtSZXN1bHQgPSBhd2FpdCBpbml0aWFsaXplQ2RrV29ya2Zsb3coXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpciksXG4gICAgICAgICAgICAgICAgICAgIGNvcmUsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgZW52VmFsaWRhdG9yLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNka1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENESyBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGJ1dCBtYWluIHByb2plY3QgaXMgT0tcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0NESyBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGJ1dCB5b3VyIFJ1bnRpbWUgcHJvamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3UgY2FuIGluaXRpYWxpemUgQ0RLIGxhdGVyIGJ5IHJ1bm5pbmc6IG5wbSBpbnN0YWxsICYmIHJ1bnRpbWUgaW5pdCAtLWNkaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBkZWNsaW5lZCBDREsgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3UgY2FuIGluaXRpYWxpemUgQ0RLIGxhdGVyIGJ5IHJ1bm5pbmc6IG5wbSBpbnN0YWxsICYmIHJ1bnRpbWUgaW5pdCAtLWNkaycpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbChvcHRpb25zLmNkayA/ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBDREsgaW5mcmFzdHJ1Y3R1cmUnIDogJ0ZhaWxlZCB0byBpbml0aWFsaXplIFJ1bnRpbWUgcHJvamVjdCcpO1xuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5kaW0oZXJyb3IuaGludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlIGZvciBSdW50aW1lIHByb2plY3RzIHdpdGggbmV4dCBzdGVwc1xuICovXG5mdW5jdGlvbiBkaXNwbGF5UnVudGltZVN1Y2Nlc3NNZXNzYWdlKFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gICAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gICAgY3dkOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlZERpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgY29uc3QgaXNDdXJyZW50RGlyID0gcmVzb2x2ZWREaXIgPT09IGN3ZDtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIGxvZ2dlci5zdWNjZXNzKGNoYWxrLmJvbGQoYFJ1bnRpbWUgcHJvamVjdCAnJHtwcm9qZWN0TmFtZX0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IWApKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1Byb2plY3Qgc3RydWN0dXJlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHNyYy8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxQ1x1MjUwMFx1MjUwMCBpbmRleC50c3ggICAgICAgIyBSZWFjdCBhcHAgZW50cnknKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxQ1x1MjUwMFx1MjUwMCBBcHAudHN4ICAgICAgICAgIyBSb290IGNvbXBvbmVudCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTE0XHUyNTAwXHUyNTAwIHJvdXRlcy50c3ggICAgICAjIFJlYWN0IFJvdXRlciByb3V0ZXMnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCBwdWJsaWMvJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgaW5kZXguaHRtbCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHJ1bnRpbWUuY29uZmlnLnRzICAgIyBSdW50aW1lIGNvbmZpZ3VyYXRpb24nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCB0c2NvbmZpZy5qc29uICAgICAgICMgVHlwZVNjcmlwdCBjb25maWcnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxNFx1MjUwMFx1MjUwMCBwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdOZXh0IHN0ZXBzOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgaWYgKCFpc0N1cnJlbnREaXIpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgICBjZCAke3BhdGgucmVsYXRpdmUoY3dkLCByZXNvbHZlZERpcil9YCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0RldmVsb3BtZW50OicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIFN0YXJ0IGxvY2FsIGRldmVsb3BtZW50IHNlcnZlcicpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0J1aWxkICYgRGVwbG95OicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgYnVpbGQnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQnVpbGQgYWxsIHRhcmdldHMgKFJlYWN0LCBMYW1iZGEsIENESyknKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIGRldicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBEZXBsb3kgdG8gQVdTJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXHVEODNEXHVEQ0RBIExlYXJuIG1vcmU6JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBodHRwczovL3J1bnRpbWV3ZWIuY29tL2RvY3MnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG59XG5cbi8qKlxuICogRGlzcGxheSBDREstc3BlY2lmaWMgc3VjY2VzcyBtZXNzYWdlIHdpdGggbmV4dCBzdGVwc1xuICovXG5mdW5jdGlvbiBkaXNwbGF5Q2RrU3VjY2Vzc01lc3NhZ2UoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBjd2Q6IHN0cmluZyxcbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICBjb25zdCByZWxhdGl2ZURpciA9IHBhdGgucmVsYXRpdmUoY3dkLCByZXNvbHZlZERpcik7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICBsb2dnZXIuc3VjY2VzcyhjaGFsay5ib2xkKGBDREsgaW5mcmFzdHJ1Y3R1cmUgZm9yICcke3Byb2plY3ROYW1lfScgY3JlYXRlZCBzdWNjZXNzZnVsbHkhYCkpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnQ0RLIHN0cnVjdHVyZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIGNkay8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCBiaW4vJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgYXBwLnRzICAgICAgICAgICMgQ0RLIGFwcCBlbnRyeSBwb2ludCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIGNkay5qc29uICAgICAgICAgICAgIyBDREsgY29uZmlndXJhdGlvbicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHRzY29uZmlnLmpzb24gICAgICAgIyBUeXBlU2NyaXB0IGNvbmZpZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTE0XHUyNTAwXHUyNTAwIC5lbnYuZXhhbXBsZSAgICAgICAgIyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdGVtcGxhdGUnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSZWFkeSB0byBkZXBsb3k6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAgIGNkICR7cmVsYXRpdmVEaXJ9YCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIEFsbCBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgaW5zdGFsbGVkJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95IHRvIEFXUzonKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGluaXQgLS1jZGsnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQm9vdHN0cmFwIENESyAob25seSBuZWVkZWQgb25jZSBwZXIgYWNjb3VudC9yZWdpb24pJykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBjZGsgZGlmZicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBQcmV2aWV3IGNoYW5nZXMgYmVmb3JlIGRlcGxveWluZycpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXHVEODNDXHVERkFGIERlcGxveSB0byBkaWZmZXJlbnQgc3RhZ2VzOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2Ugc3RhZ2luZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIHByb2QnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0RcdURDREEgTGVhcm4gbW9yZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFJ1bnRpbWUgQ0RLOiBodHRwczovL3J1bnRpbWV3ZWIuY29tL2RvY3MvY2RrJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBBV1MgQ0RLOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrLycpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZSB3b3JrZmxvdyB1c2luZyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVDZGtXb3JrZmxvdyhcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICBjb3JlOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4pOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICAvLyBJbXBvcnQgdGhlIENESyB3b3JrZmxvdyBsb2dpYyBmcm9tIHB1cmVub3cgYnV0IHVzZSBvdXIgUnVudGltZVRlbXBsYXRlU2VydmljZVxuICAgIGNvbnN0IHtcbiAgICAgICAgUHJvbXB0U2VydmljZSxcbiAgICAgICAgUGFja2FnZU1hbmFnZXJTZXJ2aWNlLFxuICAgICAgICBDZGtJbml0U2VydmljZSxcbiAgICAgICAgQXdzQ3JlZGVudGlhbHNEZXRlY3RvcixcbiAgICAgICAgQXdzUmVnaW9uUmVzb2x2ZXIsXG4gICAgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmt0aWYvcHVyZW5vdy9iaW4nKTtcblxuICAgIGNvbnN0IHByb21wdFNlcnZpY2UgPSBuZXcgUHJvbXB0U2VydmljZSgpO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyU2VydmljZSA9IG5ldyBQYWNrYWdlTWFuYWdlclNlcnZpY2UoKTtcbiAgICBjb25zdCBjZGtJbml0U2VydmljZSA9IG5ldyBDZGtJbml0U2VydmljZSh0ZW1wbGF0ZVNlcnZpY2UsIHBhY2thZ2VNYW5hZ2VyU2VydmljZSwgbG9nZ2VyKTtcbiAgICBjb25zdCBhd3NEZXRlY3RvciA9IG5ldyBBd3NDcmVkZW50aWFsc0RldGVjdG9yKCk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgL2NkayBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNka0V4aXN0cyA9IGF3YWl0IGNka0luaXRTZXJ2aWNlLmNoZWNrQ2RrRGlyZWN0b3J5RXhpc3RzKHByb2plY3REaXIpO1xuXG4gICAgICAgIGlmIChjZGtFeGlzdHMpIHtcbiAgICAgICAgICAgIC8vIFByb21wdCBmb3Igb3ZlcndyaXRlXG4gICAgICAgICAgICBjb25zdCBzaG91bGRPdmVyd3JpdGUgPSBhd2FpdCBwcm9tcHRTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICAgICAgICAgJ0EgL2NkayBmb2xkZXIgYWxyZWFkeSBleGlzdHMuIE92ZXJ3cml0ZSBpdD8nLFxuICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBEZWZhdWx0IHRvIE5vXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXNob3VsZE92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgZGVjbGluZWQgb3ZlcndyaXRlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnRXhpc3RpbmcgQ0RLIHNldHVwIHByZXNlcnZlZC4nKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIEFXUyByZWdpb24gdXNpbmcgU0RLJ3MgZGVmYXVsdCBwcm92aWRlciBjaGFpblxuICAgICAgICBjb25zdCByZWdpb25SZXNvbHZlciA9IG5ldyBBd3NSZWdpb25SZXNvbHZlcigpO1xuICAgICAgICBjb25zdCByZWdpb25SZXN1bHQgPSBhd2FpdCByZWdpb25SZXNvbHZlci5yZXNvbHZlUmVnaW9uKCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVnaW9uID0gcmVnaW9uUmVzdWx0LnJlZ2lvbiB8fCBBd3NSZWdpb25SZXNvbHZlci5nZXREZWZhdWx0UmVnaW9uKCk7XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNvbHZlZCBBV1MgcmVnaW9uOiAke3Jlc29sdmVkUmVnaW9ufSAoc291cmNlOiAke3JlZ2lvblJlc3VsdC5zb3VyY2V9KWApO1xuXG4gICAgICAgIC8vIExvYWQgcHJvamVjdCBjb25maWd1cmF0aW9uICh1c2UgZGVmYXVsdHMgaWYgbm90IGF2YWlsYWJsZSlcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICBzdGFnZTogJ2RldicsXG4gICAgICAgICAgICByZWdpb246IHJlc29sdmVkUmVnaW9uLFxuICAgICAgICAgICAgZW5hYmxlU2VvOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERldGVjdCBwYWNrYWdlIG1hbmFnZXJcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXJTZXJ2aWNlLmRldGVjdFBhY2thZ2VNYW5hZ2VyKHByb2plY3REaXIpO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBwYWNrYWdlIG1hbmFnZXI6ICR7Y2hhbGsuY3lhbihkZXRlY3RlZE1hbmFnZXIpfWApO1xuICAgICAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBDREsgd2l0aCBhdXRvbWF0ZWQgaW5zdGFsbGF0aW9uXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcignSW5pdGlhbGl6aW5nIENESyBpbmZyYXN0cnVjdHVyZS4uLicpO1xuICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2RrSW5pdFNlcnZpY2UuaW5pdGlhbGl6ZUNkayh7XG4gICAgICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgICBlbmFibGVTZW86IGNvbmZpZy5lbmFibGVTZW8sXG4gICAgICAgICAgICBvdmVyd3JpdGVFeGlzdGluZzogY2RrRXhpc3RzLFxuICAgICAgICAgICAgcnVuQm9vdHN0cmFwOiBmYWxzZSwgLy8gV2UnbGwgaGFuZGxlIGJvb3RzdHJhcCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICBwYWNrYWdlTWFuYWdlcjogZGV0ZWN0ZWRNYW5hZ2VyLFxuICAgICAgICB9LCBjb3JlKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBpbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZScpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IsXG4gICAgICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdDREsgaW5mcmFzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuXG4gICAgICAgIC8vIERpc3BsYXkgaW5zdGFsbGF0aW9uIHN1bW1hcnlcbiAgICAgICAgaWYgKHJlc3VsdC5wcm9qZWN0RGVwZW5kZW5jaWVzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIFByb2plY3QgZGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmNka0RlcGVuZGVuY2llc0luc3RhbGxlZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZ3JlZW4oJ1x1MjcxMyBDREsgZGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBjcmVkZW50aWFscyBjaGVjayBmb3IgQ0RLLW9ubHkgaW5pdCAocnVudGltZSBpbml0IC0tY2RrKVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgZW52VmFsaWRhdG9yOiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbiAgICBjZGtEaXI6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gZ2V0IHZhbGlkYXRlZCBjb25maWdcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICBjb25zdCBpc0F3c0NyZWRlbnRpYWxzVmFsaWQgPSAhY29uZmlnLmlzQXdzQ3JlZGVudGlhbHNEdW1wKCk7XG5cbiAgICAgICAgaWYgKCFpc0F3c0NyZWRlbnRpYWxzVmFsaWQpIHtcbiAgICAgICAgICAgIGxvZ0NyZWRlbnRpYWxzRXJyb3IobG9nZ2VyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENyZWRlbnRpYWxzIGFyZSB2YWxpZCAtIGluZm9ybSB1c2VyXG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIEFXUyBjcmVkZW50aWFscyBkZXRlY3RlZCcpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnWW91ciBDREsgaW5mcmFzdHJ1Y3R1cmUgaXMgcmVhZHkuIFlvdSBjYW4gbm93OicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkayAgICAgICAgICAjIEJvb3RzdHJhcCB5b3VyIEFXUyBlbnZpcm9ubWVudCAoZmlyc3QgdGltZSBvbmx5KScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2ICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAvLyBDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCAtIGRpc3BsYXkgZnJpZW5kbHkgd2FybmluZ1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oY2hhbGsueWVsbG93KCchICBBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDREsgaW5mcmFzdHJ1Y3R1cmUgZmlsZXMgd2VyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBpbiAvY2RrJyk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnSG93ZXZlciwgQVdTIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCBmb3IgZGVwbG95bWVudC4nKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUGxlYXNlIGNvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMgYmVmb3JlIGRlcGxveWluZzonKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMTogQVdTIENMSSAoUmVjb21tZW5kZWQpJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgYXdzIGNvbmZpZ3VyZScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMjogRW52aXJvbm1lbnQgVmFyaWFibGVzJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19BQ0NFU1NfS0VZX0lEPXlvdXJfa2V5X2lkJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19TRUNSRVRfQUNDRVNTX0tFWT15b3VyX3NlY3JldF9rZXknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1JFR0lPTj11cy1lYXN0LTEnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnT3B0aW9uIDM6IEFXUyBQcm9maWxlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19QUk9GSUxFPXlvdXJfcHJvZmlsZV9uYW1lJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBZnRlciBjb25maWd1cmluZyBjcmVkZW50aWFscywgeW91IGNhbiBkZXBsb3kgYnkgcnVubmluZzonKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGluaXQgLS1jZGsgICAgICAgICAgIyBCb290c3RyYXAgeW91ciBBV1MgZW52aXJvbm1lbnQgKGZpcnN0IHRpbWUgb25seSknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIGRldiAgIyBEZXBsb3kgeW91ciBpbmZyYXN0cnVjdHVyZScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yIC0gcmV0aHJvd1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBvdmVyd3JpdHRlblxuICpcbiAqIEBwYXJhbSBwcm9qZWN0RGlyIC0gUHJvamVjdCBkaXJlY3RvcnkgcGF0aFxuICogQHJldHVybnMgQXJyYXkgb2YgZXhpc3RpbmcgZmlsZSBwYXRocyAocmVsYXRpdmUgdG8gcHJvamVjdCBkaXIpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdQcm9qZWN0RmlsZXMocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBLZXkgZmlsZXMgdGhhdCBpbmRpY2F0ZSBhbiBleGlzdGluZyBwcm9qZWN0XG4gICAgY29uc3Qga2V5RmlsZXMgPSBbXG4gICAgICAgICdwYWNrYWdlLmpzb24nLFxuICAgICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICAgJ3NyYy9pbmRleC50c3gnLFxuICAgICAgICAnc3JjL0FwcC50c3gnLFxuICAgICAgICAncnVudGltZS5jb25maWcudHMnLFxuICAgICAgICAncHVyZW5vdy5jb25maWcudHMnLFxuICAgICAgICAndHNjb25maWcuanNvbicsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBrZXlGaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBmaWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBleGlzdGluZ0ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBjb250aW51ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nRmlsZXM7XG59IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuZXhwb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9ydW50aW1lLXdlYi1kZXBsb3ltZW50LnNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgICBidWlsZENvbW1hbmQsXG4gICAgdHlwZSBCdWlsZE9wdGlvbnNcbn0gZnJvbSAnLi9idWlsZC5jb21tYW5kJztcbmV4cG9ydCB7XG4gICAgcnVudGltZUluaXRDb21tYW5kLFxuICAgIHR5cGUgUnVudGltZUluaXRPcHRpb25zXG59IGZyb20gJy4vaW5pdCc7XG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmltcG9ydCB7XG4gIEdsb2JhbE9wdGlvbnMsXG4gIFB1cmVub3dDbGksXG4gIFB1cmVub3dDbGlDb250ZXh0LFxuICBwdXJlbm93Q29tbWFuZENvbmZpZyxcbiAgdHlwZSBTdHJhdGVneUNvbnRhaW5lcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDb21tYW5kLFxuICB0eXBlIEJ1aWxkT3B0aW9ucyxcbiAgLy8gZGV2VmFsaWRhdGlvbkNvbW1hbmQsIC8vIFRPRE86IEltcGxlbWVudCBkZXYgdmFsaWRhdGlvblxuICAvLyB0eXBlIERldlZhbGlkYXRpb25PcHRpb25zLFxuICBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UsXG59IGZyb20gJ0BiaW4vY29tbWFuZHMnO1xuXG5pbXBvcnQgeyBydW50aW1lSW5pdENvbW1hbmQsIHR5cGUgUnVudGltZUluaXRPcHRpb25zIH0gZnJvbSAnQGJpbi9jb21tYW5kcy9pbml0JztcblxuaW1wb3J0IHsgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsIFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciB9IGZyb20gJ0BiaW4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBSdW50aW1lIENMSSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgUHVyZW5vd0NsaSB1c2luZyB0aGUgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHVyZW5vdydzIEV4dGVuc2libGVDbGlDb3JlLmFkZENvbW1hbmRzKCkgYW5kIGFkZEFjdGlvbnMoKVxuICogdG8gYWRkIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZyBwdXJlbm93IGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuICBzdGF0aWMgZGVmYXVsdFRvb2xOYW1lOiBzdHJpbmcgPSAncnVudGltZSc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgc3RyYXRlZ2llc1xuICAgIC8vIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU3RyYXRlZ3lDb250YWluZXIoKTtcbiAgICAvL1xuICAgIC8vIC8vIEFkZCBydW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgZm9yIHRocmVlLXN0YWNrIGRlcGxveW1lbnRcbiAgICAvLyBzdHJhdGVnaWVzLmFkZFN0cmF0ZWd5KG5ldyBSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5KCkpO1xuXG4gICAgc3VwZXIodm9pZCAwIC8qc3RyYXRlZ2llcyovLCB7XG4gICAgICB0b29sTmFtZTogUnVudGltZVdlYkNsaS5kZWZhdWx0VG9vbE5hbWUsXG4gICAgICBoZWxwZXJUb29sTmFtZTogJ1J1bnRpbWUgV2ViJyxcbiAgICAgIHRpdGxlOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGZhbGxiYWNrVmVyc2lvbjogJzAuMi4xMzUnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb21tYW5kcyA9IHB1cmVub3dDb21tYW5kQ29uZmlnKFJ1bnRpbWVXZWJDbGkuZGVmYXVsdFRvb2xOYW1lKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGJ1aWxkIGNvbW1hbmRzXG4gICAgdGhpcy5hZGRCdWlsZENvbW1hbmRzKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHJ1bnRpbWUtd2ViIGV4dGVuc2lvbnNcbiAgICAvLyB0aGlzLnJ1bnRpbWVFeHRlbnNpb25zID0gbmV3IFJ1bnRpbWVXZWJDbGlFeHRlbnNpb25zKCk7XG5cbiAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyBjb21tYW5kcyB1c2luZyBleHRlbnNpYmxlIGFyY2hpdGVjdHVyZVxuICAgIC8vIEBub3RlOiBpcyBub3QgbmVjZXNzYXJ5LCB3ZSBleHBlY3QgdG8gcmVkZWZpbmUgZGVwbG95bWVudCBzdHJhdGVneSBvbmx5XG4gICAgLy8gdGhpcy5hZGRSdW50aW1lQ29tbWFuZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcnVudGltZS1zcGVjaWZpYyBidWlsZCBjb21tYW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRCdWlsZENvbW1hbmRzKCk6IHZvaWQge1xuICAgIC8vIEVuaGFuY2VkIGJ1aWxkIGNvbW1hbmQgd2l0aCBtdWx0aXBsZSB0YXJnZXQgc3VwcG9ydFxuICAgIC8vIHRoaXMucHJvZ3JhbVxuICAgIC8vICAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgICAvLyAgIC5kZXNjcmlwdGlvbignQnVpbGQgcnVudGltZSBidW5kbGVzIGZvciBkaWZmZXJlbnQgdGFyZ2V0cycpXG4gICAgLy8gICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCAnQnVpbGQgdGFyZ2V0IChhbGx8YnJvd3NlcnxsYW1iZGF8bGlifGxpYi1lc218aW5mcmF8Y2xpfGJpbnxjZGspJywgJ2FsbCcpXG4gICAgLy8gICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZSAoZmFzdGVyIGJ1aWxkcywgc291cmNlIG1hcHMpJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXdhdGNoJywgJ0VuYWJsZSB3YXRjaCBtb2RlIGZvciBjb250aW51b3VzIHJlYnVpbGRzJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLWRldi12YWxpZGF0aW9uJywgJ0VuYWJsZSBlbmhhbmNlZCBkZXZlbG9wbWVudCB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ0VuYWJsZSB2ZXJib3NlIG91dHB1dCcsIGZhbHNlKVxuICAgIC8vICAgLm9wdGlvbignLS1vdXRkaXIgPGRpcj4nLCAnT3ZlcnJpZGUgb3V0cHV0IGRpcmVjdG9yeScpXG4gICAgLy8gICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXQsXG4gICAgLy8gICAgICAgICBkZXY6IG9wdGlvbnMuZGV2LFxuICAgIC8vICAgICAgICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgLy8gICAgICAgICBza2lwVmFsaWRhdGlvbjogb3B0aW9ucy5za2lwVmFsaWRhdGlvbixcbiAgICAvLyAgICAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyAgICAgICAgIG91dGRpcjogb3B0aW9ucy5vdXRkaXIsXG4gICAgLy8gICAgICAgfTtcbiAgICAvL1xuICAgIC8vICAgICAgIGF3YWl0IGJ1aWxkQ29tbWFuZChidWlsZE9wdGlvbnMpO1xuICAgIC8vXG4gICAgLy8gICAgICAgLy8gUnVuIGRldmVsb3BtZW50IHZhbGlkYXRpb24gaWYgcmVxdWVzdGVkXG4gICAgLy8gICAgICAgaWYgKG9wdGlvbnMuZGV2VmFsaWRhdGlvbikge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coJ1xcblx1RDgzRFx1REQwRCBTdGFydGluZyBkZXZlbG9wbWVudCB2YWxpZGF0aW9uLi4uJyk7XG4gICAgLy8gICAgICAgICBjb25zdCBkZXZPcHRpb25zOiBEZXZWYWxpZGF0aW9uT3B0aW9ucyA9IHtcbiAgICAvLyAgICAgICAgICAgdGFyZ2V0czogW29wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXRdLFxuICAgIC8vICAgICAgICAgICB3YXRjaDogZmFsc2UsIC8vIFNpbmdsZSBydW4gZm9yIGJ1aWxkIGNvbW1hbmRcbiAgICAvLyAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgIC8vICAgICAgICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXG4gICAgLy8gICAgICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgICAgICBjb25zdCB7IERldlZhbGlkYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJ0BiaW4vY29tbWFuZHMnKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IGRldlNlcnZpY2UgPSBuZXcgRGV2VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICAvLyAgICAgICAgIGF3YWl0IGRldlNlcnZpY2UucnVuVmFsaWRhdGlvbihkZXZPcHRpb25zLnRhcmdldHMhLCBkZXZPcHRpb25zLnZlcmJvc2UpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdCdWlsZCBmYWlsZWQ6JywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAvLyAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuXG4gICAgLy8gSW5kaXZpZHVhbCB0YXJnZXQgYnVpbGQgY29tbWFuZHMgZm9yIGNvbnZlbmllbmNlXG4gICAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJyb3dzZXInLCB0YXJnZXQ6ICdyZWFjdCcsIGRlc2M6ICdCdWlsZCBicm93c2VyIGJ1bmRsZSAoRVNNKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxhbWJkYScsIHRhcmdldDogJ2xhbWJkYScsIGRlc2M6ICdCdWlsZCBMYW1iZGEgYnVuZGxlIChDb21tb25KUyknIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpsaWInLCB0YXJnZXQ6ICdsaWInLCBkZXNjOiAnQnVpbGQgbGlicmFyeSBidW5kbGUgKENvbW1vbkpTKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxpYi1lc20nLCB0YXJnZXQ6ICdsaWItZXNtJywgZGVzYzogJ0J1aWxkIGxpYnJhcnkgYnVuZGxlIChFU00pJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6aW5mcmEnLCB0YXJnZXQ6ICdpbmZyYScsIGRlc2M6ICdCdWlsZCBpbmZyYXN0cnVjdHVyZSBidW5kbGUnIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpjbGknLCB0YXJnZXQ6ICdjbGknLCBkZXNjOiAnQnVpbGQgQ0xJIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJpbicsIHRhcmdldDogJ2JpbicsIGRlc2M6ICdCdWlsZCBiaW4gdXRpbGl0aWVzIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmNkaycsIHRhcmdldDogJ2NkaycsIGRlc2M6ICdCdWlsZCBDREsgYXBwbGljYXRpb24gYnVuZGxlJyB9LFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdGFyZ2V0LCBkZXNjIH0gb2YgdGFyZ2V0cykge1xuICAgICAgdGhpcy5wcm9ncmFtXG4gICAgICAgIC5jb21tYW5kKG5hbWUpXG4gICAgICAgIC5kZXNjcmlwdGlvbihkZXNjKVxuICAgICAgICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZScsIGZhbHNlKVxuICAgICAgICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0IGFzIGFueSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEdldCBjb25maWcgYW5kIGxvZ2dlciBmcm9tIHNvbWV3aGVyZSAtIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgcHJvcGVybHlcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHt9IGFzIGFueTsgLy8gVE9ETzogR2V0IHByb3BlciBjb25maWdcbiAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbnNvbGUgYXMgYW55OyAvLyBUT0RPOiBHZXQgcHJvcGVyIGxvZ2dlclxuXG4gICAgICAgICAgICBhd2FpdCBidWlsZENvbW1hbmQoYnVpbGRPcHRpb25zLCBjb25maWcsIGxvZ2dlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bmFtZX0gZmFpbGVkOmAsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGNvbW1hbmRcbiAgICB0aGlzLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdkZXY6dmFsaWRhdGUnKVxuICAgICAgLmRlc2NyaXB0aW9uKCdTdGFydCBkZXZlbG9wbWVudCBtb2RlIGJ1bmRsZSB2YWxpZGF0aW9uIHdpdGggcmVhbC10aW1lIGZlZWRiYWNrJylcbiAgICAgIC5vcHRpb24oJy10LCAtLXRhcmdldHMgPHRhcmdldHM+JywgJ0NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMgdG8gdmFsaWRhdGUnLCAncmVhY3QsbGFtYmRhJylcbiAgICAgIC5vcHRpb24oJy0tbm8td2F0Y2gnLCAnRGlzYWJsZSBmaWxlIHdhdGNoaW5nJywgZmFsc2UpXG4gICAgICAub3B0aW9uKCctLWludGVydmFsIDxtcz4nLCAnVmFsaWRhdGlvbiBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMnLCAnNTAwMCcpXG4gICAgICAub3B0aW9uKCctLW5vLWltbWVkaWF0ZScsICdTa2lwIGltbWVkaWF0ZSB2YWxpZGF0aW9uIG9uIHN0YXJ0dXAnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IG9wdGlvbnMudGFyZ2V0cy5zcGxpdCgnLCcpLm1hcCgodDogc3RyaW5nKSA9PiB0LnRyaW0oKSk7XG4gICAgICAgICAgY29uc3QgZGV2T3B0aW9uczogYW55ID0geyAvLyBUT0RPOiBVc2UgcHJvcGVyIERldlZhbGlkYXRpb25PcHRpb25zIHR5cGVcbiAgICAgICAgICAgIHRhcmdldHMsXG4gICAgICAgICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCxcbiAgICAgICAgICAgIGludGVydmFsOiBwYXJzZUludChvcHRpb25zLmludGVydmFsLCAxMCksXG4gICAgICAgICAgICBpbW1lZGlhdGU6IG9wdGlvbnMuaW1tZWRpYXRlLFxuICAgICAgICAgICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBhd2FpdCBkZXZWYWxpZGF0aW9uQ29tbWFuZChkZXZPcHRpb25zKTsgLy8gVE9ETzogSW1wbGVtZW50IGRldiB2YWxpZGF0aW9uXG4gICAgICAgICAgY29uc29sZS5sb2coJ0RldiB2YWxpZGF0aW9uIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFB1cmVub3ctc3BlY2lmaWMgY29udGV4dCB3aXRoIGFsbCByZXF1aXJlZCBzZXJ2aWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0PihcbiAgICBnbG9iYWxPcHRzOiBHbG9iYWxPcHRpb25zLCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbiAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KHtcbiAgICAgICAgLi4uZ2xvYmFsT3B0cyxcbiAgICAgICAgY29uZmlnOiBnbG9iYWxPcHRzLmNvbmZpZyA/PyAncnVudGltZS5jb25maWcudHMnXG4gICAgICB9LCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZvciBkZXBsb3kgY29tbWFuZCAocmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlZmF1bHQgZGVwbG95bWVudCBiZWhhdmlvclxuICAgICAgY29uc3QgZGVwbG95bWVudFNlcnZpY2UgPSBuZXcgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50U2VydmljZS5kZXBsb3lDb21tYW5kKFxuICAgICAgICBjb250ZXh0LnN0YWNrc0RlcGxveVNlcnZpY2UsXG4gICAgICAgIG9wdGlvbnMgYXMgYW55LFxuICAgICAgICBjb250ZXh0LmNvbmZpZyxcbiAgICAgICAgY29udGV4dC5sb2dnZXIsXG4gICAgICAgIGNvbnRleHQuY3dkLFxuICAgICAgICBjb250ZXh0LmVudlZhbGlkYXRvcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KHJlc3VsdC5leGl0Q29kZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIGluaXQgY29tbWFuZCAodXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlKVxuICAgKi9cbiAgYXN5bmMgaW5pdENvbW1hbmQob3B0aW9uczogdW5rbm93biwgY21kOiBDb21tYW5kLCBzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBoZWxwIHdhcyByZXF1ZXN0ZWQgLSBsZXQgQ29tbWFuZGVyLmpzIGhhbmRsZSBpdFxuICAgIGlmICh0aGlzLmlzSGVscFJlcXVlc3RlZChjbWQpKSB7XG4gICAgICBjbWQuaGVscCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmdldENvbnRleHQob3B0aW9ucywgY21kKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgcnVudGltZS1zcGVjaWZpYyBpbml0IGNvbW1hbmQgd2l0aCBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gICAgICBjb25zdCBpbml0T3B0aW9ucyA9IG9wdGlvbnMgYXMgUnVudGltZUluaXRPcHRpb25zO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW50aW1lSW5pdENvbW1hbmQoXG4gICAgICAgIGluaXRPcHRpb25zLFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBwcm9jZXNzLmV4aXQocmVzdWx0LmV4aXRDb2RlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBmb3IgZGVzdHJveSBjb21tYW5kIChyZXF1aXJlcyBBV1MgY3JlZGVudGlhbHMpXG4gICAqL1xuICBhc3luYyBkZXN0cm95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCBhbmQgZXhlY3V0ZSBkZXN0cm95IGNvbW1hbmRcbiAgICAgIGNvbnN0IHsgZGVzdHJveUNvbW1hbmQgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmt0aWYvcHVyZW5vdy9iaW4nKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlc3Ryb3lDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ub3B0aW9ucyBhcyBhbnksXG4gICAgICAgICAgYmFja3VwRGlyOiAnLi8ucnVudGltZS1iYWNrdXBzJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChyZXN1bHQuZXhpdENvZGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIENMSSB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBsb2dnaW5nIChubyBlbW9qaSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG4gICAgY29uc3QgdmVyYm9zZSA9ICEhcHJvY2Vzcy5lbnYuREVCVUc7XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lVGVtcGxhdGVFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0VGVtcGxhdGVFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEVycm9yID0gZm9ybWF0dGVyLmZvcm1hdFRlbXBsYXRlU3RydWN0dXJlRXJyb3IoZXJyb3IsIHZlcmJvc2UpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRFcnJvcik7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRFcnJvciA9IGZvcm1hdHRlci5mb3JtYXRFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBlcnJvcjonLCBTdHJpbmcoZXJyb3IpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIENMSSBpbnN0YW5jZSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgcHVyZW5vd1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNsaSgpOiBSdW50aW1lV2ViQ2xpIHtcbiAgcmV0dXJuIG5ldyBSdW50aW1lV2ViQ2xpKCk7XG59XG5cbi8vIC8qKlxuLy8gICogTWFpbiBDTEkgZW50cnkgcG9pbnQgdXNpbmcgcHJvcGVyIHB1cmVub3cgZXh0ZW5zaW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuLy8gICB0cnkge1xuLy8gICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbi8vICAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG4vL1xuLy8gICAgIC8vIFBhcnNlIGFuZCBleGVjdXRlIENMSSBjb21tYW5kc1xuLy8gICAgIGF3YWl0IGNsaS5ydW4oKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4vLyAgIH1cbi8vIH1cblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuLy8gICBtYWluKCkuY2F0Y2goUHVyZW5vd1J1bnRpbWVDbGkuaGFuZGxlRXJyb3IpO1xuLy8gfVxuIl0sCiAgIm1hcHBpbmdzIjogIjt3b0JBQUEsSUFBQUEsR0FBQUMsRUFBQSxDQUFBQyxHQUFBQyxLQUFBLGNBRUFBLEdBQU8sUUFBVSxDQUNoQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsYUFBZ0IsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM5QixLQUFRLENBQUMsRUFBRyxJQUFLLEdBQUcsRUFDcEIsV0FBYyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzVCLE1BQVMsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN2QixNQUFTLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDdkIsT0FBVSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3hCLE1BQVMsQ0FBQyxFQUFHLEVBQUcsQ0FBQyxFQUNqQixlQUFrQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQ2hDLEtBQVEsQ0FBQyxFQUFHLEVBQUcsR0FBRyxFQUNsQixXQUFjLENBQUMsSUFBSyxHQUFJLEdBQUcsRUFDM0IsTUFBUyxDQUFDLElBQUssR0FBSSxFQUFFLEVBQ3JCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixVQUFhLENBQUMsR0FBSSxJQUFLLEdBQUcsRUFDMUIsV0FBYyxDQUFDLElBQUssSUFBSyxDQUFDLEVBQzFCLFVBQWEsQ0FBQyxJQUFLLElBQUssRUFBRSxFQUMxQixNQUFTLENBQUMsSUFBSyxJQUFLLEVBQUUsRUFDdEIsZUFBa0IsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUNoQyxTQUFZLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFD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aEIsQ0FBQyxFQUVELEVBQUFBLFFBQVEsR0FBRyxxQkFBdUJFLEdBQWdCLENBQ2hELFFBQVEsTUFBTSxHQUFBSCxRQUFNLElBQUksUUFBRyxFQUFHLHVCQUF3QkcsQ0FBTSxFQUN4RCxFQUFBRixRQUFRLElBQUksT0FBU0UsYUFBa0IsT0FDekMsUUFBUSxNQUFNQSxFQUFPLEtBQUssRUFFNUIsRUFBQUYsUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FBQyxDQUNILENBR0FDLEdBQXlCLEVBSXpCUCxHQUFLLEVBQUUsTUFBT0UsR0FBVSxDQUN0QixRQUFRLE1BQU0sR0FBQUcsUUFBTSxJQUFJLFFBQUcsRUFBRyxlQUFnQkgsRUFBTSxPQUFPLEVBQ3ZELEVBQUFJLFFBQVEsSUFBSSxPQUNkLFFBQVEsTUFBTUosRUFBTSxLQUFLLEVBRTNCLEVBQUFJLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQUMiLAogICJuYW1lcyI6IFsicmVxdWlyZV9jb2xvcl9uYW1lIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicmVxdWlyZV9jb252ZXJzaW9ucyIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImNzc0tleXdvcmRzIiwgInJldmVyc2VLZXl3b3JkcyIsICJrZXkiLCAiY29udmVydCIsICJtb2RlbCIsICJjaGFubmVscyIsICJsYWJlbHMiLCAicmdiIiwgInIiLCAiZyIsICJiIiwgIm1pbiIsICJtYXgiLCAiZGVsdGEiLCAiaCIsICJzIiwgImwiLCAicmRpZiIsICJnZGlmIiwgImJkaWYiLCAidiIsICJkaWZmIiwgImRpZmZjIiwgImMiLCAidyIsICJrIiwgIm0iLCAieSIsICJjb21wYXJhdGl2ZURpc3RhbmNlIiwgIngiLCAicmV2ZXJzZWQiLCAiY3VycmVudENsb3Nlc3REaXN0YW5jZSIsICJjdXJyZW50Q2xvc2VzdEtleXdvcmQiLCAia2V5d29yZCIsICJ2YWx1ZSIsICJkaXN0YW5jZSIsICJ6IiwgInh5eiIsICJhIiwgImhzbCIsICJ0MiIsICJ0MyIsICJ2YWwiLCAidDEiLCAiaSIsICJzbWluIiwgImxtaW4iLCAic3YiLCAiaHN2IiwgImhpIiwgImYiLCAicCIsICJxIiwgInQiLCAidm1pbiIsICJzbCIsICJod2IiLCAid2giLCAiYmwiLCAicmF0aW8iLCAibiIsICJjbXlrIiwgImxhYiIsICJ5MiIsICJ4MiIsICJ6MiIsICJsY2giLCAiaHIiLCAiYXJncyIsICJzYXR1cmF0aW9uIiwgImFuc2kiLCAiY29sb3IiLCAibXVsdCIsICJyZW0iLCAic3RyaW5nIiwgIm1hdGNoIiwgImNvbG9yU3RyaW5nIiwgImNoYXIiLCAiaW50ZWdlciIsICJjaHJvbWEiLCAiZ3JheXNjYWxlIiwgImh1ZSIsICJoY2ciLCAicHVyZSIsICJtZyIsICJhcHBsZSIsICJncmF5IiwgInJlcXVpcmVfcm91dGUiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJjb252ZXJzaW9ucyIsICJidWlsZEdyYXBoIiwgImdyYXBoIiwgIm1vZGVscyIsICJsZW4iLCAiaSIsICJkZXJpdmVCRlMiLCAiZnJvbU1vZGVsIiwgInF1ZXVlIiwgImN1cnJlbnQiLCAiYWRqYWNlbnRzIiwgImFkamFjZW50IiwgIm5vZGUiLCAibGluayIsICJmcm9tIiwgInRvIiwgImFyZ3MiLCAid3JhcENvbnZlcnNpb24iLCAidG9Nb2RlbCIsICJwYXRoIiwgImZuIiwgImN1ciIsICJjb252ZXJzaW9uIiwgInJlcXVpcmVfY29sb3JfY29udmVydCIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImNvbnZlcnNpb25zIiwgInJvdXRlIiwgImNvbnZlcnQiLCAibW9kZWxzIiwgIndyYXBSYXciLCAiZm4iLCAid3JhcHBlZEZuIiwgImFyZ3MiLCAiYXJnMCIsICJ3cmFwUm91bmRlZCIsICJyZXN1bHQiLCAibGVuIiwgImkiLCAiZnJvbU1vZGVsIiwgInJvdXRlcyIsICJ0b01vZGVsIiwgInJlcXVpcmVfYW5zaV9zdHlsZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJ3cmFwQW5zaTE2IiwgImZuIiwgIm9mZnNldCIsICJhcmdzIiwgIndyYXBBbnNpMjU2IiwgImNvZGUiLCAid3JhcEFuc2kxNm0iLCAicmdiIiwgImFuc2kyYW5zaSIsICJuIiwgInJnYjJyZ2IiLCAiZyIsICJiIiwgInNldExhenlQcm9wZXJ0eSIsICJvYmplY3QiLCAicHJvcGVydHkiLCAiZ2V0IiwgInZhbHVlIiwgImNvbG9yQ29udmVydCIsICJtYWtlRHluYW1pY1N0eWxlcyIsICJ3cmFwIiwgInRhcmdldFNwYWNlIiwgImlkZW50aXR5IiwgImlzQmFja2dyb3VuZCIsICJzdHlsZXMiLCAic291cmNlU3BhY2UiLCAic3VpdGUiLCAibmFtZSIsICJhc3NlbWJsZVN0eWxlcyIsICJjb2RlcyIsICJncm91cE5hbWUiLCAiZ3JvdXAiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgInJlcXVpcmVfaGFzX2ZsYWciLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJmbGFnIiwgImFyZ3YiLCAicHJlZml4IiwgInBvc2l0aW9uIiwgInRlcm1pbmF0b3JQb3NpdGlvbiIsICJyZXF1aXJlX3N1cHBvcnRzX2NvbG9yIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAib3MiLCAidHR5IiwgImhhc0ZsYWciLCAiZW52IiwgImZvcmNlQ29sb3IiLCAidHJhbnNsYXRlTGV2ZWwiLCAibGV2ZWwiLCAic3VwcG9ydHNDb2xvciIsICJoYXZlU3RyZWFtIiwgInN0cmVhbUlzVFRZIiwgIm1pbiIsICJvc1JlbGVhc2UiLCAic2lnbiIsICJ2ZXJzaW9uIiwgImdldFN1cHBvcnRMZXZlbCIsICJzdHJlYW0iLCAicmVxdWlyZV91dGlsIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAic3RyaW5nUmVwbGFjZUFsbCIsICJzdHJpbmciLCAic3Vic3RyaW5nIiwgInJlcGxhY2VyIiwgImluZGV4IiwgInN1YnN0cmluZ0xlbmd0aCIsICJlbmRJbmRleCIsICJyZXR1cm5WYWx1ZSIsICJzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgiLCAicHJlZml4IiwgInBvc3RmaXgiLCAiZ290Q1IiLCAicmVxdWlyZV90ZW1wbGF0ZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJURU1QTEFURV9SRUdFWCIsICJTVFlMRV9SRUdFWCIsICJTVFJJTkdfUkVHRVgiLCAiRVNDQVBFX1JFR0VYIiwgIkVTQ0FQRVMiLCAidW5lc2NhcGUiLCAiYyIsICJ1IiwgImJyYWNrZXQiLCAicGFyc2VBcmd1bWVudHMiLCAibmFtZSIsICJhcmd1bWVudHNfIiwgInJlc3VsdHMiLCAiY2h1bmtzIiwgIm1hdGNoZXMiLCAiY2h1bmsiLCAibnVtYmVyIiwgIm0iLCAiZXNjYXBlIiwgImNoYXJhY3RlciIsICJwYXJzZVN0eWxlIiwgInN0eWxlIiwgImFyZ3MiLCAiYnVpbGRTdHlsZSIsICJjaGFsayIsICJzdHlsZXMiLCAiZW5hYmxlZCIsICJsYXllciIsICJjdXJyZW50IiwgInN0eWxlTmFtZSIsICJ0ZW1wb3JhcnkiLCAiZXNjYXBlQ2hhcmFjdGVyIiwgImludmVyc2UiLCAiY2xvc2UiLCAic3RyaW5nIiwgImVyck1lc3NhZ2UiLCAicmVxdWlyZV9zb3VyY2UiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJhbnNpU3R5bGVzIiwgInN0ZG91dENvbG9yIiwgInN0ZGVyckNvbG9yIiwgInN0cmluZ1JlcGxhY2VBbGwiLCAic3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4IiwgImlzQXJyYXkiLCAibGV2ZWxNYXBwaW5nIiwgInN0eWxlcyIsICJhcHBseU9wdGlvbnMiLCAib2JqZWN0IiwgIm9wdGlvbnMiLCAiY29sb3JMZXZlbCIsICJDaGFsa0NsYXNzIiwgImNoYWxrRmFjdG9yeSIsICJjaGFsayIsICJhcmd1bWVudHNfIiwgImNoYWxrVGFnIiwgIkNoYWxrIiwgInN0eWxlTmFtZSIsICJzdHlsZSIsICJidWlsZGVyIiwgImNyZWF0ZUJ1aWxkZXIiLCAiY3JlYXRlU3R5bGVyIiwgInVzZWRNb2RlbHMiLCAibW9kZWwiLCAibGV2ZWwiLCAic3R5bGVyIiwgImJnTW9kZWwiLCAicHJvdG8iLCAib3BlbiIsICJjbG9zZSIsICJwYXJlbnQiLCAib3BlbkFsbCIsICJjbG9zZUFsbCIsICJzZWxmIiwgIl9zdHlsZXIiLCAiX2lzRW1wdHkiLCAiYXBwbHlTdHlsZSIsICJzdHJpbmciLCAibGZJbmRleCIsICJ0ZW1wbGF0ZSIsICJzdHJpbmdzIiwgImZpcnN0U3RyaW5nIiwgInBhcnRzIiwgInJlcXVpcmVfUmVmbGVjdCIsICJfX2NvbW1vbkpTTWluIiwgIlJlZmxlY3QiLCAiZmFjdG9yeSIsICJyb290IiwgInNsb3BweU1vZGVUaGlzIiwgImV4cG9ydGVyIiwgIm1ha2VFeHBvcnRlciIsICJ0YXJnZXQiLCAicHJldmlvdXMiLCAia2V5IiwgInZhbHVlIiwgImZ1bmN0aW9uVGhpcyIsICJpbmRpcmVjdEV2YWxUaGlzIiwgImhhc093biIsICJzdXBwb3J0c1N5bWJvbCIsICJ0b1ByaW1pdGl2ZVN5bWJvbCIsICJpdGVyYXRvclN5bWJvbCIsICJzdXBwb3J0c0NyZWF0ZSIsICJzdXBwb3J0c1Byb3RvIiwgImRvd25MZXZlbCIsICJIYXNoTWFwIiwgIk1ha2VEaWN0aW9uYXJ5IiwgIm1hcCIsICJmdW5jdGlvblByb3RvdHlwZSIsICJfTWFwIiwgIkNyZWF0ZU1hcFBvbHlmaWxsIiwgIl9TZXQiLCAiQ3JlYXRlU2V0UG9seWZpbGwiLCAiX1dlYWtNYXAiLCAiQ3JlYXRlV2Vha01hcFBvbHlmaWxsIiwgInJlZ2lzdHJ5U3ltYm9sIiwgIm1ldGFkYXRhUmVnaXN0cnkiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgIm1ldGFkYXRhUHJvdmlkZXIiLCAiQ3JlYXRlTWV0YWRhdGFQcm92aWRlciIsICJkZWNvcmF0ZSIsICJkZWNvcmF0b3JzIiwgInByb3BlcnR5S2V5IiwgImF0dHJpYnV0ZXMiLCAiSXNVbmRlZmluZWQiLCAiSXNBcnJheSIsICJJc0NvbnN0cnVjdG9yIiwgIkRlY29yYXRlQ29uc3RydWN0b3IiLCAiSXNPYmplY3QiLCAiSXNOdWxsIiwgIlRvUHJvcGVydHlLZXkiLCAiRGVjb3JhdGVQcm9wZXJ0eSIsICJtZXRhZGF0YSIsICJtZXRhZGF0YUtleSIsICJtZXRhZGF0YVZhbHVlIiwgImRlY29yYXRvciIsICJJc1Byb3BlcnR5S2V5IiwgIk9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaGFzTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNNZXRhZGF0YSIsICJoYXNPd25NZXRhZGF0YSIsICJPcmRpbmFyeUhhc093bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0TWV0YWRhdGEiLCAiZ2V0T3duTWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlNZXRhZGF0YUtleXMiLCAiZ2V0T3duTWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5T3duTWV0YWRhdGFLZXlzIiwgImRlbGV0ZU1ldGFkYXRhIiwgInByb3ZpZGVyIiwgIkdldE1ldGFkYXRhUHJvdmlkZXIiLCAiaSIsICJkZWNvcmF0ZWQiLCAiZGVzY3JpcHRvciIsICJNZXRhZGF0YUtleSIsICJPIiwgIlAiLCAicGFyZW50IiwgIk9yZGluYXJ5R2V0UHJvdG90eXBlT2YiLCAiVG9Cb29sZWFuIiwgIk1ldGFkYXRhVmFsdWUiLCAib3duS2V5cyIsICJwYXJlbnRLZXlzIiwgInNldCIsICJrZXlzIiwgIl9pIiwgIm93bktleXNfMSIsICJoYXNLZXkiLCAiX2EiLCAicGFyZW50S2V5c18xIiwgIlR5cGUiLCAieCIsICJJc1N5bWJvbCIsICJUb1ByaW1pdGl2ZSIsICJpbnB1dCIsICJQcmVmZXJyZWRUeXBlIiwgImhpbnQiLCAiZXhvdGljVG9QcmltIiwgIkdldE1ldGhvZCIsICJyZXN1bHQiLCAiT3JkaW5hcnlUb1ByaW1pdGl2ZSIsICJ0b1N0cmluZ18xIiwgIklzQ2FsbGFibGUiLCAidmFsdWVPZiIsICJ0b1N0cmluZ18yIiwgImFyZ3VtZW50IiwgIlRvU3RyaW5nIiwgIlNhbWVWYWx1ZVplcm8iLCAieSIsICJWIiwgImZ1bmMiLCAiR2V0SXRlcmF0b3IiLCAib2JqIiwgIm1ldGhvZCIsICJpdGVyYXRvciIsICJJdGVyYXRvclZhbHVlIiwgIml0ZXJSZXN1bHQiLCAiSXRlcmF0b3JTdGVwIiwgIkl0ZXJhdG9yQ2xvc2UiLCAiZiIsICJwcm90byIsICJwcm90b3R5cGUiLCAicHJvdG90eXBlUHJvdG8iLCAiY29uc3RydWN0b3IiLCAiQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJmYWxsYmFjayIsICJDcmVhdGVGYWxsYmFja1Byb3ZpZGVyIiwgImZpcnN0IiwgInNlY29uZCIsICJyZXN0IiwgInRhcmdldFByb3ZpZGVyTWFwIiwgInJlZ2lzdHJ5IiwgInJlZ2lzdGVyUHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXIiLCAic2V0UHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXJOb0NhY2hlIiwgIm5leHQiLCAicHJvdmlkZXJNYXAiLCAiaGFzUHJvdmlkZXIiLCAiZXhpc3RpbmdQcm92aWRlciIsICJ0YXJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeURlbGV0ZU1ldGFkYXRhIiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFNYXAiLCAiQ3JlYXRlIiwgImNyZWF0ZWRUYXJnZXRNZXRhZGF0YSIsICJtZXRhZGF0YU1hcCIsICJrZXlzT2JqIiwgImsiLCAibmV4dFZhbHVlIiwgImUiLCAicmVmbGVjdCIsICJtZXRhZGF0YU93bmVyIiwgIm1ldGFkYXRhUHJvcGVydHlTZXQiLCAicmVnaXN0ZXJlZFByb3ZpZGVyIiwgImNhY2hlU2VudGluZWwiLCAiYXJyYXlTZW50aW5lbCIsICJNYXBJdGVyYXRvciIsICJ2YWx1ZXMiLCAic2VsZWN0b3IiLCAiaW5kZXgiLCAiZXJyb3IiLCAiTWFwIiwgInNpemUiLCAiZ2V0S2V5IiwgImdldFZhbHVlIiwgImdldEVudHJ5IiwgImluc2VydCIsICJfIiwgIlNldCIsICJVVUlEX1NJWkUiLCAicm9vdEtleSIsICJDcmVhdGVVbmlxdWVLZXkiLCAiV2Vha01hcCIsICJ0YWJsZSIsICJHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSIsICJDcmVhdGVVVUlEIiwgImNyZWF0ZSIsICJGaWxsUmFuZG9tQnl0ZXMiLCAiYnVmZmVyIiwgIkdlblJhbmRvbUJ5dGVzIiwgImFycmF5IiwgImRhdGEiLCAib2Zmc2V0IiwgImJ5dGUiLCAiaW5kZXhfdW5peF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIm1haW4iLCAiX190b0NvbW1vbkpTIiwgIlJ1bnRpbWVDbGlFcnJvciIsICJtZXNzYWdlIiwgImNvZGUiLCAiaGludCIsICJSdW50aW1lQ29uZmlnRXJyb3IiLCAiUnVudGltZUJ1aWxkRXJyb3IiLCAiUnVudGltZURlcGxveW1lbnRFcnJvciIsICJEZXBsb3ltZW50RXJyb3IiLCAiUnVudGltZVZhbGlkYXRpb25FcnJvciIsICJSdW50aW1lVGVtcGxhdGVFcnJvciIsICJ0ZW1wbGF0ZU5hbWUiLCAiY29yZURpciIsICJzZWFyY2hlZFBhdGhzIiwgInBhY2thZ2VDb250ZXh0IiwgInJlc29sdXRpb25TdHJhdGVneSIsICJSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciIsICJ0ZW1wbGF0ZURpciIsICJ2YWxpZGF0aW9uRXJyb3JzIiwgIlJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIiwgImVycm9yIiwgInZlcmJvc2UiLCAibGluZXMiLCAiZmllbGROYW1lIiwgInN0YWNrTmFtZSIsICJvcGVyYXRpb24iLCAicGF0aCIsICJ2YWxpZGF0aW9uRXJyb3IiLCAiUnVudGltZVN0cnVjdHVyZWRMb2dnZXIiLCAibWV0YWRhdGEiLCAibG9nRW50cnkiLCAiZnMiLCAicGF0aCIsICJpbXBvcnRfYmluIiwgIlJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UiLCAiUHVyZW5vd1RlbXBsYXRlU2VydmljZSIsICJjd2QiLCAidGVtcGxhdGVOYW1lIiwgInRhcmdldERpciIsICJvcHRpb25zIiwgImNvcmVEaXIiLCAidmFsaWRhdGlvbiIsICJSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciIsICJ0ZW1wbGF0ZVBhdGgiLCAiYXZhaWxhYmxlVGVtcGxhdGVzIiwgInJlc29sdXRpb25JbmZvIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgIm9yaWdpbmFsVGVtcGxhdGVzRGlyIiwgIm9yaWdpbmFsQ29weVRlbXBsYXRlRmlsZXMiLCAic291cmNlUGF0aCIsICJ0YXJnZXRQYXRoIiwgImNvbnRleHQiLCAicnVudGltZUNvbnRleHQiLCAic2VhcmNoUGF0aHMiLCAic2VhcmNoUmVzdWx0cyIsICJwYWNrYWdlQmFzZWRQYXRoIiwgInRlbXBsYXRlc1BhdGgiLCAibW9kdWxlQmFzZWRQYXRocyIsICJtb2R1bGVQYXRoIiwgIm5vZGVNb2R1bGVQYXRocyIsICJub2RlTW9kdWxlUGF0aCIsICJlbnZCYXNlZFBhdGhzIiwgImVudlBhdGgiLCAidmFsaWRSZXN1bHQiLCAicmVzdWx0IiwgInNlYXJjaGVkUGF0aHMiLCAicGFja2FnZVJvb3QiLCAiY3VycmVudERpciIsICJwYWNrYWdlSnNvblBhdGgiLCAicGF0aHMiLCAicnVudGltZVBhY2thZ2VQYXRoIiwgInJ1bnRpbWVSb290IiwgImNsaVBhdGgiLCAicnVudGltZVdlYlBhdGgiLCAiZW50cnkiLCAiY29yZVBhdGgiLCAiZXJyb3JzIiwgInRlbXBsYXRlRGlycyIsICJ0ZW1wbGF0ZURpciIsICJlcnJvciIsICJyZXNvbHV0aW9uU3RyYXRlZ3kiLCAiYXZhaWxhYmxlQ29yZXMiLCAic2FuaXRpemVTdGFja05hbWUiLCAibmFtZSIsICJzYW5pdGl6ZWQiLCAiZnMiLCAiaW1wb3J0X2JpbiIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiY3dkIiwgIm9wdGlvbnMiLCAic3RhcnRUaW1lIiwgInN0YWdlIiwgImNvbmZpZyIsICJpbmZyYVN0YWNrTmFtZSIsICJzYW5pdGl6ZVN0YWNrTmFtZSIsICJydW50aW1lU3RhY2tOYW1lIiwgInJ1bnRpbWVXZWJTdGFja05hbWUiLCAicyIsICJpbmZyYVJlc3VsdCIsICJydW50aW1lUmVzdWx0IiwgInJ1bnRpbWVXZWJSZXN1bHQiLCAiZHVyYXRpb24iLCAic3RhY2tOYW1lIiwgIm91dHB1dHNQYXRoIiwgIm91dHB1dHMiLCAib3V0cHV0c0ZpbGVDb250ZW50IiwgInN0YWNrT3V0cHV0cyIsICJrZXkiLCAibGFtYmRhTWF0Y2giLCAiZXJyb3IiLCAicmVnaW9uIiwgInBhcnQiLCAibmFtZSIsICJzZXJ2aWNlTmFtZSIsICJyZWdpb25TaW1wbGlmaWVkIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9jaGFsayIsICJpbXBvcnRfcHJvY2VzcyIsICJpbXBvcnRfYmluIiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJzdGFja3NEZXBsb3lTZXJ2aWNlIiwgIm9wdGlvbnMiLCAiY29uZmlnIiwgImxvZ2dlciIsICJjd2QiLCAicHJvY2VzcyIsICJlbnZWYWxpZGF0b3IiLCAiZXJyb3IiLCAibWVzc2FnZSIsICJzdGFnZSIsICJzdGFnZUNvbmZpZyIsICJzIiwgImNoYWxrIiwgImRlcGxveVNlcnZpY2UiLCAiYnVpbGRTZXJ2aWNlIiwgImJvb3RzdHJhcFNlcnZpY2UiLCAiY3JlZGVudGlhbHMiLCAicmVnaW9uIiwgInJlc3VsdCIsICJsYW1iZGFBcm4iLCAiaW5kZXgiLCAiZnMiLCAicGF0aCIsICJpbXBvcnRfY2hhbGsiLCAiaW1wb3J0X2JpbiIsICJ0YXJnZXRSZXF1aXJlc0NyZWRlbnRpYWxzIiwgInRhcmdldCIsICJidWlsZENvbW1hbmQiLCAib3B0aW9ucyIsICJjb25maWciLCAibG9nZ2VyIiwgImN3ZCIsICJlbnZWYWxpZGF0b3IiLCAiZXJyb3IiLCAiY2hhbGsiLCAiYnVpbGRTZXJ2aWNlIiwgInJlc3VsdHMiLCAic2hvdWxkR2VuZXJhdGVUeXBlcyIsICJidWlsZEFsbFRhcmdldHMiLCAiYnVpbGRTaW5nbGVUYXJnZXQiLCAiZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zIiwgImRpc3BsYXlCdWlsZFN1bW1hcnkiLCAidGFyZ2V0cyIsICJzcGlubmVyIiwgInJlc3VsdCIsICJjYXBpdGFsaXplIiwgImZvcm1hdER1cmF0aW9uIiwgInRvdGFsRHVyYXRpb24iLCAic3VtIiwgInIiLCAiZnVsbFBhdGgiLCAic2l6ZSIsICJnZXRGaWxlU2l6ZSIsICJyZWxhdGl2ZVBhdGgiLCAiZmlsZVBhdGgiLCAic3RhdHMiLCAiZm9ybWF0Qnl0ZXMiLCAiYnl0ZXMiLCAiayIsICJzaXplcyIsICJpIiwgIm1zIiwgInN0ciIsICJwYXRoIiwgImZzIiwgImltcG9ydF9iaW4iLCAiaW1wb3J0X2NoYWxrIiwgInJ1bnRpbWVJbml0Q29tbWFuZCIsICJvcHRpb25zIiwgImxvZ2dlciIsICJjd2QiLCAiZW52VmFsaWRhdG9yIiwgInNwaW5uZXIiLCAidGVtcGxhdGVTZXJ2aWNlIiwgIlJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UiLCAicHJvbXB0U2VydmljZSIsICJ0YXJnZXREaXIiLCAidGVtcGxhdGUiLCAiY29yZSIsICJmb3JjZSIsICJwcm9qZWN0TmFtZSIsICJyZXNvbHZlZFRhcmdldERpciIsICJleGlzdGluZ0ZpbGVzIiwgImNoZWNrRXhpc3RpbmdQcm9qZWN0RmlsZXMiLCAiZmlsZSIsICJjaGFsayIsICJkaXNwbGF5Q2RrU3VjY2Vzc01lc3NhZ2UiLCAicmVzb2x2ZWRDZGtEaXIiLCAiaGFuZGxlQ2RrT25seUNyZWRlbnRpYWxzIiwgImRpc3BsYXlSdW50aW1lU3VjY2Vzc01lc3NhZ2UiLCAiaW5pdGlhbGl6ZUNka1dvcmtmbG93IiwgImVycm9yIiwgInJlc29sdmVkRGlyIiwgImlzQ3VycmVudERpciIsICJyZWxhdGl2ZURpciIsICJwcm9qZWN0RGlyIiwgIlByb21wdFNlcnZpY2UiLCAiUGFja2FnZU1hbmFnZXJTZXJ2aWNlIiwgIkNka0luaXRTZXJ2aWNlIiwgIkF3c0NyZWRlbnRpYWxzRGV0ZWN0b3IiLCAiQXdzUmVnaW9uUmVzb2x2ZXIiLCAicGFja2FnZU1hbmFnZXJTZXJ2aWNlIiwgImNka0luaXRTZXJ2aWNlIiwgImF3c0RldGVjdG9yIiwgImNka0V4aXN0cyIsICJyZWdpb25SZXN1bHQiLCAicmVzb2x2ZWRSZWdpb24iLCAiY29uZmlnIiwgImRldGVjdGVkTWFuYWdlciIsICJyZXN1bHQiLCAiY2RrRGlyIiwgImtleUZpbGVzIiwgImZpbGVQYXRoIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9wcm9jZXNzIiwgImltcG9ydF9iaW4iLCAiUnVudGltZVdlYkNsaSIsICJfUnVudGltZVdlYkNsaSIsICJ0YXJnZXRzIiwgIm5hbWUiLCAidGFyZ2V0IiwgImRlc2MiLCAib3B0aW9ucyIsICJidWlsZENvbW1hbmQiLCAiZXJyb3IiLCAicHJvY2VzcyIsICJkZXZPcHRpb25zIiwgInQiLCAiZ2xvYmFsT3B0cyIsICJjd2QiLCAicHVyZW5vd0NvbnRleHQiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiY21kIiwgInN0cmF0ZWdpZXMiLCAiY29udGV4dCIsICJyZXN1bHQiLCAiUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIiwgInJ1bnRpbWVJbml0Q29tbWFuZCIsICJkZXN0cm95Q29tbWFuZCIsICJhcmdzIiwgImZvcm1hdHRlciIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJ2ZXJib3NlIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgImZvcm1hdHRlZEVycm9yIiwgIlJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIiwgImNyZWF0ZVJ1bnRpbWVDbGkiLCAiaW1wb3J0X2NoYWxrIiwgImltcG9ydF9wcm9jZXNzIiwgIm1haW4iLCAiY3JlYXRlUnVudGltZUNsaSIsICJlcnJvciIsICJSdW50aW1lV2ViQ2xpIiwgImhhbmRsZUVycm9yIiwgImNoYWxrIiwgInByb2Nlc3MiLCAic2V0dXBHbG9iYWxFcnJvckhhbmRsZXJzIiwgInJlYXNvbiJdCn0K
|